Blame gtkmm-osx/jpeg-6b/jcparam.c

darco 56a656
/*
darco 56a656
 * jcparam.c
darco 56a656
 *
darco 56a656
 * Copyright (C) 1991-1998, Thomas G. Lane.
darco 56a656
 * This file is part of the Independent JPEG Group's software.
darco 56a656
 * For conditions of distribution and use, see the accompanying README file.
darco 56a656
 *
darco 56a656
 * This file contains optional default-setting code for the JPEG compressor.
darco 56a656
 * Applications do not have to use this file, but those that don't use it
darco 56a656
 * must know a lot more about the innards of the JPEG code.
darco 56a656
 */
darco 56a656
darco 56a656
#define JPEG_INTERNALS
darco 56a656
#include "jinclude.h"
darco 56a656
#include "jpeglib.h"
darco 56a656
darco 56a656
darco 56a656
/*
darco 56a656
 * Quantization table setup routines
darco 56a656
 */
darco 56a656
darco 56a656
GLOBAL(void)
darco 56a656
jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl,
darco 56a656
		      const unsigned int *basic_table,
darco 56a656
		      int scale_factor, boolean force_baseline)
darco 56a656
/* Define a quantization table equal to the basic_table times
darco 56a656
 * a scale factor (given as a percentage).
darco 56a656
 * If force_baseline is TRUE, the computed quantization table entries
darco 56a656
 * are limited to 1..255 for JPEG baseline compatibility.
darco 56a656
 */
darco 56a656
{
darco 56a656
  JQUANT_TBL ** qtblptr;
darco 56a656
  int i;
darco 56a656
  long temp;
darco 56a656
darco 56a656
  /* Safety check to ensure start_compress not called yet. */
darco 56a656
  if (cinfo->global_state != CSTATE_START)
darco 56a656
    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
darco 56a656
darco 56a656
  if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS)
darco 56a656
    ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl);
darco 56a656
darco 56a656
  qtblptr = & cinfo->quant_tbl_ptrs[which_tbl];
darco 56a656
darco 56a656
  if (*qtblptr == NULL)
darco 56a656
    *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo);
darco 56a656
darco 56a656
  for (i = 0; i < DCTSIZE2; i++) {
darco 56a656
    temp = ((long) basic_table[i] * scale_factor + 50L) / 100L;
darco 56a656
    /* limit the values to the valid range */
darco 56a656
    if (temp <= 0L) temp = 1L;
darco 56a656
    if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */
darco 56a656
    if (force_baseline && temp > 255L)
darco 56a656
      temp = 255L;		/* limit to baseline range if requested */
darco 56a656
    (*qtblptr)->quantval[i] = (UINT16) temp;
darco 56a656
  }
darco 56a656
darco 56a656
  /* Initialize sent_table FALSE so table will be written to JPEG file. */
darco 56a656
  (*qtblptr)->sent_table = FALSE;
darco 56a656
}
darco 56a656
darco 56a656
darco 56a656
GLOBAL(void)
darco 56a656
jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor,
darco 56a656
			 boolean force_baseline)
darco 56a656
/* Set or change the 'quality' (quantization) setting, using default tables
darco 56a656
 * and a straight percentage-scaling quality scale.  In most cases it's better
darco 56a656
 * to use jpeg_set_quality (below); this entry point is provided for
darco 56a656
 * applications that insist on a linear percentage scaling.
darco 56a656
 */
darco 56a656
{
darco 56a656
  /* These are the sample quantization tables given in JPEG spec section K.1.
darco 56a656
   * The spec says that the values given produce "good" quality, and
darco 56a656
   * when divided by 2, "very good" quality.
darco 56a656
   */
darco 56a656
  static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
darco 56a656
    16,  11,  10,  16,  24,  40,  51,  61,
darco 56a656
    12,  12,  14,  19,  26,  58,  60,  55,
darco 56a656
    14,  13,  16,  24,  40,  57,  69,  56,
darco 56a656
    14,  17,  22,  29,  51,  87,  80,  62,
darco 56a656
    18,  22,  37,  56,  68, 109, 103,  77,
darco 56a656
    24,  35,  55,  64,  81, 104, 113,  92,
darco 56a656
    49,  64,  78,  87, 103, 121, 120, 101,
darco 56a656
    72,  92,  95,  98, 112, 100, 103,  99
darco 56a656
  };
