<html><!-- Created using the cpp_pretty_printer from the dlib C++ library.  See http://dlib.net for updates. --><head><title>dlib C++ Library - jddctmgr.c</title></head><body bgcolor='white'><pre>
<font color='#009900'>/*
 * jddctmgr.c
 *
 * Copyright (C) 1994-1996, Thomas G. Lane.
 * Modified 2002-2010 by Guido Vollbeding.
 * This file is part of the Independent JPEG Group's software.
 * For conditions of distribution and use, see the accompanying README file.
 *
 * This file contains the inverse-DCT management logic.
 * This code selects a particular IDCT implementation to be used,
 * and it performs related housekeeping chores.  No code in this file
 * is executed per IDCT step, only during output pass setup.
 *
 * Note that the IDCT routines are responsible for performing coefficient
 * dequantization as well as the IDCT proper.  This module sets up the
 * dequantization multiplier table needed by the IDCT routine.
 */</font>

<font color='#0000FF'>#define</font> JPEG_INTERNALS
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='jinclude.h.html'>jinclude.h</a>"
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='jpeglib.h.html'>jpeglib.h</a>"
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='jdct.h.html'>jdct.h</a>"		<font color='#009900'>/* Private declarations for DCT subsystem */</font>


<font color='#009900'>/*
 * The decompressor input side (jdinput.c) saves away the appropriate
 * quantization table for each component at the start of the first scan
 * involving that component.  (This is necessary in order to correctly
 * decode files that reuse Q-table slots.)
 * When we are ready to make an output pass, the saved Q-table is converted
 * to a multiplier table that will actually be used by the IDCT routine.
 * The multiplier table contents are IDCT-method-dependent.  To support
 * application changes in IDCT method between scans, we can remake the
 * multiplier tables if necessary.
 * In buffered-image mode, the first output pass may occur before any data
 * has been seen for some components, and thus before their Q-tables have
 * been saved away.  To handle this case, multiplier tables are preset
 * to zeroes; the result of the IDCT will be a neutral gray level.
 */</font>


<font color='#009900'>/* Private subobject for this module */</font>

<font color='#0000FF'>typedef</font> <font color='#0000FF'>struct</font> <b>{</b>
  <font color='#0000FF'>struct</font> jpeg_inverse_dct pub;	<font color='#009900'>/* public fields */</font>

  <font color='#009900'>/* This array contains the IDCT method code that each multiplier table
   * is currently set up for, or -1 if it's not yet set up.
   * The actual multiplier tables are pointed to by dct_table in the
   * per-component comp_info structures.
   */</font>
  <font color='#0000FF'><u>int</u></font> cur_method[MAX_COMPONENTS];
<b>}</b> my_idct_controller;

<font color='#0000FF'>typedef</font> my_idct_controller <font color='#5555FF'>*</font> my_idct_ptr;


<font color='#009900'>/* Allocated multiplier tables: big enough for any supported variant */</font>

<font color='#0000FF'>typedef</font> <font color='#0000FF'>union</font> <b>{</b>
  ISLOW_MULT_TYPE islow_array[DCTSIZE2];
<font color='#0000FF'>#ifdef</font> DCT_IFAST_SUPPORTED
  IFAST_MULT_TYPE ifast_array[DCTSIZE2];
<font color='#0000FF'>#endif</font>
<font color='#0000FF'>#ifdef</font> DCT_FLOAT_SUPPORTED
  FLOAT_MULT_TYPE float_array[DCTSIZE2];
<font color='#0000FF'>#endif</font>
<b>}</b> multiplier_table;


<font color='#009900'>/* The current scaled-IDCT routines require ISLOW-style multiplier tables,
 * so be sure to compile that code if either ISLOW or SCALING is requested.
 */</font>
<font color='#0000FF'>#ifdef</font> DCT_ISLOW_SUPPORTED
<font color='#0000FF'>#define</font> PROVIDE_ISLOW_TABLES
<font color='#0000FF'>#else</font>
<font color='#0000FF'>#ifdef</font> IDCT_SCALING_SUPPORTED
<font color='#0000FF'>#define</font> PROVIDE_ISLOW_TABLES
<font color='#0000FF'>#endif</font>
<font color='#0000FF'>#endif</font>


