<html><!-- Created using the cpp_pretty_printer from the dlib C++ library.  See http://dlib.net for updates. --><head><title>dlib C++ Library - jdhuff.c</title></head><body bgcolor='white'><pre>
<font color='#009900'>/*
 * jdhuff.c
 *
 * Copyright (C) 1991-1997, Thomas G. Lane.
 * Modified 2006-2009 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 Huffman entropy decoding routines.
 * Both sequential and progressive modes are supported in this single module.
 *
 * Much of the complexity here has to do with supporting input suspension.
 * If the data source module demands suspension, we want to be able to back
 * up to the start of the current MCU.  To do this, we copy state variables
 * into local working storage, and update them back to the permanent
 * storage only upon successful completion of an MCU.
 */</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='#009900'>/* Derived data constructed for each Huffman table */</font>

<font color='#0000FF'>#define</font> HUFF_LOOKAHEAD	<font color='#979000'>8</font>	<font color='#009900'>/* # of bits of lookahead */</font>

<font color='#0000FF'>typedef</font> <font color='#0000FF'>struct</font> <b>{</b>
  <font color='#009900'>/* Basic tables: (element [0] of each array is unused) */</font>
  INT32 maxcode[<font color='#979000'>18</font>];		<font color='#009900'>/* largest code of length k (-1 if none) */</font>
  <font color='#009900'>/* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */</font>
  INT32 valoffset[<font color='#979000'>17</font>];		<font color='#009900'>/* huffval[] offset for codes of length k */</font>
  <font color='#009900'>/* valoffset[k] = huffval[] index of 1st symbol of code length k, less
   * the smallest code of length k; so given a code of length k, the
   * corresponding symbol is huffval[code + valoffset[k]]
   */</font>

  <font color='#009900'>/* Link to public Huffman table (needed only in jpeg_huff_decode) */</font>
  JHUFF_TBL <font color='#5555FF'>*</font>pub;

  <font color='#009900'>/* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of
   * the input data stream.  If the next Huffman code is no more
   * than HUFF_LOOKAHEAD bits long, we can obtain its length and
   * the corresponding symbol directly from these tables.
   */</font>
  <font color='#0000FF'><u>int</u></font> look_nbits[<font color='#979000'>1</font><font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font>HUFF_LOOKAHEAD]; <font color='#009900'>/* # bits, or 0 if too long */</font>
  UINT8 look_sym[<font color='#979000'>1</font><font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font>HUFF_LOOKAHEAD]; <font color='#009900'>/* symbol, or unused */</font>
<b>}</b> d_derived_tbl;


<font color='#009900'>/*
 * Fetching the next N bits from the input stream is a time-critical operation
 * for the Huffman decoders.  We implement it with a combination of inline
 * macros and out-of-line subroutines.  Note that N (the number of bits
 * demanded at one time) never exceeds 15 for JPEG use.
 *
 * We read source bytes into get_buffer and dole out bits as needed.
 * If get_buffer already contains enough bits, they are fetched in-line
 * by the macros CHECK_BIT_BUFFER and GET_BITS.  When there aren't enough
 * bits, jpeg_fill_bit_buffer is called; it will attempt to fill get_buffer
 * as full as possible (not just to the number of bits needed; this
 * prefetching reduces the overhead cost of calling jpeg_fill_bit_buffer).
 * Note that jpeg_fill_bit_buffer may return FALSE to indicate suspension.
 * On TRUE return, jpeg_fill_bit_buffer guarantees that get_buffer contains
 * at least the requested number of bits --- dummy zeroes are inserted if
 * necessary.
 */</font>

<font color='#0000FF'>typedef</font> INT32 bit_buf_type;	<font color='#009900'>/* type of bit-extraction buffer */</font>
<font color='#0000FF'>#define</font> BIT_BUF_SIZE  <font color='#979000'>32</font>	<font color='#009900'>/* size of buffer in bits */</font>

<font color='#009900'>/* If long is &gt; 32 bits on your machine, and shifting/masking longs is
 * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE
 * appropriately should be a win.  Unfortunately we can't define the size
 * with something like  #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8)
 * because not all machines measure sizeof in 8-bit bytes.
 */</font>

<font color='#0000FF'>typedef</font> <font color='#0000FF'>struct</font> <b>{</b>		<font color='#009900'>/* Bitreading state saved across MCUs */</font>
  bit_buf_type get_buffer;	<font color='#009900'>/* current bit-extraction buffer */</font>
  <font color='#0000FF'><u>int</u></font> bits_left;		<font color='#009900'>/* # of unused bits in it */</font>
<b>}</b> bitread_perm_state;

<font color='#0000FF'>typedef</font> <font color='#0000FF'>struct</font> <b>{</b>		<font color='#009900'>/* Bitreading working state within an MCU */</font>
  <font color='#009900'>/* Current data source location */</font>
  <font color='#009900'>/* We need a copy, rather than munging the original, in case of suspension */</font>
  <font color='#0000FF'>const</font> JOCTET <font color='#5555FF'>*</font> next_input_byte; <font color='#009900'>/* =&gt; next byte to read from source */</font>
  <font color='#0000FF'><u>size_t</u></font> bytes_in_buffer;	<font color='#009900'>/* # of bytes remaining in source buffer */</font>
  <font color='#009900'>/* Bit input buffer --- note these values are kept in register variables,
   * not in this struct, inside the inner loops.
   */</font>
  bit_buf_type get_buffer;	<font color='#009900'>/* current bit-extraction buffer */</font>
  <font color='#0000FF'><u>int</u></font> bits_left;		<font color='#009900'>/* # of unused bits in it */</font>
  <font color='#009900'>/* Pointer needed by jpeg_fill_bit_buffer. */</font>
  j_decompress_ptr cinfo;	<font color='#009900'>/* back link to decompress master record */</font>
<b>}</b> bitread_working_state;

<font color='#009900'>/* Macros to declare and load/save bitread local variables. */</font>
<font color='#0000FF'>#define</font> BITREAD_STATE_VARS  \
	<font color='#0000FF'>register</font> bit_buf_type get_buffer;  \
	<font color='#0000FF'>register</font> <font color='#0000FF'><u>int</u></font> bits_left;  \
	bitread_working_state br_state

<font color='#0000FF'>#define</font> BITREAD_LOAD_STATE<font face='Lucida Console'>(</font>cinfop,permstate<font face='Lucida Console'>)</font>  \
	br_state.cinfo <font color='#5555FF'>=</font> cinfop; \
	br_state.next_input_byte <font color='#5555FF'>=</font> cinfop<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>src<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>next_input_byte; \
	br_state.bytes_in_buffer <font color='#5555FF'>=</font> cinfop<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>src<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bytes_in_buffer; \
	get_buffer <font color='#5555FF'>=</font> permstate.get_buffer; \
	bits_left <font color='#5555FF'>=</font> permstate.bits_left;

<font color='#0000FF'>#define</font> BITREAD_SAVE_STATE<font face='Lucida Console'>(</font>cinfop,permstate<font face='Lucida Console'>)</font>  \
	cinfop<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>src<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>next_input_byte <font color='#5555FF'>=</font> br_state.next_input_byte; \
	cinfop<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>src<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bytes_in_buffer <font color='#5555FF'>=</font> br_state.bytes_in_buffer; \
	permstate.get_buffer <font color='#5555FF'>=</font> get_buffer; \
	permstate.bits_left <font color='#5555FF'>=</font> bits_left

<font color='#009900'>/*
 * These macros provide the in-line portion of bit fetching.
 * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer
 * before using GET_BITS, PEEK_BITS, or DROP_BITS.
 * The variables get_buffer and bits_left are assumed to be locals,
 * but the state struct might not be (jpeg_huff_decode needs this).
 *	CHECK_BIT_BUFFER(state,n,action);
 *		Ensure there are N bits in get_buffer; if suspend, take action.
 *      val = GET_BITS(n);
 *		Fetch next N bits.
 *      val = PEEK_BITS(n);
 *		Fetch next N bits without removing them from the buffer.
 *	DROP_BITS(n);
 *		Discard next N bits.
 * The value N should be a simple variable, not an expression, because it
 * is evaluated multiple times.
 */</font>

<font color='#0000FF'>#define</font> CHECK_BIT_BUFFER<font face='Lucida Console'>(</font>state,nbits,action<font face='Lucida Console'>)</font> \
	<b>{</b> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>bits_left <font color='#5555FF'>&lt;</font> <font face='Lucida Console'>(</font>nbits<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b>  \
	    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> <font color='#BB00BB'>jpeg_fill_bit_buffer</font><font face='Lucida Console'>(</font><font color='#5555FF'>&amp;</font><font face='Lucida Console'>(</font>state<font face='Lucida Console'>)</font>,get_buffer,bits_left,nbits<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>  \
	      <b>{</b> action; <b>}</b>  \
	    get_buffer <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>state<font face='Lucida Console'>)</font>.get_buffer; bits_left <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>state<font face='Lucida Console'>)</font>.bits_left; <b>}</b> <b>}</b>

<font color='#0000FF'>#define</font> GET_BITS<font face='Lucida Console'>(</font>nbits<font face='Lucida Console'>)</font> \
	<font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>get_buffer <font color='#5555FF'>&gt;</font><font color='#5555FF'>&gt;</font> <font face='Lucida Console'>(</font>bits_left <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>nbits<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&amp;</font> <font color='#BB00BB'>BIT_MASK</font><font face='Lucida Console'>(</font>nbits<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>

<font color='#0000FF'>#define</font> PEEK_BITS<font face='Lucida Console'>(</font>nbits<font face='Lucida Console'>)</font> \
	<font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>get_buffer <font color='#5555FF'>&gt;</font><font color='#5555FF'>&gt;</font> <font face='Lucida Console'>(</font>bits_left <font color='#5555FF'>-</font>  <font face='Lucida Console'>(</font>nbits<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&amp;</font> <font color='#BB00BB'>BIT_MASK</font><font face='Lucida Console'>(</font>nbits<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>

<font color='#0000FF'>#define</font> DROP_BITS<font face='Lucida Console'>(</font>nbits<font face='Lucida Console'>)</font> \
	<font face='Lucida Console'>(</font>bits_left <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>nbits<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>


<font color='#009900'>/*
 * Code for extracting next Huffman-coded symbol from input bit stream.
 * Again, this is time-critical and we make the main paths be macros.
 *
 * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits
 * without looping.  Usually, more than 95% of the Huffman codes will be 8
 * or fewer bits long.  The few overlength codes are handled with a loop,
 * which need not be inline code.
 *
 * Notes about the HUFF_DECODE macro:
 * 1. Near the end of the data segment, we may fail to get enough bits
 *    for a lookahead.  In that case, we do it the hard way.
 * 2. If the lookahead table contains no entry, the next code must be
 *    more than HUFF_LOOKAHEAD bits long.
 * 3. jpeg_huff_decode returns -1 if forced to suspend.
 */</font>

<font color='#0000FF'>#define</font> HUFF_DECODE<font face='Lucida Console'>(</font>result,state,htbl,failaction,slowlabel<font face='Lucida Console'>)</font> \
<b>{</b> <font color='#0000FF'>register</font> <font color='#0000FF'><u>int</u></font> nb, look; \
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>bits_left <font color='#5555FF'>&lt;</font> HUFF_LOOKAHEAD<font face='Lucida Console'>)</font> <b>{</b> \
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> <font color='#BB00BB'>jpeg_fill_bit_buffer</font><font face='Lucida Console'>(</font><font color='#5555FF'>&amp;</font>state,get_buffer,bits_left, <font color='#979000'>0</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b>failaction;<b>}</b> \
    get_buffer <font color='#5555FF'>=</font> state.get_buffer; bits_left <font color='#5555FF'>=</font> state.bits_left; \
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>bits_left <font color='#5555FF'>&lt;</font> HUFF_LOOKAHEAD<font face='Lucida Console'>)</font> <b>{</b> \
      nb <font color='#5555FF'>=</font> <font color='#979000'>1</font>; <font color='#0000FF'>goto</font> slowlabel; \
    <b>}</b> \
  <b>}</b> \
  look <font color='#5555FF'>=</font> <font color='#BB00BB'>PEEK_BITS</font><font face='Lucida Console'>(</font>HUFF_LOOKAHEAD<font face='Lucida Console'>)</font>; \
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>nb <font color='#5555FF'>=</font> htbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>look_nbits[look]<font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b> \
    <font color='#BB00BB'>DROP_BITS</font><font face='Lucida Console'>(</font>nb<font face='Lucida Console'>)</font>; \
    result <font color='#5555FF'>=</font> htbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>look_sym[look]; \
  <b>}</b> <font color='#0000FF'>else</font> <b>{</b> \
    nb <font color='#5555FF'>=</font> HUFF_LOOKAHEAD<font color='#5555FF'>+</font><font color='#979000'>1</font>; \
slowlabel: \
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>result<font color='#5555FF'>=</font><font color='#BB00BB'>jpeg_huff_decode</font><font face='Lucida Console'>(</font><font color='#5555FF'>&amp;</font>state,get_buffer,bits_left,htbl,nb<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> \
	<b>{</b> failaction; <b>}</b> \
    get_buffer <font color='#5555FF'>=</font> state.get_buffer; bits_left <font color='#5555FF'>=</font> state.bits_left; \
  <b>}</b> \
<b>}</b>


<font color='#009900'>/*
 * Expanded entropy decoder object for Huffman decoding.
 *
 * The savable_state subrecord contains fields that change within an MCU,
 * but must not be updated permanently until we complete the MCU.
 */</font>

<font color='#0000FF'>typedef</font> <font color='#0000FF'>struct</font> <b>{</b>
  <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>int</u></font> EOBRUN;			<font color='#009900'>/* remaining EOBs in EOBRUN */</font>
  <font color='#0000FF'><u>int</u></font> last_dc_val[MAX_COMPS_IN_SCAN];	<font color='#009900'>/* last DC coef for each component */</font>
<b>}</b> savable_state;

<font color='#009900'>/* This macro is to work around compilers with missing or broken
 * structure assignment.  You'll need to fix this code if you have
 * such a compiler and you change MAX_COMPS_IN_SCAN.
 */</font>

<font color='#0000FF'>#ifndef</font> NO_STRUCT_ASSIGN
<font color='#0000FF'>#define</font> ASSIGN_STATE<font face='Lucida Console'>(</font>dest,src<font face='Lucida Console'>)</font>  <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>dest<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>src<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<font color='#0000FF'>#else</font>
<font color='#0000FF'>#if</font> MAX_COMPS_IN_SCAN <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>4</font>
<font color='#0000FF'>#define</font> ASSIGN_STATE<font face='Lucida Console'>(</font>dest,src<font face='Lucida Console'>)</font>  \
	<font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>dest<font face='Lucida Console'>)</font>.EOBRUN <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>src<font face='Lucida Console'>)</font>.EOBRUN, \
	 <font face='Lucida Console'>(</font>dest<font face='Lucida Console'>)</font>.last_dc_val[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>src<font face='Lucida Console'>)</font>.last_dc_val[<font color='#979000'>0</font>], \
	 <font face='Lucida Console'>(</font>dest<font face='Lucida Console'>)</font>.last_dc_val[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>src<font face='Lucida Console'>)</font>.last_dc_val[<font color='#979000'>1</font>], \
	 <font face='Lucida Console'>(</font>dest<font face='Lucida Console'>)</font>.last_dc_val[<font color='#979000'>2</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>src<font face='Lucida Console'>)</font>.last_dc_val[<font color='#979000'>2</font>], \
	 <font face='Lucida Console'>(</font>dest<font face='Lucida Console'>)</font>.last_dc_val[<font color='#979000'>3</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>src<font face='Lucida Console'>)</font>.last_dc_val[<font color='#979000'>3</font>]<font face='Lucida Console'>)</font>
<font color='#0000FF'>#endif</font>
<font color='#0000FF'>#endif</font>


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

  <font color='#009900'>/* These fields are loaded into local variables at start of each MCU.
   * In case of suspension, we exit WITHOUT updating them.
   */</font>
  bitread_perm_state bitstate;	<font color='#009900'>/* Bit buffer at start of MCU */</font>
  savable_state saved;		<font color='#009900'>/* Other state at start of MCU */</font>

  <font color='#009900'>/* These fields are NOT loaded into local working state. */</font>
  boolean insufficient_data;	<font color='#009900'>/* set TRUE after emitting warning */</font>
  <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>int</u></font> restarts_to_go;	<font color='#009900'>/* MCUs left in this restart interval */</font>

  <font color='#009900'>/* Following two fields used only in progressive mode */</font>

  <font color='#009900'>/* Pointers to derived tables (these workspaces have image lifespan) */</font>
  d_derived_tbl <font color='#5555FF'>*</font> derived_tbls[NUM_HUFF_TBLS];

  d_derived_tbl <font color='#5555FF'>*</font> ac_derived_tbl; <font color='#009900'>/* active table during an AC scan */</font>

  <font color='#009900'>/* Following fields used only in sequential mode */</font>

  <font color='#009900'>/* Pointers to derived tables (these workspaces have image lifespan) */</font>
  d_derived_tbl <font color='#5555FF'>*</font> dc_derived_tbls[NUM_HUFF_TBLS];
  d_derived_tbl <font color='#5555FF'>*</font> ac_derived_tbls[NUM_HUFF_TBLS];

  <font color='#009900'>/* Precalculated info set up by start_pass for use in decode_mcu: */</font>

  <font color='#009900'>/* Pointers to derived tables to be used for each block within an MCU */</font>
  d_derived_tbl <font color='#5555FF'>*</font> dc_cur_tbls[D_MAX_BLOCKS_IN_MCU];
  d_derived_tbl <font color='#5555FF'>*</font> ac_cur_tbls[D_MAX_BLOCKS_IN_MCU];
  <font color='#009900'>/* Whether we care about the DC and AC coefficient values for each block */</font>
  <font color='#0000FF'><u>int</u></font> coef_limit[D_MAX_BLOCKS_IN_MCU];
<b>}</b> huff_entropy_decoder;

