|  | /* | 
|  | * jddeflts.c | 
|  | * | 
|  | * Copyright (C) 1991, 1992, 1993, 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 optional default-setting code for the JPEG decompressor. | 
|  | * User interfaces do not have to use this file, but those that don't use it | 
|  | * must know more about the innards of the JPEG code. | 
|  | */ | 
|  |  | 
|  | #include "jinclude.h" | 
|  |  | 
|  |  | 
|  | /* Default do-nothing progress monitoring routine. | 
|  | * This can be overridden by a user interface that wishes to | 
|  | * provide progress monitoring; just set methods->progress_monitor | 
|  | * after j_d_defaults is done.  The routine will be called periodically | 
|  | * during the decompression process. | 
|  | * | 
|  | * During any one pass, loopcounter increases from 0 up to (not including) | 
|  | * looplimit; the step size is not necessarily 1.  Both the step size and | 
|  | * the limit may differ between passes.  The expected total number of passes | 
|  | * is in cinfo->total_passes, and the number of passes already completed is | 
|  | * in cinfo->completed_passes.  Thus the fraction of work completed may be | 
|  | * estimated as | 
|  | *		completed_passes + (loopcounter/looplimit) | 
|  | *		------------------------------------------ | 
|  | *				total_passes | 
|  | * ignoring the fact that the passes may not be equal amounts of work. | 
|  | * | 
|  | * When decompressing, the total_passes figure is an estimate that may be | 
|  | * on the high side; completed_passes will jump by more than one if some | 
|  | * passes are skipped. | 
|  | */ | 
|  |  | 
|  | METHODDEF void | 
|  | progress_monitor (decompress_info_ptr cinfo, long loopcounter, long looplimit) | 
|  | { | 
|  | /* do nothing */ | 
|  | } | 
|  |  | 
|  |  | 
|  | /* Default comment-block processing routine. | 
|  | * This can be overridden by an application that wishes to examine | 
|  | * COM blocks found in the JPEG file.  The default routine does nothing. | 
|  | * CAUTION: the comment processing routine MUST call JGETC() exactly | 
|  | * comment_length times to read the comment data, whether it intends | 
|  | * to do anything with the data or not! | 
|  | * Keep in mind that (a) there may be more than one COM block in a file; | 
|  | * (b) there's no guarantee that what's in the block is ASCII data. | 
|  | */ | 
|  |  | 
|  | METHODDEF void | 
|  | process_comment (decompress_info_ptr cinfo, long comment_length) | 
|  | { | 
|  | while (comment_length-- > 0) { | 
|  | (void) JGETC(cinfo); | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | /* | 
|  | * Reload the input buffer after it's been emptied, and return the next byte. | 
|  | * See the JGETC macro for calling conditions.  Note in particular that | 
|  | * read_jpeg_data may NOT return EOF.  If no more data is available, it must | 
|  | * exit via ERREXIT, or perhaps synthesize fake data (such as an RST marker). | 
|  | * In the present implementation, we insert an EOI marker; this might not be | 
|  | * appropriate for non-JFIF file formats, but it usually allows us to handle | 
|  | * a truncated JFIF file. | 
|  | * | 
|  | * This routine can be overridden by the system-dependent user interface, | 
|  | * in case the data source is not a stdio stream or some other special | 
|  | * condition applies.  Note, however, that this capability only applies for | 
|  | * JFIF or similar serial-access JPEG file formats.  The input file control | 
|  | * module for a random-access format such as TIFF/JPEG would most likely | 
|  | * override the read_jpeg_data method with its own routine. | 
|  | */ | 
|  |  | 
|  | METHODDEF int | 
|  | read_jpeg_data (decompress_info_ptr cinfo) | 
|  | { | 
|  | cinfo->next_input_byte = cinfo->input_buffer + MIN_UNGET; | 
|  |  | 
|  | cinfo->bytes_in_buffer = (int) JFREAD(cinfo->input_file, | 
|  | cinfo->next_input_byte, | 
|  | JPEG_BUF_SIZE); | 
|  |  | 
|  | if (cinfo->bytes_in_buffer <= 0) { | 
|  | WARNMS(cinfo->emethods, "Premature EOF in JPEG file"); | 
|  | cinfo->next_input_byte[0] = (char) 0xFF; | 
|  | cinfo->next_input_byte[1] = (char) 0xD9; /* EOI marker */ | 
|  | cinfo->bytes_in_buffer = 2; | 
|  | } | 
|  |  | 
|  | return JGETC(cinfo); | 
|  | } | 
|  |  | 
|  |  | 
|  |  | 
|  | /* Default parameter setup for decompression. | 
|  | * | 
|  | * User interfaces that don't choose to use this routine must do their | 
|  | * own setup of all these parameters.  Alternately, you can call this | 
|  | * to establish defaults and then alter parameters selectively.  This | 
|  | * is the recommended approach since, if we add any new parameters, | 
|  | * your code will still work (they'll be set to reasonable defaults). | 
|  | * | 
|  | * standard_buffering should be TRUE to cause an input buffer to be allocated | 
|  | * (the normal case); if FALSE, the user interface must provide a buffer. | 
|  | * This option is most useful in the case that the buffer must not be freed | 
|  | * at the end of an image.  (For example, when reading a sequence of images | 
|  | * from a single file, the remaining data in the buffer represents the | 
|  | * start of the next image and mustn't be discarded.)  To handle this, | 
|  | * allocate the input buffer yourself at startup, WITHOUT using alloc_small | 
|  | * (probably a direct call to malloc() instead).  Then pass FALSE on each | 
|  | * call to j_d_defaults to ensure the buffer state is not modified. | 
|  | * | 
|  | * If the source of the JPEG data is not a stdio stream, override the | 
|  | * read_jpeg_data method with your own routine after calling j_d_defaults. | 
|  | * You can still use the standard buffer if it's appropriate. | 
|  | * | 
|  | * CAUTION: if you want to decompress multiple images per run, it's necessary | 
|  | * to call j_d_defaults before *each* call to jpeg_decompress, since subsidiary | 
|  | * structures like the quantization tables are automatically freed during | 
|  | * cleanup. | 
|  | */ | 
|  |  | 
|  | GLOBAL void | 
|  | j_d_defaults (decompress_info_ptr cinfo, boolean standard_buffering) | 
|  | /* NB: the external methods must already be set up. */ | 
|  | { | 
|  | short i; | 
|  |  | 
|  | /* Initialize pointers as needed to mark stuff unallocated. */ | 
|  | /* Outer application may fill in default tables for abbreviated files... */ | 
|  | cinfo->comp_info = NULL; | 
|  | for (i = 0; i < NUM_QUANT_TBLS; i++) | 
|  | cinfo->quant_tbl_ptrs[i] = NULL; | 
|  | for (i = 0; i < NUM_HUFF_TBLS; i++) { | 
|  | cinfo->dc_huff_tbl_ptrs[i] = NULL; | 
|  | cinfo->ac_huff_tbl_ptrs[i] = NULL; | 
|  | } | 
|  | cinfo->colormap = NULL; | 
|  |  | 
|  | /* Default to RGB output */ | 
|  | /* UI can override by changing out_color_space */ | 
|  | cinfo->out_color_space = CS_RGB; | 
|  | cinfo->jpeg_color_space = CS_UNKNOWN; | 
|  | /* Setting any other value in jpeg_color_space overrides heuristics in */ | 
|  | /* jrdjfif.c.  That might be useful when reading non-JFIF JPEG files, */ | 
|  | /* but ordinarily the UI shouldn't change it. */ | 
|  |  | 
|  | /* Default to no gamma correction of output */ | 
|  | cinfo->output_gamma = 1.0; | 
|  |  | 
|  | /* Default to no color quantization */ | 
|  | cinfo->quantize_colors = FALSE; | 
|  | /* but set reasonable default parameters for quantization, */ | 
|  | /* so that turning on quantize_colors is sufficient to do something useful */ | 
|  | cinfo->two_pass_quantize = TRUE; | 
|  | cinfo->use_dithering = TRUE; | 
|  | cinfo->desired_number_of_colors = 256; | 
|  |  | 
|  | /* Default to no smoothing */ | 
|  | cinfo->do_block_smoothing = FALSE; | 
|  | cinfo->do_pixel_smoothing = FALSE; | 
|  |  | 
|  | /* Allocate memory for input buffer, unless outer application provides it. */ | 
|  | if (standard_buffering) { | 
|  | cinfo->input_buffer = (char *) (*cinfo->emethods->alloc_small) | 
|  | ((size_t) (JPEG_BUF_SIZE + MIN_UNGET)); | 
|  | cinfo->bytes_in_buffer = 0;	/* initialize buffer to empty */ | 
|  | } | 
|  |  | 
|  | /* Install standard buffer-reloading method (outer code may override). */ | 
|  | cinfo->methods->read_jpeg_data = read_jpeg_data; | 
|  |  | 
|  | /* Install default do-nothing progress monitoring method. */ | 
|  | cinfo->methods->progress_monitor = progress_monitor; | 
|  |  | 
|  | /* Install default comment-block processing method. */ | 
|  | cinfo->methods->process_comment = process_comment; | 
|  | } |