diff --git a/package.json b/package.json index eeeab495..a5fe6fbc 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sharp", - "version": "0.5.1", + "version": "0.5.2", "author": "Lovell Fuller ", "contributors": [ "Pierre Inglebert ", @@ -33,11 +33,11 @@ ], "dependencies": { "nan": "^1.2.0", - "bluebird": "^2.1.2" + "bluebird": "^2.2.1" }, "devDependencies": { "imagemagick": "^0.1.3", - "imagemagick-native": "^1.1.1", + "imagemagick-native": "^1.2.2", "gm": "^1.16.0", "async": "^0.9.0", "benchmark": "^1.0.0" diff --git a/src/sharp.cc b/src/sharp.cc index eebb5303..25a96602 100755 --- a/src/sharp.cc +++ b/src/sharp.cc @@ -373,46 +373,58 @@ class ResizeWorker : public NanAsyncWorker { vips_colourspace(sharpened, &colourspaced, VIPS_INTERPRETATION_sRGB, NULL); g_object_unref(sharpened); + // Generate image tile cache when interlace output is required + VipsImage *cached = vips_image_new(); + if (baton->progressive) { + if (vips_tilecache(colourspaced, &cached, "threaded", TRUE, "persistent", TRUE, "max_tiles", -1, NULL)) { + return resize_error(baton, colourspaced); + } + } else { + vips_copy(colourspaced, &cached, NULL); + } + g_object_unref(colourspaced); + // Output + VipsImage *output = cached; if (baton->file_out == "__jpeg" || (baton->file_out == "__input" && inputImageType == JPEG)) { // Write JPEG to buffer - if (vips_jpegsave_buffer(colourspaced, &baton->buffer_out, &baton->buffer_out_len, "strip", TRUE, "Q", baton->quality, "optimize_coding", TRUE, "interlace", baton->progressive, NULL)) { - return resize_error(baton, colourspaced); + if (vips_jpegsave_buffer(output, &baton->buffer_out, &baton->buffer_out_len, "strip", TRUE, "Q", baton->quality, "optimize_coding", TRUE, "interlace", baton->progressive, NULL)) { + return resize_error(baton, output); } } else if (baton->file_out == "__png" || (baton->file_out == "__input" && inputImageType == PNG)) { // Write PNG to buffer - if (vips_pngsave_buffer(colourspaced, &baton->buffer_out, &baton->buffer_out_len, "strip", TRUE, "compression", baton->compressionLevel, "interlace", baton->progressive, NULL)) { - return resize_error(baton, colourspaced); + if (vips_pngsave_buffer(output, &baton->buffer_out, &baton->buffer_out_len, "strip", TRUE, "compression", baton->compressionLevel, "interlace", baton->progressive, NULL)) { + return resize_error(baton, output); } } else if (baton->file_out == "__webp" || (baton->file_out == "__input" && inputImageType == WEBP)) { // Write WEBP to buffer - if (vips_webpsave_buffer(colourspaced, &baton->buffer_out, &baton->buffer_out_len, "strip", TRUE, "Q", baton->quality, NULL)) { - return resize_error(baton, colourspaced); + if (vips_webpsave_buffer(output, &baton->buffer_out, &baton->buffer_out_len, "strip", TRUE, "Q", baton->quality, NULL)) { + return resize_error(baton, output); } } else if (is_jpeg(baton->file_out)) { // Write JPEG to file - if (vips_jpegsave(colourspaced, baton->file_out.c_str(), "strip", TRUE, "Q", baton->quality, "optimize_coding", TRUE, "interlace", baton->progressive, NULL)) { - return resize_error(baton, colourspaced); + if (vips_jpegsave(output, baton->file_out.c_str(), "strip", TRUE, "Q", baton->quality, "optimize_coding", TRUE, "interlace", baton->progressive, NULL)) { + return resize_error(baton, output); } } else if (is_png(baton->file_out)) { // Write PNG to file - if (vips_pngsave(colourspaced, baton->file_out.c_str(), "strip", TRUE, "compression", baton->compressionLevel, "interlace", baton->progressive, NULL)) { - return resize_error(baton, colourspaced); + if (vips_pngsave(output, baton->file_out.c_str(), "strip", TRUE, "compression", baton->compressionLevel, "interlace", baton->progressive, NULL)) { + return resize_error(baton, output); } } else if (is_webp(baton->file_out)) { // Write WEBP to file - if (vips_webpsave(colourspaced, baton->file_out.c_str(), "strip", TRUE, "Q", baton->quality, NULL)) { - return resize_error(baton, colourspaced); + if (vips_webpsave(output, baton->file_out.c_str(), "strip", TRUE, "Q", baton->quality, NULL)) { + return resize_error(baton, output); } } else if (is_tiff(baton->file_out)) { // Write TIFF to file - if (vips_tiffsave(colourspaced, baton->file_out.c_str(), "strip", TRUE, "compression", VIPS_FOREIGN_TIFF_COMPRESSION_JPEG, "Q", baton->quality, NULL)) { - return resize_error(baton, colourspaced); + if (vips_tiffsave(output, baton->file_out.c_str(), "strip", TRUE, "compression", VIPS_FOREIGN_TIFF_COMPRESSION_JPEG, "Q", baton->quality, NULL)) { + return resize_error(baton, output); } } else { (baton->err).append("Unsupported output " + baton->file_out); } - g_object_unref(colourspaced); + g_object_unref(output); vips_thread_shutdown(); }