gol_rwcc.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:7k
- /********************************************************************
- gol_rwcc.cpp - ISee图像浏览器—图像读写客户端数据包接口类实现文件
-
- 版权所有(C) VCHelp-coPathway-ISee workgroup 2000 all member's
- 这一程序是自由软件,你可以遵照自由软件基金会出版的GNU 通用公共许
- 可证条款来修改和重新发布这一程序。或者用许可证的第二版,或者(根
- 据你的选择)用任何更新的版本。
- 发布这一程序的目的是希望它有用,但没有任何担保。甚至没有适合特定
- 目地的隐含的担保。更详细的情况请参阅GNU通用公共许可证。
- 你应该已经和程序一起收到一份GNU通用公共许可证的副本。如果还没有,
- 写信给:
- The Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
- MA02139, USA
- 如果你在使用本软件时有什么问题或建议,用以下地址可以与我们取得联
- 系:
- http://isee.126.com
- http://www.vchelp.net
- 或:
- iseesoft@china.com
- 编写人:YZ
- 文件版本:
- Build 00618
- Date 2000-6-18
- ********************************************************************/
- #include <windows.h>
- #include "gol_isee.h"
- #include "gol_rwcc.h"
- #include "ModuleManager.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CInfoStr
- CInfoStr::CInfoStr()
- {
- comm = CMD_NULL;
- result = ER_EMPTY;
- ::FillMemory((PVOID)annexdata.scAnnData, DPK_ANNEXINFOSIZE, 0);
- ::FillMemory((PVOID)&imginfo, sizeof(IMAGEINFOSTR), 0);
- ::FillMemory((PVOID)filename, DPK_FILENAMESIZE, 0);
- ::FillMemory((PVOID)&sDIBInfo, sizeof(INTERBITMAPINFO), 0);
- imginfo.imgtype = IMT_NULL;
- imginfo.imgformat = IMF_NULL;
- imginfo.compression = ICS_RGB;
- pImgInfo = NULL;
- pLineAddr = NULL;
- _pbdata = NULL;
- state = PKST_NULL;
- modify = 0;
- fpProgress = NULL;
- }
- CInfoStr::~CInfoStr()
- {
- if (pImgInfo)
- ::GlobalFree(pImgInfo);
- if (pLineAddr)
- ::GlobalFree(pLineAddr);
- if (_pbdata)
- ::GlobalFree(_pbdata);
- }
- void CInfoStr::Clear(void)
- {
- comm = CMD_NULL;
- result = ER_EMPTY;
- ::ZeroMemory((PVOID)annexdata.scAnnData, DPK_ANNEXINFOSIZE);
- ::ZeroMemory((PVOID)&imginfo, sizeof(IMAGEINFOSTR));
- ::ZeroMemory((PVOID)filename, DPK_FILENAMESIZE);
- ::ZeroMemory((PVOID)&sDIBInfo, sizeof(INTERBITMAPINFO));
- imginfo.imgtype = IMT_NULL;
- imginfo.imgformat = IMF_NULL;
- imginfo.compression = ICS_RGB;
- if (pImgInfo)
- {
- ::GlobalFree(pImgInfo);
- pImgInfo = NULL;
- }
- if (pLineAddr)
- {
- ::GlobalFree(pLineAddr);
- pLineAddr = NULL;
- }
- if (_pbdata)
- {
- ::GlobalFree(_pbdata);
- _pbdata = NULL;
- }
- state = PKST_NULL;
- modify = 0;
- fpProgress = NULL;
- }
- // 从指定图像文件中读取信息(数据)
- // 它只接受以下三个命令:
- // CMD_IS_VALID_FILE, // 判断指定文件是否能被本模块处理
- // CMD_GET_FILE_INFO, // 获取指定文件的信息
- // CMD_LOAD_FROM_FILE, // 从指定图像文件中读取数据
- BOOL CInfoStr::LoadFromFile(LPCTSTR fn, COMMAND cmd, IMGPROC fp)
- {
- if (!fp)
- return FALSE;
- if ((state != PKST_NULL)&&(::lstrcmp(fn,GetFileName())))
- Clear();
- switch(cmd)
- {
- case CMD_IS_VALID_FILE: // 判断指定文件是否能被本模块处理
- if (state >= PKST_PASSVER)
- return TRUE;
- break;
- case CMD_GET_FILE_INFO: // 获取指定文件的信息
- if (state >= PKST_PASSINFO)
- return TRUE;
- break;
- case CMD_LOAD_FROM_FILE: // 从指定图像文件中读取数据
- if (state >= PKST_INFOANDBITS)
- return TRUE;
- break;
- default:
- return FALSE;
- };
- int iRet;
- if (state < PKST_PASSVER)
- {
- comm = CMD_IS_VALID_FILE;
- result = ER_EMPTY;
- annexdata.iAnnData = 0;
- ::lstrcpy(filename, fn);
- state = PKST_NOTVER;
- iRet = fp((LPINFOSTR)this);
- if (!iRet)
- return FALSE;
- if (cmd == CMD_IS_VALID_FILE)
- return iRet;
- }
- if (state < PKST_PASSINFO)
- {
- comm = CMD_GET_FILE_INFO;
- result = ER_EMPTY;
- ::memset(&imginfo, 0, sizeof(IMAGEINFOSTR));
- ::lstrcpy(filename, fn);
- iRet = fp((LPINFOSTR)this);
- if (!iRet)
- return FALSE;
- if (cmd == CMD_GET_FILE_INFO)
- return iRet;
- }
- if (state < PKST_INFOANDBITS)
- {
- comm = CMD_LOAD_FROM_FILE;
- result = ER_EMPTY;
- pImgInfo = NULL;
- sDIBInfo.bmi.biSize = sizeof(BITMAPINFOHEADER);
- sDIBInfo.bmi.biWidth = imginfo.width;
- sDIBInfo.bmi.biHeight = imginfo.height;
- sDIBInfo.bmi.biPlanes = 1;
- sDIBInfo.bmi.biBitCount = 32; // ISee内部标准图像格式是32位的
- sDIBInfo.bmi.biCompression = BI_RGB;
- sDIBInfo.bmi.biSizeImage = 0;
- sDIBInfo.bmi.biXPelsPerMeter = 3721;
- sDIBInfo.bmi.biYPelsPerMeter = 3721;
- sDIBInfo.bmi.biClrUsed = 0;
- sDIBInfo.bmi.biClrImportant = 0;
- sDIBInfo.rmask = 0xff0000;
- sDIBInfo.gmask = 0xff00;
- sDIBInfo.bmask = 0xff;
- sDIBInfo.alphaMask = 0;
- // 分配用于存放标准图像位数据的内存块
- _pbdata = (PBYTE)::GlobalAlloc(GPTR, sDIBInfo.bmi.biWidth*4*sDIBInfo.bmi.biHeight);
- if (!_pbdata)
- return FALSE;
- // 分配用于存放每一扫描行地址的指针数组并初始化
- pLineAddr = (DWORD**)::GlobalAlloc(GPTR, sDIBInfo.bmi.biHeight*sizeof(DWORD*));
- if (!pLineAddr)
- {
- ::GlobalFree(_pbdata);
- return FALSE;
- }
- // 初始化行首数组
- for (int y=0;y<sDIBInfo.bmi.biHeight;y++)
- pLineAddr[y] = (DWORD*)(_pbdata+((sDIBInfo.bmi.biHeight-y-1)*(sDIBInfo.bmi.biWidth*4)));
- // 读取图像位数据,并转成标准图像格式。
- iRet = fp((LPINFOSTR)this);
- if (!iRet)
- return FALSE;
- if (cmd == CMD_LOAD_FROM_FILE)
- return iRet;
- }
- return TRUE;
- }
- PACKSTATE CInfoStr::GetState(void)
- {
- return state;
- }
- LPCTSTR CInfoStr::GetFileName(void)
- {
- return (LPCTSTR)filename;
- }
- void CInfoStr::SetFileName(LPCTSTR fn)
- {
- ::memcpy((void*)filename, (const void*)fn, lstrlen(fn));
- }
- CInfoStr& CInfoStr::operator=(CInfoStr& info)
- {
- ::CopyMemory((PVOID)this, (CONST PVOID)&info, sizeof(CInfoStr));
- return *this;
- }
- /*
- // 图像读写数据包结构
- struct _tagINFOSTR
- {
- COMMAND comm; // 操作命令
- EXERESULT result; // 执行的结果(是成功了还是失败了)
- union {
- char cAnnData; // 联合,用于描述不同类型的数据,
- int iAnnData; // 是操作命令与执行结果的附加信息,
- long lAnnData; // 参见每个命令中对此值的含意说明
- float fAnnData;
- double dfAnnData;
- COMMAND cmAnnData; // 检察命令支持情况时用到
- unsigned short wAnnData;
- unsigned long dwAnnData;
- void *pAnnData;
- unsigned int siAnnData[DPK_ANNEXINFOSIZE/sizeof(int)];
- unsigned char scAnnData[DPK_ANNEXINFOSIZE];
- } annexdata;
- IMAGEINFOSTR imginfo; // 图像文件信息
- char filename[DPK_FILENAMESIZE];// 图像文件的路径及文件名
- void *pImgInfo; // 原始图像信息
- INTERBITMAPINFO sDIBInfo; // 标准图像格式信息结构
- unsigned long *(*pLineAddr);// 标准图像位数据中从0行到n-1行的每一行的首地址
- unsigned char *_pbdata; // 标准图像位数据缓冲区首地址
- PACKSTATE state; // 数据包当前的状态
- int modify; // 修改标记
- LPSUBIMGBLOCK psubimg; // 子图像数据块地址(静态图像此值应设为NULL)
- int (WINAPI *fpProgress)(int,int);
- // 由调用者提供的进度条显示函数指针(可以是NULL)
- // 入口参数1是总的进度数,参数2是当前的进度数。
- // 返回参数:如果返回0,则图像读写模块继续操作,
- // 如果返回非0值,则读写模块终止操作,返回数据包。
- };
- */