Keep shrink-on-load logic DRY. Ensure canvas option (crop vs embed) is always as requested.

This commit is contained in:
Lovell Fuller 2014-02-03 23:19:45 +00:00
parent e4ca8f44ec
commit 2f97d04dfa
2 changed files with 10 additions and 11 deletions

View File

@ -1,6 +1,6 @@
{
"name": "sharp",
"version": "0.1.2",
"version": "0.1.3",
"author": "Lovell Fuller",
"description": "High performance module to resize JPEG and PNG images using the libvips image processing library",
"scripts": {

View File

@ -98,22 +98,21 @@ void resize_async(uv_work_t *work) {
int shrink_on_load = 1;
if (inputImageType == JPEG) {
if (shrink >= 8) {
factor = residual * shrink / 8;
factor = factor / 8;
shrink_on_load = 8;
shrink = floor(factor);
residual = shrink / factor;
} else if (shrink >= 4) {
factor = residual * shrink / 4;
factor = factor / 4;
shrink_on_load = 4;
shrink = floor(factor);
residual = shrink / factor;
} else if (shrink >= 2) {
factor = residual * shrink / 2;
factor = factor / 2;
shrink_on_load = 2;
shrink = floor(factor);
residual = shrink / factor;
}
if (shrink_on_load > 1) {
// Recalculate integral shrink and double residual
factor = std::max(factor, 1.0);
shrink = floor(factor);
residual = shrink / factor;
// Reload input using shrink-on-load
g_object_unref(in);
in = vips_image_new();
if (baton->buffer_in_len > 1) {
@ -152,7 +151,7 @@ void resize_async(uv_work_t *work) {
VipsImage *canvased = vips_image_new();
if (affined->Xsize != baton->width || affined->Ysize != baton->height) {
if (baton->crop && affined->Xsize != baton->width && affined->Ysize != baton->height) {
if (baton->crop) {
// Crop
int width = std::min(affined->Xsize, baton->width);
int height = std::min(affined->Ysize, baton->height);