<font color='#009900'>/*
 * Prepare for an output pass.
 * Here we select the proper IDCT routine for each component and build
 * a matching multiplier table.
 */</font>

<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>void</u></font><font face='Lucida Console'>)</font>
<b><a name='start_pass'></a>start_pass</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo<font face='Lucida Console'>)</font>
<b>{</b>
  my_idct_ptr idct <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>my_idct_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>idct;
  <font color='#0000FF'><u>int</u></font> ci, i;
  jpeg_component_info <font color='#5555FF'>*</font>compptr;
  <font color='#0000FF'><u>int</u></font> method <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
  inverse_DCT_method_ptr method_ptr <font color='#5555FF'>=</font> NULL;
  JQUANT_TBL <font color='#5555FF'>*</font> qtbl;

  <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>=</font> <font color='#979000'>0</font>, compptr <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>comp_info; ci <font color='#5555FF'>&lt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>num_components;
       ci<font color='#5555FF'>+</font><font color='#5555FF'>+</font>, compptr<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
    <font color='#009900'>/* Select the proper IDCT routine for this component's scaling */</font>
    <font color='#0000FF'>switch</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>DCT_h_scaled_size <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>DCT_v_scaled_size<font face='Lucida Console'>)</font> <b>{</b>
<font color='#0000FF'>#ifdef</font> IDCT_SCALING_SUPPORTED
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>1</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_1x1;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>2</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>2</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_2x2;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>3</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>3</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_3x3;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>4</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>4</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_4x4;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>5</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>5</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_5x5;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>6</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>6</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_6x6;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>7</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>7</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_7x7;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>9</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>9</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_9x9;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>10</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>10</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_10x10;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>11</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>11</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_11x11;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>12</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>12</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_12x12;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>13</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>13</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_13x13;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>14</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>14</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_14x14;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>15</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>15</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_15x15;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>16</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>16</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_16x16;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>16</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_16x8;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>14</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>7</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_14x7;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>12</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>6</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_12x6;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>10</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>5</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_10x5;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>8</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>4</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_8x4;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>6</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>3</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_6x3;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>4</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>2</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_4x2;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>2</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_2x1;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>8</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>16</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_8x16;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>7</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>14</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_7x14;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>6</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>12</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_6x12;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>5</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>10</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_5x10;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>4</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_4x8;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>3</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>6</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_3x6;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>2</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>4</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_2x4;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>1</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>2</font><font face='Lucida Console'>)</font>:
      method_ptr <font color='#5555FF'>=</font> jpeg_idct_1x2;
      method <font color='#5555FF'>=</font> JDCT_ISLOW;	<font color='#009900'>/* jidctint uses islow-style table */</font>
      <font color='#0000FF'>break</font>;
