Home | History | Annotate | Download | only in libjpeg_turbo
      1 /*
      2  * transupp.h
      3  *
      4  * Copyright (C) 1997-2011, Thomas G. Lane, Guido Vollbeding.
      5  * This file is part of the Independent JPEG Group's software.
      6  * For conditions of distribution and use, see the accompanying README file.
      7  *
      8  * This file contains declarations for image transformation routines and
      9  * other utility code used by the jpegtran sample application.  These are
     10  * NOT part of the core JPEG library.  But we keep these routines separate
     11  * from jpegtran.c to ease the task of maintaining jpegtran-like programs
     12  * that have other user interfaces.
     13  *
     14  * NOTE: all the routines declared here have very specific requirements
     15  * about when they are to be executed during the reading and writing of the
     16  * source and destination files.  See the comments in transupp.c, or see
     17  * jpegtran.c for an example of correct usage.
     18  */
     19 
     20 /* If you happen not to want the image transform support, disable it here */
     21 #ifndef TRANSFORMS_SUPPORTED
     22 #define TRANSFORMS_SUPPORTED 1		/* 0 disables transform code */
     23 #endif
     24 
     25 /*
     26  * Although rotating and flipping data expressed as DCT coefficients is not
     27  * hard, there is an asymmetry in the JPEG format specification for images
     28  * whose dimensions aren't multiples of the iMCU size.  The right and bottom
     29  * image edges are padded out to the next iMCU boundary with junk data; but
     30  * no padding is possible at the top and left edges.  If we were to flip
     31  * the whole image including the pad data, then pad garbage would become
     32  * visible at the top and/or left, and real pixels would disappear into the
     33  * pad margins --- perhaps permanently, since encoders & decoders may not
     34  * bother to preserve DCT blocks that appear to be completely outside the
     35  * nominal image area.  So, we have to exclude any partial iMCUs from the
     36  * basic transformation.
     37  *
     38  * Transpose is the only transformation that can handle partial iMCUs at the
     39  * right and bottom edges completely cleanly.  flip_h can flip partial iMCUs
     40  * at the bottom, but leaves any partial iMCUs at the right edge untouched.
     41  * Similarly flip_v leaves any partial iMCUs at the bottom edge untouched.
     42  * The other transforms are defined as combinations of these basic transforms
     43  * and process edge blocks in a way that preserves the equivalence.
     44  *
     45  * The "trim" option causes untransformable partial iMCUs to be dropped;
     46  * this is not strictly lossless, but it usually gives the best-looking
     47  * result for odd-size images.  Note that when this option is active,
     48  * the expected mathematical equivalences between the transforms may not hold.
     49  * (For example, -rot 270 -trim trims only the bottom edge, but -rot 90 -trim
     50  * followed by -rot 180 -trim trims both edges.)
     51  *
     52  * We also offer a lossless-crop option, which discards data outside a given
     53  * image region but losslessly preserves what is inside.  Like the rotate and
     54  * flip transforms, lossless crop is restricted by the JPEG format: the upper
     55  * left corner of the selected region must fall on an iMCU boundary.  If this
     56  * does not hold for the given crop parameters, we silently move the upper left
     57  * corner up and/or left to make it so, simultaneously increasing the region
     58  * dimensions to keep the lower right crop corner unchanged.  (Thus, the
     59  * output image covers at least the requested region, but may cover more.)
     60  * The adjustment of the region dimensions may be optionally disabled.
     61  *
     62  * We also provide a lossless-resize option, which is kind of a lossless-crop
     63  * operation in the DCT coefficient block domain - it discards higher-order
     64  * coefficients and losslessly preserves lower-order coefficients of a
     65  * sub-block.
     66  *
     67  * Rotate/flip transform, resize, and crop can be requested together in a
     68  * single invocation.  The crop is applied last --- that is, the crop region
     69  * is specified in terms of the destination image after transform/resize.
     70  *
     71  * We also offer a "force to grayscale" option, which simply discards the
     72  * chrominance channels of a YCbCr image.  This is lossless in the sense that
     73  * the luminance channel is preserved exactly.  It's not the same kind of
     74  * thing as the rotate/flip transformations, but it's convenient to handle it
     75  * as part of this package, mainly because the transformation routines have to
     76  * be aware of the option to know how many components to work on.
     77  */
     78 
     79 
     80 /* Short forms of external names for systems with brain-damaged linkers. */
     81 
     82 #ifdef NEED_SHORT_EXTERNAL_NAMES
     83 #define jtransform_parse_crop_spec	jTrParCrop
     84 #define jtransform_request_workspace	jTrRequest
     85 #define jtransform_adjust_parameters	jTrAdjust
     86 #define jtransform_execute_transform	jTrExec
     87 #define jtransform_perfect_transform	jTrPerfect
     88 #define jcopy_markers_setup		jCMrkSetup
     89 #define jcopy_markers_execute		jCMrkExec
     90 #endif /* NEED_SHORT_EXTERNAL_NAMES */
     91 
     92 
     93 /*
     94  * Codes for supported types of image transformations.
     95  */
     96 
     97 typedef enum {
     98 	JXFORM_NONE,		/* no transformation */
     99 	JXFORM_FLIP_H,		/* horizontal flip */
    100 	JXFORM_FLIP_V,		/* vertical flip */
    101 	JXFORM_TRANSPOSE,	/* transpose across UL-to-LR axis */
    102 	JXFORM_TRANSVERSE,	/* transpose across UR-to-LL axis */
    103 	JXFORM_ROT_90,		/* 90-degree clockwise rotation */
    104 	JXFORM_ROT_180,		/* 180-degree rotation */
    105 	JXFORM_ROT_270		/* 270-degree clockwise (or 90 ccw) */
    106 } JXFORM_CODE;
    107 
    108 /*
    109  * Codes for crop parameters, which can individually be unspecified,
    110  * positive or negative for xoffset or yoffset,
    111  * positive or forced for width or height.
    112  */
    113 
    114 typedef enum {
    115         JCROP_UNSET,
    116         JCROP_POS,
    117         JCROP_NEG,
    118         JCROP_FORCE
    119 } JCROP_CODE;
    120 
    121 /*
    122  * Transform parameters struct.
    123  * NB: application must not change any elements of this struct after
    124  * calling jtransform_request_workspace.
    125  */
    126 
    127 typedef struct {
    128   /* Options: set by caller */
    129   JXFORM_CODE transform;	/* image transform operator */
    130   boolean perfect;		/* if TRUE, fail if partial MCUs are requested */
    131   boolean trim;			/* if TRUE, trim partial MCUs as needed */
    132   boolean force_grayscale;	/* if TRUE, convert color image to grayscale */
    133   boolean crop;			/* if TRUE, crop source image */
    134   boolean slow_hflip;  /* For best performance, the JXFORM_FLIP_H transform
    135                           normally modifies the source coefficients in place.
    136                           Setting this to TRUE will instead use a slower,
    137                           double-buffered algorithm, which leaves the source
    138                           coefficients in tact (necessary if other transformed
    139                           images must be generated from the same set of
    140                           coefficients. */
    141 
    142   /* Crop parameters: application need not set these unless crop is TRUE.
    143    * These can be filled in by jtransform_parse_crop_spec().
    144    */
    145   JDIMENSION crop_width;	/* Width of selected region */
    146   JCROP_CODE crop_width_set;	/* (forced disables adjustment) */
    147   JDIMENSION crop_height;	/* Height of selected region */
    148   JCROP_CODE crop_height_set;	/* (forced disables adjustment) */
    149   JDIMENSION crop_xoffset;	/* X offset of selected region */
    150   JCROP_CODE crop_xoffset_set;	/* (negative measures from right edge) */
    151   JDIMENSION crop_yoffset;	/* Y offset of selected region */
    152   JCROP_CODE crop_yoffset_set;	/* (negative measures from bottom edge) */
    153 
    154   /* Internal workspace: caller should not touch these */
    155   int num_components;		/* # of components in workspace */
    156   jvirt_barray_ptr * workspace_coef_arrays; /* workspace for transformations */
    157   JDIMENSION output_width;	/* cropped destination dimensions */
    158   JDIMENSION output_height;
    159   JDIMENSION x_crop_offset;	/* destination crop offsets measured in iMCUs */
    160   JDIMENSION y_crop_offset;
    161   int iMCU_sample_width;	/* destination iMCU size */
    162   int iMCU_sample_height;
    163 } jpeg_transform_info;
    164 
    165 
    166 #if TRANSFORMS_SUPPORTED
    167 
    168 /* Parse a crop specification (written in X11 geometry style) */
    169 EXTERN(boolean) jtransform_parse_crop_spec
    170 	JPP((jpeg_transform_info *info, const char *spec));
    171 /* Request any required workspace */
    172 EXTERN(boolean) jtransform_request_workspace
    173 	JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info));
    174 /* Adjust output image parameters */
    175 EXTERN(jvirt_barray_ptr *) jtransform_adjust_parameters
    176 	JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
    177 	     jvirt_barray_ptr *src_coef_arrays,
    178 	     jpeg_transform_info *info));
    179 /* Execute the actual transformation, if any */
    180 EXTERN(void) jtransform_execute_transform
    181 	JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
    182 	     jvirt_barray_ptr *src_coef_arrays,
    183 	     jpeg_transform_info *info));
    184 /* Determine whether lossless transformation is perfectly
    185  * possible for a specified image and transformation.
    186  */
    187 EXTERN(boolean) jtransform_perfect_transform
    188 	JPP((JDIMENSION image_width, JDIMENSION image_height,
    189 	     int MCU_width, int MCU_height,
    190 	     JXFORM_CODE transform));
    191 
    192 /* jtransform_execute_transform used to be called
    193  * jtransform_execute_transformation, but some compilers complain about
    194  * routine names that long.  This macro is here to avoid breaking any
    195  * old source code that uses the original name...
    196  */
    197 #define jtransform_execute_transformation	jtransform_execute_transform
    198 
    199 #endif /* TRANSFORMS_SUPPORTED */
    200 
    201 
    202 /*
    203  * Support for copying optional markers from source to destination file.
    204  */
    205 
    206 typedef enum {
    207 	JCOPYOPT_NONE,		/* copy no optional markers */
    208 	JCOPYOPT_COMMENTS,	/* copy only comment (COM) markers */
    209 	JCOPYOPT_ALL		/* copy all optional markers */
    210 } JCOPY_OPTION;
    211 
    212 #define JCOPYOPT_DEFAULT  JCOPYOPT_COMMENTS	/* recommended default */
    213 
    214 /* Setup decompression object to save desired markers in memory */
    215 EXTERN(void) jcopy_markers_setup
    216 	JPP((j_decompress_ptr srcinfo, JCOPY_OPTION option));
    217 /* Copy markers saved in the given source object to the destination object */
    218 EXTERN(void) jcopy_markers_execute
    219 	JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
    220 	     JCOPY_OPTION option));
    221