From 36ac8828f2e4eb60cc8d97301998011bb3d1f763 Mon Sep 17 00:00:00 2001 From: Lovell Fuller Date: Tue, 11 Aug 2015 21:51:22 +0100 Subject: [PATCH] Gamma correction and premultiply do not mix Skip premultiply for fast blur/sharpen Automate gamma correction tests --- package.json | 4 +- src/pipeline.cc | 50 ++++++++++++------------- test/fixtures/expected/gamma-0.0.jpg | Bin 0 -> 377 bytes test/fixtures/expected/gamma-2.2.jpg | Bin 0 -> 2048 bytes test/fixtures/expected/gamma-3.0.jpg | Bin 0 -> 2398 bytes test/fixtures/expected/gamma-alpha.jpg | Bin 0 -> 4226 bytes test/unit/gamma.js | 43 +++++++++++++++------ 7 files changed, 58 insertions(+), 39 deletions(-) create mode 100644 test/fixtures/expected/gamma-0.0.jpg create mode 100644 test/fixtures/expected/gamma-2.2.jpg create mode 100644 test/fixtures/expected/gamma-3.0.jpg create mode 100644 test/fixtures/expected/gamma-alpha.jpg diff --git a/package.json b/package.json index ad0ec609..214479c9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sharp", - "version": "0.11.0", + "version": "0.11.1", "author": "Lovell Fuller ", "contributors": [ "Pierre Inglebert ", @@ -51,7 +51,7 @@ "semver": "^5.0.1" }, "devDependencies": { - "async": "^1.3.0", + "async": "^1.4.2", "coveralls": "^2.11.2", "exif-reader": "1.0.0", "icc": "^0.0.2", diff --git a/src/pipeline.cc b/src/pipeline.cc index e0e2ce08..05567249 100755 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -445,7 +445,7 @@ class PipelineWorker : public NanAsyncWorker { } // Gamma encoding (darken) - if (baton->gamma >= 1 && baton->gamma <= 3) { + if (baton->gamma >= 1 && baton->gamma <= 3 && !HasAlpha(image)) { VipsImage *gammaEncoded; if (vips_gamma(image, &gammaEncoded, "exponent", 1.0 / baton->gamma, NULL)) { return Error(); @@ -493,11 +493,9 @@ class PipelineWorker : public NanAsyncWorker { } bool shouldAffineTransform = xresidual != 0.0 || yresidual != 0.0; - bool shouldBlur = baton->blurSigma != 0.0; - bool shouldSharpen = baton->sharpenRadius != 0; - bool shouldTransform = shouldAffineTransform || shouldBlur || shouldSharpen; + bool willConvolve = baton->blurSigma > 0.0 || baton->sharpenRadius > 0; bool hasOverlay = !baton->overlayPath.empty(); - bool shouldPremultiplyAlpha = HasAlpha(image) && image->Bands == 4 && (shouldTransform || hasOverlay); + bool shouldPremultiplyAlpha = HasAlpha(image) && (shouldAffineTransform || willConvolve || hasOverlay); // Premultiply image alpha channel before all transformations to avoid // dark fringing around bright pixels @@ -681,7 +679,7 @@ class PipelineWorker : public NanAsyncWorker { } // Blur - if (shouldBlur) { + if (baton->blurSigma != 0.0) { VipsImage *blurred; if (Blur(hook, image, &blurred, baton->blurSigma)) { return Error(); @@ -690,7 +688,7 @@ class PipelineWorker : public NanAsyncWorker { } // Sharpen - if (shouldSharpen) { + if (baton->sharpenRadius != 0) { VipsImage *sharpened; if (Sharpen(hook, image, &sharpened, baton->sharpenRadius, baton->sharpenFlat, baton->sharpenJagged)) { return Error(); @@ -698,25 +696,6 @@ class PipelineWorker : public NanAsyncWorker { image = sharpened; } - // Gamma decoding (brighten) - if (baton->gamma >= 1 && baton->gamma <= 3) { - VipsImage *gammaDecoded; - if (vips_gamma(image, &gammaDecoded, "exponent", baton->gamma, NULL)) { - return Error(); - } - vips_object_local(hook, gammaDecoded); - image = gammaDecoded; - } - - // Apply normalization - stretch luminance to cover full dynamic range - if (baton->normalize) { - VipsImage *normalized; - if (Normalize(hook, image, &normalized)) { - return Error(); - } - image = normalized; - } - // Composite with overlay, if present if (hasOverlay) { VipsImage *overlayImage = NULL; @@ -789,6 +768,25 @@ class PipelineWorker : public NanAsyncWorker { image = imageUnpremultiplied; } + // Gamma decoding (brighten) + if (baton->gamma >= 1 && baton->gamma <= 3 && !HasAlpha(image)) { + VipsImage *gammaDecoded; + if (vips_gamma(image, &gammaDecoded, "exponent", baton->gamma, NULL)) { + return Error(); + } + vips_object_local(hook, gammaDecoded); + image = gammaDecoded; + } + + // Apply normalization - stretch luminance to cover full dynamic range + if (baton->normalize) { + VipsImage *normalized; + if (Normalize(hook, image, &normalized)) { + return Error(); + } + image = normalized; + } + // Convert image to sRGB, if not already if (image->Type != VIPS_INTERPRETATION_sRGB) { // Switch interpretation to sRGB diff --git a/test/fixtures/expected/gamma-0.0.jpg b/test/fixtures/expected/gamma-0.0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..59daf1acf52b23f9033f3fb336912c0fc3630864 GIT binary patch literal 377 zcmb`CO$x#=5Jo4aP1;a2p)svdX;G@FSm+I02nD^2SJ0ce@DToNyh&_aSzHOeS|e_#PoXp_BxSGZuzS_6HG9WSS;YDLpMRJ)TdL%GddP zu`E~RD68tq)P*UHTY@O1EMPHXvC&GKpRs2U0UY3j(F}S5VS(%ghVQ8GiPMs|*}FLF a-sYXGO*gi-_e6liT97B@>gm{qOtve&3&uVpK5!sJc4SoB?W`i4fo z7@HVt>zP@Y;Vrh}jqyJrAOr$|T!&OgBGvI&3>N>7rMM5E)&a3V1_WdPfKea_3ZxJL zSO5S+ezyIezz_fm1HsokOH}|20>i*i7zFm83lJE9prC47EWOno46GP&Fmy(Km0{;R zZnqD=|Ml9776|x%8UXsqTXXbK0QhIpn*JLF0;3>nEC+9OsNy-W0Rmd91wjG!fH07Y zu(fDzyOzb&J>_{we(U=D{y^z;$<%}cqWZlx8 zqHd*zR1uYtQ?#o}%u9kHvvM4dgXQ+|hfk_JGwa!9u$R0!5! zm)o_|A5%qMP~D8Pp10@Z%8(_izfd;=P&PowOl;c9Ua~tY#32lk8F4F{>(i1re0tv} z-NZ%9U{~klOQ?fomehvzFTA#2<4}Sn(MJ2Ub^IEdr26tkxB_sDIJKo`JwF^9yvQ^n z`l?@e>do?RF_t}_%wa7MEW4zdcgrfm{}>(8Ug^m3eY^PNJn-SxoQiF~^`7jV1vEl@ z0S(6%ovUELHSCFEGaBwnI_vlV;du63$<2uSW^Dx|O_$$g%tr9aL;v0Nzlqv-Jfgh| zrxGKab|1J@`QB)sd1C<-EDL-4UD63;!)VYLBBq99%AAJ8eJ^#1 zjxFj9cHNfLUDW)!ee*PAe{_abK%U3M>&S!UBY2(S_GRU?#VcIPZJ_2^YLk9cW}S&3 zRJbfTop9H+>RR!v`S!T*=So_$i+w9wj-4`^HsCoqg&=0Z%dxm}nS|i`DUr zaG>WX?M%hU4W+I14+PsHU0p_V0?yWELs6q*pS=&%GMRPpx^@$e_0y`k^nzp;s_GXKIkJLSm`eH=cFD8l@~nZYNBJyO1UFb_FFC}&jQw!(x@z|hlAx&; zzr`a@+|Ra{31Dhq^Hb9b>GG*cyur8l(GTOVx-6JhyGkuAPtB+L$dhv$InhUz+DgNu zEK>paM2WvQ$2)MSgW!NuSrHA2!edAJ{J#2vlcQD%Biy0X?Ld$M2vyFv)?H2!Z@lVy za#*19Wc=S;e)1hkkHc@2k4ClWcD3Y3jEHxQ2`vhsz3fKVdg7n~?Cpu|_#2Gk>Q|Yv zJsAkfVNz-{@wztiVwa8`#XO0Wsj;`$#^f(Zl5oam?NLtt%Hke5uo;IWHz*QO6 zm7igcZg|OZZc&iL#$U(QAx7m8 zmI?B5bbpdhg6@R@ndEXVqqzLodqR`>m$FI|v$@uRdj{tv{U(Xc&z2-&=Bn{T#2F{$ zFUm=JPk9H;Uw0M_*HpbM{NYxFPi*jkUiqpSB=6Y&&~(zX;7BhwMM){JbSTne{;@wK zVhqPJeckt??#Q$HK??aRtGOtlHDQXLl;6UycMhwO*Qa>Urqhvr5IP-|CRo@gRqV-2*a*$S5y#>-m%J3B$|+leiiq zTGZr=mGh(Bq^~($D^uTmIniSGUWO>leWi^VRvOZVrO?s=8hNhb=4X+=DuM zI-;Shja>GMp%&Y@uo~83{pHvb_P48!1YbVpO?Ynk27l_0!8eN?G46qb_iADo>m3fw z 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 literal 0 HcmV?d00001 diff --git a/test/unit/gamma.js b/test/unit/gamma.js index 350a9ef9..b109e28e 100755 --- a/test/unit/gamma.js +++ b/test/unit/gamma.js @@ -12,32 +12,53 @@ describe('Gamma correction', function() { it('value of 0.0 (disabled)', function(done) { sharp(fixtures.inputJpgWithGammaHoliness) .resize(129, 111) - .toFile(fixtures.path('output.gamma-0.0.jpg'), done); + .toBuffer(function(err, data, info) { + assert.strictEqual('jpeg', info.format); + assert.strictEqual(129, info.width); + assert.strictEqual(111, info.height); + fixtures.assertSimilar(fixtures.expected('gamma-0.0.jpg'), data, done); + }); }); it('value of 2.2 (default)', function(done) { sharp(fixtures.inputJpgWithGammaHoliness) .resize(129, 111) .gamma() - .toFile(fixtures.path('output.gamma-2.2.jpg'), done); + .toBuffer(function(err, data, info) { + assert.strictEqual('jpeg', info.format); + assert.strictEqual(129, info.width); + assert.strictEqual(111, info.height); + fixtures.assertSimilar(fixtures.expected('gamma-2.2.jpg'), data, done); + }); }); it('value of 3.0', function(done) { sharp(fixtures.inputJpgWithGammaHoliness) .resize(129, 111) .gamma(3) - .toFile(fixtures.path('output.gamma-3.0.jpg'), done); + .toBuffer(function(err, data, info) { + assert.strictEqual('jpeg', info.format); + assert.strictEqual(129, info.width); + assert.strictEqual(111, info.height); + fixtures.assertSimilar(fixtures.expected('gamma-3.0.jpg'), data, done); + }); }); - it('invalid value', function(done) { - var isValid = true; - try { + it('alpha transparency', function(done) { + sharp(fixtures.inputPngOverlayLayer1) + .resize(320) + .gamma() + .toBuffer(function(err, data, info) { + assert.strictEqual('png', info.format); + assert.strictEqual(320, info.width); + fixtures.assertSimilar(fixtures.expected('gamma-alpha.jpg'), data, done); + }); + }); + + it('invalid value', function() { + assert.throws(function() { sharp(fixtures.inputJpgWithGammaHoliness).gamma(4); - } catch (err) { - isValid = false; - } - assert.strictEqual(false, isValid); - done(); + }); }); });