diff options
author | Guido Vollbeding <jpeg-info@jpegclub.org> | 2012-01-15 00:00:00 +0000 |
---|---|---|
committer | DRC <information@libjpeg-turbo.org> | 2015-07-27 13:50:34 -0500 |
commit | 5829cb23983cd241c48abd8ed70ff3627560c453 (patch) | |
tree | dbe81b8393ba267bdd2016c8dbe4edea69400a75 /transupp.c | |
parent | c39ec149e8dfa87b8032a0cf0ce0a41da1bbdada (diff) | |
download | libjpeg-turbo-5829cb23983cd241c48abd8ed70ff3627560c453.tar.gz |
The Independent JPEG Group's JPEG software v8d
Diffstat (limited to 'transupp.c')
-rw-r--r-- | transupp.c | 32 |
1 files changed, 23 insertions, 9 deletions
@@ -1,7 +1,7 @@ /* * transupp.c * - * Copyright (C) 1997-2009, Thomas G. Lane, Guido Vollbeding. + * Copyright (C) 1997-2011, Thomas G. Lane, Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -771,7 +771,7 @@ jt_read_integer (const char ** strptr, JDIMENSION * result) * The routine returns TRUE if the spec string is valid, FALSE if not. * * The crop spec string should have the format - * <width>x<height>{+-}<xoffset>{+-}<yoffset> + * <width>[f]x<height>[f]{+-}<xoffset>{+-}<yoffset> * where width, height, xoffset, and yoffset are unsigned integers. * Each of the elements can be omitted to indicate a default value. * (A weakness of this style is that it is not possible to omit xoffset @@ -793,14 +793,22 @@ jtransform_parse_crop_spec (jpeg_transform_info *info, const char *spec) /* fetch width */ if (! jt_read_integer(&spec, &info->crop_width)) return FALSE; - info->crop_width_set = JCROP_POS; + if (*spec == 'f' || *spec == 'F') { + spec++; + info->crop_width_set = JCROP_FORCE; + } else + info->crop_width_set = JCROP_POS; } - if (*spec == 'x' || *spec == 'X') { + if (*spec == 'x' || *spec == 'X') { /* fetch height */ spec++; if (! jt_read_integer(&spec, &info->crop_height)) return FALSE; - info->crop_height_set = JCROP_POS; + if (*spec == 'f' || *spec == 'F') { + spec++; + info->crop_height_set = JCROP_FORCE; + } else + info->crop_height_set = JCROP_POS; } if (*spec == '+' || *spec == '-') { /* fetch xoffset */ @@ -980,10 +988,16 @@ jtransform_request_workspace (j_decompress_ptr srcinfo, else yoffset = info->crop_yoffset; /* Now adjust so that upper left corner falls at an iMCU boundary */ - info->output_width = - info->crop_width + (xoffset % info->iMCU_sample_width); - info->output_height = - info->crop_height + (yoffset % info->iMCU_sample_height); + if (info->crop_width_set == JCROP_FORCE) + info->output_width = info->crop_width; + else + info->output_width = + info->crop_width + (xoffset % info->iMCU_sample_width); + if (info->crop_height_set == JCROP_FORCE) + info->output_height = info->crop_height; + else + info->output_height = + info->crop_height + (yoffset % info->iMCU_sample_height); /* Save x/y offsets measured in iMCUs */ info->x_crop_offset = xoffset / info->iMCU_sample_width; info->y_crop_offset = yoffset / info->iMCU_sample_height; |