gol_rwcc.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:8k
源码类别:

图形图象

开发平台:

Visual C++

  1. /********************************************************************
  2. gol_rwcc.cpp - ISee图像浏览器—图像读写客户端数据包接口类实现文件
  3.           
  4.     版权所有(C) VCHelp-coPathway-ISee workgroup 2000 all member's
  5.     这一程序是自由软件,你可以遵照自由软件基金会出版的GNU 通用公共许
  6. 可证条款来修改和重新发布这一程序。或者用许可证的第二版,或者(根
  7. 据你的选择)用任何更新的版本。
  8.     发布这一程序的目的是希望它有用,但没有任何担保。甚至没有适合特定
  9. 目地的隐含的担保。更详细的情况请参阅GNU通用公共许可证。
  10.     你应该已经和程序一起收到一份GNU通用公共许可证的副本。如果还没有,
  11. 写信给:
  12.     The Free Software Foundation, Inc.,  675  Mass Ave,  Cambridge,
  13.     MA02139,  USA
  14. 如果你在使用本软件时有什么问题或建议,用以下地址可以与我们取得联
  15. 系:
  16. http://isee.126.com
  17. http://www.vchelp.net
  18. 或:
  19. iseesoft@china.com
  20. 编写人:YZ, robit
  21. 文件版本:
  22. Build 00618
  23. Date  2000-6-18
  24. ********************************************************************/
  25. #include <windows.h>
  26. #include "..publicgol_isee.h"
  27. #include "gol_rwcc.h"
  28. #ifdef _DEBUG
  29. #define new DEBUG_NEW
  30. #undef THIS_FILE
  31. static char THIS_FILE[] = __FILE__;
  32. #endif
  33. /////////////////////////////////////////////////////////////////////////////
  34. // CInfoStr
  35. CInfoStr::CInfoStr()
  36. {
  37. comm = CMD_NULL;
  38. result = ER_EMPTY;
  39. ::FillMemory((PVOID)annexdata.scAnnData, DPK_ANNEXINFOSIZE, 0);
  40. ::FillMemory((PVOID)&imginfo, sizeof(IMAGEINFOSTR), 0);
  41. ::FillMemory((PVOID)filename, DPK_FILENAMESIZE, 0);
  42. ::FillMemory((PVOID)&sDIBInfo, sizeof(INTERBITMAPINFO), 0);
  43. imginfo.imgtype = IMT_NULL;
  44. imginfo.imgformat = IMF_NULL;
  45. imginfo.compression = ICS_RGB;
  46. pImgInfo = NULL; // 原始图像信息指针
  47. pLineAddr = NULL; // 位缓冲区行首地址数组指针
  48. _pbdata = NULL; // 位缓冲区
  49. psubimg = NULL; // 子图像链首块地址
  50. state = PKST_NULL;
  51. modify = 0;
  52. fpProgress = NULL;
  53. }
  54. CInfoStr::~CInfoStr()
  55. {
  56. if (pImgInfo)
  57. ::GlobalFree(pImgInfo);
  58. if (pLineAddr)
  59. ::GlobalFree(pLineAddr);
  60. if (_pbdata)
  61. ::GlobalFree(_pbdata);
  62. if (psubimg)
  63. _clear_list();
  64. }
  65. void CInfoStr::Clear(void)
  66. {
  67. comm = CMD_NULL;
  68. result = ER_EMPTY;
  69. ::ZeroMemory((PVOID)annexdata.scAnnData, DPK_ANNEXINFOSIZE);
  70. ::ZeroMemory((PVOID)&imginfo, sizeof(IMAGEINFOSTR));
  71. ::ZeroMemory((PVOID)filename, DPK_FILENAMESIZE);
  72. ::ZeroMemory((PVOID)&sDIBInfo, sizeof(INTERBITMAPINFO));
  73. imginfo.imgtype = IMT_NULL;
  74. imginfo.imgformat = IMF_NULL;
  75. imginfo.compression = ICS_RGB;
  76. if (pImgInfo)
  77. {
  78. ::GlobalFree(pImgInfo);
  79. pImgInfo = NULL;
  80. }
  81. if (pLineAddr)
  82. {
  83. ::GlobalFree(pLineAddr);
  84. pLineAddr = NULL;
  85. }
  86. if (_pbdata)
  87. {
  88. ::GlobalFree(_pbdata);
  89. _pbdata = NULL;
  90. }
  91. if (psubimg)
  92. {
  93. _clear_list();
  94. psubimg = NULL;
  95. }
  96. state = PKST_NULL;
  97. modify = 0;
  98. fpProgress = NULL;
  99. }
  100. //#########只用保存就行了,orbit,2000-08-31
  101. // 将图像保存到指定文件中
  102. // CMD_SAVE_TO_FILE,
  103. BOOL CInfoStr::SaveAsFile(LPCTSTR fn, COMMAND cmd, IMGPROC fp)
  104. {
  105. if (state < PKST_INFOANDBITS)
  106. return FALSE;
  107. comm = cmd;
  108. result = ER_EMPTY;
  109. ::lstrcpy(filename, fn);
  110. BOOL iRet = fp((LPINFOSTR)this);
  111. if (!iRet)
  112. return FALSE;
  113. return TRUE;
  114. }
  115. int CInfoStr::GetSubImgCount(void)
  116. {
  117. if (state <= PKST_PASSVER)
  118. return 0;
  119. // 静态图像没有子图像
  120. if ((imginfo.imgtype == IMT_RESSTATIC)||(imginfo.imgtype == IMT_VECTORSTATIC))
  121. return 0;
  122. // 返回子图像个数(不包括背景图像)
  123. return (int)imginfo.imgnumbers-1;
  124. }
  125. LPSUBIMGBLOCK CInfoStr::GetSubImgAt(int index) // based 0 index
  126. {
  127. // 防错检查
  128. if (state <= PKST_PASSVER)
  129. return NULL;
  130. int iSubNum, i;
  131. if ((iSubNum=GetSubImgCount()) == 0)
  132. return NULL;
  133. if (index >= iSubNum)
  134. return NULL;
  135. // 子图像链表必需是依次排放的
  136. LPSUBIMGBLOCK lpSubImg = psubimg;
  137. for(i=0;i<index;i++)
  138. lpSubImg = lpSubImg->next;
  139. //ASSERT(lpSubImg->index == index);
  140. return lpSubImg;
  141. }
  142. void CInfoStr::RemoveSubImg(int index)
  143. {
  144. return;
  145. }
  146. // 从指定图像文件中读取信息(数据)
  147. // 它只接受以下三个命令:
  148. //  CMD_IS_VALID_FILE, // 判断指定文件是否能被本模块处理
  149. // CMD_GET_FILE_INFO, // 获取指定文件的信息
  150. // CMD_LOAD_FROM_FILE, // 从指定图像文件中读取数据
  151. BOOL CInfoStr::LoadFromFile(LPCTSTR fn, COMMAND cmd, IMGPROC fp)
  152. {
  153. if (!fp)
  154. return FALSE;
  155. if ((state != PKST_NULL)&&(::lstrcmp(fn,GetFileName())))
  156. Clear();
  157. switch(cmd)
  158. {
  159. case CMD_IS_VALID_FILE: // 判断指定文件是否能被本模块处理
  160. if (state >= PKST_PASSVER)
  161. return TRUE;
  162. break;
  163. case CMD_GET_FILE_INFO: // 获取指定文件的信息
  164. if (state >= PKST_PASSINFO)
  165. return TRUE;
  166. break;
  167. case CMD_LOAD_FROM_FILE: // 从指定图像文件中读取数据
  168. if (state >= PKST_INFOANDBITS)
  169. return TRUE;
  170. break;
  171. default:
  172. return FALSE;
  173. };
  174. int iRet;
  175. if (state < PKST_PASSVER)
  176. {
  177. comm = CMD_IS_VALID_FILE;
  178. result = ER_EMPTY;
  179. annexdata.iAnnData = 0;
  180. ::lstrcpy(filename, fn);
  181. state = PKST_NOTVER;
  182. iRet = fp((LPINFOSTR)this);
  183. if (!iRet)
  184. return FALSE;
  185. if (cmd == CMD_IS_VALID_FILE)
  186. return iRet;
  187. }
  188. if (state < PKST_PASSINFO)
  189. {
  190. comm = CMD_GET_FILE_INFO;
  191. result = ER_EMPTY;
  192. ::memset(&imginfo, 0, sizeof(IMAGEINFOSTR));
  193. ::lstrcpy(filename, fn);
  194. iRet = fp((LPINFOSTR)this);
  195. if (!iRet)
  196. return FALSE;
  197. if (cmd == CMD_GET_FILE_INFO)
  198. return iRet;
  199. }
  200. if (state < PKST_INFOANDBITS)
  201. {
  202. comm = CMD_LOAD_FROM_FILE;
  203. result = ER_EMPTY;
  204. pImgInfo = NULL;
  205. sDIBInfo.bmi.biSize     = sizeof(BITMAPINFOHEADER);
  206. sDIBInfo.bmi.biWidth    = imginfo.width;
  207. sDIBInfo.bmi.biHeight   = imginfo.height;
  208. sDIBInfo.bmi.biPlanes   = 1;
  209. sDIBInfo.bmi.biBitCount = 32; // ISee内部标准图像格式是32位的
  210. sDIBInfo.bmi.biCompression = BI_RGB;
  211. sDIBInfo.bmi.biSizeImage   = 0;
  212. sDIBInfo.bmi.biXPelsPerMeter = 3721;
  213. sDIBInfo.bmi.biYPelsPerMeter = 3721;
  214. sDIBInfo.bmi.biClrUsed       = 0;
  215. sDIBInfo.bmi.biClrImportant  = 0;
  216. sDIBInfo.rmask     = 0xff0000;
  217. sDIBInfo.gmask     = 0xff00;
  218. sDIBInfo.bmask     = 0xff;
  219. sDIBInfo.alphaMask = 0;
  220. // 分配用于存放标准图像位数据的内存块
  221. _pbdata = (PBYTE)::GlobalAlloc(GPTR, sDIBInfo.bmi.biWidth*4*sDIBInfo.bmi.biHeight);
  222. if (!_pbdata)
  223. return FALSE;
  224. // 分配用于存放每一扫描行地址的指针数组并初始化
  225. pLineAddr = (DWORD**)::GlobalAlloc(GPTR, sDIBInfo.bmi.biHeight*sizeof(DWORD*));
  226. if (!pLineAddr)
  227. {
  228. ::GlobalFree(_pbdata);
  229. return FALSE;
  230. }
  231. // 初始化行首数组
  232. for (int y=0;y<sDIBInfo.bmi.biHeight;y++)
  233. pLineAddr[y] = (DWORD*)(_pbdata+((sDIBInfo.bmi.biHeight-y-1)*(sDIBInfo.bmi.biWidth*4)));
  234. // 读取图像位数据,并转成标准图像格式。
  235. iRet = fp((LPINFOSTR)this);
  236. if (!iRet)
  237. return FALSE;
  238. if (cmd == CMD_LOAD_FROM_FILE)
  239. return iRet;
  240. }
  241. return TRUE;
  242. }
  243. PACKSTATE CInfoStr::GetState(void)
  244. {
  245. return state;
  246. }
  247. LPCTSTR CInfoStr::GetFileName(void)
  248. {
  249. return (LPCTSTR)filename;
  250. }
  251. void CInfoStr::SetFileName(LPCTSTR fn)
  252. {
  253. ::memcpy((void*)filename, (const void*)fn, lstrlen(fn));
  254. }
  255. CInfoStr& CInfoStr::operator=(CInfoStr& info)
  256. {
  257. ::CopyMemory((PVOID)this, (CONST PVOID)&info, sizeof(CInfoStr));
  258. return *this;
  259. }
  260. // 清除子图像链表
  261. void CInfoStr::_clear_list(void)
  262. {
  263. if (psubimg == NULL)
  264. return;
  265. //ASSERT(state >= PKST_INFOANDBITS);
  266. //ASSERT(imginfo.imgnumbers >= 1);
  267. LPSUBIMGBLOCK   lpSubImg;
  268. while((lpSubImg=psubimg) != NULL)
  269. {
  270. psubimg = lpSubImg->next;
  271. lpSubImg->number = 0; // 子图像块的序列号
  272. lpSubImg->left = lpSubImg->top = 0; // 子图像块的显示位置(左上角)
  273. lpSubImg->width = lpSubImg->height = 0; // 子图像块的图像宽度及高度
  274. lpSubImg->dowith = 0; // 处置方法(针对于动画GIF)
  275. lpSubImg->userinput = 0; // 用户输入(针对于动画GIF)
  276. lpSubImg->colorkey = 0; // 透明色分量值
  277. lpSubImg->time = 0; // 显示的延迟时间
  278. if (lpSubImg->pLineAddr)
  279. ::GlobalFree(lpSubImg->pLineAddr);
  280. if (lpSubImg->_pbdata)
  281. ::GlobalFree(lpSubImg->_pbdata);
  282. lpSubImg->parents = NULL; // 第一桢图像数据的结构地址(所属数据包结构的地址)
  283. lpSubImg->prev = NULL; // 前一桢图像数据的结构地址
  284. lpSubImg->next = NULL; // 后一桢图像数据的结构地址(NULL表示这是最后一副图像)
  285. ::GlobalFree(lpSubImg);
  286. };
  287. return;
  288. }