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

图形图象

开发平台:

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
  21. 文件版本:
  22. Build 00618
  23. Date  2000-6-18
  24. ********************************************************************/
  25. #include <windows.h>
  26. #include "gol_isee.h"
  27. #include "gol_rwcc.h"
  28. #include "ModuleManager.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CInfoStr
  36. CInfoStr::CInfoStr()
  37. {
  38. comm = CMD_NULL;
  39. result = ER_EMPTY;
  40. ::FillMemory((PVOID)annexdata.scAnnData, DPK_ANNEXINFOSIZE, 0);
  41. ::FillMemory((PVOID)&imginfo, sizeof(IMAGEINFOSTR), 0);
  42. ::FillMemory((PVOID)filename, DPK_FILENAMESIZE, 0);
  43. ::FillMemory((PVOID)&sDIBInfo, sizeof(INTERBITMAPINFO), 0);
  44. imginfo.imgtype = IMT_NULL;
  45. imginfo.imgformat = IMF_NULL;
  46. imginfo.compression = ICS_RGB;
  47. pImgInfo = NULL;
  48. pLineAddr = NULL;
  49. _pbdata = 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. }
  63. void CInfoStr::Clear(void)
  64. {
  65. comm = CMD_NULL;
  66. result = ER_EMPTY;
  67. ::ZeroMemory((PVOID)annexdata.scAnnData, DPK_ANNEXINFOSIZE);
  68. ::ZeroMemory((PVOID)&imginfo, sizeof(IMAGEINFOSTR));
  69. ::ZeroMemory((PVOID)filename, DPK_FILENAMESIZE);
  70. ::ZeroMemory((PVOID)&sDIBInfo, sizeof(INTERBITMAPINFO));
  71. imginfo.imgtype = IMT_NULL;
  72. imginfo.imgformat = IMF_NULL;
  73. imginfo.compression = ICS_RGB;
  74. if (pImgInfo)
  75. {
  76. ::GlobalFree(pImgInfo);
  77. pImgInfo = NULL;
  78. }
  79. if (pLineAddr)
  80. {
  81. ::GlobalFree(pLineAddr);
  82. pLineAddr = NULL;
  83. }
  84. if (_pbdata)
  85. {
  86. ::GlobalFree(_pbdata);
  87. _pbdata = NULL;
  88. }
  89. state = PKST_NULL;
  90. modify = 0;
  91. fpProgress = NULL;
  92. }
  93. // 从指定图像文件中读取信息(数据)
  94. // 它只接受以下三个命令:
  95. //  CMD_IS_VALID_FILE, // 判断指定文件是否能被本模块处理
  96. // CMD_GET_FILE_INFO, // 获取指定文件的信息
  97. // CMD_LOAD_FROM_FILE, // 从指定图像文件中读取数据
  98. BOOL CInfoStr::LoadFromFile(LPCTSTR fn, COMMAND cmd, IMGPROC fp)
  99. {
  100. if (!fp)
  101. return FALSE;
  102. if ((state != PKST_NULL)&&(::lstrcmp(fn,GetFileName())))
  103. Clear();
  104. switch(cmd)
  105. {
  106. case CMD_IS_VALID_FILE: // 判断指定文件是否能被本模块处理
  107. if (state >= PKST_PASSVER)
  108. return TRUE;
  109. break;
  110. case CMD_GET_FILE_INFO: // 获取指定文件的信息
  111. if (state >= PKST_PASSINFO)
  112. return TRUE;
  113. break;
  114. case CMD_LOAD_FROM_FILE: // 从指定图像文件中读取数据
  115. if (state >= PKST_INFOANDBITS)
  116. return TRUE;
  117. break;
  118. default:
  119. return FALSE;
  120. };
  121. int iRet;
  122. if (state < PKST_PASSVER)
  123. {
  124. comm = CMD_IS_VALID_FILE;
  125. result = ER_EMPTY;
  126. annexdata.iAnnData = 0;
  127. ::lstrcpy(filename, fn);
  128. state = PKST_NOTVER;
  129. iRet = fp((LPINFOSTR)this);
  130. if (!iRet)
  131. return FALSE;
  132. if (cmd == CMD_IS_VALID_FILE)
  133. return iRet;
  134. }
  135. if (state < PKST_PASSINFO)
  136. {
  137. comm = CMD_GET_FILE_INFO;
  138. result = ER_EMPTY;
  139. ::memset(&imginfo, 0, sizeof(IMAGEINFOSTR));
  140. ::lstrcpy(filename, fn);
  141. iRet = fp((LPINFOSTR)this);
  142. if (!iRet)
  143. return FALSE;
  144. if (cmd == CMD_GET_FILE_INFO)
  145. return iRet;
  146. }
  147. if (state < PKST_INFOANDBITS)
  148. {
  149. comm = CMD_LOAD_FROM_FILE;
  150. result = ER_EMPTY;
  151. pImgInfo = NULL;
  152. sDIBInfo.bmi.biSize     = sizeof(BITMAPINFOHEADER);
  153. sDIBInfo.bmi.biWidth    = imginfo.width;
  154. sDIBInfo.bmi.biHeight   = imginfo.height;
  155. sDIBInfo.bmi.biPlanes   = 1;
  156. sDIBInfo.bmi.biBitCount = 32; // ISee内部标准图像格式是32位的
  157. sDIBInfo.bmi.biCompression = BI_RGB;
  158. sDIBInfo.bmi.biSizeImage   = 0;
  159. sDIBInfo.bmi.biXPelsPerMeter = 3721;
  160. sDIBInfo.bmi.biYPelsPerMeter = 3721;
  161. sDIBInfo.bmi.biClrUsed       = 0;
  162. sDIBInfo.bmi.biClrImportant  = 0;
  163. sDIBInfo.rmask     = 0xff0000;
  164. sDIBInfo.gmask     = 0xff00;
  165. sDIBInfo.bmask     = 0xff;
  166. sDIBInfo.alphaMask = 0;
  167. // 分配用于存放标准图像位数据的内存块
  168. _pbdata = (PBYTE)::GlobalAlloc(GPTR, sDIBInfo.bmi.biWidth*4*sDIBInfo.bmi.biHeight);
  169. if (!_pbdata)
  170. return FALSE;
  171. // 分配用于存放每一扫描行地址的指针数组并初始化
  172. pLineAddr = (DWORD**)::GlobalAlloc(GPTR, sDIBInfo.bmi.biHeight*sizeof(DWORD*));
  173. if (!pLineAddr)
  174. {
  175. ::GlobalFree(_pbdata);
  176. return FALSE;
  177. }
  178. // 初始化行首数组
  179. for (int y=0;y<sDIBInfo.bmi.biHeight;y++)
  180. pLineAddr[y] = (DWORD*)(_pbdata+((sDIBInfo.bmi.biHeight-y-1)*(sDIBInfo.bmi.biWidth*4)));
  181. // 读取图像位数据,并转成标准图像格式。
  182. iRet = fp((LPINFOSTR)this);
  183. if (!iRet)
  184. return FALSE;
  185. if (cmd == CMD_LOAD_FROM_FILE)
  186. return iRet;
  187. }
  188. return TRUE;
  189. }
  190. PACKSTATE CInfoStr::GetState(void)
  191. {
  192. return state;
  193. }
  194. LPCTSTR CInfoStr::GetFileName(void)
  195. {
  196. return (LPCTSTR)filename;
  197. }
  198. void CInfoStr::SetFileName(LPCTSTR fn)
  199. {
  200. ::memcpy((void*)filename, (const void*)fn, lstrlen(fn));
  201. }
  202. CInfoStr& CInfoStr::operator=(CInfoStr& info)
  203. {
  204. ::CopyMemory((PVOID)this, (CONST PVOID)&info, sizeof(CInfoStr));
  205. return *this;
  206. }
  207. /*
  208. // 图像读写数据包结构
  209. struct _tagINFOSTR
  210. {
  211. COMMAND comm; // 操作命令
  212. EXERESULT result; // 执行的结果(是成功了还是失败了)
  213. union {
  214. char cAnnData; // 联合,用于描述不同类型的数据,
  215. int iAnnData; // 是操作命令与执行结果的附加信息,
  216. long lAnnData; // 参见每个命令中对此值的含意说明
  217. float fAnnData;
  218. double dfAnnData;
  219. COMMAND cmAnnData; // 检察命令支持情况时用到
  220. unsigned short  wAnnData;
  221. unsigned long  dwAnnData;
  222. void *pAnnData;
  223. unsigned int siAnnData[DPK_ANNEXINFOSIZE/sizeof(int)];
  224. unsigned char scAnnData[DPK_ANNEXINFOSIZE];
  225. } annexdata;
  226. IMAGEINFOSTR imginfo; // 图像文件信息
  227. char filename[DPK_FILENAMESIZE];// 图像文件的路径及文件名
  228. void *pImgInfo; // 原始图像信息
  229. INTERBITMAPINFO sDIBInfo; // 标准图像格式信息结构
  230. unsigned long   *(*pLineAddr);// 标准图像位数据中从0行到n-1行的每一行的首地址
  231. unsigned char *_pbdata; // 标准图像位数据缓冲区首地址
  232. PACKSTATE state; // 数据包当前的状态
  233. int modify; // 修改标记
  234. LPSUBIMGBLOCK psubimg; // 子图像数据块地址(静态图像此值应设为NULL)
  235. int (WINAPI *fpProgress)(int,int);
  236. // 由调用者提供的进度条显示函数指针(可以是NULL)
  237. // 入口参数1是总的进度数,参数2是当前的进度数。
  238. // 返回参数:如果返回0,则图像读写模块继续操作,
  239. // 如果返回非0值,则读写模块终止操作,返回数据包。
  240. };
  241. */