darco 56a656
  static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {
darco 56a656
    17,  18,  24,  47,  99,  99,  99,  99,
darco 56a656
    18,  21,  26,  66,  99,  99,  99,  99,
darco 56a656
    24,  26,  56,  99,  99,  99,  99,  99,
darco 56a656
    47,  66,  99,  99,  99,  99,  99,  99,
darco 56a656
    99,  99,  99,  99,  99,  99,  99,  99,
darco 56a656
    99,  99,  99,  99,  99,  99,  99,  99,
darco 56a656
    99,  99,  99,  99,  99,  99,  99,  99,
darco 56a656
    99,  99,  99,  99,  99,  99,  99,  99
darco 56a656
  };
darco 56a656
darco 56a656
  /* Set up two quantization tables using the specified scaling */
darco 56a656
  jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
darco 56a656
		       scale_factor, force_baseline);
darco 56a656
  jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
darco 56a656
		       scale_factor, force_baseline);
darco 56a656
}
darco 56a656
darco 56a656
darco 56a656
GLOBAL(int)
darco 56a656
jpeg_quality_scaling (int quality)
darco 56a656
/* Convert a user-specified quality rating to a percentage scaling factor
darco 56a656
 * for an underlying quantization table, using our recommended scaling curve.
darco 56a656
 * The input 'quality' factor should be 0 (terrible) to 100 (very good).
darco 56a656
 */
darco 56a656
{
darco 56a656
  /* Safety limit on quality factor.  Convert 0 to 1 to avoid zero divide. */
darco 56a656
  if (quality <= 0) quality = 1;
darco 56a656
  if (quality > 100) quality = 100;
darco 56a656
darco 56a656
  /* The basic table is used as-is (scaling 100) for a quality of 50.
darco 56a656
   * Qualities 50..100 are converted to scaling percentage 200 - 2*Q;
darco 56a656
   * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table
darco 56a656
   * to make all the table entries 1 (hence, minimum quantization loss).
darco 56a656
   * Qualities 1..50 are converted to scaling percentage 5000/Q.
darco 56a656
   */
darco 56a656
  if (quality < 50)
darco 56a656
    quality = 5000 / quality;
darco 56a656
  else
darco 56a656
    quality = 200 - quality*2;
darco 56a656
darco 56a656
  return quality;
darco 56a656
}
darco 56a656
darco 56a656
darco 56a656
GLOBAL(void)
darco 56a656
jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)
darco 56a656
/* Set or change the 'quality' (quantization) setting, using default tables.
darco 56a656
 * This is the standard quality-adjusting entry point for typical user
darco 56a656
 * interfaces; only those who want detailed control over quantization tables
darco 56a656
 * would use the preceding three routines directly.
darco 56a656
 */
darco 56a656
{
darco 56a656
  /* Convert user 0-100 rating to percentage scaling */
darco 56a656
  quality = jpeg_quality_scaling(quality);
darco 56a656
darco 56a656
  /* Set up standard quality tables */
darco 56a656
  jpeg_set_linear_quality(cinfo, quality, force_baseline);
darco 56a656
}
darco 56a656
darco 56a656
darco 56a656
/*
darco 56a656
 * Huffman table setup routines
darco 56a656
 */
darco 56a656
darco 56a656
LOCAL(void)
darco 56a656
add_huff_table (j_compress_ptr cinfo,
darco 56a656
		JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)
darco 56a656
/* Define a Huffman table */
darco 56a656
{
darco 56a656
  int nsymbols, len;
darco 56a656
darco 56a656
  if (*htblptr == NULL)
darco 56a656
    *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
darco 56a656
darco 56a656
  /* Copy the number-of-symbols-of-each-code-length counts */
darco 56a656
  MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
darco 56a656
darco 56a656
  /* Validate the counts.  We do this here mainly so we can copy the right
darco 56a656
   * number of symbols from the val[] array, without risking marching off
darco 56a656
   * the end of memory.  jchuff.c will do a more thorough test later.
darco 56a656
   */
darco 56a656
  nsymbols = 0;
darco 56a656
  for (len = 1; len <= 16; len++)
darco 56a656
    nsymbols += bits[len];
darco 56a656
  if (nsymbols < 1 || nsymbols > 256)
darco 56a656
    ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
darco 56a656
darco 56a656
  MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8));
