From 200a1ba460d2c7b8efaab530b5f8a1d5daede476 Mon Sep 17 00:00:00 2001 From: Willy Kloucek Date: Thu, 30 Jan 2025 08:22:26 +0100 Subject: [PATCH] update govips to 2.16.0 --- changelog/unreleased/fix-govips-tmp.md | 6 ++ go.mod | 2 +- go.sum | 21 +++++ .../davidbyttow/govips/v2/vips/foreign.c | 2 +- .../davidbyttow/govips/v2/vips/foreign.go | 36 +++++--- .../davidbyttow/govips/v2/vips/foreign.h | 2 +- .../davidbyttow/govips/v2/vips/govips.go | 6 +- .../govips/v2/vips/icc_profiles.go | 89 +++++++++++++++---- .../davidbyttow/govips/v2/vips/image.go | 22 +++++ vendor/modules.txt | 2 +- 10 files changed, 149 insertions(+), 39 deletions(-) create mode 100644 changelog/unreleased/fix-govips-tmp.md diff --git a/changelog/unreleased/fix-govips-tmp.md b/changelog/unreleased/fix-govips-tmp.md new file mode 100644 index 00000000000..2d0ab3ff9ce --- /dev/null +++ b/changelog/unreleased/fix-govips-tmp.md @@ -0,0 +1,6 @@ +Bugfix: Update govips to 2.16.0 + +The update to govips 2.16.0 removes temporary access to /tmp that was introduced by govips. + +https://github.com/owncloud/ocis/issues/10378 +https://github.com/owncloud/ocis/pull/10943 diff --git a/go.mod b/go.mod index 982abb047f6..a4e09819f16 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/coreos/go-oidc/v3 v3.11.0 github.com/cs3org/go-cs3apis v0.0.0-20241105092511-3ad35d174fc1 github.com/cs3org/reva/v2 v2.27.3 - github.com/davidbyttow/govips/v2 v2.15.0 + github.com/davidbyttow/govips/v2 v2.16.0 github.com/dhowden/tag v0.0.0-20240417053706-3d75831295e8 github.com/dutchcoders/go-clamd v0.0.0-20170520113014-b970184f4d9e github.com/egirna/icap-client v0.1.1 diff --git a/go.sum b/go.sum index 7ab8973bc96..4b3cf59bd44 100644 --- a/go.sum +++ b/go.sum @@ -262,6 +262,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidbyttow/govips/v2 v2.15.0 h1:h3lF+rQElBzGXbQSSPqmE3XGySPhcQo2x3t5l/dZ+pU= github.com/davidbyttow/govips/v2 v2.15.0/go.mod h1:3OQCHj0nf5Mnrplh5VlNvmx3IhJXyxbAoTJZPflUjmM= +github.com/davidbyttow/govips/v2 v2.16.0 h1:1nH/Rbx8qZP1hd+oYL9fYQjAnm1+KorX9s07ZGseQmo= +github.com/davidbyttow/govips/v2 v2.16.0/go.mod h1:clH5/IDVmG5eVyc23qYpyi7kmOT0B/1QNTKtci4RkyM= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/deepmap/oapi-codegen v1.3.11/go.mod h1:suMvK7+rKlx3+tpa8ByptmvoXbAV70wERKTOGH3hLp0= @@ -1226,9 +1228,11 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1246,6 +1250,7 @@ golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.10.0/go.mod h1:jtrku+n79PfroUbvDdeUWMAI+heR786BofxrbiSF+J0= +golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= golang.org/x/image v0.22.0 h1:UtK5yLUzilVrkjMAZAZ34DXGpASN8i8pj8g+O+yd10g= golang.org/x/image v0.22.0/go.mod h1:9hPFhljd4zZ1GNSIZJ49sqbp45GKK9t6w+iXvGqZUz4= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1269,6 +1274,9 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1323,10 +1331,12 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1352,6 +1362,9 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180622082034-63fc586f45fe/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1434,9 +1447,11 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1444,9 +1459,11 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1465,6 +1482,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1527,6 +1546,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210112230658-8b4aab62c064/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/vendor/github.com/davidbyttow/govips/v2/vips/foreign.c b/vendor/github.com/davidbyttow/govips/v2/vips/foreign.c index 23f9d27d544..10b6b883af1 100644 --- a/vendor/github.com/davidbyttow/govips/v2/vips/foreign.c +++ b/vendor/github.com/davidbyttow/govips/v2/vips/foreign.c @@ -526,7 +526,7 @@ static SaveParams defaultSaveParams = { .stripMetadata = FALSE, .jpegOptimizeCoding = FALSE, - .jpegSubsample = VIPS_FOREIGN_JPEG_SUBSAMPLE_ON, + .jpegSubsample = VIPS_FOREIGN_SUBSAMPLE_ON, .jpegTrellisQuant = FALSE, .jpegOvershootDeringing = FALSE, .jpegOptimizeScans = FALSE, diff --git a/vendor/github.com/davidbyttow/govips/v2/vips/foreign.go b/vendor/github.com/davidbyttow/govips/v2/vips/foreign.go index 695617f5307..cfa4ddddeb9 100644 --- a/vendor/github.com/davidbyttow/govips/v2/vips/foreign.go +++ b/vendor/github.com/davidbyttow/govips/v2/vips/foreign.go @@ -6,13 +6,12 @@ import ( "bytes" "encoding/xml" "fmt" + "golang.org/x/image/bmp" + "golang.org/x/net/html/charset" "image/png" "math" "runtime" "unsafe" - - "golang.org/x/image/bmp" - "golang.org/x/net/html/charset" ) // SubsampleMode correlates to a libvips subsample mode @@ -20,10 +19,10 @@ type SubsampleMode int // SubsampleMode enum correlating to libvips subsample modes const ( - VipsForeignSubsampleAuto SubsampleMode = C.VIPS_FOREIGN_JPEG_SUBSAMPLE_AUTO - VipsForeignSubsampleOn SubsampleMode = C.VIPS_FOREIGN_JPEG_SUBSAMPLE_ON - VipsForeignSubsampleOff SubsampleMode = C.VIPS_FOREIGN_JPEG_SUBSAMPLE_OFF - VipsForeignSubsampleLast SubsampleMode = C.VIPS_FOREIGN_JPEG_SUBSAMPLE_LAST + VipsForeignSubsampleAuto SubsampleMode = C.VIPS_FOREIGN_SUBSAMPLE_AUTO + VipsForeignSubsampleOn SubsampleMode = C.VIPS_FOREIGN_SUBSAMPLE_ON + VipsForeignSubsampleOff SubsampleMode = C.VIPS_FOREIGN_SUBSAMPLE_OFF + VipsForeignSubsampleLast SubsampleMode = C.VIPS_FOREIGN_SUBSAMPLE_LAST ) // ImageType represents an image type @@ -154,14 +153,14 @@ func DetermineImageType(buf []byte) ImageType { return ImageTypeHEIF } else if isSVG(buf) { return ImageTypeSVG - } else if isPDF(buf) { - return ImageTypePDF } else if isBMP(buf) { return ImageTypeBMP } else if isJP2K(buf) { return ImageTypeJP2K } else if isJXL(buf) { return ImageTypeJXL + } else if isPDF(buf) { + return ImageTypePDF } else { return ImageTypeUnknown } @@ -240,7 +239,10 @@ func isSVG(buf []byte) bool { var pdf = []byte("\x25\x50\x44\x46") func isPDF(buf []byte) bool { - return bytes.HasPrefix(buf, pdf) + if len(buf) <= 1024 { + return bytes.Contains(buf, pdf) + } + return bytes.Contains(buf[:1024], pdf) } var bmpHeader = []byte("BM") @@ -257,10 +259,14 @@ func isJP2K(buf []byte) bool { return bytes.HasPrefix(buf, jp2kHeader) } +// As a 'naked' codestream var jxlHeader = []byte("\xff\x0a") +// As an ISOBMFF-based container: 0x0000000C 4A584C20 0D0A870A +var jxlHeaderISOBMFF = []byte("\x00\x00\x00\x0C\x4A\x58\x4C\x20\x0D\x0A\x87\x0A") + func isJXL(buf []byte) bool { - return bytes.HasPrefix(buf, jxlHeader) + return bytes.HasPrefix(buf, jxlHeader) || bytes.HasPrefix(buf, jxlHeaderISOBMFF) } func vipsLoadFromBuffer(buf []byte, params *ImportParams) (*C.VipsImage, ImageType, ImageType, error) { @@ -352,7 +358,7 @@ func vipsSaveJPEGToBuffer(in *C.VipsImage, params JpegExportParams) ([]byte, err p.quality = C.int(params.Quality) p.interlace = C.int(boolToInt(params.Interlace)) p.jpegOptimizeCoding = C.int(boolToInt(params.OptimizeCoding)) - p.jpegSubsample = C.VipsForeignJpegSubsample(params.SubsampleMode) + p.jpegSubsample = C.VipsForeignSubsample(params.SubsampleMode) p.jpegTrellisQuant = C.int(boolToInt(params.TrellisQuant)) p.jpegOvershootDeringing = C.int(boolToInt(params.OvershootDeringing)) p.jpegOptimizeScans = C.int(boolToInt(params.OptimizeScans)) @@ -408,6 +414,10 @@ func vipsSaveTIFFToBuffer(in *C.VipsImage, params TiffExportParams) ([]byte, err p.stripMetadata = C.int(boolToInt(params.StripMetadata)) p.quality = C.int(params.Quality) p.tiffCompression = C.VipsForeignTiffCompression(params.Compression) + p.tiffPyramid = C.int(boolToInt(params.Pyramid)) + p.tiffTile = C.int(boolToInt(params.Tile)) + p.tiffTileHeight = C.int(params.TileHeight) + p.tiffTileWidth = C.int(params.TileWidth) return vipsSaveToBuffer(p) } @@ -457,7 +467,7 @@ func vipsSaveJP2KToBuffer(in *C.VipsImage, params Jp2kExportParams) ([]byte, err p.jp2kLossless = C.int(boolToInt(params.Lossless)) p.jp2kTileWidth = C.int(params.TileWidth) p.jp2kTileHeight = C.int(params.TileHeight) - p.jpegSubsample = C.VipsForeignJpegSubsample(params.SubsampleMode) + p.jpegSubsample = C.VipsForeignSubsample(params.SubsampleMode) return vipsSaveToBuffer(p) } diff --git a/vendor/github.com/davidbyttow/govips/v2/vips/foreign.h b/vendor/github.com/davidbyttow/govips/v2/vips/foreign.h index 836f1df06a5..e54b946ceb4 100644 --- a/vendor/github.com/davidbyttow/govips/v2/vips/foreign.h +++ b/vendor/github.com/davidbyttow/govips/v2/vips/foreign.h @@ -84,7 +84,7 @@ typedef struct SaveParams { // JPEG BOOL jpegOptimizeCoding; - VipsForeignJpegSubsample jpegSubsample; + VipsForeignSubsample jpegSubsample; BOOL jpegTrellisQuant; BOOL jpegOvershootDeringing; BOOL jpegOptimizeScans; diff --git a/vendor/github.com/davidbyttow/govips/v2/vips/govips.go b/vendor/github.com/davidbyttow/govips/v2/vips/govips.go index 6969b62abf4..2036ebbe010 100644 --- a/vendor/github.com/davidbyttow/govips/v2/vips/govips.go +++ b/vendor/github.com/davidbyttow/govips/v2/vips/govips.go @@ -96,8 +96,6 @@ func Startup(config *Config) { panic(fmt.Sprintf("Failed to start vips code=%v", err)) } - initializeICCProfiles() - running = true if config != nil { @@ -185,7 +183,9 @@ func Shutdown() { return } - os.RemoveAll(temporaryDirectory) + if temporaryDirectory != "" { + os.RemoveAll(temporaryDirectory) + } C.vips_shutdown() disableLogging() diff --git a/vendor/github.com/davidbyttow/govips/v2/vips/icc_profiles.go b/vendor/github.com/davidbyttow/govips/v2/vips/icc_profiles.go index f10c42923f1..94f467bb4be 100644 --- a/vendor/github.com/davidbyttow/govips/v2/vips/icc_profiles.go +++ b/vendor/github.com/davidbyttow/govips/v2/vips/icc_profiles.go @@ -1,9 +1,9 @@ package vips import ( - "fmt" "os" "path/filepath" + "sync" ) var ( @@ -644,32 +644,83 @@ var ( 0x00, 0x20, 0x63, 0xcf, 0x8f, 0xf0, 0x65, 0x87, 0x4e, 0xf6, 0x00, 0x00, } - temporaryDirectory = temporaryDirectoryOrPanic() - SRGBV2MicroICCProfilePath = filepath.Join(temporaryDirectory, "srgb_v2_micro.icc") - SGrayV2MicroICCProfilePath = filepath.Join(temporaryDirectory, "sgray_v2_micro.icc") - SRGBIEC6196621ICCProfilePath = filepath.Join(temporaryDirectory, "srgb_iec61966_2_1.icc") - GenericGrayGamma22ICCProfilePath = filepath.Join(temporaryDirectory, "generic_gray_gamma_2_2.icc") + sRGBV2MicroICCProfilePathToken = "\x00srgb_v2_micro.icc" + sGrayV2MicroICCProfilePathToken = "\x00sgray_v2_micro.icc" + sRGBIEC6196621ICCProfilePathToken = "\x00srgb_iec61966_2_1.icc" + genericGrayGamma22ICCProfilePathToken = "\x00generic_gray_gamma_2_2.icc" + + temporaryDirectory = "" + SRGBV2MicroICCProfilePath = sRGBV2MicroICCProfilePathToken + SGrayV2MicroICCProfilePath = sGrayV2MicroICCProfilePathToken + SRGBIEC6196621ICCProfilePath = sRGBIEC6196621ICCProfilePathToken + GenericGrayGamma22ICCProfilePath = genericGrayGamma22ICCProfilePathToken ) -func initializeICCProfiles() { - storeIccProfile(SRGBV2MicroICCProfilePath, sRGBV2MicroICCProfile) - storeIccProfile(SGrayV2MicroICCProfilePath, sGrayV2MicroICCProfile) - storeIccProfile(SRGBIEC6196621ICCProfilePath, sRGBIEC6196621ICCProfile) - storeIccProfile(GenericGrayGamma22ICCProfilePath, genericGrayGamma22ICCProfile) +// Back support +func ensureLoadICCPath(name *string) (err error) { + if len(*name) > 0 && (*name)[0] == 0 { + switch *name { + case sRGBV2MicroICCProfilePathToken: + *name, err = GetSRGBV2MicroICCProfilePath() + return + case sGrayV2MicroICCProfilePathToken: + *name, err = GetSGrayV2MicroICCProfilePath() + return + case sRGBIEC6196621ICCProfilePathToken: + *name, err = GetSRGBIEC6196621ICCProfilePath() + return + case genericGrayGamma22ICCProfilePathToken: + *name, err = GetGenericGrayGamma22ICCProfilePath() + return + } + } + return } -func storeIccProfile(path string, data []byte) { - err := os.WriteFile(path, data, 0600) +func getTemporaryDirectory() (string, error) { + if temporaryDirectory != "" { + return temporaryDirectory, nil + } + var err error + temporaryDirectory, err = os.MkdirTemp("", "govips-") if err != nil { - panic(fmt.Sprintf("Couldn't store temporary file for ICC profile in '%v': %v", path, err.Error())) + return "", err } + return temporaryDirectory, nil } -func temporaryDirectoryOrPanic() string { - temporaryDirectory, err := os.MkdirTemp("", "govips-") - if err != nil { - panic(fmt.Sprintf("Couldn't create temporary directory: %v", err.Error())) +var lockIcc sync.Mutex + +func GetSRGBV2MicroICCProfilePath() (string, error) { + return getOrLoad(&SRGBV2MicroICCProfilePath, "srgb_v2_micro.icc", sRGBV2MicroICCProfile) +} + +func GetSGrayV2MicroICCProfilePath() (string, error) { + return getOrLoad(&SGrayV2MicroICCProfilePath, "sgray_v2_micro.icc", sGrayV2MicroICCProfile) +} + +func GetSRGBIEC6196621ICCProfilePath() (string, error) { + return getOrLoad(&SRGBIEC6196621ICCProfilePath, "srgb_iec61966_2_1.icc", sRGBIEC6196621ICCProfile) +} + +func GetGenericGrayGamma22ICCProfilePath() (string, error) { + return getOrLoad(&GenericGrayGamma22ICCProfilePath, "generic_gray_gamma_2_2.icc", genericGrayGamma22ICCProfile) +} + +func getOrLoad(pathFile *string, name string, fileBytes []byte) (string, error) { + lockIcc.Lock() + defer lockIcc.Unlock() + if len(*pathFile) > 0 && (*pathFile)[0] != 0 { + return *pathFile, nil + } + + if _, err := getTemporaryDirectory(); err != nil { + return "", err } - return temporaryDirectory + *pathFile = filepath.Join(temporaryDirectory, name) + if err := os.WriteFile(*pathFile, fileBytes, 0600); err != nil { + return "", err + } + return *pathFile, nil } diff --git a/vendor/github.com/davidbyttow/govips/v2/vips/image.go b/vendor/github.com/davidbyttow/govips/v2/vips/image.go index 82d5fac261d..1eb1d6fdba7 100644 --- a/vendor/github.com/davidbyttow/govips/v2/vips/image.go +++ b/vendor/github.com/davidbyttow/govips/v2/vips/image.go @@ -8,6 +8,9 @@ import ( "errors" "fmt" "image" + _ "image/gif" + _ "image/jpeg" + _ "image/png" "io" "os" "runtime" @@ -303,6 +306,10 @@ type TiffExportParams struct { Quality int Compression TiffCompression Predictor TiffPredictor + Pyramid bool + Tile bool + TileHeight int + TileWidth int } // NewTiffExportParams creates default values for an export of a TIFF image. @@ -311,6 +318,10 @@ func NewTiffExportParams() *TiffExportParams { Quality: 80, Compression: TiffCompressionLzw, Predictor: TiffPredictorHorizontal, + Pyramid: false, + Tile: false, + TileHeight: 256, + TileWidth: 256, } } @@ -1391,6 +1402,13 @@ func (r *ImageRef) RemoveICCProfile() error { // TransformICCProfileWithFallback transforms from the embedded ICC profile of the image to the ICC profile at the given path. // The fallback ICC profile is used if the image does not have an embedded ICC profile. func (r *ImageRef) TransformICCProfileWithFallback(targetProfilePath, fallbackProfilePath string) error { + if err := ensureLoadICCPath(&targetProfilePath); err != nil { + return err + } + if err := ensureLoadICCPath(&fallbackProfilePath); err != nil { + return err + } + depth := 16 if r.BandFormat() == BandFormatUchar || r.BandFormat() == BandFormatChar || r.BandFormat() == BandFormatNotSet { depth = 8 @@ -1426,6 +1444,10 @@ func (r *ImageRef) OptimizeICCProfile() error { r.optimizedIccProfile = SGrayV2MicroICCProfilePath } + if err := ensureLoadICCPath(&r.optimizedIccProfile); err != nil { + return err + } + embedded := r.HasICCProfile() && (inputProfile == "") depth := 16 diff --git a/vendor/modules.txt b/vendor/modules.txt index eeac64b44fa..0adb6f55de5 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -748,7 +748,7 @@ github.com/cyphar/filepath-securejoin # github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc ## explicit github.com/davecgh/go-spew/spew -# github.com/davidbyttow/govips/v2 v2.15.0 +# github.com/davidbyttow/govips/v2 v2.16.0 ## explicit; go 1.15 github.com/davidbyttow/govips/v2/vips # github.com/deckarep/golang-set v1.8.0