GifImage.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. #ifndef GIF_IMAGE_HEAD_FILE
  2. #define GIF_IMAGE_HEAD_FILE
  3. #pragma once
  4. #include "SkinUI.h"
  5. //////////////////////////////////////////////////////////////////////////
  6. //GIF 枚举定义
  7. //类型枚举
  8. enum enGIFBlockTypes
  9. {
  10. BLOCK_UNKNOWN, //未知类型
  11. BLOCK_APPEXT, //图形控制
  12. BLOCK_COMMEXT, //注释标签
  13. BLOCK_CONTROLEXT, //图形标签
  14. BLOCK_PLAINTEXT, //图形标签
  15. BLOCK_IMAGE, //图象标识
  16. BLOCK_TRAILER //文件终结
  17. };
  18. //扩展枚举
  19. enum enControlExtValues
  20. {
  21. GCX_PACKED_DISPOSAL, //处置方法
  22. GCX_PACKED_USERINPUT, //输入标志
  23. GCX_PACKED_TRANSPCOLOR //透明标志
  24. };
  25. //显示描述
  26. enum enLSDPackedValues
  27. {
  28. LSD_PACKED_GLOBALCT, //颜色标志
  29. LSD_PACKED_CRESOLUTION, //颜色深度
  30. LSD_PACKED_SORT, //分类标志
  31. LSD_PACKED_GLOBALCTSIZE //全局颜色
  32. };
  33. //描述枚举
  34. enum enIDPackedValues
  35. {
  36. ID_PACKED_LOCALCT, //颜色标志
  37. ID_PACKED_INTERLACE, //交织标志
  38. ID_PACKED_SORT, //分类标志
  39. ID_PACKED_LOCALCTSIZE //颜色大小
  40. };
  41. //////////////////////////////////////////////////////////////////////////
  42. //GIF 结构定义
  43. #pragma pack(1)
  44. //文件头结构
  45. struct tagGIFHeader
  46. {
  47. BYTE cbSignature[3]; //GIF 署名
  48. BYTE cbVersion[3]; //GIF 版本
  49. };
  50. //逻辑屏幕标识符
  51. struct tagGIFLSDescriptor
  52. {
  53. WORD wWidth; //屏幕宽度
  54. WORD wHeight; //屏幕高度
  55. BYTE cbPacked; //颜色标志
  56. BYTE cbBkIndex; //背景颜色
  57. BYTE cbPixelAspect; //像素宽高比
  58. };
  59. //图象标识符
  60. struct tagGIFImageDescriptor
  61. {
  62. BYTE cbImageSeparator; //图象标识符
  63. WORD wXExcursion; //X 偏移量
  64. WORD wYExcursion; //Y 偏移量
  65. WORD wWidth; //图象宽度
  66. WORD wHeight; //图象高度
  67. BYTE cbPacked; //颜色标志
  68. };
  69. //图形控制扩展
  70. struct tagGIFControlExt
  71. {
  72. BYTE cbExtIntroducer; //标识标志
  73. BYTE cbControlLabel; //标识标志
  74. BYTE cbBlockSize; //区块大小
  75. BYTE cbPacked; //处置方法
  76. WORD wDelayTime; //延迟时间
  77. BYTE cbTColorIndex; //透明色索引
  78. BYTE cbBlockTerm; //块终结器
  79. };
  80. //注释扩展
  81. struct tagGIFCommentExt
  82. {
  83. BYTE cbExtIntroducer; //扩展标识
  84. BYTE cbCommentLabel; //注释标签
  85. };
  86. //图形文本扩展
  87. struct tagGIFPlainTextExt
  88. {
  89. BYTE cbExtIntroducer; //扩展标识
  90. BYTE cbPlainTextLabel; //图形标签
  91. BYTE cbBlockSize; //区块大小
  92. WORD wLeftPos; //边界位置
  93. WORD wTopPos; //边界位置
  94. WORD wGridWidth; //文本框宽
  95. WORD wGridHeight; //文本框高
  96. BYTE cbCellWidth; //单元宽度
  97. BYTE cbCellHeight; //单元高度
  98. BYTE cbForeGroundColor; //颜色索引
  99. BYTE cbBackGroundColor; //颜色索引
  100. };
  101. //应用程序扩展
  102. struct tagGIFAppExtension
  103. {
  104. BYTE cExtIntroducer; //扩展标识
  105. BYTE cExtLabel; //图形标签
  106. BYTE cBlockSize; //区块大小
  107. char cAppIdentifier[8]; //程序标识
  108. char cAppAuth[3]; //程序鉴别
  109. };
  110. #pragma pack()
  111. //////////////////////////////////////////////////////////////////////////
  112. //结构定义
  113. //显示结构
  114. struct tagGIFFrameInfo
  115. {
  116. UINT nDelay; //显示延时
  117. UINT nDisposal; //处理方式
  118. WORD wXExcursion; //图像偏移
  119. WORD wYExcursion; //图像偏移
  120. WORD wImageWidth; //图像宽度
  121. WORD wImageHeight; //图像高度
  122. IPicture * pIFramePicture; //图像接口
  123. };
  124. //数据信息
  125. struct tagImageDataInfo
  126. {
  127. LONG lDataSize; //数据大小
  128. LONG lCurentPos; //当前指针
  129. LONG lColorTableSize; //颜色大小
  130. LPBYTE cbImageDataBuffer; //图形数据
  131. };
  132. //数组定义
  133. typedef CArray<tagGIFFrameInfo,tagGIFFrameInfo> CGIFFrameInfoArray;
  134. //////////////////////////////////////////////////////////////////////////
  135. //动画对象
  136. class SKINUI_CLASS CGIFImage
  137. {
  138. //属性变量
  139. protected:
  140. WORD m_wImageWidth; //屏幕宽度
  141. WORD m_wImageHeight; //屏幕高度
  142. COLORREF m_crBackGroundColor; //背景颜色
  143. //内核变量
  144. protected:
  145. INT_PTR m_nCurrentFrame; //当前图帧
  146. CGIFFrameInfoArray m_GIFFrameInfoArray; //片断数组
  147. //函数定义
  148. public:
  149. //构造函数
  150. CGIFImage();
  151. //析构函数
  152. virtual ~CGIFImage();
  153. //加载函数
  154. public:
  155. //加载动画
  156. bool LoadFromFile(LPCTSTR pszFileName);
  157. //加载动画
  158. bool LoadFromMemroy(BYTE * pcbData, LONG lDataSize);
  159. //加载动画
  160. bool LoadFromResource(LPCTSTR pszResourceName, LPCTSTR pszResourceType);
  161. //控制函数
  162. public:
  163. //是否加载
  164. bool IsNull();
  165. //释放图像
  166. VOID DestroyImage();
  167. //信息函数
  168. public:
  169. //图像宽度
  170. WORD GetWidth() { return m_wImageWidth; }
  171. //图像高度
  172. WORD GetHeight() { return m_wImageHeight; }
  173. //当前图帧
  174. INT_PTR GetCurrentIndex() { return m_nCurrentFrame; }
  175. //图帧函数
  176. public:
  177. //当前图帧
  178. tagGIFFrameInfo * GetCurrentFrame();
  179. //图像数目
  180. INT_PTR GetFrameCount() { return m_GIFFrameInfoArray.GetCount(); }
  181. //绘画函数
  182. public:
  183. //绘画图像
  184. VOID DrawImageFrame(CDC * pDC, INT nXPos, INT nYPos);
  185. //绘画图像
  186. VOID DrawImageFrame(CDC * pDC, INT nXPos, INT nYPos, INT_PTR nFrameIndex);
  187. //区块函数
  188. protected:
  189. //切换区块
  190. bool SwitchNextBlock(tagImageDataInfo & ImageDataInfo);
  191. //区块长度
  192. LONG GetCurrentBlockSize(tagImageDataInfo & ImageDataInfo);
  193. //区块长度
  194. LONG GetSubBlockSize(tagImageDataInfo & ImageDataInfo, LONG lBlockPos);
  195. //获取类型
  196. enGIFBlockTypes GetCurrentBlockType(tagImageDataInfo & ImageDataInfo);
  197. //内部函数
  198. private:
  199. //获取数值
  200. inline INT GetPackedValue(const tagGIFControlExt * pGIFControlExt, enum enControlExtValues Value);
  201. //获取数值
  202. inline INT GetPackedValue(const tagGIFLSDescriptor * pGIFLSDescriptor, enum enLSDPackedValues Value);
  203. //获取数值
  204. inline INT GetPackedValue(const tagGIFImageDescriptor * pGIFControlExt, enum enIDPackedValues Value);
  205. };
  206. //////////////////////////////////////////////////////////////////////////
  207. #endif