darco 56a656
darco 56a656
  /* Initialize sent_table FALSE so table will be written to JPEG file. */
darco 56a656
  (*htblptr)->sent_table = FALSE;
darco 56a656
}
darco 56a656
darco 56a656
darco 56a656
LOCAL(void)
darco 56a656
std_huff_tables (j_compress_ptr cinfo)
darco 56a656
/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
darco 56a656
/* IMPORTANT: these are only valid for 8-bit data precision! */
darco 56a656
{
darco 56a656
  static const UINT8 bits_dc_luminance[17] =
darco 56a656
    { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
darco 56a656
  static const UINT8 val_dc_luminance[] =
darco 56a656
    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
darco 56a656
  
darco 56a656
  static const UINT8 bits_dc_chrominance[17] =
darco 56a656
    { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
darco 56a656
  static const UINT8 val_dc_chrominance[] =
darco 56a656
    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
darco 56a656
  
darco 56a656
  static const UINT8 bits_ac_luminance[17] =
darco 56a656
    { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
darco 56a656
  static const UINT8 val_ac_luminance[] =
darco 56a656
    { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
darco 56a656
      0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
darco 56a656
      0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
darco 56a656
      0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
darco 56a656
      0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
darco 56a656
      0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
darco 56a656
      0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
darco 56a656
      0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
darco 56a656
      0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
darco 56a656
      0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
darco 56a656
      0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
darco 56a656
      0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
darco 56a656
      0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
darco 56a656
      0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
darco 56a656
      0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
darco 56a656
      0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
darco 56a656
      0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
darco 56a656
      0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
darco 56a656
      0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
darco 56a656
      0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
darco 56a656
      0xf9, 0xfa };
darco 56a656
  
darco 56a656
  static const UINT8 bits_ac_chrominance[17] =
darco 56a656
    { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
darco 56a656
  static const UINT8 val_ac_chrominance[] =
darco 56a656
    { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
darco 56a656
      0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
darco 56a656
      0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
darco 56a656
      0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
darco 56a656
      0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
darco 56a656
      0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
darco 56a656
      0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
darco 56a656
      0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
darco 56a656
      0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
darco 56a656
      0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
darco 56a656
      0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
darco 56a656
      0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
darco 56a656
      0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
darco 56a656
      0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
darco 56a656
      0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
darco 56a656
      0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
darco 56a656
      0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
darco 56a656
      0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
darco 56a656
      0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
darco 56a656
      0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
darco 56a656
      0xf9, 0xfa };
darco 56a656
  
darco 56a656
  add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0],
darco 56a656
		 bits_dc_luminance, val_dc_luminance);
darco 56a656
  add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0],
darco 56a656
		 bits_ac_luminance, val_ac_luminance);
darco 56a656
  add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1],
darco 56a656
		 bits_dc_chrominance, val_dc_chrominance);
darco 56a656
  add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1],
darco 56a656
		 bits_ac_chrominance, val_ac_chrominance);
darco 56a656
}
darco 56a656
darco 56a656
darco 56a656
/*
darco 56a656
 * Default parameter setup for compression.
darco 56a656
 *
darco 56a656
 * Applications that don't choose to use this routine must do their
darco 56a656
 * own setup of all these parameters.  Alternately, you can call this
darco 56a656
 * to establish defaults and then alter parameters selectively.  This
darco 56a656
 * is the recommended approach since, if we add any new parameters,
darco 56a656
 * your code will still work (they'll be set to reasonable defaults).
darco 56a656
 */