<font color='#0000FF'>#endif</font>
    <font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>DCTSIZE <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> DCTSIZE<font face='Lucida Console'>)</font>:
      <font color='#0000FF'>switch</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dct_method<font face='Lucida Console'>)</font> <b>{</b>
<font color='#0000FF'>#ifdef</font> DCT_ISLOW_SUPPORTED
      <font color='#0000FF'>case</font> JDCT_ISLOW:
	method_ptr <font color='#5555FF'>=</font> jpeg_idct_islow;
	method <font color='#5555FF'>=</font> JDCT_ISLOW;
	<font color='#0000FF'>break</font>;
<font color='#0000FF'>#endif</font>
<font color='#0000FF'>#ifdef</font> DCT_IFAST_SUPPORTED
      <font color='#0000FF'>case</font> JDCT_IFAST:
	method_ptr <font color='#5555FF'>=</font> jpeg_idct_ifast;
	method <font color='#5555FF'>=</font> JDCT_IFAST;
	<font color='#0000FF'>break</font>;
<font color='#0000FF'>#endif</font>
<font color='#0000FF'>#ifdef</font> DCT_FLOAT_SUPPORTED
      <font color='#0000FF'>case</font> JDCT_FLOAT:
	method_ptr <font color='#5555FF'>=</font> jpeg_idct_float;
	method <font color='#5555FF'>=</font> JDCT_FLOAT;
	<font color='#0000FF'>break</font>;
<font color='#0000FF'>#endif</font>
      <font color='#0000FF'>default</font>:
	<font color='#BB00BB'>ERREXIT</font><font face='Lucida Console'>(</font>cinfo, JERR_NOT_COMPILED<font face='Lucida Console'>)</font>;
	<font color='#0000FF'>break</font>;
      <b>}</b>
      <font color='#0000FF'>break</font>;
    <font color='#0000FF'>default</font>:
      <font color='#BB00BB'>ERREXIT2</font><font face='Lucida Console'>(</font>cinfo, JERR_BAD_DCTSIZE,
	       compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>DCT_h_scaled_size, compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>DCT_v_scaled_size<font face='Lucida Console'>)</font>;
      <font color='#0000FF'>break</font>;
    <b>}</b>
    idct<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>pub.inverse_DCT[ci] <font color='#5555FF'>=</font> method_ptr;
    <font color='#009900'>/* Create multiplier table from quant table.
     * However, we can skip this if the component is uninteresting
     * or if we already built the table.  Also, if no quant table
     * has yet been saved for the component, we leave the
     * multiplier table all-zero; we'll be reading zeroes from the
     * coefficient controller's buffer anyway.
     */</font>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>component_needed <font color='#5555FF'>|</font><font color='#5555FF'>|</font> idct<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>cur_method[ci] <font color='#5555FF'>=</font><font color='#5555FF'>=</font> method<font face='Lucida Console'>)</font>
      <font color='#0000FF'>continue</font>;
    qtbl <font color='#5555FF'>=</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>quant_table;
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>qtbl <font color='#5555FF'>=</font><font color='#5555FF'>=</font> NULL<font face='Lucida Console'>)</font>		<font color='#009900'>/* happens if no data yet for component */</font>
      <font color='#0000FF'>continue</font>;
    idct<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>cur_method[ci] <font color='#5555FF'>=</font> method;
    <font color='#0000FF'>switch</font> <font face='Lucida Console'>(</font>method<font face='Lucida Console'>)</font> <b>{</b>
<font color='#0000FF'>#ifdef</font> PROVIDE_ISLOW_TABLES
    <font color='#0000FF'>case</font> JDCT_ISLOW:
      <b>{</b>
	<font color='#009900'>/* For LL&amp;M IDCT method, multipliers are equal to raw quantization
	 * coefficients, but are stored as ints to ensure access efficiency.
	 */</font>
	ISLOW_MULT_TYPE <font color='#5555FF'>*</font> ismtbl <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>ISLOW_MULT_TYPE <font color='#5555FF'>*</font><font face='Lucida Console'>)</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dct_table;
	<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'>&lt;</font> DCTSIZE2; i<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
	  ismtbl[i] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>ISLOW_MULT_TYPE<font face='Lucida Console'>)</font> qtbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>quantval[i];
	<b>}</b>
      <b>}</b>
      <font color='#0000FF'>break</font>;
<font color='#0000FF'>#endif</font>
<font color='#0000FF'>#ifdef</font> DCT_IFAST_SUPPORTED
    <font color='#0000FF'>case</font> JDCT_IFAST:
      <b>{</b>
	<font color='#009900'>/* For AA&amp;N IDCT method, multipliers are equal to quantization
	 * coefficients scaled by scalefactor[row]*scalefactor[col], where
	 *   scalefactor[0] = 1
	 *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
	 * For integer operation, the multiplier table is to be scaled by
	 * IFAST_SCALE_BITS.
	 */</font>
	IFAST_MULT_TYPE <font color='#5555FF'>*</font> ifmtbl <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>IFAST_MULT_TYPE <font color='#5555FF'>*</font><font face='Lucida Console'>)</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dct_table;
