1f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 2f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * jcparam.c 3f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 43395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org * This file was part of the Independent JPEG Group's software: 5f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Copyright (C) 1991-1998, Thomas G. Lane. 69862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Modified 2003-2008 by Guido Vollbeding. 73395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org * libjpeg-turbo Modifications: 80ec930ec950c94f0319d5b94a201b7e61ef15130hbono@chromium.org * Copyright (C) 2009-2011, D. R. Commander. 9f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * For conditions of distribution and use, see the accompanying README file. 10f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 11f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This file contains optional default-setting code for the JPEG compressor. 12f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Applications do not have to use this file, but those that don't use it 13f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * must know a lot more about the innards of the JPEG code. 14f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 15f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 16f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define JPEG_INTERNALS 17f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jinclude.h" 18f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jpeglib.h" 19f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 20f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 21f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 22f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Quantization table setup routines 23f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 24f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 25f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 26f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl, 27f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org const unsigned int *basic_table, 28f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int scale_factor, boolean force_baseline) 29f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Define a quantization table equal to the basic_table times 30f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * a scale factor (given as a percentage). 31f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * If force_baseline is TRUE, the computed quantization table entries 32f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * are limited to 1..255 for JPEG baseline compatibility. 33f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 34f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 35f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JQUANT_TBL ** qtblptr; 36f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int i; 37f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org long temp; 38f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 39f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Safety check to ensure start_compress not called yet. */ 40f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->global_state != CSTATE_START) 41f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 42f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 43f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS) 44f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl); 45f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 46f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org qtblptr = & cinfo->quant_tbl_ptrs[which_tbl]; 47f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 48f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (*qtblptr == NULL) 49f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo); 50f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 51f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 0; i < DCTSIZE2; i++) { 52f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp = ((long) basic_table[i] * scale_factor + 50L) / 100L; 53f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* limit the values to the valid range */ 54f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (temp <= 0L) temp = 1L; 55f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */ 56f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (force_baseline && temp > 255L) 57f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp = 255L; /* limit to baseline range if requested */ 58f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*qtblptr)->quantval[i] = (UINT16) temp; 59f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 60f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 61f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize sent_table FALSE so table will be written to JPEG file. */ 62f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*qtblptr)->sent_table = FALSE; 63f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 64f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 65f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 669862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/* These are the sample quantization tables given in JPEG spec section K.1. 679862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * The spec says that the values given produce "good" quality, and 689862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * when divided by 2, "very good" quality. 699862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */ 709862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgstatic const unsigned int std_luminance_quant_tbl[DCTSIZE2] = { 719862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 16, 11, 10, 16, 24, 40, 51, 61, 729862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 12, 12, 14, 19, 26, 58, 60, 55, 739862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 14, 13, 16, 24, 40, 57, 69, 56, 749862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 14, 17, 22, 29, 51, 87, 80, 62, 759862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 18, 22, 37, 56, 68, 109, 103, 77, 769862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 24, 35, 55, 64, 81, 104, 113, 92, 779862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 49, 64, 78, 87, 103, 121, 120, 101, 789862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 72, 92, 95, 98, 112, 100, 103, 99 799862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org}; 809862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgstatic const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = { 819862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 17, 18, 24, 47, 99, 99, 99, 99, 829862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 18, 21, 26, 66, 99, 99, 99, 99, 839862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 24, 26, 56, 99, 99, 99, 99, 99, 849862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 47, 66, 99, 99, 99, 99, 99, 99, 859862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 99, 99, 99, 99, 99, 99, 99, 99, 869862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 99, 99, 99, 99, 99, 99, 99, 99, 879862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 99, 99, 99, 99, 99, 99, 99, 99, 889862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 99, 99, 99, 99, 99, 99, 99, 99 899862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org}; 909862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 919862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 929862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#if JPEG_LIB_VERSION >= 70 939862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgGLOBAL(void) 949862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgjpeg_default_qtables (j_compress_ptr cinfo, boolean force_baseline) 959862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/* Set or change the 'quality' (quantization) setting, using default tables 969862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * and straight percentage-scaling quality scales. 979862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * This entry point allows different scalings for luminance and chrominance. 989862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */ 999862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org{ 1009862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org /* Set up two quantization tables using the specified scaling */ 1019862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl, 1029862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org cinfo->q_scale_factor[0], force_baseline); 1039862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl, 1049862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org cinfo->q_scale_factor[1], force_baseline); 1059862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org} 1069862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#endif 1079862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 1089862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 109f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 110f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor, 111f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org boolean force_baseline) 112f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Set or change the 'quality' (quantization) setting, using default tables 113f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * and a straight percentage-scaling quality scale. In most cases it's better 114f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * to use jpeg_set_quality (below); this entry point is provided for 115f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * applications that insist on a linear percentage scaling. 116f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 117f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 118f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Set up two quantization tables using the specified scaling */ 119f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl, 120f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scale_factor, force_baseline); 121f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl, 122f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scale_factor, force_baseline); 123f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 124f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 125f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 126f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(int) 127f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_quality_scaling (int quality) 128f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Convert a user-specified quality rating to a percentage scaling factor 129f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * for an underlying quantization table, using our recommended scaling curve. 130f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * The input 'quality' factor should be 0 (terrible) to 100 (very good). 131f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 132f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 133f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */ 134f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (quality <= 0) quality = 1; 135f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (quality > 100) quality = 100; 136f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 137f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* The basic table is used as-is (scaling 100) for a quality of 50. 138f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Qualities 50..100 are converted to scaling percentage 200 - 2*Q; 139f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table 140f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * to make all the table entries 1 (hence, minimum quantization loss). 141f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Qualities 1..50 are converted to scaling percentage 5000/Q. 142f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 143f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (quality < 50) 144f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org quality = 5000 / quality; 145f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else 146f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org quality = 200 - quality*2; 147f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 148f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return quality; 149f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 150f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 151f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 152f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 153f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline) 154f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Set or change the 'quality' (quantization) setting, using default tables. 155f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This is the standard quality-adjusting entry point for typical user 156f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * interfaces; only those who want detailed control over quantization tables 157f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * would use the preceding three routines directly. 158f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 159f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 160f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Convert user 0-100 rating to percentage scaling */ 161f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org quality = jpeg_quality_scaling(quality); 162f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 163f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Set up standard quality tables */ 164f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_set_linear_quality(cinfo, quality, force_baseline); 165f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 166f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 167f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 168f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 169f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Huffman table setup routines 170f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 171f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 172f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(void) 173f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgadd_huff_table (j_compress_ptr cinfo, 174f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val) 175f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Define a Huffman table */ 176f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 177f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int nsymbols, len; 178f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 179f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (*htblptr == NULL) 180f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); 181f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 182f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Copy the number-of-symbols-of-each-code-length counts */ 183f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); 184f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 185f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Validate the counts. We do this here mainly so we can copy the right 186f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * number of symbols from the val[] array, without risking marching off 187f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * the end of memory. jchuff.c will do a more thorough test later. 188f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 189f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org nsymbols = 0; 190f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (len = 1; len <= 16; len++) 191f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org nsymbols += bits[len]; 192f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (nsymbols < 1 || nsymbols > 256) 193f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); 194f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 195f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8)); 196f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 197f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize sent_table FALSE so table will be written to JPEG file. */ 198f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*htblptr)->sent_table = FALSE; 199f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 200f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 201f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 202f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(void) 203f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgstd_huff_tables (j_compress_ptr cinfo) 204f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ 205f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* IMPORTANT: these are only valid for 8-bit data precision! */ 206f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 207f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org static const UINT8 bits_dc_luminance[17] = 208f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; 209f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org static const UINT8 val_dc_luminance[] = 210f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; 211f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 212f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org static const UINT8 bits_dc_chrominance[17] = 213f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; 214f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org static const UINT8 val_dc_chrominance[] = 215f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; 216f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 217f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org static const UINT8 bits_ac_luminance[17] = 218f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; 219f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org static const UINT8 val_ac_luminance[] = 220f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 221f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 222f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 223f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 224f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 225f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 226f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 227f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 228f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 229f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 230f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 231f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 232f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 233f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 234f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 235f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 236f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 237f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 238f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 239f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 240f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xf9, 0xfa }; 241f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 242f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org static const UINT8 bits_ac_chrominance[17] = 243f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; 244f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org static const UINT8 val_ac_chrominance[] = 245f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 246f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 247f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 248f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 249f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 250f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 251f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 252f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 253f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 254f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 255f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 256f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 257f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 258f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 259f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 260f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 261f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 262f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 263f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 264f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 265f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0xf9, 0xfa }; 266f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 267f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0], 268f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bits_dc_luminance, val_dc_luminance); 269f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0], 270f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bits_ac_luminance, val_ac_luminance); 271f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1], 272f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bits_dc_chrominance, val_dc_chrominance); 273f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1], 274f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bits_ac_chrominance, val_ac_chrominance); 275f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 276f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 277f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 278f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 279f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Default parameter setup for compression. 280f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 281f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Applications that don't choose to use this routine must do their 282f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * own setup of all these parameters. Alternately, you can call this 283f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * to establish defaults and then alter parameters selectively. This 284f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * is the recommended approach since, if we add any new parameters, 285f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * your code will still work (they'll be set to reasonable defaults). 286f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 287f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 288f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 289f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_set_defaults (j_compress_ptr cinfo) 290f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 291f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int i; 292f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 293f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Safety check to ensure start_compress not called yet. */ 294f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->global_state != CSTATE_START) 295f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 296f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 297f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Allocate comp_info array large enough for maximum component count. 298f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Array is made permanent in case application wants to compress 299f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * multiple images at same param settings. 300f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 301f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->comp_info == NULL) 302f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->comp_info = (jpeg_component_info *) 303f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, 304f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org MAX_COMPONENTS * SIZEOF(jpeg_component_info)); 305f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 306f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize everything not dependent on the color space */ 307f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 3089862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#if JPEG_LIB_VERSION >= 70 3099862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org cinfo->scale_num = 1; /* 1:1 scaling */ 3109862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org cinfo->scale_denom = 1; 3119862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#endif 312f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->data_precision = BITS_IN_JSAMPLE; 313f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Set up two quantization tables using default quality of 75 */ 314f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_set_quality(cinfo, 75, TRUE); 315f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Set up two Huffman tables */ 316f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org std_huff_tables(cinfo); 317f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 318f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize default arithmetic coding conditioning */ 319f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 0; i < NUM_ARITH_TBLS; i++) { 320f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->arith_dc_L[i] = 0; 321f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->arith_dc_U[i] = 1; 322f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->arith_ac_K[i] = 5; 323f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 324f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 325f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Default is no multiple-scan output */ 326f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->scan_info = NULL; 327f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->num_scans = 0; 328f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 329f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Expect normal source image, not raw downsampled data */ 330f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->raw_data_in = FALSE; 331f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 332f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Use Huffman coding, not arithmetic coding, by default */ 333f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->arith_code = FALSE; 334f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 335f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* By default, don't do extra passes to optimize entropy coding */ 336f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->optimize_coding = FALSE; 337f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* The standard Huffman tables are only valid for 8-bit data precision. 338f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * If the precision is higher, force optimization on so that usable 339f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * tables will be computed. This test can be removed if default tables 340f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * are supplied that are valid for the desired precision. 341f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 342f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->data_precision > 8) 343f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->optimize_coding = TRUE; 344f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 345f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* By default, use the simpler non-cosited sampling alignment */ 346f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->CCIR601_sampling = FALSE; 347f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 3489862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#if JPEG_LIB_VERSION >= 70 3499862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org /* By default, apply fancy downsampling */ 3509862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org cinfo->do_fancy_downsampling = TRUE; 3519862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#endif 3529862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 353f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* No input smoothing */ 354f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->smoothing_factor = 0; 355f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 356f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* DCT algorithm preference */ 357f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->dct_method = JDCT_DEFAULT; 358f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 359f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* No restart markers */ 360f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->restart_interval = 0; 361f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->restart_in_rows = 0; 362f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 363f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Fill in default JFIF marker parameters. Note that whether the marker 364f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * will actually be written is determined by jpeg_set_colorspace. 365f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 366f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * By default, the library emits JFIF version code 1.01. 367f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * An application that wants to emit JFIF 1.02 extension markers should set 368f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * JFIF_minor_version to 2. We could probably get away with just defaulting 369f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * to 1.02, but there may still be some decoders in use that will complain 370f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * about that; saying 1.01 should minimize compatibility problems. 371f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 372f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */ 373f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->JFIF_minor_version = 1; 374f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->density_unit = 0; /* Pixel size is unknown by default */ 375f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->X_density = 1; /* Pixel aspect ratio is square by default */ 376f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->Y_density = 1; 377f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 378f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Choose JPEG colorspace based on input space, set defaults accordingly */ 379f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 380f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_default_colorspace(cinfo); 381f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 382f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 383f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 384f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 385f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Select an appropriate JPEG colorspace for in_color_space. 386f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 387f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 388f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 389f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_default_colorspace (j_compress_ptr cinfo) 390f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 391f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org switch (cinfo->in_color_space) { 392f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_GRAYSCALE: 393f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); 394f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 395f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_RGB: 396f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_EXT_RGB: 397f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_EXT_RGBX: 398f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_EXT_BGR: 399f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_EXT_BGRX: 400f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_EXT_XBGR: 401f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_EXT_XRGB: 4020ec930ec950c94f0319d5b94a201b7e61ef15130hbono@chromium.org case JCS_EXT_RGBA: 4030ec930ec950c94f0319d5b94a201b7e61ef15130hbono@chromium.org case JCS_EXT_BGRA: 4040ec930ec950c94f0319d5b94a201b7e61ef15130hbono@chromium.org case JCS_EXT_ABGR: 4050ec930ec950c94f0319d5b94a201b7e61ef15130hbono@chromium.org case JCS_EXT_ARGB: 406f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_set_colorspace(cinfo, JCS_YCbCr); 407f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 408f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_YCbCr: 409f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_set_colorspace(cinfo, JCS_YCbCr); 410f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 411f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_CMYK: 412f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */ 413f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 414f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_YCCK: 415f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_set_colorspace(cinfo, JCS_YCCK); 416f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 417f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_UNKNOWN: 418f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_set_colorspace(cinfo, JCS_UNKNOWN); 419f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 420f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org default: 421f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); 422f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 423f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 424f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 425f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 426f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 427f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Set the JPEG colorspace, and choose colorspace-dependent default values. 428f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 429f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 430f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 431f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace) 432f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 433f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_component_info * compptr; 434f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int ci; 435f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 436f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl) \ 437f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (compptr = &cinfo->comp_info[index], \ 438f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr->component_id = (id), \ 439f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr->h_samp_factor = (hsamp), \ 440f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr->v_samp_factor = (vsamp), \ 441f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr->quant_tbl_no = (quant), \ 442f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr->dc_tbl_no = (dctbl), \ 443f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr->ac_tbl_no = (actbl) ) 444f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 445f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Safety check to ensure start_compress not called yet. */ 446f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->global_state != CSTATE_START) 447f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 448f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 449f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* For all colorspaces, we use Q and Huff tables 0 for luminance components, 450f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * tables 1 for chrominance components. 451f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 452f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 453f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->jpeg_color_space = colorspace; 454f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 455f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */ 456f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */ 457f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 458f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org switch (colorspace) { 459f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_GRAYSCALE: 460f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */ 461f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->num_components = 1; 462f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* JFIF specifies component ID 1 */ 463f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(0, 1, 1,1, 0, 0,0); 464f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 465f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_RGB: 466f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */ 467f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->num_components = 3; 468f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0); 469f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0); 470f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0); 471f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 472f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_YCbCr: 473f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */ 474f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->num_components = 3; 475f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* JFIF specifies component IDs 1,2,3 */ 476f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* We default to 2x2 subsamples of chrominance */ 477f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(0, 1, 2,2, 0, 0,0); 478f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(1, 2, 1,1, 1, 1,1); 479f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(2, 3, 1,1, 1, 1,1); 480f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 481f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_CMYK: 482f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */ 483f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->num_components = 4; 484f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0); 485f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0); 486f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0); 487f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0); 488f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 489f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_YCCK: 490f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */ 491f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->num_components = 4; 492f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(0, 1, 2,2, 0, 0,0); 493f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(1, 2, 1,1, 1, 1,1); 494f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(2, 3, 1,1, 1, 1,1); 495f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(3, 4, 2,2, 0, 0,0); 496f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 497f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case JCS_UNKNOWN: 498f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->num_components = cinfo->input_components; 499f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS) 500f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, 501f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org MAX_COMPONENTS); 502f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (ci = 0; ci < cinfo->num_components; ci++) { 503f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SET_COMP(ci, ci, 1,1, 0, 0,0); 504f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 505f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 506f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org default: 507f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); 508f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 509f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 510f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 511f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 512f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#ifdef C_PROGRESSIVE_SUPPORTED 513f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 514f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(jpeg_scan_info *) 515f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgfill_a_scan (jpeg_scan_info * scanptr, int ci, 516f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int Ss, int Se, int Ah, int Al) 517f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Support routine: generate one scan for specified component */ 518f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 519f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->comps_in_scan = 1; 520f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->component_index[0] = ci; 521f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->Ss = Ss; 522f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->Se = Se; 523f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->Ah = Ah; 524f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->Al = Al; 525f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr++; 526f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return scanptr; 527f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 528f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 529f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(jpeg_scan_info *) 530f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgfill_scans (jpeg_scan_info * scanptr, int ncomps, 531f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int Ss, int Se, int Ah, int Al) 532f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Support routine: generate one scan for each component */ 533f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 534f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int ci; 535f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 536f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (ci = 0; ci < ncomps; ci++) { 537f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->comps_in_scan = 1; 538f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->component_index[0] = ci; 539f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->Ss = Ss; 540f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->Se = Se; 541f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->Ah = Ah; 542f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->Al = Al; 543f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr++; 544f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 545f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return scanptr; 546f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 547f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 548f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(jpeg_scan_info *) 549f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgfill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al) 550f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Support routine: generate interleaved DC scan if possible, else N scans */ 551f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 552f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int ci; 553f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 554f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (ncomps <= MAX_COMPS_IN_SCAN) { 555f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Single interleaved DC scan */ 556f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->comps_in_scan = ncomps; 557f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (ci = 0; ci < ncomps; ci++) 558f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->component_index[ci] = ci; 559f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->Ss = scanptr->Se = 0; 560f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->Ah = Ah; 561f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr->Al = Al; 562f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr++; 563f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 564f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Noninterleaved DC scan for each component */ 565f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al); 566f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 567f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return scanptr; 568f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 569f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 570f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 571f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 572f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Create a recommended progressive-JPEG script. 573f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * cinfo->num_components and cinfo->jpeg_color_space must be correct. 574f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 575f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 576f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 577f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_simple_progression (j_compress_ptr cinfo) 578f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 579f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int ncomps = cinfo->num_components; 580f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int nscans; 581f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_scan_info * scanptr; 582f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 583f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Safety check to ensure start_compress not called yet. */ 584f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->global_state != CSTATE_START) 585f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 586f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 587f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Figure space needed for script. Calculation must match code below! */ 588f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { 589f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Custom script for YCbCr color images. */ 590f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org nscans = 10; 591f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 592f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* All-purpose script for other color spaces. */ 593f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (ncomps > MAX_COMPS_IN_SCAN) 594f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org nscans = 6 * ncomps; /* 2 DC + 4 AC scans per component */ 595f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else 596f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org nscans = 2 + 4 * ncomps; /* 2 DC scans; 4 AC scans per component */ 597f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 598f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 599f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Allocate space for script. 600f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * We need to put it in the permanent pool in case the application performs 601f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * multiple compressions without changing the settings. To avoid a memory 602f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * leak if jpeg_simple_progression is called repeatedly for the same JPEG 603f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * object, we try to re-use previously allocated space, and we allocate 604f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * enough space to handle YCbCr even if initially asked for grayscale. 605f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 606f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) { 607f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->script_space_size = MAX(nscans, 10); 608f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->script_space = (jpeg_scan_info *) 609f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, 610f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->script_space_size * SIZEOF(jpeg_scan_info)); 611f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 612f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = cinfo->script_space; 613f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->scan_info = scanptr; 614f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->num_scans = nscans; 615f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 616f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { 617f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Custom script for YCbCr color images. */ 618f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initial DC scan */ 619f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_dc_scans(scanptr, ncomps, 0, 1); 620f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initial AC scan: get some luma data out in a hurry */ 621f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2); 622f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Chroma data is too small to be worth expending many scans on */ 623f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1); 624f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1); 625f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Complete spectral selection for luma AC */ 626f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2); 627f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Refine next bit of luma AC */ 628f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1); 629f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Finish DC successive approximation */ 630f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_dc_scans(scanptr, ncomps, 1, 0); 631f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Finish AC successive approximation */ 632f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0); 633f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0); 634f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Luma bottom bit comes last since it's usually largest scan */ 635f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0); 636f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 637f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* All-purpose script for other color spaces. */ 638f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Successive approximation first pass */ 639f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_dc_scans(scanptr, ncomps, 0, 1); 640f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2); 641f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2); 642f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Successive approximation second pass */ 643f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1); 644f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Successive approximation final pass */ 645f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_dc_scans(scanptr, ncomps, 1, 0); 646f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0); 647f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 648f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 649f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 650f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#endif /* C_PROGRESSIVE_SUPPORTED */ 651