⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gifdeclib.h

📁 GIF动画解码算法
💻 H
字号:
#ifndef _GIF_DEC_
#define _GIF_DEC_

#include "nucleus.h"
#include "showbmp.h"
#include "lib721.h"
#include "mydef.h"

#define 	LCD_ADDRESS 	0x30000000
#define 	WIDTHBYTES(bits)	(((bits) + 31) / 32 * 4)

#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))

extern int globalTest;
typedef struct tagSIZE
{
    long     cx;
    long     cy;
} SIZE;
typedef struct tagRECT
{
	long	left;
	long	top;
	long	width;
	long	height;
} RECT;

// turn byte alignment on !!
enum GIFBlockTypes   
{
	BLOCK_UNKNOWN,
	BLOCK_APPEXT,
	BLOCK_COMMEXT,
	BLOCK_CONTROLEXT,
	BLOCK_PLAINTEXT,
	BLOCK_IMAGE,
	BLOCK_TRAILER
};
enum  ControlExtValues    // graphic control extension packed field values
{
	GCX_PACKED_DISPOSAL,   // disposal method
	GCX_PACKED_USERINPUT,
	GCX_PACKED_TRANSPCOLOR
};
enum  LSDPackedValues    // logical screen descriptor packed field values
{
	LSD_PACKED_GLOBALCT,
	LSD_PACKED_CRESOLUTION,
	LSD_PACKED_SORT,
	LSD_PACKED_GLOBALCTSIZE
};
enum  IDPackedValues    // image descriptor packed field values
{
	ID_PACKED_LOCALCT,
	ID_PACKED_INTERLACE,
	ID_PACKED_SORT,
	ID_PACKED_LOCALCTSIZE
};
typedef __packed struct tGIFHeader		// GIF header  
{
	char 	m_cSignature[3]; // Signature - Identifies the GIF Data Stream, This field contains the fixed value 'GIF'
	char 	m_cVersion[3]; // Version number. May be one of the following:
							// "87a" or "89a"
}TGIFHeader;
typedef __packed struct  tGIFLSDescriptor   // Logical Screen Descriptor
{
	WORD 	m_wWidth;	// 2 bytes. Logical screen width
	WORD 	m_wHeight; // 2 bytes. Logical screen height

	unsigned char 	m_cPacked;	  // packed field	
	unsigned char   m_cBkIndex;	  // 1 byte. Background color index
	unsigned char 	m_cPixelAspect; // 1 byte. Pixel aspect ratio
//		inline int GetPackedValue(enum LSDPackedValues Value);
} TGIFLSDescriptor;
typedef __packed struct tGIFAppExtension   // application extension block
{
	unsigned char	 m_cExtIntroducer; // extension introducer (0x21)
	unsigned char	 m_cExtLabel; // app. extension label (0xFF)
	unsigned char	 m_cBlockSize; // fixed value of 11
	char 			 m_cAppIdentifier[8];	// application identifier
	char 			 m_cAppAuth[3];  // application authentication code
//	char			 m_commentData[256];
}TGIFAppExtension;
typedef  __packed struct tGIFControlExt  // graphic control extension block
{
	unsigned char 	m_cExtIntroducer; // extension introducer (0x21)
	unsigned char 	m_cControlLabel;	// control extension label (0xF9)
	unsigned char 	m_cBlockSize; // fixed value of 4
	unsigned char 	m_cPacked;	// packed field
	WORD			m_wDelayTime;	// delay time
	unsigned char 	m_cTColorIndex; // transparent color index
	unsigned char 	m_cBlockTerm;   // block terminator (0x00)
//	inline int GetPackedValue(enum ControlExtValues Value);
}TGIFControlExt;
typedef __packed struct tGIFCommentExt  // comment extension block
{
	unsigned char 	m_cExtIntroducer; // extension introducer (0x21)
	unsigned char 	m_cCommentLabel;	// comment extension label (0xFE)
//	U8 				m_commentData[256];
}TGIFCommentExt;
typedef __packed struct tGIFPlainTextExt   // plain text extension block
{
	unsigned char 	m_cExtIntroducer;  // extension introducer (0x21)
	unsigned char 	m_cPlainTextLabel; // text extension label (0x01)
	unsigned char 	m_cBlockSize; // fixed value of 12
	WORD 			m_wLeftPos;	// text grid left position
	WORD 			m_wTopPos; 	// text grid top position
	WORD 			m_wGridWidth;	// text grid width
	WORD 			m_wGridHeight; // text grid height
	unsigned char 	m_cCellWidth;  // character cell width
	unsigned char 	m_cCellHeight; // character cell height
	unsigned char 	m_cFgColor; // text foreground color index
	unsigned char 	m_cBkColor; // text background color index
//	U8				m_plainTData[256];
}TGIFPlainTextExt;
typedef __packed struct tPackedInImgDes
{
	unsigned	m_LCTSize;
	unsigned	m_Reserved;
	unsigned	m_SortFlag;
	unsigned	m_InterlaceFlag;
	unsigned	m_LCTFlag;
} TPackedInImgDes;
typedef __packed struct tGIFImageDescriptor  // image descriptor block
{
	unsigned char 	m_cImageSeparator; // image separator byte (0x2C)
	WORD 			m_wLeftPos; // image left position
	WORD			m_wTopPos;  // image top position
	WORD 			m_wWidth;	 // image width
	WORD 			m_wHeight;  // image height
	unsigned char   m_cPacked; // packed field
//	TPackedInImgDes m_sPackFields;
}TGIFImageDescriptor;
// turn byte alignment off !!

