00001
00002
00003
00004
00005
00006 #if !defined(AFX_VMSANIMATEDGIF_H__8893A64A_E91C_4E1D_8F5E_768AE18C7CB8__INCLUDED_)
00007 #define AFX_VMSANIMATEDGIF_H__8893A64A_E91C_4E1D_8F5E_768AE18C7CB8__INCLUDED_
00008
00009 #if _MSC_VER > 1000
00010 #pragma once
00011 #endif
00012
00013 #pragma warning (push, 1)
00014 #include <vector>
00015 #pragma warning (pop)
00016
00017 class vmsAnimatedGIF
00018 {
00019 public:
00020 struct TFrame
00021 {
00022 SIZE m_frameSize;
00023 SIZE m_frameOffset;
00024 UINT m_nDelay;
00025 UINT m_nDisposal;
00026 };
00027
00028 TFrame* get_FrameInfo (int iIndex);
00029
00030 int SaveGIFFrames (LPCSTR pszFileTemplate);
00031
00032 #pragma pack(1)
00033
00034 enum GIFBlockTypes
00035 {
00036 BLOCK_UNKNOWN,
00037 BLOCK_APPEXT,
00038 BLOCK_COMMEXT,
00039 BLOCK_CONTROLEXT,
00040 BLOCK_PLAINTEXT,
00041 BLOCK_IMAGE,
00042 BLOCK_TRAILER
00043 };
00044
00045 enum ControlExtValues
00046 {
00047 GCX_PACKED_DISPOSAL,
00048 GCX_PACKED_USERINPUT,
00049 GCX_PACKED_TRANSPCOLOR
00050 };
00051
00052 enum LSDPackedValues
00053 {
00054 LSD_PACKED_GLOBALCT,
00055 LSD_PACKED_CRESOLUTION,
00056 LSD_PACKED_SORT,
00057 LSD_PACKED_GLOBALCTSIZE
00058 };
00059
00060 enum IDPackedValues
00061 {
00062 ID_PACKED_LOCALCT,
00063 ID_PACKED_INTERLACE,
00064 ID_PACKED_SORT,
00065 ID_PACKED_LOCALCTSIZE
00066 };
00067
00068 struct TGIFHeader
00069 {
00070 char m_cSignature[3];
00071
00072 char m_cVersion[3];
00073 };
00074
00075 struct TGIFLSDescriptor
00076 {
00077 WORD m_wWidth;
00078 WORD m_wHeight;
00079
00080 unsigned char m_cPacked;
00081
00082 unsigned char m_cBkIndex;
00083 unsigned char m_cPixelAspect;
00084 inline int GetPackedValue(enum LSDPackedValues Value);
00085 };
00086
00087 struct TGIFAppExtension
00088 {
00089 unsigned char m_cExtIntroducer;
00090 unsigned char m_cExtLabel;
00091 unsigned char m_cBlockSize;
00092 char m_cAppIdentifier[8];
00093 char m_cAppAuth[3];
00094 };
00095
00096 struct TGIFControlExt
00097 {
00098 unsigned char m_cExtIntroducer;
00099 unsigned char m_cControlLabel;
00100 unsigned char m_cBlockSize;
00101 unsigned char m_cPacked;
00102 WORD m_wDelayTime;
00103 unsigned char m_cTColorIndex;
00104 unsigned char m_cBlockTerm;
00105 public:
00106 inline int GetPackedValue(enum ControlExtValues Value);
00107 };
00108
00109 struct TGIFCommentExt
00110 {
00111 unsigned char m_cExtIntroducer;
00112 unsigned char m_cCommentLabel;
00113 };
00114
00115 struct TGIFPlainTextExt
00116 {
00117 unsigned char m_cExtIntroducer;
00118 unsigned char m_cPlainTextLabel;
00119 unsigned char m_cBlockSize;
00120 WORD m_wLeftPos;
00121 WORD m_wTopPos;
00122 WORD m_wGridWidth;
00123 WORD m_wGridHeight;
00124 unsigned char m_cCellWidth;
00125 unsigned char m_cCellHeight;
00126 unsigned char m_cFgColor;
00127 unsigned char m_cBkColor;
00128 };
00129
00130 struct TGIFImageDescriptor
00131 {
00132 unsigned char m_cImageSeparator;
00133 WORD m_wLeftPos;
00134 WORD m_wTopPos;
00135 WORD m_wWidth;
00136 WORD m_wHeight;
00137 unsigned char m_cPacked;
00138 inline int GetPackedValue(enum IDPackedValues Value);
00139 };
00140
00141 #pragma pack()
00142
00143 BOOL Load (LPCSTR pszFile);
00144
00145 BOOL Load(HGLOBAL hGlobal, DWORD dwSize);
00146
00147 vmsAnimatedGIF();
00148 virtual ~vmsAnimatedGIF();
00149
00150 protected:
00151
00152 std::vector <TFrame> m_vFramesInfo;
00153
00154 BOOL WriteDataOnDisk (LPCSTR pszFile, HGLOBAL hData, DWORD dwSize);
00155
00156 BOOL Load();
00157 HGLOBAL m_hGIF;
00158
00159 BOOL m_bAutoFree;
00160
00161 HGLOBAL GetNextGraphicBlock (UINT *pBlockLen, UINT *pDelay, SIZE *pBlockSize, SIZE *pBlockOffset, UINT *pDisposal);
00162 UINT GetSubBlocksLen (UINT nStartingOffset);
00163 int GetNextBlockLen();
00164 BOOL SkipNextBlock();
00165 GIFBlockTypes GetNextBlock();
00166 BOOL SkipNextGraphicBlock();
00167 void ResetDataPointer();
00168 void Free();
00169 LPBYTE m_pRawData;
00170 TGIFHeader* m_pGIFHeader;
00171 TGIFLSDescriptor* m_pGIFLSDescriptor;
00172 SIZE m_PictureSize;
00173 COLORREF m_clrBackground;
00174 UINT m_nDataSize;
00175 UINT m_nCurrOffset;
00176 UINT m_nGlobalCTSize;
00177 };
00178
00179 #endif