windows-nt/Source/XPSP1/NT/enduser/stuff/hhctrl/gif.h
2020-09-26 16:20:57 +08:00

164 lines
3.8 KiB
C

// Copyright (C) Microsoft Corporation 1996-1997, All Rights reserved.
#include "cstream.h"
#pragma pack(push, 1)
typedef struct {
WORD log_width;
WORD log_height;
struct {
BYTE ceGCT:3;
BYTE fSort:1;
BYTE cPrimaries:3;
BYTE fGCT:1;
} b;
BYTE iBackground;
BYTE wAspect;
} LSD;
#pragma pack(pop)
// IFFERROR: Possible errors
typedef int IFFERROR;
const int IFFERR_NONE = 0; // no error
const int IFFERR_HANDLELIMIT = 1; // too many open files
const int IFFERR_PARAMETER = 2; // programmer error
const int IFFERR_NOTSUPPORTED = 3; // feature not supported by format
const int IFFERR_NOTAVAILABLE = 4; // item not available
const int IFFERR_MEMORY = 5; // insufficient memory
const int IFFERR_IMAGE = 6; // bad image data (decompression error)
const int IFFERR_HEADER = 7; // header has bad fields
const int IFFERR_IO_OPEN = 8; // error on open()
const int IFFERR_IO_CLOSE = 9; // error on close()
const int IFFERR_IO_READ = 10; // error on read()
const int IFFERR_IO_WRITE = 11; // error on write()
const int IFFERR_IO_SEEK = 12; // error on lseek()
typedef enum {
IFFCL_BILEVEL, // 1 BPP
IFFCL_GRAY, // 2,4,6,8 BPP
IFFCL_PALETTE, // 2,4,6,8 BPP
IFFCL_RGB, // 24 BPP chunky
IFFCL_RGBPLANAR, // 24 BPP in 8 bit planes
IFFCL_RGBA, // 32 BPP chunky
IFFCL_RGBAPLANAR, // 32 BPP in four 8 bit planes*/
IFFCL_CMYK,
IFFCL_YCC,
IFFCL_CIELAB,
} IFFCLASS;
// IFFCOMPRESSION: Compression options
typedef enum {
IFFCOMP_NONE, // no compression
IFFCOMP_DEFAULT, // whatever is defined for the format
IFFCOMP_LZW, // Lempel-Zif
} IFFCOMPRESSION;
// IFFSEQUENCE: Line sequences
typedef enum {
IFFSEQ_TOPDOWN,
IFFSEQ_BOTTOMUP, // BMP and TGA compressed
IFFSEQ_INTERLACED, // for GIF
} IFFSEQUENCE;
typedef struct {
int CharSize; // size of input data
int CodeSize; // Max bits in a code
int ClearCode; // based on CharSize
int CurBits; // current size of a code
int BitPos; // range = 0 - 7, 0 is MSB
int OldCode; // continuity data for STREAMEXPAND
int TableEntry;
UINT LastChar;
int OutString; // offset into Stack
int CodeJump;
int *CodeTable; // Compress and Expand
PBYTE StringTable; // Expand only
int *HashTable; // Compress only
PBYTE Stack; // Expand only
LPBYTE CodeInput;
LPBYTE CodeOutput;
} LZDATA;
typedef struct
{
IFFCLASS Class; // Class of file
int Bits;
int DimX;
int DimY;
int LineOffset; // Offset between lines in output buffer
int LineBytes; // Bytes per line w/o padding - LineBytes <= LineOffset
int PackMode; // Packing.
int curline; // Current line number
int linelen; // For seeking and other stuff (<0 if not seekable)
IFFERROR Error; // file format error
CStream* prstream; // read stream
// End of required fields
int BytesPerLine;
IFFSEQUENCE Sequence;
int BytesInRWBuffer; // number of bytes in rwbuffer
int CompBufferSize;
int DecompBufferSize;
LPBYTE RWBuffer; // allocated buffer
LPBYTE rw_ptr;
LPBYTE DecompBuffer;
LPBYTE dcmp_ptr;
int ReadItAll;
int BytesLeft;
int StripLines;
int LinesPerStrip;
int ActualLinesPerStrip;
int PaletteSize;
LPBYTE Palette;
LZDATA* plzData;
BOOL BlackOnWhite;
LSD lsd;
} IFF_FID, IFF_GIF;
FSERR SetupForRead(int pos, int iWhichImage, IFF_FID* piff);
typedef IFF_FID *IFFPTR;
// IFFPACKMODE: Packing modes
typedef enum {
IFFPM_PACKED,
IFFPM_UNPACKED,
IFFPM_LEFTJUSTIFIED,
IFFPM_NORMALIZED,
IFFPM_RAW,
} IFFPACKMODE;
#ifndef _MAC_
#define MYCPU 0
#define INTELSWAP16(X)
#define INTELSWAP32(X)
#else
#define MYCPU 1
#define INTELSWAP16(X) { unsigned char c, *p=(unsigned char *)&X; c=p[0]; p[0]=p[1]; p[1]=c; }
#define INTELSWAP32(X) { unsigned char c, *p=(unsigned char *)&X; c=p[0]; p[0]=p[3]; p[3]=c; c = p[1]; p[1] = p[2]; p[2] = c; }
#endif
enum CPUTYPE {
INTEL = 0,
MOTOROLA=1
};
#define MAXSIZE 8192
#ifndef RWBUFFSIZE
#define RWBUFFSIZE (8 * 4096)
#endif