170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jcparam.c 370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Copyright (C) 1991-1998, Thomas G. Lane. 570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file is part of the Independent JPEG Group's software. 670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For conditions of distribution and use, see the accompanying README file. 770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file contains optional default-setting code for the JPEG compressor. 970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Applications do not have to use this file, but those that don't use it 1070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * must know a lot more about the innards of the JPEG code. 1170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 1270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 1370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define JPEG_INTERNALS 1470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jinclude.h" 1570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jpeglib.h" 1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Quantization table setup routines 2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void) 2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl, 2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine const unsigned int *basic_table, 2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int scale_factor, boolean force_baseline) 2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Define a quantization table equal to the basic_table times 2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * a scale factor (given as a percentage). 2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * If force_baseline is TRUE, the computed quantization table entries 2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * are limited to 1..255 for JPEG baseline compatibility. 3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JQUANT_TBL ** qtblptr; 3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int i; 3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine long temp; 3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Safety check to ensure start_compress not called yet. */ 3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->global_state != CSTATE_START) 3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS) 4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl); 4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine qtblptr = & cinfo->quant_tbl_ptrs[which_tbl]; 4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (*qtblptr == NULL) 4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo); 4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (i = 0; i < DCTSIZE2; i++) { 4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine temp = ((long) basic_table[i] * scale_factor + 50L) / 100L; 5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* limit the values to the valid range */ 5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (temp <= 0L) temp = 1L; 5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */ 5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (force_baseline && temp > 255L) 5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine temp = 255L; /* limit to baseline range if requested */ 5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*qtblptr)->quantval[i] = (UINT16) temp; 5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Initialize sent_table FALSE so table will be written to JPEG file. */ 5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*qtblptr)->sent_table = FALSE; 6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void) 6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor, 6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine boolean force_baseline) 6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Set or change the 'quality' (quantization) setting, using default tables 6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * and a straight percentage-scaling quality scale. In most cases it's better 6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * to use jpeg_set_quality (below); this entry point is provided for 6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * applications that insist on a linear percentage scaling. 7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* These are the sample quantization tables given in JPEG spec section K.1. 7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The spec says that the values given produce "good" quality, and 7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * when divided by 2, "very good" quality. 7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = { 7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 16, 11, 10, 16, 24, 40, 51, 61, 7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12, 12, 14, 19, 26, 58, 60, 55, 7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 14, 13, 16, 24, 40, 57, 69, 56, 8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 14, 17, 22, 29, 51, 87, 80, 62, 8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 18, 22, 37, 56, 68, 109, 103, 77, 8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 24, 35, 55, 64, 81, 104, 113, 92, 8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 49, 64, 78, 87, 103, 121, 120, 101, 8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 72, 92, 95, 98, 112, 100, 103, 99 8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine }; 8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = { 8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 17, 18, 24, 47, 99, 99, 99, 99, 8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 18, 21, 26, 66, 99, 99, 99, 99, 8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 24, 26, 56, 99, 99, 99, 99, 99, 9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 47, 66, 99, 99, 99, 99, 99, 99, 9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 99, 99, 99, 99, 99, 99, 99, 99, 9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 99, 99, 99, 99, 99, 99, 99, 99, 9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 99, 99, 99, 99, 99, 99, 99, 99, 9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 99, 99, 99, 99, 99, 99, 99, 99 9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine }; 9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Set up two quantization tables using the specified scaling */ 9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl, 9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scale_factor, force_baseline); 10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl, 10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scale_factor, force_baseline); 10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(int) 10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_quality_scaling (int quality) 10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Convert a user-specified quality rating to a percentage scaling factor 10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * for an underlying quantization table, using our recommended scaling curve. 10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The input 'quality' factor should be 0 (terrible) to 100 (very good). 11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */ 11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (quality <= 0) quality = 1; 11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (quality > 100) quality = 100; 11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* The basic table is used as-is (scaling 100) for a quality of 50. 11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Qualities 50..100 are converted to scaling percentage 200 - 2*Q; 11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table 11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * to make all the table entries 1 (hence, minimum quantization loss). 12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Qualities 1..50 are converted to scaling percentage 5000/Q. 12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (quality < 50) 12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine quality = 5000 / quality; 12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else 12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine quality = 200 - quality*2; 12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return quality; 12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void) 13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline) 13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Set or change the 'quality' (quantization) setting, using default tables. 13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This is the standard quality-adjusting entry point for typical user 13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * interfaces; only those who want detailed control over quantization tables 13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * would use the preceding three routines directly. 13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Convert user 0-100 rating to percentage scaling */ 14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine quality = jpeg_quality_scaling(quality); 14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Set up standard quality tables */ 14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_set_linear_quality(cinfo, quality, force_baseline); 14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Huffman table setup routines 14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void) 15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineadd_huff_table (j_compress_ptr cinfo, 15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val) 15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Define a Huffman table */ 15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int nsymbols, len; 15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (*htblptr == NULL) 15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); 16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Copy the number-of-symbols-of-each-code-length counts */ 16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); 16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Validate the counts. We do this here mainly so we can copy the right 16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * number of symbols from the val[] array, without risking marching off 16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * the end of memory. jchuff.c will do a more thorough test later. 16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine nsymbols = 0; 16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (len = 1; len <= 16; len++) 17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine nsymbols += bits[len]; 17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (nsymbols < 1 || nsymbols > 256) 17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); 17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8)); 17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 17670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Initialize sent_table FALSE so table will be written to JPEG file. */ 17770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*htblptr)->sent_table = FALSE; 17870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 17970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 18070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 18170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void) 18270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestd_huff_tables (j_compress_ptr cinfo) 18370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ 18470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* IMPORTANT: these are only valid for 8-bit data precision! */ 18570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 18670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine static const UINT8 bits_dc_luminance[17] = 18770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; 18870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine static const UINT8 val_dc_luminance[] = 18970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; 19070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 19170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine static const UINT8 bits_dc_chrominance[17] = 19270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; 19370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine static const UINT8 val_dc_chrominance[] = 19470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; 19570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 19670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine static const UINT8 bits_ac_luminance[17] = 19770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; 19870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine static const UINT8 val_ac_luminance[] = 19970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 20070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 20170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 20270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 20370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 20470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 20570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 20670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 20770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 20870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 20970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 21070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 21170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 21270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 21370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 21470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 21570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 21670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 21770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 21870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 21970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xf9, 0xfa }; 22070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 22170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine static const UINT8 bits_ac_chrominance[17] = 22270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; 22370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine static const UINT8 val_ac_chrominance[] = 22470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 22570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 22670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 22770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 22870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 22970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 23070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 23170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 23270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 23370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 23470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 23570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 23670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 23770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 23870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 23970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 24070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 24170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 24270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 24370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 24470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0xf9, 0xfa }; 24570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 24670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0], 24770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bits_dc_luminance, val_dc_luminance); 24870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0], 24970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bits_ac_luminance, val_ac_luminance); 25070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1], 25170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bits_dc_chrominance, val_dc_chrominance); 25270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1], 25370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bits_ac_chrominance, val_ac_chrominance); 25470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 25570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 25670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 25770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 25870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Default parameter setup for compression. 25970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 26070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Applications that don't choose to use this routine must do their 26170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * own setup of all these parameters. Alternately, you can call this 26270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * to establish defaults and then alter parameters selectively. This 26370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * is the recommended approach since, if we add any new parameters, 26470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * your code will still work (they'll be set to reasonable defaults). 26570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 26670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 26770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void) 26870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_set_defaults (j_compress_ptr cinfo) 26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int i; 27170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 27270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Safety check to ensure start_compress not called yet. */ 27370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->global_state != CSTATE_START) 27470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 27570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 27670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Allocate comp_info array large enough for maximum component count. 27770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Array is made permanent in case application wants to compress 27870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * multiple images at same param settings. 27970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 28070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->comp_info == NULL) 28170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->comp_info = (jpeg_component_info *) 28270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, 28370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine MAX_COMPONENTS * SIZEOF(jpeg_component_info)); 28470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 28570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Initialize everything not dependent on the color space */ 28670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 28770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->data_precision = BITS_IN_JSAMPLE; 28870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Set up two quantization tables using default quality of 75 */ 28970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_set_quality(cinfo, 75, TRUE); 29070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Set up two Huffman tables */ 29170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine std_huff_tables(cinfo); 29270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 29370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Initialize default arithmetic coding conditioning */ 29470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (i = 0; i < NUM_ARITH_TBLS; i++) { 29570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->arith_dc_L[i] = 0; 29670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->arith_dc_U[i] = 1; 29770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->arith_ac_K[i] = 5; 29870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 29970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Default is no multiple-scan output */ 30170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->scan_info = NULL; 30270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->num_scans = 0; 30370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Expect normal source image, not raw downsampled data */ 30570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->raw_data_in = FALSE; 30670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Use Huffman coding, not arithmetic coding, by default */ 30870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->arith_code = FALSE; 30970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 31070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* By default, don't do extra passes to optimize entropy coding */ 31170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->optimize_coding = FALSE; 31270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* The standard Huffman tables are only valid for 8-bit data precision. 31370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * If the precision is higher, force optimization on so that usable 31470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * tables will be computed. This test can be removed if default tables 31570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * are supplied that are valid for the desired precision. 31670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 31770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->data_precision > 8) 31870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->optimize_coding = TRUE; 31970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 32070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* By default, use the simpler non-cosited sampling alignment */ 32170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->CCIR601_sampling = FALSE; 32270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 32370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* No input smoothing */ 32470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->smoothing_factor = 0; 32570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 32670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* DCT algorithm preference */ 32770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->dct_method = JDCT_DEFAULT; 32870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 32970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* No restart markers */ 33070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->restart_interval = 0; 33170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->restart_in_rows = 0; 33270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 33370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Fill in default JFIF marker parameters. Note that whether the marker 33470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * will actually be written is determined by jpeg_set_colorspace. 33570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 33670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * By default, the library emits JFIF version code 1.01. 33770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * An application that wants to emit JFIF 1.02 extension markers should set 33870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * JFIF_minor_version to 2. We could probably get away with just defaulting 33970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * to 1.02, but there may still be some decoders in use that will complain 34070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * about that; saying 1.01 should minimize compatibility problems. 34170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 34270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */ 34370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->JFIF_minor_version = 1; 34470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->density_unit = 0; /* Pixel size is unknown by default */ 34570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->X_density = 1; /* Pixel aspect ratio is square by default */ 34670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->Y_density = 1; 34770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 34870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Choose JPEG colorspace based on input space, set defaults accordingly */ 34970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 35070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_default_colorspace(cinfo); 35170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 35270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 35370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 35470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 35570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Select an appropriate JPEG colorspace for in_color_space. 35670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 35770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 35870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void) 35970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_default_colorspace (j_compress_ptr cinfo) 36070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 36170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch (cinfo->in_color_space) { 36270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JCS_GRAYSCALE: 36370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); 36470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 36570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JCS_RGB: 36670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_set_colorspace(cinfo, JCS_YCbCr); 36770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 36870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JCS_YCbCr: 36970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_set_colorspace(cinfo, JCS_YCbCr); 37070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 37170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JCS_CMYK: 37270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */ 37370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 37470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JCS_YCCK: 37570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_set_colorspace(cinfo, JCS_YCCK); 37670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 37770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JCS_UNKNOWN: 37870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_set_colorspace(cinfo, JCS_UNKNOWN); 37970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 3804a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine#ifdef ANDROID_RGB 3814a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine case JCS_RGB_565: 3821a820e90d8848c6b0ac7c78b5a2e8b28c9738a3aVladimir Chtchetkine case JCS_RGBA_8888: 3834a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine jpeg_set_colorspace(cinfo, JCS_YCbCr); 3844a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine break; 3854a795dda3d916c591206d2c37d6b583098204108Vladimir Chtchetkine#endif /* ANDROID_RGB */ 38670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: 38770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); 38870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 38970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 39070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 39170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 39270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 39370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Set the JPEG colorspace, and choose colorspace-dependent default values. 39470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 39570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 39670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void) 39770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace) 39870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 39970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_component_info * compptr; 40070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int ci; 40170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 40270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl) \ 40370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (compptr = &cinfo->comp_info[index], \ 40470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine compptr->component_id = (id), \ 40570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine compptr->h_samp_factor = (hsamp), \ 40670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine compptr->v_samp_factor = (vsamp), \ 40770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine compptr->quant_tbl_no = (quant), \ 40870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine compptr->dc_tbl_no = (dctbl), \ 40970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine compptr->ac_tbl_no = (actbl) ) 41070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 41170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Safety check to ensure start_compress not called yet. */ 41270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->global_state != CSTATE_START) 41370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 41470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 41570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* For all colorspaces, we use Q and Huff tables 0 for luminance components, 41670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * tables 1 for chrominance components. 41770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 41870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 41970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->jpeg_color_space = colorspace; 42070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 42170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */ 42270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */ 42370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 42470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch (colorspace) { 42570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JCS_GRAYSCALE: 42670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */ 42770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->num_components = 1; 42870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* JFIF specifies component ID 1 */ 42970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(0, 1, 1,1, 0, 0,0); 43070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 43170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JCS_RGB: 43270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */ 43370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->num_components = 3; 43470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0); 43570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0); 43670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0); 43770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 43870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JCS_YCbCr: 43970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */ 44070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->num_components = 3; 44170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* JFIF specifies component IDs 1,2,3 */ 44270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* We default to 2x2 subsamples of chrominance */ 44370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(0, 1, 2,2, 0, 0,0); 44470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(1, 2, 1,1, 1, 1,1); 44570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(2, 3, 1,1, 1, 1,1); 44670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 44770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JCS_CMYK: 44870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */ 44970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->num_components = 4; 45070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0); 45170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0); 45270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0); 45370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0); 45470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 45570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JCS_YCCK: 45670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */ 45770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->num_components = 4; 45870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(0, 1, 2,2, 0, 0,0); 45970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(1, 2, 1,1, 1, 1,1); 46070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(2, 3, 1,1, 1, 1,1); 46170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(3, 4, 2,2, 0, 0,0); 46270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 46370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JCS_UNKNOWN: 46470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->num_components = cinfo->input_components; 46570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS) 46670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, 46770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine MAX_COMPONENTS); 46870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0; ci < cinfo->num_components; ci++) { 46970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SET_COMP(ci, ci, 1,1, 0, 0,0); 47070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 47170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 47270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: 47370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); 47470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 47570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 47670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 47770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 47870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef C_PROGRESSIVE_SUPPORTED 47970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 48070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(jpeg_scan_info *) 48170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinefill_a_scan (jpeg_scan_info * scanptr, int ci, 48270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int Ss, int Se, int Ah, int Al) 48370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Support routine: generate one scan for specified component */ 48470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 48570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->comps_in_scan = 1; 48670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->component_index[0] = ci; 48770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Ss = Ss; 48870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Se = Se; 48970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Ah = Ah; 49070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Al = Al; 49170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr++; 49270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return scanptr; 49370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 49470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 49570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(jpeg_scan_info *) 49670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinefill_scans (jpeg_scan_info * scanptr, int ncomps, 49770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int Ss, int Se, int Ah, int Al) 49870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Support routine: generate one scan for each component */ 49970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 50070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int ci; 50170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 50270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0; ci < ncomps; ci++) { 50370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->comps_in_scan = 1; 50470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->component_index[0] = ci; 50570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Ss = Ss; 50670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Se = Se; 50770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Ah = Ah; 50870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Al = Al; 50970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr++; 51070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 51170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return scanptr; 51270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 51370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 51470a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(jpeg_scan_info *) 51570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinefill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al) 51670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Support routine: generate interleaved DC scan if possible, else N scans */ 51770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 51870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int ci; 51970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 52070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (ncomps <= MAX_COMPS_IN_SCAN) { 52170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Single interleaved DC scan */ 52270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->comps_in_scan = ncomps; 52370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0; ci < ncomps; ci++) 52470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->component_index[ci] = ci; 52570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Ss = scanptr->Se = 0; 52670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Ah = Ah; 52770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Al = Al; 52870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr++; 52970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 53070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Noninterleaved DC scan for each component */ 53170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al); 53270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 53370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return scanptr; 53470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 53570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 53670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 53770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 53870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Create a recommended progressive-JPEG script. 53970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * cinfo->num_components and cinfo->jpeg_color_space must be correct. 54070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 54170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 54270a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void) 54370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_simple_progression (j_compress_ptr cinfo) 54470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 54570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int ncomps = cinfo->num_components; 54670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int nscans; 54770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_scan_info * scanptr; 54870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 54970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Safety check to ensure start_compress not called yet. */ 55070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->global_state != CSTATE_START) 55170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 55270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 55370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Figure space needed for script. Calculation must match code below! */ 55470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { 55570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Custom script for YCbCr color images. */ 55670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine nscans = 10; 55770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 55870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* All-purpose script for other color spaces. */ 55970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (ncomps > MAX_COMPS_IN_SCAN) 56070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine nscans = 6 * ncomps; /* 2 DC + 4 AC scans per component */ 56170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else 56270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine nscans = 2 + 4 * ncomps; /* 2 DC scans; 4 AC scans per component */ 56370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 56470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 56570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Allocate space for script. 56670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We need to put it in the permanent pool in case the application performs 56770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * multiple compressions without changing the settings. To avoid a memory 56870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * leak if jpeg_simple_progression is called repeatedly for the same JPEG 56970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * object, we try to re-use previously allocated space, and we allocate 57070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * enough space to handle YCbCr even if initially asked for grayscale. 57170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 57270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) { 57370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->script_space_size = MAX(nscans, 10); 57470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->script_space = (jpeg_scan_info *) 57570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, 57670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->script_space_size * SIZEOF(jpeg_scan_info)); 57770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 57870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = cinfo->script_space; 57970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->scan_info = scanptr; 58070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->num_scans = nscans; 58170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 58270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { 58370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Custom script for YCbCr color images. */ 58470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Initial DC scan */ 58570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_dc_scans(scanptr, ncomps, 0, 1); 58670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Initial AC scan: get some luma data out in a hurry */ 58770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2); 58870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Chroma data is too small to be worth expending many scans on */ 58970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1); 59070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1); 59170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Complete spectral selection for luma AC */ 59270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2); 59370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Refine next bit of luma AC */ 59470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1); 59570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Finish DC successive approximation */ 59670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_dc_scans(scanptr, ncomps, 1, 0); 59770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Finish AC successive approximation */ 59870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0); 59970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0); 60070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Luma bottom bit comes last since it's usually largest scan */ 60170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0); 60270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 60370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* All-purpose script for other color spaces. */ 60470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Successive approximation first pass */ 60570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_dc_scans(scanptr, ncomps, 0, 1); 60670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2); 60770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2); 60870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Successive approximation second pass */ 60970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1); 61070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Successive approximation final pass */ 61170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_dc_scans(scanptr, ncomps, 1, 0); 61270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0); 61370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 61470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 61570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 61670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* C_PROGRESSIVE_SUPPORTED */ 617