Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/FreeImage/PluginGIF.cpp view on Meta::CPAN
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
static int g_GifInterlaceOffset[GIF_INTERLACE_PASSES] = {0, 4, 2, 1};
static int g_GifInterlaceIncrement[GIF_INTERLACE_PASSES] = {8, 8, 4, 2};
// ==========================================================
// Helpers Functions
// ==========================================================
static BOOL
FreeImage_SetMetadataEx(FREE_IMAGE_MDMODEL model, FIBITMAP *dib, const char *key, WORD id, FREE_IMAGE_MDTYPE type, DWORD count, DWORD length, const void *value)
{
BOOL bResult = FALSE;
FITAG *tag = FreeImage_CreateTag();
if(tag) {
FreeImage_SetTagKey(tag, key);
FreeImage_SetTagID(tag, id);
FreeImage_SetTagType(tag, type);
FreeImage_SetTagCount(tag, count);
FreeImage_SetTagLength(tag, length);
FreeImage_SetTagValue(tag, value);
if(model == FIMD_ANIMATION) {
TagLib& s = TagLib::instance();
// get the tag description
const char *description = s.getTagDescription(TagLib::ANIMATION, id);
FreeImage_SetTagDescription(tag, description);
}
// store the tag
bResult = FreeImage_SetMetadata(model, dib, key, tag);
FreeImage_DeleteTag(tag);
}
return bResult;
}
static BOOL
FreeImage_GetMetadataEx(FREE_IMAGE_MDMODEL model, FIBITMAP *dib, const char *key, FREE_IMAGE_MDTYPE type, FITAG **tag)
{
if( FreeImage_GetMetadata(model, dib, key, tag) ) {
if( FreeImage_GetTagType(*tag) == type ) {
return TRUE;
}
}
return FALSE;
}
StringTable::StringTable()
{
m_buffer = NULL;
firstPixelPassed = 0; // Still no pixel read
// Maximum number of entries in the map is MAX_LZW_CODE * 256
( run in 0.717 second using v1.01-cache-2.11-cpan-119454b85a5 )