<font color='#0000FF'>#define</font> CONST_BITS <font color='#979000'>14</font>
	<font color='#0000FF'>static</font> <font color='#0000FF'>const</font> INT16 aanscales[DCTSIZE2] <font color='#5555FF'>=</font> <b>{</b>
	  <font color='#009900'>/* precomputed values scaled up by 14 bits */</font>
	  <font color='#979000'>16384</font>, <font color='#979000'>22725</font>, <font color='#979000'>21407</font>, <font color='#979000'>19266</font>, <font color='#979000'>16384</font>, <font color='#979000'>12873</font>,  <font color='#979000'>8867</font>,  <font color='#979000'>4520</font>,
	  <font color='#979000'>22725</font>, <font color='#979000'>31521</font>, <font color='#979000'>29692</font>, <font color='#979000'>26722</font>, <font color='#979000'>22725</font>, <font color='#979000'>17855</font>, <font color='#979000'>12299</font>,  <font color='#979000'>6270</font>,
	  <font color='#979000'>21407</font>, <font color='#979000'>29692</font>, <font color='#979000'>27969</font>, <font color='#979000'>25172</font>, <font color='#979000'>21407</font>, <font color='#979000'>16819</font>, <font color='#979000'>11585</font>,  <font color='#979000'>5906</font>,
	  <font color='#979000'>19266</font>, <font color='#979000'>26722</font>, <font color='#979000'>25172</font>, <font color='#979000'>22654</font>, <font color='#979000'>19266</font>, <font color='#979000'>15137</font>, <font color='#979000'>10426</font>,  <font color='#979000'>5315</font>,
	  <font color='#979000'>16384</font>, <font color='#979000'>22725</font>, <font color='#979000'>21407</font>, <font color='#979000'>19266</font>, <font color='#979000'>16384</font>, <font color='#979000'>12873</font>,  <font color='#979000'>8867</font>,  <font color='#979000'>4520</font>,
	  <font color='#979000'>12873</font>, <font color='#979000'>17855</font>, <font color='#979000'>16819</font>, <font color='#979000'>15137</font>, <font color='#979000'>12873</font>, <font color='#979000'>10114</font>,  <font color='#979000'>6967</font>,  <font color='#979000'>3552</font>,
	   <font color='#979000'>8867</font>, <font color='#979000'>12299</font>, <font color='#979000'>11585</font>, <font color='#979000'>10426</font>,  <font color='#979000'>8867</font>,  <font color='#979000'>6967</font>,  <font color='#979000'>4799</font>,  <font color='#979000'>2446</font>,
	   <font color='#979000'>4520</font>,  <font color='#979000'>6270</font>,  <font color='#979000'>5906</font>,  <font color='#979000'>5315</font>,  <font color='#979000'>4520</font>,  <font color='#979000'>3552</font>,  <font color='#979000'>2446</font>,  <font color='#979000'>1247</font>
	<b>}</b>;
	SHIFT_TEMPS

	<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'>&lt;</font> DCTSIZE2; i<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
	  ifmtbl[i] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>IFAST_MULT_TYPE<font face='Lucida Console'>)</font>
	    <font color='#BB00BB'>DESCALE</font><font face='Lucida Console'>(</font><font color='#BB00BB'>MULTIPLY16V16</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>INT32<font face='Lucida Console'>)</font> qtbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>quantval[i],
				  <font face='Lucida Console'>(</font>INT32<font face='Lucida Console'>)</font> aanscales[i]<font face='Lucida Console'>)</font>,
		    CONST_BITS<font color='#5555FF'>-</font>IFAST_SCALE_BITS<font face='Lucida Console'>)</font>;
	<b>}</b>
      <b>}</b>
      <font color='#0000FF'>break</font>;