darco 56a656
darco 56a656
GLOBAL(void)
darco 56a656
jpeg_set_defaults (j_compress_ptr cinfo)
darco 56a656
{
darco 56a656
  int i;
darco 56a656
darco 56a656
  /* Safety check to ensure start_compress not called yet. */
darco 56a656
  if (cinfo->global_state != CSTATE_START)
darco 56a656
    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
darco 56a656
darco 56a656
  /* Allocate comp_info array large enough for maximum component count.
darco 56a656
   * Array is made permanent in case application wants to compress
darco 56a656
   * multiple images at same param settings.
darco 56a656
   */
darco 56a656
  if (cinfo->comp_info == NULL)
darco 56a656
    cinfo->comp_info = (jpeg_component_info *)
darco 56a656
      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
darco 56a656
				  MAX_COMPONENTS * SIZEOF(jpeg_component_info));
darco 56a656
darco 56a656
  /* Initialize everything not dependent on the color space */
darco 56a656
darco 56a656
  cinfo->data_precision = BITS_IN_JSAMPLE;
darco 56a656
  /* Set up two quantization tables using default quality of 75 */
darco 56a656
  jpeg_set_quality(cinfo, 75, TRUE);
darco 56a656
  /* Set up two Huffman tables */
darco 56a656
  std_huff_tables(cinfo);
darco 56a656
darco 56a656
  /* Initialize default arithmetic coding conditioning */
darco 56a656
  for (i = 0; i < NUM_ARITH_TBLS; i++) {
darco 56a656
    cinfo->arith_dc_L[i] = 0;
darco 56a656
    cinfo->arith_dc_U[i] = 1;
darco 56a656
    cinfo->arith_ac_K[i] = 5;
darco 56a656
  }
darco 56a656
darco 56a656
  /* Default is no multiple-scan output */
darco 56a656
  cinfo->scan_info = NULL;
darco 56a656
  cinfo->num_scans = 0;
darco 56a656
darco 56a656
  /* Expect normal source image, not raw downsampled data */
darco 56a656
  cinfo->raw_data_in = FALSE;
darco 56a656
darco 56a656
  /* Use Huffman coding, not arithmetic coding, by default */
darco 56a656
  cinfo->arith_code = FALSE;
darco 56a656
darco 56a656
  /* By default, don't do extra passes to optimize entropy coding */
darco 56a656
  cinfo->optimize_coding = FALSE;
darco 56a656
  /* The standard Huffman tables are only valid for 8-bit data precision.
darco 56a656
   * If the precision is higher, force optimization on so that usable
darco 56a656
   * tables will be computed.  This test can be removed if default tables
darco 56a656
   * are supplied that are valid for the desired precision.
darco 56a656
   */
darco 56a656
  if (cinfo->data_precision > 8)
darco 56a656
    cinfo->optimize_coding = TRUE;
darco 56a656
darco 56a656
  /* By default, use the simpler non-cosited sampling alignment */
darco 56a656
  cinfo->CCIR601_sampling = FALSE;
darco 56a656
darco 56a656
  /* No input smoothing */
darco 56a656
  cinfo->smoothing_factor = 0;
darco 56a656
darco 56a656
  /* DCT algorithm preference */
darco 56a656
  cinfo->dct_method = JDCT_DEFAULT;
darco 56a656
darco 56a656
  /* No restart markers */
darco 56a656
  cinfo->restart_interval = 0;
darco 56a656
  cinfo->restart_in_rows = 0;
darco 56a656
darco 56a656
  /* Fill in default JFIF marker parameters.  Note that whether the marker
darco 56a656
   * will actually be written is determined by jpeg_set_colorspace.
darco 56a656
   *
darco 56a656
   * By default, the library emits JFIF version code 1.01.
darco 56a656
   * An application that wants to emit JFIF 1.02 extension markers should set
darco 56a656
   * JFIF_minor_version to 2.  We could probably get away with just defaulting
darco 56a656
   * to 1.02, but there may still be some decoders in use that will complain
darco 56a656
   * about that; saying 1.01 should minimize compatibility problems.
darco 56a656
   */
darco 56a656
  cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */
darco 56a656
  cinfo->JFIF_minor_version = 1;
darco 56a656
  cinfo->density_unit = 0;	/* Pixel size is unknown by default */
darco 56a656
  cinfo->X_density = 1;		/* Pixel aspect ratio is square by default */
darco 56a656
  cinfo->Y_density = 1;
