📄 jpegdata.h
字号:
(*(emeth)->error_exit) ())
#define MAKESTMT(stuff) do { stuff } while (0)
/* Nonfatal errors (we'll keep going, but the data is probably corrupt) */
/* Note that warning count is incremented as a side-effect! */
#define WARNMS(emeth) \
MAKESTMT( if ((emeth)->trace_level >= ((emeth)->num_warnings++ ? \
(emeth)->more_warning_level : (emeth)->first_warning_level)){ \
(*(emeth)->trace_message) (); } )
#define WARNMS1(emeth,p1) \
MAKESTMT( if ((emeth)->trace_level >= ((emeth)->num_warnings++ ? \
(emeth)->more_warning_level : (emeth)->first_warning_level)){ \
(emeth)->message_parm[0] = (p1); \
(*(emeth)->trace_message) (); } )
#define WARNMS2(emeth,p1,p2) \
MAKESTMT( if ((emeth)->trace_level >= ((emeth)->num_warnings++ ? \
(emeth)->more_warning_level : (emeth)->first_warning_level)){ \
(emeth)->message_parm[0] = (p1); \
(emeth)->message_parm[1] = (p2); \
(*(emeth)->trace_message) (); } )
/* Informational/debugging messages */
#define TRACEMS(emeth,lvl) \
MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \
(*(emeth)->trace_message) (); } )
#define TRACEMS1(emeth,lvl,p1) \
MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \
(emeth)->message_parm[0] = (p1); \
(*(emeth)->trace_message) (); } )
#define TRACEMS2(emeth,lvl,p1,p2) \
MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \
(emeth)->message_parm[0] = (p1); \
(emeth)->message_parm[1] = (p2); \
(*(emeth)->trace_message) (); } )
#define TRACEMS3(emeth,lvl,p1,p2,p3) \
MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \
int * _mp = (emeth)->message_parm; \
*_mp++ = (p1); *_mp++ = (p2); *_mp = (p3); \
(*(emeth)->trace_message) (); } )
#define TRACEMS4(emeth,lvl,p1,p2,p3,p4) \
MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \
int * _mp = (emeth)->message_parm; \
*_mp++ = (p1); *_mp++ = (p2); *_mp++ = (p3); *_mp = (p4); \
(*(emeth)->trace_message) (); } )
#define TRACEMS8(emeth,lvl,p1,p2,p3,p4,p5,p6,p7,p8) \
MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \
int * _mp = (emeth)->message_parm; \
*_mp++ = (p1); *_mp++ = (p2); *_mp++ = (p3); *_mp++ = (p4); \
*_mp++ = (p5); *_mp++ = (p6); *_mp++ = (p7); *_mp = (p8); \
(*(emeth)->trace_message) (); } )
/* Methods used during JPEG compression. */
struct Compress_methods_struct {
/* Hook for user interface to get control after input_init */
METHOD(void, c_ui_method_selection, (compress_info_ptr cinfo));
/* Hook for user interface to do progress monitoring */
METHOD(void, progress_monitor, (compress_info_ptr cinfo,
long loopcounter, long looplimit));
/* Input image reading & conversion to standard form */
METHOD(void, input_init, (compress_info_ptr cinfo));
METHOD(void, get_input_row, (compress_info_ptr cinfo,
JSAMPARRAY pixel_row));
METHOD(void, input_term, (compress_info_ptr cinfo));
/* Color space and gamma conversion */
METHOD(void, colorin_init, (compress_info_ptr cinfo));
METHOD(void, get_sample_rows, (compress_info_ptr cinfo,
int rows_to_read,
JSAMPIMAGE image_data));
METHOD(void, colorin_term, (compress_info_ptr cinfo));
/* Expand picture data at edges */
METHOD(void, edge_expand, (compress_info_ptr cinfo,
long input_cols, int input_rows,
long output_cols, int output_rows,
JSAMPIMAGE image_data));
/* Downsample pixel values of a single component */
/* There can be a different downsample method for each component */
METHOD(void, downsample_init, (compress_info_ptr cinfo));
downsample_ptr downsample[MAX_COMPS_IN_SCAN];
METHOD(void, downsample_term, (compress_info_ptr cinfo));
/* Extract samples in MCU order, process & hand off to output_method */
/* The input is always exactly N MCU rows worth of data */
METHOD(void, extract_init, (compress_info_ptr cinfo));
METHOD(void, extract_MCUs, (compress_info_ptr cinfo,
JSAMPIMAGE image_data,
int num_mcu_rows,
MCU_output_method_ptr output_method));
METHOD(void, extract_term, (compress_info_ptr cinfo));
/* Entropy encoding parameter optimization */
METHOD(void, entropy_optimize, (compress_info_ptr cinfo,
MCU_output_caller_ptr source_method));
/* Entropy encoding */
METHOD(void, entropy_encode_init, (compress_info_ptr cinfo));
METHOD(void, entropy_encode, (compress_info_ptr cinfo,
JBLOCK *MCU_data));
METHOD(void, entropy_encode_term, (compress_info_ptr cinfo));
/* JPEG file header construction */
METHOD(void, write_file_header, (compress_info_ptr cinfo));
METHOD(void, write_scan_header, (compress_info_ptr cinfo));
METHOD(void, write_jpeg_data, (compress_info_ptr cinfo,
char *dataptr,
int datacount));
METHOD(void, write_scan_trailer, (compress_info_ptr cinfo));
METHOD(void, write_file_trailer, (compress_info_ptr cinfo));
/* Pipeline control */
METHOD(void, c_pipeline_controller, (compress_info_ptr cinfo));
METHOD(void, entropy_output, (compress_info_ptr cinfo,
char *dataptr,
int datacount));
/* Overall control */
METHOD(void, c_per_scan_method_selection, (compress_info_ptr cinfo));
};
/* Methods used during JPEG decompression. */
struct Decompress_methods_struct {
/* Hook for user interface to get control after reading file header */
METHOD(void, d_ui_method_selection, (decompress_info_ptr cinfo));
/* Hook for user interface to do progress monitoring */
METHOD(void, progress_monitor, (decompress_info_ptr cinfo,
long loopcounter, long looplimit));
/* JPEG file scanning */
METHOD(void, read_file_header, (decompress_info_ptr cinfo));
METHOD(boolean, read_scan_header, (decompress_info_ptr cinfo));
METHOD(int, read_jpeg_data, (decompress_info_ptr cinfo));
METHOD(void, resync_to_restart, (decompress_info_ptr cinfo,
int marker));
METHOD(void, read_scan_trailer, (decompress_info_ptr cinfo));
METHOD(void, read_file_trailer, (decompress_info_ptr cinfo));
/* Entropy decoding */
METHOD(void, entropy_decode_init, (decompress_info_ptr cinfo));
METHOD(void, entropy_decode, (decompress_info_ptr cinfo,
JBLOCKROW *MCU_data));
METHOD(void, entropy_decode_term, (decompress_info_ptr cinfo));
/* MCU disassembly: fetch MCUs from entropy_decode, build coef array */
/* The reverse_DCT step is in the same module for symmetry reasons */
METHOD(void, disassemble_init, (decompress_info_ptr cinfo));
METHOD(void, disassemble_MCU, (decompress_info_ptr cinfo,
JBLOCKIMAGE image_data));
METHOD(void, reverse_DCT, (decompress_info_ptr cinfo,
JBLOCKIMAGE coeff_data,
JSAMPIMAGE output_data, int start_row));
METHOD(void, disassemble_term, (decompress_info_ptr cinfo));
/* Cross-block smoothing */
METHOD(void, smooth_coefficients, (decompress_info_ptr cinfo,
jpeg_component_info *compptr,
JBLOCKROW above,
JBLOCKROW currow,
JBLOCKROW below,
JBLOCKROW output));
/* Upsample pixel values of a single component */
/* There can be a different upsample method for each component */
METHOD(void, upsample_init, (decompress_info_ptr cinfo));
upsample_ptr upsample[MAX_COMPS_IN_SCAN];
METHOD(void, upsample_term, (decompress_info_ptr cinfo));
/* Color space and gamma conversion */
METHOD(void, colorout_init, (decompress_info_ptr cinfo));
METHOD(void, color_convert, (decompress_info_ptr cinfo,
int num_rows, long num_cols,
JSAMPIMAGE input_data,
JSAMPIMAGE output_data));
METHOD(void, colorout_term, (decompress_info_ptr cinfo));
/* Color quantization */
METHOD(void, color_quant_init, (decompress_info_ptr cinfo));
METHOD(void, color_quantize, (decompress_info_ptr cinfo,
int num_rows,
JSAMPIMAGE input_data,
JSAMPARRAY output_data));
METHOD(void, color_quant_prescan, (decompress_info_ptr cinfo,
int num_rows,
JSAMPIMAGE image_data,
JSAMPARRAY workspace));
METHOD(void, color_quant_doit, (decompress_info_ptr cinfo,
quantize_caller_ptr source_method));
METHOD(void, color_quant_term, (decompress_info_ptr cinfo));
/* Output image writing */
METHOD(void, output_init, (decompress_info_ptr cinfo));
METHOD(void, put_color_map, (decompress_info_ptr cinfo,
int num_colors, JSAMPARRAY colormap));
METHOD(void, put_pixel_rows, (decompress_info_ptr cinfo,
int num_rows,
JSAMPIMAGE pixel_data));
METHOD(void, output_term, (decompress_info_ptr cinfo));
/* Pipeline control */
METHOD(void, d_pipeline_controller, (decompress_info_ptr cinfo));
/* Overall control */
METHOD(void, d_per_scan_method_selection, (decompress_info_ptr cinfo));
};
/* External declarations for routines that aren't called via method ptrs. */
/* Note: use "j" as first char of names to minimize namespace pollution. */
/* The PP macro hides prototype parameters from compilers that can't cope. */
#ifdef PROTO
#define PP(arglist) arglist
#else
#define PP(arglist) ()
#endif
/* main entry for compression */
EXTERN void jpeg_compress PP((compress_info_ptr cinfo));
/* default parameter setup for compression */
EXTERN void j_c_defaults PP((compress_info_ptr cinfo, int quality,
boolean force_baseline));
EXTERN void j_monochrome_default PP((compress_info_ptr cinfo));
EXTERN void j_set_quality PP((compress_info_ptr cinfo, int quality,
boolean force_baseline));
/* advanced compression parameter setup aids */
EXTERN void j_add_quant_table PP((compress_info_ptr cinfo, int which_tbl,
const QUANT_VAL *basic_table,
int scale_factor, boolean force_baseline));
EXTERN int j_quality_scaling PP((int quality));
/* main entry for decompression */
EXTERN void jpeg_decompress PP((decompress_info_ptr cinfo));
/* default parameter setup for decompression */
EXTERN void j_d_defaults PP((decompress_info_ptr cinfo,
boolean standard_buffering));
/* forward DCT */
EXTERN void j_fwd_dct PP((DCTBLOCK data));
/* inverse DCT */
EXTERN void j_rev_dct PP((DCTBLOCK data));
/* utility routines in jutils.c */
EXTERN long jround_up PP((long a, long b));
EXTERN void jcopy_sample_rows PP((JSAMPARRAY input_array, int source_row,
JSAMPARRAY output_array, int dest_row,
int num_rows, long num_cols));
EXTERN void jcopy_block_row PP((JBLOCKROW input_row, JBLOCKROW output_row,
long num_blocks));
EXTERN void jzero_far PP((void FAR * target, size_t bytestozero));
/* method selection routines for compression modules */
EXTERN void jselcpipeline PP((compress_info_ptr cinfo)); /* jcpipe.c */
EXTERN void jselchuffman PP((compress_info_ptr cinfo)); /* jchuff.c */
EXTERN void jselcarithmetic PP((compress_info_ptr cinfo)); /* jcarith.c */
EXTERN void jselexpand PP((compress_info_ptr cinfo)); /* jcexpand.c */
EXTERN void jseldownsample PP((compress_info_ptr cinfo)); /* jcsample.c */
EXTERN void jselcmcu PP((compress_info_ptr cinfo)); /* jcmcu.c */
EXTERN void jselccolor PP((compress_info_ptr cinfo)); /* jccolor.c */
/* The user interface should call one of these to select input format: */
EXTERN void jselrgif PP((compress_info_ptr cinfo)); /* jrdgif.c */
EXTERN void jselrppm PP((compress_info_ptr cinfo)); /* jrdppm.c */
EXTERN void jselrrle PP((compress_info_ptr cinfo)); /* jrdrle.c */
EXTERN void jselrtarga PP((compress_info_ptr cinfo)); /* jrdtarga.c */
/* and one of these to select output header format: */
EXTERN void jselwjfif PP((compress_info_ptr cinfo)); /* jwrjfif.c */
/* method selection routines for decompression modules */
EXTERN void jseldpipeline PP((decompress_info_ptr cinfo)); /* jdpipe.c */
EXTERN void jseldhuffman PP((decompress_info_ptr cinfo)); /* jdhuff.c */
EXTERN void jseldarithmetic PP((decompress_info_ptr cinfo)); /* jdarith.c */
EXTERN void jseldmcu PP((decompress_info_ptr cinfo)); /* jdmcu.c */
EXTERN void jselbsmooth PP((decompress_info_ptr cinfo)); /* jbsmooth.c */
EXTERN void jselupsample PP((decompress_info_ptr cinfo)); /* jdsample.c */
EXTERN void jseldcolor PP((decompress_info_ptr cinfo)); /* jdcolor.c */
EXTERN void jsel1quantize PP((decompress_info_ptr cinfo)); /* jquant1.c */
EXTERN void jsel2quantize PP((decompress_info_ptr cinfo)); /* jquant2.c */
/* The user interface should call one of these to select input format: */
EXTERN void jselrjfif PP((decompress_info_ptr cinfo)); /* jrdjfif.c */
/* and one of these to select output image format: */
EXTERN void jselwgif PP((decompress_info_ptr cinfo)); /* jwrgif.c */
EXTERN void jselwppm PP((decompress_info_ptr cinfo)); /* jwrppm.c */
EXTERN void jselwrle PP((decompress_info_ptr cinfo)); /* jwrrle.c */
EXTERN void jselwtarga PP((decompress_info_ptr cinfo)); /* jwrtarga.c */
/* method selection routines for system-dependent modules */
EXTERN void jselerror PP((external_methods_ptr emethods)); /* jerror.c */
EXTERN void jselmemmgr PP((external_methods_ptr emethods)); /* jmemmgr.c */
/* We assume that right shift corresponds to signed division by 2 with
* rounding towards minus infinity. This is correct for typical "arithmetic
* shift" instructions that shift in copies of the sign bit. But some
* C compilers implement >> with an unsigned shift. For these machines you
* must define RIGHT_SHIFT_IS_UNSIGNED.
* RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.
* It is only applied with constant shift counts. SHIFT_TEMPS must be
* included in the variables of any routine using RIGHT_SHIFT.
*/
#ifdef RIGHT_SHIFT_IS_UNSIGNED
#define SHIFT_TEMPS INT32 shift_temp;
#define RIGHT_SHIFT(x,shft) \
((shift_temp = (x)) < 0 ? \
(shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \
(shift_temp >> (shft)))
#else
#define SHIFT_TEMPS
#define RIGHT_SHIFT(x,shft) ((x) >> (shft))
#endif
/* Miscellaneous useful macros */
#undef MAX
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#undef MIN
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define RST0 0xD0 /* RST0 marker code */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -