WHImage.cpp
上传用户:cydong117
上传日期:2009-11-10
资源大小:638k
文件大小:11k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. /******************************************************************************************************************
  2.                                                                                                                    
  3. 葛碘疙:
  4. 累己磊:
  5. 累己老:
  6. [老磊][荐沥磊] : 荐沥 郴侩
  7.                                                                                                                    
  8. *******************************************************************************************************************/
  9. #include "stdafx.h"
  10. #include "WHEngine.h"
  11. /******************************************************************************************************************
  12. 窃荐疙 : CWHImage::CWHImage()
  13. 累己磊 : 
  14. 累己老 : 
  15. 格利   : 
  16. 免仿   : 
  17. [老磊][荐沥磊] : 荐沥郴侩
  18. *******************************************************************************************************************/
  19. CWHImage::CWHImage()
  20. {
  21. m_wWidth = 0;
  22. m_wHeight = 0;
  23. m_shCenterX = 0;;
  24. m_shCenterY = 0;;
  25. m_bBitCount = 0;;
  26. m_pwImage = NULL;
  27. m_dwImageLength = 0;
  28. }
  29. /******************************************************************************************************************
  30. 窃荐疙 : CWHImage::~CWHImage()
  31. 累己磊 : 
  32. 累己老 : 
  33. 格利   : 
  34. 免仿   : 
  35. [老磊][荐沥磊] : 荐沥郴侩
  36. *******************************************************************************************************************/
  37. CWHImage::~CWHImage()
  38. {
  39. DeleteImage();
  40. }
  41. /******************************************************************************************************************
  42. 窃荐疙 : CWHImage::Convert24To16()
  43. 累己磊 : 
  44. 累己老 : 
  45. 格利   : 
  46. 涝仿   : BYTE *pOrgImage
  47.          BYTE bOrgImgBitCount
  48. 免仿   : BOOL 
  49. [老磊][荐沥磊] : 荐沥郴侩
  50. *******************************************************************************************************************/
  51. BOOL CWHImage::Convert24To16(BYTE *pOrgImage, BYTE bOrgImgBitCount)
  52. {
  53. BYTE byRBit, byGBit, byBBit;
  54. WORD wPixel;
  55. int nByteAlignCX = (((m_wWidth * bOrgImgBitCount) + 31) & ~31) >> 3;
  56. for (int nYIdx = 0; nYIdx < m_wHeight; nYIdx++)
  57. {
  58. for (int nXIdx = 0; nXIdx < m_wWidth; nXIdx++)
  59. {
  60. byRBit = pOrgImage[(nXIdx * 3 + 2) + (nYIdx * nByteAlignCX)];
  61. byGBit = pOrgImage[(nXIdx * 3 + 1) + (nYIdx * nByteAlignCX)];
  62. byBBit = pOrgImage[(nXIdx * 3 + 0) + (nYIdx * nByteAlignCX)];
  63. wPixel = ((byRBit >> 3) << 11) | ((byGBit >> 2) << 5) | (byBBit >> 3);
  64. if (((byRBit != 0) || (byGBit != 0) || (byBBit != 0)) && (wPixel == 0))
  65. wPixel = 1;
  66. // 厚飘甘阑 芭操肺 倒覆
  67. m_pwImage[nXIdx + ((m_wHeight - 1) - nYIdx) * m_wWidth] = wPixel;
  68. }
  69. }
  70. return TRUE;
  71. }
  72. /******************************************************************************************************************
  73. 窃荐疙 : CWHImage::LoadBitmap()
  74. 累己磊 : 
  75. 累己老 : 
  76. 格利   : 
  77. 涝仿   : LPCTSTR pszFileName
  78.          BYTE bBitCount
  79. 免仿   : BOOL 
  80. [老磊][荐沥磊] : 荐沥郴侩
  81. *******************************************************************************************************************/
  82. BOOL CWHImage::LoadBitmap(LPCTSTR pszFileName, BOOL fCut, BOOL fCompress, BYTE bBitCount)
  83. {
  84. BITMAPFILEHEADER stFileHeader;
  85. BITMAPINFOHEADER stInfoHeader;
  86. DWORD dwReadSize = 0;
  87. HANDLE hFile = ::CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
  88. FILE_ATTRIBUTE_NORMAL, NULL);
  89. if ( hFile )
  90. {
  91. ZeroMemory(&stFileHeader, sizeof(stFileHeader));
  92. ReadFile(hFile, &stFileHeader, sizeof(stFileHeader), &dwReadSize, NULL);
  93. if ( HIBYTE(stFileHeader.bfType) == 'M' && LOBYTE(stFileHeader.bfType) == 'B' )
  94. {
  95. ReadFile(hFile, &stInfoHeader, sizeof(stInfoHeader), &dwReadSize, NULL);
  96. m_wWidth  = (WORD)stInfoHeader.biWidth;
  97. m_wHeight = (WORD)stInfoHeader.biHeight;
  98. m_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);
  99. if ( stInfoHeader.biBitCount == 24 )
  100. {
  101. m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];
  102. UINT nSize = stFileHeader.bfSize -  sizeof(stFileHeader) -  sizeof(stInfoHeader);
  103. if ( bBitCount != 16 )
  104. {
  105. ReadFile(hFile, m_pwImage, nSize, &dwReadSize, NULL);
  106. CloseHandle(hFile);
  107. if ( fCut ) Optimize();
  108. if ( fCompress ) XOptimize();
  109. return TRUE;
  110. }
  111. else
  112. {
  113. BYTE *pOrgImage = new BYTE[stInfoHeader.biSizeImage];
  114. ReadFile(hFile, pOrgImage, nSize, &dwReadSize, NULL);
  115. Convert24To16(pOrgImage, (BYTE)stInfoHeader.biBitCount);
  116. CloseHandle(hFile);
  117. delete [] pOrgImage;
  118. if ( fCut ) Optimize();
  119. if ( fCompress ) XOptimize();
  120. return TRUE;
  121. }
  122. }
  123. }
  124. CloseHandle(hFile);
  125. }
  126. return FALSE;
  127. }
  128. BOOL CWHImage::Optimize()
  129. {
  130. INT nStartX, nStartY, nEndX, nEndY;
  131. INT nX, nY;
  132. INT nCntX = 0;
  133. INT nCntY = 0;
  134. for ( nY=0; nY<m_wHeight; nY++ )
  135. {
  136. for ( nX=0; nX<m_wWidth; nX++ )
  137. {
  138. if ( *(m_pwImage + nX + (nY * m_wWidth)) != 0 )
  139. {
  140. nStartY = nY;
  141. nX = m_wWidth;
  142. nY = m_wHeight;
  143. }
  144. }
  145. }
  146. for ( nX=0; nX<m_wWidth; nX++ )
  147. {
  148. for ( nY=0; nY<m_wHeight; nY++ )
  149. {
  150. if ( *(m_pwImage + nX + (nY * m_wWidth)) != 0 )
  151. {
  152. nStartX = nX;
  153. nX = m_wWidth;
  154. nY = m_wHeight;
  155. }
  156. }
  157. }
  158. for ( nY=m_wHeight-1; nY>=0; nY-- )
  159. {
  160. for(nX=m_wWidth-1; nX>=0; nX-- )
  161. {
  162. if ( *(m_pwImage + nX + (nY * m_wWidth)) != 0 )
  163. {
  164. nEndY = nY;
  165. nX = -1;
  166. nY = -1;
  167. }
  168. }
  169. }
  170. for ( nX=m_wWidth-1; nX>=0; nX-- )
  171. {
  172. for ( nY=m_wHeight-1; nY>=0; nY-- )
  173. {
  174. if ( *(m_pwImage + nX + (nY * m_wWidth)) != 0 )
  175. {
  176. nEndX = nX;
  177. nX = -1;
  178. nY = -1;
  179. }
  180. }
  181. }
  182. m_shCenterX = m_wWidth /2 - nStartX;
  183. m_shCenterY = m_wHeight /2 - nStartY;
  184. WORD* pwTmpImage = NULL;
  185. WORD wTmpWidth = 0;
  186. WORD wTmpHeight = 0;
  187. wTmpWidth = (nEndX + 1)- nStartX;
  188. while( wTmpWidth % 4 != 0 )
  189. {
  190. nEndX++;
  191. wTmpWidth = (nEndX + 1) - nStartX;
  192. }
  193. wTmpHeight = (nEndY + 1) - nStartY;
  194. pwTmpImage  = new WORD[wTmpWidth * wTmpHeight];
  195. for ( nY=nStartY; nY<(nEndY+1); nY++ )
  196. {
  197. for ( nX=nStartX; nX<(nEndX+1); nX++ )
  198. {
  199. *(pwTmpImage+nCntY+(nCntX*wTmpWidth)) = *(m_pwImage+nX+(nY*m_wWidth));
  200. nCntY++;
  201. }
  202. nCntY = 0;
  203. nCntX++;
  204. }
  205. DeleteImage();
  206. if ( !m_pwImage )
  207. m_pwImage  = new WORD[wTmpWidth * wTmpHeight];
  208. CopyMemory(m_pwImage, pwTmpImage, sizeof(WORD) * wTmpWidth * wTmpHeight);
  209. m_wWidth = wTmpWidth;
  210. m_wHeight = wTmpHeight;
  211. m_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);
  212. SAFE_DELETE(pwTmpImage);
  213. return TRUE;
  214. }
  215. BOOL CWHImage::XOptimize()
  216. {
  217. INT nTmpMaxLen = m_wWidth * 2;
  218. WORD* pwTmpMaxLineImage = new WORD[nTmpMaxLen];
  219. DWORD dwWordCntPerLine = 0;
  220. WORD  wContinuousCnt = 0;
  221. DWORD dwWordCntPerFile = 0;
  222. DWORD dwWrittenLen = 0;
  223. HANDLE hFile;
  224. hFile = CreateFile("CompTest.tmp", GENERIC_WRITE|GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, 
  225.    CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  226. INT nAddCnt = 0;
  227. if ( hFile != INVALID_HANDLE_VALUE )
  228. {
  229. for ( INT nY = 0; nY < m_wHeight; nY++ )
  230. {
  231. for ( INT nX = 0; nX < m_wWidth;  )
  232. {
  233. // 扼牢窜困肺 拘绵阑 茄促.
  234. if ( *(m_pwImage+nX+(nY*m_wWidth)) == 0 )
  235. {
  236. while ( (*(m_pwImage+(nX+nAddCnt)+(nY*m_wWidth)) == 0) && (nX+nAddCnt < m_wWidth) )
  237. {
  238. nAddCnt++;
  239. }
  240. pwTmpMaxLineImage[dwWordCntPerLine] = 0XC0;
  241. dwWordCntPerLine++;
  242. pwTmpMaxLineImage[dwWordCntPerLine] = nAddCnt;
  243. dwWordCntPerLine++;
  244. nX += nAddCnt;
  245. nAddCnt = 0;
  246. }
  247. else if ( *(m_pwImage+nX+(nY*m_wWidth)) == 0XFFFF )
  248. {
  249. while ( (*(m_pwImage+(nX+nAddCnt)+(nY*m_wWidth)) == 0XFFFF) && (nX+nAddCnt < m_wWidth) )
  250. {
  251. nAddCnt++;
  252. }
  253. pwTmpMaxLineImage[dwWordCntPerLine] = 0XC1;
  254. dwWordCntPerLine++;
  255. pwTmpMaxLineImage[dwWordCntPerLine] = nAddCnt;
  256. dwWordCntPerLine++;
  257. nX += nAddCnt;
  258. nAddCnt = 0;
  259. }
  260. else
  261. {
  262. while ( (*(m_pwImage+(nX+nAddCnt)+(nY*m_wWidth)) != 0) && (*(m_pwImage+(nX+nAddCnt)+(nY*m_wWidth)) != 0XFFFF) && (nX+nAddCnt < m_wWidth) )
  263. {
  264. nAddCnt++;
  265. }
  266. pwTmpMaxLineImage[dwWordCntPerLine] = 0XC2;
  267. dwWordCntPerLine++;
  268. pwTmpMaxLineImage[dwWordCntPerLine] = nAddCnt;
  269. dwWordCntPerLine++;
  270. while ( nAddCnt > 0 )
  271. {
  272. pwTmpMaxLineImage[dwWordCntPerLine] = *(m_pwImage+nX+(nY*m_wWidth));
  273. dwWordCntPerLine++;
  274. nAddCnt--;
  275. nX++;
  276. }
  277. }
  278. }
  279. nAddCnt = 0;
  280. WriteFile(hFile, &dwWordCntPerLine, sizeof(WORD), &dwWrittenLen, NULL);
  281. WriteFile(hFile, pwTmpMaxLineImage, sizeof(WORD)*dwWordCntPerLine, &dwWrittenLen, NULL);
  282. dwWordCntPerFile += (dwWordCntPerLine+1);
  283. dwWordCntPerLine = 0;
  284. }
  285. SAFE_DELETE(pwTmpMaxLineImage);
  286. SAFE_DELETE(m_pwImage);
  287. m_pwImage  = new WORD[dwWordCntPerFile];
  288. ZeroMemory(m_pwImage, sizeof(WORD)*dwWordCntPerFile);
  289. m_dwImageLength = dwWordCntPerFile;
  290. SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
  291. ReadFile(hFile, m_pwImage, sizeof(WORD)*dwWordCntPerFile, &dwWrittenLen, NULL);
  292. CloseHandle(hFile);
  293. return TRUE;
  294. }
  295. return FALSE;
  296. }
  297. BOOL CWHImage::LoadBitmapFromRes(LPCTSTR lpResName, LPCTSTR lpTypeName, BOOL fCut, BOOL fCompress, BYTE bBitCount)
  298. {
  299. BITMAPFILEHEADER stFileHeader;
  300. BITMAPINFOHEADER stInfoHeader;
  301. DWORD dwReadSize = 0;
  302. DWORD dwCurrMemPos = 0;
  303. HRSRC hRes = FindResource(GetModuleHandle(NULL), lpResName, lpTypeName);
  304. if ( hRes )
  305. {
  306. DWORD dwSize = SizeofResource(GetModuleHandle(NULL), hRes);
  307. HGLOBAL hMem = LoadResource(GetModuleHandle(NULL), hRes);
  308. BYTE* pbData = (BYTE*)LockResource(hMem);
  309. memcpy(&stFileHeader, pbData+dwCurrMemPos, sizeof(stFileHeader));
  310. dwCurrMemPos += sizeof(stFileHeader);
  311. if ( HIBYTE(stFileHeader.bfType) == 'M' && LOBYTE(stFileHeader.bfType) == 'B' )
  312. {
  313. memcpy(&stInfoHeader, pbData+dwCurrMemPos, sizeof(stInfoHeader));
  314. dwCurrMemPos += sizeof(stInfoHeader);
  315. m_wWidth  = (WORD)stInfoHeader.biWidth;
  316. m_wHeight = (WORD)stInfoHeader.biHeight;
  317. m_dwImageLength = m_wWidth*m_wHeight*sizeof(WORD);
  318. if ( stInfoHeader.biBitCount == 24 )
  319. {
  320. m_pwImage = new WORD[sizeof(WORD) * m_wWidth * m_wHeight];
  321. UINT nSize = stFileHeader.bfSize -  sizeof(stFileHeader) -  sizeof(stInfoHeader);
  322. if ( bBitCount != 16 )
  323. {
  324. memcpy(m_pwImage, pbData+dwCurrMemPos, nSize);
  325. dwCurrMemPos += nSize;
  326. if ( fCut ) Optimize();
  327. if ( fCompress ) XOptimize();
  328. return TRUE;
  329. }
  330. else
  331. {
  332. BYTE *pOrgImage = new BYTE[stInfoHeader.biSizeImage];
  333. memcpy(pOrgImage, pbData+dwCurrMemPos, nSize);
  334. dwCurrMemPos += nSize;
  335. Convert24To16(pOrgImage, (BYTE)stInfoHeader.biBitCount);
  336. delete [] pOrgImage;
  337. if ( fCut ) Optimize();
  338. if ( fCompress ) XOptimize();
  339. return TRUE;
  340. }
  341. }
  342. }
  343. }
  344. return FALSE;
  345. }