darco 56a656
darco 56a656
  /* Choose JPEG colorspace based on input space, set defaults accordingly */
darco 56a656
darco 56a656
  jpeg_default_colorspace(cinfo);
darco 56a656
}
darco 56a656
darco 56a656
darco 56a656
/*
darco 56a656
 * Select an appropriate JPEG colorspace for in_color_space.
darco 56a656
 */
darco 56a656
darco 56a656
GLOBAL(void)
darco 56a656
jpeg_default_colorspace (j_compress_ptr cinfo)
darco 56a656
{
darco 56a656
  switch (cinfo->in_color_space) {
darco 56a656
  case JCS_GRAYSCALE:
darco 56a656
    jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
darco 56a656
    break;
darco 56a656
  case JCS_RGB:
darco 56a656
    jpeg_set_colorspace(cinfo, JCS_YCbCr);
darco 56a656
    break;
darco 56a656
  case JCS_YCbCr:
darco 56a656
    jpeg_set_colorspace(cinfo, JCS_YCbCr);
darco 56a656
    break;
darco 56a656
  case JCS_CMYK:
darco 56a656
    jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */
darco 56a656
    break;
darco 56a656
  case JCS_YCCK:
darco 56a656
    jpeg_set_colorspace(cinfo, JCS_YCCK);
darco 56a656
    break;
darco 56a656
  case JCS_UNKNOWN:
darco 56a656
    jpeg_set_colorspace(cinfo, JCS_UNKNOWN);
darco 56a656
    break;
darco 56a656
  default:
darco 56a656
    ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
darco 56a656
  }
darco 56a656
}
darco 56a656
darco 56a656
darco 56a656
/*
darco 56a656
 * Set the JPEG colorspace, and choose colorspace-dependent default values.
darco 56a656
 */
darco 56a656
darco 56a656
GLOBAL(void)
darco 56a656
jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
darco 56a656
{
darco 56a656
  jpeg_component_info * compptr;
darco 56a656
  int ci;
darco 56a656
darco 56a656
#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl)  \
darco 56a656
  (compptr = &cinfo->comp_info[index], \
darco 56a656
   compptr->component_id = (id), \
darco 56a656
   compptr->h_samp_factor = (hsamp), \
darco 56a656
   compptr->v_samp_factor = (vsamp), \
darco 56a656
   compptr->quant_tbl_no = (quant), \
darco 56a656
   compptr->dc_tbl_no = (dctbl), \
darco 56a656
   compptr->ac_tbl_no = (actbl) )
darco 56a656
darco 56a656
  /* Safety check to ensure start_compress not called yet. */
darco 56a656
  if (cinfo->global_state != CSTATE_START)
darco 56a656
    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
darco 56a656
darco 56a656
  /* For all colorspaces, we use Q and Huff tables 0 for luminance components,
darco 56a656
   * tables 1 for chrominance components.
darco 56a656
   */
darco 56a656
darco 56a656
  cinfo->jpeg_color_space = colorspace;
darco 56a656
darco 56a656
  cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */
darco 56a656
  cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */
darco 56a656
darco 56a656
  switch (colorspace) {
darco 56a656
  case JCS_GRAYSCALE:
darco 56a656
    cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
darco 56a656
    cinfo->num_components = 1;
darco 56a656
    /* JFIF specifies component ID 1 */
darco 56a656
    SET_COMP(0, 1, 1,1, 0, 0,0);
darco 56a656
    break;
darco 56a656
  case JCS_RGB:
darco 56a656
    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */
darco 56a656
    cinfo->num_components = 3;
darco 56a656
    SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0);
darco 56a656
    SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0);
darco 56a656
    SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0);
darco 56a656
    break;
darco 56a656
  case JCS_YCbCr:
darco 56a656
    cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
darco 56a656
    cinfo->num_components = 3;
darco 56a656
    /* JFIF specifies component IDs 1,2,3 */
darco 56a656
    /* We default to 2x2 subsamples of chrominance */
darco 56a656
    SET_COMP(0, 1, 2,2, 0, 0,0);
darco 56a656
    SET_COMP(1, 2, 1,1, 1, 1,1);