typedef struct	 // structure that keeps a single frame info
{
	U8 					*m_pRGB;	// pointer to the interface used for drawing,here is container for RGB,by yajun
	SIZE	 			m_frameSize;
	SIZE	 			m_frameOffset;
	UINT	 			m_nDelay;	   // delay (in 1/100s of a second)
	UINT	 			m_nDisposal;  // disposal method
	// by yajun
	U8					m_LZWMinCodeSize;
	U8 					m_nBlockSize;
	U32					m_LCTPos;
	TGIFPlainTextExt	m_plainTextExt;
	TGIFImageDescriptor	m_imageDescriptor;
	TGIFCommentExt		m_commentExt;
	TGIFControlExt		m_controlExt;
	TGIFAppExtension	m_appExtension;
	// put them out of the original containers to keep the 8 byte alignment,,by yajun
	TPackedInImgDes 	m_ImaDesExt_sPackFields;
	U8					m_AppExt_commentData[256];	
	U8 					m_ComExt_commentData[256];
	U8					m_PlnTexExt_plainTData[256];
	// added by yajun 04-03-30
	unsigned			m_TransparentFlag;
	
}TFrame;

typedef unsigned char BYTE;
typedef DWORD	COLORREF;
typedef void 	*HGLOBAL;
typedef void    *LPVOID;

typedef struct
{	
	U8 * 		m_pRawData;
	UINT 		m_nDataSize;
	UINT 		m_nCurrOffset;

	BOOL 		m_bIsGIF;
	BOOL 		m_bIsPlaying;
	volatile BOOL m_bExitThread;
	BOOL 		m_bIsInitialized;
	
	RECT 		m_PaintRect;
	int			m_clrBackIndex;
	COLORREF 	m_clrBackground;

	UINT 		m_nGlobalCTSize;
	U32  		m_nGlobalCTPos;		// by yajun

	U8 * 		m_pPicture;
	SIZE 		m_PictureSize;
	
	TFrame 		*m_arrFrames;
	UINT		m_nFrameCount;
	UINT 		m_nCurrFrame;

	TGIFHeader 			*m_pGIFHeader;
	TGIFLSDescriptor 	*m_pGIFLSDescriptor;

	BYTE		m_clrBackInex;
	TFrame		m_Frame;
}TImage;