<font color='#0000FF'>typedef</font> huff_entropy_decoder <font color='#5555FF'>*</font> huff_entropy_ptr;


<font color='#0000FF'>static</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>int</u></font> jpeg_zigzag_order[<font color='#979000'>8</font>][<font color='#979000'>8</font>] <font color='#5555FF'>=</font> <b>{</b>
  <b>{</b>  <font color='#979000'>0</font>,  <font color='#979000'>1</font>,  <font color='#979000'>5</font>,  <font color='#979000'>6</font>, <font color='#979000'>14</font>, <font color='#979000'>15</font>, <font color='#979000'>27</font>, <font color='#979000'>28</font> <b>}</b>,
  <b>{</b>  <font color='#979000'>2</font>,  <font color='#979000'>4</font>,  <font color='#979000'>7</font>, <font color='#979000'>13</font>, <font color='#979000'>16</font>, <font color='#979000'>26</font>, <font color='#979000'>29</font>, <font color='#979000'>42</font> <b>}</b>,
  <b>{</b>  <font color='#979000'>3</font>,  <font color='#979000'>8</font>, <font color='#979000'>12</font>, <font color='#979000'>17</font>, <font color='#979000'>25</font>, <font color='#979000'>30</font>, <font color='#979000'>41</font>, <font color='#979000'>43</font> <b>}</b>,
  <b>{</b>  <font color='#979000'>9</font>, <font color='#979000'>11</font>, <font color='#979000'>18</font>, <font color='#979000'>24</font>, <font color='#979000'>31</font>, <font color='#979000'>40</font>, <font color='#979000'>44</font>, <font color='#979000'>53</font> <b>}</b>,
  <b>{</b> <font color='#979000'>10</font>, <font color='#979000'>19</font>, <font color='#979000'>23</font>, <font color='#979000'>32</font>, <font color='#979000'>39</font>, <font color='#979000'>45</font>, <font color='#979000'>52</font>, <font color='#979000'>54</font> <b>}</b>,
  <b>{</b> <font color='#979000'>20</font>, <font color='#979000'>22</font>, <font color='#979000'>33</font>, <font color='#979000'>38</font>, <font color='#979000'>46</font>, <font color='#979000'>51</font>, <font color='#979000'>55</font>, <font color='#979000'>60</font> <b>}</b>,
  <b>{</b> <font color='#979000'>21</font>, <font color='#979000'>34</font>, <font color='#979000'>37</font>, <font color='#979000'>47</font>, <font color='#979000'>50</font>, <font color='#979000'>56</font>, <font color='#979000'>59</font>, <font color='#979000'>61</font> <b>}</b>,
  <b>{</b> <font color='#979000'>35</font>, <font color='#979000'>36</font>, <font color='#979000'>48</font>, <font color='#979000'>49</font>, <font color='#979000'>57</font>, <font color='#979000'>58</font>, <font color='#979000'>62</font>, <font color='#979000'>63</font> <b>}</b>
<b>}</b>;

<font color='#0000FF'>static</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>int</u></font> jpeg_zigzag_order7[<font color='#979000'>7</font>][<font color='#979000'>7</font>] <font color='#5555FF'>=</font> <b>{</b>
  <b>{</b>  <font color='#979000'>0</font>,  <font color='#979000'>1</font>,  <font color='#979000'>5</font>,  <font color='#979000'>6</font>, <font color='#979000'>14</font>, <font color='#979000'>15</font>, <font color='#979000'>27</font> <b>}</b>,
  <b>{</b>  <font color='#979000'>2</font>,  <font color='#979000'>4</font>,  <font color='#979000'>7</font>, <font color='#979000'>13</font>, <font color='#979000'>16</font>, <font color='#979000'>26</font>, <font color='#979000'>28</font> <b>}</b>,
  <b>{</b>  <font color='#979000'>3</font>,  <font color='#979000'>8</font>, <font color='#979000'>12</font>, <font color='#979000'>17</font>, <font color='#979000'>25</font>, <font color='#979000'>29</font>, <font color='#979000'>38</font> <b>}</b>,
  <b>{</b>  <font color='#979000'>9</font>, <font color='#979000'>11</font>, <font color='#979000'>18</font>, <font color='#979000'>24</font>, <font color='#979000'>30</font>, <font color='#979000'>37</font>, <font color='#979000'>39</font> <b>}</b>,
  <b>{</b> <font color='#979000'>10</font>, <font color='#979000'>19</font>, <font color='#979000'>23</font>, <font color='#979000'>31</font>, <font color='#979000'>36</font>, <font color='#979000'>40</font>, <font color='#979000'>45</font> <b>}</b>,
  <b>{</b> <font color='#979000'>20</font>, <font color='#979000'>22</font>, <font color='#979000'>32</font>, <font color='#979000'>35</font>, <font color='#979000'>41</font>, <font color='#979000'>44</font>, <font color='#979000'>46</font> <b>}</b>,
  <b>{</b> <font color='#979000'>21</font>, <font color='#979000'>33</font>, <font color='#979000'>34</font>, <font color='#979000'>42</font>, <font color='#979000'>43</font>, <font color='#979000'>47</font>, <font color='#979000'>48</font> <b>}</b>
<b>}</b>;

<font color='#0000FF'>static</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>int</u></font> jpeg_zigzag_order6[<font color='#979000'>6</font>][<font color='#979000'>6</font>] <font color='#5555FF'>=</font> <b>{</b>
  <b>{</b>  <font color='#979000'>0</font>,  <font color='#979000'>1</font>,  <font color='#979000'>5</font>,  <font color='#979000'>6</font>, <font color='#979000'>14</font>, <font color='#979000'>15</font> <b>}</b>,
  <b>{</b>  <font color='#979000'>2</font>,  <font color='#979000'>4</font>,  <font color='#979000'>7</font>, <font color='#979000'>13</font>, <font color='#979000'>16</font>, <font color='#979000'>25</font> <b>}</b>,
  <b>{</b>  <font color='#979000'>3</font>,  <font color='#979000'>8</font>, <font color='#979000'>12</font>, <font color='#979000'>17</font>, <font color='#979000'>24</font>, <font color='#979000'>26</font> <b>}</b>,
  <b>{</b>  <font color='#979000'>9</font>, <font color='#979000'>11</font>, <font color='#979000'>18</font>, <font color='#979000'>23</font>, <font color='#979000'>27</font>, <font color='#979000'>32</font> <b>}</b>,
  <b>{</b> <font color='#979000'>10</font>, <font color='#979000'>19</font>, <font color='#979000'>22</font>, <font color='#979000'>28</font>, <font color='#979000'>31</font>, <font color='#979000'>33</font> <b>}</b>,
  <b>{</b> <font color='#979000'>20</font>, <font color='#979000'>21</font>, <font color='#979000'>29</font>, <font color='#979000'>30</font>, <font color='#979000'>34</font>, <font color='#979000'>35</font> <b>}</b>
<b>}</b>;

<font color='#0000FF'>static</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>int</u></font> jpeg_zigzag_order5[<font color='#979000'>5</font>][<font color='#979000'>5</font>] <font color='#5555FF'>=</font> <b>{</b>
  <b>{</b>  <font color='#979000'>0</font>,  <font color='#979000'>1</font>,  <font color='#979000'>5</font>,  <font color='#979000'>6</font>, <font color='#979000'>14</font> <b>}</b>,
  <b>{</b>  <font color='#979000'>2</font>,  <font color='#979000'>4</font>,  <font color='#979000'>7</font>, <font color='#979000'>13</font>, <font color='#979000'>15</font> <b>}</b>,
  <b>{</b>  <font color='#979000'>3</font>,  <font color='#979000'>8</font>, <font color='#979000'>12</font>, <font color='#979000'>16</font>, <font color='#979000'>21</font> <b>}</b>,
  <b>{</b>  <font color='#979000'>9</font>, <font color='#979000'>11</font>, <font color='#979000'>17</font>, <font color='#979000'>20</font>, <font color='#979000'>22</font> <b>}</b>,
  <b>{</b> <font color='#979000'>10</font>, <font color='#979000'>18</font>, <font color='#979000'>19</font>, <font color='#979000'>23</font>, <font color='#979000'>24</font> <b>}</b>
<b>}</b>;

<font color='#0000FF'>static</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>int</u></font> jpeg_zigzag_order4[<font color='#979000'>4</font>][<font color='#979000'>4</font>] <font color='#5555FF'>=</font> <b>{</b>
  <b>{</b> <font color='#979000'>0</font>,  <font color='#979000'>1</font>,  <font color='#979000'>5</font>,  <font color='#979000'>6</font> <b>}</b>,
  <b>{</b> <font color='#979000'>2</font>,  <font color='#979000'>4</font>,  <font color='#979000'>7</font>, <font color='#979000'>12</font> <b>}</b>,
  <b>{</b> <font color='#979000'>3</font>,  <font color='#979000'>8</font>, <font color='#979000'>11</font>, <font color='#979000'>13</font> <b>}</b>,
  <b>{</b> <font color='#979000'>9</font>, <font color='#979000'>10</font>, <font color='#979000'>14</font>, <font color='#979000'>15</font> <b>}</b>
<b>}</b>;

<font color='#0000FF'>static</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>int</u></font> jpeg_zigzag_order3[<font color='#979000'>3</font>][<font color='#979000'>3</font>] <font color='#5555FF'>=</font> <b>{</b>
  <b>{</b> <font color='#979000'>0</font>, <font color='#979000'>1</font>, <font color='#979000'>5</font> <b>}</b>,
  <b>{</b> <font color='#979000'>2</font>, <font color='#979000'>4</font>, <font color='#979000'>6</font> <b>}</b>,
  <b>{</b> <font color='#979000'>3</font>, <font color='#979000'>7</font>, <font color='#979000'>8</font> <b>}</b>
<b>}</b>;

<font color='#0000FF'>static</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>int</u></font> jpeg_zigzag_order2[<font color='#979000'>2</font>][<font color='#979000'>2</font>] <font color='#5555FF'>=</font> <b>{</b>
  <b>{</b> <font color='#979000'>0</font>, <font color='#979000'>1</font> <b>}</b>,
  <b>{</b> <font color='#979000'>2</font>, <font color='#979000'>3</font> <b>}</b>
<b>}</b>;


<font color='#009900'>/*
 * Compute the derived values for a Huffman table.
 * This routine also performs some validation checks on the table.
 */</font>

<b><a name='LOCAL'></a>LOCAL</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>void</u></font><font face='Lucida Console'>)</font>
<b><a name='jpeg_make_d_derived_tbl'></a>jpeg_make_d_derived_tbl</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo, boolean isDC, <font color='#0000FF'><u>int</u></font> tblno,
			 d_derived_tbl <font color='#5555FF'>*</font><font color='#5555FF'>*</font> pdtbl<font face='Lucida Console'>)</font>
<b>{</b>
  JHUFF_TBL <font color='#5555FF'>*</font>htbl;
  d_derived_tbl <font color='#5555FF'>*</font>dtbl;
  <font color='#0000FF'><u>int</u></font> p, i, l, si, numsymbols;
  <font color='#0000FF'><u>int</u></font> lookbits, ctr;
  <font color='#0000FF'><u>char</u></font> huffsize[<font color='#979000'>257</font>];
  <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>int</u></font> huffcode[<font color='#979000'>257</font>];
  <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>int</u></font> code;

  <font color='#009900'>/* Note that huffsize[] and huffcode[] are filled in code-length order,
   * paralleling the order of the symbols themselves in htbl-&gt;huffval[].
   */</font>

  <font color='#009900'>/* Find the input Huffman table */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>tblno <font color='#5555FF'>&lt;</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> tblno <font color='#5555FF'>&gt;</font><font color='#5555FF'>=</font> NUM_HUFF_TBLS<font face='Lucida Console'>)</font>
    <font color='#BB00BB'>ERREXIT1</font><font face='Lucida Console'>(</font>cinfo, JERR_NO_HUFF_TABLE, tblno<font face='Lucida Console'>)</font>;
  htbl <font color='#5555FF'>=</font>
    isDC ? cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dc_huff_tbl_ptrs[tblno] : cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>ac_huff_tbl_ptrs[tblno];
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>htbl <font color='#5555FF'>=</font><font color='#5555FF'>=</font> NULL<font face='Lucida Console'>)</font>
    <font color='#BB00BB'>ERREXIT1</font><font face='Lucida Console'>(</font>cinfo, JERR_NO_HUFF_TABLE, tblno<font face='Lucida Console'>)</font>;

  <font color='#009900'>/* Allocate a workspace if we haven't already done so. */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>pdtbl <font color='#5555FF'>=</font><font color='#5555FF'>=</font> NULL<font face='Lucida Console'>)</font>
    <font color='#5555FF'>*</font>pdtbl <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>d_derived_tbl <font color='#5555FF'>*</font><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>d_derived_tbl<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
  dtbl <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>pdtbl;
  dtbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>pub <font color='#5555FF'>=</font> htbl;		<font color='#009900'>/* fill in back link */</font>
  
  <font color='#009900'>/* Figure C.1: make table of Huffman code length for each symbol */</font>

  p <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
  <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>l <font color='#5555FF'>=</font> <font color='#979000'>1</font>; l <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>16</font>; l<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
    i <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font> htbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bits[l];
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>i <font color='#5555FF'>&lt;</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> p <font color='#5555FF'>+</font> i <font color='#5555FF'>&gt;</font> <font color='#979000'>256</font><font face='Lucida Console'>)</font>	<font color='#009900'>/* protect against table overrun */</font>
      <font color='#BB00BB'>ERREXIT</font><font face='Lucida Console'>(</font>cinfo, JERR_BAD_HUFF_TABLE<font face='Lucida Console'>)</font>;
    <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>i<font color='#5555FF'>-</font><font color='#5555FF'>-</font><font face='Lucida Console'>)</font>
      huffsize[p<font color='#5555FF'>+</font><font color='#5555FF'>+</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font><font face='Lucida Console'>)</font> l;
  <b>}</b>
  huffsize[p] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
  numsymbols <font color='#5555FF'>=</font> p;
  
  <font color='#009900'>/* Figure C.2: generate the codes themselves */</font>
  <font color='#009900'>/* We also validate that the counts represent a legal Huffman code tree. */</font>
  
  code <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
  si <font color='#5555FF'>=</font> huffsize[<font color='#979000'>0</font>];
  p <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
  <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>huffsize[p]<font face='Lucida Console'>)</font> <b>{</b>
    <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font> huffsize[p]<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> si<font face='Lucida Console'>)</font> <b>{</b>
      huffcode[p<font color='#5555FF'>+</font><font color='#5555FF'>+</font>] <font color='#5555FF'>=</font> code;
      code<font color='#5555FF'>+</font><font color='#5555FF'>+</font>;
    <b>}</b>
    <font color='#009900'>/* code is now 1 more than the last code used for codelength si; but
     * it must still fit in si bits, since no code is allowed to be all ones.
     */</font>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>INT32<font face='Lucida Console'>)</font> code<font face='Lucida Console'>)</font> <font color='#5555FF'>&gt;</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>INT32<font face='Lucida Console'>)</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> si<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
      <font color='#BB00BB'>ERREXIT</font><font face='Lucida Console'>(</font>cinfo, JERR_BAD_HUFF_TABLE<font face='Lucida Console'>)</font>;
    code <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>;
    si<font color='#5555FF'>+</font><font color='#5555FF'>+</font>;
  <b>}</b>

  <font color='#009900'>/* Figure F.15: generate decoding tables for bit-sequential decoding */</font>

  p <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
  <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>l <font color='#5555FF'>=</font> <font color='#979000'>1</font>; l <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>16</font>; l<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>htbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bits[l]<font face='Lucida Console'>)</font> <b>{</b>
      <font color='#009900'>/* valoffset[l] = huffval[] index of 1st symbol of code length l,
       * minus the minimum code of length l
       */</font>
      dtbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>valoffset[l] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>INT32<font face='Lucida Console'>)</font> p <font color='#5555FF'>-</font> <font face='Lucida Console'>(</font>INT32<font face='Lucida Console'>)</font> huffcode[p];
      p <font color='#5555FF'>+</font><font color='#5555FF'>=</font> htbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bits[l];
      dtbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>maxcode[l] <font color='#5555FF'>=</font> huffcode[p<font color='#5555FF'>-</font><font color='#979000'>1</font>]; <font color='#009900'>/* maximum code of length l */</font>
    <b>}</b> <font color='#0000FF'>else</font> <b>{</b>
      dtbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>maxcode[l] <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>;	<font color='#009900'>/* -1 if no codes of this length */</font>
    <b>}</b>
  <b>}</b>
  dtbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>maxcode[<font color='#979000'>17</font>] <font color='#5555FF'>=</font> <font color='#979000'>0xFFFFFL</font>; <font color='#009900'>/* ensures jpeg_huff_decode terminates */</font>

  <font color='#009900'>/* Compute lookahead tables to speed up decoding.
   * First we set all the table entries to 0, indicating "too long";
   * then we iterate through the Huffman codes that are short enough and
   * fill in all the entries that correspond to bit sequences starting
   * with that code.
   */</font>

  <font color='#BB00BB'>MEMZERO</font><font face='Lucida Console'>(</font>dtbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>look_nbits, <font color='#BB00BB'>SIZEOF</font><font face='Lucida Console'>(</font>dtbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>look_nbits<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;

  p <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
  <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>l <font color='#5555FF'>=</font> <font color='#979000'>1</font>; l <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> HUFF_LOOKAHEAD; l<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>i <font color='#5555FF'>=</font> <font color='#979000'>1</font>; i <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font> htbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bits[l]; i<font color='#5555FF'>+</font><font color='#5555FF'>+</font>, p<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
      <font color='#009900'>/* l = current code's length, p = its index in huffcode[] &amp; huffval[]. */</font>
      <font color='#009900'>/* Generate left-justified code followed by all possible bit sequences */</font>
      lookbits <font color='#5555FF'>=</font> huffcode[p] <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font face='Lucida Console'>(</font>HUFF_LOOKAHEAD<font color='#5555FF'>-</font>l<font face='Lucida Console'>)</font>;
      <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>ctr <font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font face='Lucida Console'>(</font>HUFF_LOOKAHEAD<font color='#5555FF'>-</font>l<font face='Lucida Console'>)</font>; ctr <font color='#5555FF'>&gt;</font> <font color='#979000'>0</font>; ctr<font color='#5555FF'>-</font><font color='#5555FF'>-</font><font face='Lucida Console'>)</font> <b>{</b>
	dtbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>look_nbits[lookbits] <font color='#5555FF'>=</font> l;
	dtbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>look_sym[lookbits] <font color='#5555FF'>=</font> htbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>huffval[p];
	lookbits<font color='#5555FF'>+</font><font color='#5555FF'>+</font>;
      <b>}</b>
    <b>}</b>
  <b>}</b>

  <font color='#009900'>/* Validate symbols as being reasonable.
   * For AC tables, we make no check, but accept all byte values 0..255.
   * For DC tables, we require the symbols to be in range 0..15.
   * (Tighter bounds could be applied depending on the data depth and mode,
   * but this is sufficient to ensure safe decoding.)
   */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>isDC<font face='Lucida Console'>)</font> <b>{</b>
    <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> numsymbols; i<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
      <font color='#0000FF'><u>int</u></font> sym <font color='#5555FF'>=</font> htbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>huffval[i];
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>sym <font color='#5555FF'>&lt;</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> sym <font color='#5555FF'>&gt;</font> <font color='#979000'>15</font><font face='Lucida Console'>)</font>
	<font color='#BB00BB'>ERREXIT</font><font face='Lucida Console'>(</font>cinfo, JERR_BAD_HUFF_TABLE<font face='Lucida Console'>)</font>;
    <b>}</b>
  <b>}</b>
<b>}</b>


<font color='#009900'>/*
 * Out-of-line code for bit fetching.
 * Note: current values of get_buffer and bits_left are passed as parameters,
 * but are returned in the corresponding fields of the state struct.
 *
 * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width
 * of get_buffer to be used.  (On machines with wider words, an even larger
 * buffer could be used.)  However, on some machines 32-bit shifts are
 * quite slow and take time proportional to the number of places shifted.
 * (This is true with most PC compilers, for instance.)  In this case it may
 * be a win to set MIN_GET_BITS to the minimum value of 15.  This reduces the
 * average shift distance at the cost of more calls to jpeg_fill_bit_buffer.
 */</font>

<font color='#0000FF'>#ifdef</font> SLOW_SHIFT_32
<font color='#0000FF'>#define</font> MIN_GET_BITS  <font color='#979000'>15</font>	<font color='#009900'>/* minimum allowable value */</font>
<font color='#0000FF'>#else</font>
<font color='#0000FF'>#define</font> MIN_GET_BITS  <font face='Lucida Console'>(</font>BIT_BUF_SIZE<font color='#5555FF'>-</font><font color='#979000'>7</font><font face='Lucida Console'>)</font>
<font color='#0000FF'>#endif</font>


<b><a name='LOCAL'></a>LOCAL</b><font face='Lucida Console'>(</font>boolean<font face='Lucida Console'>)</font>
<b><a name='jpeg_fill_bit_buffer'></a>jpeg_fill_bit_buffer</b> <font face='Lucida Console'>(</font>bitread_working_state <font color='#5555FF'>*</font> state,
		      <font color='#0000FF'>register</font> bit_buf_type get_buffer, <font color='#0000FF'>register</font> <font color='#0000FF'><u>int</u></font> bits_left,
		      <font color='#0000FF'><u>int</u></font> nbits<font face='Lucida Console'>)</font>
