From 62554b766ff682b826c0e36e0d376b9c2bdbb49d Mon Sep 17 00:00:00 2001 From: lemnisk8 Date: Thu, 26 May 2016 21:12:17 +0530 Subject: [PATCH] Add support for repeated/tiled overlay image (#443) USAGE: overlayWith('overlayimage.png', { tile: true, gravity: northwest} ) When using the tile option, the gravity option is applied to the extracted part of the tiled overlay image. --- index.js | 10 +++ src/pipeline.cc | 30 +++++++++ src/pipeline.h | 2 + .../expected/overlay-tile-gravity-center.jpg | Bin 0 -> 3170 bytes .../expected/overlay-tile-gravity-centre.jpg | Bin 0 -> 3170 bytes .../expected/overlay-tile-gravity-east.jpg | Bin 0 -> 3208 bytes .../expected/overlay-tile-gravity-north.jpg | Bin 0 -> 3098 bytes .../overlay-tile-gravity-northeast.jpg | Bin 0 -> 3141 bytes .../overlay-tile-gravity-northwest.jpg | Bin 0 -> 3120 bytes .../expected/overlay-tile-gravity-south.jpg | Bin 0 -> 3090 bytes .../overlay-tile-gravity-southeast.jpg | Bin 0 -> 3127 bytes .../overlay-tile-gravity-southwest.jpg | Bin 0 -> 3119 bytes .../expected/overlay-tile-gravity-west.jpg | Bin 0 -> 3186 bytes ...erlay-tile-rotated90-gravity-northwest.jpg | Bin 0 -> 4538 bytes .../expected/overlay-tile-rotated90.jpg | Bin 0 -> 4555 bytes test/unit/overlay.js | 61 ++++++++++++++++++ 16 files changed, 103 insertions(+) create mode 100644 test/fixtures/expected/overlay-tile-gravity-center.jpg create mode 100644 test/fixtures/expected/overlay-tile-gravity-centre.jpg create mode 100644 test/fixtures/expected/overlay-tile-gravity-east.jpg create mode 100644 test/fixtures/expected/overlay-tile-gravity-north.jpg create mode 100644 test/fixtures/expected/overlay-tile-gravity-northeast.jpg create mode 100644 test/fixtures/expected/overlay-tile-gravity-northwest.jpg create mode 100644 test/fixtures/expected/overlay-tile-gravity-south.jpg create mode 100644 test/fixtures/expected/overlay-tile-gravity-southeast.jpg create mode 100644 test/fixtures/expected/overlay-tile-gravity-southwest.jpg create mode 100644 test/fixtures/expected/overlay-tile-gravity-west.jpg create mode 100644 test/fixtures/expected/overlay-tile-rotated90-gravity-northwest.jpg create mode 100644 test/fixtures/expected/overlay-tile-rotated90.jpg diff --git a/index.js b/index.js index c8e5ad48..8cef1a59 100644 --- a/index.js +++ b/index.js @@ -92,6 +92,7 @@ var Sharp = function(input, options) { overlayFileIn: '', overlayBufferIn: null, overlayGravity: 0, + overlayTile: false, // output options formatOut: 'input', fileOut: '', @@ -354,6 +355,15 @@ Sharp.prototype.overlayWith = function(overlay, options) { throw new Error('Unsupported overlay ' + typeof overlay); } if (isObject(options)) { + if (typeof options.tile === 'undefined') { + this.options.overlayTile = false; + } + else if (isBoolean(options.tile)) { + this.options.overlayTile = options.tile; + } else { + throw new Error(' Invalid Value for tile ' + options.tile + 'Only Boolean Values allowed for overlay.tile.'); + } + if (isInteger(options.gravity) && inRange(options.gravity, 0, 8)) { this.options.overlayGravity = options.gravity; } else if (isString(options.gravity) && isInteger(module.exports.gravity[options.gravity])) { diff --git a/src/pipeline.cc b/src/pipeline.cc index 864555b8..d671bd62 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -664,6 +664,35 @@ class PipelineWorker : public AsyncWorker { if (overlayImageType == ImageType::UNKNOWN) { return Error(); } + // Check if overlay is tiled + if (baton->overlayTile) { + int overlayImageWidth = overlayImage.width(); + int overlayImageHeight = overlayImage.height(); + int across = 0; + int down = 0; + + // use gravity in ovelay + if(overlayImageWidth <= baton->width) { + across = static_cast(ceil(static_cast(baton->width) / overlayImageWidth)); + } + if(overlayImageHeight <= baton->height) { + down = static_cast(ceil(static_cast(baton->height) / overlayImageHeight)); + } + if(across != 0 || down != 0) { + int left; + int top; + overlayImage = overlayImage.replicate(across, down); + // the overlayGravity will now be used to CalculateCrop for extract_area + std::tie(left, top) = CalculateCrop( + overlayImage.width(), overlayImage.height(), baton->width, baton->height, baton->overlayGravity + ); + overlayImage = overlayImage.extract_area( + left, top, baton->width, baton->height + ); + } + // the overlayGravity was used for extract_area, therefore set it back to its default value of 0 + baton->overlayGravity = 0; + } // Ensure overlay is premultiplied sRGB overlayImage = overlayImage.colourspace(VIPS_INTERPRETATION_sRGB).premultiply(); // Composite images with given gravity @@ -1050,6 +1079,7 @@ NAN_METHOD(pipeline) { baton->overlayBufferIn = node::Buffer::Data(overlayBufferIn); } baton->overlayGravity = attrAs(options, "overlayGravity"); + baton->overlayTile = attrAs(options, "overlayTile"); // Resize options baton->withoutEnlargement = attrAs(options, "withoutEnlargement"); baton->crop = attrAs(options, "crop"); diff --git a/src/pipeline.h b/src/pipeline.h index 50674b15..f366af8d 100644 --- a/src/pipeline.h +++ b/src/pipeline.h @@ -33,6 +33,7 @@ struct PipelineBaton { char *overlayBufferIn; size_t overlayBufferInLength; int overlayGravity; + bool overlayTile; int topOffsetPre; int leftOffsetPre; int widthPre; @@ -97,6 +98,7 @@ struct PipelineBaton { bufferOutLength(0), overlayBufferInLength(0), overlayGravity(0), + overlayTile(false), topOffsetPre(-1), topOffsetPost(-1), channels(0), diff --git a/test/fixtures/expected/overlay-tile-gravity-center.jpg b/test/fixtures/expected/overlay-tile-gravity-center.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f38623d54268a17da86f011f8b21980ffbdc1db GIT binary patch literal 3170 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 F{9n5rsr~=} literal 0 HcmV?d00001 diff --git a/test/fixtures/expected/overlay-tile-gravity-centre.jpg b/test/fixtures/expected/overlay-tile-gravity-centre.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f38623d54268a17da86f011f8b21980ffbdc1db GIT binary patch literal 3170 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 F{9n5rsr~=} literal 0 HcmV?d00001 diff --git a/test/fixtures/expected/overlay-tile-gravity-east.jpg b/test/fixtures/expected/overlay-tile-gravity-east.jpg new file mode 100644 index 0000000000000000000000000000000000000000..af8d3b5966c726dd8c979de0a07030bab42830f6 GIT binary patch literal 3208 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/expected/overlay-tile-gravity-north.jpg b/test/fixtures/expected/overlay-tile-gravity-north.jpg new file mode 100644 index 0000000000000000000000000000000000000000..82d47bd2f82d687e9ec62b38a2d69bda0e81bc68 GIT binary patch literal 3098 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 Y_JM|dAZcbvS8kGd7_jSh61hM2ALdDt-~a#s literal 0 HcmV?d00001 diff --git a/test/fixtures/expected/overlay-tile-gravity-northeast.jpg b/test/fixtures/expected/overlay-tile-gravity-northeast.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6eff5f9cc18620ded55491db57239da3a47b4239 GIT binary patch literal 3141 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 PjPQP`{^OnJ-kW~_-M7dq literal 0 HcmV?d00001 diff --git a/test/fixtures/expected/overlay-tile-gravity-northwest.jpg b/test/fixtures/expected/overlay-tile-gravity-northwest.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0f6e9d03460017e98ef087c1b9649019f330335 GIT binary patch literal 3120 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/expected/overlay-tile-gravity-southeast.jpg b/test/fixtures/expected/overlay-tile-gravity-southeast.jpg new file mode 100644 index 0000000000000000000000000000000000000000..21aa2b1e575f10edd876d24e1e0314f7f45e0eec GIT binary patch literal 3127 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/expected/overlay-tile-rotated90-gravity-northwest.jpg b/test/fixtures/expected/overlay-tile-rotated90-gravity-northwest.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad0e18adec1b79b12a2a6b701121117bb44164de GIT binary patch literal 4538 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 DyW3D5 literal 0 HcmV?d00001 diff --git a/test/fixtures/expected/overlay-tile-rotated90.jpg b/test/fixtures/expected/overlay-tile-rotated90.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d9c2171b10f7dce8469b22b446cf6e16d261d12 GIT binary patch literal 4555 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