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