transupp.h 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /*
  2. * transupp.h
  3. *
  4. * Copyright (C) 1997-2019, 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. /* If you happen not to want the image transform support, disable it here */
  20. #ifndef TRANSFORMS_SUPPORTED
  21. #define TRANSFORMS_SUPPORTED 1 /* 0 disables transform code */
  22. #endif
  23. /*
  24. * Although rotating and flipping data expressed as DCT coefficients is not
  25. * hard, there is an asymmetry in the JPEG format specification for images
  26. * whose dimensions aren't multiples of the iMCU size. The right and bottom
  27. * image edges are padded out to the next iMCU boundary with junk data; but
  28. * no padding is possible at the top and left edges. If we were to flip
  29. * the whole image including the pad data, then pad garbage would become
  30. * visible at the top and/or left, and real pixels would disappear into the
  31. * pad margins --- perhaps permanently, since encoders & decoders may not
  32. * bother to preserve DCT blocks that appear to be completely outside the
  33. * nominal image area. So, we have to exclude any partial iMCUs from the
  34. * basic transformation.
  35. *
  36. * Transpose is the only transformation that can handle partial iMCUs at the
  37. * right and bottom edges completely cleanly. flip_h can flip partial iMCUs
  38. * at the bottom, but leaves any partial iMCUs at the right edge untouched.
  39. * Similarly flip_v leaves any partial iMCUs at the bottom edge untouched.
  40. * The other transforms are defined as combinations of these basic transforms
  41. * and process edge blocks in a way that preserves the equivalence.
  42. *
  43. * The "trim" option causes untransformable partial iMCUs to be dropped;
  44. * this is not strictly lossless, but it usually gives the best-looking
  45. * result for odd-size images. Note that when this option is active,
  46. * the expected mathematical equivalences between the transforms may not hold.
  47. * (For example, -rot 270 -trim trims only the bottom edge, but -rot 90 -trim
  48. * followed by -rot 180 -trim trims both edges.)
  49. *
  50. * We also offer a lossless-crop option, which discards data outside a given
  51. * image region but losslessly preserves what is inside. Like the rotate and
  52. * flip transforms, lossless crop is restricted by the current JPEG format: the
  53. * upper left corner of the selected region must fall on an iMCU boundary. If
  54. * this does not hold for the given crop parameters, we silently move the upper
  55. * left corner up and/or left to make it so, simultaneously increasing the
  56. * region dimensions to keep the lower right crop corner unchanged. (Thus, the
  57. * output image covers at least the requested region, but may cover more.)
  58. * The adjustment of the region dimensions may be optionally disabled.
  59. *
  60. * A complementary lossless-wipe option is provided to discard (gray out) data
  61. * inside a given image region while losslessly preserving what is outside.
  62. * Another option is lossless-drop, which replaces data at a given image
  63. * position by another image. Both source images must have the same
  64. * subsampling values. It is best if they also have the same quantization,
  65. * otherwise quantization adaption occurs. The trim option can be used with
  66. * the drop option to requantize the drop file to the source file.
  67. *
  68. * We also provide a lossless-resize option, which is kind of a lossless-crop
  69. * operation in the DCT coefficient block domain - it discards higher-order
  70. * coefficients and losslessly preserves lower-order coefficients of a
  71. * sub-block.
  72. *
  73. * Rotate/flip transform, resize, and crop can be requested together in a
  74. * single invocation. The crop is applied last --- that is, the crop region
  75. * is specified in terms of the destination image after transform/resize.
  76. *
  77. * We also offer a "force to grayscale" option, which simply discards the
  78. * chrominance channels of a YCbCr image. This is lossless in the sense that
  79. * the luminance channel is preserved exactly. It's not the same kind of
  80. * thing as the rotate/flip transformations, but it's convenient to handle it
  81. * as part of this package, mainly because the transformation routines have to
  82. * be aware of the option to know how many components to work on.
  83. */
  84. /* Short forms of external names for systems with brain-damaged linkers. */
  85. #ifdef NEED_SHORT_EXTERNAL_NAMES
  86. #define jtransform_parse_crop_spec jTrParCrop
  87. #define jtransform_request_workspace jTrRequest
  88. #define jtransform_adjust_parameters jTrAdjust
  89. #define jtransform_execute_transform jTrExec
  90. #define jtransform_perfect_transform jTrPerfect
  91. #define jcopy_markers_setup jCMrkSetup
  92. #define jcopy_markers_execute jCMrkExec
  93. #endif /* NEED_SHORT_EXTERNAL_NAMES */
  94. /*
  95. * Codes for supported types of image transformations.
  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_WIPE, /* wipe */
  107. JXFORM_DROP /* drop */
  108. } JXFORM_CODE;
  109. /*
  110. * Codes for crop parameters, which can individually be unspecified,
  111. * positive or negative for xoffset or yoffset,
  112. * positive or force or reflect for width or height.
  113. */
  114. typedef enum {
  115. JCROP_UNSET,
  116. JCROP_POS,
  117. JCROP_NEG,
  118. JCROP_FORCE,
  119. JCROP_REFLECT
  120. } JCROP_CODE;
  121. /*
  122. * Transform parameters struct.
  123. * NB: application must not change any elements of this struct after
  124. * calling jtransform_request_workspace.
  125. */
  126. typedef struct {
  127. /* Options: set by caller */
  128. JXFORM_CODE transform; /* image transform operator */
  129. boolean perfect; /* if TRUE, fail if partial MCUs are requested */
  130. boolean trim; /* if TRUE, trim partial MCUs as needed */
  131. boolean force_grayscale; /* if TRUE, convert color image to grayscale */
  132. boolean crop; /* if TRUE, crop or wipe source image, or drop */
  133. /* Crop parameters: application need not set these unless crop is TRUE.
  134. * These can be filled in by jtransform_parse_crop_spec().
  135. */
  136. JDIMENSION crop_width; /* Width of selected region */
  137. JCROP_CODE crop_width_set; /* (force disables adjustment) */
  138. JDIMENSION crop_height; /* Height of selected region */
  139. JCROP_CODE crop_height_set; /* (force disables adjustment) */
  140. JDIMENSION crop_xoffset; /* X offset of selected region */
  141. JCROP_CODE crop_xoffset_set; /* (negative measures from right edge) */
  142. JDIMENSION crop_yoffset; /* Y offset of selected region */
  143. JCROP_CODE crop_yoffset_set; /* (negative measures from bottom edge) */
  144. /* Drop parameters: set by caller for drop request */
  145. j_decompress_ptr drop_ptr;
  146. jvirt_barray_ptr * drop_coef_arrays;
  147. /* Internal workspace: caller should not touch these */
  148. int num_components; /* # of components in workspace */
  149. jvirt_barray_ptr * workspace_coef_arrays; /* workspace for transformations */
  150. JDIMENSION output_width; /* cropped destination dimensions */
  151. JDIMENSION output_height;
  152. JDIMENSION x_crop_offset; /* destination crop offsets measured in iMCUs */
  153. JDIMENSION y_crop_offset;
  154. JDIMENSION drop_width; /* drop/wipe dimensions measured in iMCUs */
  155. JDIMENSION drop_height;
  156. int iMCU_sample_width; /* destination iMCU size */
  157. int iMCU_sample_height;
  158. } jpeg_transform_info;
  159. #if TRANSFORMS_SUPPORTED
  160. /* Parse a crop specification (written in X11 geometry style) */
  161. EXTERN(boolean) jtransform_parse_crop_spec
  162. JPP((jpeg_transform_info *info, const char *spec));
  163. /* Request any required workspace */
  164. EXTERN(boolean) jtransform_request_workspace
  165. JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info));
  166. /* Adjust output image parameters */
  167. EXTERN(jvirt_barray_ptr *) jtransform_adjust_parameters
  168. JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
  169. jvirt_barray_ptr *src_coef_arrays,
  170. jpeg_transform_info *info));
  171. /* Execute the actual transformation, if any */
  172. EXTERN(void) jtransform_execute_transform
  173. JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
  174. jvirt_barray_ptr *src_coef_arrays,
  175. jpeg_transform_info *info));
  176. /* Determine whether lossless transformation is perfectly
  177. * possible for a specified image and transformation.
  178. */
  179. EXTERN(boolean) jtransform_perfect_transform
  180. JPP((JDIMENSION image_width, JDIMENSION image_height,
  181. int MCU_width, int MCU_height,
  182. JXFORM_CODE transform));
  183. /* jtransform_execute_transform used to be called
  184. * jtransform_execute_transformation, but some compilers complain about
  185. * routine names that long. This macro is here to avoid breaking any
  186. * old source code that uses the original name...
  187. */
  188. #define jtransform_execute_transformation jtransform_execute_transform
  189. #endif /* TRANSFORMS_SUPPORTED */
  190. /*
  191. * Support for copying optional markers from source to destination file.
  192. */
  193. typedef enum {
  194. JCOPYOPT_NONE, /* copy no optional markers */
  195. JCOPYOPT_COMMENTS, /* copy only comment (COM) markers */
  196. JCOPYOPT_ALL /* copy all optional markers */
  197. } JCOPY_OPTION;
  198. #define JCOPYOPT_DEFAULT JCOPYOPT_COMMENTS /* recommended default */
  199. /* Setup decompression object to save desired markers in memory */
  200. EXTERN(void) jcopy_markers_setup
  201. JPP((j_decompress_ptr srcinfo, JCOPY_OPTION option));
  202. /* Copy markers saved in the given source object to the destination object */
  203. EXTERN(void) jcopy_markers_execute
  204. JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
  205. JCOPY_OPTION option));