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