/*M*
//
//
//               INTEL CORPORATION PROPRIETARY INFORMATION
//  This software is supplied under the terms of a license agreement or
//  nondisclosure agreement with Intel Corporation and may not be copied
//  or disclosed except in accordance with the terms of that agreement.
//        Copyright (c) 1998 Intel Corporation. All Rights Reserved.
//
//
//  File:
//    ijl.h
//
//  Purpose:
//    IJL Common Header File
//    This file contains:  definitions for data types, data
//    structures, error codes, and function prototypes used
//    in the Intel(R) JPEG Library (IJL).
//
//  Version:
//    1.0 beta 1
//
*M*/
  #ifndef __IJL_H__
#define __IJL_H__
  
#if defined( __cplusplus )
extern "C" {
#endif
  
#ifndef IJL_ALL_WARNINGS
  #if _MSC_VER >= 1000
  /* nonstandard extension used : nameless struct/union          */
#pragma warning(disable : 4201)
/* nonstandard extension used : bit field types other than int */
#pragma warning(disable : 4214)
/* unreferenced inline function has been removed               */
#pragma warning(disable : 4514)
/* named type definition in parentheses                        */
#pragma warning(disable : 4115)
  #endif /* _MSC_VER >= 1000 */
  #endif /* IJL_ALL_WARNINGS */
 
 
  
#define _X86_
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
  
#ifdef _MSC_VER
#  pragma pack (8)
#endif
  
/* /////////////////////////////////////////////////////////////////////////
// Macros/Constants */
#define IJL_NONE    0
#define IJL_OTHER   255
#define JBUFSIZE    4096    // Size of file I/O buffer (4K).
  #ifndef INT64
#define INT64       __int64
#endif
#ifndef UINT64
#define UINT64      unsigned INT64
#endif
  
#if defined( _IJL_STDIMP_ )
  #  define   IJLAPI(type,name,arg)  \
              extern type WINAPI name arg
  #else
  #  if !defined( _IJL_API_ )
  #    define IJLAPI(type,name,arg)  \
              extern __declspec(dllimport) type WINAPI name arg
  #  else
  #    define IJLAPI(type,name,arg)   \
              extern __declspec(dllexport) type WINAPI name arg
  #  endif // _IJL_API_
#endif //_IJL_STDIMP_
 
 
  /*D*
////////////////////////////////////////////////////////////////////////////
// Name:        IJLibVersion
//
// Purpose:     Stores library version info.
//
// Context:
//
// Example:
//   major           - 1
//   minor           - 0
//   build           - 1
//   Name            - "ijl10.dll"
//   Version         - "1.0.1 Beta1"
//   InternalVersion - "1.0.1.1"
//   BuildDate       - "Sep 22 1998"
//   CallConv        - "DLL"
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef struct _IJLibVersion
{
  int     major;
  int     minor;
  int     build;
  LPCTSTR Name;
  LPCTSTR Version;
  LPCTSTR InternalVersion;
  LPCTSTR BuildDate;
  LPCTSTR CallConv;
  } IJLibVersion;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        IJLIOTYPE
//
// Purpose:     Possible types of data read/write/other operations to be
//              performed by the functions IJL_Read and IJL_Write.
//
//              See the Developer's Guide for details on appropriate usage.
//
// Fields:
//
//  IJL_JFILE_XXXXXXX   Indicates JPEG data in a stdio file.
//
//  IJL_JBUFF_XXXXXXX   Indicates JPEG data in an addressable buffer.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef enum
{
  IJL_SETUP                   = -1,
  
  // Read JPEG parameters (i.e., height, width, channels,
  // sampling, etc.) from a JPEG bit stream.
  IJL_JFILE_READPARAMS        =  0,
  IJL_JBUFF_READPARAMS        =  1,
    // Read a JPEG Interchange Format image.
  IJL_JFILE_READWHOLEIMAGE    =  2,
  IJL_JBUFF_READWHOLEIMAGE    =  3,
    // Read JPEG tables from a JPEG Abbreviated Format bit stream.
  IJL_JFILE_READHEADER        =  4,
  IJL_JBUFF_READHEADER        =  5,
    // Read image info from a JPEG Abbreviated Format bit stream.
  IJL_JFILE_READENTROPY       =  6,
  IJL_JBUFF_READENTROPY       =  7,
    // Write an entire JFIF bit stream.
  IJL_JFILE_WRITEWHOLEIMAGE   =  8,
  IJL_JBUFF_WRITEWHOLEIMAGE   =  9,
    // Write a JPEG Abbreviated Format bit stream.
  IJL_JFILE_WRITEHEADER       = 10,
  IJL_JBUFF_WRITEHEADER       = 11,
    // Write image info to a JPEG Abbreviated Format bit stream.
  IJL_JFILE_WRITEENTROPY      = 12,
  IJL_JBUFF_WRITEENTROPY      = 13,
  
  // Scaled Decoding Options:
  // Reads a JPEG image scaled to 1/2 size.
  IJL_JFILE_READONEHALF       = 14,
  IJL_JBUFF_READONEHALF       = 15,
    // Reads a JPEG image scaled to 1/4 size.
  IJL_JFILE_READONEQUARTER    = 16,
  IJL_JBUFF_READONEQUARTER    = 17,
    // Reads a JPEG image scaled to 1/8 size.
  IJL_JFILE_READONEEIGHTH     = 18,
  IJL_JBUFF_READONEEIGHTH     = 19,
    // Reads an embedded thumbnail from a JFIF bit stream.
  IJL_JFILE_READTHUMBNAIL     = 20,
  IJL_JBUFF_READTHUMBNAIL     = 21
  } IJLIOTYPE;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        IJL_COLOR
//
// Purpose:     Possible color space formats.
//
//              Note these formats do *not* necessarily denote
//              the number of channels in the color space.
//              There exists separate "channel" fields in the
//              JPEG_CORE_PROPERTIES data structure specifically
//              for indicating the number of channels in the
//              JPEG and/or DIB color spaces.
//
//              See the Developer's Guide for details on appropriate usage.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef enum
{
  IJL_RGB         = 1,    // Red-Green-Blue color space.
  IJL_BGR         = 2,    // Reversed channel ordering from IJL_RGB.
  IJL_YCBCR       = 3,    // Luminance-Chrominance color space as defined
                          // by CCIR Recommendation 601.
  IJL_G           = 4,    // Grayscale color space.
  IJL_RGBA_FPX    = 5,    // FlashPix RGB 4 channel color space that
                          // has pre-multiplied opacity.
  IJL_YCBCRA_FPX  = 6     // FlashPix YCbCr 4 channel color space that
                          // has pre-multiplied opacity.
//  IJL_OTHER             // Some other color space not defined by the IJL.
                          // (This means no color space conversion will
                          //  be done by the IJL.)
} IJL_COLOR;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        IJL_JPGSUBSAMPLING
//
// Purpose:     Possible subsampling formats used in the JPEG.
//
//              See the Developer's Guide for details on appropriate usage.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef enum
{
  IJL_411     = 1,    // Valid on a JPEG w/ 3 channels.
  IJL_422     = 2,    // Valid on a JPEG w/ 3 channels.
  IJL_4114    = 3,    // Valid on a JPEG w/ 4 channels.
  IJL_4224    = 4,    // Valid on a JPEG w/ 4 channels.
//  IJL_NONE    = Corresponds to "No Subsampling".
//                Valid on a JPEG w/ any number of channels.
//  IJL_OTHER   = Valid entry, but only used internally to the IJL.
} IJL_JPGSUBSAMPLING;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        IJL_DIBSUBSAMPLING
//
// Purpose:     Possible subsampling formats used in the DIB.
//
//              See the Developer's Guide for details on appropriate usage.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef enum
{
//  IJL_NONE    = Corresponds to "No Subsampling".
} IJL_DIBSUBSAMPLING;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        HUFFMAN_TABLE
//
// Purpose:     Stores Huffman table information in a fast-to-use format.
//
// Context:     Used by Huffman encoder/decoder to access Huffman table
//              data.  Raw Huffman tables are formatted to fit this
//              structure prior to use.
//
// Fields:
//  huff_class  0 == DC Huffman or lossless table, 1 == AC table.
//  ident       Huffman table identifier, 0-3 valid (Extended Baseline).
//  huffelem    Huffman elements for codes <= 8 bits long;
//              contains both zero run-length and symbol length in bits.
//  huffval     Huffman values for codes 9-16 bits in length.
//  mincode     Smallest Huffman code of length n.
//  maxcode     Largest Huffman code of length n.
//  valptr      Starting index into huffval[] for symbols of length k.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef struct _HUFFMAN_TABLE
{
  int             huff_class;
  int             ident;
  unsigned int    huffelem[256];
  unsigned short  huffval[256];
  unsigned short  mincode[17];
  unsigned short  maxcode[18];
  unsigned short  valptr[17];
  } HUFFMAN_TABLE;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        JPEGHuffTable
//
// Purpose:     Stores pointers to JPEG-binary spec compliant
//              Huffman table information.
//
// Context:     Used by interface and table methods to specify encoder
//              tables to generate and store JPEG images.
//
// Fields:
//  bits        Points to number of codes of length i (<=16 supported).
//  vals        Value associated with each Huffman code.
//  hclass      0 == DC table, 1 == AC table.
//  ident       Specifies the identifier for this table.
//              0-3 for extended JPEG compliance.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef struct
{
  unsigned char*  bits;
  unsigned char*  vals;
  unsigned char   hclass;
  unsigned char   ident;
  } JPEGHuffTable;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        QUANT_TABLE
//
// Purpose:     Stores quantization table information in a
//              fast-to-use format.
//
// Context:     Used by quantizer/dequantizer to store formatted
//              quantization tables.
//
// Fields:
//  precision   0 => elements contains 8-bit elements,
//              1 => elements contains 16-bit elements.
//  ident       Table identifier (0-3).
//  elements    Pointer to 64 table elements + 16 extra elements to catch
//              input data errors that may cause malfunction of the
//              Huffman decoder.
//  elarray     Space for elements (see above) plus 8 bytes to align
//              to a quadword boundary.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef struct _QUANT_TABLE
{
  int     precision;
  int     ident;
  short*  elements;
  short   elarray [84];
  } QUANT_TABLE;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        JPEGQuantTable
//
// Purpose:     Stores pointers to JPEG binary spec compliant
//              quantization table information.
//
// Context:     Used by interface and table methods to specify encoder
//              tables to generate and store JPEG images.
//
// Fields:
//  quantizer   Zig-zag order elements specifying quantization factors.
//  ident       Specifies identifier for this table.
//              0-3 valid for Extended Baseline JPEG compliance.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef struct
{
  unsigned char* quantizer;
  unsigned char  ident;
  } JPEGQuantTable;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        FRAME_COMPONENT
//
// Purpose:     One frame-component structure is allocated per component
//              in a frame.
//
// Context:     Used by Huffman decoder to manage components.
//
// Fields:
//  ident       Component identifier.  The tables use this ident to
//              determine the correct table for each component.
//  hsampling   Horizontal subsampling factor for this component,
//              1-4 are legal.
//  vsampling   Vertical subsampling factor for this component,
//              1-4 are legal.
//  quant_sel   Quantization table selector.  The quantization table
//              used by this component is determined via this selector.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef struct _FRAME_COMPONENT
{
  int ident;
  int hsampling;
  int vsampling;
  int quant_sel;
  } FRAME_COMPONENT;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        FRAME
//
// Purpose:     Stores frame-specific data.
//
// Context:     One Frame structure per image.
//
// Fields:
//  precision       Sample precision in bits.
//  width           Width of the source image in pixels.
//  height          Height of the source image in pixels.
//  MCUheight       Height of a frame MCU.
//  MCUwidth        Width of a frame MCU.
//  max_hsampling   Max horiz sampling ratio of any component in the frame.
//  max_vsampling   Max vert sampling ratio of any component in the frame.
//  ncomps          Number of components/channels in the frame.
//  horMCU          Number of horizontal MCUs in the frame.
//  totalMCU        Total number of MCUs in the frame.
//  comps           Array of 'ncomps' component descriptors.
//  restart_interv  Indicates number of MCUs after which to restart the
//                  entropy parameters.
//  SeenAllDCScans  Used when decoding Multiscan images to determine if
//                  all channels of an image have been decoded.
//  SeenAllACScans  (See SeenAllDCScans)
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef struct _FRAME
{
  int              precision;
  int              width;
  int              height;
  int              MCUheight;
  int              MCUwidth;
  int              max_hsampling;
  int              max_vsampling;
  int              ncomps;
  int              horMCU;
  long             totalMCU;
  FRAME_COMPONENT* comps;
  int              restart_interv;
  int              SeenAllDCScans;
  int              SeenAllACScans;
  } FRAME;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        SCAN_COMPONENT
//
// Purpose:     One scan-component structure is allocated per component
//              of each scan in a frame.
//
// Context:     Used by Huffman decoder to manage components within scans.
//
// Fields:
//  comp        Component number, index to the comps member of FRAME.
//  hsampling   Horizontal sampling factor.
//  vsampling   Vertical sampling factor.
//  dc_table    DC Huffman table pointer for this scan.
//  ac_table    AC Huffman table pointer for this scan.
//  quant_table Quantization table pointer for this scan.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef struct
{
  int            comp;
  int            hsampling;
  int            vsampling;
  HUFFMAN_TABLE* dc_table;
  HUFFMAN_TABLE* ac_table;
  QUANT_TABLE*   quant_table;
  } SCAN_COMPONENT;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        SCAN
//
// Purpose:     One SCAN structure is allocated per scan in a frame.
//
// Context:     Used by Huffman decoder to manage scans.
//
// Fields:
//  ncomps          Number of image components in a scan, 1-4 legal.
//  gray_scale      If TRUE, decode only the Y channel.
//  start_spec      Start coefficient of spectral or predictor selector.
//  end_spec        End coefficient of spectral selector.
//  approx_high     High bit position in successive approximation
//                  Progressive coding.
//  approx_low      Low bit position in successive approximation
//                  Progressive coding.
//  restart_interv  Restart interval, 0 if disabled.
//  curxMCU         Next horizontal MCU index to be processed after
//                  an interrupted SCAN.
//  curyMCU         Next vertical MCU index to be processed after
//                  an interrupted SCAN.
//  dc_diff         Array of DC predictor values for DPCM modes.
//  comps           Array of ncomps SCAN_COMPONENT component identifiers.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef struct _SCAN
{
  int             ncomps;
  int             gray_scale;
  int             start_spec;
  int             end_spec;
  int             approx_high;
  int             approx_low;
  UINT            restart_interv;
  DWORD           curxMCU;
  DWORD           curyMCU;
  int             dc_diff[4];
  SCAN_COMPONENT* comps;
  } SCAN;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        DCTTYPE
//
// Purpose:     Possible algorithms to be used to perform the discrete
//              cosine transform (DCT).
//
// Fields:
//  IJL_AAN     The AAN (Arai, Agui, and Nakajima) algorithm from
//              Trans. IEICE, vol. E 71(11), 1095-1097, Nov. 1988.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef enum
{
  IJL_AAN = 0
  } DCTTYPE;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        PROCESSOR_TYPE
//
// Purpose:     Possible types of processors.
//              Note that the enums are defined in ascending order
//              depending upon their various IA32 instruction support.
//
// Fields:
//
// IJL_OTHER_PROC
//      Does not support the CPUID instruction and
//      assumes no Pentium(R) processor instructions.
//
// IJL_PENTIUM_PROC
//      Corresponds to an Intel(R) Pentium(R) processor
//      (or a 100% compatible) that supports the
//      Pentium(R) processor instructions.
//
// IJL_PENTIUM_PRO_PROC
//      Corresponds to an Intel(R) Pentium(R) Pro processor
//      (or a 100% compatible) that supports the
//      Pentium(R) Pro processor instructions.
//
// IJL_PENTIUM_PROC_MMX_TECH
//      Corresponds to an Intel(R) Pentium(R) processor
//      with MMX(TM) technology (or a 100% compatible)
//      that supports the MMX(TM) instructions.
//
// IJL_PENTIUM_II_PROC
//      Corresponds to an Intel(R) Pentium(R) II processor
//      (or a 100% compatible) that supports both the
//      Pentium(R) Pro processor instructions and the
//      MMX(TM) instructions.
//
//  Any additional processor types that support a superset
//  of both the Pentium(R) Pro processor instructions and the
//  MMX(TM) instructions should be given an enum value greater
//  than IJL_PENTIUM_II_PROC.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef enum
{
  IJL_OTHER_PROC              = 0,
  IJL_PENTIUM_PROC            = 1,
  IJL_PENTIUM_PRO_PROC        = 2,
  IJL_PENTIUM_PROC_MMX_TECH   = 3,
  IJL_PENTIUM_II_PROC         = 4
  } PROCESSOR_TYPE;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        ENTROPYSTRUCT
//
// Purpose:     Stores the decoder state information necessary to "jump"
//              to a particular MCU row in a compressed entropy stream.
//
// Context:     Used to persist the decoder state within Decode_Scan when
//              decoding using ROIs.
//
// Fields:
//      offset              Offset (in bytes) into the entropy stream
//                          from the beginning.
//      dcval1              DC val at the beginning of the MCU row
//                          for component 1.
//      dcval2              DC val at the beginning of the MCU row
//                          for component 2.
//      dcval3              DC val at the beginning of the MCU row
//                          for component 3.
//      dcval4              DC val at the beginning of the MCU row
//                          for component 4.
//      bit_buffer_64       64-bit Huffman bit buffer.  Stores current
//                          bit buffer at the start of a MCU row.
//                          Also used as a 32-bit buffer on 32-bit
//                          architectures.
//      bitbuf_bits_valid   Number of valid bits in the above bit buffer.
//      unread_marker       Have any markers been decoded but not
//                          processed at the beginning of a MCU row?
//                          This entry holds the unprocessed marker, or
//                          0 if none.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef struct
{
  DWORD   offset;
  int     dcval1;
  int     dcval2;
  int     dcval3;
  int     dcval4;
  UINT64  bit_buffer_64;
  int     bitbuf_bits_valid;
  BYTE    unread_marker;
  } ENTROPYSTRUCT;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        STATE
//
// Purpose:     Stores the active state of the IJL.
//
// Context:     Used by all low-level routines to store pseudo-global or
//              state variables.
//
// Fields:
//      bit_buffer_64           64-bit bitbuffer utilized by Huffman
//                              encoder/decoder algorithms utilizing routines
//                              designed for MMX(TM) technology.
//      bit_buffer_32           32-bit bitbuffer for all other Huffman
//                              encoder/decoder algorithms.
//      bitbuf_bits_valid       Number of bits in the above two fields that
//                              are valid.
//
//      cur_entropy_ptr         Current position (absolute address) in
//                              the entropy buffer.
//      start_entropy_ptr       Starting position (absolute address) of
//                              the entropy buffer.
//      end_entropy_ptr         Ending position (absolute address) of
//                              the entropy buffer.
//      entropy_bytes_processed Number of bytes actually processed
//                              (passed over) in the entropy buffer.
//      entropy_buf_maxsize     Max size of the entropy buffer.
//      entropy_bytes_left      Number of bytes left in the entropy buffer.
//      Prog_EndOfBlock_Run     Progressive block run counter.
//
//      DIB_ptr                 Temporary offset into the input/output DIB.
//
//      unread_marker           If a marker has been read but not processed,
//                              stick it in this field.
//      processor_type          (0, 1, or 2) == current processor does not
//                              support MMX(TM) instructions.
//                              (3 or 4) == current processor does
//                              support MMX(TM) instructions.
//      cur_scan_comp           On which component of the scan are we working?
//      file                    Process file handle, or
//                              0x00000000 if no file is defined.
//      JPGBuffer               Entropy buffer (~4K).
//
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef struct _STATE
{
  // Bit buffer.
  UINT64          bit_buffer_64;
  DWORD           bit_buffer_32;
  int             bitbuf_bits_valid;
    // Entropy.
  BYTE*           cur_entropy_ptr;
  BYTE*           start_entropy_ptr;
  BYTE*           end_entropy_ptr;
  long            entropy_bytes_processed;
  long            entropy_buf_maxsize;
  int             entropy_bytes_left;
  int             Prog_EndOfBlock_Run;
    // Input or output DIB.
  BYTE*           DIB_ptr;
    // Control.
  BYTE            unread_marker;
  PROCESSOR_TYPE  processor_type;
  int             cur_scan_comp;
  HANDLE          file;
  BYTE            JPGBuffer [JBUFSIZE];
  } STATE;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        FAST_MCU_PROCESSING_TYPE
//
// Purpose:     Advanced Control Option.  Do NOT modify.
//              WARNING:  Used for internal reference only.
//
// Fields:
//
//   IJL_(sampling)_(JPEG color space)_(sampling)_(DIB color space)
//      Decode is read left to right w/ upsampling.
//      Encode is read right to left w/ subsampling.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef enum
{
  IJL_NO_CC_OR_US                     = 0,
    IJL_111_YCBCR_111_RGB               = 1,
  IJL_111_YCBCR_111_BGR               = 2,
    IJL_411_YCBCR_111_RGB               = 3,
  IJL_411_YCBCR_111_BGR               = 4,
    IJL_422_YCBCR_111_RGB               = 5,
  IJL_422_YCBCR_111_BGR               = 6,
    IJL_111_YCBCR_1111_RGBA_FPX         = 7,
  IJL_411_YCBCR_1111_RGBA_FPX         = 8,
  IJL_422_YCBCR_1111_RGBA_FPX         = 9,
    IJL_1111_YCBCRA_FPX_1111_RGBA_FPX   = 10,
  IJL_4114_YCBCRA_FPX_1111_RGBA_FPX   = 11,
  IJL_4224_YCBCRA_FPX_1111_RGBA_FPX   = 12,
    IJL_111_RGB_1111_RGBA_FPX           = 13,
    IJL_1111_RGBA_FPX_1111_RGBA_FPX     = 14
  } FAST_MCU_PROCESSING_TYPE;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        JPEG_PROPERTIES
//
// Purpose:     Stores low-level and control information.  It is used by
//              both the encoder and decoder.  An advanced external user
//              may access this structure to expand the interface
//              capability.
//
//              See the Developer's Guide for an expanded description
//              of this structure and its use.
//
// Context:     Used by all interface methods and most IJL routines.
//
// Fields:
//
//  iotype              IN:     Specifies type of data operation
//                              (read/write/other) to be
//                              performed by IJL_Read or IJL_Write.
//  roi                 IN:     Rectangle-Of-Interest to read from, or
//                              write to, in pixels.
//  dcttype             IN:     DCT alogrithm to be used.
//  fast_processing     OUT:    Supported fast pre/post-processing path.
//                              This is set by the IJL.
//  interrupt           IN:     Signals an interrupt has been requested.
//
//  DIBBytes            IN:     Pointer to buffer of uncompressed data.
//  DIBWidth            IN:     Width of uncompressed data.
//  DIBHeight           IN:     Height of uncompressed data.
//  DIBPadBytes         IN:     Padding (in bytes) at end of each
//                              row in the uncompressed data.
//  DIBChannels         IN:     Number of components in the
//                              uncompressed data.
//  DIBColor            IN:     Color space of uncompressed data.
//  DIBSubsampling      IN:     Required to be IJL_NONE.
//  DIBLineBytes        OUT:    Number of bytes in an output DIB line
//                              including padding.
//
//  JPGFile             IN:     Pointer to file based JPEG.
//  JPGBytes            IN:     Pointer to buffer based JPEG.
//  JPGSizeBytes        IN:     Max buffer size. Used with JPGBytes.
//                      OUT:    Number of compressed bytes written.
//  JPGWidth            IN:     Width of JPEG image.
//                      OUT:    After reading (except READHEADER).
//  JPGHeight           IN:     Height of JPEG image.
//                      OUT:    After reading (except READHEADER).
//  JPGChannels         IN:     Number of components in JPEG image.
//                      OUT:    After reading (except READHEADER).
//  JPGColor            IN:     Color space of JPEG image.
//  JPGSubsampling      IN:     Subsampling of JPEG image.
//                      OUT:    After reading (except READHEADER).
//  JPGThumbWidth       OUT:    JFIF embedded thumbnail width [0-255].
//  JPGThumbHeight      OUT:    JFIF embedded thumbnail height [0-255].
//
//  cconversion_reqd    OUT:    If color conversion done on decode, TRUE.
//  upsampling_reqd     OUT:    If upsampling done on decode, TRUE.
//  jquality            IN:     [0-100] where highest quality is 100.
//  jinterleaveType     IN/OUT: 0 => MCU interleaved file, and
//                              1 => 1 scan per component.
//  numxMCUs            OUT:    Number of MCUs in the x direction.
//  numyMCUs            OUT:    Number of MCUs in the y direction.
//
//  nqtables            IN/OUT: Number of quantization tables.
//  maxquantindex       IN/OUT: Maximum index of quantization tables.
//  nhuffActables       IN/OUT: Number of AC Huffman tables.
//  nhuffDctables       IN/OUT: Number of DC Huffman tables.
//  maxhuffindex        IN/OUT: Maximum index of Huffman tables.
//  jFmtQuant           IN/OUT: Formatted quantization table info.
//  jFmtAcHuffman       IN/OUT: Formatted AC Huffman table info.
//  jFmtDcHuffman       IN/OUT: Formatted DC Huffman table info.
//
//  jEncFmtQuant        IN/OUT: Pointer to one of the above, or
//                              to externally persisted table.
//  jEncFmtAcHuffman    IN/OUT: Pointer to one of the above, or
//                              to externally persisted table.
//  jEncFmtDcHuffman    IN/OUT: Pointer to one of the above, or
//                              to externally persisted table.
//
//  use_default_qtables IN:     Set to default quantization tables.
//                              Clear to supply your own.
//  use_default_htables IN:     Set to default Huffman tables.
//                              Clear to supply your own.
//  rawquanttables      IN:     Up to 4 sets of quantization tables.
//  rawhufftables       IN:     Alternating pairs (DC/AC) of up to 4
//                              sets of raw Huffman tables.
//  HuffIdentifierAC    IN:     Indicates what channel the user-
//                              supplied Huffman AC tables apply to.
//  HuffIdentifierDC    IN:     Indicates what channel the user-
//                              supplied Huffman DC tables apply to.
//
//  jframe              OUT:    Structure with frame-specific info.
//  needframe           OUT:    TRUE when a frame has been detected.
//
//  jscan               Persistence for current scan pointer when
//                      interrupted.
//
//  state               OUT:    Contains info on the state of the IJL.
//  SawAdobeMarker      OUT:    Decoder saw an APP14 marker somewhere.
//  AdobeXform          OUT:    If SawAdobeMarker TRUE, this indicates
//                              the JPEG color space given by that marker.
//
//  rowoffsets          Persistence for the decoder MCU row origins
//                      when decoding by ROI.  Offsets (in bytes
//                      from the beginning of the entropy data)
//                      to the start of each of the decoded rows.
//                      Fill the offsets with -1 if they have not
//                      been initalized and NULL could be the
//                      offset to the first row.
//
//  MCUBuf              OUT:    Quadword aligned internal buffer.
//                              Big enough for the largest MCU
//                              (10 blocks) with extra room for
//                              additional operations.
//  tMCUBuf             OUT:    Version of above, without alignment.
//
//  processor_type      OUT:    Determines type of processor found
//                              during initialization.
//
//  ignoreDCTs          IN:     Assert to bypass DCTs when processing
//                              data.  Required for conformance
//                              testing.
//
//  progressive_found   OUT:    1 when progressive image detected.
//  coef_buffer         IN:     Pointer to a larger buffer containing
//                              frequency coefficients when they
//                              cannot be decoded dynamically
//                              (i.e., as in progressive decoding).
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef struct
{
  // Compression/Decompression control.
  IJLIOTYPE                iotype;               // default = IJL_SETUP
  RECT                     roi;                  // default = 0
  DCTTYPE                  dcttype;              // default = IJL_AAN
  FAST_MCU_PROCESSING_TYPE fast_processing;      // default = IJL_NO_CC_OR_US
  DWORD                    interrupt;            // default = FALSE
  // DIB specific I/O data specifiers.
  BYTE*                    DIBBytes;             // default = NULL
  DWORD                    DIBWidth;             // default = 0
  int                      DIBHeight;            // default = 0
  DWORD                    DIBPadBytes;          // default = 0
  DWORD                    DIBChannels;          // default = 3
  IJL_COLOR                DIBColor;             // default = IJL_BGR
  IJL_DIBSUBSAMPLING       DIBSubsampling;       // default = IJL_NONE
  int                      DIBLineBytes;         // default = 0
  // JPEG specific I/O data specifiers.
  LPTSTR                   JPGFile;              // default = NULL
  BYTE*                    JPGBytes;             // default = NULL
  DWORD                    JPGSizeBytes;         // default = 0
  DWORD                    JPGWidth;             // default = 0
  DWORD                    JPGHeight;            // default = 0
  DWORD                    JPGChannels;          // default = 3
  IJL_COLOR                JPGColor;             // default = IJL_YCBCR
  IJL_JPGSUBSAMPLING       JPGSubsampling;       // default = IJL_411
  DWORD                    JPGThumbWidth;        // default = 0
  DWORD                    JPGThumbHeight;       // default = 0
  // JPEG conversion properties.
  DWORD                    cconversion_reqd;     // default = TRUE
  DWORD                    upsampling_reqd;      // default = TRUE
  DWORD                    jquality;             // default = 75
  DWORD                    jinterleaveType;      // default = 0
  DWORD                    numxMCUs;             // default = 0
  DWORD                    numyMCUs;             // default = 0
  // Tables.
  DWORD                    nqtables;
  DWORD                    maxquantindex;
  DWORD                    nhuffActables;
  DWORD                    nhuffDctables;
  DWORD                    maxhuffindex;
    QUANT_TABLE              jFmtQuant[4];
  HUFFMAN_TABLE            jFmtAcHuffman[4];
  HUFFMAN_TABLE            jFmtDcHuffman[4];
    short*                   jEncFmtQuant[4];
  HUFFMAN_TABLE*           jEncFmtAcHuffman[4];
  HUFFMAN_TABLE*           jEncFmtDcHuffman[4];
    // Allow user-defined tables.
  DWORD                    use_default_qtables;
  DWORD                    use_default_htables;
    JPEGQuantTable           rawquanttables[4];
  JPEGHuffTable            rawhufftables[8];
  BYTE                     HuffIdentifierAC[4];
  BYTE                     HuffIdentifierDC[4];
    // Frame specific members.
  FRAME                    jframe;
  int                      needframe;
    // SCAN persistent members.
  SCAN*                    jscan;
    // State members.
  STATE                    state;
  DWORD                    SawAdobeMarker;
  DWORD                    AdobeXform;
    // ROI decoder members.
  ENTROPYSTRUCT*           rowoffsets;
    // Intermediate buffers.
  BYTE*                    MCUBuf;
  BYTE                     tMCUBuf[720*2];       // ???
  // Processor detected.
  PROCESSOR_TYPE           processor_type;
    // Test specific members.
  DWORD                    ignoreDCTs;
    // Progressive mode members.
  int                      progressive_found;
  short*                   coef_buffer;
  } JPEG_PROPERTIES;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        JPEG_CORE_PROPERTIES
//
// Purpose:     This is the primary data structure between the IJL and
//              the external user.  It stores JPEG state information
//              and controls the IJL.  It is user-modifiable.
//
//              See the Developer's Guide for details on appropriate usage.
//
// Context:     Used by all low-level IJL routines to store
//              pseudo-global information.
//
// Fields:
//
//  UseJPEGPROPERTIES   Set this flag != 0 if you wish to override
//                      the JPEG_CORE_PROPERTIES "IN" parameters with
//                      the JPEG_PROPERTIES parameters.
//
//  DIBBytes            IN:     Pointer to buffer of uncompressed data.
//  DIBWidth            IN:     Width of uncompressed data.
//  DIBHeight           IN:     Height of uncompressed data.
//  DIBPadBytes         IN:     Padding (in bytes) at end of each
//                              row in the uncompressed data.
//  DIBChannels         IN:     Number of components in the
//                              uncompressed data.
//  DIBColor            IN:     Color space of uncompressed data.
//  DIBSubsampling      IN:     Required to be IJL_NONE.
//
//  JPGFile             IN:     Pointer to file based JPEG.
//  JPGBytes            IN:     Pointer to buffer based JPEG.
//  JPGSizeBytes        IN:     Max buffer size. Used with JPGBytes.
//                      OUT:    Number of compressed bytes written.
//  JPGWidth            IN:     Width of JPEG image.
//                      OUT:    After reading (except READHEADER).
//  JPGHeight           IN:     Height of JPEG image.
//                      OUT:    After reading (except READHEADER).
//  JPGChannels         IN:     Number of components in JPEG image.
//                      OUT:    After reading (except READHEADER).
//  JPGColor            IN:     Color space of JPEG image.
//  JPGSubsampling      IN:     Subsampling of JPEG image.
//                      OUT:    After reading (except READHEADER).
//  JPGThumbWidth       OUT:    JFIF embedded thumbnail width [0-255].
//  JPGThumbHeight      OUT:    JFIF embedded thumbnail height [0-255].
//
//  cconversion_reqd    OUT:    If color conversion done on decode, TRUE.
//  upsampling_reqd     OUT:    If upsampling done on decode, TRUE.
//  jquality            IN:     [0-100] where highest quality is 100.
//
//  jprops              "Low-Level" IJL data structure.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef struct _JPEG_CORE_PROPERTIES
{
  DWORD   UseJPEGPROPERTIES;                     // default = 0
  // DIB specific I/O data specifiers.
  BYTE*               DIBBytes;                  // default = NULL
  DWORD               DIBWidth;                  // default = 0
  int                 DIBHeight;                 // default = 0
  DWORD               DIBPadBytes;               // default = 0
  DWORD               DIBChannels;               // default = 3
  IJL_COLOR           DIBColor;                  // default = IJL_BGR
  IJL_DIBSUBSAMPLING  DIBSubsampling;            // default = IJL_NONE
  // JPEG specific I/O data specifiers.
  LPTSTR              JPGFile;                   // default = NULL
  BYTE*               JPGBytes;                  // default = NULL
  DWORD               JPGSizeBytes;              // default = 0
  DWORD               JPGWidth;                  // default = 0
  DWORD               JPGHeight;                 // default = 0
  DWORD               JPGChannels;               // default = 3
  IJL_COLOR           JPGColor;                  // default = IJL_YCBCR
  IJL_JPGSUBSAMPLING  JPGSubsampling;            // default = IJL_411
  DWORD               JPGThumbWidth;             // default = 0
  DWORD               JPGThumbHeight;            // default = 0
  // JPEG conversion properties.
  DWORD               cconversion_reqd;          // default = TRUE
  DWORD               upsampling_reqd;           // default = TRUE
  DWORD               jquality;                  // default = 75
  // Low-level properties.
  JPEG_PROPERTIES     jprops;
  } JPEG_CORE_PROPERTIES;
  
/*D*
////////////////////////////////////////////////////////////////////////////
// Name:        IJLERR
//
// Purpose:     Listing of possible "error" codes returned by the IJL.
//
//              See the Developer's Guide for details on appropriate usage.
//
// Context:     Used for error checking.
//
////////////////////////////////////////////////////////////////////////////
*D*/
  typedef enum
{
  // The following "error" values indicate an "OK" condition.
  IJL_OK                          = 0,
  IJL_INTERRUPT_OK                = 1,
  IJL_ROI_OK                      = 2,
    // The following "error" values indicate an error has occurred.
  IJL_EXCEPTION_DETECTED          =  -1,
  IJL_INVALID_ENCODER             =  -2,
  IJL_UNSUPPORTED_SUBSAMPLING     =  -3,
  IJL_UNSUPPORTED_BYTES_PER_PIXEL =  -4,
  IJL_MEMORY_ERROR                =  -5,
  IJL_BAD_HUFFMAN_TABLE           =  -6,
  IJL_BAD_QUANT_TABLE             =  -7,
  IJL_INVALID_JPEG_PROPERTIES     =  -8,
  IJL_ERR_FILECLOSE               =  -9,
  IJL_INVALID_FILENAME            = -10,
  IJL_ERROR_EOF                   = -11,
  IJL_PROG_NOT_SUPPORTED          = -12,
  IJL_ERR_NOT_JPEG                = -13,
  IJL_ERR_COMP                    = -14,
  IJL_ERR_SOF                     = -15,
  IJL_ERR_DNL                     = -16,
  IJL_ERR_NO_HUF                  = -17,
  IJL_ERR_NO_QUAN                 = -18,
  IJL_ERR_NO_FRAME                = -19,
  IJL_ERR_MULT_FRAME              = -20,
  IJL_ERR_DATA                    = -21,
  IJL_ERR_NO_IMAGE                = -22,
  IJL_FILE_ERROR                  = -23,
  IJL_INTERNAL_ERROR              = -24,
  IJL_BAD_RST_MARKER              = -25,
  IJL_THUMBNAIL_DIB_TOO_SMALL     = -26,
  IJL_THUMBNAIL_DIB_WRONG_COLOR   = -27,
  IJL_RESERVED                    = -99
  } IJLERR;
 
 
  
/* /////////////////////////////////////////////////////////////////////////
//                     Function Prototypes (API Calls)                    //
///////////////////////////////////////////////////////////////////////// */
  /*F*
////////////////////////////////////////////////////////////////////////////
// Name:        ijlInit
//
// Purpose:     Used to initalize the IJL.
//
//              See the Developer's Guide for details on appropriate usage.
//
// Context:     Always call this before anything else.
//              Also, only call this with a new jcprops structure, or
//              after calling IJL_Free.  Otherwise, dynamically
//              allocated memory may be leaked.
//
// Returns:     Any IJLERR value.  IJL_OK indicates success.
//
// Parameters:
//  jcprops     Pointer to an externally allocated
//              JPEG_CORE_PROPERTIES structure.
//
////////////////////////////////////////////////////////////////////////////
*F*/
  IJLAPI(IJLERR, ijlInit, ( JPEG_CORE_PROPERTIES* jcprops ));
  
/*F*
////////////////////////////////////////////////////////////////////////////
// Name:        ijlFree
//
// Purpose:     Used to properly close down the IJL.
//
//              See the Developer's Guide for details on appropriate usage.
//
// Context:     Always call this when done using the IJL to perform
//              clean-up of dynamically allocated memory.
//              Note, IJL_Init will have to be called to use the
//              IJL again.
//
// Returns:     Any IJLERR value.  IJL_OK indicates success.
//
// Parameters:
//  jcprops     Pointer to an externally allocated
//              JPEG_CORE_PROPERTIES structure.
//
////////////////////////////////////////////////////////////////////////////
*F*/
  IJLAPI(IJLERR, ijlFree, ( JPEG_CORE_PROPERTIES* jcprops ));
  
/*F*
////////////////////////////////////////////////////////////////////////////
// Name:        IJL_Read
//
// Purpose:     Used to read JPEG data (entropy, or header, or both) into
//              a user-supplied buffer (to hold the image data) and/or
//              into the JPEG_CORE_PROPERTIES structure (to hold the
//              header info).
//
// Context:     See the Developer's Guide for a detailed description
//              on the use of this function.  The jcprops main data
//              members are checked for consistency.
//
// Returns:     Any IJLERR value.  IJL_OK indicates success.
//
// Parameters:
//  jcprops     Pointer to an externally allocated
//              JPEG_CORE_PROPERTIES structure.
//  iotype      Specifies what type of read operation to perform.
//
////////////////////////////////////////////////////////////////////////////
*F*/
  IJLAPI(IJLERR, ijlRead, ( JPEG_CORE_PROPERTIES* jcprops, IJLIOTYPE iotype ));
  
/*F*
////////////////////////////////////////////////////////////////////////////
// Name:        ijlWrite
//
// Purpose:     Used to write JPEG data (entropy, or header, or both) into
//              a user-supplied buffer (to hold the image data) and/or
//              into the JPEG_CORE_PROPERTIES structure (to hold the
//              header info).
//
// Context:     See the Developer's Guide for a detailed description
//              on the use of this function.  The jcprops main data
//              members are checked for consistency.
//
// Returns:     Any IJLERR value.  IJL_OK indicates success.
//
// Parameters:
//  jcprops     Pointer to an externally allocated
//              JPEG_CORE_PROPERTIES structure.
//  iotype      Specifies what type of write operation to perform.
//
////////////////////////////////////////////////////////////////////////////
*F*/
  IJLAPI(IJLERR, ijlWrite, ( JPEG_CORE_PROPERTIES* jcprops, IJLIOTYPE iotype ));
  
/*F*
////////////////////////////////////////////////////////////////////////////
// Name:        ijlGetLibVersion
//
// Purpose:     To identify the version number of the IJL.
//
// Context:     Call to get the IJL version number.
//
// Returns:     pointer to IJLibVersion struct
//
// Parameters:  none
//
////////////////////////////////////////////////////////////////////////////
*F*/
  IJLAPI(const IJLibVersion*, ijlGetLibVersion, (void));
  
/*F*
////////////////////////////////////////////////////////////////////////////
// Name:        ijlErrorStr
//
// Purpose:     Gets the string to describe error code.
//
// Context:     Is called to get descriptive string on arbitrary IJLERR code.
//
// Returns:     pointer to string
//
// Parameters:  IJLERR - IJL error code
//
////////////////////////////////////////////////////////////////////////////
*F*/
  IJLAPI(const LPCTSTR, ijlErrorStr, (IJLERR code));
 
 
  
#if defined( __cplusplus )
}
#endif
  #endif  // __IJL_H__
   |