From 8d16bf566d857040a83b604134d414c6cd47b85d Mon Sep 17 00:00:00 2001 From: Mario de Frutos Date: Tue, 12 Dec 2017 13:20:22 +0100 Subject: [PATCH] Force png tile generation for static maps (#808) * Force png tile generation for static maps If the user tries to generate a static map requesting JPG it will fail because is going to try to generate the tiles using JPG as format which is not supported by now, this bug was introduced in the version 4.0.1 So we now force, again, the tiles to be generated as PNG but we pass the requested format, JPG, to windshaft to generate the final image as the user reqests * Added support to define image format in the image assertions * Added test for JPEG static image generation Also I've added support for: - JPEG images - Different tolerance based on the file type, it seems that due to different compression we need different tolerance for JPG images --- NEWS.md | 3 +- lib/cartodb/controllers/layergroup.js | 6 ++- lib/cartodb/controllers/named_maps.js | 6 ++- test/acceptance/named_maps_static_view.js | 41 +++++++++++++----- ...ted_places_simple_reduced-zoom-center.jpeg | Bin 0 -> 49893 bytes test/results/jpeg/.gitignore | 3 ++ test/support/assert.js | 20 +++++---- 7 files changed, 56 insertions(+), 23 deletions(-) create mode 100644 test/fixtures/previews/populated_places_simple_reduced-zoom-center.jpeg create mode 100644 test/results/jpeg/.gitignore diff --git a/NEWS.md b/NEWS.md index e70b8df2..db11b9b5 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,7 +3,8 @@ ## 4.3.1 Released 2017-mm-dd -Announcements: +Bug fix: + - Fixed bug introduced in version 4.0.1 that brokes the static map generation using JPG as format ## 4.3.0 Released 2017-12-11 diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index 43dd9c3a..23c0f6cd 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -357,7 +357,9 @@ LayergroupController.prototype.center = function(req, res, next) { LayergroupController.prototype.staticMap = function(req, res, width, height, zoom /* bounds */, center, next) { var format = req.params.format === 'jpg' ? 'jpeg' : 'png'; - req.params.format = req.params.format || 'png'; + // We force always the tile to be generated using PNG because + // is the only format we support by now + res.locals.format = 'png'; res.locals.layer = res.locals.layer || 'all'; var self = this; @@ -507,4 +509,4 @@ function validateLayerRouteMiddleware(req, res, next) { } next(); -} \ No newline at end of file +} diff --git a/lib/cartodb/controllers/named_maps.js b/lib/cartodb/controllers/named_maps.js index a88c8592..cd2d120f 100644 --- a/lib/cartodb/controllers/named_maps.js +++ b/lib/cartodb/controllers/named_maps.js @@ -28,7 +28,7 @@ NamedMapsController.prototype.register = function(app) { userMiddleware, this.prepareContext, this.tile.bind(this), - vectorError() + vectorError() ); app.get( @@ -121,7 +121,9 @@ NamedMapsController.prototype.staticMap = function(req, res, next) { var cdbUser = res.locals.user; var format = req.params.format === 'jpg' ? 'jpeg' : 'png'; - res.locals.format = req.params.format || 'png'; + // We force always the tile to be generated using PNG because + // is the only format we support by now + res.locals.format = 'png'; res.locals.layer = res.locals.layer || 'all'; var namedMapProvider; diff --git a/test/acceptance/named_maps_static_view.js b/test/acceptance/named_maps_static_view.js index b7af4197..9844c667 100644 --- a/test/acceptance/named_maps_static_view.js +++ b/test/acceptance/named_maps_static_view.js @@ -19,7 +19,8 @@ describe('named maps static view', function() { var username = 'localhost'; var templateName = 'template_with_view'; - var IMAGE_TOLERANCE = 20; + var PNG_IMAGE_TOLERANCE = 20; + var JPG_IMAGE_TOLERANCE = 100; function createTemplate(view, layers) { return { @@ -92,8 +93,8 @@ describe('named maps static view', function() { }); } - function previewFixture(version) { - return './test/fixtures/previews/populated_places_simple_reduced-' + version + '.png'; + function previewFixture(version, format='png') { + return './test/fixtures/previews/populated_places_simple_reduced-' + version + '.' + format; } it('should return an image estimating its bounds based on dataset', function (done) { @@ -103,7 +104,7 @@ describe('named maps static view', function() { } getStaticMap(function(err, img) { assert.ok(!err); - assert.imageIsSimilarToFile(img, previewFixture('estimated'), IMAGE_TOLERANCE, done); + assert.imageIsSimilarToFile(img, previewFixture('estimated'), PNG_IMAGE_TOLERANCE, done); }); }); }); @@ -122,7 +123,7 @@ describe('named maps static view', function() { } getStaticMap(function(err, img) { assert.ok(!err); - assert.imageIsSimilarToFile(img, previewFixture('zoom-center'), IMAGE_TOLERANCE, done); + assert.imageIsSimilarToFile(img, previewFixture('zoom-center'), PNG_IMAGE_TOLERANCE, done); }); }); }); @@ -142,7 +143,7 @@ describe('named maps static view', function() { } getStaticMap(function(err, img) { assert.ok(!err); - assert.imageIsSimilarToFile(img, previewFixture('bounds'), IMAGE_TOLERANCE, done); + assert.imageIsSimilarToFile(img, previewFixture('bounds'), PNG_IMAGE_TOLERANCE, done); }); }); }); @@ -167,7 +168,7 @@ describe('named maps static view', function() { } getStaticMap(function(err, img) { assert.ok(!err); - assert.imageIsSimilarToFile(img, previewFixture('zoom-center'), IMAGE_TOLERANCE, done); + assert.imageIsSimilarToFile(img, previewFixture('zoom-center'), PNG_IMAGE_TOLERANCE, done); }); }); }); @@ -192,7 +193,7 @@ describe('named maps static view', function() { } getStaticMap({ zoom: 3 }, function(err, img) { assert.ok(!err); - assert.imageIsSimilarToFile(img, previewFixture('override-zoom'), IMAGE_TOLERANCE, done); + assert.imageIsSimilarToFile(img, previewFixture('override-zoom'), PNG_IMAGE_TOLERANCE, done); }); }); }); @@ -217,7 +218,7 @@ describe('named maps static view', function() { } getStaticMap({ bbox: '0,45,90,45' }, function(err, img) { assert.ok(!err); - assert.imageIsSimilarToFile(img, previewFixture('override-bbox'), IMAGE_TOLERANCE, done); + assert.imageIsSimilarToFile(img, previewFixture('override-bbox'), PNG_IMAGE_TOLERANCE, done); }); }); }); @@ -256,7 +257,27 @@ describe('named maps static view', function() { } getStaticMap({ layer: 0 }, function(err, img) { assert.ok(!err); - assert.imageIsSimilarToFile(img, previewFixture('bounds'), IMAGE_TOLERANCE, done); + assert.imageIsSimilarToFile(img, previewFixture('bounds'), PNG_IMAGE_TOLERANCE, done); + }); + }); + }); + + it('should return jpg static map', function (done) { + var view = { + zoom: 4, + center: { + lng: 40, + lat: 20 + } + }; + templateMaps.addTemplate(username, createTemplate(view), function (err) { + if (err) { + return done(err); + } + getStaticMap({ format: 'jpeg' }, function(err, img) { + assert.ok(!err); + assert.imageIsSimilarToFile(img, previewFixture('zoom-center', 'jpeg'), + JPG_IMAGE_TOLERANCE, done, 'jpeg'); }); }); }); diff --git a/test/fixtures/previews/populated_places_simple_reduced-zoom-center.jpeg b/test/fixtures/previews/populated_places_simple_reduced-zoom-center.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e3f62673432dc837f320998d083eef5ac948af83 GIT binary patch literal 49893 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 literal 0 HcmV?d00001 diff --git a/test/results/jpeg/.gitignore b/test/results/jpeg/.gitignore new file mode 100644 index 00000000..c23ac972 --- /dev/null +++ b/test/results/jpeg/.gitignore @@ -0,0 +1,3 @@ +*.jpeg +*.jpg +*.js diff --git a/test/support/assert.js b/test/support/assert.js index bcb186aa..6815a63f 100644 --- a/test/support/assert.js +++ b/test/support/assert.js @@ -37,7 +37,7 @@ assert.imageBuffersAreSimilar = function(bufferA, bufferB, tolerance, callback) imagesAreSimilar(testImage, referenceImage, tolerance, callback); }; -assert.imageIsSimilarToFile = function(testImage, referenceImageRelativeFilePath, tolerance, callback) { +assert.imageIsSimilarToFile = function(testImage, referenceImageRelativeFilePath, tolerance, callback, format='png') { callback = callback || function(err) { assert.ifError(err); }; var referenceImageFilePath = path.resolve(referenceImageRelativeFilePath); @@ -46,19 +46,23 @@ assert.imageIsSimilarToFile = function(testImage, referenceImageRelativeFilePath imagesAreSimilar(testImage, referenceImage, tolerance, function(err) { if (err) { - var testImageFilePath = randomImagePath(); - testImage.save(testImageFilePath); + var testImageFilePath = randomImagePath(format); + testImage.save(testImageFilePath, format); } callback(err); - }); + }, format); }; -function imagesAreSimilar(testImage, referenceImage, tolerance, callback) { +function imagesAreSimilar(testImage, referenceImage, tolerance, callback, format='png') { if (testImage.width() !== referenceImage.width() || testImage.height() !== referenceImage.height()) { return callback(new Error('Images are not the same size')); } - var pixelsDifference = referenceImage.compare(testImage); + var options = {}; + if (format === 'jpeg') { + options.alpha = false; + } + var pixelsDifference = referenceImage.compare(testImage, options); var similarity = pixelsDifference / (referenceImage.width() * referenceImage.height()); var tolerancePerMil = (tolerance / 1000); @@ -73,8 +77,8 @@ function imagesAreSimilar(testImage, referenceImage, tolerance, callback) { } } -function randomImagePath() { - return path.resolve('test/results/png/image-test-' + Date.now() + '.png'); +function randomImagePath(format='png') { + return path.resolve('test/results/' + format + '/image-test-' + Date.now() + '.' + format); } assert.response = function(server, req, res, callback) {