mirror of
https://github.com/lovell/sharp.git
synced 2025-07-09 10:30:15 +02:00
Copy metadata input buffer to match pipeline Prevents possible metadata segfault under load
165 lines
5.1 KiB
JavaScript
Executable File
165 lines
5.1 KiB
JavaScript
Executable File
'use strict';
|
|
|
|
var assert = require('assert');
|
|
var fixtures = require('../fixtures');
|
|
var sharp = require('../../index');
|
|
|
|
sharp.cache(0);
|
|
|
|
// Helpers
|
|
var getPaths = function(baseName, extension) {
|
|
if (typeof extension === 'undefined') {
|
|
extension = 'png';
|
|
}
|
|
return {
|
|
actual: fixtures.path('output.' + baseName + '.' + extension),
|
|
expected: fixtures.expected(baseName + '.' + extension),
|
|
};
|
|
};
|
|
|
|
// Test
|
|
describe('Overlays', function() {
|
|
it('Overlay transparent PNG on solid background', function(done) {
|
|
var paths = getPaths('alpha-layer-01');
|
|
|
|
sharp(fixtures.inputPngOverlayLayer0)
|
|
.overlayWith(fixtures.inputPngOverlayLayer1)
|
|
.toFile(paths.actual, function (error) {
|
|
if (error) return done(error);
|
|
fixtures.assertMaxColourDistance(paths.actual, paths.expected);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Overlay low-alpha transparent PNG on solid background', function(done) {
|
|
var paths = getPaths('alpha-layer-01-low-alpha');
|
|
|
|
sharp(fixtures.inputPngOverlayLayer0)
|
|
.overlayWith(fixtures.inputPngOverlayLayer1LowAlpha)
|
|
.toFile(paths.actual, function (error) {
|
|
if (error) return done(error);
|
|
fixtures.assertMaxColourDistance(paths.actual, paths.expected);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Composite three transparent PNGs into one', function(done) {
|
|
var paths = getPaths('alpha-layer-012');
|
|
|
|
sharp(fixtures.inputPngOverlayLayer0)
|
|
.overlayWith(fixtures.inputPngOverlayLayer1)
|
|
.toBuffer(function (error, data) {
|
|
if (error) return done(error);
|
|
sharp(data)
|
|
.overlayWith(fixtures.inputPngOverlayLayer2)
|
|
.toFile(paths.actual, function (error) {
|
|
if (error) return done(error);
|
|
fixtures.assertMaxColourDistance(paths.actual, paths.expected);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
it('Composite two transparent PNGs into one', function(done) {
|
|
var paths = getPaths('alpha-layer-12');
|
|
|
|
sharp(fixtures.inputPngOverlayLayer1)
|
|
.overlayWith(fixtures.inputPngOverlayLayer2)
|
|
.toFile(paths.actual, function (error) {
|
|
if (error) return done(error);
|
|
fixtures.assertMaxColourDistance(paths.actual, paths.expected);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Composite two low-alpha transparent PNGs into one', function(done) {
|
|
var paths = getPaths('alpha-layer-12-low-alpha');
|
|
|
|
sharp(fixtures.inputPngOverlayLayer1LowAlpha)
|
|
.overlayWith(fixtures.inputPngOverlayLayer2LowAlpha)
|
|
.toFile(paths.actual, function (error) {
|
|
if (error) return done(error);
|
|
fixtures.assertMaxColourDistance(paths.actual, paths.expected, 2);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Composite three low-alpha transparent PNGs into one', function(done) {
|
|
var paths = getPaths('alpha-layer-012-low-alpha');
|
|
|
|
sharp(fixtures.inputPngOverlayLayer0)
|
|
.overlayWith(fixtures.inputPngOverlayLayer1LowAlpha)
|
|
.toBuffer(function (error, data) {
|
|
if (error) return done(error);
|
|
|
|
sharp(data)
|
|
.overlayWith(fixtures.inputPngOverlayLayer2LowAlpha)
|
|
.toFile(paths.actual, function (error) {
|
|
if (error) return done(error);
|
|
fixtures.assertMaxColourDistance(paths.actual, paths.expected);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
it('Composite rgb+alpha PNG onto JPEG', function(done) {
|
|
var paths = getPaths('overlay-jpeg-with-rgb', 'jpg');
|
|
|
|
sharp(fixtures.inputJpg)
|
|
.resize(2048, 1536)
|
|
.overlayWith(fixtures.inputPngOverlayLayer1)
|
|
.toFile(paths.actual, function(error, info) {
|
|
if (error) return done(error);
|
|
fixtures.assertMaxColourDistance(paths.actual, paths.expected, 102);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Composite greyscale+alpha PNG onto JPEG', function(done) {
|
|
var paths = getPaths('overlay-jpeg-with-greyscale', 'jpg');
|
|
|
|
sharp(fixtures.inputJpg)
|
|
.resize(400, 300)
|
|
.overlayWith(fixtures.inputPngWithGreyAlpha)
|
|
.toFile(paths.actual, function(error, info) {
|
|
if (error) return done(error);
|
|
fixtures.assertMaxColourDistance(paths.actual, paths.expected, 102);
|
|
done();
|
|
});
|
|
});
|
|
|
|
if (sharp.format.webp.input.file) {
|
|
it('Composite WebP onto JPEG', function(done) {
|
|
var paths = getPaths('overlay-jpeg-with-webp', 'jpg');
|
|
|
|
sharp(fixtures.inputJpg)
|
|
.resize(300, 300)
|
|
.overlayWith(fixtures.inputWebPWithTransparency)
|
|
.toFile(paths.actual, function(error, info) {
|
|
if (error) return done(error);
|
|
fixtures.assertMaxColourDistance(paths.actual, paths.expected, 102);
|
|
done();
|
|
});
|
|
});
|
|
}
|
|
|
|
it('Fail when compositing images with different dimensions', function(done) {
|
|
sharp(fixtures.inputJpg)
|
|
.overlayWith(fixtures.inputPngWithGreyAlpha)
|
|
.toBuffer(function(error) {
|
|
assert.strictEqual(true, error instanceof Error);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('Fail when compositing non-PNG image', function(done) {
|
|
sharp(fixtures.inputPngOverlayLayer1)
|
|
.overlayWith(fixtures.inputJpg)
|
|
.toBuffer(function(error) {
|
|
assert.strictEqual(true, error instanceof Error);
|
|
done();
|
|
});
|
|
});
|
|
|
|
});
|