diff options
author | Thomas G. Lane <tgl@netcom.com> | 1991-10-07 00:00:00 +0000 |
---|---|---|
committer | DRC <information@libjpeg-turbo.org> | 2015-07-29 15:18:11 -0500 |
commit | 2cbeb8abd92d5ad8a1bd415b51b3816213b15f31 (patch) | |
tree | 1d154fe137ed58037b3004b593dec05063896dd6 /jquant2.c |
The Independent JPEG Group's JPEG software v1
Diffstat (limited to 'jquant2.c')
-rw-r--r-- | jquant2.c | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/jquant2.c b/jquant2.c new file mode 100644 index 0000000..2569b20 --- /dev/null +++ b/jquant2.c @@ -0,0 +1,122 @@ +/* + * jquant2.c + * + * Copyright (C) 1991, 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 2-pass color quantization (color mapping) routines. + * These routines are invoked via the methods color_quant_prescan, + * color_quant_doit, and color_quant_init/term. + */ + +#include "jinclude.h" + +#ifdef QUANT_2PASS_SUPPORTED + + +/* + * Initialize for two-pass color quantization. + */ + +METHODDEF void +color_quant_init (decompress_info_ptr cinfo) +{ + TRACEMS(cinfo->emethods, 1, "color_quant_init 2 pass"); +} + + +/* + * Prescan some rows of pixels. + * Note: this could change the data being written into the big image array, + * if there were any benefit to doing so. The doit routine is not allowed + * to modify the big image array, because the memory manager is not required + * to support multiple write passes on a big image. + */ + +METHODDEF void +color_quant_prescan (decompress_info_ptr cinfo, int num_rows, + JSAMPIMAGE image_data) +{ + TRACEMS1(cinfo->emethods, 2, "color_quant_prescan %d rows", num_rows); +} + + +/* + * This routine makes the final pass over the image data. + * output_workspace is a one-component array of pixel dimensions at least + * as large as the input image strip; it can be used to hold the converted + * pixels' colormap indexes. + */ + +METHODDEF void +final_pass (decompress_info_ptr cinfo, int num_rows, + JSAMPIMAGE image_data, JSAMPARRAY output_workspace) +{ + TRACEMS1(cinfo->emethods, 2, "final_pass %d rows", num_rows); + /* for debug purposes, just emit input data */ + /* NB: this only works for PPM output */ + (*cinfo->methods->put_pixel_rows) (cinfo, num_rows, image_data); +} + + +/* + * Perform two-pass quantization: rescan the image data and output the + * converted data via put_color_map and put_pixel_rows. + * The source_method is a routine that can scan the image data; it can + * be called as many times as desired. The processing routine called by + * source_method has the same interface as color_quantize does in the + * one-pass case, except it must call put_pixel_rows itself. (This allows + * me to use multiple passes in which earlier passes don't output anything.) + */ + +METHODDEF void +color_quant_doit (decompress_info_ptr cinfo, quantize_caller_ptr source_method) +{ + TRACEMS(cinfo->emethods, 1, "color_quant_doit 2 pass"); + (*source_method) (cinfo, final_pass); +} + + +/* + * Finish up at the end of the file. + */ + +METHODDEF void +color_quant_term (decompress_info_ptr cinfo) +{ + TRACEMS(cinfo->emethods, 1, "color_quant_term 2 pass"); +} + + +/* + * Map some rows of pixels to the output colormapped representation. + * Not used in two-pass case. + */ + +METHODDEF void +color_quantize (decompress_info_ptr cinfo, int num_rows, + JSAMPIMAGE input_data, JSAMPARRAY output_data) +{ + ERREXIT(cinfo->emethods, "Should not get here!"); +} + + +/* + * The method selection routine for 2-pass color quantization. + */ + +GLOBAL void +jsel2quantize (decompress_info_ptr cinfo) +{ + if (cinfo->two_pass_quantize) { + /* just one alternative for the moment */ + cinfo->methods->color_quant_init = color_quant_init; + cinfo->methods->color_quant_prescan = color_quant_prescan; + cinfo->methods->color_quant_doit = color_quant_doit; + cinfo->methods->color_quant_term = color_quant_term; + cinfo->methods->color_quantize = color_quantize; + } +} + +#endif /* QUANT_2PASS_SUPPORTED */ |