darco 56a656
    SET_COMP(2, 3, 1,1, 1, 1,1);
darco 56a656
    break;
darco 56a656
  case JCS_CMYK:
darco 56a656
    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */
darco 56a656
    cinfo->num_components = 4;
darco 56a656
    SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0);
darco 56a656
    SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0);
darco 56a656
    SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0);
darco 56a656
    SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0);
darco 56a656
    break;
darco 56a656
  case JCS_YCCK:
darco 56a656
    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */
darco 56a656
    cinfo->num_components = 4;
darco 56a656
    SET_COMP(0, 1, 2,2, 0, 0,0);
darco 56a656
    SET_COMP(1, 2, 1,1, 1, 1,1);
darco 56a656
    SET_COMP(2, 3, 1,1, 1, 1,1);
darco 56a656
    SET_COMP(3, 4, 2,2, 0, 0,0);
darco 56a656
    break;
darco 56a656
  case JCS_UNKNOWN:
darco 56a656
    cinfo->num_components = cinfo->input_components;
darco 56a656
    if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)
darco 56a656
      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
darco 56a656
	       MAX_COMPONENTS);
darco 56a656
    for (ci = 0; ci < cinfo->num_components; ci++) {
darco 56a656
      SET_COMP(ci, ci, 1,1, 0, 0,0);
darco 56a656
    }
darco 56a656
    break;
darco 56a656
  default:
darco 56a656
    ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
darco 56a656
  }
darco 56a656
}
darco 56a656
darco 56a656
darco 56a656
#ifdef C_PROGRESSIVE_SUPPORTED
darco 56a656
darco 56a656
LOCAL(jpeg_scan_info *)
darco 56a656
fill_a_scan (jpeg_scan_info * scanptr, int ci,
darco 56a656
	     int Ss, int Se, int Ah, int Al)
darco 56a656
/* Support routine: generate one scan for specified component */
darco 56a656
{
darco 56a656
  scanptr->comps_in_scan = 1;
darco 56a656
  scanptr->component_index[0] = ci;
darco 56a656
  scanptr->Ss = Ss;
darco 56a656
  scanptr->Se = Se;
darco 56a656
  scanptr->Ah = Ah;
darco 56a656
  scanptr->Al = Al;
darco 56a656
  scanptr++;
darco 56a656
  return scanptr;
darco 56a656
}
darco 56a656
darco 56a656
LOCAL(jpeg_scan_info *)
darco 56a656
fill_scans (jpeg_scan_info * scanptr, int ncomps,
darco 56a656
	    int Ss, int Se, int Ah, int Al)
darco 56a656
/* Support routine: generate one scan for each component */
darco 56a656
{
darco 56a656
  int ci;
darco 56a656
darco 56a656
  for (ci = 0; ci < ncomps; ci++) {
darco 56a656
    scanptr->comps_in_scan = 1;
darco 56a656
    scanptr->component_index[0] = ci;
darco 56a656
    scanptr->Ss = Ss;
darco 56a656
    scanptr->Se = Se;
darco 56a656
    scanptr->Ah = Ah;
darco 56a656
    scanptr->Al = Al;
darco 56a656
    scanptr++;
darco 56a656
  }
darco 56a656
  return scanptr;
darco 56a656
}
darco 56a656
darco 56a656
LOCAL(jpeg_scan_info *)
darco 56a656
fill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al)
darco 56a656
/* Support routine: generate interleaved DC scan if possible, else N scans */
darco 56a656
{
darco 56a656
  int ci;
darco 56a656
darco 56a656
  if (ncomps <= MAX_COMPS_IN_SCAN) {
darco 56a656
    /* Single interleaved DC scan */
darco 56a656
    scanptr->comps_in_scan = ncomps;
darco 56a656
    for (ci = 0; ci < ncomps; ci++)
darco 56a656
      scanptr->component_index[ci] = ci;
darco 56a656
    scanptr->Ss = scanptr->Se = 0;
darco 56a656
    scanptr->Ah = Ah;
darco 56a656
    scanptr->Al = Al;
darco 56a656
    scanptr++;
darco 56a656
  } else {
darco 56a656
    /* Noninterleaved DC scan for each component */
darco 56a656
    scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al);
darco 56a656
  }