////////////////////////////////////////////////////////////////////////////////
// functions prototypes
extern BOOL GIFDec(	U8 *inFileBuf,
					U32 fileSize,
					U32 LeftX,
					U32 TopY,
					U32 nWidth,
					U32 nHeight,
					U32 Times);

extern BOOL InitImage(TImage *pImage);

extern BOOL Large_PlayFrame(TImage *pImage,
			int nCurFrame,
			int LeftX,
			int TopY,
			int nWidth,
			int nHeight);

extern int GetPackedValueCon(TGIFControlExt *pCon,
								enum ControlExtValues Value);

extern int GetPackedValueLSD(TGIFLSDescriptor *pLSD,
								enum LSDPackedValues Value);

extern int GetPackedValueImD(TGIFImageDescriptor *pImd,
								enum IDPackedValues Value);

extern void ResetDataPointer(TImage *pImage);

extern BOOL SkipNextGraphicBlock(TImage *pImage);

extern UINT GetSubBlocksLen(	TImage *pImage,
								UINT nStartingOffset);

extern BOOL SkipNextBlock(TImage *pImage);

extern int GetNextBlockLen(TImage *pImage);

extern enum GIFBlockTypes GetNextBlock(TImage *pImage); 

extern BOOL GetNextGraphicBlock(	TImage *pImage,
									TFrame *pFrame,
									UINT *pBlockLen,
									UINT *pDelay,
									SIZE *pBlockSize,
									SIZE *pBlockOffset,
									UINT *pDisposal,
									int nLCDWidht,
									int nHeight);
extern BOOL Large_GetNextGraphicBlock(TImage *pImage,
											 int nWidth,
											 int nHeight);

extern BOOL IsGIF(TImage *pImage) ;

extern BOOL IsAnimatedGIF(TImage *pImage) ;

extern BOOL IsPlaying(TImage *pImage);

extern int GetFrameCount(TImage *pImage);

extern BOOL FrameDec(	TImage *pImage,
						U8 *pSData,
						int nStart,
						int nBlockLen,
						TFrame *pFrame,
						int nWidth,
						int nHeight);

extern U16 GetNewCode(	TFrame	*pFrame,
							U8 *pSData,
							U8 cCurCodeSize,
							U8 *pcCurByte,
							int *step,
							U16 *pBitPos,
							U16 *pByteCountInBlock);

extern void GetRGB(	TImage *pImage,
					TFrame *pFrame,
					U8 *pSData,
					U8 index,
					U8 * pR,
					U8 *pG,
					U8 *pB);

extern BOOL WriteToFrame(	TFrame *pFrame,
							int WritePos,
							U8 R,
							U8 G,
							U8 B);

extern BOOL InterLaceWriteToFrame(	TFrame *pFrame,
										int WritePos,
										U8 R,
										U8 G,
										U8 B);

extern BOOL Large_SubDrawFrameRGB(TImage *pImage,
							int curFrame,
							int ClockWise,
							int deltaH,int deltaW,
							int LeftX,
							int TopY,
							int nWidth,
							int nHeight);

extern BOOL Large_DrawFrameRGB(TImage *pImage,
						int curFrame,
						int LeftX,
						int TopY,
						int nWidth,
						int nHeight);

extern BOOL Large_GIFFrameAdjust(TImage *pImage,
						int curFrame,
						int nWidth,
						int nHeight,
						BOOL *pisResized);


extern void DestroyImage(TImage *pImage);

extern BYTE * MakeDwordAlignedBuf(	BYTE *dataBuf, 
										UINT widthPix,
										UINT height,
										UINT *uiOutWidthBytes);

extern void Large_RestoreBckgrnd(TImage *pImage,
									int curFrame,
									int clockWise,
									RECT *plastR,
									RECT *pcurR,
									int LeftX,
									int TopY,
									int nWidth,
									int nHeight);

extern void WriteRect(int left,
						int top,
						int width,
						int height,
						BYTE R,
						BYTE G,
						BYTE B);

extern void PutPixel(U32 curX,
					U32 curY,
					U8 R,
					U8 G,
					U8 B);


#endif



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -