AshanGimhana's picture
Upload folder using huggingface_hub
9375c9a verified
raw
history blame
164 kB
<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>