darco 56a656
  return scanptr;
darco 56a656
}
darco 56a656
darco 56a656
darco 56a656
/*
darco 56a656
 * Create a recommended progressive-JPEG script.
darco 56a656
 * cinfo->num_components and cinfo->jpeg_color_space must be correct.
darco 56a656
 */
darco 56a656
darco 56a656
GLOBAL(void)
darco 56a656
jpeg_simple_progression (j_compress_ptr cinfo)
darco 56a656
{
darco 56a656
  int ncomps = cinfo->num_components;
darco 56a656
  int nscans;
darco 56a656
  jpeg_scan_info * scanptr;
darco 56a656
darco 56a656
  /* Safety check to ensure start_compress not called yet. */
darco 56a656
  if (cinfo->global_state != CSTATE_START)
darco 56a656
    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
darco 56a656
darco 56a656
  /* Figure space needed for script.  Calculation must match code below! */
darco 56a656
  if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
darco 56a656
    /* Custom script for YCbCr color images. */
darco 56a656
    nscans = 10;
darco 56a656
  } else {
darco 56a656
    /* All-purpose script for other color spaces. */
darco 56a656
    if (ncomps > MAX_COMPS_IN_SCAN)
darco 56a656
      nscans = 6 * ncomps;	/* 2 DC + 4 AC scans per component */
darco 56a656
    else
darco 56a656
      nscans = 2 + 4 * ncomps;	/* 2 DC scans; 4 AC scans per component */
darco 56a656
  }
darco 56a656
darco 56a656
  /* Allocate space for script.
darco 56a656
   * We need to put it in the permanent pool in case the application performs
darco 56a656
   * multiple compressions without changing the settings.  To avoid a memory
darco 56a656
   * leak if jpeg_simple_progression is called repeatedly for the same JPEG
darco 56a656
   * object, we try to re-use previously allocated space, and we allocate
darco 56a656
   * enough space to handle YCbCr even if initially asked for grayscale.
darco 56a656
   */
darco 56a656
  if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) {
darco 56a656
    cinfo->script_space_size = MAX(nscans, 10);
darco 56a656
    cinfo->script_space = (jpeg_scan_info *)
darco 56a656
      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
darco 56a656
			cinfo->script_space_size * SIZEOF(jpeg_scan_info));
darco 56a656
  }
darco 56a656
  scanptr = cinfo->script_space;
darco 56a656
  cinfo->scan_info = scanptr;
darco 56a656
  cinfo->num_scans = nscans;
darco 56a656
darco 56a656
  if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
darco 56a656
    /* Custom script for YCbCr color images. */
darco 56a656
    /* Initial DC scan */
darco 56a656
    scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
darco 56a656
    /* Initial AC scan: get some luma data out in a hurry */
darco 56a656
    scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2);
darco 56a656
    /* Chroma data is too small to be worth expending many scans on */
darco 56a656
    scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1);
darco 56a656
    scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1);
darco 56a656
    /* Complete spectral selection for luma AC */
darco 56a656
    scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2);
darco 56a656
    /* Refine next bit of luma AC */
darco 56a656
    scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1);
darco 56a656
    /* Finish DC successive approximation */
darco 56a656
    scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
darco 56a656
    /* Finish AC successive approximation */
darco 56a656
    scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0);
darco 56a656
    scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0);
darco 56a656
    /* Luma bottom bit comes last since it's usually largest scan */
darco 56a656
    scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0);
darco 56a656
  } else {
darco 56a656
    /* All-purpose script for other color spaces. */
darco 56a656
    /* Successive approximation first pass */
darco 56a656
    scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
darco 56a656
    scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2);
darco 56a656
    scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2);
darco 56a656
    /* Successive approximation second pass */
darco 56a656
    scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1);
darco 56a656
    /* Successive approximation final pass */
darco 56a656
    scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
darco 56a656
    scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0);
darco 56a656
  }
darco 56a656
}
darco 56a656
darco 56a656
#endif /* C_PROGRESSIVE_SUPPORTED */