// jpgd.h - C++ class for JPEG decompression. // Richard Geldreich <[email protected]> // See jpgd.cpp for license (Public Domain or Apache 2.0). #ifndef JPEG_DECODER_H #define JPEG_DECODER_H #include <stdlib.h> #include <stdio.h> #include <setjmp.h> #include <assert.h> #include <stdint.h> #ifdef _MSC_VER #define JPGD_NORETURN … #elif defined(__GNUC__) #define JPGD_NORETURN … #else #define JPGD_NORETURN #endif #define JPGD_HUFF_TREE_MAX_LENGTH … #define JPGD_HUFF_CODE_SIZE_MAX_LENGTH … namespace jpgd { uint8; int16; uint16; uint; int32; // Loads a JPEG image from a memory buffer or a file. // req_comps can be 1 (grayscale), 3 (RGB), or 4 (RGBA). // On return, width/height will be set to the image's dimensions, and actual_comps will be set to the either 1 (grayscale) or 3 (RGB). // Notes: For more control over where and how the source data is read, see the decompress_jpeg_image_from_stream() function below, or call the jpeg_decoder class directly. // Requesting a 8 or 32bpp image is currently a little faster than 24bpp because the jpeg_decoder class itself currently always unpacks to either 8 or 32bpp. unsigned char* decompress_jpeg_image_from_memory(const unsigned char* pSrc_data, int src_data_size, int* width, int* height, int* actual_comps, int req_comps, uint32_t flags = 0); unsigned char* decompress_jpeg_image_from_file(const char* pSrc_filename, int* width, int* height, int* actual_comps, int req_comps, uint32_t flags = 0); // Success/failure error codes. enum jpgd_status { … }; // Input stream interface. // Derive from this class to read input data from sources other than files or memory. Set m_eof_flag to true when no more data is available. // The decoder is rather greedy: it will keep on calling this method until its internal input buffer is full, or until the EOF flag is set. // It the input stream contains data after the JPEG stream's EOI (end of image) marker it will probably be pulled into the internal buffer. // Call the get_total_bytes_read() method to determine the actual size of the JPEG stream after successful decoding. class jpeg_decoder_stream { … }; // stdio FILE stream class. class jpeg_decoder_file_stream : public jpeg_decoder_stream { … }; // Memory stream class. class jpeg_decoder_mem_stream : public jpeg_decoder_stream { … }; // Loads JPEG file from a jpeg_decoder_stream. unsigned char* decompress_jpeg_image_from_stream(jpeg_decoder_stream* pStream, int* width, int* height, int* actual_comps, int req_comps, uint32_t flags = 0); enum { … }; jpgd_quant_t; jpgd_block_coeff_t; class jpeg_decoder { … }; } // namespace jpgd #endif // JPEG_DECODER_H