From 28ce33feb3e176bb8498cc857712c9cde7d3a7ec Mon Sep 17 00:00:00 2001 From: Lovell Fuller Date: Fri, 16 Sep 2016 11:20:08 +0100 Subject: [PATCH] Fix y-axis calc when overlaying at fixed point #566 --- docs/changelog.md | 4 ++++ src/common.cc | 2 +- .../expected/overlay-bottom-edges-meet.jpg | Bin 0 -> 3867 bytes test/unit/overlay.js | 22 +++++++++++++++++- 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/expected/overlay-bottom-edges-meet.jpg diff --git a/docs/changelog.md b/docs/changelog.md index 96e525c7..2e709b2e 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -10,6 +10,10 @@ Requires libvips v8.3.3 [#561](https://github.com/lovell/sharp/issues/561) [@abagshaw](https://github.com/abagshaw) +* Correct calculation of y-axis placement when overlaying image at a fixed point. + [#566](https://github.com/lovell/sharp/issues/566) + [@Nateowami](https://github.com/Nateowami) + #### v0.16.0 - 18th August 2016 * Add pre-compiled libvips for OS X, ARMv7 and ARMv8. diff --git a/src/common.cc b/src/common.cc index 1babef46..4ed3e4ca 100644 --- a/src/common.cc +++ b/src/common.cc @@ -391,7 +391,7 @@ namespace sharp { if(y >= 0 && y < (inHeight - outHeight)) { top = y; - } else if(x >= (inHeight - outHeight)) { + } else if(y >= (inHeight - outHeight)) { top = inHeight - outHeight; } diff --git a/test/fixtures/expected/overlay-bottom-edges-meet.jpg b/test/fixtures/expected/overlay-bottom-edges-meet.jpg new file mode 100644 index 0000000000000000000000000000000000000000..edc7c249d35a472eb686722c9d89fcd031ffef3a GIT binary patch literal 3867 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 xz-d7=5wEI(e>Su=r+(U)u%WnFIv?x~4D^C literal 0 HcmV?d00001 diff --git a/test/unit/overlay.js b/test/unit/overlay.js index f67697ff..40c37161 100644 --- a/test/unit/overlay.js +++ b/test/unit/overlay.js @@ -437,7 +437,27 @@ describe('Overlays', function() { assert.strictEqual(3, info.channels); fixtures.assertSimilar(expected, data, done); }); - + }); + + it('Overlay 100x100 with 50x50 so bottom edges meet', function(done) { + sharp(fixtures.inputJpg) + .resize(50, 50) + .toBuffer(function(err, overlay) { + if (err) throw err; + sharp(fixtures.inputJpgWithLandscapeExif1) + .resize(100, 100) + .overlayWith(overlay, { + top: 50, + left: 40 + }) + .toBuffer(function(err, data, info) { + if (err) throw err; + assert.strictEqual('jpeg', info.format); + assert.strictEqual(100, info.width); + assert.strictEqual(100, info.height); + fixtures.assertSimilar(fixtures.expected('overlay-bottom-edges-meet.jpg'), data, done); + }); + }); }); });