TgaModule.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:52k
- // TgaModule.cpp : Defines the initialization routines for the DLL.
- //
- #include "stdafx.h"
- #include "TgaModule.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- #define _CHECKOVER
- //#define DIBSCANLINE_WIDTHBYTES(bits) ((((bits)+31)>>5)<<2)
- #define DIBSCANLINE_WIDTHBYTES(bits) (((bits)+7)>>3)
- #define MODULE_BUILDID 1
- #define RWPROGRESSSIZE 100
- #define BGR(b,g,r) ((COLORREF)(((BYTE)(b)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(r))<<16)))
- #define _OVERCHECK
- static char ModuleProcessImgType[]="TGA"; // 本模块能处理的图像类型
- static char WriterList[]="晓月儿"; // 本模块的作者列表
- static char WriterMess[]="我爱你,我一直在努力!"; // 作者留言
- BOOL IsFileExist(char *lpFileName);
- //
- // Note!
- //
- // If this DLL is dynamically linked against the MFC
- // DLLs, any functions exported from this DLL which
- // call into MFC must have the AFX_MANAGE_STATE macro
- // added at the very beginning of the function.
- //
- // For example:
- //
- // extern "C" BOOL PASCAL EXPORT ExportedFunction()
- // {
- // AFX_MANAGE_STATE(AfxGetStaticModuleState());
- // // normal function body here
- // }
- //
- // It is very important that this macro appear in each
- // function, prior to any calls into MFC. This means that
- // it must appear as the first statement within the
- // function, even before any object variable declarations
- // as their constructors may generate calls into the MFC
- // DLL.
- //
- // Please see MFC Technical Notes 33 and 58 for additional
- // details.
- //
- // 在图像读写模块中,如果想分配内存,请使用API函数GlobalAlloc()
- // ,如果想释放内存请使用GlobalFree()函数。不要使用诸如:new
- // 、malloc()等函数。这是为了使各模块之间可以异地释放内存。
- //
- //
- /////////////////////////////////////////////////////////////////////////////
- // CTgaModuleApp
- BEGIN_MESSAGE_MAP(CTgaModuleApp, CWinApp)
- //{{AFX_MSG_MAP(CTgaModuleApp)
- // NOTE - the ClassWizard will add and remove mapping macros here.
- // DO NOT EDIT what you see in these blocks of generated code!
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CTgaModuleApp construction
- CTgaModuleApp::CTgaModuleApp()
- {
- // TODO: add construction code here,
- // Place all significant initialization in InitInstance
- }
- /////////////////////////////////////////////////////////////////////////////
- // The one and only CTgaModuleApp object
- CTgaModuleApp theApp;
- // 接口函数声明 — 第一层,唯一与外界联系的接口
- int WINAPI AccessTGAModule(INFOSTR *pInfo)
- {
- // 这个函数可以不作修改的使用,除非你的返回值多于两种。
- switch(pInfo->comm)
- {
- case CMD_GETPROCTYPE: // 获取本模块能处理的图像类型
- _fnCMD_GETPROCTYPE(pInfo);
- break;
- case CMD_GETWRITERS: // 获取本模块的作者列表,多人时用逗号分隔
- _fnCMD_GETWRITERS(pInfo);
- break;
- case CMD_GETWRITERMESS: // 获取作者们的留言
- _fnCMD_GETWRITERMESS(pInfo);
- break;
- case CMD_GETBUILDID: // 获取图像模块内部版本号
- _fnCMD_GETBUILDID(pInfo);
- break;
- case CMD_IS_VALID_FILE: // 判断指定文件是否是有效的WMF文件
- _fnCMD_IS_VALID_FILE(pInfo);
- break;
- case CMD_GET_FILE_INFO: // 获取指定文件的信息
- _fnCMD_GET_FILE_INFO(pInfo);
- break;
- case CMD_LOAD_FROM_FILE: // 从指定图像文件中读取数据
- _fnCMD_LOAD_FROM_FILE(pInfo);
- break;
- case CMD_SAVE_TO_FILE: // 将数据保存到指定文件中
- _fnCMD_SAVE_TO_FILE(pInfo);
- break;
- case CMD_IS_SUPPORT: // 查询某个命令是否被支持
- _fnCMD_IS_SUPPORT(pInfo);
- break;
- case CMD_RESIZE: // 从新获取指定尺寸的图像位数据(只适用于矢量图像)
- _fnCMD_RESIZE(pInfo);
- break;
- default:
- pInfo->result = ER_ILLCOMM; // 非法命令
- ASSERT(FALSE); // 调用者的程序设计有问题 :-)
- break;
- }
- // 执行命令成功返回1, 失败返回0
- return (pInfo->result==ER_SUCCESS)? 1:0;
- }
- // 命令解释函数 — 第二层解释函数
- //********************************************************************//
- // 操作命令解释函数---解释:CMD_IS_SUPPORT命令
- // 查询某个命令是否被支持
- void _fnCMD_IS_SUPPORT(INFOSTR *pInfo)
- {
- // 这个函数是为客户程序查询时使用,如果你实现了对某个命令的
- // 解释,可修改相应的case中的设置,使其返回ER_SUCCESS,这就
- // 表示你的模块已经支持该命令了。同时,现在的这个文件中已包
- // 含了对前四个命令的解释,你只需向还未支持的命令函数中添加
- // 代码即可。
- ASSERT(pInfo->result == ER_EMPTY);
- switch(pInfo->annexdata.cmAnnData)
- {
- case CMD_GETPROCTYPE: // 获取本模块能处理的图像类型
- pInfo->result = ER_SUCCESS;
- break;
- case CMD_GETWRITERS: // 获取本模块的作者列表,多人时用逗号分隔
- pInfo->result = ER_SUCCESS;
- break;
- case CMD_GETWRITERMESS: // 获取作者们的留言
- pInfo->result = ER_SUCCESS;
- break;
- case CMD_GETBUILDID: // 获取图像模块内部版本号
- pInfo->result = ER_SUCCESS;
- break;
- case CMD_IS_VALID_FILE: // 判断指定文件是否是有效的WMF文件
- pInfo->result = ER_SUCCESS;
- break;
- case CMD_GET_FILE_INFO: // 获取指定文件的信息
- pInfo->result = ER_SUCCESS;
- break;
- case CMD_LOAD_FROM_FILE: // 从指定图像文件中读取数据
- pInfo->result = ER_SUCCESS;
- break;
- case CMD_SAVE_TO_FILE: // 将数据保存到指定文件中
- pInfo->result = ER_NOTSUPPORT;
- break;
- case CMD_IS_SUPPORT: // 查询某个命令是否被支持
- pInfo->result = ER_SUCCESS;
- break;
- case CMD_RESIZE: // 获取指定尺寸的图像(只适用于矢量图像)
- pInfo->result = ER_NOTSUPPORT;
- break;
- default:
- pInfo->result = ER_NOTSUPPORT;
- break;
- }
- }
- // 操作命令解释函数---解释:CMD_GETPROCTYPE命令
- // 获取本模块能处理的图像类型,如:BMP,PCX等等
- void _fnCMD_GETPROCTYPE(INFOSTR *pInfo)
- {
- // 这是预定义的函数代码,你可以不必修改的使用。
- // 根据接口定义,此时附加数据应被清空为0,所以下此断言
- ASSERT(pInfo->annexdata.scAnnData[0] == 0);
- ASSERT(pInfo->result == ER_EMPTY);
- // 复制能处理的类型字符串
- ::CopyMemory((PVOID)pInfo->annexdata.scAnnData, (PVOID)ModuleProcessImgType,
- sizeof(ModuleProcessImgType));
- pInfo->result = ER_SUCCESS;
- }
- // 操作命令解释函数---解释:CMD_GETWRITER命令
- // 获取本模块的作者列表,多人时用逗号分隔
- void _fnCMD_GETWRITERS(INFOSTR *pInfo)
- {
- // 这是预定义的函数代码,你可以不必修改的使用。
- // 根据接口定义,此时附加数据应被清空为0,所以下此断言
- ASSERT(pInfo->annexdata.scAnnData[0] == 0);
- ASSERT(pInfo->result == ER_EMPTY);
- // 复制开发者名单串
- ::CopyMemory((PVOID)pInfo->annexdata.scAnnData, (PVOID)WriterList,
- sizeof(WriterList));
- pInfo->result = ER_SUCCESS;
- }
- // 操作命令解释函数---解释:CMD_GETWRITERMESS命令
- // 获取作者们的留言
- void _fnCMD_GETWRITERMESS(INFOSTR *pInfo)
- {
- // 这是预定义的函数代码,你可以不必修改的使用。
- // 根据接口定义,此时附加数据应被清空为0,所以下此断言
- ASSERT(pInfo->annexdata.scAnnData[0] == 0);
- ASSERT(pInfo->result == ER_EMPTY);
- // 复制开发者们的留言字符串
- ::CopyMemory((PVOID)pInfo->annexdata.scAnnData, (PVOID)WriterMess,
- sizeof(WriterMess));
- pInfo->result = ER_SUCCESS;
- }
- // 操作命令解释函数---解释:CMD_GETBUILDID命令
- // 获取图像模块内部版本号
- void _fnCMD_GETBUILDID(INFOSTR *pInfo)
- {
- // 这是预定义的函数代码,你可以不必修改的使用。
- // 根据接口定义,此时annexdata.dwAnnData应被设为0,所以下此断言
- ASSERT(pInfo->annexdata.dwAnnData == 0);
- ASSERT(pInfo->result == ER_EMPTY);
- // 填写内部版本号码
- pInfo->annexdata.dwAnnData = MODULE_BUILDID;
- pInfo->result = ER_SUCCESS;
- }
- // 操作命令解释函数---解释:CMD_SAVE_TO_FILE命令
- // 将数据保存到指定文件中
- void _fnCMD_SAVE_TO_FILE(INFOSTR *pInfo)
- {
- // 这个命令不一定要解释,你可以参考本图像格式的具体境况来决定
- // 是否解释该命令。
- // 如果你想解释该命令,请在下面加入代码,并修改pInfo->result的返回值:
- // ----------------------------------------------------------------->
- pInfo->result = ER_NOTSUPPORT;
- }
- // 操作命令解释函数---解释:CMD_RESIZE命令
- // 重新获取指定尺寸的图像位数据(只适用于矢量图像)
- void _fnCMD_RESIZE(INFOSTR *pInfo)
- {
- // 这个命令一般的图像读写模块不需要支持,它只适用于矢量图像,
- // 比如WMF、EMF之类。
- // 如果你想解释该命令,请在下面加入代码,并修改pInfo->result的返回值:
- // ----------------------------------------------------------------->
- pInfo->result = ER_NOTSUPPORT;
- }
- // 操作命令解释函数---解释:CMD_IS_VALID_FILE命令
- // 判断指定文件是否是有效的TGA文件
- void _fnCMD_IS_VALID_FILE(INFOSTR *pInfo)
- {
- TGAHEADER tgaHeader;
- DWORD dwSize;
- UINT uRet, uRet2;
- CFile file;
- // 检验入口参数是否符合接口定义
- ASSERT(pInfo->result == ER_EMPTY);
- ASSERT(pInfo->annexdata.iAnnData == 0);
- ASSERT(::strlen(pInfo->filename));
- ASSERT(pInfo->state == PKST_NOTVER);
- ASSERT(pInfo);
- pInfo->result=ER_SUCCESS;
-
- // 先判断指定的文件是否存在
- if (!IsFileExist(pInfo->filename))
- pInfo->result = ER_COMMINFOERR;
- else
- {
- // 打开指定文件
- if (!file.Open(pInfo->filename, CFile::modeRead))
- {
- pInfo->result = ER_FILERWERR; // 打开文件时出错
- return;
- }
- // 获取TGA文件的长度(以字节为单位)
- dwSize = file.GetLength();
- // 用长度判断
- if (dwSize < sizeof(TGAHEADER))
- {
- // 这不是一个TGA文件,TGA文件的长度起码大于文件头
- // 加信息头结构的长度
- pInfo->result=ER_BADIMAGE;
- file.Close();
- return;
- }
- // 读取TGA的文件头结构,并检查它的有效性
- file.SeekToBegin();
- uRet = file.Read(&tgaHeader, sizeof(TGAHEADER));
- uRet2=file.Seek(tgaHeader.bID_Length,CFile::current);
-
- if ((uRet != sizeof(TGAHEADER))||(uRet2!=sizeof(TGAHEADER)+tgaHeader.bID_Length))
- {
- pInfo->result = ER_BADIMAGE; // 读文件时出错
- file.Close();
- return;
- }
- // 判断文件头的图象类型标志
- switch(tgaHeader.bImageType)
- {
- case TGA_NULL:
- case TGA_RLEPAL:
- case TGA_RLECOLOR:
- case TGA_RLEGRAY:
- break;
- case TGA_UNCPSPAL:
- case TGA_UNCPSCOLOR:
- case TGA_UNCPSGRAY:
- if(file.GetLength()<sizeof(TGAHEADER)+tgaHeader.bID_Length+((tgaHeader.bBits+7)>>3)*tgaHeader.wDepth*tgaHeader.wWidth+tgaHeader.wPalLength*((tgaHeader.bPalBits+7)>>3))
- {
- TRACE("File length:%d",file.GetLength());
- TRACE("nDesired Length:%d",sizeof(TGAHEADER)+tgaHeader.bID_Length+((tgaHeader.bBits+7)>>3)*tgaHeader.wDepth*tgaHeader.wWidth+tgaHeader.wPalLength*((tgaHeader.bPalBits+7)>>3));
- file.Close();
- pInfo->result=ER_BADIMAGE;
- return;
- }
- break;
- default: //未知文件类型
- file.Close();
- pInfo->result=ER_BADIMAGE;
- return;
- }
- //因为TGA可能采用压缩算法
- //或者有附加信息
- //所以判断文件总长和应有长度基本上无意义
- // 到此,大致可以表明该文件是一个有效的TGA文件,iAnnData变量设为1
- pInfo->annexdata.iAnnData = 1;
- pInfo->state = PKST_PASSVER; // 表示通过校验
- file.Close();
- }//End else
- }
- // 操作命令解释函数---解释:CMD_GET_FILE_INFO命令
- // 获取指定文件的信息
- void _fnCMD_GET_FILE_INFO(INFOSTR *pInfo)
- {
- CFile file;
- CFileStatus status;
- UINT uRet;
- TGAHEADER tgaHeader;
- // 检验入口参数是否符合接口定义
- ASSERT(pInfo->result == ER_EMPTY);
- ASSERT(::strlen(pInfo->filename));
- // 此时,该文件必需是一个已存在的、并且是有效的BMP文件
- ASSERT(pInfo->state == PKST_PASSVER);
- // 客户模块必需要先将imginfo清空为0
- ASSERT(pInfo->imginfo.imgtype == IMT_NULL);
- // 打开指定文件
- if (!file.Open(pInfo->filename, CFile::modeRead))
- {
- pInfo->result = ER_FILERWERR;
- return;
- }
- // 读取TGA的文件头结构
- file.SeekToBegin();
- uRet = file.Read((LPSTR)&tgaHeader, sizeof(TGAHEADER));
- if (uRet != sizeof(TGAHEADER))
- {
- file.Close();
- pInfo->result = ER_FILERWERR;
- return;
- }
- LPIMAGEINFOSTR lpImgInfoStr = &pInfo->imginfo;
- // 获取文件的长度、图像的宽度、高度等信息
- lpImgInfoStr->imgtype = IMT_RESSTATIC;
- lpImgInfoStr->imgformat = IMF_TGA;
- lpImgInfoStr->filesize = file.GetLength();
- lpImgInfoStr->width = tgaHeader.wWidth;
- // 图像的高度值有时可能是负值,所以使用了abs()函数
- lpImgInfoStr->height = (DWORD)::abs(tgaHeader.wDepth);
- lpImgInfoStr->bitcount = (DWORD)tgaHeader.bBits;
-
- switch(tgaHeader.bImageType)
- {
- case TGA_NULL:
- file.Close();
- pInfo->result=ER_BADIMAGE;
- return;
- case TGA_UNCPSPAL:
- case TGA_UNCPSCOLOR:
- case TGA_UNCPSGRAY:
- lpImgInfoStr->compression=ICS_RGB;
- break;
- case TGA_RLEPAL:
- case TGA_RLECOLOR:
- case TGA_RLEGRAY:
- switch(tgaHeader.bBits)
- {
- case 8:
- lpImgInfoStr->compression=ICS_RLE8;
- break;
- case 15:
- case 16:
- lpImgInfoStr->compression=ICS_RLE16;
- break;
- case 24:
- lpImgInfoStr->compression=ICS_RLE24;
- break;
- case 32:
- lpImgInfoStr->compression=ICS_RLE32;
- break;
- default:
- file.Close();
- pInfo->result=ER_BADIMAGE;
- return;
- }
- break;
- default:
- file.Close();
- pInfo->result=ER_BADIMAGE;
- return;
- }
-
- // 每一图像行所占的字节数(DWORD对齐,并且只对非压缩位图有效)
- lpImgInfoStr->linesize = DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*tgaHeader.bBits);
-
- lpImgInfoStr->imgnumbers = 1; // TGA文件中只有一个图像
- //应当还有原始图象缩图(Postage Stamp)
- //但晓月儿还未遇见实例
- lpImgInfoStr->imgchang = 0; // 表示可以被编辑
- // 获取文件最后的修改日期(月在高字节,日在低字节)
- file.GetStatus(status);
- lpImgInfoStr->year = (WORD)status.m_mtime.GetYear();
- lpImgInfoStr->monday = (WORD)status.m_mtime.GetMonth();
- lpImgInfoStr->monday <<= 8;
- lpImgInfoStr->monday |= (WORD)status.m_mtime.GetDay();
- // 获取文件最后的修改时间(字序:最高—0, 2—时,1—分,0—秒)
- lpImgInfoStr->time = status.m_mtime.GetHour();
- lpImgInfoStr->time <<= 8;
- lpImgInfoStr->time |= status.m_mtime.GetMinute();
- lpImgInfoStr->time <<= 8;
- lpImgInfoStr->time |= status.m_mtime.GetSecond();
- lpImgInfoStr->time &= 0xffffff;
-
- file.Close();
- // 设置出口数据
- pInfo->state = PKST_PASSINFO;
- pInfo->result = ER_SUCCESS;
- }
- BOOL IsFileExist(char *lpFileName)
- {
- CFile file;
- BOOL bExist = FALSE; // 文件存在是TRUE,不存在是FALSE
- CFileException e;
- // 确定指定的文件是否存在
- if (file.Open(lpFileName, CFile::modeReadWrite|CFile::shareDenyNone, &e))
- {
- bExist = TRUE;
- file.Close();
- }
- else
- {
- // 可能有其他程序正在处理此文件
- switch(e.m_cause)
- {
- case CFileException::tooManyOpenFiles:
- case CFileException::accessDenied:
- case CFileException::sharingViolation:
- case CFileException::lockViolation:
- return TRUE;
- case CFileException::fileNotFound:
- case CFileException::badPath:
- case CFileException::invalidFile:
- case CFileException::hardIO:
- default:
- return FALSE;
- }
- }
- return bExist;
- }
- // 操作命令解释函数---解释:CMD_LOAD_FROM_FILE命令
- // 从指定图像文件中读取数据
- void _fnCMD_LOAD_FROM_FILE(INFOSTR *pInfo)
- {
- // 检验入口参数是否符合接口定义
- ASSERT(pInfo->result == ER_EMPTY);
- ASSERT(::strlen(pInfo->filename));
- // 此时,该文件必需是一个已存在的、有效的TGA文件,并且数据包中
- // 含有该文件的信息(imginfo结构中)
- ASSERT(pInfo->state == PKST_PASSINFO);
- ASSERT(pInfo->imginfo.imgformat == IMF_TGA);
- ASSERT(pInfo->pImgInfo == NULL);
- // 必需设置标准图像格式信息
- ASSERT(pInfo->sDIBInfo.bmi.biSize == sizeof(BITMAPINFOHEADER));
- ASSERT(pInfo->pLineAddr != NULL);
- ASSERT(pInfo->_pbdata != NULL);
- CFile file;
- if (pInfo->fpProgress)
- {
- if ((*pInfo->fpProgress)(RWPROGRESSSIZE, 6))
- { // 如果进度函数返回1,则说明用户想中断操作,返回。
- pInfo->result = ER_USERBREAK;
- return;
- }
- }
- // 打开指定文件
- if (!file.Open(pInfo->filename, CFile::modeRead))
- {
- pInfo->result = ER_FILERWERR;
- return;
- }
- file.Seek(0, CFile::begin);
- // 读取并转换图像到数据包中
- if (_Read(file, pInfo) == 0)
- {
- // 成功
- pInfo->state = PKST_INFOANDBITS;
- pInfo->modify = 0;
- pInfo->result = ER_SUCCESS;
- }
-
- file.Close();
- if (pInfo->fpProgress) // 结束进度条,此调用不再支持用户中断
- (*pInfo->fpProgress)(RWPROGRESSSIZE, RWPROGRESSSIZE);
- }
- int _Read(CFile& file, LPINFOSTR pInfo)
- {
- DWORD dwSize, dwRet;
- UINT uRet,uRet1;
- /******************************/
- TGAHEADER tgaHeader;
- BYTE pPal[768];
- PBYTE pTempPal,pImage;
- WORD wPalLen=0;//调色板长度(In Byte)
- DWORD dwOffBits;
- BOOL bGray;
- /* 读取TGA的文件头结构 */
- file.SeekToBegin();
- uRet = file.Read(&tgaHeader, sizeof(TGAHEADER));
- uRet1 = file.Seek(tgaHeader.bID_Length,CFile::current);
- if ((uRet != sizeof(TGAHEADER))||uRet1!=uRet+tgaHeader.bID_Length)
- {
- pInfo->result = ER_FILERWERR;
- return 1; // 读文件时出错
- }
- bGray=(tgaHeader.bImageType==TGA_UNCPSGRAY||tgaHeader.bImageType==TGA_RLEGRAY)?TRUE:FALSE;//判断灰度图象
- memset(pPal,0,sizeof(pPal));
- // pPal将包含调色板信息(如果有的话)
- if(tgaHeader.bPalType||tgaHeader.bImageType==TGA_UNCPSPAL||tgaHeader.bImageType==TGA_RLEPAL)
- {
- wPalLen=tgaHeader.wPalLength*((tgaHeader.bPalBits+7)>>3);
- pTempPal = (PBYTE)::GlobalAlloc(GPTR, wPalLen);
- if (pTempPal == NULL)
- {
- pInfo->result = ER_MEMORYERR;
- return 2; // 内存不足
- }
- // 读取位图文件的原始信息
- uRet = file.Read(pTempPal, wPalLen);
- if (uRet != wPalLen)
- {
- ::GlobalFree(pTempPal);
- pInfo->result = ER_FILERWERR;
- return 1;
- }
- int i,fstIndex=tgaHeader.wPalFirstNdx*3;
- WORD wPalEntry;
-
- switch(tgaHeader.bPalBits)
- {
- case 15:
- case 16:
- for(i=0;i<wPalLen;i+=2)
- {
- wPalEntry=*((WORD*)(pTempPal+i));
- pPal[fstIndex++]=(wPalEntry&0x1f)<<3;
- pPal[fstIndex++]=((wPalEntry>>5)&0x1f)<<3;
- pPal[fstIndex++]=((wPalEntry>>10)&0x1f)<<3;
- }
- break;
- case 24:
- memcpy(pPal+fstIndex,pTempPal,wPalLen);
- break;
- case 32:
- for(i=0;i<wPalLen;i+=4,fstIndex+=3)
- memcpy(pPal+fstIndex,pTempPal+i,3);
- break;
- default:
- ::GlobalFree(pTempPal);
- pInfo->result=ER_BADIMAGE;
- return -1;
- break;
- }
- ::GlobalFree(pTempPal);
- }//End 读取调色板
- else
- if(bGray)//灰度
- {
- for(int i=0;i<256;i++)
- memset(pPal+i*3,(char)i,3);
- }
-
- // 获取文件长度
- dwSize = file.GetLength();
- dwOffBits=sizeof(TGAHEADER)+tgaHeader.bID_Length+wPalLen;
- // 分配内存,用于存放位数据
- pImage = (PBYTE)::GlobalAlloc(GPTR, dwSize-dwOffBits);
- if (!pImage)
- {
- pInfo->result = ER_MEMORYERR;
- return 2; // 内存不足
- }
- // 读取位数据
- file.Seek(dwOffBits, CFile::begin);
- dwRet = file.ReadHuge((void*)pImage,dwSize-dwOffBits);
- if (dwRet != (dwSize-dwOffBits))//还应判断是否小于最小字节数
- {
- ::GlobalFree(pImage);
- pInfo->result = ER_FILERWERR;
- return 1;
- }
-
-
- int result = 0; // 接收各函数的返回值
- // 根据位图文件的位深度的不同而调用相应的读取函数
- switch(tgaHeader.bImageType)
- {
- case TGA_UNCPSPAL:
- case TGA_UNCPSGRAY:
- switch(tgaHeader.bBits)
- {
- case 8:
- result = _from_8_PAL_read(pInfo, pImage,tgaHeader, pPal);
- break;
- default: //使用调色板的位图索引一般只有8位
- result=-1;
- break;
- }
- break;
- case TGA_UNCPSCOLOR:
- switch(tgaHeader.bBits)
- {
- case 15:
- case 16:
- result=_from_15_16_COLOR_read(pInfo,pImage,tgaHeader);
- break;
- case 24:
- result=_from_24_COLOR_read(pInfo,pImage,tgaHeader);
- break;
- case 32:
- result=_from_32_COLOR_read(pInfo,pImage,tgaHeader);
- break;
- default:
- result=-1;//全彩图象素位长应当只有 15,16,24,32几种
- break;
- }
- break;
- case TGA_RLEGRAY:
- case TGA_RLEPAL:
- switch(tgaHeader.bBits)
- {
- case 8:
- result=_from_8_RLE_PAL_read(pInfo,pImage,tgaHeader,pPal);
- break;
- default:
- result=-1;
- break;
- }
- break;
- case TGA_RLECOLOR:
- switch(tgaHeader.bBits)
- {
- case 15:
- case 16:
- result=_from_15_16_RLE_COLOR_read(pInfo,pImage,tgaHeader);
- break;
- case 24:
- result=_from_24_RLE_COLOR_read(pInfo,pImage,tgaHeader);
- break;
- case 32:
- result=_from_32_RLE_COLOR_read(pInfo,pImage,tgaHeader);
- break;
- default:
- result=-1;//全彩图象素位长应当只有 15,16,24,32几种
- break;
- }
- break;
- default:
- result=-1;
- break; // 图像文件格式异常
- }
- // 释放从文件中读取的位数据(此数据已被转换并保存到了数据包中)
- ::GlobalFree(pImage);
-
- if (result == 0) // 执行成功
- {
- pInfo->result = ER_SUCCESS;
- }
- else
- {
-
- if(pInfo->result==ER_EMPTY)//没有调用read函数
- pInfo->result=ER_BADIMAGE;//文件格式非法
- pInfo->pImgInfo = NULL;
- return 4; // 执行过程中产生的错误,详见pInfo->result
- }
- return 0;
- }
- int _from_8_PAL_read(LPINFOSTR pInfo, PBYTE lpSrc, const TGAHEADER& tgaHeader, const LPBYTE pPal)//Passed
- {
- ASSERT(pInfo);
- ASSERT(lpSrc);
- ASSERT(tgaHeader.bBits==8);//前提
- ASSERT(pPal);
- LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
- WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*8);
- DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
- LPBYTE pSrcBuf,pDest24;
- LPWORD pDest16;
- DESFORMAT fmt=::_get_desformat(pInfo);
- int iRow,iCol;
-
- switch(fmt)
- {
- case DF_32:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- memcpy(pDestLineAddr[iRow]+iCol,pPal+pSrcBuf[pBmpInfo->biWidth-1-iCol]*3,3);
- else
- memcpy(pDestLineAddr[iRow]+iCol,pPal+pSrcBuf[iCol]*3,3);
- }
- }
- break;
- case DF_24:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
-
- pDest24=(LPBYTE)pDestLineAddr[iRow];
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- memcpy(pDest24+iCol*3,pPal+pSrcBuf[pBmpInfo->biWidth-1-iCol]*3,3);
- else
- memcpy(pDest24+iCol*3,pPal+pSrcBuf[iCol]*3,3);
- }
- }
- break;
- case DF_16_555:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
-
- pDest16=(LPWORD)pDestLineAddr[iRow];
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- pDest16[iCol]=::_cnv_rgb_to_555(pPal[pSrcBuf[pBmpInfo->biWidth-1-iCol]*3+2],pPal[pSrcBuf[pBmpInfo->biWidth-1-iCol]*3+1],pPal[pSrcBuf[pBmpInfo->biWidth-1-iCol]*3]);
- else
- pDest16[iCol]=::_cnv_rgb_to_555(pPal[pSrcBuf[iCol]*3+2],pPal[pSrcBuf[iCol]*3+1],pPal[pSrcBuf[iCol]*3]);
- }
- }
- break;
- case DF_16_565:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
-
- pDest16=(LPWORD)pDestLineAddr[iRow];
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- pDest16[iCol]=::_cnv_rgb_to_565(pPal[pSrcBuf[pBmpInfo->biWidth-1-iCol]*3+2],pPal[pSrcBuf[pBmpInfo->biWidth-1-iCol]*3+1],pPal[pSrcBuf[pBmpInfo->biWidth-1-iCol]*3]);
- else
- pDest16[iCol]=::_cnv_rgb_to_565(pPal[pSrcBuf[iCol]*3+2],pPal[pSrcBuf[iCol]*3+1],pPal[pSrcBuf[iCol]*3]);
- }
- }
- break;
- case DF_NULL:
- default:
- ASSERT(FALSE);
- pInfo->result = ER_ILLCOMM;
- return -1;
- break;
- }
- return 0;
-
- }
- int _from_15_16_COLOR_read(LPINFOSTR pInfo, PBYTE lpSrc, const TGAHEADER& tgaHeader)//Passed
- {
- ASSERT(pInfo);
- ASSERT(lpSrc);
- ASSERT(tgaHeader.bBits==15||tgaHeader.bBits==16);//前提
- LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
- WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*16);
- DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
- LPBYTE pSrcBuf,pDest24;
- BYTE bB,bG,bR;
- WORD wTempCol;
- LPWORD pDest16;
- DESFORMAT fmt=::_get_desformat(pInfo);
- int iRow,iCol;
-
-
- switch(fmt)
- {
- case DF_32:
- //应该先将目标数据区清零否??
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
-
-
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- wTempCol=*((WORD*)(pSrcBuf+(pBmpInfo->biWidth-1-iCol)*2));
- else
- wTempCol=*((WORD*)(pSrcBuf+iCol*2));
-
- bB=(wTempCol&0x1f)<<3;
- bG=((wTempCol>>5)&0x1f)<<3;
- bR=((wTempCol>>10)&0x1f)<<3;
- pDestLineAddr[iRow][iCol]=BGR(bB,bG,bR);
- }
- }
- break;
- case DF_24:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
-
- pDest24=(LPBYTE)pDestLineAddr[iRow];
-
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- wTempCol=*((WORD*)(pSrcBuf+(pBmpInfo->biWidth-1-iCol)*2));
- else
- wTempCol=*((WORD*)(pSrcBuf+iCol*2));
-
- pDest24[iCol*3]=(wTempCol&0x1f)<<3;
- pDest24[iCol*3+1]=((wTempCol>>5)&0x1f)<<3;
- pDest24[iCol*3+2]=((wTempCol>>10)&0x1f)<<3;
- }
- }
- break;
- case DF_16_555:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
-
- pDest16=(LPWORD)pDestLineAddr[iRow];
-
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- pDest16[iCol]=*((WORD*)(pSrcBuf+(pBmpInfo->biWidth-1-iCol)*2));
- else
- pDest16[iCol]=*((WORD*)(pSrcBuf+iCol*2));
-
- }
- }
- break;
- case DF_16_565:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
-
- pDest16=(LPWORD)pDestLineAddr[iRow];
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- wTempCol=*((WORD*)(pSrcBuf+(pBmpInfo->biWidth-1-iCol)*2));
- else
- wTempCol=*((WORD*)(pSrcBuf+iCol*2));
-
- bB=(wTempCol&0x1f)<<3;
- bG=((wTempCol>>5)&0x1f)<<3;
- bR=((wTempCol>>10)&0x1f)<<3;
- pDest16[iCol]=::_cnv_rgb_to_565(bR,bG,bB);
- }
- }
- break;
- case DF_NULL:
- default:
- ASSERT(FALSE);
- pInfo->result = ER_ILLCOMM;
- return -1;
- break;
- }
- return 0;
- }
- int _from_24_COLOR_read(LPINFOSTR pInfo, PBYTE lpSrc, const TGAHEADER& tgaHeader)//Passed
- {
- ASSERT(pInfo);
- ASSERT(lpSrc);
- ASSERT(tgaHeader.bBits==24);//前提
- LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
- WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*24);
- DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
- LPBYTE pSrcBuf;
- DESFORMAT fmt=::_get_desformat(pInfo);
- int iRow,iCol;
- LPBYTE pDest24;
- LPWORD pDest16;
-
- switch(fmt)
- {
- case DF_32:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
-
-
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- memcpy(pDestLineAddr[iRow]+iCol,pSrcBuf+(pBmpInfo->biWidth-1-iCol)*3,3);
- else
- memcpy(pDestLineAddr[iRow]+iCol,pSrcBuf+iCol*3,3);
- }
- }
- break;
- case DF_24:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
-
- pDest24=(LPBYTE)pDestLineAddr[iRow];
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- memcpy(pDest24+iCol*3,pSrcBuf+(pBmpInfo->biWidth-1-iCol)*3,3);
- else
- memcpy(pDest24+iCol*3,pSrcBuf+iCol*3,3);
- }
- }
- break;
- case DF_16_555:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
-
- pDest16=(LPWORD)pDestLineAddr[iRow];
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- pDest16[iCol]=::_cnv_rgb_to_555(pSrcBuf[(pBmpInfo->biWidth-1-iCol)*3+2],pSrcBuf[(pBmpInfo->biWidth-1-iCol)*3+1],pSrcBuf[(pBmpInfo->biWidth-1-iCol)*3]);
- else
- pDest16[iCol]=::_cnv_rgb_to_555(pSrcBuf[iCol*3+2],pSrcBuf[iCol*3+1],pSrcBuf[iCol*3]);
- }
- }
- break;
- case DF_16_565:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
-
- pDest16=(LPWORD)pDestLineAddr[iRow];
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- pDest16[iCol]=::_cnv_rgb_to_565(pSrcBuf[(pBmpInfo->biWidth-1-iCol)*3+2],pSrcBuf[(pBmpInfo->biWidth-1-iCol)*3+1],pSrcBuf[(pBmpInfo->biWidth-1-iCol)*3]);
- else
- pDest16[iCol]=::_cnv_rgb_to_565(pSrcBuf[iCol*3+2],pSrcBuf[iCol*3+1],pSrcBuf[iCol*3]);
- }
- }
- break;
- case DF_NULL:
- default:
- ASSERT(FALSE);
- pInfo->result = ER_ILLCOMM;
- return -1;
- break;
- }
- return 0;
- }
- int _from_32_COLOR_read(LPINFOSTR pInfo, PBYTE lpSrc, const TGAHEADER& tgaHeader)//Passed
- {
- ASSERT(pInfo);
- ASSERT(lpSrc);
- ASSERT(tgaHeader.bBits==32);//前提
- LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
- WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*32);
- DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
- LPBYTE pSrcBuf;
- DESFORMAT fmt=::_get_desformat(pInfo);
- int iRow,iCol;
- LPBYTE pDest24;
- LPWORD pDest16;
- //应该先将目标数据区清零否??
- switch(fmt)
- {
- case DF_32:
- for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
-
-
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- memcpy(pDestLineAddr[iRow]+iCol,pSrcBuf+(pBmpInfo->biWidth-1-iCol)*4,3);
- else
- memcpy(pDestLineAddr[iRow]+iCol,pSrcBuf+iCol*4,3);
- }
- }
- break;
- case DF_24:
- for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
-
- pDest24=(LPBYTE)pDestLineAddr[iRow];
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- memcpy(pDest24+iCol*3,pSrcBuf+(pBmpInfo->biWidth-1-iCol)*4,3);
- else
- memcpy(pDest24+iCol*3,pSrcBuf+iCol*4,3);
- }
- }
- break;
- case DF_16_555:
- for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
-
- pDest16=(LPWORD)pDestLineAddr[iRow];
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- pDest16[iCol]=::_cnv_rgb_to_555(pSrcBuf[(pBmpInfo->biWidth-1-iCol)*4+2],pSrcBuf[(pBmpInfo->biWidth-1-iCol)*4+1],pSrcBuf[(pBmpInfo->biWidth-1-iCol)*4]);
- else
- pDest16[iCol]=::_cnv_rgb_to_555(pSrcBuf[iCol*4+2],pSrcBuf[iCol*4+1],pSrcBuf[iCol*4]);
- }
- }
- break;
- case DF_16_565:
- for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
- pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
- else
- pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
-
- pDest16=(LPWORD)pDestLineAddr[iRow];
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- pDest16[iCol]=::_cnv_rgb_to_565(pSrcBuf[(pBmpInfo->biWidth-1-iCol)*4+2],pSrcBuf[(pBmpInfo->biWidth-1-iCol)*4+1],pSrcBuf[(pBmpInfo->biWidth-1-iCol)*4]);
- else
- pDest16[iCol]=::_cnv_rgb_to_565(pSrcBuf[iCol*4+2],pSrcBuf[iCol*4+1],pSrcBuf[iCol*4]);
- }
- }
- break;
- case DF_NULL:
- default:
- ASSERT(FALSE);
- pInfo->result = ER_ILLCOMM;
- return -1;
- break;
- }
- return 0;
- }
- //行解压
- int DecodingLine(BYTE *pDest,BYTE* pSrc,int rleunit,int destlen)//返回pDest实际解压字节数
- {
- ASSERT(pSrc);
- ASSERT(pDest);
- int iCol,nCount;
- BYTE *pDestEnd=pDest+destlen,*pSrcOrg=pSrc,*pDestOrg=pDest;
- for(;pDest<pDestEnd;)
- {
- if(pSrc[0]&0x80)
- {
- nCount=(pSrc[0]&0x7F)+1;
- pSrc++;
- for(iCol=0;iCol<nCount;iCol++)
- {
- memcpy(pDest,pSrc,rleunit);
- pDest+=rleunit;
- }
- pSrc+=rleunit;
- }
- else
- {
- nCount=(pSrc[0]&0x7F)+1;
- pSrc++;
- memcpy(pDest,pSrc,nCount*rleunit);
- pDest+=nCount*rleunit;
- pSrc+=nCount*rleunit;
- }
-
- }
- #ifdef _OVERCHECK
- if(pDest-pDestOrg!=destlen)
- return -1;
- #endif
- return pSrc-pSrcOrg;
- }
- //解压缩最后还应判断数据是否越界(即被解出之数据量大于原数据)
- int _from_8_RLE_PAL_read(LPINFOSTR pInfo, PBYTE lpSrc, const TGAHEADER& tgaHeader, const LPBYTE pPal)//Passed
- {
- ASSERT(pInfo);
- ASSERT(lpSrc);
- ASSERT(tgaHeader.bBits==8);//前提
- ASSERT(pPal);
- LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
- WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*8);
- DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
- LPBYTE pTempBuf;//解压缓存
- int iDecoded;
- pTempBuf=(LPBYTE)::GlobalAlloc(GPTR,wSrcBytesPerLine+128*1);
- if(!pTempBuf)
- {
- pInfo->result=ER_MEMORYERR;
- return -1;
- }
-
- LPBYTE pDest24;
- LPWORD pDest16;
- DESFORMAT fmt=::_get_desformat(pInfo);
- int iRow,iCol;
-
- switch(fmt)
- {
- case DF_32:
- //应该先将目标数据区清零否??
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,1,wSrcBytesPerLine);
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)//上下倒置
- memcpy(pDestLineAddr[iRow]+iCol,pPal+pTempBuf[pBmpInfo->biWidth-1-iCol]*3,3);
- else
- memcpy(pDestLineAddr[pBmpInfo->biHeight-1-iRow]+iCol,pPal+pTempBuf[pBmpInfo->biWidth-1-iCol]*3,3);
-
- }
- else
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)//上下倒置
- memcpy(pDestLineAddr[iRow]+iCol,pPal+pTempBuf[iCol]*3,3);
- else
- memcpy(pDestLineAddr[pBmpInfo->biHeight-1-iRow]+iCol,pPal+pTempBuf[iCol]*3,3);
-
- }
- }
- }
- break;
- case DF_24:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,1,wSrcBytesPerLine);
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
- pDest24=(LPBYTE)pDestLineAddr[iRow];
- else
- pDest24=(LPBYTE)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- memcpy(pDest24+iCol*3,pPal+pTempBuf[pBmpInfo->biWidth-1-iCol]*3,3);
- else
- memcpy(pDest24+iCol*3,pPal+pTempBuf[iCol]*3,3);
- }
- }
- break;
- case DF_16_555:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,1,wSrcBytesPerLine);
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
- pDest16=(LPWORD)pDestLineAddr[iRow];
- else
- pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- pDest16[iCol]=::_cnv_rgb_to_555(pPal[pTempBuf[pBmpInfo->biWidth-1-iCol]*3+2],pPal[pTempBuf[pBmpInfo->biWidth-1-iCol]*3+1],pPal[pTempBuf[pBmpInfo->biWidth-1-iCol]*3]);
- else
- pDest16[iCol]=::_cnv_rgb_to_555(pPal[pTempBuf[iCol]*3+2],pPal[pTempBuf[iCol]*3+1],pPal[pTempBuf[iCol]*3]);
- }
- }
- break;
- case DF_16_565:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,1,wSrcBytesPerLine);
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
- pDest16=(LPWORD)pDestLineAddr[iRow];
- else
- pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- pDest16[iCol]=::_cnv_rgb_to_565(pPal[pTempBuf[pBmpInfo->biWidth-1-iCol]*3+2],pPal[pTempBuf[pBmpInfo->biWidth-1-iCol]*3+1],pPal[pTempBuf[pBmpInfo->biWidth-1-iCol]*3]);
- else
- pDest16[iCol]=::_cnv_rgb_to_565(pPal[pTempBuf[iCol]*3+2],pPal[pTempBuf[iCol]*3+1],pPal[pTempBuf[iCol]*3]);
- }
- }
- break;
- case DF_NULL:
- default:
- ::GlobalFree(pTempBuf);
- ASSERT(FALSE);
- pInfo->result = ER_ILLCOMM;
- return -1;
- break;
-
- }
- ::GlobalFree(pTempBuf);
- return 0;
- }
- int _from_15_16_RLE_COLOR_read(LPINFOSTR pInfo,PBYTE lpSrc,const TGAHEADER& tgaHeader)//Passed
- {
- ASSERT(pInfo);
- ASSERT(lpSrc);
- ASSERT(tgaHeader.bBits==15||tgaHeader.bBits==16);//前提
- LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
- WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*16);
- DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
- LPBYTE pTempBuf;//解压缓存
- int iDecoded;
- BYTE bB,bG,bR;
- WORD wTempCol;
- pTempBuf=(LPBYTE)::GlobalAlloc(GPTR,wSrcBytesPerLine+128*((tgaHeader.bBits+7)/8));
- if(!pTempBuf)
- {
- pInfo->result=ER_MEMORYERR;
- return -1;
- }
- LPBYTE pDest24;
- LPWORD pDest16;
- DESFORMAT fmt=::_get_desformat(pInfo);
- int iRow,iCol;
- //应该先将目标数据区清零否??
-
- switch(fmt)
- {
- case DF_32:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,2,wSrcBytesPerLine);
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
-
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- wTempCol=*((WORD*)(pTempBuf+(pBmpInfo->biWidth-1-iCol)*2));
- else
- wTempCol=*((WORD*)(pTempBuf+iCol*2));
-
- bB=(wTempCol&0x1f)<<3;
- bG=((wTempCol>>5)&0x1f)<<3;
- bR=((wTempCol>>10)&0x1f)<<3;
-
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)//上下倒置
- pDestLineAddr[iRow][iCol]=BGR(bB,bG,bR);
- else
- pDestLineAddr[pBmpInfo->biHeight-iRow-1][iCol]=BGR(bB,bG,bR);
-
-
- }
- }
- break;
- case DF_24:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,2,wSrcBytesPerLine);
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
- pDest24=(LPBYTE)pDestLineAddr[iRow];
- else
- pDest24=(LPBYTE)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
-
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
-
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- wTempCol=*((WORD*)(pTempBuf+(pBmpInfo->biWidth-1-iCol)*2));
- else
- wTempCol=*((WORD*)(pTempBuf+iCol*2));
- ::_cnv_555_to_rgb(wTempCol,pDest24+iCol*3+2,pDest24+iCol*3+1,pDest24+iCol*3);
- }
- }
- break;
- case DF_16_555:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,2,wSrcBytesPerLine);
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
- pDest16=(LPWORD)pDestLineAddr[iRow];
- else
- pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
-
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
-
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- pDest16[iCol]=*((WORD*)(pTempBuf+(pBmpInfo->biWidth-1-iCol)*2));
- else
- pDest16[iCol]=*((WORD*)(pTempBuf+iCol*2));
- }
- }
- break;
- case DF_16_565:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,2,wSrcBytesPerLine);
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
- pDest16=(LPWORD)pDestLineAddr[iRow];
- else
- pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
-
- for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
-
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- pDest16[iCol]=::_cnv_555_to_565(*((WORD*)(pTempBuf+(pBmpInfo->biWidth-1-iCol)*2)));
- else
- pDest16[iCol]=::_cnv_555_to_565(*((WORD*)(pTempBuf+iCol*2)));
- }
- }
- break;
- case DF_NULL:
- default:
- ::GlobalFree(pTempBuf);
- ASSERT(FALSE);
- pInfo->result = ER_ILLCOMM;
- return -1;
- break;
- }
- ::GlobalFree(pTempBuf);
- return 0;
- }
- int _from_24_RLE_COLOR_read(LPINFOSTR pInfo,PBYTE lpSrc,const TGAHEADER& tgaHeader)//Passed
- {
- ASSERT(pInfo);
- ASSERT(lpSrc);
- ASSERT(tgaHeader.bBits==24);//前提
- LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
- WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*24);
- DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
- LPBYTE pTempBuf;
- int iDecoded;
-
- pTempBuf=(LPBYTE)::GlobalAlloc(GPTR,wSrcBytesPerLine+128*3);
- if(!pTempBuf)
- {
- pInfo->result=ER_MEMORYERR;
- return -1;
- }
- LPBYTE pDest24;
- LPWORD pDest16;
- DESFORMAT fmt=::_get_desformat(pInfo);
- int iRow,iCol;
- switch(fmt)
- {
- case DF_32:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,3,wSrcBytesPerLine);
-
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
-
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)//上下反置
- memcpy(pDestLineAddr[iRow]+iCol,pTempBuf+(pBmpInfo->biWidth-1-iCol)*3,3);
- else
- memcpy(pDestLineAddr[pBmpInfo->biHeight-1-iRow]+iCol,pTempBuf+(pBmpInfo->biWidth-1-iCol)*3,3);
-
- }
- else
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)//上下反置
- memcpy(pDestLineAddr[iRow]+iCol,pTempBuf+iCol*3,3);
- else
- memcpy(pDestLineAddr[pBmpInfo->biHeight-1-iRow]+iCol,pTempBuf+iCol*3,3);
- }
-
- }
- }
- break;
- case DF_24:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,3,wSrcBytesPerLine);
-
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
- pDest24=(LPBYTE)pDestLineAddr[iRow];
- else
- pDest24=(LPBYTE)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
-
- for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
-
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- memcpy(pDest24+iCol*3,pTempBuf+(pBmpInfo->biWidth-1-iCol)*3,3);
- else
- memcpy(pDest24+iCol*3,pTempBuf+iCol*3,3);
- }
-
- }
- break;
- case DF_16_555:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,3,wSrcBytesPerLine);
-
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
- pDest16=(LPWORD)pDestLineAddr[iRow];
- else
- pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
-
- for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
-
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- pDest16[iCol]=::_cnv_rgb_to_555(pTempBuf[(pBmpInfo->biWidth-1-iCol)*3+2],pTempBuf[(pBmpInfo->biWidth-1-iCol)*3+1],pTempBuf[(pBmpInfo->biWidth-1-iCol)*3]);
- else
- pDest16[iCol]=::_cnv_rgb_to_555(pTempBuf[iCol*3+2],pTempBuf[iCol*3+1],pTempBuf[iCol*3]);
- }
-
- }
- break;
- case DF_16_565:
- for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,3,wSrcBytesPerLine);
-
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
- pDest16=(LPWORD)pDestLineAddr[iRow];
- else
- pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
-
- for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
-
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- pDest16[iCol]=::_cnv_rgb_to_565(pTempBuf[(pBmpInfo->biWidth-1-iCol)*3+2],pTempBuf[(pBmpInfo->biWidth-1-iCol)*3+1],pTempBuf[(pBmpInfo->biWidth-1-iCol)*3]);
- else
- pDest16[iCol]=::_cnv_rgb_to_565(pTempBuf[iCol*3+2],pTempBuf[iCol*3+1],pTempBuf[iCol*3]);
- }
-
- }
- break;
- case DF_NULL:
- default:
- ::GlobalFree(pTempBuf);
- ASSERT(FALSE);
- pInfo->result = ER_ILLCOMM;
- return -1;
- break;
-
-
- }
-
- ::GlobalFree(pTempBuf);
- return 0;
- }
- int _from_32_RLE_COLOR_read(LPINFOSTR pInfo,PBYTE lpSrc,const TGAHEADER& tgaHeader)//Passed
- {
- ASSERT(pInfo);
- ASSERT(lpSrc);
- ASSERT(tgaHeader.bBits==32);//前提
- LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
- WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*32);
- DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
- LPBYTE pTempBuf;
- int iDecoded;
- pTempBuf=(LPBYTE)::GlobalAlloc(GPTR,wSrcBytesPerLine+128*4);
- if(!pTempBuf)
- {
- pInfo->result=ER_MEMORYERR;
- return -1;
- }
- LPBYTE pDest24;
- LPWORD pDest16;
- DESFORMAT fmt=::_get_desformat(pInfo);
- int iRow,iCol;
-
- switch(fmt)
- {
- case DF_32:
- //应该先将目标数据区清零否??
- for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,4,wSrcBytesPerLine);
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
-
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)//上下反置
- memcpy(pDestLineAddr[iRow]+iCol,pTempBuf+(pBmpInfo->biWidth-1-iCol)*4,3);
- else
- memcpy(pDestLineAddr[pBmpInfo->biHeight-1-iRow]+iCol,pTempBuf+(pBmpInfo->biWidth-1-iCol)*4,3);
-
- }
- else
- {
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)//上下反置
- memcpy(pDestLineAddr[iRow]+iCol,pTempBuf+iCol*4,3);
- else
- memcpy(pDestLineAddr[pBmpInfo->biHeight-1-iRow]+iCol,pTempBuf+iCol*4,3);
-
- }
-
- }
- }
- break;
- case DF_24:
- for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,4,wSrcBytesPerLine);
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
- pDest24=(LPBYTE)pDestLineAddr[iRow];
- else
- pDest24=(LPBYTE)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
-
-
- for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
-
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- memcpy(pDest24+iCol*3,pTempBuf+(pBmpInfo->biWidth-1-iCol)*4,3);
- else
- memcpy(pDest24+iCol*3,pTempBuf+iCol*4,3);
-
- }
-
- }
- break;
- case DF_16_555:
- for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,4,wSrcBytesPerLine);
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
- pDest16=(LPWORD)pDestLineAddr[iRow];
- else
- pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
-
-
- for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
-
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- pDest16[iCol]=::_cnv_rgb_to_555(pTempBuf[(pBmpInfo->biWidth-1-iCol)*4+2],pTempBuf[(pBmpInfo->biWidth-1-iCol)*4+1],pTempBuf[(pBmpInfo->biWidth-1-iCol)*4]);
- else
- pDest16[iCol]=::_cnv_rgb_to_555(pTempBuf[iCol*4+2],pTempBuf[iCol*4+1],pTempBuf[iCol*4]);
-
- }
-
- }
-
- break;
- case DF_16_565:
- for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
- {
- iDecoded=::DecodingLine(pTempBuf,lpSrc,4,wSrcBytesPerLine);
- if(iDecoded==-1)
- {
- GlobalFree(pTempBuf);
- pInfo->result=ER_BADIMAGE;
- return -1;
- }
-
- lpSrc+=iDecoded;
-
- if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
- pDest16=(LPWORD)pDestLineAddr[iRow];
- else
- pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
-
-
- for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
- {
-
- if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
- pDest16[iCol]=::_cnv_rgb_to_565(pTempBuf[(pBmpInfo->biWidth-1-iCol)*4+2],pTempBuf[(pBmpInfo->biWidth-1-iCol)*4+1],pTempBuf[(pBmpInfo->biWidth-1-iCol)*4]);
- else
- pDest16[iCol]=::_cnv_rgb_to_565(pTempBuf[iCol*4+2],pTempBuf[iCol*4+1],pTempBuf[iCol*4]);
-
- }
-
- }
- case DF_NULL:
- default:
- ::GlobalFree(pTempBuf);
- ASSERT(FALSE);
- pInfo->result = ER_ILLCOMM;
- return -1;
- break;
- }
- ::GlobalFree(pTempBuf);
- return 0;
- }
- // 判断标准图像的位格式
- DESFORMAT _get_desformat(LPINFOSTR pInfo)
- {
- ASSERT(pInfo);
- // ASSERT(pInfo->state >= PKST_PASSVER);
- ASSERT(pInfo->sDIBInfo.bmi.biPlanes == 1);
- DESFORMAT result;
- switch(pInfo->sDIBInfo.bmi.biBitCount)
- {
- case 32:
- /******************************************************
- 32位掩码示意图
- 高 -> 低
- 0000 0000 0000 0000 0000 0000 0000 0000 888格式
- 1111 1111 ------------------------R
- 1111 1111 -------------G
- 1111 1111--B
- * Win95 系统只支持这一种格式
- ******************************************************/
- if (pInfo->sDIBInfo.bmi.biCompression == BI_RGB)
- {
- result = DF_32;
- break;
- }
- if ((pInfo->sDIBInfo.rmask == 0xff0000)&&
- (pInfo->sDIBInfo.gmask == 0xff00)&&
- (pInfo->sDIBInfo.bmask == 0xff))
- result = DF_32;
- else
- {
- ASSERT(FALSE); // 只支持888格式
- result = DF_NULL;
- }
- break;
- case 24:
- result = DF_24;
- break;
- case 16:
- /*******************************************
- 16位掩码示意图
- 高字节 低字节
- 0000 0000 0000 0000
- 1 1111--B // 555格式
- 11 111 -------G
- 111 11 --------------R
- 0
- 1 1111--B // 565格式
- 111 111 -------G
- 1111 1 --------------R
- * Win95 系统只支持以上两种格式
- *******************************************/
- if (pInfo->sDIBInfo.bmi.biCompression == BI_RGB)
- {
- result = DF_16_555;
- break;
- }
- if ((pInfo->sDIBInfo.rmask == 0x7c00)&&
- (pInfo->sDIBInfo.gmask == 0x3e0)&&
- (pInfo->sDIBInfo.bmask == 0x1f))
- result = DF_16_555;
- else if ((pInfo->sDIBInfo.rmask == 0xf800)&&
- (pInfo->sDIBInfo.gmask == 0x7e0)&&
- (pInfo->sDIBInfo.bmask == 0x1f))
- result = DF_16_565;
- else
- result = DF_NULL;
- break;
- default:
- ASSERT(FALSE); // 不接受其它格式
- result = DF_NULL;
- break;
- }
- return result;
- }
- // 将指定的RGB颜色分量转换成555格式(WORD型值返回)
- WORD _cnv_rgb_to_555(BYTE red, BYTE green, BYTE blue)
- {
- WORD result = 0;
- result = (((WORD)red>>3)<<10)|(((WORD)green>>3)<<5)|((WORD)blue>>3);
- return result;
- }
- // 将指定的555格式的颜色转换成RGB颜色分量
- void _cnv_555_to_rgb(WORD col, PBYTE red, PBYTE green, PBYTE blue)
- {
- // 在555转换到RGB时,将像素的亮度调到最大
- *red = (BYTE)((col>>7)&0xf8);
- *green = (BYTE)((col>>2)&0xf8);
- *blue = (BYTE)(col<<3);
- }
- // 将指定的RGB颜色分量转换成565格式(WORD型值返回)
- WORD _cnv_rgb_to_565(BYTE red, BYTE green, BYTE blue)
- {
- WORD result = 0;
- result = (((WORD)red>>3)<<11)|(((WORD)green>>2)<<5)|((WORD)blue>>3);
- return result;
- }
- // 将指定的565格式的颜色转换成RGB颜色分量
- void _cnv_565_to_rgb(WORD col, PBYTE red, PBYTE green, PBYTE blue)
- {
- // 在565转换到RGB时,将像素的亮度调到最大
- *red = (BYTE)((col>>8)&0xf8);
- *green = (BYTE)((col>>3)&0xfc);
- *blue = (BYTE)(col<<3);
- }
- // 将指定的RGB颜色分量转换成888格式(DWORD型值返回)
- DWORD _cnv_rgb_to_888(BYTE red, BYTE green, BYTE blue)
- {
- DWORD result = 0;
- result = ((DWORD)red<<16)|((DWORD)green<<8)|(DWORD)blue;
- return result;
- }
- // 将指定的555颜色分量转换成565格式
- WORD _cnv_555_to_565(WORD w555)
- {
-
- return (WORD)(((w555&0x7FE0)<<1)|(w555&0x1F));
-
- }