| 1 | /* | 
| 2 |  * jmorecfg.h | 
| 3 |  * | 
| 4 |  * This file was part of the Independent JPEG Group's software: | 
| 5 |  * Copyright (C) 1991-1997, Thomas G. Lane. | 
| 6 |  * Modified 1997-2009 by Guido Vollbeding. | 
| 7 |  * libjpeg-turbo Modifications: | 
| 8 |  * Copyright (C) 2009, 2011, 2014-2015, 2018, 2020, D. R. Commander. | 
| 9 |  * For conditions of distribution and use, see the accompanying README.ijg | 
| 10 |  * file. | 
| 11 |  * | 
| 12 |  * This file contains additional configuration options that customize the | 
| 13 |  * JPEG software for special applications or support machine-dependent | 
| 14 |  * optimizations.  Most users will not need to touch this file. | 
| 15 |  */ | 
| 16 |  | 
| 17 |  | 
| 18 | /* | 
| 19 |  * Maximum number of components (color channels) allowed in JPEG image. | 
| 20 |  * To meet the letter of Rec. ITU-T T.81 | ISO/IEC 10918-1, set this to 255. | 
| 21 |  * However, darn few applications need more than 4 channels (maybe 5 for CMYK + | 
| 22 |  * alpha mask).  We recommend 10 as a reasonable compromise; use 4 if you are | 
| 23 |  * really short on memory.  (Each allowed component costs a hundred or so | 
| 24 |  * bytes of storage, whether actually used in an image or not.) | 
| 25 |  */ | 
| 26 |  | 
| 27 | #define MAX_COMPONENTS  10      /* maximum number of image components */ | 
| 28 |  | 
| 29 |  | 
| 30 | /* | 
| 31 |  * Basic data types. | 
| 32 |  * You may need to change these if you have a machine with unusual data | 
| 33 |  * type sizes; for example, "char" not 8 bits, "short" not 16 bits, | 
| 34 |  * or "long" not 32 bits.  We don't care whether "int" is 16 or 32 bits, | 
| 35 |  * but it had better be at least 16. | 
| 36 |  */ | 
| 37 |  | 
| 38 | /* Representation of a single sample (pixel element value). | 
| 39 |  * We frequently allocate large arrays of these, so it's important to keep | 
| 40 |  * them small.  But if you have memory to burn and access to char or short | 
| 41 |  * arrays is very slow on your hardware, you might want to change these. | 
| 42 |  */ | 
| 43 |  | 
| 44 | #if BITS_IN_JSAMPLE == 8 | 
| 45 | /* JSAMPLE should be the smallest type that will hold the values 0..255. | 
| 46 |  */ | 
| 47 |  | 
| 48 | typedef unsigned char JSAMPLE; | 
| 49 | #define GETJSAMPLE(value)  ((int)(value)) | 
| 50 |  | 
| 51 | #define MAXJSAMPLE      255 | 
| 52 | #define CENTERJSAMPLE   128 | 
| 53 |  | 
| 54 | #endif /* BITS_IN_JSAMPLE == 8 */ | 
| 55 |  | 
| 56 |  | 
| 57 | #if BITS_IN_JSAMPLE == 12 | 
| 58 | /* JSAMPLE should be the smallest type that will hold the values 0..4095. | 
| 59 |  * On nearly all machines "short" will do nicely. | 
| 60 |  */ | 
| 61 |  | 
| 62 | typedef short JSAMPLE; | 
| 63 | #define GETJSAMPLE(value)  ((int)(value)) | 
| 64 |  | 
| 65 | #define MAXJSAMPLE      4095 | 
| 66 | #define CENTERJSAMPLE   2048 | 
| 67 |  | 
| 68 | #endif /* BITS_IN_JSAMPLE == 12 */ | 
| 69 |  | 
| 70 |  | 
| 71 | /* Representation of a DCT frequency coefficient. | 
| 72 |  * This should be a signed value of at least 16 bits; "short" is usually OK. | 
| 73 |  * Again, we allocate large arrays of these, but you can change to int | 
| 74 |  * if you have memory to burn and "short" is really slow. | 
| 75 |  */ | 
| 76 |  | 
| 77 | typedef short JCOEF; | 
| 78 |  | 
| 79 |  | 
| 80 | /* Compressed datastreams are represented as arrays of JOCTET. | 
| 81 |  * These must be EXACTLY 8 bits wide, at least once they are written to | 
| 82 |  * external storage.  Note that when using the stdio data source/destination | 
| 83 |  * managers, this is also the data type passed to fread/fwrite. | 
| 84 |  */ | 
| 85 |  | 
| 86 | typedef unsigned char JOCTET; | 
| 87 | #define GETJOCTET(value)  (value) | 
| 88 |  | 
| 89 |  | 
| 90 | /* These typedefs are used for various table entries and so forth. | 
| 91 |  * They must be at least as wide as specified; but making them too big | 
| 92 |  * won't cost a huge amount of memory, so we don't provide special | 
| 93 |  * extraction code like we did for JSAMPLE.  (In other words, these | 
| 94 |  * typedefs live at a different point on the speed/space tradeoff curve.) | 
| 95 |  */ | 
| 96 |  | 
| 97 | /* UINT8 must hold at least the values 0..255. */ | 
| 98 |  | 
| 99 | typedef unsigned char UINT8; | 
| 100 |  | 
| 101 | /* UINT16 must hold at least the values 0..65535. */ | 
| 102 |  | 
| 103 | #ifdef HAVE_UNSIGNED_SHORT | 
| 104 | typedef unsigned short UINT16; | 
| 105 | #else /* not HAVE_UNSIGNED_SHORT */ | 
| 106 | typedef unsigned int UINT16; | 
| 107 | #endif /* HAVE_UNSIGNED_SHORT */ | 
| 108 |  | 
| 109 | /* INT16 must hold at least the values -32768..32767. */ | 
| 110 |  | 
| 111 | #ifndef XMD_H                   /* X11/xmd.h correctly defines INT16 */ | 
| 112 | typedef short INT16; | 
| 113 | #endif | 
| 114 |  | 
| 115 | /* INT32 must hold at least signed 32-bit values. | 
| 116 |  * | 
| 117 |  * NOTE: The INT32 typedef dates back to libjpeg v5 (1994.)  Integers were | 
| 118 |  * sometimes 16-bit back then (MS-DOS), which is why INT32 is typedef'd to | 
| 119 |  * long.  It also wasn't common (or at least as common) in 1994 for INT32 to be | 
| 120 |  * defined by platform headers.  Since then, however, INT32 is defined in | 
| 121 |  * several other common places: | 
| 122 |  * | 
| 123 |  * Xmd.h (X11 header) typedefs INT32 to int on 64-bit platforms and long on | 
| 124 |  * 32-bit platforms (i.e always a 32-bit signed type.) | 
| 125 |  * | 
| 126 |  * basetsd.h (Win32 header) typedefs INT32 to int (always a 32-bit signed type | 
| 127 |  * on modern platforms.) | 
| 128 |  * | 
| 129 |  * qglobal.h (Qt header) typedefs INT32 to int (always a 32-bit signed type on | 
| 130 |  * modern platforms.) | 
| 131 |  * | 
| 132 |  * This is a recipe for conflict, since "long" and "int" aren't always | 
| 133 |  * compatible types.  Since the definition of INT32 has technically been part | 
| 134 |  * of the libjpeg API for more than 20 years, we can't remove it, but we do not | 
| 135 |  * use it internally any longer.  We instead define a separate type (JLONG) | 
| 136 |  * for internal use, which ensures that internal behavior will always be the | 
| 137 |  * same regardless of any external headers that may be included. | 
| 138 |  */ | 
| 139 |  | 
| 140 | #ifndef XMD_H                   /* X11/xmd.h correctly defines INT32 */ | 
| 141 | #ifndef _BASETSD_H_             /* Microsoft defines it in basetsd.h */ | 
| 142 | #ifndef _BASETSD_H              /* MinGW is slightly different */ | 
| 143 | #ifndef QGLOBAL_H               /* Qt defines it in qglobal.h */ | 
| 144 | typedef long INT32; | 
| 145 | #endif | 
| 146 | #endif | 
| 147 | #endif | 
| 148 | #endif | 
| 149 |  | 
| 150 | /* Datatype used for image dimensions.  The JPEG standard only supports | 
| 151 |  * images up to 64K*64K due to 16-bit fields in SOF markers.  Therefore | 
| 152 |  * "unsigned int" is sufficient on all machines.  However, if you need to | 
| 153 |  * handle larger images and you don't mind deviating from the spec, you | 
| 154 |  * can change this datatype.  (Note that changing this datatype will | 
| 155 |  * potentially require modifying the SIMD code.  The x86-64 SIMD extensions, | 
| 156 |  * in particular, assume a 32-bit JDIMENSION.) | 
| 157 |  */ | 
| 158 |  | 
| 159 | typedef unsigned int JDIMENSION; | 
| 160 |  | 
| 161 | #define JPEG_MAX_DIMENSION  65500L  /* a tad under 64K to prevent overflows */ | 
| 162 |  | 
| 163 |  | 
| 164 | /* These macros are used in all function definitions and extern declarations. | 
| 165 |  * You could modify them if you need to change function linkage conventions; | 
| 166 |  * in particular, you'll need to do that to make the library a Windows DLL. | 
| 167 |  * Another application is to make all functions global for use with debuggers | 
| 168 |  * or code profilers that require it. | 
| 169 |  */ | 
| 170 |  | 
| 171 | /* a function called through method pointers: */ | 
| 172 | #define METHODDEF(type)         static type | 
| 173 | /* a function used only in its module: */ | 
| 174 | #define LOCAL(type)             static type | 
| 175 | /* a function referenced thru EXTERNs: */ | 
| 176 | #define GLOBAL(type)            type | 
| 177 | /* a reference to a GLOBAL function: */ | 
| 178 | #define EXTERN(type)            extern type | 
| 179 |  | 
| 180 |  | 
| 181 | /* Originally, this macro was used as a way of defining function prototypes | 
| 182 |  * for both modern compilers as well as older compilers that did not support | 
| 183 |  * prototype parameters.  libjpeg-turbo has never supported these older, | 
| 184 |  * non-ANSI compilers, but the macro is still included because there is some | 
| 185 |  * software out there that uses it. | 
| 186 |  */ | 
| 187 |  | 
| 188 | #define JMETHOD(type, methodname, arglist)  type (*methodname) arglist | 
| 189 |  | 
| 190 |  | 
| 191 | /* libjpeg-turbo no longer supports platforms that have far symbols (MS-DOS), | 
| 192 |  * but again, some software relies on this macro. | 
| 193 |  */ | 
| 194 |  | 
| 195 | #undef FAR | 
| 196 | #define FAR | 
| 197 |  | 
| 198 |  | 
| 199 | /* | 
| 200 |  * On a few systems, type boolean and/or its values FALSE, TRUE may appear | 
| 201 |  * in standard header files.  Or you may have conflicts with application- | 
| 202 |  * specific header files that you want to include together with these files. | 
| 203 |  * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. | 
| 204 |  */ | 
| 205 |  | 
| 206 | #ifndef HAVE_BOOLEAN | 
| 207 | typedef int boolean; | 
| 208 | #endif | 
| 209 | #ifndef FALSE                   /* in case these macros already exist */ | 
| 210 | #define FALSE   0               /* values of boolean */ | 
| 211 | #endif | 
| 212 | #ifndef TRUE | 
| 213 | #define TRUE    1 | 
| 214 | #endif | 
| 215 |  | 
| 216 |  | 
| 217 | /* | 
| 218 |  * The remaining options affect code selection within the JPEG library, | 
| 219 |  * but they don't need to be visible to most applications using the library. | 
| 220 |  * To minimize application namespace pollution, the symbols won't be | 
| 221 |  * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. | 
| 222 |  */ | 
| 223 |  | 
| 224 | #ifdef JPEG_INTERNALS | 
| 225 | #define JPEG_INTERNAL_OPTIONS | 
| 226 | #endif | 
| 227 |  | 
| 228 | #ifdef JPEG_INTERNAL_OPTIONS | 
| 229 |  | 
| 230 |  | 
| 231 | /* | 
| 232 |  * These defines indicate whether to include various optional functions. | 
| 233 |  * Undefining some of these symbols will produce a smaller but less capable | 
| 234 |  * library.  Note that you can leave certain source files out of the | 
| 235 |  * compilation/linking process if you've #undef'd the corresponding symbols. | 
| 236 |  * (You may HAVE to do that if your compiler doesn't like null source files.) | 
| 237 |  */ | 
| 238 |  | 
| 239 | /* Capability options common to encoder and decoder: */ | 
| 240 |  | 
| 241 | #define DCT_ISLOW_SUPPORTED     /* accurate integer method */ | 
| 242 | #define DCT_IFAST_SUPPORTED     /* less accurate int method [legacy feature] */ | 
| 243 | #define DCT_FLOAT_SUPPORTED     /* floating-point method [legacy feature] */ | 
| 244 |  | 
| 245 | /* Encoder capability options: */ | 
| 246 |  | 
| 247 | #define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ | 
| 248 | #define C_PROGRESSIVE_SUPPORTED     /* Progressive JPEG? (Requires MULTISCAN)*/ | 
| 249 | #define ENTROPY_OPT_SUPPORTED       /* Optimization of entropy coding parms? */ | 
| 250 | /* Note: if you selected 12-bit data precision, it is dangerous to turn off | 
| 251 |  * ENTROPY_OPT_SUPPORTED.  The standard Huffman tables are only good for 8-bit | 
| 252 |  * precision, so jchuff.c normally uses entropy optimization to compute | 
| 253 |  * usable tables for higher precision.  If you don't want to do optimization, | 
| 254 |  * you'll have to supply different default Huffman tables. | 
| 255 |  * The exact same statements apply for progressive JPEG: the default tables | 
| 256 |  * don't work for progressive mode.  (This may get fixed, however.) | 
| 257 |  */ | 
| 258 | #define INPUT_SMOOTHING_SUPPORTED   /* Input image smoothing option? */ | 
| 259 |  | 
| 260 | /* Decoder capability options: */ | 
| 261 |  | 
| 262 | #define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ | 
| 263 | #define D_PROGRESSIVE_SUPPORTED     /* Progressive JPEG? (Requires MULTISCAN)*/ | 
| 264 | #define SAVE_MARKERS_SUPPORTED      /* jpeg_save_markers() needed? */ | 
| 265 | #define BLOCK_SMOOTHING_SUPPORTED   /* Block smoothing? (Progressive only) */ | 
| 266 | #define IDCT_SCALING_SUPPORTED      /* Output rescaling via IDCT? */ | 
| 267 | #undef  UPSAMPLE_SCALING_SUPPORTED  /* Output rescaling at upsample stage? */ | 
| 268 | #define UPSAMPLE_MERGING_SUPPORTED  /* Fast path for sloppy upsampling? */ | 
| 269 | #define QUANT_1PASS_SUPPORTED       /* 1-pass color quantization? */ | 
| 270 | #define QUANT_2PASS_SUPPORTED       /* 2-pass color quantization? */ | 
| 271 |  | 
| 272 | /* more capability options later, no doubt */ | 
| 273 |  | 
| 274 |  | 
| 275 | /* | 
| 276 |  * The RGB_RED, RGB_GREEN, RGB_BLUE, and RGB_PIXELSIZE macros are a vestigial | 
| 277 |  * feature of libjpeg.  The idea was that, if an application developer needed | 
| 278 |  * to compress from/decompress to a BGR/BGRX/RGBX/XBGR/XRGB buffer, they could | 
| 279 |  * change these macros, rebuild libjpeg, and link their application statically | 
| 280 |  * with it.  In reality, few people ever did this, because there were some | 
| 281 |  * severe restrictions involved (cjpeg and djpeg no longer worked properly, | 
| 282 |  * compressing/decompressing RGB JPEGs no longer worked properly, and the color | 
| 283 |  * quantizer wouldn't work with pixel sizes other than 3.)  Furthermore, since | 
| 284 |  * all of the O/S-supplied versions of libjpeg were built with the default | 
| 285 |  * values of RGB_RED, RGB_GREEN, RGB_BLUE, and RGB_PIXELSIZE, many applications | 
| 286 |  * have come to regard these values as immutable. | 
| 287 |  * | 
| 288 |  * The libjpeg-turbo colorspace extensions provide a much cleaner way of | 
| 289 |  * compressing from/decompressing to buffers with arbitrary component orders | 
| 290 |  * and pixel sizes.  Thus, we do not support changing the values of RGB_RED, | 
| 291 |  * RGB_GREEN, RGB_BLUE, or RGB_PIXELSIZE.  In addition to the restrictions | 
| 292 |  * listed above, changing these values will also break the SIMD extensions and | 
| 293 |  * the regression tests. | 
| 294 |  */ | 
| 295 |  | 
| 296 | #define RGB_RED         0       /* Offset of Red in an RGB scanline element */ | 
| 297 | #define RGB_GREEN       1       /* Offset of Green */ | 
| 298 | #define RGB_BLUE        2       /* Offset of Blue */ | 
| 299 | #define RGB_PIXELSIZE   3       /* JSAMPLEs per RGB scanline element */ | 
| 300 |  | 
| 301 | #define JPEG_NUMCS  17 | 
| 302 |  | 
| 303 | #define EXT_RGB_RED         0 | 
| 304 | #define EXT_RGB_GREEN       1 | 
| 305 | #define EXT_RGB_BLUE        2 | 
| 306 | #define EXT_RGB_PIXELSIZE   3 | 
| 307 |  | 
| 308 | #define EXT_RGBX_RED        0 | 
| 309 | #define EXT_RGBX_GREEN      1 | 
| 310 | #define EXT_RGBX_BLUE       2 | 
| 311 | #define EXT_RGBX_PIXELSIZE  4 | 
| 312 |  | 
| 313 | #define EXT_BGR_RED         2 | 
| 314 | #define EXT_BGR_GREEN       1 | 
| 315 | #define EXT_BGR_BLUE        0 | 
| 316 | #define EXT_BGR_PIXELSIZE   3 | 
| 317 |  | 
| 318 | #define EXT_BGRX_RED        2 | 
| 319 | #define EXT_BGRX_GREEN      1 | 
| 320 | #define EXT_BGRX_BLUE       0 | 
| 321 | #define EXT_BGRX_PIXELSIZE  4 | 
| 322 |  | 
| 323 | #define EXT_XBGR_RED        3 | 
| 324 | #define EXT_XBGR_GREEN      2 | 
| 325 | #define EXT_XBGR_BLUE       1 | 
| 326 | #define EXT_XBGR_PIXELSIZE  4 | 
| 327 |  | 
| 328 | #define EXT_XRGB_RED        1 | 
| 329 | #define EXT_XRGB_GREEN      2 | 
| 330 | #define EXT_XRGB_BLUE       3 | 
| 331 | #define EXT_XRGB_PIXELSIZE  4 | 
| 332 |  | 
| 333 | static const int rgb_red[JPEG_NUMCS] = { | 
| 334 |   -1, -1, RGB_RED, -1, -1, -1, EXT_RGB_RED, EXT_RGBX_RED, | 
| 335 |   EXT_BGR_RED, EXT_BGRX_RED, EXT_XBGR_RED, EXT_XRGB_RED, | 
| 336 |   EXT_RGBX_RED, EXT_BGRX_RED, EXT_XBGR_RED, EXT_XRGB_RED, | 
| 337 |   -1 | 
| 338 | }; | 
| 339 |  | 
| 340 | static const int rgb_green[JPEG_NUMCS] = { | 
| 341 |   -1, -1, RGB_GREEN, -1, -1, -1, EXT_RGB_GREEN, EXT_RGBX_GREEN, | 
| 342 |   EXT_BGR_GREEN, EXT_BGRX_GREEN, EXT_XBGR_GREEN, EXT_XRGB_GREEN, | 
| 343 |   EXT_RGBX_GREEN, EXT_BGRX_GREEN, EXT_XBGR_GREEN, EXT_XRGB_GREEN, | 
| 344 |   -1 | 
| 345 | }; | 
| 346 |  | 
| 347 | static const int rgb_blue[JPEG_NUMCS] = { | 
| 348 |   -1, -1, RGB_BLUE, -1, -1, -1, EXT_RGB_BLUE, EXT_RGBX_BLUE, | 
| 349 |   EXT_BGR_BLUE, EXT_BGRX_BLUE, EXT_XBGR_BLUE, EXT_XRGB_BLUE, | 
| 350 |   EXT_RGBX_BLUE, EXT_BGRX_BLUE, EXT_XBGR_BLUE, EXT_XRGB_BLUE, | 
| 351 |   -1 | 
| 352 | }; | 
| 353 |  | 
| 354 | static const int rgb_pixelsize[JPEG_NUMCS] = { | 
| 355 |   -1, -1, RGB_PIXELSIZE, -1, -1, -1, EXT_RGB_PIXELSIZE, EXT_RGBX_PIXELSIZE, | 
| 356 |   EXT_BGR_PIXELSIZE, EXT_BGRX_PIXELSIZE, EXT_XBGR_PIXELSIZE, EXT_XRGB_PIXELSIZE, | 
| 357 |   EXT_RGBX_PIXELSIZE, EXT_BGRX_PIXELSIZE, EXT_XBGR_PIXELSIZE, EXT_XRGB_PIXELSIZE, | 
| 358 |   -1 | 
| 359 | }; | 
| 360 |  | 
| 361 | /* Definitions for speed-related optimizations. */ | 
| 362 |  | 
| 363 | /* On some machines (notably 68000 series) "int" is 32 bits, but multiplying | 
| 364 |  * two 16-bit shorts is faster than multiplying two ints.  Define MULTIPLIER | 
| 365 |  * as short on such a machine.  MULTIPLIER must be at least 16 bits wide. | 
| 366 |  */ | 
| 367 |  | 
| 368 | #ifndef MULTIPLIER | 
| 369 | #ifndef WITH_SIMD | 
| 370 | #define MULTIPLIER  int         /* type for fastest integer multiply */ | 
| 371 | #else | 
| 372 | #define MULTIPLIER  short       /* prefer 16-bit with SIMD for parellelism */ | 
| 373 | #endif | 
| 374 | #endif | 
| 375 |  | 
| 376 |  | 
| 377 | /* FAST_FLOAT should be either float or double, whichever is done faster | 
| 378 |  * by your compiler.  (Note that this type is only used in the floating point | 
| 379 |  * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) | 
| 380 |  */ | 
| 381 |  | 
| 382 | #ifndef FAST_FLOAT | 
| 383 | #define FAST_FLOAT  float | 
| 384 | #endif | 
| 385 |  | 
| 386 | #endif /* JPEG_INTERNAL_OPTIONS */ | 
| 387 |  |