Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/FreeImage/PluginGIF.cpp view on Meta::CPAN
// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
// THIS DISCLAIMER.
//
// Use at your own risk!
// ==========================================================
#ifdef _MSC_VER
#pragma warning (disable : 4786) // identifier was truncated to 'number' characters
#endif
#include "FreeImage.h"
#include "Utilities.h"
#include "../Metadata/FreeImageTag.h"
// ==========================================================
// Metadata declarations
// ==========================================================
#define GIF_DISPOSAL_UNSPECIFIED 0
#define GIF_DISPOSAL_LEAVE 1
#define GIF_DISPOSAL_BACKGROUND 2
#define GIF_DISPOSAL_PREVIOUS 3
// ==========================================================
// Constant/Typedef declarations
// ==========================================================
struct GIFinfo {
BOOL read;
//only really used when reading
size_t global_color_table_offset;
int global_color_table_size;
BYTE background_color;
std::vector<size_t> application_extension_offsets;
std::vector<size_t> comment_extension_offsets;
std::vector<size_t> graphic_control_extension_offsets;
std::vector<size_t> image_descriptor_offsets;
GIFinfo() : read(0), global_color_table_offset(0), global_color_table_size(0), background_color(0)
{
}
};
struct PageInfo {
PageInfo(int d, int l, int t, int w, int h) {
disposal_method = d; left = (WORD)l; top = (WORD)t; width = (WORD)w; height = (WORD)h;
}
int disposal_method;
WORD left, top, width, height;
};
//GIF defines a max of 12 bits per code
#define MAX_LZW_CODE 4096
class StringTable
{
public:
StringTable();
~StringTable();
void Initialize(int minCodeSize);
BYTE *FillInputBuffer(int len);
void CompressStart(int bpp, int width);
int CompressEnd(BYTE *buf); //0-4 bytes
bool Compress(BYTE *buf, int *len);
bool Decompress(BYTE *buf, int *len);
void Done(void);
protected:
bool m_done;
int m_minCodeSize, m_clearCode, m_endCode, m_nextCode;
int m_bpp, m_slack; //Compressor information
int m_prefix; //Compressor state variable
int m_codeSize, m_codeMask; //Compressor/Decompressor state variables
int m_oldCode; //Decompressor state variable
int m_partial, m_partialSize; //Compressor/Decompressor bit buffer
int firstPixelPassed; // A specific flag that indicates if the first pixel
// of the whole image had already been read
std::string m_strings[MAX_LZW_CODE]; //This is what is really the "string table" data for the Decompressor
int* m_strmap;
//input buffer
BYTE *m_buffer;
int m_bufferSize, m_bufferRealSize, m_bufferPos, m_bufferShift;
void ClearCompressorTable(void);
void ClearDecompressorTable(void);
};
#define GIF_PACKED_LSD_HAVEGCT 0x80
#define GIF_PACKED_LSD_COLORRES 0x70
#define GIF_PACKED_LSD_GCTSORTED 0x08
#define GIF_PACKED_LSD_GCTSIZE 0x07
#define GIF_PACKED_ID_HAVELCT 0x80
#define GIF_PACKED_ID_INTERLACED 0x40
#define GIF_PACKED_ID_LCTSORTED 0x20
#define GIF_PACKED_ID_RESERVED 0x18
#define GIF_PACKED_ID_LCTSIZE 0x07
#define GIF_PACKED_GCE_RESERVED 0xE0
#define GIF_PACKED_GCE_DISPOSAL 0x1C
#define GIF_PACKED_GCE_WAITINPUT 0x02
#define GIF_PACKED_GCE_HAVETRANS 0x01
#define GIF_BLOCK_IMAGE_DESCRIPTOR 0x2C
#define GIF_BLOCK_EXTENSION 0x21
#define GIF_BLOCK_TRAILER 0x3B
#define GIF_EXT_PLAINTEXT 0x01
#define GIF_EXT_GRAPHIC_CONTROL 0xF9
#define GIF_EXT_COMMENT 0xFE
#define GIF_EXT_APPLICATION 0xFF
#define GIF_INTERLACE_PASSES 4
( run in 0.620 second using v1.01-cache-2.11-cpan-62a16548d74 )