# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: address@hidden # target_branch: http://bzr.savannah.gnu.org/r/pdf/libgnupdf/branches\ # /trunk/ # testament_sha1: ed00cb2617d1e88a5dd39df7539d8409fa3ffc5f # timestamp: 2008-12-22 23:30:55 +0800 # base_revision_id: address@hidden # # Begin patch === modified file 'configure.ac' --- configure.ac 2008-12-01 23:55:12 +0000 +++ configure.ac 2008-12-14 05:27:04 +0000 @@ -51,6 +51,15 @@ AM_CONDITIONAL([ZLIB], [test "x$have_zlib" = "xyes"]) AC_CHECK_LIB(m,exp,,,) +have_jpeglib=no +AC_CHECK_LIB([jpeg],[jpeg_std_error],[have_jpeglib=yes],,) + +if test "x$have_jpeglib" = "xyes"; then + LIBS="-ljpeg $LIBS" + AC_DEFINE([HAVE_JPEGLIB], [1], [The jpeglib library is available]) +fi +AM_CONDITIONAL([JPEGLIB], [test "x$have_jpeglib" = "xyes"]) + have_jbig2dec=no AC_CHECK_LIB([jbig2dec],[jbig2_ctx_new],[have_jbig2dec=yes],,) @@ -297,6 +306,7 @@ Compilation level: ${PDFLIB_LEVEL} (${PDFLIB_LEVEL_DESCR}) Using FlateDecode filter? ${have_zlib} Using JBIG2 decoder filter? ${have_jbig2dec} + Using JPEG filter? ${have_jpeglib} With unit tests support? ${ut_support} ${ut_framework} Program to build html manuals ${texihtmlprogram} Build project management resources? ${prmgt_mode} === added file 'lib/jconfig.h' --- lib/jconfig.h 1970-01-01 00:00:00 +0000 +++ lib/jconfig.h 2008-12-18 13:52:38 +0000 @@ -0,0 +1,45 @@ +/* jconfig.h. Generated automatically by configure. */ +/* jconfig.cfg --- source file edited by configure script */ +/* see jconfig.doc for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +#undef void +#undef const +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +/* Define this if you get warnings about undefined structures. */ +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED +#define INLINE __inline__ +/* These are for configuring the JPEG memory manager. */ +#undef DEFAULT_MAX_MEM +#undef NO_MKTEMP + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#undef TWO_FILE_COMMANDLINE +#undef NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE + +/* Define this if you want percent-done progress reports from cjpeg/djpeg. */ +#undef PROGRESS_REPORT + +#endif /* JPEG_CJPEG_DJPEG */ === added file 'lib/jmorecfg.h' --- lib/jmorecfg.h 1970-01-01 00:00:00 +0000 +++ lib/jmorecfg.h 2008-12-18 13:52:38 +0000 @@ -0,0 +1,363 @@ +/* + * jmorecfg.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains additional configuration options that customize the + * JPEG software for special applications or support machine-dependent + * optimizations. Most users will not need to touch this file. + */ + + +/* + * Define BITS_IN_JSAMPLE as either + * 8 for 8-bit sample values (the usual setting) + * 12 for 12-bit sample values + * Only 8 and 12 are legal data precisions for lossy JPEG according to the + * JPEG standard, and the IJG code does not support anything else! + * We do not support run-time selection of data precision, sorry. + */ + +#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ + + +/* + * Maximum number of components (color channels) allowed in JPEG image. + * To meet the letter of the JPEG spec, set this to 255. However, darn + * few applications need more than 4 channels (maybe 5 for CMYK + alpha + * mask). We recommend 10 as a reasonable compromise; use 4 if you are + * really short on memory. (Each allowed component costs a hundred or so + * bytes of storage, whether actually used in an image or not.) + */ + +#define MAX_COMPONENTS 10 /* maximum number of image components */ + + +/* + * Basic data types. + * You may need to change these if you have a machine with unusual data + * type sizes; for example, "char" not 8 bits, "short" not 16 bits, + * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, + * but it had better be at least 16. + */ + +/* Representation of a single sample (pixel element value). + * We frequently allocate large arrays of these, so it's important to keep + * them small. But if you have memory to burn and access to char or short + * arrays is very slow on your hardware, you might want to change these. + */ + +#if BITS_IN_JSAMPLE == 8 +/* JSAMPLE should be the smallest type that will hold the values 0..255. + * You can use a signed char by having GETJSAMPLE mask it with 0xFF. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JSAMPLE; +#ifdef CHAR_IS_UNSIGNED +#define GETJSAMPLE(value) ((int) (value)) +#else +#define GETJSAMPLE(value) ((int) (value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + +#define MAXJSAMPLE 255 +#define CENTERJSAMPLE 128 + +#endif /* BITS_IN_JSAMPLE == 8 */ + + +#if BITS_IN_JSAMPLE == 12 +/* JSAMPLE should be the smallest type that will hold the values 0..4095. + * On nearly all machines "short" will do nicely. + */ + +typedef short JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#define MAXJSAMPLE 4095 +#define CENTERJSAMPLE 2048 + +#endif /* BITS_IN_JSAMPLE == 12 */ + + +/* Representation of a DCT frequency coefficient. + * This should be a signed value of at least 16 bits; "short" is usually OK. + * Again, we allocate large arrays of these, but you can change to int + * if you have memory to burn and "short" is really slow. + */ + +typedef short JCOEF; + + +/* Compressed datastreams are represented as arrays of JOCTET. + * These must be EXACTLY 8 bits wide, at least once they are written to + * external storage. Note that when using the stdio data source/destination + * managers, this is also the data type passed to fread/fwrite. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JOCTET; +#define GETJOCTET(value) (value) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JOCTET; +#ifdef CHAR_IS_UNSIGNED +#define GETJOCTET(value) (value) +#else +#define GETJOCTET(value) ((value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + + +/* These typedefs are used for various table entries and so forth. + * They must be at least as wide as specified; but making them too big + * won't cost a huge amount of memory, so we don't provide special + * extraction code like we did for JSAMPLE. (In other words, these + * typedefs live at a different point on the speed/space tradeoff curve.) + */ + +/* UINT8 must hold at least the values 0..255. */ + +#ifdef HAVE_UNSIGNED_CHAR +typedef unsigned char UINT8; +#else /* not HAVE_UNSIGNED_CHAR */ +#ifdef CHAR_IS_UNSIGNED +typedef char UINT8; +#else /* not CHAR_IS_UNSIGNED */ +typedef short UINT8; +#endif /* CHAR_IS_UNSIGNED */ +#endif /* HAVE_UNSIGNED_CHAR */ + +/* UINT16 must hold at least the values 0..65535. */ + +#ifdef HAVE_UNSIGNED_SHORT +typedef unsigned short UINT16; +#else /* not HAVE_UNSIGNED_SHORT */ +typedef unsigned int UINT16; +#endif /* HAVE_UNSIGNED_SHORT */ + +/* INT16 must hold at least the values -32768..32767. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ +typedef short INT16; +#endif + +/* INT32 must hold at least signed 32-bit values. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ +typedef long INT32; +#endif + +/* Datatype used for image dimensions. The JPEG standard only supports + * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore + * "unsigned int" is sufficient on all machines. However, if you need to + * handle larger images and you don't mind deviating from the spec, you + * can change this datatype. + */ + +typedef unsigned int JDIMENSION; + +#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ + + +/* These macros are used in all function definitions and extern declarations. + * You could modify them if you need to change function linkage conventions; + * in particular, you'll need to do that to make the library a Windows DLL. + * Another application is to make all functions global for use with debuggers + * or code profilers that require it. + */ + +/* a function called through method pointers: */ +#define METHODDEF(type) static type +/* a function used only in its module: */ +#define LOCAL(type) static type +/* a function referenced thru EXTERNs: */ +#define GLOBAL(type) type +/* a reference to a GLOBAL function: */ +#define EXTERN(type) extern type + + +/* This macro is used to declare a "method", that is, a function pointer. + * We want to supply prototype parameters if the compiler can cope. + * Note that the arglist parameter must be parenthesized! + * Again, you can customize this if you need special linkage keywords. + */ + +#ifdef HAVE_PROTOTYPES +#define JMETHOD(type,methodname,arglist) type (*methodname) arglist +#else +#define JMETHOD(type,methodname,arglist) type (*methodname) () +#endif + + +/* Here is the pseudo-keyword for declaring pointers that must be "far" + * on 80x86 machines. Most of the specialized coding for 80x86 is handled + * by just saying "FAR *" where such a pointer is needed. In a few places + * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. + */ + +#ifdef NEED_FAR_POINTERS +#define FAR far +#else +#define FAR +#endif + + +/* + * On a few systems, type boolean and/or its values FALSE, TRUE may appear + * in standard header files. Or you may have conflicts with application- + * specific header files that you want to include together with these files. + * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. + */ + +#ifndef HAVE_BOOLEAN +typedef int boolean; +#endif +#ifndef FALSE /* in case these macros already exist */ +#define FALSE 0 /* values of boolean */ +#endif +#ifndef TRUE +#define TRUE 1 +#endif + + +/* + * The remaining options affect code selection within the JPEG library, + * but they don't need to be visible to most applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. + */ + +#ifdef JPEG_INTERNALS +#define JPEG_INTERNAL_OPTIONS +#endif + +#ifdef JPEG_INTERNAL_OPTIONS + + +/* + * These defines indicate whether to include various optional functions. + * Undefining some of these symbols will produce a smaller but less capable + * library. Note that you can leave certain source files out of the + * compilation/linking process if you've #undef'd the corresponding symbols. + * (You may HAVE to do that if your compiler doesn't like null source files.) + */ + +/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */ + +/* Capability options common to encoder and decoder: */ + +#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ +#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ +#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ + +/* Encoder capability options: */ + +#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ +/* Note: if you selected 12-bit data precision, it is dangerous to turn off + * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit + * precision, so jchuff.c normally uses entropy optimization to compute + * usable tables for higher precision. If you don't want to do optimization, + * you'll have to supply different default Huffman tables. + * The exact same statements apply for progressive JPEG: the default tables + * don't work for progressive mode. (This may get fixed, however.) + */ +#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ + +/* Decoder capability options: */ + +#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ +#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ +#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ +#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ +#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ +#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ +#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ + +/* more capability options later, no doubt */ + + +/* + * Ordering of RGB data in scanlines passed to or from the application. + * If your application wants to deal with data in the order B,G,R, just + * change these macros. You can also deal with formats such as R,G,B,X + * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing + * the offsets will also change the order in which colormap data is organized. + * RESTRICTIONS: + * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. + * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not + * useful if you are using JPEG color spaces other than YCbCr or grayscale. + * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE + * is not 3 (they don't understand about dummy color components!). So you + * can't use color quantization if you change that value. + */ + +#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ +#define RGB_GREEN 1 /* Offset of Green */ +#define RGB_BLUE 2 /* Offset of Blue */ +#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ + + +/* Definitions for speed-related optimizations. */ + + +/* If your compiler supports inline functions, define INLINE + * as the inline keyword; otherwise define it as empty. + */ + +#ifndef INLINE +#ifdef __GNUC__ /* for instance, GNU C knows about inline */ +#define INLINE __inline__ +#endif +#ifndef INLINE +#define INLINE /* default is to define it as empty */ +#endif +#endif + + +/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying + * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER + * as short on such a machine. MULTIPLIER must be at least 16 bits wide. + */ + +#ifndef MULTIPLIER +#define MULTIPLIER int /* type for fastest integer multiply */ +#endif + + +/* FAST_FLOAT should be either float or double, whichever is done faster + * by your compiler. (Note that this type is only used in the floating point + * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) + * Typically, float is faster in ANSI C compilers, while double is faster in + * pre-ANSI compilers (because they insist on converting to double anyway). + * The code below therefore chooses float if we have ANSI-style prototypes. + */ + +#ifndef FAST_FLOAT +#ifdef HAVE_PROTOTYPES +#define FAST_FLOAT float +#else +#define FAST_FLOAT double +#endif +#endif + +#endif /* JPEG_INTERNAL_OPTIONS */ === added file 'lib/jpeglib.h' --- lib/jpeglib.h 1970-01-01 00:00:00 +0000 +++ lib/jpeglib.h 2008-12-18 13:52:38 +0000 @@ -0,0 +1,1096 @@ +/* + * jpeglib.h + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the application interface for the JPEG library. + * Most applications using the library need only include this file, + * and perhaps jerror.h if they want to know the exact error codes. + */ + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +/* + * First we include the configuration files that record how this + * installation of the JPEG library is set up. jconfig.h can be + * generated automatically for many systems. jmorecfg.h contains + * manual configuration options that most people need not worry about. + */ + +#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ +#include "jconfig.h" /* widely used configuration options */ +#endif +#include "jmorecfg.h" /* seldom changed options */ + + +/* Version ID for the JPEG library. + * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60". + */ + +#define JPEG_LIB_VERSION 62 /* Version 6b */ + + +/* Various constants determining the sizes of things. + * All of these are specified by the JPEG standard, so don't change them + * if you want to be compatible. + */ + +#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ +#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ +#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ +#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ +#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ +#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ +#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ +/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; + * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. + * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU + * to handle it. We even let you do this from the jconfig.h file. However, + * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe + * sometimes emits noncompliant files doesn't mean you should too. + */ +#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ +#ifndef D_MAX_BLOCKS_IN_MCU +#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ +#endif + + +/* Data structures for images (arrays of samples and of DCT coefficients). + * On 80x86 machines, the image arrays are too big for near pointers, + * but the pointer arrays can fit in near memory. + */ + +typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ +typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ +typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ + +typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ +typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ +typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ +typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ + +typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ + + +/* Types for JPEG compression parameters and working tables. */ + + +/* DCT coefficient quantization tables. */ + +typedef struct { + /* This array gives the coefficient quantizers in natural array order + * (not the zigzag order in which they are stored in a JPEG DQT marker). + * CAUTION: IJG versions prior to v6a kept this array in zigzag order. + */ + UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JQUANT_TBL; + + +/* Huffman coding tables. */ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ + /* length k bits; bits[0] is unused */ + UINT8 huffval[256]; /* The symbols, in order of incr code length */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JHUFF_TBL; + + +/* Basic info about one component (color channel). */ + +typedef struct { + /* These values are fixed over the whole image. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOF marker. */ + int component_id; /* identifier for this component (0..255) */ + int component_index; /* its index in SOF or cinfo->comp_info[] */ + int h_samp_factor; /* horizontal sampling factor (1..4) */ + int v_samp_factor; /* vertical sampling factor (1..4) */ + int quant_tbl_no; /* quantization table selector (0..3) */ + /* These values may vary between scans. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOS marker. */ + /* The decompressor output side may not use these variables. */ + int dc_tbl_no; /* DC entropy table selector (0..3) */ + int ac_tbl_no; /* AC entropy table selector (0..3) */ + + /* Remaining fields should be treated as private by applications. */ + + /* These values are computed during compression or decompression startup: */ + /* Component's size in DCT blocks. + * Any dummy blocks added to complete an MCU are not counted; therefore + * these values do not depend on whether a scan is interleaved or not. + */ + JDIMENSION width_in_blocks; + JDIMENSION height_in_blocks; + /* Size of a DCT block in samples. Always DCTSIZE for compression. + * For decompression this is the size of the output from one DCT block, + * reflecting any scaling we choose to apply during the IDCT step. + * Values of 1,2,4,8 are likely to be supported. Note that different + * components may receive different IDCT scalings. + */ + int DCT_scaled_size; + /* The downsampled dimensions are the component's actual, unpadded number + * of samples at the main buffer (preprocessing/compression interface), thus + * downsampled_width = ceil(image_width * Hi/Hmax) + * and similarly for height. For decompression, IDCT scaling is included, so + * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE) + */ + JDIMENSION downsampled_width; /* actual width in samples */ + JDIMENSION downsampled_height; /* actual height in samples */ + /* This flag is used only for decompression. In cases where some of the + * components will be ignored (eg grayscale output from YCbCr image), + * we can skip most computations for the unused components. + */ + boolean component_needed; /* do we need the value of this component? */ + + /* These values are computed before starting a scan of the component. */ + /* The decompressor output side may not use these variables. */ + int MCU_width; /* number of blocks per MCU, horizontally */ + int MCU_height; /* number of blocks per MCU, vertically */ + int MCU_blocks; /* MCU_width * MCU_height */ + int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */ + int last_col_width; /* # of non-dummy blocks across in last MCU */ + int last_row_height; /* # of non-dummy blocks down in last MCU */ + + /* Saved quantization table for component; NULL if none yet saved. + * See jdinput.c comments about the need for this information. + * This field is currently used only for decompression. + */ + JQUANT_TBL * quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void * dct_table; +} jpeg_component_info; + + +/* The script for encoding a multiple-scan file is an array of these: */ + +typedef struct { + int comps_in_scan; /* number of components encoded in this scan */ + int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ + int Ss, Se; /* progressive JPEG spectral selection parms */ + int Ah, Al; /* progressive JPEG successive approx. parms */ +} jpeg_scan_info; + +/* The decompressor can save APPn and COM markers in a list of these: */ + +typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; + +struct jpeg_marker_struct { + jpeg_saved_marker_ptr next; /* next in list, or NULL */ + UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ + unsigned int original_length; /* # bytes of data in the file */ + unsigned int data_length; /* # bytes of data saved at data[] */ + JOCTET FAR * data; /* the data contained in the marker */ + /* the marker length word is not counted in data_length or original_length */ +}; + +/* Known color spaces. */ + +typedef enum { + JCS_UNKNOWN, /* error/unspecified */ + JCS_GRAYSCALE, /* monochrome */ + JCS_RGB, /* red/green/blue */ + JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ + JCS_CMYK, /* C/M/Y/K */ + JCS_YCCK /* Y/Cb/Cr/K */ +} J_COLOR_SPACE; + +/* DCT/IDCT algorithm options. */ + +typedef enum { + JDCT_ISLOW, /* slow but accurate integer algorithm */ + JDCT_IFAST, /* faster, less accurate integer method */ + JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ +} J_DCT_METHOD; + +#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ +#define JDCT_DEFAULT JDCT_ISLOW +#endif +#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ +#define JDCT_FASTEST JDCT_IFAST +#endif + +/* Dithering options for decompression. */ + +typedef enum { + JDITHER_NONE, /* no dithering */ + JDITHER_ORDERED, /* simple ordered dither */ + JDITHER_FS /* Floyd-Steinberg error diffusion dither */ +} J_DITHER_MODE; + + +/* Common fields between JPEG compression and decompression master structs. */ + +#define jpeg_common_fields \ + struct jpeg_error_mgr * err; /* Error handler module */\ + struct jpeg_memory_mgr * mem; /* Memory manager module */\ + struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ + void * client_data; /* Available for use by application */\ + boolean is_decompressor; /* So common code can tell which is which */\ + int global_state /* For checking call sequence validity */ + +/* Routines that are to be used by both halves of the library are declared + * to receive a pointer to this structure. There are no actual instances of + * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. + */ +struct jpeg_common_struct { + jpeg_common_fields; /* Fields common to both master struct types */ + /* Additional fields follow in an actual jpeg_compress_struct or + * jpeg_decompress_struct. All three structs must agree on these + * initial fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct jpeg_common_struct * j_common_ptr; +typedef struct jpeg_compress_struct * j_compress_ptr; +typedef struct jpeg_decompress_struct * j_decompress_ptr; + + +/* Master record for a compression instance */ + +struct jpeg_compress_struct { + jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ + + /* Destination for compressed data */ + struct jpeg_destination_mgr * dest; + + /* Description of source image --- these fields must be filled in by + * outer application before starting compression. in_color_space must + * be correct before you can even call jpeg_set_defaults(). + */ + + JDIMENSION image_width; /* input image width */ + JDIMENSION image_height; /* input image height */ + int input_components; /* # of color components in input image */ + J_COLOR_SPACE in_color_space; /* colorspace of input image */ + + double input_gamma; /* image gamma of input image */ + + /* Compression parameters --- these fields must be set before calling + * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + * initialize everything to reasonable defaults, then changing anything + * the application specifically wants to change. That way you won't get + * burnt when new parameters are added. Also note that there are several + * helper routines to simplify changing parameters. + */ + + int data_precision; /* bits of precision in image data */ + + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + int num_scans; /* # of entries in scan_info array */ + const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ + /* The default value of scan_info is NULL, which causes a single-scan + * sequential JPEG file to be emitted. To create a multi-scan file, + * set num_scans and scan_info to point to an array of scan definitions. + */ + + boolean raw_data_in; /* TRUE=caller supplies downsampled data */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + int smoothing_factor; /* 1..100, or 0 for no input smoothing */ + J_DCT_METHOD dct_method; /* DCT algorithm selector */ + + /* The restart interval can be specified in absolute MCUs by setting + * restart_interval, or in MCU rows by setting restart_in_rows + * (in which case the correct restart_interval will be figured + * for each scan). + */ + unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ + int restart_in_rows; /* if > 0, MCU rows per restart interval */ + + /* Parameters controlling emission of special markers. */ + + boolean write_JFIF_header; /* should a JFIF marker be written? */ + UINT8 JFIF_major_version; /* What to write for the JFIF version number */ + UINT8 JFIF_minor_version; + /* These three values are not used by the JPEG code, merely copied */ + /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ + /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ + /* ratio is defined by X_density/Y_density even when density_unit=0. */ + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean write_Adobe_marker; /* should an Adobe marker be written? */ + + /* State variable: index of next scanline to be written to + * jpeg_write_scanlines(). Application may use this to control its + * processing loop, e.g., "while (next_scanline < image_height)". + */ + + JDIMENSION next_scanline; /* 0 .. image_height-1 */ + + /* Remaining fields are known throughout compressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during compression startup + */ + boolean progressive_mode; /* TRUE if scan script uses progressive mode */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ + /* The coefficient controller receives data in units of MCU rows as defined + * for fully interleaved scans (whether the JPEG file is interleaved or not). + * There are v_samp_factor * DCTSIZE sample rows of each component in an + * "iMCU" (interleaved MCU) row. + */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[C_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* + * Links to compression subobjects (methods and private variables of modules) + */ + struct jpeg_comp_master * master; + struct jpeg_c_main_controller * main; + struct jpeg_c_prep_controller * prep; + struct jpeg_c_coef_controller * coef; + struct jpeg_marker_writer * marker; + struct jpeg_color_converter * cconvert; + struct jpeg_downsampler * downsample; + struct jpeg_forward_dct * fdct; + struct jpeg_entropy_encoder * entropy; + jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ + int script_space_size; +}; + + +/* Master record for a decompression instance */ + +struct jpeg_decompress_struct { + jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ + + /* Source of compressed data */ + struct jpeg_source_mgr * src; + + /* Basic description of image --- filled in by jpeg_read_header(). */ + /* Application may inspect these values to decide how to process image. */ + + JDIMENSION image_width; /* nominal image width (from SOF marker) */ + JDIMENSION image_height; /* nominal image height */ + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + /* Decompression processing parameters --- these fields must be set before + * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes + * them to default values. + */ + + J_COLOR_SPACE out_color_space; /* colorspace for output */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + double output_gamma; /* image gamma wanted in output */ + + boolean buffered_image; /* TRUE=multiple output passes */ + boolean raw_data_out; /* TRUE=downsampled data wanted */ + + J_DCT_METHOD dct_method; /* IDCT algorithm selector */ + boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ + boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ + + boolean quantize_colors; /* TRUE=colormapped output wanted */ + /* the following are ignored if not quantize_colors: */ + J_DITHER_MODE dither_mode; /* type of color dithering to use */ + boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ + int desired_number_of_colors; /* max # colors to use in created colormap */ + /* these are significant only in buffered-image mode: */ + boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ + boolean enable_external_quant;/* enable future use of external colormap */ + boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ + + /* Description of actual output image that will be returned to application. + * These fields are computed by jpeg_start_decompress(). + * You can also use jpeg_calc_output_dimensions() to determine these values + * in advance of calling jpeg_start_decompress(). + */ + + JDIMENSION output_width; /* scaled image width */ + JDIMENSION output_height; /* scaled image height */ + int out_color_components; /* # of color components in out_color_space */ + int output_components; /* # of color components returned */ + /* output_components is 1 (a colormap index) when quantizing colors; + * otherwise it equals out_color_components. + */ + int rec_outbuf_height; /* min recommended height of scanline buffer */ + /* If the buffer passed to jpeg_read_scanlines() is less than this many rows + * high, space and time will be wasted due to unnecessary data copying. + * Usually rec_outbuf_height will be 1 or 2, at most 4. + */ + + /* When quantizing colors, the output colormap is described by these fields. + * The application can supply a colormap by setting colormap non-NULL before + * calling jpeg_start_decompress; otherwise a colormap is created during + * jpeg_start_decompress or jpeg_start_output. + * The map has out_color_components rows and actual_number_of_colors columns. + */ + int actual_number_of_colors; /* number of entries in use */ + JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ + + /* State variables: these variables indicate the progress of decompression. + * The application may examine these but must not modify them. + */ + + /* Row index of next scanline to be read from jpeg_read_scanlines(). + * Application may use this to control its processing loop, e.g., + * "while (output_scanline < output_height)". + */ + JDIMENSION output_scanline; /* 0 .. output_height-1 */ + + /* Current input scan number and number of iMCU rows completed in scan. + * These indicate the progress of the decompressor input side. + */ + int input_scan_number; /* Number of SOS markers seen so far */ + JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ + + /* The "output scan number" is the notional scan being displayed by the + * output side. The decompressor will not allow output scan/row number + * to get ahead of input scan/row, but it can fall arbitrarily far behind. + */ + int output_scan_number; /* Nominal scan number being displayed */ + JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ + + /* Current progression status. coef_bits[c][i] indicates the precision + * with which component c's DCT coefficient i (in zigzag order) is known. + * It is -1 when no data has yet been received, otherwise it is the point + * transform (shift) value for the most recent scan of the coefficient + * (thus, 0 at completion of the progression). + * This pointer is NULL when reading a non-progressive file. + */ + int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ + + /* Internal JPEG parameters --- the application usually need not look at + * these fields. Note that the decompressor output side may not use + * any parameters that can change between scans. + */ + + /* Quantization and Huffman tables are carried forward across input + * datastreams when processing abbreviated JPEG datastreams. + */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + /* These parameters are never carried across datastreams, since they + * are given in SOF/SOS markers or defined to be reset by SOI. + */ + + int data_precision; /* bits of precision in image data */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ + + /* These fields record data obtained from optional markers recognized by + * the JPEG library. + */ + boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ + /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ + UINT8 JFIF_major_version; /* JFIF version number */ + UINT8 JFIF_minor_version; + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ + UINT8 Adobe_transform; /* Color transform code from Adobe marker */ + + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + + /* Aside from the specific data retained from APPn markers known to the + * library, the uninterpreted contents of any or all APPn and COM markers + * can be saved in a list for examination by the application. + */ + jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ + + /* Remaining fields are known throughout decompressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during decompression startup + */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ + /* The coefficient controller's input and output progress is measured in + * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows + * in fully interleaved JPEG scans, but are used whether the scan is + * interleaved or not. We define an iMCU row as v_samp_factor DCT block + * rows of each component. Therefore, the IDCT output contains + * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row. + */ + + JSAMPLE * sample_range_limit; /* table for fast range-limiting */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + * Note that the decompressor output side must not use these fields. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[D_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* This field is shared between entropy decoder and marker parser. + * It is either zero or the code of a JPEG marker that has been + * read from the data source, but has not yet been processed. + */ + int unread_marker; + + /* + * Links to decompression subobjects (methods, private variables of modules) + */ + struct jpeg_decomp_master * master; + struct jpeg_d_main_controller * main; + struct jpeg_d_coef_controller * coef; + struct jpeg_d_post_controller * post; + struct jpeg_input_controller * inputctl; + struct jpeg_marker_reader * marker; + struct jpeg_entropy_decoder * entropy; + struct jpeg_inverse_dct * idct; + struct jpeg_upsampler * upsample; + struct jpeg_color_deconverter * cconvert; + struct jpeg_color_quantizer * cquantize; +}; + + +/* "Object" declarations for JPEG modules that may be supplied or called + * directly by the surrounding application. + * As with all objects in the JPEG library, these structs only define the + * publicly visible methods and state variables of a module. Additional + * private fields may exist after the public ones. + */ + + +/* Error handler object */ + +struct jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + JMETHOD(void, error_exit, (j_common_ptr cinfo)); + /* Conditionally emit a trace or warning message */ + JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); + /* Routine that actually outputs a trace or error message */ + JMETHOD(void, output_message, (j_common_ptr cinfo)); + /* Format a message string for the most recent JPEG error or message */ + JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); +#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ + /* Reset error state variables at start of a new image */ + JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); + + /* The message ID code and any parameters are saved here. + * A message can have one string parameter or up to 8 int parameters. + */ + int msg_code; +#define JMSG_STR_PARM_MAX 80 + union { + int i[8]; + char s[JMSG_STR_PARM_MAX]; + } msg_parm; + + /* Standard state variables for error facility */ + + int trace_level; /* max msg_level that will be displayed */ + + /* For recoverable corrupt-data errors, we emit a warning message, + * but keep going unless emit_message chooses to abort. emit_message + * should count warnings in num_warnings. The surrounding application + * can check for bad data by seeing if num_warnings is nonzero at the + * end of processing. + */ + long num_warnings; /* number of corrupt-data warnings */ + + /* These fields point to the table(s) of error message strings. + * An application can change the table pointer to switch to a different + * message list (typically, to change the language in which errors are + * reported). Some applications may wish to add additional error codes + * that will be handled by the JPEG library error mechanism; the second + * table pointer is used for this purpose. + * + * First table includes all errors generated by JPEG library itself. + * Error code 0 is reserved for a "no such error string" message. + */ + const char * const * jpeg_message_table; /* Library errors */ + int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ + /* Second table can be added by application (see cjpeg/djpeg for example). + * It contains strings numbered first_addon_message..last_addon_message. + */ + const char * const * addon_message_table; /* Non-library errors */ + int first_addon_message; /* code for first string in addon table */ + int last_addon_message; /* code for last string in addon table */ +}; + + +/* Progress monitor object */ + +struct jpeg_progress_mgr { + JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); + + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +}; + + +/* Data destination object for compression */ + +struct jpeg_destination_mgr { + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + + JMETHOD(void, init_destination, (j_compress_ptr cinfo)); + JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); + JMETHOD(void, term_destination, (j_compress_ptr cinfo)); +}; + + +/* Data source object for decompression */ + +struct jpeg_source_mgr { + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + + JMETHOD(void, init_source, (j_decompress_ptr cinfo)); + JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); + JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); + JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); + JMETHOD(void, term_source, (j_decompress_ptr cinfo)); +}; + + +/* Memory manager object. + * Allocates "small" objects (a few K total), "large" objects (tens of K), + * and "really big" objects (virtual arrays with backing store if needed). + * The memory manager does not allow individual objects to be freed; rather, + * each created object is assigned to a pool, and whole pools can be freed + * at once. This is faster and more convenient than remembering exactly what + * to free, especially where malloc()/free() are not too speedy. + * NB: alloc routines never return NULL. They exit to error_exit if not + * successful. + */ + +#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ +#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ +#define JPOOL_NUMPOOLS 2 + +typedef struct jvirt_sarray_control * jvirt_sarray_ptr; +typedef struct jvirt_barray_control * jvirt_barray_ptr; + + +struct jpeg_memory_mgr { + /* Method pointers */ + JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, + JDIMENSION samplesperrow, + JDIMENSION numrows)); + JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, + JDIMENSION blocksperrow, + JDIMENSION numrows)); + JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION samplesperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION blocksperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); + JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, + jvirt_sarray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, + jvirt_barray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); + JMETHOD(void, self_destruct, (j_common_ptr cinfo)); + + /* Limit on memory allocation for this JPEG object. (Note that this is + * merely advisory, not a guaranteed maximum; it only affects the space + * used for virtual-array buffers.) May be changed by outer application + * after creating the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + + +/* Routine signature for application-supplied marker processing methods. + * Need not pass marker code since it is stored in cinfo->unread_marker. + */ +typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); + + +/* Declarations for routines called by application. + * The JPP macro hides prototype parameters from compilers that can't cope. + * Note JPP requires double parentheses. + */ + +#ifdef HAVE_PROTOTYPES +#define JPP(arglist) arglist +#else +#define JPP(arglist) () +#endif + + +/* Short forms of external names for systems with brain-damaged linkers. + * We shorten external names to be unique in the first six letters, which + * is good enough for all known systems. + * (If your compiler itself needs names to be unique in less than 15 + * characters, you are out of luck. Get a better compiler.) + */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_std_error jStdError +#define jpeg_CreateCompress jCreaCompress +#define jpeg_CreateDecompress jCreaDecompress +#define jpeg_destroy_compress jDestCompress +#define jpeg_destroy_decompress jDestDecompress +#define jpeg_stdio_dest jStdDest +#define jpeg_stdio_src jStdSrc +#define jpeg_set_defaults jSetDefaults +#define jpeg_set_colorspace jSetColorspace +#define jpeg_default_colorspace jDefColorspace +#define jpeg_set_quality jSetQuality +#define jpeg_set_linear_quality jSetLQuality +#define jpeg_add_quant_table jAddQuantTable +#define jpeg_quality_scaling jQualityScaling +#define jpeg_simple_progression jSimProgress +#define jpeg_suppress_tables jSuppressTables +#define jpeg_alloc_quant_table jAlcQTable +#define jpeg_alloc_huff_table jAlcHTable +#define jpeg_start_compress jStrtCompress +#define jpeg_write_scanlines jWrtScanlines +#define jpeg_finish_compress jFinCompress +#define jpeg_write_raw_data jWrtRawData +#define jpeg_write_marker jWrtMarker +#define jpeg_write_m_header jWrtMHeader +#define jpeg_write_m_byte jWrtMByte +#define jpeg_write_tables jWrtTables +#define jpeg_read_header jReadHeader +#define jpeg_start_decompress jStrtDecompress +#define jpeg_read_scanlines jReadScanlines +#define jpeg_finish_decompress jFinDecompress +#define jpeg_read_raw_data jReadRawData +#define jpeg_has_multiple_scans jHasMultScn +#define jpeg_start_output jStrtOutput +#define jpeg_finish_output jFinOutput +#define jpeg_input_complete jInComplete +#define jpeg_new_colormap jNewCMap +#define jpeg_consume_input jConsumeInput +#define jpeg_calc_output_dimensions jCalcDimensions +#define jpeg_save_markers jSaveMarkers +#define jpeg_set_marker_processor jSetMarker +#define jpeg_read_coefficients jReadCoefs +#define jpeg_write_coefficients jWrtCoefs +#define jpeg_copy_critical_parameters jCopyCrit +#define jpeg_abort_compress jAbrtCompress +#define jpeg_abort_decompress jAbrtDecompress +#define jpeg_abort jAbort +#define jpeg_destroy jDestroy +#define jpeg_resync_to_restart jResyncRestart +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* Default error-management setup */ +EXTERN(struct jpeg_error_mgr *) jpeg_std_error + JPP((struct jpeg_error_mgr * err)); + +/* Initialization of JPEG compression objects. + * jpeg_create_compress() and jpeg_create_decompress() are the exported + * names that applications should call. These expand to calls on + * jpeg_CreateCompress and jpeg_CreateDecompress with additional information + * passed for version mismatch checking. + * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. + */ +#define jpeg_create_compress(cinfo) \ + jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_compress_struct)) +#define jpeg_create_decompress(cinfo) \ + jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_decompress_struct)) +EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, + int version, size_t structsize)); +EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, + int version, size_t structsize)); +/* Destruction of JPEG compression objects */ +EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); + +/* Standard data source and destination managers: stdio streams. */ +/* Caller is responsible for opening the file before and closing after. */ +EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); +EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); + +/* Default parameter setup for compression */ +EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); +/* Compression parameter setup aids */ +EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, + J_COLOR_SPACE colorspace)); +EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, + boolean force_baseline)); +EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, + int scale_factor, + boolean force_baseline)); +EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, + boolean force_baseline)); +EXTERN(int) jpeg_quality_scaling JPP((int quality)); +EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, + boolean suppress)); +EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); +EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); + +/* Main entry points for compression */ +EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, + boolean write_all_tables)); +EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION num_lines)); +EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); + +/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION num_lines)); + +/* Write a special marker. See libjpeg.doc concerning safe usage. */ +EXTERN(void) jpeg_write_marker + JPP((j_compress_ptr cinfo, int marker, + const JOCTET * dataptr, unsigned int datalen)); +/* Same, but piecemeal. */ +EXTERN(void) jpeg_write_m_header + JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); +EXTERN(void) jpeg_write_m_byte + JPP((j_compress_ptr cinfo, int val)); + +/* Alternate compression function: just write an abbreviated table file */ +EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); + +/* Decompression startup: read start of JPEG datastream to see what's there */ +EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, + boolean require_image)); +/* Return value is one of: */ +#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ +#define JPEG_HEADER_OK 1 /* Found valid image datastream */ +#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ +/* If you pass require_image = TRUE (normal case), you need not check for + * a TABLES_ONLY return code; an abbreviated file will cause an error exit. + * JPEG_SUSPENDED is only possible if you use a data source module that can + * give a suspension return (the stdio source module doesn't). + */ + +/* Main entry points for decompression */ +EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); +EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION max_lines)); +EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); + +/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION max_lines)); + +/* Additional entry points for buffered-image mode. */ +EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, + int scan_number)); +EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); +EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); +/* Return value is one of: */ +/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ +#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ +#define JPEG_REACHED_EOI 2 /* Reached end of image */ +#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ +#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ + +/* Precalculate output dimensions for current decompression parameters. */ +EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); + +/* Control saving of COM and APPn markers into marker_list. */ +EXTERN(void) jpeg_save_markers + JPP((j_decompress_ptr cinfo, int marker_code, + unsigned int length_limit)); + +/* Install a special processing method for COM or APPn markers. */ +EXTERN(void) jpeg_set_marker_processor + JPP((j_decompress_ptr cinfo, int marker_code, + jpeg_marker_parser_method routine)); + +/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ +EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays)); +EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, + j_compress_ptr dstinfo)); + +/* If you choose to abort compression or decompression before completing + * jpeg_finish_(de)compress, then you need to clean up to release memory, + * temporary files, etc. You can just call jpeg_destroy_(de)compress + * if you're done with the JPEG object, but if you want to clean it up and + * reuse it, call this: + */ +EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); + +/* Generic versions of jpeg_abort and jpeg_destroy that work on either + * flavor of JPEG object. These may be more convenient in some places. + */ +EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); +EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); + +/* Default restart-marker-resync procedure for use by data source modules */ +EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, + int desired)); + + +/* These marker codes are exported since applications and data source modules + * are likely to want to use them. + */ + +#define JPEG_RST0 0xD0 /* RST0 marker code */ +#define JPEG_EOI 0xD9 /* EOI marker code */ +#define JPEG_APP0 0xE0 /* APP0 marker code */ +#define JPEG_COM 0xFE /* COM marker code */ + + +/* If we have a brain-damaged compiler that emits warnings (or worse, errors) + * for structure definitions that are never filled in, keep it quiet by + * supplying dummy definitions for the various substructures. + */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ +struct jvirt_sarray_control { long dummy; }; +struct jvirt_barray_control { long dummy; }; +struct jpeg_comp_master { long dummy; }; +struct jpeg_c_main_controller { long dummy; }; +struct jpeg_c_prep_controller { long dummy; }; +struct jpeg_c_coef_controller { long dummy; }; +struct jpeg_marker_writer { long dummy; }; +struct jpeg_color_converter { long dummy; }; +struct jpeg_downsampler { long dummy; }; +struct jpeg_forward_dct { long dummy; }; +struct jpeg_entropy_encoder { long dummy; }; +struct jpeg_decomp_master { long dummy; }; +struct jpeg_d_main_controller { long dummy; }; +struct jpeg_d_coef_controller { long dummy; }; +struct jpeg_d_post_controller { long dummy; }; +struct jpeg_input_controller { long dummy; }; +struct jpeg_marker_reader { long dummy; }; +struct jpeg_entropy_decoder { long dummy; }; +struct jpeg_inverse_dct { long dummy; }; +struct jpeg_upsampler { long dummy; }; +struct jpeg_color_deconverter { long dummy; }; +struct jpeg_color_quantizer { long dummy; }; +#endif /* JPEG_INTERNALS */ +#endif /* INCOMPLETE_TYPES_BROKEN */ + + +/* + * The JPEG library modules define JPEG_INTERNALS before including this file. + * The internal structure declarations are read only when that is true. + * Applications using the library should not include jpegint.h, but may wish + * to include jerror.h. + */ + +#ifdef JPEG_INTERNALS +#include "jpegint.h" /* fetch private declarations */ +#include "jerror.h" /* fetch error codes too */ +#endif + +#endif /* JPEGLIB_H */ === modified file 'src/Makefile.am' --- src/Makefile.am 2008-11-30 20:15:05 +0000 +++ src/Makefile.am 2008-12-14 05:27:04 +0000 @@ -44,7 +44,8 @@ base/pdf-stm-filter.h base/pdf-stm-filter.c \ base/pdf-stm-f-null.h base/pdf-stm-f-null.c \ base/pdf-stm-f-ahex.h base/pdf-stm-f-ahex.c \ - base/pdf-stm-f-rl.h base/pdf-stm-f-rl.c + base/pdf-stm-f-rl.h base/pdf-stm-f-rl.c \ + base/pdf-stm-f-rl.h base/pdf-stm-f-dct.c if ZLIB STM_MODULE_SOURCES += base/pdf-stm-f-flate.c base/pdf-stm-f-flate.h === added file 'src/base/pdf-stm-f-dct.c' --- src/base/pdf-stm-f-dct.c 1970-01-01 00:00:00 +0000 +++ src/base/pdf-stm-f-dct.c 2008-12-19 14:47:04 +0000 @@ -0,0 +1,451 @@ +/* -*- mode: C -*- Time-stamp: "08/11/24 15:50:21 yangchanghua" + imagetojpeg_dst_term* + * File: pdf-stm-f-dct.c + * Date: Fri Jul 13 17:08:41 2007 + * + * GNU PDF Library - DCT decoder filter + * + */ + +/* Copyright (C) 2007, 2008 Free Software Foundation, Inc. */ + +/* This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include + +#define PPM_MAXVAL 255 + +static void pdf_stm_f_dctdec_jpeg_cache_src (j_decompress_ptr cinfo, pdf_stm_buffer_t cache); +static pdf_status_t pdf_stm_f_dctdec_src_fill(j_decompress_ptr cinfo, pdf_stm_buffer_t in); +static pdf_status_t pdf_stm_f_dctdec_write_ppm_header(j_decompress_ptr cinfo, pdf_stm_buffer_t out); + + +pdf_status_t +pdf_stm_f_dctenc_init (pdf_hash_t params, + void **state) +{ + return PDF_OK; +} + +pdf_status_t +pdf_stm_f_dctenc_apply (pdf_hash_t params, + void *state, + pdf_stm_buffer_t in, + pdf_stm_buffer_t out, + pdf_bool_t finish_p) +{ + pdf_status_t ret = PDF_OK; + return ret; +} + +pdf_status_t +pdf_stm_f_dctenc_dealloc_state (void *state) +{ + return PDF_OK; +} + +pdf_status_t +pdf_stm_f_dctdec_init (pdf_hash_t params, + void **state) +{ + pdf_stm_f_dctdec_t dctdec_state; + pdf_status_t ret; + + /* Allocate the internal state structure */ + dctdec_state = pdf_alloc (sizeof(struct pdf_stm_f_dctdec_s)); + memset(dctdec_state, 0, sizeof(struct pdf_stm_f_dctdec_s)); + if (dctdec_state != NULL) + { + dctdec_state->cinfo.err = jpeg_std_error(&dctdec_state->jerr); + jpeg_create_decompress(&dctdec_state->cinfo); + + dctdec_state->state = DCTDEC_STATE_INIT; + *state = dctdec_state; + ret = PDF_OK; + } + else + { + ret = PDF_ERROR; + } + + return ret; +} + +#define PDF_DJPEG_CACHE_SIZE (1024) + +pdf_status_t +pdf_stm_f_dctdec_apply (pdf_hash_t params, + void *state, + pdf_stm_buffer_t in, + pdf_stm_buffer_t out, + pdf_bool_t finish_p) +{ + pdf_i32_t loop_end = 0; + pdf_status_t ret = PDF_OK; + pdf_i32_t iret; + pdf_stm_f_dctdec_t filter_state = (pdf_stm_f_dctdec_t)state; + struct jpeg_decompress_struct *pcinfo = &filter_state->cinfo; + + if(finish_p + && in->wp - in->rp < 1 + && pcinfo->output_scanline == pcinfo->output_height + && 0 == filter_state->row_valid_size - filter_state->row_copy_index ) + { + return PDF_EEOF; + } + + while(!loop_end && ret == PDF_OK) + { + if(DCTDEC_STATE_INIT == filter_state->state) + { + if(!filter_state->djpeg_in) + { + filter_state->djpeg_in = pdf_stm_buffer_new(PDF_DJPEG_CACHE_SIZE); + if(!filter_state->djpeg_in) + { + ret = PDF_ERROR; + break; + } + } + pdf_stm_f_dctdec_jpeg_cache_src(pcinfo, filter_state->djpeg_in); + filter_state->backup_state = DCTDEC_STATE_READHDR; + filter_state->state = DCTDEC_STATE_CACHE; + } + if(DCTDEC_STATE_CACHE == filter_state->state) + { + if(pdf_stm_buffer_eob_p(in)) + { + ret = PDF_ENINPUT; + break; + } + ret = pdf_stm_f_dctdec_src_fill(pcinfo, in); + if(PDF_OK != ret) + { + break; + } + filter_state->state = filter_state->backup_state; + } + if( DCTDEC_STATE_READHDR == filter_state->state) + { + iret = jpeg_read_header(&filter_state->cinfo, TRUE); + if(iret == JPEG_SUSPENDED) + { + /* continue the loop, go into the "cache state" */ + ret = PDF_OK; + filter_state->backup_state = filter_state->state; + filter_state->state = DCTDEC_STATE_CACHE; + continue; + } + + if(iret != JPEG_HEADER_OK) + { + ret = PDF_ERROR; + break; + } + filter_state->state = DCTDEC_STATE_STARTDJP; + } + if(DCTDEC_STATE_WRITEHDR == filter_state->state) + { + ret = pdf_stm_f_dctdec_write_ppm_header( pcinfo, out); + if(PDF_OK != ret) + { + break; + } + filter_state->state = DCTDEC_STATE_SCANLINE; + } + + if(DCTDEC_STATE_STARTDJP == filter_state->state) + { + iret = jpeg_start_decompress(&filter_state->cinfo); + if(iret == FALSE) + { + /* continue the loop, go into the "cache state" */ + ret = PDF_OK; + filter_state->backup_state = filter_state->state; + filter_state->state = DCTDEC_STATE_CACHE; + continue; + } + /* here we know the output size, so allocate memory for them. */ + filter_state->row_stride = pcinfo->output_width * pcinfo->output_components; + + /* Make a one-row-high sample array that will go away when done with image */ + filter_state->row_buf = (*pcinfo->mem->alloc_sarray) + ((j_common_ptr) pcinfo, JPOOL_IMAGE, filter_state->row_stride, 1); + filter_state->row_valid_size = 0; + filter_state->row_copy_index = 0; + filter_state->state = DCTDEC_STATE_WRITEHDR; + } + if(DCTDEC_STATE_SCANLINE == filter_state->state) + { + if(!filter_state->djpeg_out) + { + filter_state->djpeg_out = pdf_stm_buffer_new(pcinfo->output_width * pcinfo->output_height * 3); + if(!filter_state->djpeg_out) + { + return PDF_ERROR; + } + } + while(pcinfo->output_scanline < pcinfo->output_height || filter_state->row_valid_size > filter_state->row_copy_index) + { + ret = PDF_OK; + if(filter_state->row_valid_size <= filter_state->row_copy_index) + { + pdf_i32_t scannum = 0; + scannum = jpeg_read_scanlines(pcinfo, filter_state->row_buf, 1); //pcinfo->output_height); + if(scannum == 0) + { + ret = PDF_OK; + filter_state->backup_state = filter_state->state; + filter_state->state = DCTDEC_STATE_CACHE; + break; + } + if(scannum != 1) + { + ret = PDF_ERROR; + break; + loop_end = 1; + } + filter_state->num_scanlines += scannum; + filter_state->row_valid_size = scannum * filter_state->row_stride; + filter_state->row_copy_index = 0; + } + + if(pdf_stm_buffer_full_p(out)) + { + ret = PDF_ENOUTPUT; + break; + loop_end = 1; + } + else + { + pdf_size_t bytes_to_copy = PDF_MIN(filter_state->row_valid_size - filter_state->row_copy_index, out->size - out->wp); + if(bytes_to_copy > 0) + { + memcpy(out->data+out->wp, filter_state->row_buf[0]+filter_state->row_copy_index, bytes_to_copy); + out->wp += bytes_to_copy; + } + filter_state->row_copy_index += bytes_to_copy; + if(filter_state->row_copy_index != filter_state->row_valid_size) + { + ret = PDF_ENOUTPUT; + break; + loop_end = 1; + } + } + if(PDF_OK == ret && pcinfo->output_scanline == pcinfo->output_height) + { + ret = PDF_EEOF; + break; + loop_end = 1; + } + } + } + } + if(PDF_OK == ret) + { + ret = PDF_EEOF; + } + return ret; +} + +pdf_status_t +pdf_stm_f_dctdec_dealloc_state (void *state) +{ + pdf_stm_f_dctdec_t dctdec_state = (pdf_stm_f_dctdec_t) state; + + jpeg_finish_decompress(&dctdec_state->cinfo); + jpeg_destroy_decompress(&dctdec_state->cinfo); + + pdf_dealloc (dctdec_state); + + return PDF_OK; +} + +/* Private functions */ + +/* source manager for decompress */ +struct pdf_stm_f_dct_cache_source_mgr_s{ + struct jpeg_source_mgr pub; /* public fields */ + + pdf_stm_buffer_t cache; + pdf_size_t size_to_skip; +}; + +typedef struct pdf_stm_f_dct_cache_source_mgr_s *pdf_stm_f_dct_cache_source_mgr_t; + +static void +pdf_stm_f_dctdec_init_source (j_decompress_ptr cinfo) +{ +} + +static boolean +pdf_stm_f_dctdec_fill_input_buffer (j_decompress_ptr cinfo) +{ + /* suspending mode, just return false.*/ + return FALSE; +} + +static void +pdf_stm_f_dctdec_skip_input_data (j_decompress_ptr cinfo, long num_bytes) +{ + if (num_bytes > 0) + { + pdf_stm_f_dct_cache_source_mgr_t src = (pdf_stm_f_dct_cache_source_mgr_t ) cinfo->src; + long sz_skiped = src->cache->wp - src->cache->rp; + if(sz_skiped > num_bytes) + { + sz_skiped = num_bytes; + src->size_to_skip = 0; + } + src->cache->rp += (pdf_size_t)sz_skiped; + src->size_to_skip = num_bytes - sz_skiped; + + src->pub.next_input_byte = src->cache->data + src->cache->rp; + src->pub.bytes_in_buffer = src->cache->wp - src->cache->rp; + } +} + +static void +pdf_stm_f_dctdec_term_source (j_decompress_ptr cinfo) +{ +} + +pdf_status_t +pdf_stm_f_dctdec_src_fill(j_decompress_ptr cinfo, pdf_stm_buffer_t in) +{ + pdf_stm_f_dct_cache_source_mgr_t src = (pdf_stm_f_dct_cache_source_mgr_t ) cinfo->src; + + pdf_size_t bytes_to_copy; + + if(src->size_to_skip > in->wp - in->rp) + { + src->size_to_skip -= in->wp - in->rp; + in->rp = in->wp; + return PDF_ENINPUT; + } + else + { + in->rp += src->size_to_skip; + src->size_to_skip = 0; + } + + bytes_to_copy = src->pub.bytes_in_buffer; + if(bytes_to_copy > 0) + { + /* shift the backtrack data when suspension happens. */ + memmove(src->cache->data, src->pub.next_input_byte, bytes_to_copy); + src->cache->rp = 0; + src->cache->wp = bytes_to_copy; + } + + bytes_to_copy = PDF_MIN(in->wp - in->rp, src->cache->size - src->cache->wp); + if(bytes_to_copy > 0) + { + memcpy(src->cache->data + src->cache->wp, in->data + in->rp, bytes_to_copy); + in->rp += bytes_to_copy; + src->cache->wp += bytes_to_copy; + } + + src->pub.bytes_in_buffer = src->cache->wp - src->cache->rp; + src->pub.next_input_byte = src->cache->data + src->cache->rp; + return PDF_OK; +} + +void +pdf_stm_f_dctdec_src_fill_eoi(j_decompress_ptr cinfo) +{ + pdf_stm_f_dct_cache_source_mgr_t src = (pdf_stm_f_dct_cache_source_mgr_t ) cinfo->src; + if (pdf_stm_buffer_eob_p(src->cache) && src->cache->size > 1) + { + /* Insert a fake EOI marker */ + src->cache->rp = 0; + src->cache->wp = 2; + src->cache->data[0] = (JOCTET) 0xFF; + src->cache->data[1] = (JOCTET) JPEG_EOI; + } + src->pub.bytes_in_buffer = src->cache->wp - src->cache->rp; + src->pub.next_input_byte = src->cache->data + src->cache->rp; +} + +static void +pdf_stm_f_dctdec_jpeg_cache_src (j_decompress_ptr cinfo, pdf_stm_buffer_t cache) +{ + pdf_stm_f_dct_cache_source_mgr_t src = (pdf_stm_f_dct_cache_source_mgr_t ) cinfo->src; + + if (cinfo->src == NULL) + { + /* first time for this JPEG object? */ + cinfo->src = (struct jpeg_source_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, sizeof(struct pdf_stm_f_dct_cache_source_mgr_s)); + src = (pdf_stm_f_dct_cache_source_mgr_t) cinfo->src; + } + + src->cache = cache; + + src->pub.init_source = pdf_stm_f_dctdec_init_source; + src->pub.fill_input_buffer = pdf_stm_f_dctdec_fill_input_buffer; + src->pub.skip_input_data = pdf_stm_f_dctdec_skip_input_data; + src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ + src->pub.term_source = pdf_stm_f_dctdec_term_source; + src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ + src->pub.next_input_byte = NULL; /* until buffer loaded */ +} + +static pdf_status_t +pdf_stm_f_dctdec_write_ppm_header(j_decompress_ptr cinfo, pdf_stm_buffer_t out) +{ + pdf_char_t header[64]; + pdf_i32_t hlen; + + if(out->size - out->wp < 64) + { + return PDF_ENOUTPUT; + } + /* Emit file header */ + switch (cinfo->out_color_space) { + case JCS_GRAYSCALE: + /* emit header for raw PGM format */ + + sprintf(header, "P5\n%ld %ld\n%d\n", + (long) cinfo->output_width, (long) cinfo->output_height, + PPM_MAXVAL); + break; + case JCS_RGB: + /* emit header for raw PPM format */ + sprintf(header, "P6\n%ld %ld\n%d\n", + (long) cinfo->output_width, (long) cinfo->output_height, + PPM_MAXVAL); + break; + default: + return PDF_ERROR; + } + hlen = strlen(header); + if(hlen > out->size-out->wp) + { + return PDF_ENOUTPUT; + } +#if 0 + fwrite(header, hlen, 1, stdout); +#else + memcpy(out->data + out->wp, header, hlen); + out->wp += hlen; +#endif + return PDF_OK; +} + +/* End of pdf_stm_f_ahex.c */ === added file 'src/base/pdf-stm-f-dct.h' --- src/base/pdf-stm-f-dct.h 1970-01-01 00:00:00 +0000 +++ src/base/pdf-stm-f-dct.h 2008-12-19 14:47:04 +0000 @@ -0,0 +1,97 @@ +/* -*- mode: C -*- Time-stamp: "08/11/26 21:21:35 yangchanghua" + * + * File: pdf-stm-f-dct.h + * Date: Fri Jul 13 17:04:29 2007 + * + * GNU PDF Library - DCT encoder/decoder + * + */ + +/* Copyright (C) 2007, 2008 Free Software Foundation, Inc. */ + +/* This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef PDF_STM_F_DCT_H +#define PDF_STM_F_DCT_H + +#include +#include +#include +#include +#include + +enum pdf_stm_f_dctstate_t +{ + DCTDEC_STATE_INIT, + DCTDEC_STATE_CACHE, + DCTDEC_STATE_READHDR, + DCTDEC_STATE_WRITEHDR, + DCTDEC_STATE_STARTDJP, + DCTDEC_STATE_SCANLINE, + DCTDEC_STATE_FINISHDJP, + DCTDEC_STATE_ERROR +}; +/* Internal state */ +struct pdf_stm_f_dctenc_s +{ +}; + +typedef struct pdf_stm_f_dctenc_s *pdf_stm_f_dctenc_t; + +struct pdf_stm_f_dctdec_s +{ + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + + enum pdf_stm_f_dctstate_t state; + enum pdf_stm_f_dctstate_t backup_state; + + /* image cache for input data */ + pdf_stm_buffer_t djpeg_in; + pdf_stm_buffer_t djpeg_out; + + /* cache for output data */ + pdf_size_t row_stride; + pdf_char_t **row_buf; + pdf_size_t row_valid_size; + pdf_size_t row_copy_index; + pdf_u32_t num_scanlines; +}; + +typedef struct pdf_stm_f_dctdec_s *pdf_stm_f_dctdec_t; + +/* Filters implementation API */ + +pdf_status_t pdf_stm_f_dctdec_init (pdf_hash_t params, + void **state); +pdf_status_t pdf_stm_f_dctdec_apply (pdf_hash_t params, + void *state, + pdf_stm_buffer_t in, + pdf_stm_buffer_t out, + pdf_bool_t finish_p); +pdf_status_t pdf_stm_f_dctdec_dealloc_state (void *state); + +pdf_status_t pdf_stm_f_dctenc_init (pdf_hash_t params, + void **state); +pdf_status_t pdf_stm_f_dctenc_apply (pdf_hash_t params, + void *state, + pdf_stm_buffer_t in, + pdf_stm_buffer_t out, + pdf_bool_t finish_p); +pdf_status_t pdf_stm_f_dctenc_dealloc_state (void *state); + +#endif /* pdf_stm_f_dct.h */ + +/* End of pdf_stm_f_dct.h */ === modified file 'src/base/pdf-stm-filter.c' --- src/base/pdf-stm-filter.c 2008-12-08 19:03:28 +0000 +++ src/base/pdf-stm-filter.c 2008-12-14 05:27:04 +0000 @@ -126,6 +126,15 @@ break; } #endif /* HAVE_JBIG2DEC */ +#if defined(HAVE_JPEGLIB) + case PDF_STM_FILTER_DCT_DEC: + { + new->impl.init_fn = pdf_stm_f_dctdec_init; + new->impl.apply_fn = pdf_stm_f_dctdec_apply; + new->impl.dealloc_state_fn = pdf_stm_f_dctdec_dealloc_state; + break; + } +#endif /* HAVE_JPEGLIB */ default: { /* Shall not be reached, but makes the compiler happy */ === modified file 'src/base/pdf-stm-filter.h' --- src/base/pdf-stm-filter.h 2008-11-29 16:21:37 +0000 +++ src/base/pdf-stm-filter.h 2008-12-14 05:27:04 +0000 @@ -43,6 +43,9 @@ #if defined(HAVE_JBIG2DEC) # include #endif /* HAVE_JBIG2DEC */ +#if defined(HAVE_JPEGLIB) +# include +#endif /* HAVE_JPEGLIB */ /* BEGIN PUBLIC */ @@ -56,7 +59,8 @@ PDF_STM_FILTER_RL_DEC, PDF_STM_FILTER_FLATE_ENC, PDF_STM_FILTER_FLATE_DEC, - PDF_STM_FILTER_JBIG2_DEC + PDF_STM_FILTER_JBIG2_DEC, + PDF_STM_FILTER_DCT_DEC }; /* END PUBLIC */ === modified file 'utils/pdf-filter.c' --- utils/pdf-filter.c 2008-11-24 16:08:33 +0000 +++ utils/pdf-filter.c 2008-12-14 05:27:04 +0000 @@ -474,6 +474,40 @@ #endif /* HAVE_JBIG2DEC */ case DCTDEC_FILTER_ARG: { + ret = pdf_hash_new (NULL, &filter_params); + if (ret != PDF_OK) + { + pdf_error (ret, stderr, "while creating the dctdec filter parameters hash table"); + exit (1); + } + + if (jbig2dec_global_segments != NULL) + { + pdf_size_t *size; + + pdf_hash_add (filter_params, + "GlobalStreamsBuffer", + (const void *) &jbig2dec_global_segments, + NULL); + + size = pdf_alloc (sizeof(pdf_size_t)); + *size = jbig2dec_global_segments_size; + pdf_hash_add (filter_params, + "GlobalStreamsSize", + (const void *) size, + NULL); + } + + + pdf_stm_install_filter (stm, + PDF_STM_FILTER_DCT_DEC, + filter_params); + + /* Note that a reference to this memory remains into the + stream */ + jbig2dec_global_segments = NULL; + jbig2dec_global_segments_size = 0; + break; } case JXPDEC_FILTER_ARG: # Begin bundle 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