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

图形图象

开发平台:

Visual C++

  1. // TgaModule.cpp : Defines the initialization routines for the DLL.
  2. //
  3. #include "stdafx.h"
  4. #include "TgaModule.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. #define _CHECKOVER
  11. //#define DIBSCANLINE_WIDTHBYTES(bits)    ((((bits)+31)>>5)<<2)
  12. #define DIBSCANLINE_WIDTHBYTES(bits)    (((bits)+7)>>3)
  13. #define MODULE_BUILDID 1
  14. #define RWPROGRESSSIZE 100
  15. #define BGR(b,g,r)          ((COLORREF)(((BYTE)(b)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(r))<<16)))
  16. #define _OVERCHECK
  17. static char ModuleProcessImgType[]="TGA"; // 本模块能处理的图像类型
  18. static char WriterList[]="晓月儿"; // 本模块的作者列表
  19. static char WriterMess[]="我爱你,我一直在努力!"; // 作者留言
  20. BOOL IsFileExist(char *lpFileName);
  21. //
  22. // Note!
  23. //
  24. // If this DLL is dynamically linked against the MFC
  25. // DLLs, any functions exported from this DLL which
  26. // call into MFC must have the AFX_MANAGE_STATE macro
  27. // added at the very beginning of the function.
  28. //
  29. // For example:
  30. //
  31. // extern "C" BOOL PASCAL EXPORT ExportedFunction()
  32. // {
  33. // AFX_MANAGE_STATE(AfxGetStaticModuleState());
  34. // // normal function body here
  35. // }
  36. //
  37. // It is very important that this macro appear in each
  38. // function, prior to any calls into MFC.  This means that
  39. // it must appear as the first statement within the 
  40. // function, even before any object variable declarations
  41. // as their constructors may generate calls into the MFC
  42. // DLL.
  43. //
  44. // Please see MFC Technical Notes 33 and 58 for additional
  45. // details.
  46. //
  47. // 在图像读写模块中,如果想分配内存,请使用API函数GlobalAlloc()
  48. // ,如果想释放内存请使用GlobalFree()函数。不要使用诸如:new
  49. // 、malloc()等函数。这是为了使各模块之间可以异地释放内存。
  50. //
  51. //
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CTgaModuleApp
  54. BEGIN_MESSAGE_MAP(CTgaModuleApp, CWinApp)
  55. //{{AFX_MSG_MAP(CTgaModuleApp)
  56. // NOTE - the ClassWizard will add and remove mapping macros here.
  57. //    DO NOT EDIT what you see in these blocks of generated code!
  58. //}}AFX_MSG_MAP
  59. END_MESSAGE_MAP()
  60. /////////////////////////////////////////////////////////////////////////////
  61. // CTgaModuleApp construction
  62. CTgaModuleApp::CTgaModuleApp()
  63. {
  64. // TODO: add construction code here,
  65. // Place all significant initialization in InitInstance
  66. }
  67. /////////////////////////////////////////////////////////////////////////////
  68. // The one and only CTgaModuleApp object
  69. CTgaModuleApp theApp;
  70. // 接口函数声明 — 第一层,唯一与外界联系的接口
  71. int WINAPI AccessTGAModule(INFOSTR *pInfo)
  72. {
  73. // 这个函数可以不作修改的使用,除非你的返回值多于两种。
  74. switch(pInfo->comm)
  75. {
  76. case CMD_GETPROCTYPE: // 获取本模块能处理的图像类型
  77. _fnCMD_GETPROCTYPE(pInfo);
  78. break;
  79. case CMD_GETWRITERS: // 获取本模块的作者列表,多人时用逗号分隔
  80. _fnCMD_GETWRITERS(pInfo);
  81. break;
  82. case CMD_GETWRITERMESS: // 获取作者们的留言
  83. _fnCMD_GETWRITERMESS(pInfo);
  84. break;
  85. case CMD_GETBUILDID: // 获取图像模块内部版本号
  86. _fnCMD_GETBUILDID(pInfo);
  87. break;
  88. case CMD_IS_VALID_FILE: // 判断指定文件是否是有效的WMF文件
  89. _fnCMD_IS_VALID_FILE(pInfo);
  90. break;
  91. case CMD_GET_FILE_INFO: // 获取指定文件的信息
  92. _fnCMD_GET_FILE_INFO(pInfo);
  93. break;
  94. case CMD_LOAD_FROM_FILE: // 从指定图像文件中读取数据
  95. _fnCMD_LOAD_FROM_FILE(pInfo);
  96. break;
  97. case CMD_SAVE_TO_FILE: // 将数据保存到指定文件中
  98. _fnCMD_SAVE_TO_FILE(pInfo);
  99. break;
  100. case CMD_IS_SUPPORT: // 查询某个命令是否被支持
  101. _fnCMD_IS_SUPPORT(pInfo);
  102. break;
  103. case CMD_RESIZE: // 从新获取指定尺寸的图像位数据(只适用于矢量图像)
  104. _fnCMD_RESIZE(pInfo);
  105. break;
  106. default:
  107. pInfo->result = ER_ILLCOMM; // 非法命令
  108. ASSERT(FALSE); // 调用者的程序设计有问题 :-)
  109. break;
  110. }
  111. // 执行命令成功返回1, 失败返回0
  112. return (pInfo->result==ER_SUCCESS)? 1:0;
  113. }
  114. // 命令解释函数 — 第二层解释函数
  115. //********************************************************************//
  116. // 操作命令解释函数---解释:CMD_IS_SUPPORT命令
  117. // 查询某个命令是否被支持
  118. void _fnCMD_IS_SUPPORT(INFOSTR *pInfo)
  119. {
  120. // 这个函数是为客户程序查询时使用,如果你实现了对某个命令的
  121. // 解释,可修改相应的case中的设置,使其返回ER_SUCCESS,这就
  122. // 表示你的模块已经支持该命令了。同时,现在的这个文件中已包
  123. // 含了对前四个命令的解释,你只需向还未支持的命令函数中添加
  124. // 代码即可。
  125. ASSERT(pInfo->result == ER_EMPTY);
  126. switch(pInfo->annexdata.cmAnnData)  
  127. {
  128. case CMD_GETPROCTYPE: // 获取本模块能处理的图像类型
  129. pInfo->result = ER_SUCCESS;
  130. break;
  131. case CMD_GETWRITERS: // 获取本模块的作者列表,多人时用逗号分隔
  132. pInfo->result = ER_SUCCESS;
  133. break;
  134. case CMD_GETWRITERMESS: // 获取作者们的留言
  135. pInfo->result = ER_SUCCESS;
  136. break;
  137. case CMD_GETBUILDID: // 获取图像模块内部版本号
  138. pInfo->result = ER_SUCCESS;
  139. break;
  140. case CMD_IS_VALID_FILE: // 判断指定文件是否是有效的WMF文件
  141. pInfo->result = ER_SUCCESS;
  142. break;
  143. case CMD_GET_FILE_INFO: // 获取指定文件的信息
  144. pInfo->result = ER_SUCCESS;
  145. break;
  146. case CMD_LOAD_FROM_FILE: // 从指定图像文件中读取数据
  147. pInfo->result = ER_SUCCESS;
  148. break;
  149. case CMD_SAVE_TO_FILE: // 将数据保存到指定文件中
  150. pInfo->result = ER_NOTSUPPORT;
  151. break;
  152. case CMD_IS_SUPPORT: // 查询某个命令是否被支持
  153. pInfo->result = ER_SUCCESS;
  154. break;
  155. case CMD_RESIZE: // 获取指定尺寸的图像(只适用于矢量图像)
  156. pInfo->result = ER_NOTSUPPORT;
  157. break;
  158. default:
  159. pInfo->result = ER_NOTSUPPORT;
  160. break;
  161. }
  162. }
  163. // 操作命令解释函数---解释:CMD_GETPROCTYPE命令
  164. // 获取本模块能处理的图像类型,如:BMP,PCX等等
  165. void _fnCMD_GETPROCTYPE(INFOSTR *pInfo)
  166. {
  167. // 这是预定义的函数代码,你可以不必修改的使用。
  168. // 根据接口定义,此时附加数据应被清空为0,所以下此断言
  169. ASSERT(pInfo->annexdata.scAnnData[0] == 0);
  170. ASSERT(pInfo->result == ER_EMPTY);
  171. // 复制能处理的类型字符串
  172. ::CopyMemory((PVOID)pInfo->annexdata.scAnnData, (PVOID)ModuleProcessImgType, 
  173. sizeof(ModuleProcessImgType));
  174. pInfo->result = ER_SUCCESS;
  175. }
  176. // 操作命令解释函数---解释:CMD_GETWRITER命令
  177. // 获取本模块的作者列表,多人时用逗号分隔
  178. void _fnCMD_GETWRITERS(INFOSTR *pInfo)
  179. {
  180. // 这是预定义的函数代码,你可以不必修改的使用。
  181. // 根据接口定义,此时附加数据应被清空为0,所以下此断言
  182. ASSERT(pInfo->annexdata.scAnnData[0] == 0);
  183. ASSERT(pInfo->result == ER_EMPTY);
  184. // 复制开发者名单串
  185. ::CopyMemory((PVOID)pInfo->annexdata.scAnnData, (PVOID)WriterList, 
  186. sizeof(WriterList));
  187. pInfo->result = ER_SUCCESS;
  188. }
  189. // 操作命令解释函数---解释:CMD_GETWRITERMESS命令
  190. // 获取作者们的留言
  191. void _fnCMD_GETWRITERMESS(INFOSTR *pInfo)
  192. {
  193. // 这是预定义的函数代码,你可以不必修改的使用。
  194. // 根据接口定义,此时附加数据应被清空为0,所以下此断言
  195. ASSERT(pInfo->annexdata.scAnnData[0] == 0);
  196. ASSERT(pInfo->result == ER_EMPTY);
  197. // 复制开发者们的留言字符串
  198. ::CopyMemory((PVOID)pInfo->annexdata.scAnnData, (PVOID)WriterMess, 
  199. sizeof(WriterMess));
  200. pInfo->result = ER_SUCCESS;
  201. }
  202. // 操作命令解释函数---解释:CMD_GETBUILDID命令
  203. // 获取图像模块内部版本号
  204. void _fnCMD_GETBUILDID(INFOSTR *pInfo)
  205. {
  206. // 这是预定义的函数代码,你可以不必修改的使用。
  207. // 根据接口定义,此时annexdata.dwAnnData应被设为0,所以下此断言
  208. ASSERT(pInfo->annexdata.dwAnnData == 0);
  209. ASSERT(pInfo->result == ER_EMPTY);
  210. // 填写内部版本号码
  211. pInfo->annexdata.dwAnnData = MODULE_BUILDID;
  212. pInfo->result = ER_SUCCESS;
  213. }
  214. // 操作命令解释函数---解释:CMD_SAVE_TO_FILE命令
  215. // 将数据保存到指定文件中
  216. void _fnCMD_SAVE_TO_FILE(INFOSTR *pInfo)
  217. {
  218. // 这个命令不一定要解释,你可以参考本图像格式的具体境况来决定
  219. // 是否解释该命令。
  220. // 如果你想解释该命令,请在下面加入代码,并修改pInfo->result的返回值:
  221. // ----------------------------------------------------------------->
  222. pInfo->result = ER_NOTSUPPORT;
  223. }
  224. // 操作命令解释函数---解释:CMD_RESIZE命令
  225. // 重新获取指定尺寸的图像位数据(只适用于矢量图像)
  226. void _fnCMD_RESIZE(INFOSTR *pInfo)
  227. {
  228. // 这个命令一般的图像读写模块不需要支持,它只适用于矢量图像,
  229. // 比如WMF、EMF之类。
  230. // 如果你想解释该命令,请在下面加入代码,并修改pInfo->result的返回值:
  231. // ----------------------------------------------------------------->
  232. pInfo->result = ER_NOTSUPPORT;
  233. }
  234. // 操作命令解释函数---解释:CMD_IS_VALID_FILE命令
  235. // 判断指定文件是否是有效的TGA文件
  236. void _fnCMD_IS_VALID_FILE(INFOSTR *pInfo)
  237. {
  238. TGAHEADER tgaHeader;
  239. DWORD dwSize;
  240. UINT uRet, uRet2;
  241. CFile file;
  242. // 检验入口参数是否符合接口定义
  243. ASSERT(pInfo->result == ER_EMPTY);
  244. ASSERT(pInfo->annexdata.iAnnData == 0);
  245. ASSERT(::strlen(pInfo->filename));
  246. ASSERT(pInfo->state == PKST_NOTVER);
  247. ASSERT(pInfo);
  248. pInfo->result=ER_SUCCESS;
  249. // 先判断指定的文件是否存在
  250. if (!IsFileExist(pInfo->filename))
  251. pInfo->result = ER_COMMINFOERR;
  252. else
  253. {
  254. // 打开指定文件
  255. if (!file.Open(pInfo->filename, CFile::modeRead))
  256. {
  257. pInfo->result = ER_FILERWERR; // 打开文件时出错
  258. return;
  259. }
  260. // 获取TGA文件的长度(以字节为单位)
  261. dwSize = file.GetLength();
  262. // 用长度判断
  263. if (dwSize < sizeof(TGAHEADER))
  264. {
  265. // 这不是一个TGA文件,TGA文件的长度起码大于文件头
  266. // 加信息头结构的长度
  267. pInfo->result=ER_BADIMAGE;
  268. file.Close();
  269. return;
  270. }
  271. // 读取TGA的文件头结构,并检查它的有效性
  272. file.SeekToBegin();
  273. uRet  = file.Read(&tgaHeader, sizeof(TGAHEADER));
  274. uRet2=file.Seek(tgaHeader.bID_Length,CFile::current);
  275. if ((uRet != sizeof(TGAHEADER))||(uRet2!=sizeof(TGAHEADER)+tgaHeader.bID_Length))
  276. {
  277. pInfo->result = ER_BADIMAGE; // 读文件时出错
  278. file.Close();
  279. return;
  280. }
  281. // 判断文件头的图象类型标志
  282. switch(tgaHeader.bImageType)
  283. {
  284. case TGA_NULL:
  285. case TGA_RLEPAL:
  286. case TGA_RLECOLOR:
  287. case TGA_RLEGRAY:
  288. break;
  289. case TGA_UNCPSPAL:
  290. case TGA_UNCPSCOLOR:
  291. case TGA_UNCPSGRAY:
  292. if(file.GetLength()<sizeof(TGAHEADER)+tgaHeader.bID_Length+((tgaHeader.bBits+7)>>3)*tgaHeader.wDepth*tgaHeader.wWidth+tgaHeader.wPalLength*((tgaHeader.bPalBits+7)>>3))
  293. {
  294. TRACE("File length:%d",file.GetLength());
  295. TRACE("nDesired Length:%d",sizeof(TGAHEADER)+tgaHeader.bID_Length+((tgaHeader.bBits+7)>>3)*tgaHeader.wDepth*tgaHeader.wWidth+tgaHeader.wPalLength*((tgaHeader.bPalBits+7)>>3));
  296. file.Close();
  297. pInfo->result=ER_BADIMAGE;
  298. return;
  299. }
  300. break;
  301. default: //未知文件类型
  302. file.Close();
  303. pInfo->result=ER_BADIMAGE;
  304. return;
  305. }
  306. //因为TGA可能采用压缩算法
  307. //或者有附加信息
  308. //所以判断文件总长和应有长度基本上无意义
  309. // 到此,大致可以表明该文件是一个有效的TGA文件,iAnnData变量设为1
  310. pInfo->annexdata.iAnnData = 1;
  311. pInfo->state = PKST_PASSVER; // 表示通过校验
  312. file.Close();
  313. }//End else
  314. }
  315. // 操作命令解释函数---解释:CMD_GET_FILE_INFO命令
  316. // 获取指定文件的信息
  317. void _fnCMD_GET_FILE_INFO(INFOSTR *pInfo)
  318. {
  319. CFile file;
  320. CFileStatus status;
  321. UINT uRet;
  322. TGAHEADER tgaHeader;
  323. // 检验入口参数是否符合接口定义
  324. ASSERT(pInfo->result == ER_EMPTY);
  325. ASSERT(::strlen(pInfo->filename));
  326. // 此时,该文件必需是一个已存在的、并且是有效的BMP文件
  327. ASSERT(pInfo->state == PKST_PASSVER);
  328. // 客户模块必需要先将imginfo清空为0
  329. ASSERT(pInfo->imginfo.imgtype == IMT_NULL);
  330. // 打开指定文件
  331. if (!file.Open(pInfo->filename, CFile::modeRead))
  332. {
  333. pInfo->result = ER_FILERWERR;
  334. return;
  335. }
  336. // 读取TGA的文件头结构
  337. file.SeekToBegin();
  338. uRet  = file.Read((LPSTR)&tgaHeader, sizeof(TGAHEADER));
  339. if (uRet != sizeof(TGAHEADER))
  340. {
  341. file.Close();
  342. pInfo->result = ER_FILERWERR;
  343. return;
  344. }
  345. LPIMAGEINFOSTR lpImgInfoStr = &pInfo->imginfo;
  346. // 获取文件的长度、图像的宽度、高度等信息
  347. lpImgInfoStr->imgtype = IMT_RESSTATIC;
  348. lpImgInfoStr->imgformat = IMF_TGA;
  349. lpImgInfoStr->filesize = file.GetLength();
  350. lpImgInfoStr->width = tgaHeader.wWidth;
  351. // 图像的高度值有时可能是负值,所以使用了abs()函数
  352. lpImgInfoStr->height = (DWORD)::abs(tgaHeader.wDepth);
  353. lpImgInfoStr->bitcount = (DWORD)tgaHeader.bBits;
  354. switch(tgaHeader.bImageType)
  355. {
  356. case TGA_NULL:
  357. file.Close();
  358. pInfo->result=ER_BADIMAGE;
  359. return;
  360. case TGA_UNCPSPAL:
  361. case TGA_UNCPSCOLOR:
  362. case TGA_UNCPSGRAY:
  363. lpImgInfoStr->compression=ICS_RGB;
  364. break;
  365. case TGA_RLEPAL:
  366. case TGA_RLECOLOR:
  367. case TGA_RLEGRAY:
  368. switch(tgaHeader.bBits)
  369. {
  370. case 8:
  371. lpImgInfoStr->compression=ICS_RLE8;
  372. break;
  373. case 15:
  374. case 16:
  375. lpImgInfoStr->compression=ICS_RLE16;
  376. break;
  377. case 24:
  378. lpImgInfoStr->compression=ICS_RLE24;
  379. break;
  380. case 32:
  381. lpImgInfoStr->compression=ICS_RLE32;
  382. break;
  383. default:
  384. file.Close();
  385. pInfo->result=ER_BADIMAGE;
  386. return;
  387. }
  388. break;
  389. default:
  390. file.Close();
  391. pInfo->result=ER_BADIMAGE;
  392. return;
  393. }
  394. // 每一图像行所占的字节数(DWORD对齐,并且只对非压缩位图有效)
  395. lpImgInfoStr->linesize = DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*tgaHeader.bBits);
  396. lpImgInfoStr->imgnumbers = 1; // TGA文件中只有一个图像
  397. //应当还有原始图象缩图(Postage Stamp)
  398. //但晓月儿还未遇见实例
  399. lpImgInfoStr->imgchang = 0; // 表示可以被编辑
  400. // 获取文件最后的修改日期(月在高字节,日在低字节)
  401. file.GetStatus(status);
  402. lpImgInfoStr->year = (WORD)status.m_mtime.GetYear();
  403. lpImgInfoStr->monday = (WORD)status.m_mtime.GetMonth();
  404. lpImgInfoStr->monday <<= 8;
  405. lpImgInfoStr->monday |= (WORD)status.m_mtime.GetDay();
  406. // 获取文件最后的修改时间(字序:最高—0, 2—时,1—分,0—秒)
  407. lpImgInfoStr->time = status.m_mtime.GetHour();
  408. lpImgInfoStr->time <<= 8;
  409. lpImgInfoStr->time |= status.m_mtime.GetMinute();
  410. lpImgInfoStr->time <<= 8;
  411. lpImgInfoStr->time |= status.m_mtime.GetSecond();
  412. lpImgInfoStr->time &= 0xffffff;
  413. file.Close();
  414. // 设置出口数据
  415. pInfo->state = PKST_PASSINFO;
  416. pInfo->result = ER_SUCCESS;
  417. }
  418. BOOL IsFileExist(char *lpFileName)
  419. {
  420. CFile file;
  421. BOOL bExist = FALSE; // 文件存在是TRUE,不存在是FALSE
  422. CFileException e;
  423. // 确定指定的文件是否存在
  424. if (file.Open(lpFileName, CFile::modeReadWrite|CFile::shareDenyNone, &e))
  425. {
  426. bExist = TRUE;
  427. file.Close();
  428. }
  429. else
  430. {
  431. // 可能有其他程序正在处理此文件
  432. switch(e.m_cause)
  433. {
  434. case CFileException::tooManyOpenFiles:
  435. case CFileException::accessDenied:
  436. case CFileException::sharingViolation:
  437. case CFileException::lockViolation:
  438. return TRUE;
  439. case CFileException::fileNotFound:
  440. case CFileException::badPath:
  441. case CFileException::invalidFile:
  442. case CFileException::hardIO:
  443. default:
  444. return FALSE;
  445. }
  446. }
  447. return bExist;
  448. }
  449. // 操作命令解释函数---解释:CMD_LOAD_FROM_FILE命令
  450. // 从指定图像文件中读取数据
  451. void _fnCMD_LOAD_FROM_FILE(INFOSTR *pInfo)
  452. {
  453. // 检验入口参数是否符合接口定义
  454. ASSERT(pInfo->result == ER_EMPTY);
  455. ASSERT(::strlen(pInfo->filename));
  456. // 此时,该文件必需是一个已存在的、有效的TGA文件,并且数据包中
  457. // 含有该文件的信息(imginfo结构中)
  458. ASSERT(pInfo->state == PKST_PASSINFO);
  459. ASSERT(pInfo->imginfo.imgformat == IMF_TGA);
  460. ASSERT(pInfo->pImgInfo == NULL);
  461. // 必需设置标准图像格式信息
  462. ASSERT(pInfo->sDIBInfo.bmi.biSize == sizeof(BITMAPINFOHEADER));
  463. ASSERT(pInfo->pLineAddr != NULL);
  464. ASSERT(pInfo->_pbdata != NULL);
  465. CFile file;
  466. if (pInfo->fpProgress)
  467. {
  468. if ((*pInfo->fpProgress)(RWPROGRESSSIZE, 6))
  469. { // 如果进度函数返回1,则说明用户想中断操作,返回。
  470. pInfo->result = ER_USERBREAK;
  471. return;
  472. }
  473. }
  474. // 打开指定文件
  475. if (!file.Open(pInfo->filename, CFile::modeRead))
  476. {
  477. pInfo->result = ER_FILERWERR;
  478. return;
  479. }
  480. file.Seek(0, CFile::begin);
  481. // 读取并转换图像到数据包中
  482. if (_Read(file, pInfo) == 0)
  483. {
  484. // 成功
  485. pInfo->state = PKST_INFOANDBITS;
  486. pInfo->modify = 0;
  487. pInfo->result = ER_SUCCESS;
  488. }
  489. file.Close();
  490. if (pInfo->fpProgress) // 结束进度条,此调用不再支持用户中断
  491. (*pInfo->fpProgress)(RWPROGRESSSIZE, RWPROGRESSSIZE);
  492. }
  493. int _Read(CFile& file, LPINFOSTR pInfo)
  494. {
  495. DWORD dwSize, dwRet;
  496. UINT uRet,uRet1;
  497. /******************************/
  498. TGAHEADER tgaHeader;
  499. BYTE pPal[768];
  500. PBYTE pTempPal,pImage;
  501. WORD wPalLen=0;//调色板长度(In Byte)
  502. DWORD dwOffBits;
  503. BOOL bGray;
  504. /* 读取TGA的文件头结构 */
  505. file.SeekToBegin();
  506. uRet = file.Read(&tgaHeader, sizeof(TGAHEADER));
  507. uRet1 = file.Seek(tgaHeader.bID_Length,CFile::current);
  508. if ((uRet != sizeof(TGAHEADER))||uRet1!=uRet+tgaHeader.bID_Length)
  509. {
  510. pInfo->result = ER_FILERWERR;
  511. return 1; // 读文件时出错
  512. }
  513. bGray=(tgaHeader.bImageType==TGA_UNCPSGRAY||tgaHeader.bImageType==TGA_RLEGRAY)?TRUE:FALSE;//判断灰度图象
  514. memset(pPal,0,sizeof(pPal));
  515. // pPal将包含调色板信息(如果有的话)
  516. if(tgaHeader.bPalType||tgaHeader.bImageType==TGA_UNCPSPAL||tgaHeader.bImageType==TGA_RLEPAL)
  517. {
  518. wPalLen=tgaHeader.wPalLength*((tgaHeader.bPalBits+7)>>3);
  519. pTempPal = (PBYTE)::GlobalAlloc(GPTR, wPalLen);
  520. if (pTempPal == NULL)
  521. {
  522. pInfo->result = ER_MEMORYERR;
  523. return 2; // 内存不足
  524. }
  525. // 读取位图文件的原始信息
  526. uRet = file.Read(pTempPal, wPalLen);
  527. if (uRet != wPalLen)
  528. {
  529. ::GlobalFree(pTempPal);
  530. pInfo->result = ER_FILERWERR;
  531. return 1;
  532. }
  533. int i,fstIndex=tgaHeader.wPalFirstNdx*3;
  534. WORD wPalEntry;
  535. switch(tgaHeader.bPalBits)
  536. {
  537. case 15:
  538. case 16:
  539. for(i=0;i<wPalLen;i+=2)
  540. {
  541. wPalEntry=*((WORD*)(pTempPal+i));
  542. pPal[fstIndex++]=(wPalEntry&0x1f)<<3;
  543. pPal[fstIndex++]=((wPalEntry>>5)&0x1f)<<3;
  544. pPal[fstIndex++]=((wPalEntry>>10)&0x1f)<<3;
  545. }
  546. break;
  547. case 24:
  548. memcpy(pPal+fstIndex,pTempPal,wPalLen);
  549. break;
  550. case 32:
  551. for(i=0;i<wPalLen;i+=4,fstIndex+=3)
  552. memcpy(pPal+fstIndex,pTempPal+i,3);
  553. break;
  554. default:
  555. ::GlobalFree(pTempPal);
  556. pInfo->result=ER_BADIMAGE;
  557. return -1;
  558. break;
  559. }
  560. ::GlobalFree(pTempPal);
  561. }//End 读取调色板
  562. else
  563. if(bGray)//灰度
  564. {
  565. for(int i=0;i<256;i++)
  566. memset(pPal+i*3,(char)i,3);
  567. }
  568. // 获取文件长度
  569. dwSize = file.GetLength();
  570. dwOffBits=sizeof(TGAHEADER)+tgaHeader.bID_Length+wPalLen;
  571. // 分配内存,用于存放位数据
  572. pImage = (PBYTE)::GlobalAlloc(GPTR, dwSize-dwOffBits);
  573. if (!pImage)
  574. {
  575. pInfo->result = ER_MEMORYERR;
  576. return 2; // 内存不足
  577. }
  578. // 读取位数据
  579. file.Seek(dwOffBits, CFile::begin);
  580. dwRet = file.ReadHuge((void*)pImage,dwSize-dwOffBits);
  581. if (dwRet != (dwSize-dwOffBits))//还应判断是否小于最小字节数
  582. {
  583. ::GlobalFree(pImage);
  584. pInfo->result = ER_FILERWERR;
  585. return 1;
  586. }
  587. int result = 0; // 接收各函数的返回值
  588. // 根据位图文件的位深度的不同而调用相应的读取函数
  589. switch(tgaHeader.bImageType)
  590. {
  591. case TGA_UNCPSPAL:
  592. case TGA_UNCPSGRAY:
  593. switch(tgaHeader.bBits)
  594. {
  595. case 8:
  596. result = _from_8_PAL_read(pInfo, pImage,tgaHeader, pPal);
  597. break;
  598. default: //使用调色板的位图索引一般只有8位
  599. result=-1;
  600. break;
  601. }
  602. break;
  603. case TGA_UNCPSCOLOR:
  604. switch(tgaHeader.bBits)
  605. {
  606. case 15:
  607. case 16:
  608. result=_from_15_16_COLOR_read(pInfo,pImage,tgaHeader);
  609. break;
  610. case 24:
  611. result=_from_24_COLOR_read(pInfo,pImage,tgaHeader);
  612. break;
  613. case 32:
  614. result=_from_32_COLOR_read(pInfo,pImage,tgaHeader);
  615. break;
  616. default:
  617. result=-1;//全彩图象素位长应当只有 15,16,24,32几种
  618. break;
  619. }
  620. break;
  621. case TGA_RLEGRAY:
  622. case TGA_RLEPAL:
  623. switch(tgaHeader.bBits)
  624. {
  625. case 8:
  626. result=_from_8_RLE_PAL_read(pInfo,pImage,tgaHeader,pPal);
  627. break;
  628. default:
  629. result=-1;
  630. break;
  631. }
  632. break;
  633. case TGA_RLECOLOR:
  634. switch(tgaHeader.bBits)
  635. {
  636. case 15:
  637. case 16:
  638. result=_from_15_16_RLE_COLOR_read(pInfo,pImage,tgaHeader);
  639. break;
  640. case 24:
  641. result=_from_24_RLE_COLOR_read(pInfo,pImage,tgaHeader);
  642. break;
  643. case 32:
  644. result=_from_32_RLE_COLOR_read(pInfo,pImage,tgaHeader);
  645. break;
  646. default:
  647. result=-1;//全彩图象素位长应当只有 15,16,24,32几种
  648. break;
  649. }
  650. break;
  651. default:
  652. result=-1;
  653. break; // 图像文件格式异常
  654. }
  655. // 释放从文件中读取的位数据(此数据已被转换并保存到了数据包中)
  656. ::GlobalFree(pImage);
  657. if (result == 0) // 执行成功
  658. {
  659. pInfo->result = ER_SUCCESS;
  660. }
  661. else
  662. {
  663. if(pInfo->result==ER_EMPTY)//没有调用read函数
  664. pInfo->result=ER_BADIMAGE;//文件格式非法
  665. pInfo->pImgInfo = NULL;
  666. return 4; // 执行过程中产生的错误,详见pInfo->result
  667. }
  668. return 0;
  669. }
  670. int _from_8_PAL_read(LPINFOSTR pInfo, PBYTE lpSrc, const TGAHEADER& tgaHeader, const LPBYTE pPal)//Passed
  671. {
  672. ASSERT(pInfo);
  673. ASSERT(lpSrc);
  674. ASSERT(tgaHeader.bBits==8);//前提
  675. ASSERT(pPal);
  676. LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
  677. WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*8);
  678. DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
  679. LPBYTE pSrcBuf,pDest24;
  680. LPWORD pDest16;
  681. DESFORMAT fmt=::_get_desformat(pInfo);
  682. int iRow,iCol;
  683. switch(fmt)
  684. {
  685. case DF_32:
  686. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  687. {
  688. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  689. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  690. else
  691. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  692. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  693. {
  694. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  695. memcpy(pDestLineAddr[iRow]+iCol,pPal+pSrcBuf[pBmpInfo->biWidth-1-iCol]*3,3);
  696. else
  697. memcpy(pDestLineAddr[iRow]+iCol,pPal+pSrcBuf[iCol]*3,3);
  698. }
  699. }
  700. break;
  701. case DF_24:
  702. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  703. {
  704. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  705. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  706. else
  707. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  708. pDest24=(LPBYTE)pDestLineAddr[iRow];
  709. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  710. {
  711. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  712. memcpy(pDest24+iCol*3,pPal+pSrcBuf[pBmpInfo->biWidth-1-iCol]*3,3);
  713. else
  714. memcpy(pDest24+iCol*3,pPal+pSrcBuf[iCol]*3,3);
  715. }
  716. }
  717. break;
  718. case DF_16_555:
  719. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  720. {
  721. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  722. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  723. else
  724. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  725. pDest16=(LPWORD)pDestLineAddr[iRow];
  726. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  727. {
  728. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  729. 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]);
  730. else
  731. pDest16[iCol]=::_cnv_rgb_to_555(pPal[pSrcBuf[iCol]*3+2],pPal[pSrcBuf[iCol]*3+1],pPal[pSrcBuf[iCol]*3]);
  732. }
  733. }
  734. break;
  735. case DF_16_565:
  736. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  737. {
  738. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  739. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  740. else
  741. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  742. pDest16=(LPWORD)pDestLineAddr[iRow];
  743. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  744. {
  745. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  746. 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]);
  747. else
  748. pDest16[iCol]=::_cnv_rgb_to_565(pPal[pSrcBuf[iCol]*3+2],pPal[pSrcBuf[iCol]*3+1],pPal[pSrcBuf[iCol]*3]);
  749. }
  750. }
  751. break;
  752. case DF_NULL:
  753. default:
  754. ASSERT(FALSE);
  755. pInfo->result = ER_ILLCOMM;
  756. return -1;
  757. break;
  758. }
  759. return 0;
  760. }
  761. int _from_15_16_COLOR_read(LPINFOSTR pInfo, PBYTE lpSrc, const TGAHEADER& tgaHeader)//Passed
  762. {
  763. ASSERT(pInfo);
  764. ASSERT(lpSrc);
  765. ASSERT(tgaHeader.bBits==15||tgaHeader.bBits==16);//前提
  766. LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
  767. WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*16);
  768. DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
  769. LPBYTE pSrcBuf,pDest24;
  770. BYTE bB,bG,bR;
  771. WORD wTempCol;
  772. LPWORD pDest16;
  773. DESFORMAT fmt=::_get_desformat(pInfo);
  774. int iRow,iCol;
  775. switch(fmt)
  776. {
  777. case DF_32:
  778. //应该先将目标数据区清零否??
  779. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  780. {
  781. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  782. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  783. else
  784. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  785. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  786. {
  787. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  788. wTempCol=*((WORD*)(pSrcBuf+(pBmpInfo->biWidth-1-iCol)*2));
  789. else
  790. wTempCol=*((WORD*)(pSrcBuf+iCol*2));
  791. bB=(wTempCol&0x1f)<<3;
  792. bG=((wTempCol>>5)&0x1f)<<3;
  793. bR=((wTempCol>>10)&0x1f)<<3;
  794. pDestLineAddr[iRow][iCol]=BGR(bB,bG,bR);
  795. }
  796. }
  797. break;
  798. case DF_24:
  799. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  800. {
  801. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  802. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  803. else
  804. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  805. pDest24=(LPBYTE)pDestLineAddr[iRow];
  806. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  807. {
  808. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  809. wTempCol=*((WORD*)(pSrcBuf+(pBmpInfo->biWidth-1-iCol)*2));
  810. else
  811. wTempCol=*((WORD*)(pSrcBuf+iCol*2));
  812. pDest24[iCol*3]=(wTempCol&0x1f)<<3;
  813. pDest24[iCol*3+1]=((wTempCol>>5)&0x1f)<<3;
  814. pDest24[iCol*3+2]=((wTempCol>>10)&0x1f)<<3;
  815. }
  816. }
  817. break;
  818. case DF_16_555:
  819. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  820. {
  821. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  822. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  823. else
  824. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  825. pDest16=(LPWORD)pDestLineAddr[iRow];
  826. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  827. {
  828. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  829. pDest16[iCol]=*((WORD*)(pSrcBuf+(pBmpInfo->biWidth-1-iCol)*2));
  830. else
  831. pDest16[iCol]=*((WORD*)(pSrcBuf+iCol*2));
  832. }
  833. }
  834. break;
  835. case DF_16_565:
  836. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  837. {
  838. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  839. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  840. else
  841. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  842. pDest16=(LPWORD)pDestLineAddr[iRow];
  843. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  844. {
  845. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  846. wTempCol=*((WORD*)(pSrcBuf+(pBmpInfo->biWidth-1-iCol)*2));
  847. else
  848. wTempCol=*((WORD*)(pSrcBuf+iCol*2));
  849. bB=(wTempCol&0x1f)<<3;
  850. bG=((wTempCol>>5)&0x1f)<<3;
  851. bR=((wTempCol>>10)&0x1f)<<3;
  852. pDest16[iCol]=::_cnv_rgb_to_565(bR,bG,bB);
  853. }
  854. }
  855. break;
  856. case DF_NULL:
  857. default:
  858. ASSERT(FALSE);
  859. pInfo->result = ER_ILLCOMM;
  860. return -1;
  861. break;
  862. }
  863. return 0;
  864. }
  865. int _from_24_COLOR_read(LPINFOSTR pInfo, PBYTE lpSrc, const TGAHEADER& tgaHeader)//Passed
  866. {
  867. ASSERT(pInfo);
  868. ASSERT(lpSrc);
  869. ASSERT(tgaHeader.bBits==24);//前提
  870. LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
  871. WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*24);
  872. DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
  873. LPBYTE pSrcBuf;
  874. DESFORMAT fmt=::_get_desformat(pInfo);
  875. int iRow,iCol;
  876. LPBYTE pDest24;
  877. LPWORD pDest16;
  878. switch(fmt)
  879. {
  880. case DF_32:
  881. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  882. {
  883. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  884. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  885. else
  886. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  887. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  888. {
  889. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  890. memcpy(pDestLineAddr[iRow]+iCol,pSrcBuf+(pBmpInfo->biWidth-1-iCol)*3,3);
  891. else
  892. memcpy(pDestLineAddr[iRow]+iCol,pSrcBuf+iCol*3,3);
  893. }
  894. }
  895. break;
  896. case DF_24:
  897. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  898. {
  899. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  900. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  901. else
  902. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  903. pDest24=(LPBYTE)pDestLineAddr[iRow];
  904. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  905. {
  906. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  907. memcpy(pDest24+iCol*3,pSrcBuf+(pBmpInfo->biWidth-1-iCol)*3,3);
  908. else
  909. memcpy(pDest24+iCol*3,pSrcBuf+iCol*3,3);
  910. }
  911. }
  912. break;
  913. case DF_16_555:
  914. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  915. {
  916. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  917. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  918. else
  919. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  920. pDest16=(LPWORD)pDestLineAddr[iRow];
  921. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  922. {
  923. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  924. 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]);
  925. else
  926. pDest16[iCol]=::_cnv_rgb_to_555(pSrcBuf[iCol*3+2],pSrcBuf[iCol*3+1],pSrcBuf[iCol*3]);
  927. }
  928. }
  929. break;
  930. case DF_16_565:
  931. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  932. {
  933. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  934. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  935. else
  936. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  937. pDest16=(LPWORD)pDestLineAddr[iRow];
  938. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  939. {
  940. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  941. 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]);
  942. else
  943. pDest16[iCol]=::_cnv_rgb_to_565(pSrcBuf[iCol*3+2],pSrcBuf[iCol*3+1],pSrcBuf[iCol*3]);
  944. }
  945. }
  946. break;
  947. case DF_NULL:
  948. default:
  949. ASSERT(FALSE);
  950. pInfo->result = ER_ILLCOMM;
  951. return -1;
  952. break;
  953. }
  954. return 0;
  955. }
  956. int _from_32_COLOR_read(LPINFOSTR pInfo, PBYTE lpSrc, const TGAHEADER& tgaHeader)//Passed
  957. {
  958. ASSERT(pInfo);
  959. ASSERT(lpSrc);
  960. ASSERT(tgaHeader.bBits==32);//前提
  961. LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
  962. WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*32);
  963. DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
  964. LPBYTE pSrcBuf;
  965. DESFORMAT fmt=::_get_desformat(pInfo);
  966. int iRow,iCol;
  967. LPBYTE pDest24;
  968. LPWORD pDest16;
  969. //应该先将目标数据区清零否??
  970. switch(fmt)
  971. {
  972. case DF_32:
  973. for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  974. {
  975. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  976. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  977. else
  978. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  979. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  980. {
  981. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  982. memcpy(pDestLineAddr[iRow]+iCol,pSrcBuf+(pBmpInfo->biWidth-1-iCol)*4,3);
  983. else
  984. memcpy(pDestLineAddr[iRow]+iCol,pSrcBuf+iCol*4,3);
  985. }
  986. }
  987. break;
  988. case DF_24:
  989. for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  990. {
  991. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  992. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  993. else
  994. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  995. pDest24=(LPBYTE)pDestLineAddr[iRow];
  996. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  997. {
  998. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  999. memcpy(pDest24+iCol*3,pSrcBuf+(pBmpInfo->biWidth-1-iCol)*4,3);
  1000. else
  1001. memcpy(pDest24+iCol*3,pSrcBuf+iCol*4,3);
  1002. }
  1003. }
  1004. break;
  1005. case DF_16_555:
  1006. for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1007. {
  1008. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  1009. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  1010. else
  1011. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  1012. pDest16=(LPWORD)pDestLineAddr[iRow];
  1013. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1014. {
  1015. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1016. 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]);
  1017. else
  1018. pDest16[iCol]=::_cnv_rgb_to_555(pSrcBuf[iCol*4+2],pSrcBuf[iCol*4+1],pSrcBuf[iCol*4]);
  1019. }
  1020. }
  1021. break;
  1022. case DF_16_565:
  1023. for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1024. {
  1025. if(tgaHeader.bDescriptor&TGA_VERTMIRROR) //上下倒置
  1026. pSrcBuf=lpSrc+wSrcBytesPerLine*iRow;
  1027. else
  1028. pSrcBuf=lpSrc+wSrcBytesPerLine*(pBmpInfo->biHeight-1-iRow);
  1029. pDest16=(LPWORD)pDestLineAddr[iRow];
  1030. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1031. {
  1032. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1033. 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]);
  1034. else
  1035. pDest16[iCol]=::_cnv_rgb_to_565(pSrcBuf[iCol*4+2],pSrcBuf[iCol*4+1],pSrcBuf[iCol*4]);
  1036. }
  1037. }
  1038. break;
  1039. case DF_NULL:
  1040. default:
  1041. ASSERT(FALSE);
  1042. pInfo->result = ER_ILLCOMM;
  1043. return -1;
  1044. break;
  1045. }
  1046. return 0;
  1047. }
  1048. //行解压
  1049. int DecodingLine(BYTE *pDest,BYTE* pSrc,int rleunit,int destlen)//返回pDest实际解压字节数
  1050. {
  1051. ASSERT(pSrc);
  1052. ASSERT(pDest);
  1053. int iCol,nCount;
  1054. BYTE *pDestEnd=pDest+destlen,*pSrcOrg=pSrc,*pDestOrg=pDest;
  1055. for(;pDest<pDestEnd;)
  1056. {
  1057. if(pSrc[0]&0x80)
  1058. {
  1059. nCount=(pSrc[0]&0x7F)+1;
  1060. pSrc++;
  1061. for(iCol=0;iCol<nCount;iCol++)
  1062. {
  1063. memcpy(pDest,pSrc,rleunit);
  1064. pDest+=rleunit;
  1065. }
  1066. pSrc+=rleunit;
  1067. }
  1068. else
  1069. {
  1070. nCount=(pSrc[0]&0x7F)+1;
  1071. pSrc++;
  1072. memcpy(pDest,pSrc,nCount*rleunit);
  1073. pDest+=nCount*rleunit;
  1074. pSrc+=nCount*rleunit;
  1075. }
  1076. }
  1077. #ifdef _OVERCHECK
  1078. if(pDest-pDestOrg!=destlen)
  1079. return -1;
  1080. #endif
  1081. return pSrc-pSrcOrg;
  1082. }
  1083. //解压缩最后还应判断数据是否越界(即被解出之数据量大于原数据)
  1084. int _from_8_RLE_PAL_read(LPINFOSTR pInfo, PBYTE lpSrc, const TGAHEADER& tgaHeader, const LPBYTE pPal)//Passed
  1085. {
  1086. ASSERT(pInfo);
  1087. ASSERT(lpSrc);
  1088. ASSERT(tgaHeader.bBits==8);//前提
  1089. ASSERT(pPal);
  1090. LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
  1091. WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*8);
  1092. DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
  1093. LPBYTE pTempBuf;//解压缓存
  1094. int iDecoded;
  1095. pTempBuf=(LPBYTE)::GlobalAlloc(GPTR,wSrcBytesPerLine+128*1);
  1096. if(!pTempBuf)
  1097. {
  1098. pInfo->result=ER_MEMORYERR;
  1099. return -1;
  1100. }
  1101. LPBYTE pDest24;
  1102. LPWORD pDest16;
  1103. DESFORMAT fmt=::_get_desformat(pInfo);
  1104. int iRow,iCol;
  1105. switch(fmt)
  1106. {
  1107. case DF_32:
  1108. //应该先将目标数据区清零否??
  1109. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1110. {
  1111. iDecoded=::DecodingLine(pTempBuf,lpSrc,1,wSrcBytesPerLine);
  1112. if(iDecoded==-1)
  1113. {
  1114. GlobalFree(pTempBuf);
  1115. pInfo->result=ER_BADIMAGE;
  1116. return -1;
  1117. }
  1118. lpSrc+=iDecoded;
  1119. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1120. {
  1121. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1122. {
  1123. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)//上下倒置
  1124. memcpy(pDestLineAddr[iRow]+iCol,pPal+pTempBuf[pBmpInfo->biWidth-1-iCol]*3,3);
  1125. else
  1126. memcpy(pDestLineAddr[pBmpInfo->biHeight-1-iRow]+iCol,pPal+pTempBuf[pBmpInfo->biWidth-1-iCol]*3,3);
  1127. }
  1128. else
  1129. {
  1130. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)//上下倒置
  1131. memcpy(pDestLineAddr[iRow]+iCol,pPal+pTempBuf[iCol]*3,3);
  1132. else
  1133. memcpy(pDestLineAddr[pBmpInfo->biHeight-1-iRow]+iCol,pPal+pTempBuf[iCol]*3,3);
  1134. }
  1135. }
  1136. }
  1137. break;
  1138. case DF_24:
  1139. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1140. {
  1141. iDecoded=::DecodingLine(pTempBuf,lpSrc,1,wSrcBytesPerLine);
  1142. if(iDecoded==-1)
  1143. {
  1144. GlobalFree(pTempBuf);
  1145. pInfo->result=ER_BADIMAGE;
  1146. return -1;
  1147. }
  1148. lpSrc+=iDecoded;
  1149. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
  1150. pDest24=(LPBYTE)pDestLineAddr[iRow];
  1151. else
  1152. pDest24=(LPBYTE)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
  1153. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1154. {
  1155. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1156. memcpy(pDest24+iCol*3,pPal+pTempBuf[pBmpInfo->biWidth-1-iCol]*3,3);
  1157. else
  1158. memcpy(pDest24+iCol*3,pPal+pTempBuf[iCol]*3,3);
  1159. }
  1160. }
  1161. break;
  1162. case DF_16_555:
  1163. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1164. {
  1165. iDecoded=::DecodingLine(pTempBuf,lpSrc,1,wSrcBytesPerLine);
  1166. if(iDecoded==-1)
  1167. {
  1168. GlobalFree(pTempBuf);
  1169. pInfo->result=ER_BADIMAGE;
  1170. return -1;
  1171. }
  1172. lpSrc+=iDecoded;
  1173. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
  1174. pDest16=(LPWORD)pDestLineAddr[iRow];
  1175. else
  1176. pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
  1177. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1178. {
  1179. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1180. 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]);
  1181. else
  1182. pDest16[iCol]=::_cnv_rgb_to_555(pPal[pTempBuf[iCol]*3+2],pPal[pTempBuf[iCol]*3+1],pPal[pTempBuf[iCol]*3]);
  1183. }
  1184. }
  1185. break;
  1186. case DF_16_565:
  1187. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1188. {
  1189. iDecoded=::DecodingLine(pTempBuf,lpSrc,1,wSrcBytesPerLine);
  1190. if(iDecoded==-1)
  1191. {
  1192. GlobalFree(pTempBuf);
  1193. pInfo->result=ER_BADIMAGE;
  1194. return -1;
  1195. }
  1196. lpSrc+=iDecoded;
  1197. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
  1198. pDest16=(LPWORD)pDestLineAddr[iRow];
  1199. else
  1200. pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
  1201. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1202. {
  1203. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1204. 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]);
  1205. else
  1206. pDest16[iCol]=::_cnv_rgb_to_565(pPal[pTempBuf[iCol]*3+2],pPal[pTempBuf[iCol]*3+1],pPal[pTempBuf[iCol]*3]);
  1207. }
  1208. }
  1209. break;
  1210. case DF_NULL:
  1211. default:
  1212. ::GlobalFree(pTempBuf);
  1213. ASSERT(FALSE);
  1214. pInfo->result = ER_ILLCOMM;
  1215. return -1;
  1216. break;
  1217. }
  1218. ::GlobalFree(pTempBuf);
  1219. return 0;
  1220. }
  1221. int _from_15_16_RLE_COLOR_read(LPINFOSTR pInfo,PBYTE lpSrc,const TGAHEADER& tgaHeader)//Passed
  1222. {
  1223. ASSERT(pInfo);
  1224. ASSERT(lpSrc);
  1225. ASSERT(tgaHeader.bBits==15||tgaHeader.bBits==16);//前提
  1226. LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
  1227. WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*16);
  1228. DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
  1229. LPBYTE pTempBuf;//解压缓存
  1230. int iDecoded;
  1231. BYTE bB,bG,bR;
  1232. WORD wTempCol;
  1233. pTempBuf=(LPBYTE)::GlobalAlloc(GPTR,wSrcBytesPerLine+128*((tgaHeader.bBits+7)/8));
  1234. if(!pTempBuf)
  1235. {
  1236. pInfo->result=ER_MEMORYERR;
  1237. return -1;
  1238. }
  1239. LPBYTE pDest24;
  1240. LPWORD pDest16;
  1241. DESFORMAT fmt=::_get_desformat(pInfo);
  1242. int iRow,iCol;
  1243. //应该先将目标数据区清零否??
  1244. switch(fmt)
  1245. {
  1246. case DF_32:
  1247. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1248. {
  1249. iDecoded=::DecodingLine(pTempBuf,lpSrc,2,wSrcBytesPerLine);
  1250. if(iDecoded==-1)
  1251. {
  1252. GlobalFree(pTempBuf);
  1253. pInfo->result=ER_BADIMAGE;
  1254. return -1;
  1255. }
  1256. lpSrc+=iDecoded;
  1257. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1258. {
  1259. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1260. wTempCol=*((WORD*)(pTempBuf+(pBmpInfo->biWidth-1-iCol)*2));
  1261. else
  1262. wTempCol=*((WORD*)(pTempBuf+iCol*2));
  1263. bB=(wTempCol&0x1f)<<3;
  1264. bG=((wTempCol>>5)&0x1f)<<3;
  1265. bR=((wTempCol>>10)&0x1f)<<3;
  1266. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)//上下倒置
  1267. pDestLineAddr[iRow][iCol]=BGR(bB,bG,bR);
  1268. else
  1269. pDestLineAddr[pBmpInfo->biHeight-iRow-1][iCol]=BGR(bB,bG,bR);
  1270. }
  1271. }
  1272. break;
  1273. case DF_24:
  1274. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1275. {
  1276. iDecoded=::DecodingLine(pTempBuf,lpSrc,2,wSrcBytesPerLine);
  1277. if(iDecoded==-1)
  1278. {
  1279. GlobalFree(pTempBuf);
  1280. pInfo->result=ER_BADIMAGE;
  1281. return -1;
  1282. }
  1283. lpSrc+=iDecoded;
  1284. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
  1285. pDest24=(LPBYTE)pDestLineAddr[iRow];
  1286. else
  1287. pDest24=(LPBYTE)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
  1288. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1289. {
  1290. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1291. wTempCol=*((WORD*)(pTempBuf+(pBmpInfo->biWidth-1-iCol)*2));
  1292. else
  1293. wTempCol=*((WORD*)(pTempBuf+iCol*2));
  1294. ::_cnv_555_to_rgb(wTempCol,pDest24+iCol*3+2,pDest24+iCol*3+1,pDest24+iCol*3);
  1295. }
  1296. }
  1297. break;
  1298. case DF_16_555:
  1299. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1300. {
  1301. iDecoded=::DecodingLine(pTempBuf,lpSrc,2,wSrcBytesPerLine);
  1302. if(iDecoded==-1)
  1303. {
  1304. GlobalFree(pTempBuf);
  1305. pInfo->result=ER_BADIMAGE;
  1306. return -1;
  1307. }
  1308. lpSrc+=iDecoded;
  1309. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
  1310. pDest16=(LPWORD)pDestLineAddr[iRow];
  1311. else
  1312. pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
  1313. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1314. {
  1315. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1316. pDest16[iCol]=*((WORD*)(pTempBuf+(pBmpInfo->biWidth-1-iCol)*2));
  1317. else
  1318. pDest16[iCol]=*((WORD*)(pTempBuf+iCol*2));
  1319. }
  1320. }
  1321. break;
  1322. case DF_16_565:
  1323. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1324. {
  1325. iDecoded=::DecodingLine(pTempBuf,lpSrc,2,wSrcBytesPerLine);
  1326. if(iDecoded==-1)
  1327. {
  1328. GlobalFree(pTempBuf);
  1329. pInfo->result=ER_BADIMAGE;
  1330. return -1;
  1331. }
  1332. lpSrc+=iDecoded;
  1333. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
  1334. pDest16=(LPWORD)pDestLineAddr[iRow];
  1335. else
  1336. pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
  1337. for(iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1338. {
  1339. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1340. pDest16[iCol]=::_cnv_555_to_565(*((WORD*)(pTempBuf+(pBmpInfo->biWidth-1-iCol)*2)));
  1341. else
  1342. pDest16[iCol]=::_cnv_555_to_565(*((WORD*)(pTempBuf+iCol*2)));
  1343. }
  1344. }
  1345. break;
  1346. case DF_NULL:
  1347. default:
  1348. ::GlobalFree(pTempBuf);
  1349. ASSERT(FALSE);
  1350. pInfo->result = ER_ILLCOMM;
  1351. return -1;
  1352. break;
  1353. }
  1354. ::GlobalFree(pTempBuf);
  1355. return 0;
  1356. }
  1357. int _from_24_RLE_COLOR_read(LPINFOSTR pInfo,PBYTE lpSrc,const TGAHEADER& tgaHeader)//Passed
  1358. {
  1359. ASSERT(pInfo);
  1360. ASSERT(lpSrc);
  1361. ASSERT(tgaHeader.bBits==24);//前提
  1362. LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
  1363. WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*24);
  1364. DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
  1365. LPBYTE pTempBuf;
  1366. int iDecoded;
  1367. pTempBuf=(LPBYTE)::GlobalAlloc(GPTR,wSrcBytesPerLine+128*3);
  1368. if(!pTempBuf)
  1369. {
  1370. pInfo->result=ER_MEMORYERR;
  1371. return -1;
  1372. }
  1373. LPBYTE pDest24;
  1374. LPWORD pDest16;
  1375. DESFORMAT fmt=::_get_desformat(pInfo);
  1376. int iRow,iCol;
  1377. switch(fmt)
  1378. {
  1379. case DF_32:
  1380. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1381. {
  1382. iDecoded=::DecodingLine(pTempBuf,lpSrc,3,wSrcBytesPerLine);
  1383. if(iDecoded==-1)
  1384. {
  1385. GlobalFree(pTempBuf);
  1386. pInfo->result=ER_BADIMAGE;
  1387. return -1;
  1388. }
  1389. lpSrc+=iDecoded;
  1390. for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1391. {
  1392. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1393. {
  1394. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)//上下反置
  1395. memcpy(pDestLineAddr[iRow]+iCol,pTempBuf+(pBmpInfo->biWidth-1-iCol)*3,3);
  1396. else
  1397. memcpy(pDestLineAddr[pBmpInfo->biHeight-1-iRow]+iCol,pTempBuf+(pBmpInfo->biWidth-1-iCol)*3,3);
  1398. }
  1399. else
  1400. {
  1401. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)//上下反置
  1402. memcpy(pDestLineAddr[iRow]+iCol,pTempBuf+iCol*3,3);
  1403. else
  1404. memcpy(pDestLineAddr[pBmpInfo->biHeight-1-iRow]+iCol,pTempBuf+iCol*3,3);
  1405. }
  1406. }
  1407. }
  1408. break;
  1409. case DF_24:
  1410. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1411. {
  1412. iDecoded=::DecodingLine(pTempBuf,lpSrc,3,wSrcBytesPerLine);
  1413. if(iDecoded==-1)
  1414. {
  1415. GlobalFree(pTempBuf);
  1416. pInfo->result=ER_BADIMAGE;
  1417. return -1;
  1418. }
  1419. lpSrc+=iDecoded;
  1420. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
  1421. pDest24=(LPBYTE)pDestLineAddr[iRow];
  1422. else
  1423. pDest24=(LPBYTE)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
  1424. for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1425. {
  1426. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1427. memcpy(pDest24+iCol*3,pTempBuf+(pBmpInfo->biWidth-1-iCol)*3,3);
  1428. else
  1429. memcpy(pDest24+iCol*3,pTempBuf+iCol*3,3);
  1430. }
  1431. }
  1432. break;
  1433. case DF_16_555:
  1434. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1435. {
  1436. iDecoded=::DecodingLine(pTempBuf,lpSrc,3,wSrcBytesPerLine);
  1437. if(iDecoded==-1)
  1438. {
  1439. GlobalFree(pTempBuf);
  1440. pInfo->result=ER_BADIMAGE;
  1441. return -1;
  1442. }
  1443. lpSrc+=iDecoded;
  1444. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
  1445. pDest16=(LPWORD)pDestLineAddr[iRow];
  1446. else
  1447. pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
  1448. for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1449. {
  1450. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1451. 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]);
  1452. else
  1453. pDest16[iCol]=::_cnv_rgb_to_555(pTempBuf[iCol*3+2],pTempBuf[iCol*3+1],pTempBuf[iCol*3]);
  1454. }
  1455. }
  1456. break;
  1457. case DF_16_565:
  1458. for(iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1459. {
  1460. iDecoded=::DecodingLine(pTempBuf,lpSrc,3,wSrcBytesPerLine);
  1461. if(iDecoded==-1)
  1462. {
  1463. GlobalFree(pTempBuf);
  1464. pInfo->result=ER_BADIMAGE;
  1465. return -1;
  1466. }
  1467. lpSrc+=iDecoded;
  1468. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
  1469. pDest16=(LPWORD)pDestLineAddr[iRow];
  1470. else
  1471. pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
  1472. for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1473. {
  1474. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1475. 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]);
  1476. else
  1477. pDest16[iCol]=::_cnv_rgb_to_565(pTempBuf[iCol*3+2],pTempBuf[iCol*3+1],pTempBuf[iCol*3]);
  1478. }
  1479. }
  1480. break;
  1481. case DF_NULL:
  1482. default:
  1483. ::GlobalFree(pTempBuf);
  1484. ASSERT(FALSE);
  1485. pInfo->result = ER_ILLCOMM;
  1486. return -1;
  1487. break;
  1488. }
  1489. ::GlobalFree(pTempBuf);
  1490. return 0;
  1491. }
  1492. int _from_32_RLE_COLOR_read(LPINFOSTR pInfo,PBYTE lpSrc,const TGAHEADER& tgaHeader)//Passed
  1493. {
  1494. ASSERT(pInfo);
  1495. ASSERT(lpSrc);
  1496. ASSERT(tgaHeader.bBits==32);//前提
  1497. LPBITMAPINFOHEADER pBmpInfo=&(pInfo->sDIBInfo.bmi);
  1498. WORD wSrcBytesPerLine=DIBSCANLINE_WIDTHBYTES(tgaHeader.wWidth*32);
  1499. DWORD*(*pDestLineAddr)=pInfo->pLineAddr;
  1500. LPBYTE pTempBuf;
  1501. int iDecoded;
  1502. pTempBuf=(LPBYTE)::GlobalAlloc(GPTR,wSrcBytesPerLine+128*4);
  1503. if(!pTempBuf)
  1504. {
  1505. pInfo->result=ER_MEMORYERR;
  1506. return -1;
  1507. }
  1508. LPBYTE pDest24;
  1509. LPWORD pDest16;
  1510. DESFORMAT fmt=::_get_desformat(pInfo);
  1511. int iRow,iCol;
  1512. switch(fmt)
  1513. {
  1514. case DF_32:
  1515. //应该先将目标数据区清零否??
  1516. for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1517. {
  1518. iDecoded=::DecodingLine(pTempBuf,lpSrc,4,wSrcBytesPerLine);
  1519. if(iDecoded==-1)
  1520. {
  1521. GlobalFree(pTempBuf);
  1522. pInfo->result=ER_BADIMAGE;
  1523. return -1;
  1524. }
  1525. lpSrc+=iDecoded;
  1526. for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1527. {
  1528. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1529. {
  1530. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)//上下反置
  1531. memcpy(pDestLineAddr[iRow]+iCol,pTempBuf+(pBmpInfo->biWidth-1-iCol)*4,3);
  1532. else
  1533. memcpy(pDestLineAddr[pBmpInfo->biHeight-1-iRow]+iCol,pTempBuf+(pBmpInfo->biWidth-1-iCol)*4,3);
  1534. }
  1535. else
  1536. {
  1537. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)//上下反置
  1538. memcpy(pDestLineAddr[iRow]+iCol,pTempBuf+iCol*4,3);
  1539. else
  1540. memcpy(pDestLineAddr[pBmpInfo->biHeight-1-iRow]+iCol,pTempBuf+iCol*4,3);
  1541. }
  1542. }
  1543. }
  1544. break;
  1545. case DF_24:
  1546. for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1547. {
  1548. iDecoded=::DecodingLine(pTempBuf,lpSrc,4,wSrcBytesPerLine);
  1549. if(iDecoded==-1)
  1550. {
  1551. GlobalFree(pTempBuf);
  1552. pInfo->result=ER_BADIMAGE;
  1553. return -1;
  1554. }
  1555. lpSrc+=iDecoded;
  1556. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
  1557. pDest24=(LPBYTE)pDestLineAddr[iRow];
  1558. else
  1559. pDest24=(LPBYTE)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
  1560. for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1561. {
  1562. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1563. memcpy(pDest24+iCol*3,pTempBuf+(pBmpInfo->biWidth-1-iCol)*4,3);
  1564. else
  1565. memcpy(pDest24+iCol*3,pTempBuf+iCol*4,3);
  1566. }
  1567. }
  1568. break;
  1569. case DF_16_555:
  1570. for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1571. {
  1572. iDecoded=::DecodingLine(pTempBuf,lpSrc,4,wSrcBytesPerLine);
  1573. if(iDecoded==-1)
  1574. {
  1575. GlobalFree(pTempBuf);
  1576. pInfo->result=ER_BADIMAGE;
  1577. return -1;
  1578. }
  1579. lpSrc+=iDecoded;
  1580. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
  1581. pDest16=(LPWORD)pDestLineAddr[iRow];
  1582. else
  1583. pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
  1584. for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1585. {
  1586. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1587. 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]);
  1588. else
  1589. pDest16[iCol]=::_cnv_rgb_to_555(pTempBuf[iCol*4+2],pTempBuf[iCol*4+1],pTempBuf[iCol*4]);
  1590. }
  1591. }
  1592. break;
  1593. case DF_16_565:
  1594. for( iRow=0;iRow<pBmpInfo->biHeight;iRow++)
  1595. {
  1596. iDecoded=::DecodingLine(pTempBuf,lpSrc,4,wSrcBytesPerLine);
  1597. if(iDecoded==-1)
  1598. {
  1599. GlobalFree(pTempBuf);
  1600. pInfo->result=ER_BADIMAGE;
  1601. return -1;
  1602. }
  1603. lpSrc+=iDecoded;
  1604. if(tgaHeader.bDescriptor&TGA_VERTMIRROR)
  1605. pDest16=(LPWORD)pDestLineAddr[iRow];
  1606. else
  1607. pDest16=(LPWORD)pDestLineAddr[pBmpInfo->biHeight-1-iRow];
  1608. for( iCol=0;iCol<pBmpInfo->biWidth;iCol++)
  1609. {
  1610. if(tgaHeader.bDescriptor&TGA_HORZMIRROR)//左右反置
  1611. 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]);
  1612. else
  1613. pDest16[iCol]=::_cnv_rgb_to_565(pTempBuf[iCol*4+2],pTempBuf[iCol*4+1],pTempBuf[iCol*4]);
  1614. }
  1615. }
  1616. case DF_NULL:
  1617. default:
  1618. ::GlobalFree(pTempBuf);
  1619. ASSERT(FALSE);
  1620. pInfo->result = ER_ILLCOMM;
  1621. return -1;
  1622. break;
  1623. }
  1624. ::GlobalFree(pTempBuf);
  1625. return 0;
  1626. }
  1627. // 判断标准图像的位格式
  1628. DESFORMAT _get_desformat(LPINFOSTR pInfo)
  1629. {
  1630. ASSERT(pInfo);
  1631. // ASSERT(pInfo->state >= PKST_PASSVER);
  1632. ASSERT(pInfo->sDIBInfo.bmi.biPlanes == 1);
  1633. DESFORMAT result;
  1634. switch(pInfo->sDIBInfo.bmi.biBitCount)
  1635. {
  1636. case 32:
  1637. /******************************************************
  1638. 32位掩码示意图
  1639.     高               ->                 低
  1640. 0000 0000   0000 0000   0000 0000   0000 0000  888格式
  1641.             1111 1111  ------------------------R
  1642.                         1111 1111 -------------G
  1643.                                     1111 1111--B
  1644. * Win95 系统只支持这一种格式
  1645. ******************************************************/
  1646. if (pInfo->sDIBInfo.bmi.biCompression == BI_RGB)
  1647. {
  1648. result = DF_32;
  1649. break;
  1650. }
  1651. if ((pInfo->sDIBInfo.rmask == 0xff0000)&&
  1652. (pInfo->sDIBInfo.gmask == 0xff00)&&
  1653. (pInfo->sDIBInfo.bmask == 0xff))
  1654. result = DF_32;
  1655. else
  1656. {
  1657. ASSERT(FALSE); // 只支持888格式
  1658. result = DF_NULL;
  1659. }
  1660. break;
  1661. case 24:
  1662. result = DF_24;
  1663. break;
  1664. case 16:
  1665. /*******************************************
  1666. 16位掩码示意图
  1667.   高字节      低字节
  1668. 0000 0000   0000 0000 
  1669.    1 1111--B // 555格式
  1670.    11 111 -------G
  1671.  111 11  --------------R
  1672. 0
  1673.    1 1111--B // 565格式
  1674.   111   111 -------G
  1675. 1111 1   --------------R
  1676. * Win95 系统只支持以上两种格式
  1677. *******************************************/
  1678. if (pInfo->sDIBInfo.bmi.biCompression == BI_RGB)
  1679. {
  1680. result = DF_16_555;
  1681. break;
  1682. }
  1683. if ((pInfo->sDIBInfo.rmask == 0x7c00)&&
  1684. (pInfo->sDIBInfo.gmask == 0x3e0)&&
  1685. (pInfo->sDIBInfo.bmask == 0x1f))
  1686. result = DF_16_555;
  1687. else if ((pInfo->sDIBInfo.rmask == 0xf800)&&
  1688. (pInfo->sDIBInfo.gmask == 0x7e0)&&
  1689. (pInfo->sDIBInfo.bmask == 0x1f))
  1690. result = DF_16_565;
  1691. else
  1692. result = DF_NULL;
  1693. break;
  1694. default:
  1695. ASSERT(FALSE); // 不接受其它格式
  1696. result = DF_NULL;
  1697. break;
  1698. }
  1699. return result;
  1700. }
  1701. // 将指定的RGB颜色分量转换成555格式(WORD型值返回)
  1702. WORD _cnv_rgb_to_555(BYTE red, BYTE green, BYTE blue)
  1703. {
  1704. WORD result = 0;
  1705. result = (((WORD)red>>3)<<10)|(((WORD)green>>3)<<5)|((WORD)blue>>3);
  1706. return result;
  1707. }
  1708. // 将指定的555格式的颜色转换成RGB颜色分量
  1709. void _cnv_555_to_rgb(WORD col, PBYTE red, PBYTE green, PBYTE blue)
  1710. {
  1711. // 在555转换到RGB时,将像素的亮度调到最大
  1712. *red = (BYTE)((col>>7)&0xf8);
  1713. *green = (BYTE)((col>>2)&0xf8);
  1714. *blue = (BYTE)(col<<3);
  1715. }
  1716. // 将指定的RGB颜色分量转换成565格式(WORD型值返回)
  1717. WORD _cnv_rgb_to_565(BYTE red, BYTE green, BYTE blue)
  1718. {
  1719. WORD result = 0;
  1720. result = (((WORD)red>>3)<<11)|(((WORD)green>>2)<<5)|((WORD)blue>>3);
  1721. return result;
  1722. }
  1723. // 将指定的565格式的颜色转换成RGB颜色分量
  1724. void _cnv_565_to_rgb(WORD col, PBYTE red, PBYTE green, PBYTE blue)
  1725. {
  1726. // 在565转换到RGB时,将像素的亮度调到最大
  1727. *red = (BYTE)((col>>8)&0xf8);
  1728. *green = (BYTE)((col>>3)&0xfc);
  1729. *blue = (BYTE)(col<<3);
  1730. }
  1731. // 将指定的RGB颜色分量转换成888格式(DWORD型值返回)
  1732. DWORD _cnv_rgb_to_888(BYTE red, BYTE green, BYTE blue)
  1733. {
  1734. DWORD result = 0;
  1735. result = ((DWORD)red<<16)|((DWORD)green<<8)|(DWORD)blue;
  1736. return result;
  1737. }
  1738. // 将指定的555颜色分量转换成565格式
  1739. WORD _cnv_555_to_565(WORD w555)
  1740. {
  1741. return (WORD)(((w555&0x7FE0)<<1)|(w555&0x1F));
  1742. }