<font color='#009900'>/* Load up the bit buffer to a depth of at least nbits */</font>
<b>{</b>
  <font color='#009900'>/* Copy heavily used state fields into locals (hopefully registers) */</font>
  <font color='#0000FF'>register</font> <font color='#0000FF'>const</font> JOCTET <font color='#5555FF'>*</font> next_input_byte <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>next_input_byte;
  <font color='#0000FF'>register</font> <font color='#0000FF'><u>size_t</u></font> bytes_in_buffer <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bytes_in_buffer;
  j_decompress_ptr cinfo <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>cinfo;

  <font color='#009900'>/* Attempt to load at least MIN_GET_BITS bits into get_buffer. */</font>
  <font color='#009900'>/* (It is assumed that no request will be for more than that many bits.) */</font>
  <font color='#009900'>/* We fail to do so only if we hit a marker or are forced to suspend. */</font>

  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>unread_marker <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>	<font color='#009900'>/* cannot advance past a marker */</font>
    <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>bits_left <font color='#5555FF'>&lt;</font> MIN_GET_BITS<font face='Lucida Console'>)</font> <b>{</b>
      <font color='#0000FF'>register</font> <font color='#0000FF'><u>int</u></font> c;

      <font color='#009900'>/* Attempt to read a byte */</font>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>bytes_in_buffer <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
	<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>src<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>fill_input_buffer<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
	  <font color='#0000FF'>return</font> FALSE;
	next_input_byte <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>src<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>next_input_byte;
	bytes_in_buffer <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>src<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bytes_in_buffer;
      <b>}</b>
      bytes_in_buffer<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;
      c <font color='#5555FF'>=</font> <font color='#BB00BB'>GETJOCTET</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>next_input_byte<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font>;

      <font color='#009900'>/* If it's 0xFF, check and discard stuffed zero byte */</font>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>c <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0xFF</font><font face='Lucida Console'>)</font> <b>{</b>
	<font color='#009900'>/* Loop here to discard any padding FF's on terminating marker,
	 * so that we can save a valid unread_marker value.  NOTE: we will
	 * accept multiple FF's followed by a 0 as meaning a single FF data
	 * byte.  This data pattern is not valid according to the standard.
	 */</font>
	<font color='#0000FF'>do</font> <b>{</b>
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>bytes_in_buffer <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
	    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>src<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>fill_input_buffer<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
	      <font color='#0000FF'>return</font> FALSE;
	    next_input_byte <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>src<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>next_input_byte;
	    bytes_in_buffer <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>src<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bytes_in_buffer;
	  <b>}</b>
	  bytes_in_buffer<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;
	  c <font color='#5555FF'>=</font> <font color='#BB00BB'>GETJOCTET</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>next_input_byte<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font>;
	<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>c <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0xFF</font><font face='Lucida Console'>)</font>;

	<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>c <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
	  <font color='#009900'>/* Found FF/00, which represents an FF data byte */</font>
	  c <font color='#5555FF'>=</font> <font color='#979000'>0xFF</font>;
	<b>}</b> <font color='#0000FF'>else</font> <b>{</b>
	  <font color='#009900'>/* Oops, it's actually a marker indicating end of compressed data.
	   * Save the marker code for later use.
	   * Fine point: it might appear that we should save the marker into
	   * bitread working state, not straight into permanent state.  But
	   * once we have hit a marker, we cannot need to suspend within the
	   * current MCU, because we will read no more bytes from the data
	   * source.  So it is OK to update permanent state right away.
	   */</font>
	  cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>unread_marker <font color='#5555FF'>=</font> c;
	  <font color='#009900'>/* See if we need to insert some fake zero bits. */</font>
	  <font color='#0000FF'>goto</font> no_more_bytes;
	<b>}</b>
      <b>}</b>

      <font color='#009900'>/* OK, load c into get_buffer */</font>
      get_buffer <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>get_buffer <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>|</font> c;
      bits_left <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>8</font>;
    <b>}</b> <font color='#009900'>/* end while */</font>
  <b>}</b> <font color='#0000FF'>else</font> <b>{</b>
  no_more_bytes:
    <font color='#009900'>/* We get here if we've read the marker that terminates the compressed
     * data segment.  There should be enough bits in the buffer register
     * to satisfy the request; if so, no problem.
     */</font>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>nbits <font color='#5555FF'>&gt;</font> bits_left<font face='Lucida Console'>)</font> <b>{</b>
      <font color='#009900'>/* Uh-oh.  Report corrupted data to user and stuff zeroes into
       * the data stream, so that we can produce some kind of image.
       * We use a nonvolatile flag to ensure that only one warning message
       * appears per data segment.
       */</font>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>huff_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>entropy<font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>insufficient_data<font face='Lucida Console'>)</font> <b>{</b>
	<font color='#BB00BB'>WARNMS</font><font face='Lucida Console'>(</font>cinfo, JWRN_HIT_MARKER<font face='Lucida Console'>)</font>;
	<font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>huff_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>entropy<font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>insufficient_data <font color='#5555FF'>=</font> TRUE;
      <b>}</b>
      <font color='#009900'>/* Fill the buffer with zero bits */</font>
      get_buffer <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> MIN_GET_BITS <font color='#5555FF'>-</font> bits_left;
      bits_left <font color='#5555FF'>=</font> MIN_GET_BITS;
    <b>}</b>
  <b>}</b>

  <font color='#009900'>/* Unload the local registers */</font>
  state<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>next_input_byte <font color='#5555FF'>=</font> next_input_byte;
  state<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bytes_in_buffer <font color='#5555FF'>=</font> bytes_in_buffer;
  state<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>get_buffer <font color='#5555FF'>=</font> get_buffer;
  state<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bits_left <font color='#5555FF'>=</font> bits_left;

  <font color='#0000FF'>return</font> TRUE;
<b>}</b>


<font color='#009900'>/*
 * Figure F.12: extend sign bit.
 * On some machines, a shift and sub will be faster than a table lookup.
 */</font>

<font color='#0000FF'>#ifdef</font> AVOID_TABLES

<font color='#0000FF'>#define</font> BIT_MASK<font face='Lucida Console'>(</font>nbits<font face='Lucida Console'>)</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 face='Lucida Console'>(</font>nbits<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>
<font color='#0000FF'>#define</font> HUFF_EXTEND<font face='Lucida Console'>(</font>x,s<font face='Lucida Console'>)</font>  <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>x<font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font> <font face='Lucida Console'>(</font><font color='#979000'>1</font><font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> ? <font face='Lucida Console'>(</font>x<font face='Lucida Console'>)</font> <font color='#5555FF'>-</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 face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> : <font face='Lucida Console'>(</font>x<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>

<font color='#0000FF'>#else</font>

<font color='#0000FF'>#define</font> BIT_MASK<font face='Lucida Console'>(</font>nbits<font face='Lucida Console'>)</font>   bmask[nbits]
<font color='#0000FF'>#define</font> HUFF_EXTEND<font face='Lucida Console'>(</font>x,s<font face='Lucida Console'>)</font>  <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>x<font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> bmask[<font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font> <font color='#5555FF'>-</font> <font color='#979000'>1</font>] ? <font face='Lucida Console'>(</font>x<font face='Lucida Console'>)</font> <font color='#5555FF'>-</font> bmask[s] : <font face='Lucida Console'>(</font>x<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>

<font color='#0000FF'>static</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>int</u></font> bmask[<font color='#979000'>16</font>] <font color='#5555FF'>=</font>	<font color='#009900'>/* bmask[n] is mask for n rightmost bits */</font>
  <b>{</b> <font color='#979000'>0</font>, <font color='#979000'>0x0001</font>, <font color='#979000'>0x0003</font>, <font color='#979000'>0x0007</font>, <font color='#979000'>0x000F</font>, <font color='#979000'>0x001F</font>, <font color='#979000'>0x003F</font>, <font color='#979000'>0x007F</font>, <font color='#979000'>0x00FF</font>,
    <font color='#979000'>0x01FF</font>, <font color='#979000'>0x03FF</font>, <font color='#979000'>0x07FF</font>, <font color='#979000'>0x0FFF</font>, <font color='#979000'>0x1FFF</font>, <font color='#979000'>0x3FFF</font>, <font color='#979000'>0x7FFF</font> <b>}</b>;

<font color='#0000FF'>#endif</font> <font color='#009900'>/* AVOID_TABLES */</font>


<font color='#009900'>/*
 * Out-of-line code for Huffman code decoding.
 */</font>

<b><a name='LOCAL'></a>LOCAL</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font>
<b><a name='jpeg_huff_decode'></a>jpeg_huff_decode</b> <font face='Lucida Console'>(</font>bitread_working_state <font color='#5555FF'>*</font> state,
		  <font color='#0000FF'>register</font> bit_buf_type get_buffer, <font color='#0000FF'>register</font> <font color='#0000FF'><u>int</u></font> bits_left,
		  d_derived_tbl <font color='#5555FF'>*</font> htbl, <font color='#0000FF'><u>int</u></font> min_bits<font face='Lucida Console'>)</font>
<b>{</b>
  <font color='#0000FF'>register</font> <font color='#0000FF'><u>int</u></font> l <font color='#5555FF'>=</font> min_bits;
  <font color='#0000FF'>register</font> INT32 code;

  <font color='#009900'>/* HUFF_DECODE has determined that the code is at least min_bits */</font>
  <font color='#009900'>/* bits long, so fetch that many bits in one swoop. */</font>

  <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>state, l, <font color='#0000FF'>return</font> <font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>;
  code <font color='#5555FF'>=</font> <font color='#BB00BB'>GET_BITS</font><font face='Lucida Console'>(</font>l<font face='Lucida Console'>)</font>;

  <font color='#009900'>/* Collect the rest of the Huffman code one bit at a time. */</font>
  <font color='#009900'>/* This is per Figure F.16 in the JPEG spec. */</font>

  <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>code <font color='#5555FF'>&gt;</font> htbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>maxcode[l]<font face='Lucida Console'>)</font> <b>{</b>
    code <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>;
    <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>state, <font color='#979000'>1</font>, <font color='#0000FF'>return</font> <font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>;
    code <font color='#5555FF'>|</font><font color='#5555FF'>=</font> <font color='#BB00BB'>GET_BITS</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>;
    l<font color='#5555FF'>+</font><font color='#5555FF'>+</font>;
  <b>}</b>

  <font color='#009900'>/* Unload the local registers */</font>
  state<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>get_buffer <font color='#5555FF'>=</font> get_buffer;
  state<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bits_left <font color='#5555FF'>=</font> bits_left;

  <font color='#009900'>/* With garbage input we may reach the sentinel value l = 17. */</font>

  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>l <font color='#5555FF'>&gt;</font> <font color='#979000'>16</font><font face='Lucida Console'>)</font> <b>{</b>
    <font color='#BB00BB'>WARNMS</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>cinfo, JWRN_HUFF_BAD_CODE<font face='Lucida Console'>)</font>;
    <font color='#0000FF'>return</font> <font color='#979000'>0</font>;			<font color='#009900'>/* fake a zero as the safest result */</font>
  <b>}</b>

  <font color='#0000FF'>return</font> htbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>pub<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>huffval[ <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>code <font color='#5555FF'>+</font> htbl<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>valoffset[l]<font face='Lucida Console'>)</font> ];
<b>}</b>


<font color='#009900'>/*
 * Check for a restart marker &amp; resynchronize decoder.
 * Returns FALSE if must suspend.
 */</font>

<b><a name='LOCAL'></a>LOCAL</b><font face='Lucida Console'>(</font>boolean<font face='Lucida Console'>)</font>
<b><a name='process_restart'></a>process_restart</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo<font face='Lucida Console'>)</font>
<b>{</b>
  huff_entropy_ptr entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>huff_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>entropy;
  <font color='#0000FF'><u>int</u></font> ci;

  <font color='#009900'>/* Throw away any unused bits remaining in bit buffer; */</font>
  <font color='#009900'>/* include any full bytes in next_marker's count of discarded bytes */</font>
  cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>marker<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>discarded_bytes <font color='#5555FF'>+</font><font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate.bits_left <font color='#5555FF'>/</font> <font color='#979000'>8</font>;
  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate.bits_left <font color='#5555FF'>=</font> <font color='#979000'>0</font>;

  <font color='#009900'>/* Advance past the RSTn marker */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>marker<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>read_restart_marker<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
    <font color='#0000FF'>return</font> FALSE;

  <font color='#009900'>/* Re-initialize DC predictions to 0 */</font>
  <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>=</font> <font color='#979000'>0</font>; ci <font color='#5555FF'>&lt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>comps_in_scan; ci<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font>
    entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>saved.last_dc_val[ci] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
  <font color='#009900'>/* Re-init EOB run count, too */</font>
  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>saved.EOBRUN <font color='#5555FF'>=</font> <font color='#979000'>0</font>;

  <font color='#009900'>/* Reset restart counter */</font>
  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restarts_to_go <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restart_interval;

  <font color='#009900'>/* Reset out-of-data flag, unless read_restart_marker left us smack up
   * against a marker.  In that case we will end up treating the next data
   * segment as empty, and we can avoid producing bogus output pixels by
   * leaving the flag set.
   */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>unread_marker <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
    entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>insufficient_data <font color='#5555FF'>=</font> FALSE;

  <font color='#0000FF'>return</font> TRUE;
<b>}</b>


<font color='#009900'>/*
 * Huffman MCU decoding.
 * Each of these routines decodes and returns one MCU's worth of
 * Huffman-compressed coefficients. 
 * The coefficients are reordered from zigzag order into natural array order,
 * but are not dequantized.
 *
 * The i'th block of the MCU is stored into the block pointed to by
 * MCU_data[i].  WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER.
 * (Wholesale zeroing is usually a little faster than retail...)
 *
 * We return FALSE if data source requested suspension.  In that case no
 * changes have been made to permanent state.  (Exception: some output
 * coefficients may already have been assigned.  This is harmless for
 * spectral selection, since we'll just re-assign them on the next call.
 * Successive approximation AC refinement has to be more careful, however.)
 */</font>

<font color='#009900'>/*
 * MCU decoding for DC initial scan (either spectral selection,
 * or first pass of successive approximation).
 */</font>

<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font>boolean<font face='Lucida Console'>)</font>
<b><a name='decode_mcu_DC_first'></a>decode_mcu_DC_first</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo, JBLOCKROW <font color='#5555FF'>*</font>MCU_data<font face='Lucida Console'>)</font>
<b>{</b>   
  huff_entropy_ptr entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>huff_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>entropy;
  <font color='#0000FF'><u>int</u></font> Al <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Al;
  <font color='#0000FF'>register</font> <font color='#0000FF'><u>int</u></font> s, r;
  <font color='#0000FF'><u>int</u></font> blkn, ci;
  JBLOCKROW block;
  BITREAD_STATE_VARS;
  savable_state state;
  d_derived_tbl <font color='#5555FF'>*</font> tbl;
  jpeg_component_info <font color='#5555FF'>*</font> compptr;

  <font color='#009900'>/* Process restart marker if needed; may have to suspend */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restart_interval<font face='Lucida Console'>)</font> <b>{</b>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restarts_to_go <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> <font color='#BB00BB'>process_restart</font><font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
	<font color='#0000FF'>return</font> FALSE;
  <b>}</b>

  <font color='#009900'>/* If we've run out of data, just leave the MCU set to zeroes.
   * This way, we return uniform gray for the remainder of the segment.
   */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>insufficient_data<font face='Lucida Console'>)</font> <b>{</b>

    <font color='#009900'>/* Load up working state */</font>
    <font color='#BB00BB'>BITREAD_LOAD_STATE</font><font face='Lucida Console'>(</font>cinfo,entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate<font face='Lucida Console'>)</font>;
    <font color='#BB00BB'>ASSIGN_STATE</font><font face='Lucida Console'>(</font>state, entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>saved<font face='Lucida Console'>)</font>;

    <font color='#009900'>/* Outer loop handles each block in the MCU */</font>

    <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>blkn <font color='#5555FF'>=</font> <font color='#979000'>0</font>; blkn <font color='#5555FF'>&lt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>blocks_in_MCU; blkn<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
      block <font color='#5555FF'>=</font> MCU_data[blkn];
      ci <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>MCU_membership[blkn];
      compptr <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>cur_comp_info[ci];
      tbl <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>derived_tbls[compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dc_tbl_no];

      <font color='#009900'>/* Decode a single block's worth of coefficients */</font>

      <font color='#009900'>/* Section F.2.2.1: decode the DC coefficient difference */</font>
      <font color='#BB00BB'>HUFF_DECODE</font><font face='Lucida Console'>(</font>s, br_state, tbl, <font color='#0000FF'>return</font> FALSE, label1<font face='Lucida Console'>)</font>;
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font> <b>{</b>
	<font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, s, <font color='#0000FF'>return</font> FALSE<font face='Lucida Console'>)</font>;
	r <font color='#5555FF'>=</font> <font color='#BB00BB'>GET_BITS</font><font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font>;
	s <font color='#5555FF'>=</font> <font color='#BB00BB'>HUFF_EXTEND</font><font face='Lucida Console'>(</font>r, s<font face='Lucida Console'>)</font>;
      <b>}</b>

      <font color='#009900'>/* Convert DC difference to actual value, update last_dc_val */</font>
      s <font color='#5555FF'>+</font><font color='#5555FF'>=</font> state.last_dc_val[ci];
      state.last_dc_val[ci] <font color='#5555FF'>=</font> s;
      <font color='#009900'>/* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */</font>
      <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>block<font face='Lucida Console'>)</font>[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>JCOEF<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>s <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> Al<font face='Lucida Console'>)</font>;
    <b>}</b>

    <font color='#009900'>/* Completed MCU, so update state */</font>
    <font color='#BB00BB'>BITREAD_SAVE_STATE</font><font face='Lucida Console'>(</font>cinfo,entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate<font face='Lucida Console'>)</font>;
    <font color='#BB00BB'>ASSIGN_STATE</font><font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>saved, state<font face='Lucida Console'>)</font>;
  <b>}</b>

  <font color='#009900'>/* Account for restart interval (no-op if not using restarts) */</font>
  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restarts_to_go<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;

  <font color='#0000FF'>return</font> TRUE;
