IRWEngine.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:85k
- /********************************************************************
- IRWEngine.cpp - ISee图像读写引擎实现文件
- 版权所有(C) VCHelp-coPathway-ISee workgroup 2000 all member's
- 这一程序是自由软件,你可以遵照自由软件基金会出版的GNU 通用许可证
- 条款来修改和重新发布这一程序。或者用许可证的第二版,或者(根据你
- 的选择)用任何更新的版本。
- 发布这一程序的目的是希望它有用,但没有任何担保。甚至没有适合特定
- 目地的隐含的担保。更详细的情况请参阅GNU通用许可证。
- 你应该已经和程序一起收到一份GNU通用许可证(GPL)的副本。如果还没有,
- 写信给:
- The Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
- MA02139, USA
- 如果你在使用本软件时有什么问题或建议,用以下地址可以与我们取得联
- 系:
- http://isee.126.com
- http://www.vchelp.net
- 或:
- iseesoft@china.com
- 作 者:YZ E-mail:yzfree@sina.com
- Analyst E-mail:analyst@citiz.net
- 功能实现:图像读写插件的封装,独立的工作线程,透明的读写过程。
- 文件版本:
- Build 00009
- Date 2000-12-20
- ********************************************************************/
- #include "stdafx.h"
- #include "IRWERegTabFunction.h"
- #include "IRWEngineInfoList.h"
- #include "IRWEngine.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- // 图像读写引擎实体。(唯一的一个实体,不允许再定义另外的的实体)
- static CIRWEngine isee_img_engine;
- //@@@@@@@@@@@命令处理函数@@@@@@@@@@@@@@
- // 判断指定文件是否是能被处理的图像文件(精确型)
- void _fnIRWEC_IS_VALID_FILE(CReturnReceipt *lpCRRt, BOOL type = FALSE);
- // 获取图像文件的信息
- void _fnIRWEC_GET_FILE_INFO(CReturnReceipt *lpCRRt);
- // 将图像文件读入内存
- void _fnIRWEC_LOAD_FROM_FILE(CReturnReceipt *lpCRRt);
- // 保存图像到文件
- void _fnIRWEC_SAVE_TO_FILE(CReturnReceipt *lpCRRt);
- // 获取指定尺寸的图像
- void _fnIRWEC_RESIZE(CReturnReceipt *lpCRRt);
- // 获取拇指图
- void _fnIRWEC_GET_THUM_IMAGE(CReturnReceipt *lpCRRt, BOOL keepbit);
- //@@@@@@@@@@@命令处理函数的助手@@@@@@@@@@@
- int _fnIRWEC_Helper_IS_VALID_FILE(CReturnReceipt *, int);
- int _fnIRWEC_Helper_GET_FILE_INFO(CReturnReceipt *, int);
- //@@@@@@@@@@@引擎助手函数@@@@@@@@@@@
- // 调入指定插件
- int _IRWE_SureActive(int ID);
- // 调入所有插件
- int _IRWE_ActiveAll(void);
- // 确定指定的文件能被哪个插件处理,并返回插件的ID
- int _IRWE_QueryFileProcID(LPCTSTR lpFileName);
- // 初始化插件函数内部助手-刷新系统注册表
- int _IRWE_UpdateRegTab();
- // 建立插件信息数组
- int _IRWE_CreatePluginsInfoStock(void);
- // 销毁插件信息数组
- int _IRWE_DestroyPluginsInfoStock(void);
- // 发送命令到总命令列表
- int _IRWE_PostCommandToImgEngine(CReturnReceipt *lpCommand, BOOL pri=FALSE);
- // 从总命令队列读取命令
- CReturnReceipt *_IRWE_ReadCommandFromTotalList(void);
- // 图像读写引擎线程入口点
- UINT ie_ThreadEnter(LPVOID pParam);
- //@@@@缩放代码相关定义@@@@Add by Analyst 2000-12-19@@@@
- // Alpha表
- static QWORD s_AlphaTable[_IRWE_THUM_APLHATAB_SIZE];
- // Alpha表初始化
- void _Thum_InitAlphaTable();
- // 缩放接口函数
- void _Thum_BlitStretch(DWORD **lpDesLines, int deswidth, int desheight,
- DWORD **lpSrcLines, int srcwidth, int srcheight);
- // 行缩放函数
- void _Thum_DrawScanLine(DWORD* DestAddr, DWORD* SrcAddr,
- int Width, DWORD dU);
- void _Thum_DrawScanLineAlpha(DWORD* DestAddr, DWORD* SrcAddr,
- int Width, DWORD dU, DWORD Alpha);
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- #define ENGINE_ID 101 // 引擎线程标识
- #define INIT_ACTIVE_PLUGINS_NUM 3 // 初始调入插件个数
- // 引擎状态标志,用以表明图像读写引擎是否已建立。如果
- // 这个值是IRWES_DEATH,则说明引擎还未被建立,如果该
- // 是IRWES_EXIST,则说明引擎已经被建立起来了。
- // 注:引擎只能被创建一次,如果多次调用引擎的创建函数
- // ,在调试版中将引发断言。
- static int m_IRWEState = IRWES_DEATH;
- static UINT m_EngineID = ENGINE_ID; // 引擎的ID
- static HANDLE m_EngineHandle = NULL; // 引擎句柄
- static _IRWEC_InfoList m_EngineData; // 图像读写模块信息表
- static BYTE m_ProcType[IRWE_PROCTYPE_SIZE]; // 引擎能处理的文件类型(用大写的文件扩展名标识,扩展名之间用逗号分隔)
- static int m_ProcID[IRWE_PROCID_SIZE]; // 能处理的文件类型与插件ID的对照表
- static int m_ProcCount; // 能处理的文件类型总数
- static CWinThread *ISee_pImgEngineThread = NULL; // 图像读写引擎线程指针
- static HANDLE m_EnterEvent; // 线程入口点事件
- static BOOL m_EngineWorkSignal = FALSE; // 引擎线程工作信号(TRUE—工作,FALSE—不工作)
- static CPtrList m_CommandList(256); // 命令队列实体
- static CRITICAL_SECTION m_CLCriticalSection; // 命令队列访问关键段
- static CReturnReceipt *m_pCurrentReturnReceipt; // 当前正在处理的回执单
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- // 图像读写引擎全局助手函数
- //
- // 获取图像读写引擎(指针类型)
- CIRWEngine *ISeeGetIRWEngine()
- {
- return (m_IRWEState == IRWES_DEATH) ? NULL:(CIRWEngine*)(&isee_img_engine);
- }
- // 查询图像读写引擎状态
- int ISeeQuestionIRWEState()
- {
- return m_IRWEState;
- }
- // 创建图像读写引擎
- int ISeeBeginIRWEngine()
- {
- ASSERT(ISeeQuestionIRWEState() == IRWES_DEATH); // 创建之后不能再调用此函数
- ASSERT(m_EngineData.GetUsedElemSize() == 0);
- // 建立信息库
- int result = _IRWE_CreatePluginsInfoStock();
- if (result != 0)
- return -1; // 引擎信息库无法创建
- // 创建手动、初始化状态为非信号化的事件
- m_EnterEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
- if (!m_EnterEvent)
- {
- _IRWE_DestroyPluginsInfoStock();
- return -2; // 无法创建同步事件
- }
- // 非信号化
- ::ResetEvent(m_EnterEvent);
- // 创建图像读写引擎
- if (!(ISee_pImgEngineThread = ::AfxBeginThread(ie_ThreadEnter, NULL)))
- {
- ::CloseHandle(m_EnterEvent);
- _IRWE_DestroyPluginsInfoStock();
- return -3; // 无法创建引擎线程
- }
- ISee_pImgEngineThread->m_bAutoDelete = FALSE;
- // 等待线程初始化完毕
- ::WaitForSingleObject(m_EnterEvent, 6000);
- ::CloseHandle(m_EnterEvent);
- // 初始化缩放代码所需的Alpha表
- _Thum_InitAlphaTable();
- m_EngineWorkSignal = TRUE;
- ASSERT(IRWES_DEATH == m_IRWEState);
- m_IRWEState = IRWES_EXIST;
- return 0; // 引擎已成功创建
- }
- // 关闭图像读写引擎
- void ISeeEndIRWEngine()
- {
- if (ISeeQuestionIRWEState() == IRWES_DEATH)
- return;
- isee_img_engine.Destruct();
- delete ISee_pImgEngineThread;
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- // 图像读写引擎接口函数
- //
- // 接口类初始化
- CIRWEngine::CIRWEngine()
- {
- VERIFY(this == (CIRWEngine*)&isee_img_engine); // 只能有一个实体
- int i;
- m_IRWEState = IRWES_DEATH;
- m_EngineID = ENGINE_ID;
- m_EngineHandle = NULL;
- m_EngineData.ZeroAllElement();
- ::ZeroMemory((PVOID)m_ProcType, IRWE_PROCTYPE_SIZE);
- for (i=0;i<IRWE_PROCID_SIZE;i++)
- m_ProcID[i] = -1;
- m_ProcCount = 0;
- }
- // 引擎析构
- CIRWEngine::~CIRWEngine()
- {
- if (m_IRWEState == IRWES_EXIST)
- Destruct();
- }
- // 暂停引擎的工作
- void CIRWEngine::Pause()
- {
- m_EngineWorkSignal = FALSE;
- }
- // 恢复引擎的工作
- void CIRWEngine::Restore()
- {
- m_EngineWorkSignal = TRUE;
- }
- // 获取能处理的文件的过滤串(用于FileDialog)
- LPTSTR CIRWEngine::GetFileFilterString()
- {
- ASSERT(ISeeQuestionIRWEState() == IRWES_EXIST);
- ASSERT(m_EngineData.GetUsedElemSize() > 0);
- CString cstmp;
- CString cstmp2;
- PBYTE lpTmp = (PBYTE)m_ProcType; // 文件类型描述串
- BYTE ProcBuf[8], tmp;
- int i, j;
- cstmp = (LPCTSTR)"所有被支持的图像文件 (";
- cstmp2.Empty();
- for (i=0;i<m_ProcCount;i++)
- {
- j = 0;
- while( ((tmp=*lpTmp++) != ',') && (tmp != 0) )
- ProcBuf[j++] = tmp;
- ProcBuf[j] = 0;
- ASSERT(j < 5);
- ::_strlwr((char*)ProcBuf); // 转换为小写
- cstmp2 += (LPCTSTR)"*.";
- cstmp2 += (LPCTSTR)ProcBuf;
- if ((i+1) != m_ProcCount)
- cstmp2 += (LPCTSTR)"; ";
- }
- ASSERT(cstmp2.GetLength() > 0); // 起码应该有一种图像被支持
- cstmp += cstmp2;
- cstmp += (LPCTSTR)")|";
- cstmp += cstmp2;
- cstmp += (LPCTSTR)"|";
- lpTmp = (PBYTE)m_ProcType; // 文件类型描述串
- for (i=0;i<m_ProcCount;i++)
- {
- j = 0;
- while( ((tmp=*lpTmp++) != ',') && (tmp != 0) )
- ProcBuf[j++] = tmp;
- ProcBuf[j] = 0;
- ASSERT(j < 5);
- cstmp += (LPCTSTR)ProcBuf;
- cstmp += (LPCTSTR)"文件 (";
- ::_strlwr((char*)ProcBuf); // 转换为小写
- cstmp += (LPCTSTR)"*.";
- cstmp += (LPCTSTR)ProcBuf;
- cstmp += (LPCTSTR)")|*.";
- cstmp += (LPCTSTR)ProcBuf;
- cstmp += (LPCTSTR)"|";
- }
- cstmp += (LPCTSTR)"所有文件 (*.*)|*.*||";
- LPTSTR lpResult = (LPTSTR)::GlobalAlloc(GPTR, cstmp.GetLength()+1);
- if (!lpResult)
- return NULL;
- // 复制过滤串
- ::CopyMemory((PVOID)lpResult, (PVOID)(LPCTSTR)cstmp, cstmp.GetLength()+1);
- return lpResult;
- }
- // 查询指定文件是否是能处理的图象文件(简版,只从扩展名判断)
- BOOL CIRWEngine::IsValidImageFile(LPCTSTR lpFileName)
- {
- // 确定指定的文件能被哪个插件处理,TRUE表示能被处理(只从扩展名上看)
- return (_IRWE_QueryFileProcID(lpFileName) == -1) ? FALSE:TRUE;
- }
- // 查询指定文件是否是能处理的图象文件(标准版,根据文件的内容判断)
- CReturnReceipt *CIRWEngine::IsValidImageFile(LPCTSTR lpFileName, BOOL type)
- {
- // 参数 BOOL type是指判断精度标志:TRUE-精确判断, FALSE-普通判断
- // 精确判断就是不以文件的扩展名为首要的判断标准,而是让
- // 所有的图像读写模块都判断一遍。这样做的好处是可以找出
- // 那些修改了扩展名的图像文件,但缺点是速度非常低。
- CReturnReceipt *lptmp = new CReturnReceipt;
- if (!lptmp)
- return NULL;
- lptmp->m_processing = IRWEPROC_INITING;
- if (type == FALSE) // 普通判断
- lptmp->m_command = IRWEC_IS_VALID_FILE_COMN;
- else
- { // 精确判断
- ASSERT(type == TRUE);
- lptmp->m_command = IRWEC_IS_VALID_FILE_NICETY;
- }
- ::lstrcpy((LPTSTR)lptmp->m_filename, (LPCTSTR)lpFileName);
- // 发送回执单至命令队列
- _IRWE_PostCommandToImgEngine(lptmp);
- // 等待
- while((lptmp->m_processing==IRWEPROC_FELL_IN)||(lptmp->m_processing==IRWEPROC_PROCESSING));
- return lptmp;
- }
- // 获取图像信息
- CReturnReceipt *CIRWEngine::GetImageFileInfo(LPCTSTR lpFileName)
- {
- CReturnReceipt *lptmp = new CReturnReceipt;
- if (!lptmp)
- return NULL;
- lptmp->m_processing = IRWEPROC_INITING;
- lptmp->m_command = IRWEC_GET_FILE_INFO;
- ::lstrcpy((LPTSTR)lptmp->m_filename, (LPCTSTR)lpFileName);
- // 发送回执单至命令队列
- _IRWE_PostCommandToImgEngine(lptmp);
- return lptmp;
- }
- // 获取图像信息
- void CIRWEngine::GetImageFileInfo(CReturnReceipt *pCRRt)
- {
- ASSERT(pCRRt);
-
- ASSERT(pCRRt->m_processing >= IRWEPROC_COMPLETE);
- // 注:不能重复发送同一个回执单到引擎中!也就是说同一个回执单
- // 不能同时执行两个或两个以上的命令
- #ifndef _DEBUG
- while(pCRRt->m_processing < IRWEPROC_COMPLETE); // 发布版用此语句替换,但将影响程序的灵敏度
- #endif
- pCRRt->m_processing = IRWEPROC_INITING;
- pCRRt->m_command = IRWEC_GET_FILE_INFO;
- ASSERT(::lstrlen((LPCTSTR)(pCRRt->m_filename)));
- ASSERT(pCRRt->m_data.state > PKST_NOTVER); // 必须已经通过校验
- _IRWE_PostCommandToImgEngine(pCRRt);
- }
- // 读入图象
- CReturnReceipt *CIRWEngine::LoadImageFromFile(
- LPCTSTR lpFileName,
- BOOL pri/*命令的优先级,TRUE为高级命令,会被优先处理*/)
- {
- CReturnReceipt *lptmp = new CReturnReceipt;
- if (!lptmp)
- return NULL;
- lptmp->m_processing = IRWEPROC_INITING;
- lptmp->m_command = IRWEC_LOAD_FROM_FILE;
- ::lstrcpy((LPTSTR)lptmp->m_filename, (LPCTSTR)lpFileName);
- lptmp->m_data.state = PKST_NOTVER;
- _IRWE_PostCommandToImgEngine(lptmp, pri);
- return lptmp;
- }
- // 读入图象
- void CIRWEngine::LoadImageFromFile(
- CReturnReceipt *pCRRt,
- BOOL pri/*命令的优先级,TRUE为高级命令,会被优先处理*/)
- {
- ASSERT(pCRRt);
- ASSERT(pCRRt->m_processing >= IRWEPROC_COMPLETE);
- // 注:不能重复发送同一个回执单到引擎中!也就是说同一个回执单
- // 不能同时执行两个或两个以上的命令
- #ifndef _DEBUG
- while(pCRRt->m_processing < IRWEPROC_COMPLETE); // 发布版用此语句替换,但将影响程序的灵敏度
- #endif
- pCRRt->m_processing = IRWEPROC_INITING;
- pCRRt->m_command = IRWEC_LOAD_FROM_FILE;
- ASSERT(pCRRt->m_filename);
- ASSERT(pCRRt->m_data.state > PKST_NOTVER);
- _IRWE_PostCommandToImgEngine(pCRRt, pri);
- }
- // 保存图象
- void CIRWEngine::SaveImageToFile(
- LPCTSTR lpNewFileName, // 新的文件的全路径
- CReturnReceipt *lpCRRt,
- LPBYTE lpSaveInfo, // 用户设定的保存参数
- DWORD dwSaveInfoSize)
- {
- ASSERT(lpCRRt);
- ASSERT(lpNewFileName);
- ASSERT(lpSaveInfo);
- ASSERT(dwSaveInfoSize < DPK_ANNEXINFOSIZE);
- ASSERT(lpCRRt->m_data.state >= PKST_INFOANDBITS);
-
- ASSERT(lpCRRt->m_processing >= IRWEPROC_COMPLETE);
- // 注:不能重复发送同一个回执单到引擎中!也就是说同一个回执单
- // 不能同时执行两个或两个以上的命令
- #ifndef _DEBUG
- while(lpCRRt->m_processing < IRWEPROC_COMPLETE); // 发布版用此语句替换,但将影响程序的灵敏度
- #endif
- lpCRRt->m_processing = IRWEPROC_INITING;
- lpCRRt->m_command = IRWEC_SAVE_TO_FILE;
- ::lstrcpy((LPTSTR)lpCRRt->m_filename, (LPCTSTR)lpNewFileName);
- ::CopyMemory((PVOID)lpCRRt->m_data.annexdata.siAnnData, (PVOID)lpSaveInfo, dwSaveInfoSize);
- _IRWE_PostCommandToImgEngine(lpCRRt);
- }
- // 按照指定的大小读入图象
- CReturnReceipt *CIRWEngine::LoadImageResize(LPCTSTR lpFileName, CSize& size)
- {
- CReturnReceipt *lptmp = new CReturnReceipt;
- if (!lptmp)
- return NULL;
- lptmp->m_command = IRWEC_RESIZE;
- ::lstrcpy((LPTSTR)lptmp->m_filename, (LPCTSTR)lpFileName);
- lptmp->m_processing = IRWEPROC_INITING;
- lptmp->m_data.state = PKST_NOTVER;
- lptmp->m_data.sDIBInfo.bmi.biWidth = size.cx;
- lptmp->m_data.sDIBInfo.bmi.biHeight = size.cy;
- _IRWE_PostCommandToImgEngine(lptmp);
- return lptmp;
- }
- // 获取图像文件的拇指图(以ISee格式(倒向32位DIB))
- CReturnReceipt *CIRWEngine::GetThumImage(
- LPCTSTR lpFileName, // 待读取的文件名串
- CRect& rect, // 可以容纳拇指图的最小矩形(拇指图是按比例缩放的)
- BOOL keepbit, // 是否保留图像的位数据(在获取拇指图的过程中,
- // 整个的图像位数据都将被调入,如果该变量设为FALSE,
- // 则在本函数返回前将销毁这些数据。TRUE则保留)
- // 如果在调用本命令之前,回执单中已经存在位数据,那
- // 么无论此变量设为何值,位数据均不会被删除
- BOOL pri) // 命令的执行优先级,TRUE为高优先级命令,会被优先执行
- {
- ASSERT((lpFileName)&&(::lstrlen(lpFileName)));
- ASSERT(rect.Width() == rect.Height()); // 拇指图外围矩形必须是正方形
- ASSERT(rect.Width() >= IRWE_THUMIMAGE_MINI_SIZE);
- CReturnReceipt *lptmp = new CReturnReceipt;
- if (!lptmp)
- return NULL;
- lptmp->m_processing = IRWEPROC_INITING;
- lptmp->m_command = (keepbit) ? IRWEC_GET_THUMIMAGE_A_BIT:IRWEC_GET_THUMIMAGE;
- ::lstrcpy((LPTSTR)lptmp->m_filename, (LPCTSTR)lpFileName);
- lptmp->m_data.state = PKST_NOTVER;
- lptmp->m_thumbnails.m_thumbound = rect;
- lptmp->m_thumbnails.m_thumfrom = IRWETHUM_FROM_CREATE;
- _IRWE_PostCommandToImgEngine(lptmp, pri);
- return lptmp;
- }
- // 获取图像文件的拇指图(以ISee格式(倒向32位DIB))
- void CIRWEngine::GetThumImage(
- CReturnReceipt *pCRRt, // 待读取的文件回执单
- CRect& rect, // 同上,略
- BOOL keepbit,
- BOOL pri)
- {
- ASSERT(pCRRt);
- ASSERT(rect.Width() == rect.Height()); // 必须是正方形
- ASSERT(rect.Width() >= IRWE_THUMIMAGE_MINI_SIZE);
- ASSERT(pCRRt->m_processing >= IRWEPROC_COMPLETE);
- // 注:不能重复发送同一个回执单到引擎中!也就是说同一个回执单
- // 不能同时执行两个或两个以上的命令
- #ifndef _DEBUG
- while(pCRRt->m_processing < IRWEPROC_COMPLETE); // 发布版用此语句替换,但将影响程序的灵敏度
- #endif
- pCRRt->m_processing = IRWEPROC_INITING;
- pCRRt->m_command = (keepbit) ? IRWEC_GET_THUMIMAGE_A_BIT:IRWEC_GET_THUMIMAGE;
- ASSERT(pCRRt->m_filename);
- ASSERT(pCRRt->m_data.state > PKST_NOTVER);
- pCRRt->m_thumbnails.m_thumbound = rect;
- pCRRt->m_thumbnails.m_thumfrom = IRWETHUM_FROM_CREATE;
- _IRWE_PostCommandToImgEngine(pCRRt, pri);
- }
- // 销毁图像读写引擎
- int CIRWEngine::Destruct()
- {
- CReturnReceipt ics;
- HKEY hKey; // 注册表总句柄
- HKEY hPlugKey; // 插件句柄
- ics.m_command = IRWEC_IN_END;
- _IRWE_PostCommandToImgEngine(&ics, TRUE);
- VERIFY(::WaitForSingleObject(ISee_pImgEngineThread->m_hThread, INFINITE) == WAIT_OBJECT_0);
- m_EngineWorkSignal = FALSE;
- int i;
- LPIRWMODULEINFO lpIRWEInfo = NULL;
- // 打开系统注册表,用于刷新各插件PRI
- hKey = _IRWERTF_OpenRegTab();
- for (i=0;i<m_EngineData.GetUsedElemSize();i++)
- {
- lpIRWEInfo = m_EngineData.GetAt(i);
- ASSERT(lpIRWEInfo);
- if (lpIRWEInfo->m_ModuleState >= IRWEMS_CA)
- {
- // 插件已经被调入,说明可能发生过读写操作
- VERIFY(lpIRWEInfo->m_ModuleState == IRWEMS_CR);
- ASSERT(lpIRWEInfo->m_hDll);
- // 打开待刷新的插件句柄
- hPlugKey = _IRWERTF_OpenPlugins(hKey, (LPCTSTR)(lpIRWEInfo->m_ModuleName));
- // 刷新插件优先级值
- ASSERT(lpIRWEInfo->m_PRI > 10);
- _IRWERTF_SetPluginPRI(hPlugKey, lpIRWEInfo->m_PRI);
- _IRWERTF_CloseKey(hPlugKey);
- }
- }
- // 关闭系统注册表
- _IRWERTF_CloseKey(hKey);
- // 释放插件资源
- m_EngineData.Destroy();
- // 清理插件相关变量
- ::ZeroMemory((PVOID)m_ProcType, IRWE_PROCTYPE_SIZE);
- for (i=0;i<IRWE_PROCID_SIZE;i++)
- m_ProcID[i] = -1;
- m_ProcCount = 0;
- // 引擎熄火 :-D
- m_IRWEState = IRWES_DEATH;
- return 0;
- }
- // 获取插件开发者的信息
- int CIRWEngine::GetDeveloperInfo(LPDEVELOPERINFO *lppDevInfo)
- {
- ASSERT(ISeeQuestionIRWEState() == IRWES_EXIST);
- ASSERT(m_EngineData.GetUsedElemSize() > 0);
- LPDEVELOPERINFO lpInfo = (LPDEVELOPERINFO)::GlobalAlloc(GPTR, sizeof(DEVELOPERINFO)*(m_EngineData.GetUsedElemSize()+1));
- if (!lpInfo)
- {
- *lppDevInfo = NULL;
- return 0;
- }
- LPIRWMODULEINFO lpIRWEInfo;
- for (int i=0;i<m_EngineData.GetUsedElemSize();i++)
- {
- lpIRWEInfo = m_EngineData.GetAt(i);
- ASSERT((lpIRWEInfo)&&(lpIRWEInfo->m_SN == i));
- // 代码名称
- ::CopyMemory((PVOID)(lpInfo[i].modulename), (CONST PVOID)(lpIRWEInfo->m_ModuleName), 16);
- // 作者名字(多人时用逗号分隔)
- ::CopyMemory((PVOID)(lpInfo[i].author), (CONST PVOID)(lpIRWEInfo->m_Author), 16);
- // 作者电邮地址(多人时用逗号分隔)
- ::CopyMemory((PVOID)(lpInfo[i].EMail), (CONST PVOID)(lpIRWEInfo->m_EMail), 32);
- // 作者的留言信息
- ::CopyMemory((PVOID)(lpInfo[i].messages), (CONST PVOID)(lpIRWEInfo->m_Notion), 144);
- }
- ::lstrcpy((LPTSTR)(lpInfo[i].modulename), (LPCTSTR)_T("图像读写引擎"));
- ::lstrcpy((LPTSTR)(lpInfo[i].author), (LPCTSTR)_T("YZ"));
- ::lstrcpy((LPTSTR)(lpInfo[i].EMail), (LPCTSTR)_T("yzfree@sina.com"));
- ::lstrcpy((LPTSTR)(lpInfo[i].messages), (LPCTSTR)_T("咦哈!做这个破东西差点让我的脑子打结!"));
- *lppDevInfo = lpInfo;
- // 插件个数加引擎信息
- return m_EngineData.GetUsedElemSize()+1;
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- // 引擎的核心---命令泵
- //
- UINT ie_ThreadEnter(LPVOID pParam)
- {
- int exitmark = 0; // 线程结束标志
- CReturnReceipt *lpCRRt; // 命令包临时指针
- ASSERT(m_CommandList.IsEmpty());// 初创引擎,不应该有信息
- ::InitializeCriticalSection(&m_CLCriticalSection);
- m_pCurrentReturnReceipt = NULL;
- ::SetEvent(m_EnterEvent);
- while(!exitmark)
- {
- // 从命令队列中获取命令
- // -如果工作标志为FALSE或命令队列中没有命令,则 修眠—循环
- if ( (m_EngineWorkSignal == FALSE)||
- ((lpCRRt=_IRWE_ReadCommandFromTotalList()) == NULL) )
- {
- ::Sleep(10); // 休眠10毫秒
- continue;
- }
- // 设置为当前正在处理的回执单
- m_pCurrentReturnReceipt = lpCRRt;
- // 分发命令
- switch(lpCRRt->GetCommand())
- {
- case IRWEC_IS_VALID_FILE_COMN: // 判断指定文件是否是能被处理的图像文件(普通型)
- _fnIRWEC_IS_VALID_FILE(lpCRRt, FALSE);
- break;
- case IRWEC_IS_VALID_FILE_NICETY: // 判断指定文件是否是能被处理的图像文件(精确型)
- _fnIRWEC_IS_VALID_FILE(lpCRRt, TRUE);
- break;
- case IRWEC_GET_FILE_INFO: // 获取图像文件的信息
- _fnIRWEC_GET_FILE_INFO(lpCRRt);
- break;
- case IRWEC_LOAD_FROM_FILE: // 将图像文件读入内存
- _fnIRWEC_LOAD_FROM_FILE(lpCRRt);
- break;
- case IRWEC_SAVE_TO_FILE: // 保存图像到文件
- _fnIRWEC_SAVE_TO_FILE(lpCRRt);
- break;
- case IRWEC_RESIZE: // 获取指定尺寸的图像
- _fnIRWEC_RESIZE(lpCRRt);
- break;
- case IRWEC_IN_END: // 结束引擎线程
- exitmark = 1;
- ::EnterCriticalSection(&m_CLCriticalSection);
- while(m_CommandList.GetCount() > 0)
- {
- lpCRRt = (CReturnReceipt *)(m_CommandList.RemoveHead());
- lpCRRt->m_processing = IRWEPROC_FAIL;
- lpCRRt->m_errorinfo = IRWEERR_ENGINECLOSE;
- }
- ::LeaveCriticalSection(&m_CLCriticalSection);
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- break;
- case IRWEC_GET_THUMIMAGE: // 获取拇指图
- _fnIRWEC_GET_THUM_IMAGE(lpCRRt, FALSE);
- break;
- case IRWEC_GET_THUMIMAGE_A_BIT: // 获取拇指图并保留位数据
- _fnIRWEC_GET_THUM_IMAGE(lpCRRt, TRUE);
- break;
- //case IRWEC_XXX: // 新的命令在此加入
- default:
- ASSERT(FALSE);
- exitmark = 1;
- break;
- }
- m_pCurrentReturnReceipt = NULL;
- }
- ::DeleteCriticalSection(&m_CLCriticalSection);
- return 0;
- }
- //#######################################################################
- // 助手函数
- //
- int _fnIRWEC_Helper_IS_VALID_FILE(CReturnReceipt *lpCRRt, int id)
- {
- ASSERT(id >= 0);
- ASSERT(lpCRRt);
- int result;
- LPIRWMODULEINFO lpIRWEInfo = m_EngineData.GetAt(id);
- ASSERT((lpIRWEInfo)&&(lpIRWEInfo->m_ModuleState==IRWEMS_CR));
- ASSERT(lpIRWEInfo->m_IRWPInterFace); // 此时对应的插件必须已被调入
- lpIRWEInfo->m_ModuleState = IRWEMS_CA; // 标志该插件进入工作状态
- lpCRRt->m_data.comm = CMD_IS_VALID_FILE;
- lpCRRt->m_data.result = ER_EMPTY;
- lpCRRt->m_data.annexdata.iAnnData = 0;
- ::lstrcpy(lpCRRt->m_data.filename, lpCRRt->m_filename);
- lpCRRt->m_data.state = PKST_NOTVER;
- result = lpIRWEInfo->m_IRWPInterFace((LPINFOSTR)lpCRRt);// 调用图像读写模块
- lpIRWEInfo->m_ModuleState = IRWEMS_CR;
- return result;
- }
- int _fnIRWEC_Helper_GET_FILE_INFO(CReturnReceipt *lpCRRt, int id)
- {
- ASSERT(id >= 0);
- ASSERT(lpCRRt);
- int result;
- LPIRWMODULEINFO lpIRWEInfo = m_EngineData.GetAt(id);
- ASSERT((lpIRWEInfo)&&(lpIRWEInfo->m_ModuleState==IRWEMS_CR));
- ASSERT(lpIRWEInfo->m_IRWPInterFace); // 此时对应的插件必须已被调入
- lpIRWEInfo->m_ModuleState = IRWEMS_CA;
- lpCRRt->m_data.comm = CMD_GET_FILE_INFO;
- lpCRRt->m_data.result = ER_EMPTY;
- ::ZeroMemory((PVOID)&(lpCRRt->m_data.imginfo), sizeof(IMAGEINFOSTR));
- ::lstrcpy(lpCRRt->m_data.filename, lpCRRt->m_filename);
- ASSERT(lpCRRt->m_data.state == PKST_PASSVER);
- result = lpIRWEInfo->m_IRWPInterFace((LPINFOSTR)lpCRRt);
- lpIRWEInfo->m_ModuleState = IRWEMS_CR;
- return result;
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- // 命令处理函数
- //
- // 判断指定文件是否是能被处理的图像文件
- void _fnIRWEC_IS_VALID_FILE(CReturnReceipt *lpCRRt, BOOL type)
- {
- ASSERT(lpCRRt);
- ASSERT(::lstrlen((LPCTSTR)lpCRRt->m_filename));
- ASSERT((lpCRRt->m_command == IRWEC_IS_VALID_FILE_COMN)||(lpCRRt->m_command == IRWEC_IS_VALID_FILE_NICETY));
- // 调用本函数时,回执单中不能含有图像信息及位数据!
- ASSERT(lpCRRt->m_data.pLineAddr == NULL);
- ASSERT(lpCRRt->m_data._pbdata == NULL);
- ASSERT(lpCRRt->m_data.pImgInfo == NULL);
- int result;
- // 简单判断该文件是否能被插件处理
- int id = _IRWE_QueryFileProcID((LPCTSTR)(lpCRRt->m_filename));
- if (id >= 0) // 如果文件的扩展名已经明确的指出了图像类型
- {
- // 确保插件被调入
- if (_IRWE_SureActive(id) < 0)
- {
- // 调入插件失败
- lpCRRt->m_errorinfo = IRWEERR_ENGINEERR;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 执行判断操作
- _fnIRWEC_Helper_IS_VALID_FILE(lpCRRt, id);
- if (lpCRRt->m_data.result != ER_SUCCESS)
- {
- lpCRRt->m_errorinfo = (IRWE_ERROR)(int)(lpCRRt->m_data.result);
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- else
- {
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- if (lpCRRt->m_data.annexdata.iAnnData == 1)
- {
- ASSERT(lpCRRt->m_data.state == PKST_PASSVER);
- lpCRRt->m_modelID = id; // 可以被处理则该变量值有效
- }
- else
- {
- ASSERT(lpCRRt->m_data.state == PKST_NOTVER);
- lpCRRt->m_modelID = -1;
- }
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- // 判断指定的文件是否是能被处理的图像文件,应判断m_modelID
- // 是否为-1,如果是则表示不能被处理。大于等于0表示能被处理
- return;
- }
- }
- // 如果插件不能处理该文件,并且不要求精确判断,则返回不能处理
- if (type == FALSE)
- {
- lpCRRt->m_data.annexdata.iAnnData = 0;
- lpCRRt->m_data.state = PKST_NOTVER;
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- }
- // 用户要求精确判定,调入所有的读写模块
- result = _IRWE_ActiveAll();
- if (result <= 0)
- {
- lpCRRt->m_errorinfo = IRWEERR_ENGINEERR;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- int i, count = result; // result=所有可用插件的个数
- for (i=0;i<count;i++)
- {
- // 执行判断操作
- _fnIRWEC_Helper_IS_VALID_FILE(lpCRRt, i);
- if (lpCRRt->m_data.result != ER_SUCCESS)
- {
- lpCRRt->m_errorinfo = (IRWE_ERROR)(int)(lpCRRt->m_data.result);
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- else
- {
- if (lpCRRt->m_data.annexdata.iAnnData == 1)
- {
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_modelID = i;
- lpCRRt->m_processing= IRWEPROC_COMPLETE;
- return;
- }
- }
- }
- ASSERT(lpCRRt->m_data.annexdata.iAnnData == 0);
- ASSERT(lpCRRt->m_data.state == PKST_NOTVER);
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- }
- // 获取图像文件的信息
- void _fnIRWEC_GET_FILE_INFO(CReturnReceipt *lpCRRt)
- {
- ASSERT(lpCRRt);
- ASSERT(::lstrlen((LPCTSTR)lpCRRt->m_filename));
- ASSERT(lpCRRt->m_command == IRWEC_GET_FILE_INFO);
- int id;
- switch(lpCRRt->m_data.state)
- {
- case PKST_NOTVER:
- {
- // 在当前状态下,回执单中不应含有图像信息及位数据
- ASSERT(lpCRRt->m_data.pLineAddr == NULL);
- ASSERT(lpCRRt->m_data._pbdata == NULL);
- ASSERT(lpCRRt->m_data.pImgInfo == NULL);
- // 简单判断该文件是否能被插件处理
- id = _IRWE_QueryFileProcID((LPCTSTR)(lpCRRt->m_filename));
- if (id >= 0)
- {
- // 确保插件已被调入
- if (_IRWE_SureActive(id) < 0)
- {
- // 调入插件失败
- lpCRRt->m_errorinfo = IRWEERR_ENGINEERR;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 执行判断操作
- _fnIRWEC_Helper_IS_VALID_FILE(lpCRRt, id);
- if (lpCRRt->m_data.result != ER_SUCCESS)
- {
- lpCRRt->m_errorinfo = (IRWE_ERROR)(int)(lpCRRt->m_data.result);
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- else
- {
- if (lpCRRt->m_data.annexdata.iAnnData == 0)
- {
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- }
- else
- {
- // 指定的文件可以被插件处理,转到下一个CASE
- ASSERT(lpCRRt->m_data.state == PKST_PASSVER);
- lpCRRt->m_modelID = id;
- }
- }
- }
- else
- {
- // 不能被插件处理的文件
- lpCRRt->m_data.annexdata.iAnnData = 0;
- lpCRRt->m_data.state = PKST_NOTVER;
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- }
- }
- case PKST_PASSVER:
- ASSERT(lpCRRt->m_modelID >= 0);
- // 在当前状态下,回执单中不应含有图像信息及位数据
- ASSERT(lpCRRt->m_data.pLineAddr == NULL);
- ASSERT(lpCRRt->m_data._pbdata == NULL);
- ASSERT(lpCRRt->m_data.pImgInfo == NULL);
- // 确保插件已被调入
- if (_IRWE_SureActive(lpCRRt->m_modelID) < 0)
- {
- // 调入插件失败
- lpCRRt->m_errorinfo = IRWEERR_ENGINEERR;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 执行提取操作
- _fnIRWEC_Helper_GET_FILE_INFO(lpCRRt, lpCRRt->m_modelID);
- if (lpCRRt->m_data.result != ER_SUCCESS)
- {
- lpCRRt->m_errorinfo = (IRWE_ERROR)(int)(lpCRRt->m_data.result);
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- else
- {
- ASSERT(lpCRRt->m_data.state == PKST_PASSINFO);
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- }
- case PKST_PASSINFO:
- ASSERT(FALSE); // 程序出现了重复调用(该回执单已经有图像信息数据了)
- VERIFY(lpCRRt->m_modelID >= 0);
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- case PKST_INFOANDBITS:
- default:
- VERIFY(FALSE); // 不允许出现这种情况
- ::AfxMessageBox((LPCTSTR)_T("程序发生异常,您现在最好关闭本程序,以免使系统崩溃。"));
- lpCRRt->m_errorinfo = IRWEERR_ENGINEERR;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- }
- // 将图像文件读入内存
- void _fnIRWEC_LOAD_FROM_FILE(CReturnReceipt *lpCRRt)
- {
- ASSERT(lpCRRt);
- ASSERT(::lstrlen((LPCTSTR)lpCRRt->m_filename));
- ASSERT(lpCRRt->m_command == IRWEC_LOAD_FROM_FILE);
- int result, id, y;
- LPIRWMODULEINFO lpIRWEInfo;
- switch(lpCRRt->m_data.state)
- {
- case PKST_NOTVER:
- {
- // 在当前状态下,回执单中不应含有图像信息及位数据
- ASSERT(lpCRRt->m_data.pLineAddr == NULL);
- ASSERT(lpCRRt->m_data._pbdata == NULL);
- ASSERT(lpCRRt->m_data.pImgInfo == NULL);
- // 简单判断该文件是否能被插件处理
- id = _IRWE_QueryFileProcID((LPCTSTR)(lpCRRt->m_filename));
- if (id >= 0)
- {
- if (_IRWE_SureActive(id) < 0) // 确保插件已被调入
- {
- lpCRRt->m_errorinfo = IRWEERR_ENGINEERR;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 执行判断操作
- _fnIRWEC_Helper_IS_VALID_FILE(lpCRRt, id);
- if (lpCRRt->m_data.result != ER_SUCCESS)
- {
- // 读写模块在执行过程中发生错误
- lpCRRt->m_errorinfo = (IRWE_ERROR)(int)(lpCRRt->m_data.result);
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- else
- {
- if (lpCRRt->m_data.annexdata.iAnnData == 0)
- {
- // 指定文件不能被处理
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- }
- else
- {
- ASSERT(lpCRRt->m_data.state == PKST_PASSVER);
- lpCRRt->m_modelID = id; // 能处理
- }
- }
- }
- else
- {
- // 如果用文件的扩展名无法判断出类型,则返回
- lpCRRt->m_data.annexdata.iAnnData = 0;
- lpCRRt->m_data.state = PKST_NOTVER;
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- }
- }
- case PKST_PASSVER:
- ASSERT(lpCRRt->m_modelID >= 0);
- // 在当前状态下,回执单中不应含有图像信息及位数据
- ASSERT(lpCRRt->m_data.pLineAddr == NULL);
- ASSERT(lpCRRt->m_data._pbdata == NULL);
- ASSERT(lpCRRt->m_data.pImgInfo == NULL);
- // 确保插件已被调入
- if (_IRWE_SureActive(lpCRRt->m_modelID) < 0)
- {
- // 调入插件失败
- lpCRRt->m_errorinfo = IRWEERR_ENGINEERR;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 执行提取操作
- _fnIRWEC_Helper_GET_FILE_INFO(lpCRRt, lpCRRt->m_modelID);
- if (lpCRRt->m_data.result != ER_SUCCESS)
- {
- lpCRRt->m_errorinfo = (IRWE_ERROR)(int)(lpCRRt->m_data.result);
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- ASSERT(lpCRRt->m_data.state == PKST_PASSINFO);
- case PKST_PASSINFO:
- ASSERT(lpCRRt->m_modelID >= 0);
- // 在当前状态下,回执单中不应含有图像信息及位数据
- ASSERT(lpCRRt->m_data.pLineAddr == NULL);
- ASSERT(lpCRRt->m_data._pbdata == NULL);
- ASSERT(lpCRRt->m_data.pImgInfo == NULL);
- lpIRWEInfo = m_EngineData.GetAt(lpCRRt->m_modelID);
- ASSERT((lpIRWEInfo)&&(lpIRWEInfo->m_ModuleState==IRWEMS_CR));
- ASSERT(lpIRWEInfo->m_IRWPInterFace);
- lpCRRt->m_data.comm = CMD_LOAD_FROM_FILE;
- lpCRRt->m_data.result = ER_EMPTY;
- lpCRRt->m_data.pImgInfo = NULL;
- lpCRRt->m_data.sDIBInfo.bmi.biSize = sizeof(BITMAPINFOHEADER);
- ASSERT(lpCRRt->m_data.imginfo.width > 0);
- lpCRRt->m_data.sDIBInfo.bmi.biWidth = lpCRRt->m_data.imginfo.width;
- ASSERT(lpCRRt->m_data.imginfo.height > 0);
- lpCRRt->m_data.sDIBInfo.bmi.biHeight = lpCRRt->m_data.imginfo.height;
- lpCRRt->m_data.sDIBInfo.bmi.biPlanes = 1;
- lpCRRt->m_data.sDIBInfo.bmi.biBitCount = ISEE_IMAGE_BITCOUNT;// 恒定为32
- lpCRRt->m_data.sDIBInfo.bmi.biCompression = BI_RGB;
- lpCRRt->m_data.sDIBInfo.bmi.biSizeImage = 0;
- lpCRRt->m_data.sDIBInfo.bmi.biXPelsPerMeter = 0;
- lpCRRt->m_data.sDIBInfo.bmi.biYPelsPerMeter = 0;
- lpCRRt->m_data.sDIBInfo.bmi.biClrUsed = 0;
- lpCRRt->m_data.sDIBInfo.bmi.biClrImportant = 0;
- lpCRRt->m_data.sDIBInfo.rmask = 0xff0000;
- lpCRRt->m_data.sDIBInfo.gmask = 0xff00;
- lpCRRt->m_data.sDIBInfo.bmask = 0xff;
- lpCRRt->m_data.sDIBInfo.alphaMask = 0;
- // 分配用于存放标准图像位数据的内存块
- lpCRRt->m_data._pbdata = (PBYTE)::GlobalAlloc(GMEM_FIXED, lpCRRt->m_data.sDIBInfo.bmi.biWidth*(ISEE_IMAGE_BITCOUNT/8)*lpCRRt->m_data.sDIBInfo.bmi.biHeight);
- if (!lpCRRt->m_data._pbdata)
- {
- lpCRRt->m_errorinfo = IRWEERR_MEMORYERR;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 分配用于存放每一扫描行地址的指针数组并初始化
- lpCRRt->m_data.pLineAddr = (DWORD**)::GlobalAlloc(GPTR, lpCRRt->m_data.sDIBInfo.bmi.biHeight*sizeof(DWORD*));
- if (!lpCRRt->m_data.pLineAddr)
- {
- ::GlobalFree(lpCRRt->m_data._pbdata);
- lpCRRt->m_data._pbdata = NULL;
- lpCRRt->m_errorinfo = IRWEERR_MEMORYERR;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 初始化行首数组
- for (y=0;y<lpCRRt->m_data.sDIBInfo.bmi.biHeight;y++)
- lpCRRt->m_data.pLineAddr[y] = (DWORD*)(lpCRRt->m_data._pbdata+((lpCRRt->m_data.sDIBInfo.bmi.biHeight-y-1)*(lpCRRt->m_data.sDIBInfo.bmi.biWidth*(ISEE_IMAGE_BITCOUNT/8))));
- lpIRWEInfo->m_ModuleState = IRWEMS_CA;
- if (lpIRWEInfo->m_PRI < 0xffffffff)
- lpIRWEInfo->m_PRI++; // 优先级数加一
- // 读取文件中的图像数据
- result = lpIRWEInfo->m_IRWPInterFace((LPINFOSTR)lpCRRt);
- lpIRWEInfo->m_ModuleState = IRWEMS_CR;
- if (lpCRRt->m_data.result != ER_SUCCESS)
- {
- // 读取失败
- lpCRRt->m_errorinfo = (IRWE_ERROR)(int)(lpCRRt->m_data.result);
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- else
- {
- ASSERT(lpCRRt->m_data.state == PKST_INFOANDBITS);
- ASSERT(lpCRRt->m_data.modify == 0);
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- }
- case PKST_INFOANDBITS:
- ASSERT(FALSE); // 不能重复的读取图像
- VERIFY(lpCRRt->m_modelID >= 0);
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- default:
- VERIFY(FALSE); // 不允许出现这种情况
- ::AfxMessageBox((LPCTSTR)_T("程序发生异常,您现在最好关闭本程序,以免使系统崩溃。"));
- lpCRRt->m_errorinfo = IRWEERR_ENGINEERR;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- }
- // 保存图像到文件
- void _fnIRWEC_SAVE_TO_FILE(CReturnReceipt *lpCRRt)
- {
- ASSERT(lpCRRt->m_data.state >= PKST_INFOANDBITS);
- ASSERT(lpCRRt->m_data._pbdata);
- ASSERT(lpCRRt->m_data.pLineAddr);
- ASSERT(::lstrlen((LPCTSTR)(lpCRRt->m_data.filename)));
- int result;
- LPIRWMODULEINFO lpIRWEInfo;
- ASSERT(lpCRRt->m_modelID >= 0);
- lpIRWEInfo = m_EngineData.GetAt(lpCRRt->m_modelID);
- ASSERT((lpIRWEInfo)&&(lpIRWEInfo->m_ModuleState==IRWEMS_CR));
- ASSERT(lpIRWEInfo->m_IRWPInterFace);
- // 检验对应的插件是否支持保存功能
- if (!(lpIRWEInfo->m_Function&0x2))
- {
- lpCRRt->m_errorinfo = IRWEERR_NOTSUPPORT;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 保存原始文件名
- ::lstrcpy((LPTSTR)(lpCRRt->m_data.imginfo.filename), (LPCTSTR)(lpCRRt->m_data.filename));
- // 设置新文件名
- ::lstrcpy((LPTSTR)(lpCRRt->m_data.filename), (LPCTSTR)(lpCRRt->m_filename));
- lpIRWEInfo->m_ModuleState = IRWEMS_CA;
- lpCRRt->m_data.comm = CMD_SAVE_TO_FILE;
- lpCRRt->m_data.result = ER_EMPTY;
- ASSERT(lpCRRt->m_data._pbdata != NULL);
- ASSERT(::lstrlen((LPCTSTR)(lpCRRt->m_data.filename)));
- // 写文件
- result = lpIRWEInfo->m_IRWPInterFace((LPINFOSTR)lpCRRt);
- lpIRWEInfo->m_ModuleState = IRWEMS_CR;
- if (lpCRRt->m_data.result != ER_SUCCESS)
- {
- lpCRRt->m_errorinfo = (IRWE_ERROR)(int)(lpCRRt->m_data.result);
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- else
- {
- ASSERT(lpCRRt->m_data.modify == 0);
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- }
- }
- // 获取指定尺寸的图像
- void _fnIRWEC_RESIZE(CReturnReceipt *lpCRRt)
- {
- ASSERT(lpCRRt);
- ASSERT(::lstrlen((LPCTSTR)lpCRRt->m_filename));
- ASSERT(lpCRRt->m_command == IRWEC_RESIZE);
- int result, id, y;
- LPIRWMODULEINFO lpIRWEInfo;
- switch(lpCRRt->m_data.state)
- {
- case PKST_NOTVER:
- {
- // 在当前状态下,回执单中不应含有图像信息及位数据
- ASSERT(lpCRRt->m_data.pLineAddr == NULL);
- ASSERT(lpCRRt->m_data._pbdata == NULL);
- ASSERT(lpCRRt->m_data.pImgInfo == NULL);
- // 简单判断该文件是否能被插件处理
- id = _IRWE_QueryFileProcID((LPCTSTR)(lpCRRt->m_filename));
- if (id >= 0)
- {
- if (_IRWE_SureActive(id) < 0) // 确保插件已被调入
- {
- lpCRRt->m_errorinfo = IRWEERR_ENGINEERR;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 执行判断操作
- _fnIRWEC_Helper_IS_VALID_FILE(lpCRRt, id);
- if (lpCRRt->m_data.result != ER_SUCCESS)
- {
- // 读写模块在执行过程中发生错误
- lpCRRt->m_errorinfo = (IRWE_ERROR)(int)(lpCRRt->m_data.result);
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- else
- {
- if (lpCRRt->m_data.annexdata.iAnnData == 0)
- {
- // 指定文件不能被处理
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- }
- else
- {
- ASSERT(lpCRRt->m_data.state == PKST_PASSVER);
- lpCRRt->m_modelID = id; // 能处理
- }
- }
- }
- else
- {
- // 如果用文件的扩展名无法判断出类型,则返回
- lpCRRt->m_data.annexdata.iAnnData = 0;
- lpCRRt->m_data.state = PKST_NOTVER;
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- }
- }
- case PKST_PASSVER:
- ASSERT(lpCRRt->m_modelID >= 0);
- // 在当前状态下,回执单中不应含有图像信息及位数据
- ASSERT(lpCRRt->m_data.pLineAddr == NULL);
- ASSERT(lpCRRt->m_data._pbdata == NULL);
- ASSERT(lpCRRt->m_data.pImgInfo == NULL);
- // 确保插件已被调入
- if (_IRWE_SureActive(lpCRRt->m_modelID) < 0)
- {
- // 调入插件失败
- lpCRRt->m_errorinfo = IRWEERR_ENGINEERR;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 执行提取操作
- _fnIRWEC_Helper_GET_FILE_INFO(lpCRRt, lpCRRt->m_modelID);
- if (lpCRRt->m_data.result != ER_SUCCESS)
- {
- lpCRRt->m_errorinfo = (IRWE_ERROR)(int)(lpCRRt->m_data.result);
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- ASSERT(lpCRRt->m_data.state == PKST_PASSINFO);
- case PKST_PASSINFO:
- ASSERT(lpCRRt->m_modelID >= 0);
- // 在当前状态下,回执单中不应含有图像信息及位数据
- ASSERT(lpCRRt->m_data.pLineAddr == NULL);
- ASSERT(lpCRRt->m_data._pbdata == NULL);
- ASSERT(lpCRRt->m_data.pImgInfo == NULL);
- lpIRWEInfo = m_EngineData.GetAt(lpCRRt->m_modelID);
- ASSERT((lpIRWEInfo)&&(lpIRWEInfo->m_ModuleState==IRWEMS_CR));
- ASSERT(lpIRWEInfo->m_IRWPInterFace);
- // 检验对应的插件是否支持ReSize功能
- if (!(lpIRWEInfo->m_Function&0x4))
- {
- lpCRRt->m_errorinfo = IRWEERR_NOTSUPPORT;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- lpCRRt->m_data.comm = CMD_RESIZE;
- lpCRRt->m_data.result = ER_EMPTY;
- lpCRRt->m_data.pImgInfo = NULL;
- lpCRRt->m_data.sDIBInfo.bmi.biSize = sizeof(BITMAPINFOHEADER);
- //lpCRRt->m_data.sDIBInfo.bmi.biWidth = lpCRRt->m_data.imginfo.width;
- //lpCRRt->m_data.sDIBInfo.bmi.biHeight = lpCRRt->m_data.imginfo.height;
- // 已经在上一级函数中由用户设定了宽度、高度值
- ASSERT(lpCRRt->m_data.imginfo.width > 0);
- ASSERT(lpCRRt->m_data.imginfo.height > 0);
- lpCRRt->m_data.sDIBInfo.bmi.biPlanes = 1;
- lpCRRt->m_data.sDIBInfo.bmi.biBitCount = ISEE_IMAGE_BITCOUNT;// 恒定为32
- lpCRRt->m_data.sDIBInfo.bmi.biCompression = BI_RGB;
- lpCRRt->m_data.sDIBInfo.bmi.biSizeImage = 0;
- lpCRRt->m_data.sDIBInfo.bmi.biXPelsPerMeter = 0;
- lpCRRt->m_data.sDIBInfo.bmi.biYPelsPerMeter = 0;
- lpCRRt->m_data.sDIBInfo.bmi.biClrUsed = 0;
- lpCRRt->m_data.sDIBInfo.bmi.biClrImportant = 0;
- lpCRRt->m_data.sDIBInfo.rmask = 0xff0000;
- lpCRRt->m_data.sDIBInfo.gmask = 0xff00;
- lpCRRt->m_data.sDIBInfo.bmask = 0xff;
- lpCRRt->m_data.sDIBInfo.alphaMask = 0;
- // 分配用于存放标准图像位数据的内存块
- lpCRRt->m_data._pbdata = (PBYTE)::GlobalAlloc(GMEM_FIXED, lpCRRt->m_data.sDIBInfo.bmi.biWidth*(ISEE_IMAGE_BITCOUNT/8)*lpCRRt->m_data.sDIBInfo.bmi.biHeight);
- if (!lpCRRt->m_data._pbdata)
- {
- lpCRRt->m_errorinfo = IRWEERR_MEMORYERR;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 分配用于存放每一扫描行地址的指针数组并初始化
- lpCRRt->m_data.pLineAddr = (DWORD**)::GlobalAlloc(GPTR, lpCRRt->m_data.sDIBInfo.bmi.biHeight*sizeof(DWORD*));
- if (!lpCRRt->m_data.pLineAddr)
- {
- ::GlobalFree(lpCRRt->m_data._pbdata);
- lpCRRt->m_data._pbdata = NULL;
- lpCRRt->m_errorinfo = IRWEERR_MEMORYERR;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 初始化行首数组
- for (y=0;y<lpCRRt->m_data.sDIBInfo.bmi.biHeight;y++)
- lpCRRt->m_data.pLineAddr[y] = (DWORD*)(lpCRRt->m_data._pbdata+((lpCRRt->m_data.sDIBInfo.bmi.biHeight-y-1)*(lpCRRt->m_data.sDIBInfo.bmi.biWidth*(ISEE_IMAGE_BITCOUNT/8))));
- lpIRWEInfo->m_ModuleState = IRWEMS_CA;
- if (lpIRWEInfo->m_PRI < 0xffffffff)
- lpIRWEInfo->m_PRI++; // 优先级数加一
- // 读取文件中的图像数据
- result = lpIRWEInfo->m_IRWPInterFace((LPINFOSTR)lpCRRt);
- lpIRWEInfo->m_ModuleState = IRWEMS_CR;
- if (lpCRRt->m_data.result != ER_SUCCESS)
- {
- // 读取失败
- lpCRRt->m_errorinfo = (IRWE_ERROR)(int)(lpCRRt->m_data.result);
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- else
- {
- ASSERT(lpCRRt->m_data.state == PKST_INFOANDBITS);
- ASSERT(lpCRRt->m_data.modify == 0);
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- }
- case PKST_INFOANDBITS:
- default:
- VERIFY(FALSE); // 不允许出现这种情况
- ::AfxMessageBox((LPCTSTR)_T("程序发生异常,您现在最好关闭本程序,以免使系统崩溃。"));
- lpCRRt->m_errorinfo = IRWEERR_ENGINEERR;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- }
- // 获取拇指图
- void _fnIRWEC_GET_THUM_IMAGE(CReturnReceipt *lpCRRt, BOOL keep)
- {
- ASSERT(lpCRRt);
- ASSERT(::lstrlen((LPCTSTR)lpCRRt->m_filename));
- ASSERT((lpCRRt->m_command == IRWEC_GET_THUMIMAGE)||(lpCRRt->m_command == IRWEC_GET_THUMIMAGE_A_BIT));
- BOOL hait = TRUE; // 在调用本函数之前,回执单中是否存在位数据,假设有
- int result, id, y;
- LPIRWMODULEINFO lpIRWEInfo;
- CRect rect1, rect2;
- BOOL smark; // 缩小标志
- float fy;
- switch(lpCRRt->m_data.state)
- {
- case PKST_NOTVER:
- {
- // 在当前状态下,回执单中不应含有图像信息及位数据
- ASSERT(lpCRRt->m_data.pLineAddr == NULL);
- ASSERT(lpCRRt->m_data._pbdata == NULL);
- ASSERT(lpCRRt->m_data.pImgInfo == NULL);
- // 简单判断该文件是否能被插件处理
- id = _IRWE_QueryFileProcID((LPCTSTR)(lpCRRt->m_filename));
- if (id >= 0)
- {
- if (_IRWE_SureActive(id) < 0) // 确保插件已被调入
- {
- lpCRRt->m_errorinfo = IRWEERR_ENGINEERR;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 执行判断操作
- _fnIRWEC_Helper_IS_VALID_FILE(lpCRRt, id);
- if (lpCRRt->m_data.result != ER_SUCCESS)
- {
- // 读写模块在执行过程中发生错误
- lpCRRt->m_errorinfo = (IRWE_ERROR)(int)(lpCRRt->m_data.result);
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- else
- {
- if (lpCRRt->m_data.annexdata.iAnnData == 0)
- {
- // 指定文件不能被处理
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- }
- else
- {
- ASSERT(lpCRRt->m_data.state == PKST_PASSVER);
- lpCRRt->m_modelID = id; // 能处理
- }
- }
- }
- else
- {
- // 如果用文件的扩展名无法判断出类型,则返回
- lpCRRt->m_data.annexdata.iAnnData = 0;
- lpCRRt->m_data.state = PKST_NOTVER;
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- }
- }
- case PKST_PASSVER:
- ASSERT(lpCRRt->m_modelID >= 0);
- // 在当前状态下,回执单中不应含有图像信息及位数据
- ASSERT(lpCRRt->m_data.pLineAddr == NULL);
- ASSERT(lpCRRt->m_data._pbdata == NULL);
- ASSERT(lpCRRt->m_data.pImgInfo == NULL);
- // 确保插件已被调入
- if (_IRWE_SureActive(lpCRRt->m_modelID) < 0)
- {
- // 调入插件失败
- lpCRRt->m_errorinfo = IRWEERR_ENGINEERR;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 执行提取操作
- _fnIRWEC_Helper_GET_FILE_INFO(lpCRRt, lpCRRt->m_modelID);
- if (lpCRRt->m_data.result != ER_SUCCESS)
- {
- lpCRRt->m_errorinfo = (IRWE_ERROR)(int)(lpCRRt->m_data.result);
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- ASSERT(lpCRRt->m_data.state == PKST_PASSINFO);
- case PKST_PASSINFO:
- ASSERT(lpCRRt->m_modelID >= 0);
- // 在当前状态下,回执单中不应含有图像信息及位数据
- ASSERT(lpCRRt->m_data.pLineAddr == NULL);
- ASSERT(lpCRRt->m_data._pbdata == NULL);
- ASSERT(lpCRRt->m_data.pImgInfo == NULL);
- lpIRWEInfo = m_EngineData.GetAt(lpCRRt->m_modelID);
- ASSERT((lpIRWEInfo)&&(lpIRWEInfo->m_ModuleState==IRWEMS_CR));
- ASSERT(lpIRWEInfo->m_IRWPInterFace);
- lpCRRt->m_data.comm = CMD_LOAD_FROM_FILE;
- lpCRRt->m_data.result = ER_EMPTY;
- lpCRRt->m_data.pImgInfo = NULL;
- lpCRRt->m_data.sDIBInfo.bmi.biSize = sizeof(BITMAPINFOHEADER);
- ASSERT(lpCRRt->m_data.imginfo.width > 0);
- lpCRRt->m_data.sDIBInfo.bmi.biWidth = lpCRRt->m_data.imginfo.width;
- ASSERT(lpCRRt->m_data.imginfo.height > 0);
- lpCRRt->m_data.sDIBInfo.bmi.biHeight = lpCRRt->m_data.imginfo.height;
- lpCRRt->m_data.sDIBInfo.bmi.biPlanes = 1;
- lpCRRt->m_data.sDIBInfo.bmi.biBitCount = ISEE_IMAGE_BITCOUNT;// 恒定为32
- lpCRRt->m_data.sDIBInfo.bmi.biCompression = BI_RGB;
- lpCRRt->m_data.sDIBInfo.bmi.biSizeImage = 0;
- lpCRRt->m_data.sDIBInfo.bmi.biXPelsPerMeter = 0;
- lpCRRt->m_data.sDIBInfo.bmi.biYPelsPerMeter = 0;
- lpCRRt->m_data.sDIBInfo.bmi.biClrUsed = 0;
- lpCRRt->m_data.sDIBInfo.bmi.biClrImportant = 0;
- lpCRRt->m_data.sDIBInfo.rmask = 0xff0000;
- lpCRRt->m_data.sDIBInfo.gmask = 0xff00;
- lpCRRt->m_data.sDIBInfo.bmask = 0xff;
- lpCRRt->m_data.sDIBInfo.alphaMask = 0;
- // 分配用于存放标准图像位数据的内存块
- lpCRRt->m_data._pbdata = (PBYTE)::GlobalAlloc(GMEM_FIXED, lpCRRt->m_data.sDIBInfo.bmi.biWidth*(ISEE_IMAGE_BITCOUNT/8)*lpCRRt->m_data.sDIBInfo.bmi.biHeight);
- if (!lpCRRt->m_data._pbdata)
- {
- lpCRRt->m_errorinfo = IRWEERR_MEMORYERR;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 分配用于存放每一扫描行地址的指针数组并初始化
- lpCRRt->m_data.pLineAddr = (DWORD**)::GlobalAlloc(GPTR, lpCRRt->m_data.sDIBInfo.bmi.biHeight*sizeof(DWORD*));
- if (!lpCRRt->m_data.pLineAddr)
- {
- ::GlobalFree(lpCRRt->m_data._pbdata);
- lpCRRt->m_data._pbdata = NULL;
- lpCRRt->m_errorinfo = IRWEERR_MEMORYERR;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 初始化行首数组
- for (y=0;y<lpCRRt->m_data.sDIBInfo.bmi.biHeight;y++)
- lpCRRt->m_data.pLineAddr[y] = (DWORD*)(lpCRRt->m_data._pbdata+((lpCRRt->m_data.sDIBInfo.bmi.biHeight-y-1)*(lpCRRt->m_data.sDIBInfo.bmi.biWidth*(ISEE_IMAGE_BITCOUNT/8))));
- lpIRWEInfo->m_ModuleState = IRWEMS_CA;
- if (lpIRWEInfo->m_PRI < 0xffffffff)
- lpIRWEInfo->m_PRI++; // 优先级数加一
- // 读取文件中的图像数据
- result = lpIRWEInfo->m_IRWPInterFace((LPINFOSTR)lpCRRt);
- lpIRWEInfo->m_ModuleState = IRWEMS_CR;
- if (lpCRRt->m_data.result != ER_SUCCESS)
- {
- // 读取失败
- lpCRRt->m_errorinfo = (IRWE_ERROR)(int)(lpCRRt->m_data.result);
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- ASSERT(lpCRRt->m_data.state == PKST_INFOANDBITS);
- ASSERT(lpCRRt->m_data.modify == 0);
- hait = FALSE; // 说明回执单以前没有位数据
- case PKST_INFOANDBITS:
- {
- ASSERT(lpCRRt->m_data._pbdata);
- VERIFY(lpCRRt->m_modelID >= 0);
- // 图像的原始尺寸
- rect1.SetRect(0, 0, lpCRRt->m_data.imginfo.width, lpCRRt->m_data.imginfo.height);
- smark = FALSE;
- if ((rect1.Width() > lpCRRt->m_thumbnails.m_thumbound.Width())||
- (rect1.Height() > lpCRRt->m_thumbnails.m_thumbound.Height()))
- { // 缩小图像
- rect2.SetRect(0, 0, lpCRRt->m_thumbnails.m_thumbound.Width(),
- lpCRRt->m_thumbnails.m_thumbound.Height());
- fy = (float)rect1.Width()/(float)rect1.Height(); // 比例因子
- if (rect1.Width() > rect2.Width())
- rect1.DeflateRect(0, 0, rect1.Width()-rect2.Width(), (int)((rect1.Width()-rect2.Width())/fy));
- if (rect1.Height() > rect2.Height())
- rect1.DeflateRect(0, 0, (int)((rect1.Height()-rect2.Height())*fy), rect1.Height()-rect2.Height());
- smark = TRUE;
- }
- // 删除以前的拇指图
- if (lpCRRt->m_thumbnails.m_thumbits)
- {
- ::GlobalFree(lpCRRt->m_thumbnails.m_thumbits);
- ASSERT(lpCRRt->m_thumbnails.m_thumlines);
- ::GlobalFree(lpCRRt->m_thumbnails.m_thumlines);
- }
- else
- ASSERT(!lpCRRt->m_thumbnails.m_thumlines);
-
- // 校验拇指图结构已被正确初始化
- ASSERT(lpCRRt->m_thumbnails.m_thuminfo.biSize == sizeof(BITMAPINFOHEADER));
- lpCRRt->m_thumbnails.m_thumbits = NULL;
- lpCRRt->m_thumbnails.m_thumlines= NULL;
- lpCRRt->m_thumbnails.m_thumfrom = IRWETHUM_FROM_NULL;
- lpCRRt->m_thumbnails.m_thuminfo.biWidth = 0;
- lpCRRt->m_thumbnails.m_thuminfo.biHeight= 0;
- // 分配用于存放标准图像位数据(拇指图)的内存块
- lpCRRt->m_thumbnails.m_thumbits = (PBYTE)::GlobalAlloc(GPTR, rect1.Width()*(ISEE_IMAGE_BITCOUNT/8)*rect1.Height());
- if (!lpCRRt->m_thumbnails.m_thumbits)
- {
- if (hait == FALSE) // 本次读入的位数据
- lpCRRt->ClearImageBitData(); // 返回到信息状态
- lpCRRt->m_errorinfo = IRWEERR_MEMORYERR;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 分配用于存放每一扫描行地址的指针数组并初始化
- lpCRRt->m_thumbnails.m_thumlines = (DWORD**)::GlobalAlloc(GPTR, rect1.Height()*sizeof(DWORD*));
- if (!lpCRRt->m_thumbnails.m_thumlines)
- {
- ::GlobalFree(lpCRRt->m_thumbnails.m_thumbits);
- lpCRRt->m_thumbnails.m_thumbits = NULL;
- if (hait == FALSE) // 本次读入的位数据
- lpCRRt->ClearImageBitData(); // 返回到信息状态
- lpCRRt->m_errorinfo = IRWEERR_MEMORYERR;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- // 设置拇指图参数
- lpCRRt->m_thumbnails.m_thumfrom = IRWETHUM_FROM_CREATE;
- lpCRRt->m_thumbnails.m_thuminfo.biWidth = rect1.Width();
- lpCRRt->m_thumbnails.m_thuminfo.biHeight= rect1.Height();
- // 初始化行首数组
- int y;
- int width = rect1.Width(), height = rect1.Height();
- PBYTE lpBits = lpCRRt->m_thumbnails.m_thumbits;
- DWORD **lppd = lpCRRt->m_thumbnails.m_thumlines;
- for (y=0;y<height;y++)
- lppd[y] = (DWORD*)((PBYTE)lpBits+((height-y-1)*(width*(ISEE_IMAGE_BITCOUNT/8))));
- if (smark == TRUE)
- {
- // 缩小图像
- _Thum_BlitStretch(lppd, width, height,
- (DWORD**)(lpCRRt->m_data.pLineAddr),
- lpCRRt->m_data.imginfo.width,
- lpCRRt->m_data.imginfo.height);
- }
- else
- {
- // 直接拷贝
- ::CopyMemory((PVOID)lpBits, (PVOID)(lpCRRt->m_data._pbdata),
- width*(ISEE_IMAGE_BITCOUNT/8)*height);
- }
- if (hait == FALSE)
- {
- // 说明回执单中的位数据是本次调用读入的
- if (keep == FALSE)
- {
- // 不保留位数据
- lpCRRt->ClearImageBitData();
- }
- }
- lpCRRt->m_errorinfo = IRWEERR_SUCCESS;
- lpCRRt->m_processing = IRWEPROC_COMPLETE;
- return;
- }
- default:
- VERIFY(FALSE); // 不允许出现这种情况
- ::AfxMessageBox((LPCTSTR)_T("程序发生异常,您现在最好关闭本程序,以免使系统崩溃。"));
- lpCRRt->m_errorinfo = IRWEERR_ENGINEERR;
- lpCRRt->m_modelID = -1;
- lpCRRt->m_processing = IRWEPROC_FAIL;
- return;
- }
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- // 图像读写引擎内部助手函数
- //
- // 确保指定插件已被调入
- int _IRWE_SureActive(int ID)
- {
- // 引擎必需有一个以上的插件支持
- ASSERT(m_EngineData.GetUsedElemSize());
- CString dllpath;
- ASSERT(ID < m_EngineData.GetUsedElemSize());
- LPIRWMODULEINFO lpIRWEInfo = m_EngineData.GetAt(ID);
-
- ASSERT(lpIRWEInfo);
- if (lpIRWEInfo->m_ModuleState != IRWEMS_NULL)
- {
- ASSERT(lpIRWEInfo->m_SN == ID);
- ASSERT(lpIRWEInfo->m_hDll);
- ASSERT(lpIRWEInfo->m_IRWPInterFace);
- return 1; // 已调入的插件
- }
- // 组合插件文件的全路径
- dllpath = lpIRWEInfo->m_Path;
- dllpath += lpIRWEInfo->m_FileName;
- ASSERT(dllpath.GetLength());
- // 此时m_hDll应该是NULL
- ASSERT(!(lpIRWEInfo->m_hDll));
- // 读入插件(实际上就是读入DLL)
- lpIRWEInfo->m_hDll = ::LoadLibrary(dllpath);
- if (lpIRWEInfo->m_hDll == NULL)
- return -1; // 指定的DLL文件不存在或损坏
- // 填写DLL接口函数地址
- lpIRWEInfo->m_IRWPInterFace = (IRWP_INTERFACE)::GetProcAddress(
- lpIRWEInfo->m_hDll,
- MAKEINTRESOURCE(1));
- if (!(lpIRWEInfo->m_IRWPInterFace))
- {
- // 如果找不到接口函数,则返回-2
- ::FreeLibrary(lpIRWEInfo->m_hDll);
- lpIRWEInfo->m_hDll = NULL;
- return -2; // 指定的DLL文件不是合法的ISee图像读写插件
- }
- // 设置模块状态(IRWEMS_CR-创建并空闲)
- lpIRWEInfo->m_ModuleState = IRWEMS_CR;
- // 已调入插件数加一
- m_EngineData.m_Active++;
- ASSERT(m_EngineData.m_Active <= m_EngineData.GetUsedElemSize());
- return 0; // 成功调入
- }
- // 调入所有插件
- int _IRWE_ActiveAll()
- {
- // 引擎必需有一个以上的插件支持
- ASSERT(m_EngineData.GetUsedElemSize());
- LPIRWMODULEINFO lpIRWEInfo;
- CString dllpath;
- int i = 0;
- int iUsed = m_EngineData.GetUsedElemSize();
- // 如果所有插件都已经被调入,则直接返回
- if (m_EngineData.GetActiveElemSize() == iUsed)
- return iUsed;
- // 激活插件
- for (i=0;i<iUsed;i++)
- {
- lpIRWEInfo = m_EngineData.GetAt(i);
- ASSERT(lpIRWEInfo);
- if (lpIRWEInfo->m_ModuleState != IRWEMS_NULL)
- continue; // 跨过已调入的插件
- // 组合插件文件的全路径
- dllpath = lpIRWEInfo->m_Path;
- dllpath += lpIRWEInfo->m_FileName;
- ASSERT(dllpath.GetLength());
- // 此时m_hDll应该是NULL
- ASSERT(!lpIRWEInfo->m_hDll);
- // 填写DLL句柄
- lpIRWEInfo->m_hDll = ::LoadLibrary((LPCTSTR)dllpath);
- if (lpIRWEInfo->m_hDll == NULL)
- return -1; // 指定的DLL文件不存在
- // 填写DLL接口函数地址
- lpIRWEInfo->m_IRWPInterFace = (IRWP_INTERFACE)::GetProcAddress(
- lpIRWEInfo->m_hDll,
- MAKEINTRESOURCE(1));
- if (!lpIRWEInfo->m_IRWPInterFace)
- {
- ::FreeLibrary(lpIRWEInfo->m_hDll);
- lpIRWEInfo->m_hDll = NULL;
- return -2; // 指定的DLL文件不是合法的ISee图像读写插件
- }
- // 设置模块状态(IRWEMS_CR-创建但空闲)
- lpIRWEInfo->m_ModuleState = IRWEMS_CR;
- // 已调入插件数加一
- m_EngineData.m_Active++;
- }
- ASSERT(m_EngineData.m_Active == m_EngineData.m_Count);
- return m_EngineData.m_Active;
- }
- // 确定指定的文件能被哪个插件处理,并返回插件的ID
- int _IRWE_QueryFileProcID(LPCTSTR lpFileName)
- {
- ASSERT((lpFileName)&&(::lstrlen(lpFileName)));
- ASSERT(m_ProcCount > 0);
- int i, j;
- BYTE ext[_MAX_EXT];
- ::_splitpath(lpFileName, NULL, NULL, NULL, (char*)ext);
- ::memmove((void*)ext, (const void*)&(ext[1]), ::lstrlen((LPCTSTR)ext));
- if ((::lstrlen((LPCTSTR)ext) == 0)||(::lstrlen((LPCTSTR)ext) > 4)) // 插件只能处理扩展名小于等于4个字母的图像文件
- return -1;
- // 将文件扩展名转换为大写(因为插件只识别大写的扩展名)
- ::_strupr((char*)ext);
- PBYTE lpTmp = (PBYTE)m_ProcType;
- BYTE ProcBuf[8], tmp;
- for (i=0;i<m_ProcCount;i++)
- {
- j = 0;
- while( ((tmp = *lpTmp++) != ',') && (tmp != 0) )
- ProcBuf[j++] = tmp;
- ProcBuf[j] = 0;
- ASSERT(j < 5);
- if (!::memcmp((const void*)ext, (const void*)ProcBuf, ::lstrlen((LPCTSTR)ProcBuf)+1))
- return m_ProcID[i]; // 返回插件ID号(ID号都大于等于0)
- }
- // 未找到能处理该类型文件的插件,返回-1
- return -1;
- }
- // 建立插件信息数组及初始化插件线程
- int _IRWE_CreatePluginsInfoStock()
- {
- ASSERT(m_EngineData.GetUsedElemSize() == 0); // 本函数只能调用一次
- CFile file;
- CString dllpath;
- BOOL loopcount = FALSE; // 循环标志,当变为TRUE时,表示注册表的信息已被刷新
- PBYTE pbyNames = NULL;
- BYTE byNames = 0;
- LPTSTR pNames = NULL;
- LPTSTR pPath = NULL;
- LPTSTR pFN = NULL;
- LPIRWMODULEINFO lpIRWEInfo = NULL;
- DWORD curPRI = 0;
- int Active[INIT_ACTIVE_PLUGINS_NUM];
- BYTE ProcBuf[8];
- PLUGSIN plugsaddinfo; // 插件文件附加信息结构
- int i, j, k, iCurrent = 0, ActiveNum = 0;
- HKEY hKey = NULL; // 插件信息根句柄
- HKEY hPluginsKey = NULL; // 插件句柄
- DWORD dwPluginsCount = 0; // 插件个数
- begin:
- // 初始化相关变量
- dllpath.Empty();
- ::ZeroMemory((PVOID)ProcBuf, 8);
- ::ZeroMemory((PVOID)Active, sizeof(int)*INIT_ACTIVE_PLUGINS_NUM);
- ::ZeroMemory((PVOID)&plugsaddinfo, sizeof(PLUGSIN));
- m_EngineData.ZeroAllElement();
- ::ZeroMemory((PVOID)m_ProcType, IRWE_PROCTYPE_SIZE);
- for (i=0;i<IRWE_PROCID_SIZE;i++)
- m_ProcID[i] = -1;
- m_ProcCount = 0;
- // 打开插件信息句柄(系统注册表)
- hKey = _IRWERTF_OpenRegTab();
- if (!hKey)
- goto update;
- // 获取插件个数
- dwPluginsCount = _IRWERTF_GetPluginNumber(hKey);
- if ((dwPluginsCount == 0)||((int)dwPluginsCount > m_EngineData.GetMaxElemSize()))
- goto update;
- VERIFY((m_EngineData.AddElement(dwPluginsCount)) == (int)dwPluginsCount);
- // 获取模块名子串
- pNames = _IRWERTF_GetPluginNames(hKey);
- if (!pNames)
- goto update;
- VERIFY(::lstrlen((LPCTSTR)pNames));
- pbyNames = (PBYTE)pNames;
- byNames = 0;
- iCurrent = 0;
- // 分解模块名子串,并填写模块名
- while((byNames = *pbyNames++) != ' ')
- {
- if (byNames == ' ')
- continue;
- i = 0;
- lpIRWEInfo = m_EngineData.GetAt(iCurrent);
- ASSERT(lpIRWEInfo);
- do
- {
- lpIRWEInfo->m_ModuleName[i++] = byNames;
- VERIFY(i <= 16);
- byNames = *pbyNames++;
- }while( (byNames != ' ')&&(byNames != ' ') );
- lpIRWEInfo->m_ModuleName[i] = ' ';
- if (++iCurrent > (int)dwPluginsCount)
- goto update;
- if (byNames == ' ')
- continue;
- ASSERT(byNames == ' ');
- break;
- }
- ::GlobalFree(pNames); pNames = NULL;
- VERIFY(iCurrent == (int)dwPluginsCount);
-
- // 获取插件文件所在目录
- pPath = _IRWERTF_GetPluginsPath(hKey);
- if (!pPath)
- goto update;
- VERIFY(::lstrlen((LPCTSTR)pPath));
- // 路径的最后一个字符必需是""符号
- VERIFY(pPath[::lstrlen((LPCTSTR)pPath)-1] == '\');
- // 获取并填写插件文件名、路径及优先级值
- for (i=0;i<(int)dwPluginsCount;i++)
- {
- lpIRWEInfo = m_EngineData.GetAt(i);
- ASSERT(lpIRWEInfo);
- hPluginsKey = _IRWERTF_OpenPlugins(hKey, (LPCTSTR)(lpIRWEInfo->m_ModuleName));
- if (hPluginsKey == NULL)
- goto update;
- // 填写插件优先级值
- lpIRWEInfo->m_PRI = _IRWERTF_GetPluginPRI(hPluginsKey);
- if (lpIRWEInfo->m_PRI < 10) // 优先级最小为10
- goto update;
- // 获取插件文件名子串
- pFN = _IRWERTF_GetPluginsFileName(hPluginsKey);
- if (!pFN)
- goto update;
- VERIFY(::lstrlen((LPCTSTR)pFN));
- // 填写插件文件所在路径串
- ::CopyMemory((PVOID)(lpIRWEInfo->m_Path), (CONST PVOID)pPath,
- ::lstrlen((LPCTSTR)pPath)+1); // +1 串尾0字符
- // 填写插件文件名子串
- ::CopyMemory((PVOID)(lpIRWEInfo->m_FileName), (CONST PVOID)pFN,
- ::lstrlen((LPCTSTR)pFN)+1); // +1 串尾0字符
- // 确定插件的当前状态(现在是未调入型)
- lpIRWEInfo->m_ModuleState = IRWEMS_NULL;
- // 释放文件名串
- ::GlobalFree(pFN); pFN = NULL;
- _IRWERTF_CloseKey(hPluginsKey); hPluginsKey = NULL;
- }
- // 此时已无用,删之
- ::GlobalFree(pPath); pPath = NULL;
- // 能处理的文件类型串此时必然是空的
- ASSERT(!::lstrlen((LPCTSTR)m_ProcType));
- for (i=0;i<(int)dwPluginsCount;i++)
- {
- // 提取插件文件附加信息
- lpIRWEInfo = m_EngineData.GetAt(i);
- ASSERT(lpIRWEInfo);
- dllpath = lpIRWEInfo->m_Path;
- dllpath += lpIRWEInfo->m_FileName; // 合成文件的全路径
- if (!file.Open(dllpath, CFile::modeRead|CFile::shareDenyNone))
- goto update;
- TRY
- {
- file.Seek(-(LONG)(sizeof(PLUGSIN)), SEEK_END);
- // 读取插件附加信息块(在文件尾部)
- file.Read(&plugsaddinfo, sizeof(PLUGSIN));
- }
- CATCH(CFileException, e)
- {
- goto update;
- }
- END_CATCH
- file.Close();
- dllpath.Empty();
- VERIFY(!::memcmp((LPCTSTR)plugsaddinfo.IRWID, (LPCTSTR)"IRWP", 4));
- lpIRWEInfo->m_ProcTypeNumber = plugsaddinfo.proctypenum;
- ::CopyMemory((PVOID)(lpIRWEInfo->m_ProcTypeName), (CONST PVOID)plugsaddinfo.proctypestr, 32);
- // 能处理的图像类型必需小于9种(最多有8种)
- ASSERT(lpIRWEInfo->m_ProcTypeNumber < 9);
- for (j=0;j<lpIRWEInfo->m_ProcTypeNumber;j++)
- {
- ::ZeroMemory((PVOID)ProcBuf, 8);
- if (m_ProcCount == 0)
- {
- ::CopyMemory((PVOID)ProcBuf, (CONST PVOID)(lpIRWEInfo->m_ProcTypeName), 4);
- }
- else
- {
- ProcBuf[0] = ',';
- ::CopyMemory((PVOID)&(ProcBuf[1]), (CONST PVOID)&(lpIRWEInfo->m_ProcTypeName[j*4]), 4);
- }
-
- ::lstrcat((LPTSTR)m_ProcType, (LPCTSTR)ProcBuf);
- m_ProcID[m_ProcCount++] = lpIRWEInfo->m_SN;
- }
- // 引擎必需至少有一个插件支持
- ASSERT((::lstrlen((LPCTSTR)m_ProcType) > 0)&&(m_ProcCount > 0));
- lpIRWEInfo->m_Attrib = plugsaddinfo.attrib;
- lpIRWEInfo->m_Version = plugsaddinfo.version;
- lpIRWEInfo->m_Function = plugsaddinfo.function;
- ::CopyMemory((PVOID)(lpIRWEInfo->m_Author), (CONST PVOID)plugsaddinfo.author, 16);
- ::CopyMemory((PVOID)(lpIRWEInfo->m_EMail), (CONST PVOID)plugsaddinfo.EMail, 32);
- ::CopyMemory((PVOID)(lpIRWEInfo->m_Notion), (CONST PVOID)plugsaddinfo.messages, 144);
- }
- ::ZeroMemory((PVOID)Active, sizeof(int)*INIT_ACTIVE_PLUGINS_NUM);
- // 确定要激活哪些插件,结果存放在Active数组中
- if (dwPluginsCount <= INIT_ACTIVE_PLUGINS_NUM)
- {
- ActiveNum = dwPluginsCount;
- for (i=0;i<(int)dwPluginsCount;i++)
- m_EngineData.GetAt(i)->m_SelectMark = TRUE;
- }
- else
- {
- ActiveNum = INIT_ACTIVE_PLUGINS_NUM;
- // 挑选出优先级比较高的INIT_ACTIVE_PLUGINS_NUM个模块激活
- for (i=0;i<INIT_ACTIVE_PLUGINS_NUM;i++)
- {
- for (j=0;j<(int)dwPluginsCount;j++)
- {
- if (m_EngineData.GetAt(j)->m_SelectMark == TRUE)
- continue;
- else
- break;
- }
- ASSERT(j < (int)dwPluginsCount);
- Active[i] = j;
- curPRI = m_EngineData.GetAt(j)->m_PRI;
- for (k=0;k<(int)dwPluginsCount;k++)
- {
- if (m_EngineData.GetAt(k)->m_SelectMark == TRUE)
- continue;
- if (curPRI > m_EngineData.GetAt(k)->m_PRI)
- continue;
- curPRI = m_EngineData.GetAt(k)->m_PRI;
- Active[i] = k;
- }
- m_EngineData.GetAt(Active[i])->m_SelectMark = TRUE;
- }
- }
- VERIFY(ActiveNum <= INIT_ACTIVE_PLUGINS_NUM);
- m_EngineData.m_Active = ActiveNum;
- // 激活插件
- for (i=0;i<ActiveNum;i++)
- {
- k = Active[i];
- lpIRWEInfo = m_EngineData.GetAt(k);
- ASSERT(lpIRWEInfo);
- ASSERT(lpIRWEInfo->m_SelectMark == TRUE);
- dllpath = lpIRWEInfo->m_Path;
- dllpath += lpIRWEInfo->m_FileName;
- ASSERT(dllpath.GetLength());
- // 填写DLL句柄
- lpIRWEInfo->m_hDll = ::LoadLibrary((LPCTSTR)dllpath);
- if (lpIRWEInfo->m_hDll == NULL)
- goto update;
- // 填写DLL接口函数地址
- lpIRWEInfo->m_IRWPInterFace = (IRWP_INTERFACE)::GetProcAddress(
- lpIRWEInfo->m_hDll,
- MAKEINTRESOURCE(1));
- if (!lpIRWEInfo->m_IRWPInterFace)
- goto update;
- // 设置模块状态(IRWEMS_CR-创建但空闲)
- lpIRWEInfo->m_ModuleState = IRWEMS_CR;
- }
- _IRWERTF_CloseKey(hKey); hKey = NULL;
- // 必须有一个或一个以上的插件才能使引擎工作
- ASSERT(m_EngineData.GetUsedElemSize());
- return 0;
- update:
- if (hKey != NULL)
- _IRWERTF_CloseKey(hKey);
- if (hPluginsKey != NULL)
- _IRWERTF_CloseKey(hPluginsKey);
- if (pNames != NULL)
- ::GlobalFree(pNames);
- if (pPath != NULL)
- ::GlobalFree(pPath);
- if (pFN != NULL)
- ::GlobalFree(pFN);
- if (file.m_hFile != CFile::hFileNull)
- file.Close();
- m_EngineData.Destroy();
- ActiveNum = 0;
- pbyNames = NULL;
- byNames = 0;
- pNames = NULL;
- pPath = NULL;
- pFN = NULL;
- lpIRWEInfo = NULL;
- curPRI = 0;
- iCurrent = ActiveNum = 0;
- hKey = NULL; // 插件信息根句柄
- hPluginsKey = NULL; // 插件句柄
- dwPluginsCount = NULL; // 插件个数
- if (loopcount == FALSE)
- loopcount = TRUE;
- else
- return -1;
- // 刷新系统注册表
- if (_IRWE_UpdateRegTab() == -1)
- return -1;
- goto begin;
- }
- // 销毁插件信息数组
- int _IRWE_DestroyPluginsInfoStock()
- {
- m_EngineData.Destroy();
- ::ZeroMemory((PVOID)m_ProcType, IRWE_PROCTYPE_SIZE);
- for (int i=0;i<IRWE_PROCID_SIZE;i++)
- m_ProcID[i] = -1;
- m_ProcCount = 0;
- return 0;
- }
- // 初始化插件函数内部助手-刷新系统注册表
- int _IRWE_UpdateRegTab()
- {
- HKEY hKey; // 引擎系统注册表句柄
- HKEY hPlugKey;
- LPTSTR pPath;
- TCHAR m_SouPath[_MAX_PATH]; // 插件所在目录
- TCHAR m_FinPath[_MAX_PATH]; // 插件搜索串(......*.irw)
- // 打开插件信息句柄(系统注册表)
- hKey = _IRWERTF_OpenRegTab();
- if (hKey)
- {
- // 获取插件文件所在目录
- pPath = _IRWERTF_GetPluginsPath(hKey);
- if (!pPath)
- {
- ::GetCurrentDirectory(_MAX_PATH, (LPTSTR)m_SouPath);
- if (m_SouPath[::strlen((const char*)m_SouPath)-1] != '\')
- ::strcat((char*)m_SouPath, (const char*)"\");
- ::strcat((char*)m_SouPath, (const char*)"IRW-PlugIn\");
- }
- else
- {
- ::strcpy((char*)m_SouPath, (const char*)pPath);
- ::GlobalFree(pPath);
- if (m_SouPath[::strlen((const char*)m_SouPath)-1] != '\')
- ::strcat((char*)m_SouPath, (const char*)"\");
- }
- }
- else
- {
- // 创建插件信息句柄
- hKey = _IRWERTF_CreateRegTab();
- if (!hKey)
- return -1;
- // 程序的IRW-PlugIn目录作为插件的缺省目录
- ::GetCurrentDirectory(_MAX_PATH, (LPTSTR)m_SouPath);
- if (m_SouPath[::strlen((const char*)m_SouPath)-1] != '\')
- ::strcat((char*)m_SouPath, (const char*)"\");
- ::strcat((char*)m_SouPath, (const char*)"IRW-PlugIn\");
- }
- ASSERT(hKey);
- ::strcpy((char*)m_FinPath, (const char*)m_SouPath);
- ::strcat((char*)m_FinPath, (const char*)"*.irw");
- int i=0;
- TCHAR m_SubName[256][32];
- DWORD m_SubBufSize = 32;
- FILETIME ft;
- // 找出所有插件句柄
- while(ERROR_SUCCESS == ::RegEnumKeyEx(hKey, i, (LPTSTR)(m_SubName[i]), (LPDWORD)&m_SubBufSize, NULL, NULL, NULL, &ft))
- {
- i++; m_SubBufSize = 32;
- }
- // 删之 :-)
- while(i--)
- ::RegDeleteKey(hKey, (LPTSTR)(m_SubName[i]));
- // 搜索所有可用的插件
- WIN32_FIND_DATA file;
- HANDLE hFind;
- int m_FineCount = 0;
- TCHAR m_PlugNames[256][_MAX_PATH];
- TCHAR m_FileNames[256][_MAX_PATH];
- hFind = ::FindFirstFile((LPCTSTR)m_FinPath, &file);
- if (INVALID_HANDLE_VALUE == hFind)
- {
- _IRWERTF_CloseRegTab(hKey);
- return -1;
- }
- do
- {
- ::strcpy((char*)(m_PlugNames[m_FineCount]), (char*)m_SouPath);
- ::strcat((char*)(m_PlugNames[m_FineCount]), (char*)(file.cFileName));
- ::strcpy((char*)(m_FileNames[m_FineCount]), (char*)(file.cFileName));
- m_FineCount++;
- }while(::FindNextFile(hFind, &file));
- ::FindClose(hFind);
- CFile fp;
- PLUGSIN psi;
- DWORD m_RegNameCount = 0;
- CString m_RegNameSpace;
- m_RegNameSpace.Empty();
- // 安装插件
- for (i=0;i<m_FineCount;i++)
- {
- if (!fp.Open((LPCTSTR)m_PlugNames[i], CFile::modeRead|CFile::shareDenyNone))
- {
- _IRWERTF_CloseRegTab(hKey);
- return -1;
- }
- TRY
- {
- fp.Seek(-(LONG)(sizeof(PLUGSIN)), CFile::end);
- fp.Read((void*)&psi, sizeof(PLUGSIN));
- }
- CATCH(CFileException, e)
- {
- _IRWERTF_CloseRegTab(hKey);
- fp.Close();
- return -1;
- }
- END_CATCH
- fp.Close();
- if (m_RegNameCount)
- m_RegNameSpace += (LPCTSTR)" ";
- m_RegNameSpace += (LPCTSTR)(psi.modulename);
- m_RegNameCount++;
- // 创建插件句柄
- hPlugKey = _IRWERTF_CreatePlugins(hKey, (LPCTSTR)(psi.modulename));
- if (!hPlugKey)
- {
- _IRWERTF_CloseRegTab(hKey);
- return -1;
- }
- _IRWERTF_SetPluginsFileName(hPlugKey, m_FileNames[i]);
- _IRWERTF_SetPluginPRI(hPlugKey, 30); // 30为普通优先级
- _IRWERTF_CloseKey(hPlugKey);
- }
- _IRWERTF_SetPluginNames(hKey, (LPCTSTR)m_RegNameSpace); // 设置插件名字空间:)
- _IRWERTF_SetPluginsPath(hKey, (LPCTSTR)m_SouPath); // 设置插件所在路径
- _IRWERTF_SetPluginNumber(hKey, m_RegNameCount); // 设置插件个数
- _IRWERTF_CloseRegTab(hKey); // 关闭总句柄
- return 0;
- }
- // 向图像读写引擎发送命令
- int _IRWE_PostCommandToImgEngine(CReturnReceipt *lpCommand, BOOL pri)
- {
- ASSERT(lpCommand);
- ::EnterCriticalSection(&m_CLCriticalSection);
- if (pri == TRUE) // 优先处理的命令
- m_CommandList.AddHead((void*)lpCommand);
- else // 正常的命令
- m_CommandList.AddTail((void*)lpCommand);
- lpCommand->m_processing = IRWEPROC_FELL_IN;
- ::LeaveCriticalSection(&m_CLCriticalSection);
- return 0;
- }
- // 从总命令队列中读取命令信息
- CReturnReceipt *_IRWE_ReadCommandFromTotalList()
- {
- CReturnReceipt *result = NULL;
- ::EnterCriticalSection(&m_CLCriticalSection);
- if (m_CommandList.GetCount() > 0)
- {
- result = (CReturnReceipt *)(m_CommandList.RemoveHead());
- ASSERT(result);
- result->m_processing = IRWEPROC_PROCESSING; // 表示命令开始被处理
- }
- ::LeaveCriticalSection(&m_CLCriticalSection);
- return result;
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- // 回执单实现
- // 回执单申请次数的技术器初始化
- UINT CReturnReceipt::m_obj_count = 0;
- // 初始化回执单
- CReturnReceipt::CReturnReceipt()
- {
- // 初始化数据包
- ::ZeroMemory((PVOID)&m_data, sizeof(INFOSTR));
- m_data.comm = CMD_NULL;
- m_data.result = ER_EMPTY;
- ::ZeroMemory((PVOID)m_data.annexdata.scAnnData, DPK_ANNEXINFOSIZE);
- ::ZeroMemory((PVOID)&m_data.imginfo, sizeof(IMAGEINFOSTR));
- ::ZeroMemory((PVOID)m_data.filename, DPK_FILENAMESIZE);
- ::ZeroMemory((PVOID)&m_data.sDIBInfo, sizeof(INTERBITMAPINFO));
- m_data.imginfo.imgtype = IMT_NULL;
- m_data.imginfo.imgformat = IMF_NULL;
- m_data.imginfo.compression = ICS_RGB;
- m_data.pImgInfo = NULL;
- m_data.pLineAddr = NULL;
- m_data._pbdata = NULL;
- m_data.psubimg = NULL;
- m_data.state = PKST_NULL;
- m_data.modify = 0;
- m_data.fpProgress = fpProgress;
- // 初始化回执单
- m_ID = m_obj_count++; // 实例个数++
- m_subproc = 0; // 数据包处理进度标志归0
- m_break = FALSE; // 中断操作标志归0
- m_processing = IRWEPROC_INITING; // 表明回执单处于初始化期
- m_command = IRWEC_NULL;
- m_modelID = -1; // 表明无插件与之对应
- ::ZeroMemory((PVOID)m_filename, _MAX_PATH); // 清空文件路径缓冲区
- }
- // 销毁回执单
- CReturnReceipt::~CReturnReceipt()
- {
- // 因为IRWEC_IN_END命令没有任何资源申请动作,所以略过
- if (IRWEC_IN_END != m_command)
- {
- // 中断当前的处理作业
- BreakProcess();
- ASSERT(IRWEPROC_PROCESSING != m_processing);
-
- if ((IRWEPROC_COMPLETE == m_processing)||
- (IRWEPROC_FAIL == m_processing))
- {
- // 释放所有的资源
- if ((LPTSTR)(m_data.pImgInfo))
- ::GlobalFree(m_data.pImgInfo);
- if ((LPTSTR)(m_data.pLineAddr))
- ::GlobalFree(m_data.pLineAddr);
- if ((LPTSTR)(m_data._pbdata))
- ::GlobalFree(m_data._pbdata);
- if ((LPTSTR)(m_data.psubimg))
- _clear_list();
- }
- else
- VERIFY((IRWEPROC_INITING == m_processing)||(IRWEPROC_FELL_IN == m_processing));
- }
- }
- // 获取回执单最近执行的命令
- IRWECOMMAND CReturnReceipt::GetCommand()
- {
- return m_command;
- }
- // 获取命令的执行情况的
- IRWERRT_RESULT CReturnReceipt::GetResult()
- {
- IRWERRT_RESULT result;
- switch(m_command)
- {
- case IRWEC_NULL: // 空命令
- result = IRWERRT_SUCCESS;
- break;
- case IRWEC_IS_VALID_FILE_COMN: // 判断指定文件是否是指定的图像文件(普通判断)
- case IRWEC_IS_VALID_FILE_NICETY: // 判断指定文件是否是指定的图像文件(精密判断)
- if (m_processing == IRWEPROC_COMPLETE)
- {
- if (m_modelID == -1)
- result = IRWERRT_FAIL;
- else
- result = IRWERRT_SUCCESS;// 指定的文件可以被插件处理
- }
- else if (m_processing == IRWEPROC_FAIL)
- result = IRWERRT_FAIL;
- else
- result = IRWERRT_ING;
- break;
- case IRWEC_GET_FILE_INFO: // 获取图像文件的信息
- if (m_processing == IRWEPROC_COMPLETE)
- {
- if (m_modelID < 0)
- {
- result = IRWERRT_FAIL; // 没有对应的插件支持它
- break;
- }
- if (m_data.state == PKST_PASSINFO)
- result = IRWERRT_SUCCESS;// 成功提取了图像信息
- else
- result = IRWERRT_FAIL;
- }
- else if (m_processing == IRWEPROC_FAIL)
- result = IRWERRT_FAIL;
- else
- result = IRWERRT_ING;
- break;
- case IRWEC_LOAD_FROM_FILE: // 将图像文件读入内存
- if (m_processing == IRWEPROC_COMPLETE)
- {
- if (m_modelID < 0)
- {
- result = IRWERRT_FAIL; // 没有对应的插件支持它,不能读取图像
- break;
- }
- VERIFY(m_data.state == PKST_INFOANDBITS);
- result = IRWERRT_SUCCESS; // 成功提取了图像信息
- }
- else if (m_processing == IRWEPROC_FAIL)
- result = IRWERRT_FAIL;
- else
- result = IRWERRT_ING;
- break;
- case IRWEC_SAVE_TO_FILE: // 保存图像到文件
- if (m_processing == IRWEPROC_COMPLETE)
- {
- VERIFY(m_modelID >= 0);
- VERIFY(m_data.state == PKST_INFOANDBITS);
- result = IRWERRT_SUCCESS; // 成功提取了图像信息
- }
- else if (m_processing == IRWEPROC_FAIL)
- result = IRWERRT_FAIL;
- else
- result = IRWERRT_ING;
- break;
- case IRWEC_RESIZE: // 获取指定尺寸的图像
- if (m_processing == IRWEPROC_COMPLETE)
- {
- if (m_modelID < 0)
- {
- result = IRWERRT_FAIL; // 没有对应的插件支持它,不能读取图像
- break;
- }
- VERIFY(m_data.state == PKST_INFOANDBITS);
- result = IRWERRT_SUCCESS; // 成功提取了图像信息
- }
- else if (m_processing == IRWEPROC_FAIL)
- result = IRWERRT_FAIL;
- else
- result = IRWERRT_ING;
- break;
- case IRWEC_IN_END: // 结束引擎线程
- if (m_processing == IRWEPROC_COMPLETE)
- result = IRWERRT_SUCCESS;
- else
- result = IRWERRT_ING;
- break;
- case IRWEC_GET_THUMIMAGE: // 获取拇指图
- case IRWEC_GET_THUMIMAGE_A_BIT:
- if (m_processing == IRWEPROC_COMPLETE)
- {
- if (m_modelID < 0)
- {
- result = IRWERRT_FAIL; // 没有对应的插件支持它,不能读取图像
- break;
- }
- VERIFY(this->m_thumbnails.m_thumbits);
- VERIFY((m_data.state == PKST_INFOANDBITS)||(m_data.state == PKST_PASSINFO));
- result = IRWERRT_SUCCESS; // 成功提取了拇指图像信息
- }
- else if (m_processing == IRWEPROC_FAIL)
- result = IRWERRT_FAIL;
- else
- result = IRWERRT_ING;
- break;
- case IRWEC_IS_SUPPORT: // 查询指定的功能是否被支持(当前该命令未被支持)
- default:
- VERIFY(FALSE);
- break;
- }
- return result;
- }
- // 获取最近一次操作的返回码(如果最近一次的操作失败,则
- // 返回码就是失败的原因(参见IRWE_ERROR))
- IRWE_ERROR CReturnReceipt::GetLastError()
- {
- return m_errorinfo;
- }
- // 获取回执单中数据包的当前状态(参见PACKSTATE枚举定义)
- PACKSTATE CReturnReceipt::GetDataPackState()
- {
- return m_data.state;
- }
- // 获取图像的宽度(0表示还未获得图像文件的相关信息)
- int CReturnReceipt::GetImageWidth()
- {
- if (((m_data.comm == CMD_LOAD_FROM_FILE)||(m_data.comm == CMD_SAVE_TO_FILE))||
- ((m_data.comm == CMD_GET_FILE_INFO)&&(m_processing == IRWEPROC_COMPLETE)))
- {
- // 表明图像的宽高信息已经提取出来了
- // 此时,数据包必须已经获得过图像的信息,并执行成功
- ASSERT(m_command >= IRWEC_GET_FILE_INFO);
- // 图像的宽度不会是0
- ASSERT(m_data.imginfo.width);
- return (int)(m_data.imginfo.width);
- }
- return 0;
- }
- // 获取图像的高度(0表示还未获得图像文件的相关信息。高度值不会是负值)
- int CReturnReceipt::GetImageHeight()
- {
- if (((m_data.comm == CMD_LOAD_FROM_FILE)||(m_data.comm == CMD_SAVE_TO_FILE))||
- ((m_data.comm == CMD_GET_FILE_INFO)&&(m_processing == IRWEPROC_COMPLETE)))
- {
- // 表明图像的宽高信息已经提取出来了
- // 此时,数据包必须已经获得过图像的信息,并执行成功
- ASSERT(m_command >= IRWEC_GET_FILE_INFO);
- // 图像的高度不会是0,也不会是负数
- ASSERT(m_data.imginfo.height);
- return (int)(m_data.imginfo.height);
- }
- return 0;
- }
- // 获取图像的个数(即底片与子图像的总个数,如动画GIF中图像的个数,如果
- // 是静态图像,该函数将返回1,返回0表示图像文件的信息还未被读入)
- int CReturnReceipt::GetImageNumber()
- {
- switch(m_data.comm)
- {
- case CMD_GET_FILE_INFO:
- if (m_processing != IRWEPROC_COMPLETE)
- break; // 表明正在被处理,还无法提取出数据
- case CMD_LOAD_FROM_FILE:
- case CMD_SAVE_TO_FILE:
- // 此时,数据包必须已经获得过图像的信息,并执行成功
- ASSERT(m_data.imginfo.imgnumbers);
- return (int)(m_data.imginfo.imgnumbers);
- default:
- break;
- }
- return 0;
- }
- // 获取图像的位数据(即RGB数组的首地址,只有在读取了图像
- // 之后,该函数的返回值才有意义)
- LPBYTE CReturnReceipt::GetImageBitData()
- {
- return (LPBYTE)(m_data._pbdata);
- }
- // 获取图像行首地址数组地址
- LPBYTE *CReturnReceipt::GetImageLineAddr()
- {
- return (LPBYTE*)(m_data.pLineAddr);
- }
- // 获取图像的信息(INTERBITMAPINFO结构的地址)
- LPINTERBITMAPINFO CReturnReceipt::GetImageBitmapInfo()
- {
- return (LPINTERBITMAPINFO)&(m_data.sDIBInfo);
- }
- // 获取图像信息
- LPIMAGEINFOSTR CReturnReceipt::GetImageInfo()
- {
- return (LPIMAGEINFOSTR)&(m_data.imginfo);
- }
- // 获取子图像块头元素的地址
- LPSUBIMGBLOCK CReturnReceipt::GetSubImageBlock()
- {
- return (LPSUBIMGBLOCK)(m_data.psubimg);
- }
- // 获取原始图像的信息结构地址
- void *CReturnReceipt::GetOrgImageInfo()
- {
- // 注:该参数可能会是NULL,具体情况需视具体读写模块而定
- return (void*)(m_data.pImgInfo);
- }
- // 获取能处理本文件的图像读写插件ID号
- int CReturnReceipt::GetImagePluginID()
- {
- // 有可能是-1,表示还没有找到对应的插件,0-n为有效ID号
- return m_modelID;
- }
- // 获取回执单的编号(每一个回执单都有一个唯一的编号)
- int CReturnReceipt::GetReturnReceiptID()
- {
- return m_ID;
- }
- // 中断当前正在处理的命令(主要是为了加快程序对用户操作的反应速度)
- void CReturnReceipt::BreakProcess()
- {
- POSITION pos;
- ::EnterCriticalSection(&m_CLCriticalSection);
- ASSERT(IRWEPROC_INITING != m_processing);
- if (m_processing == IRWEPROC_FELL_IN)
- {
- // 如果该回执单在命令队列中,还未被处理,那么将其取出
- pos = m_CommandList.Find((void*)this);
- ASSERT(((void*)pos) != NULL);
- m_CommandList.RemoveAt(pos);
- }
- ::LeaveCriticalSection(&m_CLCriticalSection);
- m_break = TRUE; // 设置中断操作标志
- // 如果回执单正在被执行,那么等待它执行完毕
- while(m_processing == IRWEPROC_PROCESSING);
- m_break = FALSE; // 恢复中断操作标志
- return;
- }
- // 获取相关联文件的路径缓冲区首地址
- LPCTSTR CReturnReceipt::GetFileName()
- {
- return (LPCTSTR)m_filename;
- }
- // 删除包中的图像位数据,使之返回到INFOANDBIT之前的状态。
- // 如果当前的状态已经在INFOANDBIT状态之前了,则该函数直接
- // 返回。
- void CReturnReceipt::ClearImageBitData()
- {
- switch (m_data.state)
- {
- case PKST_NULL: // 数据包为空
- case PKST_NOTVER: // 指定文件还未通过验证的阶段(此时只有文件名变量被设置)
- case PKST_PASSVER: // 指定的文件已通过验证,是有效格式的文件
- // 直接返回
- break;
- case PKST_PASSINFO: // 已通过验证,且数据包中有该文件的相关信息
- case PKST_INFOANDBITS: // 已通过验证,且有该文件的相关信息,并含有图像的位数据
- {
- // 等待处理作业完成
- while (m_processing == IRWEPROC_PROCESSING);
- // 清理已分配的内存资源
- if (m_data.pImgInfo)
- {
- ::GlobalFree(m_data.pImgInfo);
- m_data.pImgInfo = NULL;
- }
- if (m_data.pLineAddr)
- {
- ::GlobalFree(m_data.pLineAddr);
- m_data.pLineAddr = NULL;
- }
- if (m_data._pbdata)
- {
- ::GlobalFree(m_data._pbdata);
- m_data._pbdata = NULL;
- }
- if (m_data.psubimg)
- {
- _clear_list();
- m_data.psubimg = NULL;
- }
- // 将回执单状态设定为PKST_PASSINFO(只包含图像信息,不包括位数据)
- ::ZeroMemory((PVOID)&(m_data.sDIBInfo), sizeof(INTERBITMAPINFO));
- m_data.state = PKST_PASSINFO;
- m_data.modify = 0;
- m_data.comm = CMD_GET_FILE_INFO;
- m_data.result = ER_SUCCESS;
- m_processing = IRWEPROC_COMPLETE;
- m_errorinfo = IRWEERR_SUCCESS;
- m_command = IRWEC_GET_FILE_INFO;
- m_subproc = 100;
- }
- break;
- case PKST_MODIFY:// 数据包中的图像已经被修改过
- // 此时数据包的imginfo数据与sDIBInfo数据可能会不同,
- // 所以不能简单的使用以上的办法。
- // 此处强制调用者不使用这种方法。
- VERIFY(FALSE);
- break;
- default:
- VERIFY(FALSE); // 不可能存在未定义的命令,除非系统崩溃
- break;
- }
- }
- // 获取当前命令的执行进度,有五种可能的进度值,参见IRWE_PROCESSING定义
- IRWE_PROCESSING CReturnReceipt::GetProcessing()
- {
- return m_processing;
- }
- // 读写模块进度控制。即读写模块回调函数。
- // 入口参数1是总的进度数,参数2是当前的进度数。
- // 返回参数:如果返回0,则图像读写模块继续操作,
- // 如果返回非0值,则读写模块终止操作,返回。
- int WINAPI CReturnReceipt::fpProgress(int tol, int cur)
- {
- ASSERT(m_pCurrentReturnReceipt);
- m_pCurrentReturnReceipt->m_subproc = cur;
- TRACE("正在处理数据包:%d,总进度:%d,当前进度:%dn", m_pCurrentReturnReceipt, tol, cur);
- if (m_pCurrentReturnReceipt->m_break == TRUE)
- return 1; // 中断操作
- else
- return 0; // 继续操作
- }
- // 清除子图像链表(如果图像文件中包含多幅图像,那么该链表中可能有数据)
- void CReturnReceipt::_clear_list()
- {
- if (m_data.psubimg == NULL)
- return;
- if (m_data.imginfo.imgnumbers >= 1)
- m_data.imginfo.imgnumbers = 1; // 如果存在子图像,那么只保留背景图
- else
- m_data.imginfo.imgnumbers = 0; // 如果没有图像,设0
- LPSUBIMGBLOCK lpSubImg;
- while((lpSubImg=m_data.psubimg) != NULL)
- {
- m_data.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;
- }
- // 判断回执单中是否存在拇指图(返回TRUE表示有,FALSE则没有)
- // 注:返回TRUE并不意味着拇指图已经形成,本函数只能说明用于
- // 存放拇指图的缓冲区已经被分配,请使用GetResult()函数判断
- // 命令是否真正完成
- BOOL CReturnReceipt::IsThumImage()
- {
- return (m_thumbnails.m_thumbits&&m_thumbnails.m_thumlines) ? TRUE:FALSE;
- }
- // 获取拇指图数据的来源(请参见IRWETHUM_FROM定义)
- IRWETHUM_FROM CReturnReceipt::GetThumImageFrom()
- {
- return m_thumbnails.m_thumfrom;
- }
- // 获取拇指图像的尺寸数据(宽度、高度,CRect的左上角为0,0)
- CRect& CReturnReceipt::GetThumImageRect()
- {
- static CRect rect;
- rect.SetRect(0, 0, m_thumbnails.m_thuminfo.biWidth,
- m_thumbnails.m_thuminfo.biHeight);
- return rect;
- }
- // 获取拇指图的边界正方形的宽度、高度
- CRect& CReturnReceipt::GetThumBoundRect()
- {
- return m_thumbnails.m_thumbound;
- }
- // 获取拇指图的详细信息(包括拇指图的宽、高,位深等)
- BITMAPINFOHEADER *CReturnReceipt::GetThumImageInfo()
- {
- return &(m_thumbnails.m_thuminfo);
- }
- // 获取拇指图的位数据
- PBYTE CReturnReceipt::GetThumImageBit()
- {
- return (PBYTE)(m_thumbnails.m_thumbits);
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- // 拇指图类实现
- //
- CThumImage::CThumImage()
- {
- m_thumfrom = IRWETHUM_FROM_NULL;
- ::ZeroMemory((PVOID)&m_thuminfo, sizeof(BITMAPINFOHEADER));
- m_thuminfo.biSize = sizeof(BITMAPINFOHEADER);
- m_thuminfo.biBitCount = ISEE_IMAGE_BITCOUNT; // 32位
- m_thuminfo.biCompression = BI_RGB;
- m_thuminfo.biPlanes = 1;
- m_thuminfo.biWidth = 0;
- m_thuminfo.biHeight = 0;
- m_thumbits = NULL;
- m_thumlines= NULL;
- m_thumbound.SetRectEmpty();
- }
- CThumImage::~CThumImage()
- {
- if (m_thumbits)
- ::GlobalFree(m_thumbits);
- if (m_thumlines)
- ::GlobalFree(m_thumlines);
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- // 拇指图缩放代码
- // 作者:Analyst
- // 初始化Alpha表
- void _Thum_InitAlphaTable()
- {
- QWORD temp;
- for(int i=0;i<_IRWE_THUM_APLHATAB_SIZE;i++)
- {
- temp = (QWORD)i;
- s_AlphaTable[i] = temp<<48 | temp<<32 | temp<<16 | temp;
- }
- }
- // 缩放接口函数
- void _Thum_BlitStretch(DWORD **lpDesLines, int deswidth, int desheight,
- DWORD **lpSrcLines, int srcwidth, int srcheight)
- {
- DWORD dU = (srcwidth << 16) / deswidth;
- DWORD dV = (srcheight << 16) / desheight;
- DWORD V1 = 0;
- for(int i = 0; i < desheight-1; i++)
- {
- _Thum_DrawScanLine((DWORD*)(lpDesLines[i]), (DWORD *)(lpSrcLines[(V1>>16)]), deswidth, dU);
- _Thum_DrawScanLineAlpha((DWORD*)(lpDesLines[i]), (DWORD *)(lpSrcLines[(V1>>16)+1]), deswidth, dU, (V1>>9)&0x7f);
- V1 += dV;
- }
- }
-
- // 行缩放函数
- void _Thum_DrawScanLine(DWORD* DestAddr, DWORD* SrcAddr, int Width, DWORD dU)
- {
- __asm{
- mov esi, SrcAddr;
- mov edi, DestAddr;
- mov ecx, Width;
- xor edx, edx; //edx = U1
- mov ebx, dU;
- pxor mm7, mm7;
- LoopX:
- mov eax, edx;
- and eax, 0xffff;
- shr eax, 9;
- movq mm6, [s_AlphaTable + eax * 8]; //mm6 = a2
- neg eax;
- add eax, 128;
- movq mm5, [s_AlphaTable + eax * 8]; //mm5 = a1
- mov eax, edx;
- shr eax, 16;
- movq mm0, [esi + eax * 4];
- movq mm1, mm0;
- PUNPCKLBW mm0, mm7; //mm0 = 0a10r10g10b1
- PUNPCKHBW mm1, mm7; //mm1 = 0a20r20g20b2
- pmullw mm0, mm5;
- pmullw mm1, mm6;
- paddw mm0, mm1;
- psrlw mm0, 7;
- packuswb mm0, mm0;
- movd eax, mm0;
- add edx, ebx;
- stosd;
- dec ecx;
- jnz LoopX;
- emms;
- }
- }
- void _Thum_DrawScanLineAlpha(DWORD* DestAddr, DWORD* SrcAddr, int Width, DWORD dU, DWORD Alpha)
- {
- if(!Alpha)
- return;
- __asm{
- mov esi, SrcAddr;
- mov edi, DestAddr;
- mov ecx, Width;
- xor edx, edx; //edx = U1
- mov ebx, dU;
- mov eax, Alpha;
- pxor mm7, mm7;
- movq mm4, [s_AlphaTable + eax * 8]; //mm4 = alpha
- LoopX:
- mov eax, edx;
- and eax, 0xffff;
- shr eax, 9;
- movq mm6, [s_AlphaTable + eax * 8]; //mm6 = a2
- neg eax;
- add eax, 128;
- movq mm5, [s_AlphaTable + eax * 8]; //mm5 = a1
- mov eax, edx;
- shr eax, 16;
- movq mm0, [esi + eax * 4];
- movq mm1, mm0;
- PUNPCKLBW mm0, mm7; //mm0 = 0a10r10g10b1
- movd mm2, [edi];
- PUNPCKHBW mm1, mm7; //mm1 = 0a20r20g20b2
- pmullw mm0, mm5;
- punpcklbw mm2, mm7;
- pmullw mm1, mm6;
- paddw mm0, mm1;
- psrlw mm0, 7;
- psubw mm0, mm2;
- pmullw mm0, mm4;
- psraw mm0, 7;
- paddw mm0, mm2;
- packuswb mm0, mm0;
- movd eax, mm0;
- add edx, ebx;
- stosd;
- dec ecx;
- jnz LoopX;
- emms;
- }
- }