<font color='#0000FF'>#endif</font>
<font color='#0000FF'>#ifdef</font> DCT_FLOAT_SUPPORTED
    <font color='#0000FF'>case</font> JDCT_FLOAT:
      <b>{</b>
	<font color='#009900'>/* For float AA&amp;N IDCT method, multipliers are equal to quantization
	 * coefficients scaled by scalefactor[row]*scalefactor[col], where
	 *   scalefactor[0] = 1
	 *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
	 * We apply a further scale factor of 1/8.
	 */</font>
	FLOAT_MULT_TYPE <font color='#5555FF'>*</font> fmtbl <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>FLOAT_MULT_TYPE <font color='#5555FF'>*</font><font face='Lucida Console'>)</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dct_table;
	<font color='#0000FF'><u>int</u></font> row, col;
	<font color='#0000FF'>static</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>double</u></font> aanscalefactor[DCTSIZE] <font color='#5555FF'>=</font> <b>{</b>
	  <font color='#979000'>1.0</font>, <font color='#979000'>1.387039845</font>, <font color='#979000'>1.306562965</font>, <font color='#979000'>1.175875602</font>,
	  <font color='#979000'>1.0</font>, <font color='#979000'>0.785694958</font>, <font color='#979000'>0.541196100</font>, <font color='#979000'>0.275899379</font>
	<b>}</b>;

	i <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
	<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>row <font color='#5555FF'>=</font> <font color='#979000'>0</font>; row <font color='#5555FF'>&lt;</font> DCTSIZE; row<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
	  <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>col <font color='#5555FF'>=</font> <font color='#979000'>0</font>; col <font color='#5555FF'>&lt;</font> DCTSIZE; col<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
	    fmtbl[i] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>FLOAT_MULT_TYPE<font face='Lucida Console'>)</font>
	      <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>double</u></font><font face='Lucida Console'>)</font> qtbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>quantval[i] <font color='#5555FF'>*</font>
	       aanscalefactor[row] <font color='#5555FF'>*</font> aanscalefactor[col] <font color='#5555FF'>*</font> <font color='#979000'>0.125</font><font face='Lucida Console'>)</font>;
	    i<font color='#5555FF'>+</font><font color='#5555FF'>+</font>;
	  <b>}</b>
	<b>}</b>
      <b>}</b>
      <font color='#0000FF'>break</font>;
<font color='#0000FF'>#endif</font>
    <font color='#0000FF'>default</font>:
      <font color='#BB00BB'>ERREXIT</font><font face='Lucida Console'>(</font>cinfo, JERR_NOT_COMPILED<font face='Lucida Console'>)</font>;
      <font color='#0000FF'>break</font>;
    <b>}</b>
  <b>}</b>
<b>}</b>


<font color='#009900'>/*
 * Initialize IDCT manager.
 */</font>

<b><a name='GLOBAL'></a>GLOBAL</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>void</u></font><font face='Lucida Console'>)</font>
<b><a name='jinit_inverse_dct'></a>jinit_inverse_dct</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo<font face='Lucida Console'>)</font>
<b>{</b>
  my_idct_ptr idct;
  <font color='#0000FF'><u>int</u></font> ci;
  jpeg_component_info <font color='#5555FF'>*</font>compptr;

  idct <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>my_idct_ptr<font face='Lucida Console'>)</font>
    <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>mem<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>alloc_small<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>j_common_ptr<font face='Lucida Console'>)</font> cinfo, JPOOL_IMAGE,
				<font color='#BB00BB'>SIZEOF</font><font face='Lucida Console'>(</font>my_idct_controller<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
  cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>idct <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> jpeg_inverse_dct <font color='#5555FF'>*</font><font face='Lucida Console'>)</font> idct;
  idct<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>pub.start_pass <font color='#5555FF'>=</font> start_pass;

  <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>=</font> <font color='#979000'>0</font>, compptr <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>comp_info; ci <font color='#5555FF'>&lt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>num_components;
       ci<font color='#5555FF'>+</font><font color='#5555FF'>+</font>, compptr<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
    <font color='#009900'>/* Allocate and pre-zero a multiplier table for each component */</font>
    compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dct_table <font color='#5555FF'>=</font>
      <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>mem<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>alloc_small<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>j_common_ptr<font face='Lucida Console'>)</font> cinfo, JPOOL_IMAGE,
				  <font color='#BB00BB'>SIZEOF</font><font face='Lucida Console'>(</font>multiplier_table<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
    <font color='#BB00BB'>MEMZERO</font><font face='Lucida Console'>(</font>compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dct_table, <font color='#BB00BB'>SIZEOF</font><font face='Lucida Console'>(</font>multiplier_table<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
    <font color='#009900'>/* Mark multiplier table not yet set up for any method */</font>
    idct<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>cur_method[ci] <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>;
  <b>}</b>
<b>}</b>

</pre></body></html>