<b>}</b>


<font color='#009900'>/*
 * MCU decoding for AC initial scan (either spectral selection,
 * or first pass of successive approximation).
 */</font>

<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font>boolean<font face='Lucida Console'>)</font>
<b><a name='decode_mcu_AC_first'></a>decode_mcu_AC_first</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo, JBLOCKROW <font color='#5555FF'>*</font>MCU_data<font face='Lucida Console'>)</font>
<b>{</b>   
  huff_entropy_ptr entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>huff_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>entropy;
  <font color='#0000FF'>register</font> <font color='#0000FF'><u>int</u></font> s, k, r;
  <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>int</u></font> EOBRUN;
  <font color='#0000FF'><u>int</u></font> Se, Al;
  <font color='#0000FF'>const</font> <font color='#0000FF'><u>int</u></font> <font color='#5555FF'>*</font> natural_order;
  JBLOCKROW block;
  BITREAD_STATE_VARS;
  d_derived_tbl <font color='#5555FF'>*</font> tbl;

  <font color='#009900'>/* Process restart marker if needed; may have to suspend */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restart_interval<font face='Lucida Console'>)</font> <b>{</b>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restarts_to_go <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> <font color='#BB00BB'>process_restart</font><font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
	<font color='#0000FF'>return</font> FALSE;
  <b>}</b>

  <font color='#009900'>/* If we've run out of data, just leave the MCU set to zeroes.
   * This way, we return uniform gray for the remainder of the segment.
   */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>insufficient_data<font face='Lucida Console'>)</font> <b>{</b>

    Se <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Se;
    Al <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Al;
    natural_order <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>natural_order;

    <font color='#009900'>/* Load up working state.
     * We can avoid loading/saving bitread state if in an EOB run.
     */</font>
    EOBRUN <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>saved.EOBRUN;	<font color='#009900'>/* only part of saved state we need */</font>

    <font color='#009900'>/* There is always only one block per MCU */</font>

    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>EOBRUN <font color='#5555FF'>&gt;</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>		<font color='#009900'>/* if it's a band of zeroes... */</font>
      EOBRUN<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;			<font color='#009900'>/* ...process it now (we do nothing) */</font>
    <font color='#0000FF'>else</font> <b>{</b>
      <font color='#BB00BB'>BITREAD_LOAD_STATE</font><font face='Lucida Console'>(</font>cinfo,entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate<font face='Lucida Console'>)</font>;
      block <font color='#5555FF'>=</font> MCU_data[<font color='#979000'>0</font>];
      tbl <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>ac_derived_tbl;

      <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>k <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ss; k <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> Se; k<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
	<font color='#BB00BB'>HUFF_DECODE</font><font face='Lucida Console'>(</font>s, br_state, tbl, <font color='#0000FF'>return</font> FALSE, label2<font face='Lucida Console'>)</font>;
	r <font color='#5555FF'>=</font> s <font color='#5555FF'>&gt;</font><font color='#5555FF'>&gt;</font> <font color='#979000'>4</font>;
	s <font color='#5555FF'>&amp;</font><font color='#5555FF'>=</font> <font color='#979000'>15</font>;
	<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font> <b>{</b>
	  k <font color='#5555FF'>+</font><font color='#5555FF'>=</font> r;
	  <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, s, <font color='#0000FF'>return</font> FALSE<font face='Lucida Console'>)</font>;
	  r <font color='#5555FF'>=</font> <font color='#BB00BB'>GET_BITS</font><font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font>;
	  s <font color='#5555FF'>=</font> <font color='#BB00BB'>HUFF_EXTEND</font><font face='Lucida Console'>(</font>r, s<font face='Lucida Console'>)</font>;
	  <font color='#009900'>/* Scale and output coefficient in natural (dezigzagged) order */</font>
	  <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>block<font face='Lucida Console'>)</font>[natural_order[k]] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>JCOEF<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>s <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> Al<font face='Lucida Console'>)</font>;
	<b>}</b> <font color='#0000FF'>else</font> <b>{</b>
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>r <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>15</font><font face='Lucida Console'>)</font> <b>{</b>	<font color='#009900'>/* ZRL */</font>
	    k <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>15</font>;		<font color='#009900'>/* skip 15 zeroes in band */</font>
	  <b>}</b> <font color='#0000FF'>else</font> <b>{</b>		<font color='#009900'>/* EOBr, run length is 2^r + appended bits */</font>
	    EOBRUN <font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> r;
	    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>r<font face='Lucida Console'>)</font> <b>{</b>		<font color='#009900'>/* EOBr, r &gt; 0 */</font>
	      <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, r, <font color='#0000FF'>return</font> FALSE<font face='Lucida Console'>)</font>;
	      r <font color='#5555FF'>=</font> <font color='#BB00BB'>GET_BITS</font><font face='Lucida Console'>(</font>r<font face='Lucida Console'>)</font>;
	      EOBRUN <font color='#5555FF'>+</font><font color='#5555FF'>=</font> r;
	    <b>}</b>
	    EOBRUN<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;		<font color='#009900'>/* this band is processed at this moment */</font>
	    <font color='#0000FF'>break</font>;		<font color='#009900'>/* force end-of-band */</font>
	  <b>}</b>
	<b>}</b>
      <b>}</b>

      <font color='#BB00BB'>BITREAD_SAVE_STATE</font><font face='Lucida Console'>(</font>cinfo,entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate<font face='Lucida Console'>)</font>;
    <b>}</b>

    <font color='#009900'>/* Completed MCU, so update state */</font>
    entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>saved.EOBRUN <font color='#5555FF'>=</font> EOBRUN;	<font color='#009900'>/* only part of saved state we need */</font>
  <b>}</b>

  <font color='#009900'>/* Account for restart interval (no-op if not using restarts) */</font>
  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restarts_to_go<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;

  <font color='#0000FF'>return</font> TRUE;
<b>}</b>


<font color='#009900'>/*
 * MCU decoding for DC successive approximation refinement scan.
 * Note: we assume such scans can be multi-component, although the spec
 * is not very clear on the point.
 */</font>

<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font>boolean<font face='Lucida Console'>)</font>
<b><a name='decode_mcu_DC_refine'></a>decode_mcu_DC_refine</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo, JBLOCKROW <font color='#5555FF'>*</font>MCU_data<font face='Lucida Console'>)</font>
<b>{</b>   
  huff_entropy_ptr entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>huff_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>entropy;
  <font color='#0000FF'><u>int</u></font> p1 <font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Al;	<font color='#009900'>/* 1 in the bit position being coded */</font>
  <font color='#0000FF'><u>int</u></font> blkn;
  JBLOCKROW block;
  BITREAD_STATE_VARS;

  <font color='#009900'>/* Process restart marker if needed; may have to suspend */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restart_interval<font face='Lucida Console'>)</font> <b>{</b>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restarts_to_go <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> <font color='#BB00BB'>process_restart</font><font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
	<font color='#0000FF'>return</font> FALSE;
  <b>}</b>

  <font color='#009900'>/* Not worth the cycles to check insufficient_data here,
   * since we will not change the data anyway if we read zeroes.
   */</font>

  <font color='#009900'>/* Load up working state */</font>
  <font color='#BB00BB'>BITREAD_LOAD_STATE</font><font face='Lucida Console'>(</font>cinfo,entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate<font face='Lucida Console'>)</font>;

  <font color='#009900'>/* Outer loop handles each block in the MCU */</font>

  <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>blkn <font color='#5555FF'>=</font> <font color='#979000'>0</font>; blkn <font color='#5555FF'>&lt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>blocks_in_MCU; blkn<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
    block <font color='#5555FF'>=</font> MCU_data[blkn];

    <font color='#009900'>/* Encoded data is simply the next bit of the two's-complement DC value */</font>
    <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, <font color='#979000'>1</font>, <font color='#0000FF'>return</font> FALSE<font face='Lucida Console'>)</font>;
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>GET_BITS</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
      <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>block<font face='Lucida Console'>)</font>[<font color='#979000'>0</font>] <font color='#5555FF'>|</font><font color='#5555FF'>=</font> p1;
    <font color='#009900'>/* Note: since we use |=, repeating the assignment later is safe */</font>
  <b>}</b>

  <font color='#009900'>/* Completed MCU, so update state */</font>
  <font color='#BB00BB'>BITREAD_SAVE_STATE</font><font face='Lucida Console'>(</font>cinfo,entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate<font face='Lucida Console'>)</font>;

  <font color='#009900'>/* Account for restart interval (no-op if not using restarts) */</font>
  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restarts_to_go<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;

  <font color='#0000FF'>return</font> TRUE;
<b>}</b>


<font color='#009900'>/*
 * MCU decoding for AC successive approximation refinement scan.
 */</font>

