<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'><</font><font color='#5555FF'><</font>HUFF_LOOKAHEAD]; <font color='#009900'>/* # bits, or 0 if too long */</font> UINT8 look_sym[<font color='#979000'>1</font><font color='#5555FF'><</font><font color='#5555FF'><</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 > 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'>/* => 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'>></font>src<font color='#5555FF'>-</font><font color='#5555FF'>></font>next_input_byte; \ br_state.bytes_in_buffer <font color='#5555FF'>=</font> cinfop<font color='#5555FF'>-</font><font color='#5555FF'>></font>src<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>src<font color='#5555FF'>-</font><font color='#5555FF'>></font>next_input_byte <font color='#5555FF'>=</font> br_state.next_input_byte; \ cinfop<font color='#5555FF'>-</font><font color='#5555FF'>></font>src<font color='#5555FF'>-</font><font color='#5555FF'>></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'><</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'>&</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'>></font><font color='#5555FF'>></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'>&</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'>></font><font color='#5555FF'>></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'>&</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'><</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'>&</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'><</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'>></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'>></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'>&</font>state,get_buffer,bits_left,htbl,nb<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'><</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->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'><</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> tblno <font color='#5555FF'>></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'>></font>dc_huff_tbl_ptrs[tblno] : cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>mem<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'><</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'>></font>bits[l]; <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>i <font color='#5555FF'><</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> p <font color='#5555FF'>+</font> i <font color='#5555FF'>></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'>></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'><</font><font color='#5555FF'><</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'><</font><font color='#5555FF'><</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'><</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'>></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'>></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'>></font>bits[l]; dtbl<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'>></font>look_nbits, <font color='#BB00BB'>SIZEOF</font><font face='Lucida Console'>(</font>dtbl<font color='#5555FF'>-</font><font color='#5555FF'>></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'><</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'><</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'>></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[] & 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'><</font><font color='#5555FF'><</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'><</font><font color='#5555FF'><</font> <font face='Lucida Console'>(</font>HUFF_LOOKAHEAD<font color='#5555FF'>-</font>l<font face='Lucida Console'>)</font>; ctr <font color='#5555FF'>></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'>></font>look_nbits[lookbits] <font color='#5555FF'>=</font> l; dtbl<font color='#5555FF'>-</font><font color='#5555FF'>></font>look_sym[lookbits] <font color='#5555FF'>=</font> htbl<font color='#5555FF'>-</font><font color='#5555FF'>></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'><</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'>></font>huffval[i]; <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>sym <font color='#5555FF'><</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> sym <font color='#5555FF'>></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'>></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'>></font>bytes_in_buffer; j_decompress_ptr cinfo <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'><</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'>></font>src<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>src<font color='#5555FF'>-</font><font color='#5555FF'>></font>next_input_byte; bytes_in_buffer <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>src<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>src<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>src<font color='#5555FF'>-</font><font color='#5555FF'>></font>next_input_byte; bytes_in_buffer <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>src<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'><</font><font color='#5555FF'><</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'>></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'>></font>entropy<font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>entropy<font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#5555FF'>></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'><</font><font color='#5555FF'><</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'>></font>next_input_byte <font color='#5555FF'>=</font> next_input_byte; state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bytes_in_buffer <font color='#5555FF'>=</font> bytes_in_buffer; state<font color='#5555FF'>-</font><font color='#5555FF'>></font>get_buffer <font color='#5555FF'>=</font> get_buffer; state<font color='#5555FF'>-</font><font color='#5555FF'>></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'><</font><font color='#5555FF'><</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'><</font> <font face='Lucida Console'>(</font><font color='#979000'>1</font><font color='#5555FF'><</font><font color='#5555FF'><</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'><</font><font color='#5555FF'><</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'><</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'>></font> htbl<font color='#5555FF'>-</font><font color='#5555FF'>></font>maxcode[l]<font face='Lucida Console'>)</font> <b>{</b> code <font color='#5555FF'><</font><font color='#5555FF'><</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'>></font>get_buffer <font color='#5555FF'>=</font> get_buffer; state<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'>></font>pub<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>valoffset[l]<font face='Lucida Console'>)</font> ]; <b>}</b> <font color='#009900'>/* * Check for a restart marker & 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'>></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'>></font>marker<font color='#5555FF'>-</font><font color='#5555FF'>></font>discarded_bytes <font color='#5555FF'>+</font><font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>bitstate.bits_left <font color='#5555FF'>/</font> <font color='#979000'>8</font>; entropy<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>marker<font color='#5555FF'>-</font><font color='#5555FF'>></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'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'>></font>restarts_to_go <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'>></font>entropy; <font color='#0000FF'><u>int</u></font> Al <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'>></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'>></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'>></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'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>MCU_membership[blkn]; compptr <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>cur_comp_info[ci]; tbl <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>derived_tbls[compptr<font color='#5555FF'>-</font><font color='#5555FF'>></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'><</font><font color='#5555FF'><</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'>></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'>></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'>></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'>></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'>></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'>></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'>></font>insufficient_data<font face='Lucida Console'>)</font> <b>{</b> Se <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se; Al <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Al; natural_order <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'>></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'>></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'>></font>Ss; k <font color='#5555FF'><</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'>></font><font color='#5555FF'>></font> <font color='#979000'>4</font>; s <font color='#5555FF'>&</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'><</font><font color='#5555FF'><</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'><</font><font color='#5555FF'><</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 > 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'>></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'>></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'>></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'>></font>entropy; <font color='#0000FF'><u>int</u></font> p1 <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'>></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'>></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'>></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'>></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'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'>></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'>></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'>></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'>></font>insufficient_data<font face='Lucida Console'>)</font> <b>{</b> Se <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se; p1 <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'>></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'><</font><font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></font>bitstate<font face='Lucida Console'>)</font>; EOBRUN <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'><</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'>></font><font color='#5555FF'>></font> <font color='#979000'>4</font>; s <font color='#5555FF'>&</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'><</font><font color='#5555FF'><</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'>&</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'>></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'><</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'><</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'>></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'><</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'>&</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'>></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'>></font>bitstate<font face='Lucida Console'>)</font>; entropy<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'>></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'>></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'>></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'>></font>insufficient_data<font face='Lucida Console'>)</font> <b>{</b> natural_order <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>natural_order; Se <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'>></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'>></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'><</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'>></font><font color='#5555FF'>></font> <font color='#979000'>4</font>; s <font color='#5555FF'>&</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 > 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'><</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'>></font><font color='#5555FF'>></font> <font color='#979000'>4</font>; s <font color='#5555FF'>&</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'>></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'>></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'>></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'>></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'>></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'>></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'>></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'>></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'>></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'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'>></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'>></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'><</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'>></font><font color='#5555FF'>></font> <font color='#979000'>4</font>; s <font color='#5555FF'>&</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 >= 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'><</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'>></font><font color='#5555FF'>></font> <font color='#979000'>4</font>; s <font color='#5555FF'>&</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'>></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'>></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'>></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'>></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'>></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'>></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'>></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 < 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'>></font>Se <font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ss <font color='#5555FF'>|</font><font color='#5555FF'>|</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se <font color='#5555FF'>></font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'>></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'>></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'>></font>Al <font color='#5555FF'>></font> <font color='#979000'>13</font><font face='Lucida Console'>)</font> <b>{</b> <font color='#009900'>/* need not check for < 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'>></font>Ss, cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se, cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ah, cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>cur_comp_info[ci]<font color='#5555FF'>-</font><font color='#5555FF'>></font>component_index; <font color='#0000FF'><u>int</u></font> <font color='#5555FF'>*</font>coef_bit_ptr <font color='#5555FF'>=</font> <font color='#5555FF'>&</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>Ss <font color='#5555FF'>&</font><font color='#5555FF'>&</font> coef_bit_ptr[<font color='#979000'>0</font>] <font color='#5555FF'><</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'>></font>Ss; coefi <font color='#5555FF'><</font><font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'><</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'>></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'>></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'>></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'>></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'>></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'>></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'>></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'>></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'>></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'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'>></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'>></font>dc_tbl_no; <font color='#BB00BB'>jpeg_make_d_derived_tbl</font><font face='Lucida Console'>(</font>cinfo, TRUE, tbl, <font color='#5555FF'>&</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>ac_tbl_no; <font color='#BB00BB'>jpeg_make_d_derived_tbl</font><font face='Lucida Console'>(</font>cinfo, FALSE, tbl, <font color='#5555FF'>&</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>ac_derived_tbl <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>derived_tbls[tbl]; <b>}</b> <font color='#009900'>/* Initialize DC predictions to 0 */</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'>></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'>></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'>></font>is_baseline <font color='#5555FF'>|</font><font color='#5555FF'>|</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se <font color='#5555FF'><</font> DCTSIZE2<font face='Lucida Console'>)</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se <font color='#5555FF'>!</font><font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></font>pub.decode_mcu <font color='#5555FF'>=</font> decode_mcu_sub; <font color='#0000FF'>else</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></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'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></font>dc_tbl_no; <font color='#BB00BB'>jpeg_make_d_derived_tbl</font><font face='Lucida Console'>(</font>cinfo, TRUE, tbl, <font color='#5555FF'>&</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></font>ac_tbl_no; <font color='#BB00BB'>jpeg_make_d_derived_tbl</font><font face='Lucida Console'>(</font>cinfo, FALSE, tbl, <font color='#5555FF'>&</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>MCU_membership[blkn]; compptr <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>dc_cur_tbls[blkn] <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_derived_tbls[compptr<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_tbl_no]; entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_cur_tbls[blkn] <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_derived_tbls[compptr<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>component_needed<font face='Lucida Console'>)</font> <b>{</b> ci <font color='#5555FF'>=</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>></font>DCT_v_scaled_size; i <font color='#5555FF'>=</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>></font>DCT_h_scaled_size; <font color='#0000FF'>switch</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'><</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> ci <font color='#5555FF'>></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'><</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> i <font color='#5555FF'>></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'>></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'><</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> ci <font color='#5555FF'>></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'><</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> i <font color='#5555FF'>></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'>></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'><</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> ci <font color='#5555FF'>></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'><</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> i <font color='#5555FF'>></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'>></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'><</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> ci <font color='#5555FF'>></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'><</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> i <font color='#5555FF'>></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'>></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'><</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> ci <font color='#5555FF'>></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'><</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> i <font color='#5555FF'>></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'>></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'><</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> ci <font color='#5555FF'>></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'><</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> i <font color='#5555FF'>></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'>></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'><</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> ci <font color='#5555FF'>></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'><</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> i <font color='#5555FF'>></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'>></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'>></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'>></font>bitstate.bits_left <font color='#5555FF'>=</font> <font color='#979000'>0</font>; entropy<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>insufficient_data <font color='#5555FF'>=</font> FALSE; <font color='#009900'>/* Initialize restart counter */</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>restarts_to_go <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></font>mem<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>></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'>></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'>></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'>></font>mem<font color='#5555FF'>-</font><font color='#5555FF'>></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'>></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'>&</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></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'><</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'><</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'>></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'><</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'>></font>dc_derived_tbls[i] <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_derived_tbls[i] <font color='#5555FF'>=</font> NULL; <b>}</b> <b>}</b> <b>}</b> </pre></body></html>