gol_rwcc.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:8k
- /********************************************************************
- 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, robit
- 文件版本:
- Build 00618
- Date 2000-6-18
- ********************************************************************/
- #include <windows.h>
- #include "..publicgol_isee.h"
- #include "gol_rwcc.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; // 位缓冲区
- psubimg = NULL; // 子图像链首块地址
- state = PKST_NULL;
- modify = 0;
- fpProgress = NULL;
- }
- CInfoStr::~CInfoStr()
- {
- if (pImgInfo)
- ::GlobalFree(pImgInfo);
- if (pLineAddr)
- ::GlobalFree(pLineAddr);
- if (_pbdata)
- ::GlobalFree(_pbdata);
- if (psubimg)
- _clear_list();
- }
- 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;
- }
- if (psubimg)
- {
- _clear_list();
- psubimg = NULL;
- }
- state = PKST_NULL;
- modify = 0;
- fpProgress = NULL;
- }
- //#########只用保存就行了,orbit,2000-08-31
- // 将图像保存到指定文件中
- // CMD_SAVE_TO_FILE,
- BOOL CInfoStr::SaveAsFile(LPCTSTR fn, COMMAND cmd, IMGPROC fp)
- {
- if (state < PKST_INFOANDBITS)
- return FALSE;
- comm = cmd;
- result = ER_EMPTY;
- ::lstrcpy(filename, fn);
- BOOL iRet = fp((LPINFOSTR)this);
- if (!iRet)
- return FALSE;
- return TRUE;
- }
- int CInfoStr::GetSubImgCount(void)
- {
- if (state <= PKST_PASSVER)
- return 0;
- // 静态图像没有子图像
- if ((imginfo.imgtype == IMT_RESSTATIC)||(imginfo.imgtype == IMT_VECTORSTATIC))
- return 0;
- // 返回子图像个数(不包括背景图像)
- return (int)imginfo.imgnumbers-1;
- }
- LPSUBIMGBLOCK CInfoStr::GetSubImgAt(int index) // based 0 index
- {
- // 防错检查
- if (state <= PKST_PASSVER)
- return NULL;
- int iSubNum, i;
- if ((iSubNum=GetSubImgCount()) == 0)
- return NULL;
- if (index >= iSubNum)
- return NULL;
- // 子图像链表必需是依次排放的
- LPSUBIMGBLOCK lpSubImg = psubimg;
- for(i=0;i<index;i++)
- lpSubImg = lpSubImg->next;
- //ASSERT(lpSubImg->index == index);
- return lpSubImg;
- }
- void CInfoStr::RemoveSubImg(int index)
- {
- return;
- }
- // 从指定图像文件中读取信息(数据)
- // 它只接受以下三个命令:
- // 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;
- }
- // 清除子图像链表
- void CInfoStr::_clear_list(void)
- {
- if (psubimg == NULL)
- return;
- //ASSERT(state >= PKST_INFOANDBITS);
- //ASSERT(imginfo.imgnumbers >= 1);
- LPSUBIMGBLOCK lpSubImg;
- while((lpSubImg=psubimg) != NULL)
- {
- psubimg = lpSubImg->next;
- lpSubImg->number = 0; // 子图像块的序列号
- lpSubImg->left = lpSubImg->top = 0; // 子图像块的显示位置(左上角)
- lpSubImg->width = lpSubImg->height = 0; // 子图像块的图像宽度及高度
- lpSubImg->dowith = 0; // 处置方法(针对于动画GIF)
- lpSubImg->userinput = 0; // 用户输入(针对于动画GIF)
- lpSubImg->colorkey = 0; // 透明色分量值
- lpSubImg->time = 0; // 显示的延迟时间
- if (lpSubImg->pLineAddr)
- ::GlobalFree(lpSubImg->pLineAddr);
- if (lpSubImg->_pbdata)
- ::GlobalFree(lpSubImg->_pbdata);
-
- lpSubImg->parents = NULL; // 第一桢图像数据的结构地址(所属数据包结构的地址)
- lpSubImg->prev = NULL; // 前一桢图像数据的结构地址
- lpSubImg->next = NULL; // 后一桢图像数据的结构地址(NULL表示这是最后一副图像)
- ::GlobalFree(lpSubImg);
- };
- return;
- }