<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font>boolean<font face='Lucida Console'>)</font>
<b><a name='decode_mcu_AC_refine'></a>decode_mcu_AC_refine</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo, JBLOCKROW <font color='#5555FF'>*</font>MCU_data<font face='Lucida Console'>)</font>
<b>{</b>   
  huff_entropy_ptr entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>huff_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>entropy;
  <font color='#0000FF'>register</font> <font color='#0000FF'><u>int</u></font> s, k, r;
  <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>int</u></font> EOBRUN;
  <font color='#0000FF'><u>int</u></font> Se, p1, m1;
  <font color='#0000FF'>const</font> <font color='#0000FF'><u>int</u></font> <font color='#5555FF'>*</font> natural_order;
  JBLOCKROW block;
  JCOEFPTR thiscoef;
  BITREAD_STATE_VARS;
  d_derived_tbl <font color='#5555FF'>*</font> tbl;
  <font color='#0000FF'><u>int</u></font> num_newnz;
  <font color='#0000FF'><u>int</u></font> newnz_pos[DCTSIZE2];

  <font color='#009900'>/* Process restart marker if needed; may have to suspend */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restart_interval<font face='Lucida Console'>)</font> <b>{</b>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restarts_to_go <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> <font color='#BB00BB'>process_restart</font><font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
	<font color='#0000FF'>return</font> FALSE;
  <b>}</b>

  <font color='#009900'>/* If we've run out of data, don't modify the MCU.
   */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>insufficient_data<font face='Lucida Console'>)</font> <b>{</b>

    Se <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Se;
    p1 <font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Al;	<font color='#009900'>/* 1 in the bit position being coded */</font>
    m1 <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Al;	<font color='#009900'>/* -1 in the bit position being coded */</font>
    natural_order <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>natural_order;

    <font color='#009900'>/* Load up working state */</font>
    <font color='#BB00BB'>BITREAD_LOAD_STATE</font><font face='Lucida Console'>(</font>cinfo,entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate<font face='Lucida Console'>)</font>;
    EOBRUN <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>saved.EOBRUN; <font color='#009900'>/* only part of saved state we need */</font>

    <font color='#009900'>/* There is always only one block per MCU */</font>
    block <font color='#5555FF'>=</font> MCU_data[<font color='#979000'>0</font>];
    tbl <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>ac_derived_tbl;

    <font color='#009900'>/* If we are forced to suspend, we must undo the assignments to any newly
     * nonzero coefficients in the block, because otherwise we'd get confused
     * next time about which coefficients were already nonzero.
     * But we need not undo addition of bits to already-nonzero coefficients;
     * instead, we can test the current bit to see if we already did it.
     */</font>
    num_newnz <font color='#5555FF'>=</font> <font color='#979000'>0</font>;

    <font color='#009900'>/* initialize coefficient loop counter to start of band */</font>
    k <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ss;

    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>EOBRUN <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
      <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>; k <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> Se; k<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
	<font color='#BB00BB'>HUFF_DECODE</font><font face='Lucida Console'>(</font>s, br_state, tbl, <font color='#0000FF'>goto</font> undoit, label3<font face='Lucida Console'>)</font>;
	r <font color='#5555FF'>=</font> s <font color='#5555FF'>&gt;</font><font color='#5555FF'>&gt;</font> <font color='#979000'>4</font>;
	s <font color='#5555FF'>&amp;</font><font color='#5555FF'>=</font> <font color='#979000'>15</font>;
	<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font> <b>{</b>
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>s <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>		<font color='#009900'>/* size of new coef should always be 1 */</font>
	    <font color='#BB00BB'>WARNMS</font><font face='Lucida Console'>(</font>cinfo, JWRN_HUFF_BAD_CODE<font face='Lucida Console'>)</font>;
	  <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, <font color='#979000'>1</font>, <font color='#0000FF'>goto</font> undoit<font face='Lucida Console'>)</font>;
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>GET_BITS</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
	    s <font color='#5555FF'>=</font> p1;		<font color='#009900'>/* newly nonzero coef is positive */</font>
	  <font color='#0000FF'>else</font>
	    s <font color='#5555FF'>=</font> m1;		<font color='#009900'>/* newly nonzero coef is negative */</font>
	<b>}</b> <font color='#0000FF'>else</font> <b>{</b>
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>r <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>15</font><font face='Lucida Console'>)</font> <b>{</b>
	    EOBRUN <font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> r;	<font color='#009900'>/* EOBr, run length is 2^r + appended bits */</font>
	    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>r<font face='Lucida Console'>)</font> <b>{</b>
	      <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, r, <font color='#0000FF'>goto</font> undoit<font face='Lucida Console'>)</font>;
	      r <font color='#5555FF'>=</font> <font color='#BB00BB'>GET_BITS</font><font face='Lucida Console'>(</font>r<font face='Lucida Console'>)</font>;
	      EOBRUN <font color='#5555FF'>+</font><font color='#5555FF'>=</font> r;
	    <b>}</b>
	    <font color='#0000FF'>break</font>;		<font color='#009900'>/* rest of block is handled by EOB logic */</font>
	  <b>}</b>
	  <font color='#009900'>/* note s = 0 for processing ZRL */</font>
	<b>}</b>
	<font color='#009900'>/* Advance over already-nonzero coefs and r still-zero coefs,
	 * appending correction bits to the nonzeroes.  A correction bit is 1
	 * if the absolute value of the coefficient must be increased.
	 */</font>
	<font color='#0000FF'>do</font> <b>{</b>
	  thiscoef <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>block <font color='#5555FF'>+</font> natural_order[k];
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>thiscoef <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
	    <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, <font color='#979000'>1</font>, <font color='#0000FF'>goto</font> undoit<font face='Lucida Console'>)</font>;
	    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>GET_BITS</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b>
	      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>thiscoef <font color='#5555FF'>&amp;</font> p1<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b> <font color='#009900'>/* do nothing if already set it */</font>
		<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>thiscoef <font color='#5555FF'>&gt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
		  <font color='#5555FF'>*</font>thiscoef <font color='#5555FF'>+</font><font color='#5555FF'>=</font> p1;
		<font color='#0000FF'>else</font>
		  <font color='#5555FF'>*</font>thiscoef <font color='#5555FF'>+</font><font color='#5555FF'>=</font> m1;
	      <b>}</b>
	    <b>}</b>
	  <b>}</b> <font color='#0000FF'>else</font> <b>{</b>
	    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>-</font><font color='#5555FF'>-</font>r <font color='#5555FF'>&lt;</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
	      <font color='#0000FF'>break</font>;		<font color='#009900'>/* reached target zero coefficient */</font>
	  <b>}</b>
	  k<font color='#5555FF'>+</font><font color='#5555FF'>+</font>;
	<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>k <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> Se<font face='Lucida Console'>)</font>;
	<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font> <b>{</b>
	  <font color='#0000FF'><u>int</u></font> pos <font color='#5555FF'>=</font> natural_order[k];
	  <font color='#009900'>/* Output newly nonzero coefficient */</font>
	  <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>block<font face='Lucida Console'>)</font>[pos] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>JCOEF<font face='Lucida Console'>)</font> s;
	  <font color='#009900'>/* Remember its position in case we have to suspend */</font>
	  newnz_pos[num_newnz<font color='#5555FF'>+</font><font color='#5555FF'>+</font>] <font color='#5555FF'>=</font> pos;
	<b>}</b>
      <b>}</b>
    <b>}</b>

    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>EOBRUN <font color='#5555FF'>&gt;</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
      <font color='#009900'>/* Scan any remaining coefficient positions after the end-of-band
       * (the last newly nonzero coefficient, if any).  Append a correction
       * bit to each already-nonzero coefficient.  A correction bit is 1
       * if the absolute value of the coefficient must be increased.
       */</font>
      <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>; k <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> Se; k<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
	thiscoef <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>block <font color='#5555FF'>+</font> natural_order[k];
	<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>thiscoef <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
	  <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, <font color='#979000'>1</font>, <font color='#0000FF'>goto</font> undoit<font face='Lucida Console'>)</font>;
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>GET_BITS</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b>
	    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>thiscoef <font color='#5555FF'>&amp;</font> p1<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b> <font color='#009900'>/* do nothing if already changed it */</font>
	      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>thiscoef <font color='#5555FF'>&gt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
		<font color='#5555FF'>*</font>thiscoef <font color='#5555FF'>+</font><font color='#5555FF'>=</font> p1;
	      <font color='#0000FF'>else</font>
		<font color='#5555FF'>*</font>thiscoef <font color='#5555FF'>+</font><font color='#5555FF'>=</font> m1;
	    <b>}</b>
	  <b>}</b>
	<b>}</b>
      <b>}</b>
      <font color='#009900'>/* Count one block completed in EOB run */</font>
      EOBRUN<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;
    <b>}</b>

    <font color='#009900'>/* Completed MCU, so update state */</font>
    <font color='#BB00BB'>BITREAD_SAVE_STATE</font><font face='Lucida Console'>(</font>cinfo,entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate<font face='Lucida Console'>)</font>;
    entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>saved.EOBRUN <font color='#5555FF'>=</font> EOBRUN; <font color='#009900'>/* only part of saved state we need */</font>
  <b>}</b>

  <font color='#009900'>/* Account for restart interval (no-op if not using restarts) */</font>
  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restarts_to_go<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;

  <font color='#0000FF'>return</font> TRUE;

undoit:
  <font color='#009900'>/* Re-zero any output coefficients that we made newly nonzero */</font>
  <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>num_newnz <font color='#5555FF'>&gt;</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
    <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>block<font face='Lucida Console'>)</font>[newnz_pos[<font color='#5555FF'>-</font><font color='#5555FF'>-</font>num_newnz]] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;

  <font color='#0000FF'>return</font> FALSE;
<b>}</b>


<font color='#009900'>/*
 * Decode one MCU's worth of Huffman-compressed coefficients,
 * partial blocks.
 */</font>

<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font>boolean<font face='Lucida Console'>)</font>
<b><a name='decode_mcu_sub'></a>decode_mcu_sub</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo, JBLOCKROW <font color='#5555FF'>*</font>MCU_data<font face='Lucida Console'>)</font>
<b>{</b>
  huff_entropy_ptr entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>huff_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>entropy;
  <font color='#0000FF'>const</font> <font color='#0000FF'><u>int</u></font> <font color='#5555FF'>*</font> natural_order;
  <font color='#0000FF'><u>int</u></font> Se, blkn;
  BITREAD_STATE_VARS;
  savable_state state;

  <font color='#009900'>/* Process restart marker if needed; may have to suspend */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restart_interval<font face='Lucida Console'>)</font> <b>{</b>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restarts_to_go <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> <font color='#BB00BB'>process_restart</font><font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
	<font color='#0000FF'>return</font> FALSE;
  <b>}</b>

  <font color='#009900'>/* If we've run out of data, just leave the MCU set to zeroes.
   * This way, we return uniform gray for the remainder of the segment.
   */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>insufficient_data<font face='Lucida Console'>)</font> <b>{</b>

    natural_order <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>natural_order;
    Se <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>lim_Se;

    <font color='#009900'>/* Load up working state */</font>
    <font color='#BB00BB'>BITREAD_LOAD_STATE</font><font face='Lucida Console'>(</font>cinfo,entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate<font face='Lucida Console'>)</font>;
    <font color='#BB00BB'>ASSIGN_STATE</font><font face='Lucida Console'>(</font>state, entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>saved<font face='Lucida Console'>)</font>;

    <font color='#009900'>/* Outer loop handles each block in the MCU */</font>

    <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>blkn <font color='#5555FF'>=</font> <font color='#979000'>0</font>; blkn <font color='#5555FF'>&lt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>blocks_in_MCU; blkn<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
      JBLOCKROW block <font color='#5555FF'>=</font> MCU_data[blkn];
      d_derived_tbl <font color='#5555FF'>*</font> htbl;
      <font color='#0000FF'>register</font> <font color='#0000FF'><u>int</u></font> s, k, r;
      <font color='#0000FF'><u>int</u></font> coef_limit, ci;

      <font color='#009900'>/* Decode a single block's worth of coefficients */</font>

      <font color='#009900'>/* Section F.2.2.1: decode the DC coefficient difference */</font>
      htbl <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dc_cur_tbls[blkn];
      <font color='#BB00BB'>HUFF_DECODE</font><font face='Lucida Console'>(</font>s, br_state, htbl, <font color='#0000FF'>return</font> FALSE, label1<font face='Lucida Console'>)</font>;

      htbl <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>ac_cur_tbls[blkn];
      k <font color='#5555FF'>=</font> <font color='#979000'>1</font>;
      coef_limit <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>coef_limit[blkn];
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>coef_limit<font face='Lucida Console'>)</font> <b>{</b>
	<font color='#009900'>/* Convert DC difference to actual value, update last_dc_val */</font>
	<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font> <b>{</b>
	  <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, s, <font color='#0000FF'>return</font> FALSE<font face='Lucida Console'>)</font>;
	  r <font color='#5555FF'>=</font> <font color='#BB00BB'>GET_BITS</font><font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font>;
	  s <font color='#5555FF'>=</font> <font color='#BB00BB'>HUFF_EXTEND</font><font face='Lucida Console'>(</font>r, s<font face='Lucida Console'>)</font>;
	<b>}</b>
	ci <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>MCU_membership[blkn];
	s <font color='#5555FF'>+</font><font color='#5555FF'>=</font> state.last_dc_val[ci];
	state.last_dc_val[ci] <font color='#5555FF'>=</font> s;
	<font color='#009900'>/* Output the DC coefficient */</font>
	<font face='Lucida Console'>(</font><font color='#5555FF'>*</font>block<font face='Lucida Console'>)</font>[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>JCOEF<font face='Lucida Console'>)</font> s;

	<font color='#009900'>/* Section F.2.2.2: decode the AC coefficients */</font>
	<font color='#009900'>/* Since zeroes are skipped, output area must be cleared beforehand */</font>
	<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>; k <font color='#5555FF'>&lt;</font> coef_limit; k<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
	  <font color='#BB00BB'>HUFF_DECODE</font><font face='Lucida Console'>(</font>s, br_state, htbl, <font color='#0000FF'>return</font> FALSE, label2<font face='Lucida Console'>)</font>;

	  r <font color='#5555FF'>=</font> s <font color='#5555FF'>&gt;</font><font color='#5555FF'>&gt;</font> <font color='#979000'>4</font>;
	  s <font color='#5555FF'>&amp;</font><font color='#5555FF'>=</font> <font color='#979000'>15</font>;

	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font> <b>{</b>
	    k <font color='#5555FF'>+</font><font color='#5555FF'>=</font> r;
	    <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, s, <font color='#0000FF'>return</font> FALSE<font face='Lucida Console'>)</font>;
	    r <font color='#5555FF'>=</font> <font color='#BB00BB'>GET_BITS</font><font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font>;
	    s <font color='#5555FF'>=</font> <font color='#BB00BB'>HUFF_EXTEND</font><font face='Lucida Console'>(</font>r, s<font face='Lucida Console'>)</font>;
	    <font color='#009900'>/* Output coefficient in natural (dezigzagged) order.
	     * Note: the extra entries in natural_order[] will save us
	     * if k &gt; Se, which could happen if the data is corrupted.
	     */</font>
	    <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>block<font face='Lucida Console'>)</font>[natural_order[k]] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>JCOEF<font face='Lucida Console'>)</font> s;
	  <b>}</b> <font color='#0000FF'>else</font> <b>{</b>
	    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>r <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>15</font><font face='Lucida Console'>)</font>
	      <font color='#0000FF'>goto</font> EndOfBlock;
	    k <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>15</font>;
	  <b>}</b>
	<b>}</b>
      <b>}</b> <font color='#0000FF'>else</font> <b>{</b>
	<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font> <b>{</b>
	  <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, s, <font color='#0000FF'>return</font> FALSE<font face='Lucida Console'>)</font>;
	  <font color='#BB00BB'>DROP_BITS</font><font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font>;
	<b>}</b>
      <b>}</b>

      <font color='#009900'>/* Section F.2.2.2: decode the AC coefficients */</font>
      <font color='#009900'>/* In this path we just discard the values */</font>
      <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>; k <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> Se; k<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
	<font color='#BB00BB'>HUFF_DECODE</font><font face='Lucida Console'>(</font>s, br_state, htbl, <font color='#0000FF'>return</font> FALSE, label3<font face='Lucida Console'>)</font>;

	r <font color='#5555FF'>=</font> s <font color='#5555FF'>&gt;</font><font color='#5555FF'>&gt;</font> <font color='#979000'>4</font>;
	s <font color='#5555FF'>&amp;</font><font color='#5555FF'>=</font> <font color='#979000'>15</font>;

	<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font> <b>{</b>
	  k <font color='#5555FF'>+</font><font color='#5555FF'>=</font> r;
	  <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, s, <font color='#0000FF'>return</font> FALSE<font face='Lucida Console'>)</font>;
	  <font color='#BB00BB'>DROP_BITS</font><font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font>;
	<b>}</b> <font color='#0000FF'>else</font> <b>{</b>
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>r <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>15</font><font face='Lucida Console'>)</font>
	    <font color='#0000FF'>break</font>;
	  k <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>15</font>;
	<b>}</b>
      <b>}</b>

      EndOfBlock: ;
    <b>}</b>

    <font color='#009900'>/* Completed MCU, so update state */</font>
    <font color='#BB00BB'>BITREAD_SAVE_STATE</font><font face='Lucida Console'>(</font>cinfo,entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate<font face='Lucida Console'>)</font>;
    <font color='#BB00BB'>ASSIGN_STATE</font><font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>saved, state<font face='Lucida Console'>)</font>;
  <b>}</b>

  <font color='#009900'>/* Account for restart interval (no-op if not using restarts) */</font>
  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restarts_to_go<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;

  <font color='#0000FF'>return</font> TRUE;
