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