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