<b>}</b>


<font color='#009900'>/*
 * Decode one MCU's worth of Huffman-compressed coefficients,
 * full-size blocks.
 */</font>

<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font>boolean<font face='Lucida Console'>)</font>
<b><a name='decode_mcu'></a>decode_mcu</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo, JBLOCKROW <font color='#5555FF'>*</font>MCU_data<font face='Lucida Console'>)</font>
<b>{</b>
  huff_entropy_ptr entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>huff_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>entropy;
  <font color='#0000FF'><u>int</u></font> blkn;
  BITREAD_STATE_VARS;
  savable_state state;

  <font color='#009900'>/* Process restart marker if needed; may have to suspend */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restart_interval<font face='Lucida Console'>)</font> <b>{</b>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restarts_to_go <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> <font color='#BB00BB'>process_restart</font><font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
	<font color='#0000FF'>return</font> FALSE;
  <b>}</b>

  <font color='#009900'>/* If we've run out of data, just leave the MCU set to zeroes.
   * This way, we return uniform gray for the remainder of the segment.
   */</font>
  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>insufficient_data<font face='Lucida Console'>)</font> <b>{</b>

    <font color='#009900'>/* Load up working state */</font>
    <font color='#BB00BB'>BITREAD_LOAD_STATE</font><font face='Lucida Console'>(</font>cinfo,entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate<font face='Lucida Console'>)</font>;
    <font color='#BB00BB'>ASSIGN_STATE</font><font face='Lucida Console'>(</font>state, entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>saved<font face='Lucida Console'>)</font>;

    <font color='#009900'>/* Outer loop handles each block in the MCU */</font>

    <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>blkn <font color='#5555FF'>=</font> <font color='#979000'>0</font>; blkn <font color='#5555FF'>&lt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>blocks_in_MCU; blkn<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
      JBLOCKROW block <font color='#5555FF'>=</font> MCU_data[blkn];
      d_derived_tbl <font color='#5555FF'>*</font> htbl;
      <font color='#0000FF'>register</font> <font color='#0000FF'><u>int</u></font> s, k, r;
      <font color='#0000FF'><u>int</u></font> coef_limit, ci;

      <font color='#009900'>/* Decode a single block's worth of coefficients */</font>

      <font color='#009900'>/* Section F.2.2.1: decode the DC coefficient difference */</font>
      htbl <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dc_cur_tbls[blkn];
      <font color='#BB00BB'>HUFF_DECODE</font><font face='Lucida Console'>(</font>s, br_state, htbl, <font color='#0000FF'>return</font> FALSE, label1<font face='Lucida Console'>)</font>;

      htbl <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>ac_cur_tbls[blkn];
      k <font color='#5555FF'>=</font> <font color='#979000'>1</font>;
      coef_limit <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>coef_limit[blkn];
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>coef_limit<font face='Lucida Console'>)</font> <b>{</b>
	<font color='#009900'>/* Convert DC difference to actual value, update last_dc_val */</font>
	<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font> <b>{</b>
	  <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, s, <font color='#0000FF'>return</font> FALSE<font face='Lucida Console'>)</font>;
	  r <font color='#5555FF'>=</font> <font color='#BB00BB'>GET_BITS</font><font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font>;
	  s <font color='#5555FF'>=</font> <font color='#BB00BB'>HUFF_EXTEND</font><font face='Lucida Console'>(</font>r, s<font face='Lucida Console'>)</font>;
	<b>}</b>
	ci <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>MCU_membership[blkn];
	s <font color='#5555FF'>+</font><font color='#5555FF'>=</font> state.last_dc_val[ci];
	state.last_dc_val[ci] <font color='#5555FF'>=</font> s;
	<font color='#009900'>/* Output the DC coefficient */</font>
	<font face='Lucida Console'>(</font><font color='#5555FF'>*</font>block<font face='Lucida Console'>)</font>[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>JCOEF<font face='Lucida Console'>)</font> s;

	<font color='#009900'>/* Section F.2.2.2: decode the AC coefficients */</font>
	<font color='#009900'>/* Since zeroes are skipped, output area must be cleared beforehand */</font>
	<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>; k <font color='#5555FF'>&lt;</font> coef_limit; k<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
	  <font color='#BB00BB'>HUFF_DECODE</font><font face='Lucida Console'>(</font>s, br_state, htbl, <font color='#0000FF'>return</font> FALSE, label2<font face='Lucida Console'>)</font>;

	  r <font color='#5555FF'>=</font> s <font color='#5555FF'>&gt;</font><font color='#5555FF'>&gt;</font> <font color='#979000'>4</font>;
	  s <font color='#5555FF'>&amp;</font><font color='#5555FF'>=</font> <font color='#979000'>15</font>;

	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font> <b>{</b>
	    k <font color='#5555FF'>+</font><font color='#5555FF'>=</font> r;
	    <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, s, <font color='#0000FF'>return</font> FALSE<font face='Lucida Console'>)</font>;
	    r <font color='#5555FF'>=</font> <font color='#BB00BB'>GET_BITS</font><font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font>;
	    s <font color='#5555FF'>=</font> <font color='#BB00BB'>HUFF_EXTEND</font><font face='Lucida Console'>(</font>r, s<font face='Lucida Console'>)</font>;
	    <font color='#009900'>/* Output coefficient in natural (dezigzagged) order.
	     * Note: the extra entries in jpeg_natural_order[] will save us
	     * if k &gt;= DCTSIZE2, which could happen if the data is corrupted.
	     */</font>
	    <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>block<font face='Lucida Console'>)</font>[jpeg_natural_order[k]] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>JCOEF<font face='Lucida Console'>)</font> s;
	  <b>}</b> <font color='#0000FF'>else</font> <b>{</b>
	    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>r <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>15</font><font face='Lucida Console'>)</font>
	      <font color='#0000FF'>goto</font> EndOfBlock;
	    k <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>15</font>;
	  <b>}</b>
	<b>}</b>
      <b>}</b> <font color='#0000FF'>else</font> <b>{</b>
	<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font> <b>{</b>
	  <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, s, <font color='#0000FF'>return</font> FALSE<font face='Lucida Console'>)</font>;
	  <font color='#BB00BB'>DROP_BITS</font><font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font>;
	<b>}</b>
      <b>}</b>

      <font color='#009900'>/* Section F.2.2.2: decode the AC coefficients */</font>
      <font color='#009900'>/* In this path we just discard the values */</font>
      <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>; k <font color='#5555FF'>&lt;</font> DCTSIZE2; k<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
	<font color='#BB00BB'>HUFF_DECODE</font><font face='Lucida Console'>(</font>s, br_state, htbl, <font color='#0000FF'>return</font> FALSE, label3<font face='Lucida Console'>)</font>;

	r <font color='#5555FF'>=</font> s <font color='#5555FF'>&gt;</font><font color='#5555FF'>&gt;</font> <font color='#979000'>4</font>;
	s <font color='#5555FF'>&amp;</font><font color='#5555FF'>=</font> <font color='#979000'>15</font>;

	<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font> <b>{</b>
	  k <font color='#5555FF'>+</font><font color='#5555FF'>=</font> r;
	  <font color='#BB00BB'>CHECK_BIT_BUFFER</font><font face='Lucida Console'>(</font>br_state, s, <font color='#0000FF'>return</font> FALSE<font face='Lucida Console'>)</font>;
	  <font color='#BB00BB'>DROP_BITS</font><font face='Lucida Console'>(</font>s<font face='Lucida Console'>)</font>;
	<b>}</b> <font color='#0000FF'>else</font> <b>{</b>
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>r <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>15</font><font face='Lucida Console'>)</font>
	    <font color='#0000FF'>break</font>;
	  k <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>15</font>;
	<b>}</b>
      <b>}</b>

      EndOfBlock: ;
    <b>}</b>

    <font color='#009900'>/* Completed MCU, so update state */</font>
    <font color='#BB00BB'>BITREAD_SAVE_STATE</font><font face='Lucida Console'>(</font>cinfo,entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate<font face='Lucida Console'>)</font>;
    <font color='#BB00BB'>ASSIGN_STATE</font><font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>saved, state<font face='Lucida Console'>)</font>;
  <b>}</b>

  <font color='#009900'>/* Account for restart interval (no-op if not using restarts) */</font>
  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restarts_to_go<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;

  <font color='#0000FF'>return</font> TRUE;
<b>}</b>


<font color='#009900'>/*
 * Initialize for a Huffman-compressed scan.
 */</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_huff_decoder'></a>start_pass_huff_decoder</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo<font face='Lucida Console'>)</font>
<b>{</b>
  huff_entropy_ptr entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>huff_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>entropy;
  <font color='#0000FF'><u>int</u></font> ci, blkn, tbl, i;
  jpeg_component_info <font color='#5555FF'>*</font> compptr;

  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>progressive_mode<font face='Lucida Console'>)</font> <b>{</b>
    <font color='#009900'>/* Validate progressive scan parameters */</font>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ss <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Se <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
	<font color='#0000FF'>goto</font> bad;
    <b>}</b> <font color='#0000FF'>else</font> <b>{</b>
      <font color='#009900'>/* need not check Ss/Se &lt; 0 since they came from unsigned bytes */</font>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Se <font color='#5555FF'>&lt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ss <font color='#5555FF'>|</font><font color='#5555FF'>|</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Se <font color='#5555FF'>&gt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>lim_Se<font face='Lucida Console'>)</font>
	<font color='#0000FF'>goto</font> bad;
      <font color='#009900'>/* AC scans may have only one component */</font>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>comps_in_scan <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>
	<font color='#0000FF'>goto</font> bad;
    <b>}</b>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ah <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
      <font color='#009900'>/* Successive approximation refinement scan: must have Al = Ah-1. */</font>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ah<font color='#5555FF'>-</font><font color='#979000'>1</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Al<font face='Lucida Console'>)</font>
	<font color='#0000FF'>goto</font> bad;
    <b>}</b>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Al <font color='#5555FF'>&gt;</font> <font color='#979000'>13</font><font face='Lucida Console'>)</font> <b>{</b>	<font color='#009900'>/* need not check for &lt; 0 */</font>
      <font color='#009900'>/* Arguably the maximum Al value should be less than 13 for 8-bit precision,
       * but the spec doesn't say so, and we try to be liberal about what we
       * accept.  Note: large Al values could result in out-of-range DC
       * coefficients during early scans, leading to bizarre displays due to
       * overflows in the IDCT math.  But we won't crash.
       */</font>
      bad:
      <font color='#BB00BB'>ERREXIT4</font><font face='Lucida Console'>(</font>cinfo, JERR_BAD_PROGRESSION,
	       cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ss, cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Se, cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ah, cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Al<font face='Lucida Console'>)</font>;
    <b>}</b>
    <font color='#009900'>/* Update progression status, and verify that scan order is legal.
     * Note that inter-scan inconsistencies are treated as warnings
     * not fatal errors ... not clear if this is right way to behave.
     */</font>
    <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>=</font> <font color='#979000'>0</font>; ci <font color='#5555FF'>&lt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>comps_in_scan; ci<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
      <font color='#0000FF'><u>int</u></font> coefi, cindex <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>cur_comp_info[ci]<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>component_index;
      <font color='#0000FF'><u>int</u></font> <font color='#5555FF'>*</font>coef_bit_ptr <font color='#5555FF'>=</font> <font color='#5555FF'>&amp;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>coef_bits[cindex][<font color='#979000'>0</font>];
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ss <font color='#5555FF'>&amp;</font><font color='#5555FF'>&amp;</font> coef_bit_ptr[<font color='#979000'>0</font>] <font color='#5555FF'>&lt;</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#009900'>/* AC without prior DC scan */</font>
	<font color='#BB00BB'>WARNMS2</font><font face='Lucida Console'>(</font>cinfo, JWRN_BOGUS_PROGRESSION, cindex, <font color='#979000'>0</font><font face='Lucida Console'>)</font>;
      <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>coefi <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ss; coefi <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Se; coefi<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
	<font color='#0000FF'><u>int</u></font> expected <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>coef_bit_ptr[coefi] <font color='#5555FF'>&lt;</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> ? <font color='#979000'>0</font> : coef_bit_ptr[coefi];
	<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ah <font color='#5555FF'>!</font><font color='#5555FF'>=</font> expected<font face='Lucida Console'>)</font>
	  <font color='#BB00BB'>WARNMS2</font><font face='Lucida Console'>(</font>cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi<font face='Lucida Console'>)</font>;
	coef_bit_ptr[coefi] <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Al;
      <b>}</b>
    <b>}</b>

    <font color='#009900'>/* Select MCU decoding routine */</font>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ah <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ss <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
	entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>pub.decode_mcu <font color='#5555FF'>=</font> decode_mcu_DC_first;
      <font color='#0000FF'>else</font>
	entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>pub.decode_mcu <font color='#5555FF'>=</font> decode_mcu_AC_first;
    <b>}</b> <font color='#0000FF'>else</font> <b>{</b>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ss <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
	entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>pub.decode_mcu <font color='#5555FF'>=</font> decode_mcu_DC_refine;
      <font color='#0000FF'>else</font>
	entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>pub.decode_mcu <font color='#5555FF'>=</font> decode_mcu_AC_refine;
    <b>}</b>

    <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>=</font> <font color='#979000'>0</font>; ci <font color='#5555FF'>&lt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>comps_in_scan; ci<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
      compptr <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>cur_comp_info[ci];
      <font color='#009900'>/* Make sure requested tables are present, and compute derived tables.
       * We may build same derived table more than once, but it's not expensive.
       */</font>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ss <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
	<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ah <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>	<font color='#009900'>/* DC refinement needs no table */</font>
	  tbl <font color='#5555FF'>=</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dc_tbl_no;
	  <font color='#BB00BB'>jpeg_make_d_derived_tbl</font><font face='Lucida Console'>(</font>cinfo, TRUE, tbl,
				  <font color='#5555FF'>&amp;</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>derived_tbls[tbl]<font face='Lucida Console'>)</font>;
	<b>}</b>
      <b>}</b> <font color='#0000FF'>else</font> <b>{</b>
	tbl <font color='#5555FF'>=</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>ac_tbl_no;
	<font color='#BB00BB'>jpeg_make_d_derived_tbl</font><font face='Lucida Console'>(</font>cinfo, FALSE, tbl,
				<font color='#5555FF'>&amp;</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>derived_tbls[tbl]<font face='Lucida Console'>)</font>;
	<font color='#009900'>/* remember the single active table */</font>
	entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>ac_derived_tbl <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>derived_tbls[tbl];
      <b>}</b>
      <font color='#009900'>/* Initialize DC predictions to 0 */</font>
      entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>saved.last_dc_val[ci] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
    <b>}</b>

    <font color='#009900'>/* Initialize private state variables */</font>
    entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>saved.EOBRUN <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
  <b>}</b> <font color='#0000FF'>else</font> <b>{</b>
    <font color='#009900'>/* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.
     * This ought to be an error condition, but we make it a warning because
     * there are some baseline files out there with all zeroes in these bytes.
     */</font>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ss <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Ah <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Al <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font>
	<font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>is_baseline <font color='#5555FF'>|</font><font color='#5555FF'>|</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Se <font color='#5555FF'>&lt;</font> DCTSIZE2<font face='Lucida Console'>)</font> <font color='#5555FF'>&amp;</font><font color='#5555FF'>&amp;</font>
	cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>Se <font color='#5555FF'>!</font><font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>lim_Se<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
      <font color='#BB00BB'>WARNMS</font><font face='Lucida Console'>(</font>cinfo, JWRN_NOT_SEQUENTIAL<font face='Lucida Console'>)</font>;

    <font color='#009900'>/* Select MCU decoding routine */</font>
    <font color='#009900'>/* We retain the hard-coded case for full-size blocks.
     * This is not necessary, but it appears that this version is slightly
     * more performant in the given implementation.
     * With an improved implementation we would prefer a single optimized
     * function.
     */</font>
    <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>lim_Se <font color='#5555FF'>!</font><font color='#5555FF'>=</font> DCTSIZE2<font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>
      entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>pub.decode_mcu <font color='#5555FF'>=</font> decode_mcu_sub;
    <font color='#0000FF'>else</font>
      entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>pub.decode_mcu <font color='#5555FF'>=</font> decode_mcu;

    <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>=</font> <font color='#979000'>0</font>; ci <font color='#5555FF'>&lt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>comps_in_scan; ci<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
      compptr <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>cur_comp_info[ci];
      <font color='#009900'>/* Compute derived values for Huffman tables */</font>
      <font color='#009900'>/* We may do this more than once for a table, but it's not expensive */</font>
      tbl <font color='#5555FF'>=</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dc_tbl_no;
      <font color='#BB00BB'>jpeg_make_d_derived_tbl</font><font face='Lucida Console'>(</font>cinfo, TRUE, tbl,
			      <font color='#5555FF'>&amp;</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dc_derived_tbls[tbl]<font face='Lucida Console'>)</font>;
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>lim_Se<font face='Lucida Console'>)</font> <b>{</b>	<font color='#009900'>/* AC needs no table when not present */</font>
	tbl <font color='#5555FF'>=</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>ac_tbl_no;
	<font color='#BB00BB'>jpeg_make_d_derived_tbl</font><font face='Lucida Console'>(</font>cinfo, FALSE, tbl,
				<font color='#5555FF'>&amp;</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>ac_derived_tbls[tbl]<font face='Lucida Console'>)</font>;
      <b>}</b>
      <font color='#009900'>/* Initialize DC predictions to 0 */</font>
      entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>saved.last_dc_val[ci] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
    <b>}</b>

    <font color='#009900'>/* Precalculate decoding info for each block in an MCU of this scan */</font>
    <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>blkn <font color='#5555FF'>=</font> <font color='#979000'>0</font>; blkn <font color='#5555FF'>&lt;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>blocks_in_MCU; blkn<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
      ci <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>MCU_membership[blkn];
      compptr <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>cur_comp_info[ci];
      <font color='#009900'>/* Precalculate which table to use for each block */</font>
      entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dc_cur_tbls[blkn] <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dc_derived_tbls[compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dc_tbl_no];
      entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>ac_cur_tbls[blkn] <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>ac_derived_tbls[compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>ac_tbl_no];
      <font color='#009900'>/* Decide whether we really care about the coefficient values */</font>
      <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>component_needed<font face='Lucida Console'>)</font> <b>{</b>
	ci <font color='#5555FF'>=</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>DCT_v_scaled_size;
	i <font color='#5555FF'>=</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>DCT_h_scaled_size;
	<font color='#0000FF'>switch</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>lim_Se<font face='Lucida Console'>)</font> <b>{</b>
	<font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font color='#979000'>1</font><font color='#5555FF'>*</font><font color='#979000'>1</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>:
	  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>coef_limit[blkn] <font color='#5555FF'>=</font> <font color='#979000'>1</font>;
	  <font color='#0000FF'>break</font>;
	<font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font color='#979000'>2</font><font color='#5555FF'>*</font><font color='#979000'>2</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>:
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> ci <font color='#5555FF'>&gt;</font> <font color='#979000'>2</font><font face='Lucida Console'>)</font> ci <font color='#5555FF'>=</font> <font color='#979000'>2</font>;
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>i <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> i <font color='#5555FF'>&gt;</font> <font color='#979000'>2</font><font face='Lucida Console'>)</font> i <font color='#5555FF'>=</font> <font color='#979000'>2</font>;
	  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>coef_limit[blkn] <font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>+</font> jpeg_zigzag_order2[ci <font color='#5555FF'>-</font> <font color='#979000'>1</font>][i <font color='#5555FF'>-</font> <font color='#979000'>1</font>];
	  <font color='#0000FF'>break</font>;
	<font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font color='#979000'>3</font><font color='#5555FF'>*</font><font color='#979000'>3</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>:
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> ci <font color='#5555FF'>&gt;</font> <font color='#979000'>3</font><font face='Lucida Console'>)</font> ci <font color='#5555FF'>=</font> <font color='#979000'>3</font>;
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>i <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> i <font color='#5555FF'>&gt;</font> <font color='#979000'>3</font><font face='Lucida Console'>)</font> i <font color='#5555FF'>=</font> <font color='#979000'>3</font>;
	  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>coef_limit[blkn] <font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>+</font> jpeg_zigzag_order3[ci <font color='#5555FF'>-</font> <font color='#979000'>1</font>][i <font color='#5555FF'>-</font> <font color='#979000'>1</font>];
	  <font color='#0000FF'>break</font>;
	<font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font color='#979000'>4</font><font color='#5555FF'>*</font><font color='#979000'>4</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>:
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> ci <font color='#5555FF'>&gt;</font> <font color='#979000'>4</font><font face='Lucida Console'>)</font> ci <font color='#5555FF'>=</font> <font color='#979000'>4</font>;
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>i <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> i <font color='#5555FF'>&gt;</font> <font color='#979000'>4</font><font face='Lucida Console'>)</font> i <font color='#5555FF'>=</font> <font color='#979000'>4</font>;
	  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>coef_limit[blkn] <font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>+</font> jpeg_zigzag_order4[ci <font color='#5555FF'>-</font> <font color='#979000'>1</font>][i <font color='#5555FF'>-</font> <font color='#979000'>1</font>];
	  <font color='#0000FF'>break</font>;
	<font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font color='#979000'>5</font><font color='#5555FF'>*</font><font color='#979000'>5</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>:
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> ci <font color='#5555FF'>&gt;</font> <font color='#979000'>5</font><font face='Lucida Console'>)</font> ci <font color='#5555FF'>=</font> <font color='#979000'>5</font>;
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>i <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> i <font color='#5555FF'>&gt;</font> <font color='#979000'>5</font><font face='Lucida Console'>)</font> i <font color='#5555FF'>=</font> <font color='#979000'>5</font>;
	  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>coef_limit[blkn] <font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>+</font> jpeg_zigzag_order5[ci <font color='#5555FF'>-</font> <font color='#979000'>1</font>][i <font color='#5555FF'>-</font> <font color='#979000'>1</font>];
	  <font color='#0000FF'>break</font>;
	<font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font color='#979000'>6</font><font color='#5555FF'>*</font><font color='#979000'>6</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>:
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> ci <font color='#5555FF'>&gt;</font> <font color='#979000'>6</font><font face='Lucida Console'>)</font> ci <font color='#5555FF'>=</font> <font color='#979000'>6</font>;
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>i <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> i <font color='#5555FF'>&gt;</font> <font color='#979000'>6</font><font face='Lucida Console'>)</font> i <font color='#5555FF'>=</font> <font color='#979000'>6</font>;
	  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>coef_limit[blkn] <font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>+</font> jpeg_zigzag_order6[ci <font color='#5555FF'>-</font> <font color='#979000'>1</font>][i <font color='#5555FF'>-</font> <font color='#979000'>1</font>];
	  <font color='#0000FF'>break</font>;
	<font color='#0000FF'>case</font> <font face='Lucida Console'>(</font><font color='#979000'>7</font><font color='#5555FF'>*</font><font color='#979000'>7</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>:
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> ci <font color='#5555FF'>&gt;</font> <font color='#979000'>7</font><font face='Lucida Console'>)</font> ci <font color='#5555FF'>=</font> <font color='#979000'>7</font>;
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>i <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> i <font color='#5555FF'>&gt;</font> <font color='#979000'>7</font><font face='Lucida Console'>)</font> i <font color='#5555FF'>=</font> <font color='#979000'>7</font>;
	  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>coef_limit[blkn] <font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>+</font> jpeg_zigzag_order7[ci <font color='#5555FF'>-</font> <font color='#979000'>1</font>][i <font color='#5555FF'>-</font> <font color='#979000'>1</font>];
	  <font color='#0000FF'>break</font>;
	<font color='#0000FF'>default</font>:
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> ci <font color='#5555FF'>&gt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> ci <font color='#5555FF'>=</font> <font color='#979000'>8</font>;
	  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>i <font color='#5555FF'>&lt;</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> i <font color='#5555FF'>&gt;</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> i <font color='#5555FF'>=</font> <font color='#979000'>8</font>;
	  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>coef_limit[blkn] <font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>+</font> jpeg_zigzag_order[ci <font color='#5555FF'>-</font> <font color='#979000'>1</font>][i <font color='#5555FF'>-</font> <font color='#979000'>1</font>];
	  <font color='#0000FF'>break</font>;
	<b>}</b>
      <b>}</b> <font color='#0000FF'>else</font> <b>{</b>
	entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>coef_limit[blkn] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
      <b>}</b>
    <b>}</b>
  <b>}</b>

  <font color='#009900'>/* Initialize bitread state variables */</font>
  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate.bits_left <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>bitstate.get_buffer <font color='#5555FF'>=</font> <font color='#979000'>0</font>; <font color='#009900'>/* unnecessary, but keeps Purify quiet */</font>
  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>insufficient_data <font color='#5555FF'>=</font> FALSE;

  <font color='#009900'>/* Initialize restart counter */</font>
  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restarts_to_go <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>restart_interval;
<b>}</b>


<font color='#009900'>/*
 * Module initialization routine for Huffman entropy decoding.
 */</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_huff_decoder'></a>jinit_huff_decoder</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo<font face='Lucida Console'>)</font>
<b>{</b>
  huff_entropy_ptr entropy;
  <font color='#0000FF'><u>int</u></font> i;

  entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>huff_entropy_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>huff_entropy_decoder<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
  cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> jpeg_entropy_decoder <font color='#5555FF'>*</font><font face='Lucida Console'>)</font> entropy;
  entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>pub.start_pass <font color='#5555FF'>=</font> start_pass_huff_decoder;

  <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>progressive_mode<font face='Lucida Console'>)</font> <b>{</b>
    <font color='#009900'>/* Create progression status table */</font>
    <font color='#0000FF'><u>int</u></font> <font color='#5555FF'>*</font>coef_bit_ptr, ci;
    cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>coef_bits <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font face='Lucida Console'>)</font>[DCTSIZE2]<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,
				  cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>num_components<font color='#5555FF'>*</font>DCTSIZE2<font color='#5555FF'>*</font><font color='#BB00BB'>SIZEOF</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
    coef_bit_ptr <font color='#5555FF'>=</font> <font color='#5555FF'>&amp;</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>coef_bits[<font color='#979000'>0</font>][<font color='#979000'>0</font>];
    <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>=</font> <font color='#979000'>0</font>; 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><font face='Lucida Console'>)</font>
      <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>
	<font color='#5555FF'>*</font>coef_bit_ptr<font color='#5555FF'>+</font><font color='#5555FF'>+</font> <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>;

    <font color='#009900'>/* Mark derived tables unallocated */</font>
    <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> NUM_HUFF_TBLS; i<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
      entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>derived_tbls[i] <font color='#5555FF'>=</font> NULL;
    <b>}</b>
  <b>}</b> <font color='#0000FF'>else</font> <b>{</b>
    <font color='#009900'>/* Mark tables unallocated */</font>
    <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> NUM_HUFF_TBLS; i<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
      entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>dc_derived_tbls[i] <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font>ac_derived_tbls[i] <font color='#5555FF'>=</font> NULL;
    <b>}</b>
  <b>}</b>
<b>}</b>

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