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

模拟服务器

开发平台:

Visual C++

  1. nWidthStart = nWidthEnd;
  2. nCurrWidth = 0;
  3. }
  4. }
  5. m_pddsBackBuffer->Unlock(NULL);
  6. return TRUE;
  7. }
  8. return FALSE;
  9. }
  10. // nX, nY绰 吝缴痢狼 谅钎捞促.
  11. BOOL CWHDXGraphicWindow::DrawWithShadowABlend(INT nX, INT nY, INT nXSize, INT nYSize, WORD* pwSrc, WORD wClipWidth, WORD wClipHeight,
  12.   WORD* pwShadowClrSrc, BOOL bBlend, BYTE bShadowType, BYTE bOpa)
  13. {
  14. // 嘛瘤 臼绰 弊覆磊.
  15. if ( bShadowType == 48 )
  16. return FALSE;
  17. RECT rc;
  18. DDSURFACEDESC2 ddsd;
  19. INT nWidth = nXSize;
  20. INT nHeight = nYSize;
  21. INT nXOffset = 0;
  22. INT nYOffset = 0;
  23. INT nStartX = 0;
  24. INT nStartY = 0;
  25. INT nEndX = wClipWidth -1;
  26. INT nEndY = wClipHeight-1;
  27. if ( m_pddsBackBuffer != NULL )
  28. {
  29. rc.left = 0;
  30. rc.right = nWidth;
  31. rc.top = 0;
  32. rc.bottom = nHeight;
  33. ddsd.dwSize = sizeof(DDSURFACEDESC2);
  34. ddsd.lpSurface = NULL;
  35. m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  36. if ( !ddsd.lpSurface ) return FALSE;
  37. WORD* pwdDst;
  38. pwdDst = (WORD*)ddsd.lpSurface;
  39. INT nWidthStart = 0;
  40. INT nWidthEnd = 0;
  41. INT nCurrWidth  = 0;
  42. INT nCntCopyWord = 0;
  43. INT nYCnt =0;
  44. INT nLastWidth = 0;
  45. INT nDstXPos = 0;
  46. INT nDstYPos = 0;
  47. WORD wPixel;
  48. BYTE bBlueWantedColor, bGreenWantedColor, bRedWantedColor, bBlueDst, bGreenDst, bRedDst;
  49. RECT rcScrnShadow;
  50. WORD wSahdowColor = pwShadowClrSrc[0];
  51. if ( bShadowType == 49 )
  52. {
  53. SetRect(&rcScrnShadow, nX, nY, nX+nHeight/2+nWidth, nY+nHeight/2);
  54. }
  55. else if ( bShadowType == 50 )
  56. {
  57. SetRect(&rcScrnShadow, nX, nY, nX+nWidth, nY+nHeight);
  58. }
  59. // y绵俊 措秦辑 角力肺 风俏矫懦 Count父阑 沥茄促.
  60. for ( nYCnt=rc.top ; nYCnt < rc.bottom ; nYCnt++ )
  61. {
  62. // 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
  63. nWidthEnd += pwSrc[nWidthStart];
  64. nWidthStart++;
  65. if ( bShadowType == 49 )
  66. {
  67. nDstYPos = nYCnt-nYCnt/2+nY;
  68. }
  69. else if ( bShadowType == 50 )
  70. {
  71. nDstYPos = nYCnt+nY;
  72. }
  73. if ( nDstYPos < 0 || nDstYPos >= wClipHeight || (bShadowType==49 && nYCnt%2) )
  74. {
  75. // 扼牢狼 场阑 促澜 扼牢狼 矫累栏肺 颗败霖促.
  76. nWidthEnd++;
  77. nWidthStart = nWidthEnd;
  78. nCurrWidth = 0;
  79. continue;
  80. }
  81. // 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
  82. for ( INT x = nWidthStart; x < nWidthEnd ; )
  83. {
  84. if ( pwSrc[x] == 0xC0 )
  85. {
  86. x++;
  87. nCntCopyWord = pwSrc[x];
  88. x++;
  89. nCurrWidth += nCntCopyWord;
  90. }
  91. else if ( pwSrc[x] == 0xC1 || pwSrc[x] == 0xC2 || pwSrc[x] == 0xC3 )
  92. {
  93. x++;
  94. nCntCopyWord = pwSrc[x];
  95. x++;
  96. nLastWidth = nCurrWidth;
  97. nCurrWidth += nCntCopyWord;
  98. if ( bShadowType == 49 )
  99. {
  100. nDstXPos = (nLastWidth+nX+(rc.bottom-nYCnt)/2);
  101. }
  102. else if ( bShadowType == 50 )
  103. {
  104. nDstXPos = (nLastWidth+nX);
  105. }
  106. if ( !bBlend ) 
  107. {
  108. // 哭率 吧副锭.
  109. if ( nDstXPos < 0 && nDstXPos+nCntCopyWord >= 0 )
  110. {
  111. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  112. {
  113. if ( nDstXPos+nCheck >= 0 && nDstXPos+nCheck < wClipWidth )
  114. {
  115. pwdDst[(nDstYPos * (ddsd.lPitch >> 1)) + nDstXPos+nCheck] = wSahdowColor;
  116. }
  117. }
  118. x += nCntCopyWord;
  119. }
  120. // 坷弗率 吧副锭.
  121. else if ( nDstXPos < wClipWidth && nDstXPos+nCntCopyWord >= wClipWidth )
  122. {
  123. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  124. {
  125. if ( nDstXPos+nCheck >= 0 && nDstXPos+nCheck < wClipWidth )
  126. {
  127. pwdDst[(nDstYPos * (ddsd.lPitch >> 1)) + nDstXPos+nCheck] = wSahdowColor;
  128. }
  129. }
  130. x += nCntCopyWord;
  131. }
  132. // 救吧副锭.
  133. else if ( nDstXPos >= 0 && nDstXPos+nCntCopyWord < wClipWidth )
  134. {
  135. memcpy(&pwdDst[(nDstYPos * (ddsd.lPitch >> 1)) + nDstXPos], pwShadowClrSrc, sizeof(WORD)*nCntCopyWord);
  136. // memset(&pwdDst[(nDstYPos * (ddsd.lPitch >> 1)) + nDstXPos], wSahdowColor, sizeof(WORD)*nCntCopyWord);
  137. x += nCntCopyWord;
  138. }
  139. else
  140. {
  141. x += nCntCopyWord;
  142. }
  143. }
  144. else
  145. {
  146. // 哭率 吧副锭.
  147. if ( nDstXPos < 0 && nDstXPos+nCntCopyWord >= 0 )
  148. {
  149. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  150. {
  151. if ( nDstXPos+nCheck >= 0 && nDstXPos+nCheck < wClipWidth )
  152. {
  153. // pwdDst[(nDstYPos * (ddsd.lPitch >> 1)) + nDstXPos+nCheck] = wSahdowColor;
  154. wPixel = wSahdowColor;
  155. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  156. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  157. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  158. wPixel  = pwdDst[(nDstYPos * (ddsd.lPitch >> 1)) + nDstXPos+nCheck];
  159. bBlueDst   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  160. bGreenDst  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  161. bRedDst    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  162. bBlueDst   = (BYTE)((bOpa*(bBlueDst -bBlueWantedColor)+100*bBlueWantedColor  ) / 100);
  163. bGreenDst  = (BYTE)((bOpa*(bGreenDst-bGreenWantedColor)+100*bGreenWantedColor) / 100);
  164. bRedDst    = (BYTE)((bOpa*(bRedDst  -bRedWantedColor)+100*bRedWantedColor    ) / 100);
  165. pwdDst[(nDstYPos * (ddsd.lPitch >> 1)) + nDstXPos+nCheck] = ((bRedDst  <<m_stBitsMaskInfo.bRShift) |
  166.     (bGreenDst<<m_stBitsMaskInfo.bGShift) |
  167.  (bBlueDst <<m_stBitsMaskInfo.bBShift));
  168. }
  169. }
  170. x += nCntCopyWord;
  171. }
  172. // 坷弗率 吧副锭.
  173. else if ( nDstXPos < wClipWidth && nDstXPos+nCntCopyWord >= wClipWidth )
  174. {
  175. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  176. {
  177. if ( nDstXPos+nCheck >= 0 && nDstXPos+nCheck < wClipWidth )
  178. {
  179. // pwdDst[(nDstYPos * (ddsd.lPitch >> 1)) + nDstXPos+nCheck] = wSahdowColor;
  180. WORD wPixel = wSahdowColor;
  181. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  182. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  183. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  184. wPixel  = pwdDst[(nDstYPos * (ddsd.lPitch >> 1)) + nDstXPos+nCheck];
  185. bBlueDst   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  186. bGreenDst  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  187. bRedDst    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  188. bBlueDst   = (BYTE)((bOpa*(bBlueDst -bBlueWantedColor)+100*bBlueWantedColor  ) / 100);
  189. bGreenDst  = (BYTE)((bOpa*(bGreenDst-bGreenWantedColor)+100*bGreenWantedColor) / 100);
  190. bRedDst    = (BYTE)((bOpa*(bRedDst  -bRedWantedColor)+100*bRedWantedColor    ) / 100);
  191. pwdDst[(nDstYPos * (ddsd.lPitch >> 1)) + nDstXPos+nCheck] = ((bRedDst  <<m_stBitsMaskInfo.bRShift) |
  192.     (bGreenDst<<m_stBitsMaskInfo.bGShift) |
  193.  (bBlueDst <<m_stBitsMaskInfo.bBShift));
  194. }
  195. }
  196. x += nCntCopyWord;
  197. }
  198. // 救吧副锭.
  199. else if ( nDstXPos >= 0 && nDstXPos+nCntCopyWord < wClipWidth )
  200. {
  201. // memset(&pwdDst[(nDstYPos * (ddsd.lPitch >> 1)) + nDstXPos], wSahdowColor, sizeof(WORD)*nCntCopyWord);
  202. // x += nCntCopyWord;
  203. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  204. {
  205. // pwdDst[(nDstYPos * (ddsd.lPitch >> 1)) + nDstXPos+nCheck] = wSahdowColor;
  206. wPixel = wSahdowColor;
  207. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  208. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  209. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  210. wPixel  = pwdDst[(nDstYPos * (ddsd.lPitch >> 1)) + nDstXPos+nCheck];
  211. bBlueDst   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  212. bGreenDst  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  213. bRedDst    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  214. bBlueDst   = (BYTE)((bOpa*(bBlueDst -bBlueWantedColor)+100*bBlueWantedColor  ) / 100);
  215. bGreenDst  = (BYTE)((bOpa*(bGreenDst-bGreenWantedColor)+100*bGreenWantedColor) / 100);
  216. bRedDst    = (BYTE)((bOpa*(bRedDst  -bRedWantedColor)+100*bRedWantedColor    ) / 100);
  217. pwdDst[(nDstYPos * (ddsd.lPitch >> 1)) + nDstXPos+nCheck] = ((bRedDst  <<m_stBitsMaskInfo.bRShift) |
  218.  (bGreenDst<<m_stBitsMaskInfo.bGShift) |
  219.  (bBlueDst <<m_stBitsMaskInfo.bBShift));
  220. }
  221. x += nCntCopyWord;
  222. }
  223. else
  224. {
  225. x += nCntCopyWord;
  226. }
  227. }
  228. }
  229. }
  230. // 扼牢狼 场阑 促澜 扼牢狼 矫累栏肺 颗败霖促.
  231. nWidthEnd++;
  232. nWidthStart = nWidthEnd;
  233. nCurrWidth = 0;
  234. }
  235. m_pddsBackBuffer->Unlock(NULL);
  236. return TRUE;
  237. }
  238. return FALSE;
  239. }
  240. VOID CWHDXGraphicWindow::DrawWithShadowABlend(INT nX, INT nY, INT nXSize, INT nYSize, INT nPX, INT nPY, WORD* pwSrc, WORD wClipWidth, WORD wClipHeight,
  241.   WORD* pwShadowClrSrc, BOOL bBlend, BYTE bOpa)
  242. {
  243. DDSURFACEDESC2 ddsd;
  244. #define _HALF_CELL_WIDTH 24
  245. #define _HALF_CELL_HEIGHT 16
  246. //  拳搁(800*600)俊辑 弊覆磊啊 嘛鳃 荤捞令甫 备茄促.
  247. // 拳搁(800*600)俊辑狼 伎矫累谅钎啊 酒囱 角力 吝缴痢 谅钎(伎困 沥吝居痢捞促.)
  248. INT nScrnCenterX = nX - nPX + 24;//_HALF_CELL_WIDTH;
  249. INT nScrnCenterY = nY - nPY + 16;//_HALF_CELL_HEIGHT;
  250. INT nRealCenterX = nX - nScrnCenterX;
  251. INT nRealCenterY = nY - nScrnCenterY;
  252. INT nShadowCenterX = nX;
  253. INT nShadowCenterY = nY-nRealCenterY/2;
  254. RECT rcSrc  = {0, 0, nXSize, nYSize};
  255. BYTE bRedDst, bGreenDst, bBlueDst;
  256. BYTE bRedWantedColor, bGreenWantedColor, bBlueWantedColor;
  257. WORD wPixel;
  258. WORD wSahdowColor = pwShadowClrSrc[0];
  259. if ( m_pddsBackBuffer != NULL )
  260. {
  261. ddsd.dwSize = sizeof(DDSURFACEDESC2);
  262. ddsd.lpSurface = NULL;
  263. m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  264. if ( !ddsd.lpSurface ) return;
  265. WORD* pwdDst = NULL;
  266. pwdDst = (WORD*)ddsd.lpSurface;
  267. if ( pwdDst )
  268. {
  269. INT nWidthStart  = 0;
  270. INT nWidthEnd  = 0;
  271. INT nCurrWidth   = 0;
  272. INT nLastWidth  = 0;
  273. INT nCntCopyWord = 0;
  274. INT nYCnt  = 0;
  275. INT nDstYPos = nShadowCenterY;
  276. for ( nYCnt=rcSrc.top ; nYCnt < rcSrc.bottom ; nYCnt++ )
  277. {
  278. if ( nDstYPos >= wClipHeight )
  279. {
  280. m_pddsBackBuffer->Unlock(NULL);
  281. return;
  282. }
  283. // y绵 努府俏棺 茄临究 扒呈顿扁.
  284. if ( nYCnt%2 == 0 ||  nDstYPos < 0 )
  285. {
  286. nWidthEnd += pwSrc[nWidthStart];
  287. nWidthStart++;
  288. nWidthEnd++;
  289. nWidthStart = nWidthEnd;
  290. nDstYPos++;
  291. }
  292. else
  293. {
  294. // 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
  295. nWidthEnd += pwSrc[nWidthStart];
  296. nWidthStart++;
  297. // 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
  298. for ( INT x = nWidthStart; x < nWidthEnd ; )
  299. {
  300. if ( pwSrc[x] == 0xC0 )
  301. {
  302. x++;
  303. nCntCopyWord = pwSrc[x];
  304. x++;
  305. nCurrWidth += nCntCopyWord;
  306. }
  307. else
  308. {
  309. x++;
  310. nCntCopyWord = pwSrc[x];
  311. x++;
  312. nLastWidth = nCurrWidth;
  313. nCurrWidth += nCntCopyWord;
  314. if ( bBlend )
  315. {
  316. if ((nShadowCenterX+nLastWidth+((-nRealCenterY/2)-nYCnt/2)) < 0 && (nShadowCenterX+nCurrWidth+((-nRealCenterY/2)-nYCnt/2)) >= 0 )
  317. {
  318. }
  319. else if ((nShadowCenterX+nLastWidth+((-nRealCenterY/2)-nYCnt/2)) < wClipWidth && (nShadowCenterX+nCurrWidth+((-nRealCenterY/2)-nYCnt/2)) >= wClipWidth )
  320. {
  321. }
  322. else if ( (nShadowCenterX+nCurrWidth+((-nRealCenterY/2)-nYCnt/2)) < 0 )
  323. {
  324. }
  325. else if ( (nShadowCenterX+nCurrWidth+((-nRealCenterY/2)-nYCnt/2)) >= wClipWidth )
  326. {
  327. }
  328. else
  329. {
  330. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  331. {
  332. wPixel = wSahdowColor;
  333. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  334. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  335. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  336. wPixel  = pwdDst[nDstYPos*(ddsd.lPitch >> 1) + (nShadowCenterX+nLastWidth+((-nRealCenterY/2)-nYCnt/2)) + nCheck];
  337. bBlueDst   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  338. bGreenDst  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  339. bRedDst    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  340. bBlueDst   = (BYTE)((bOpa*(bBlueDst -bBlueWantedColor)+100*bBlueWantedColor  ) / 100);
  341. bGreenDst  = (BYTE)((bOpa*(bGreenDst-bGreenWantedColor)+100*bGreenWantedColor) / 100);
  342. bRedDst    = (BYTE)((bOpa*(bRedDst  -bRedWantedColor)+100*bRedWantedColor    ) / 100);
  343. pwdDst[nDstYPos*(ddsd.lPitch >> 1) + (nShadowCenterX+nLastWidth+((-nRealCenterY/2)-nYCnt/2)+nCheck)] = ((bRedDst  <<m_stBitsMaskInfo.bRShift) |
  344. (bGreenDst<<m_stBitsMaskInfo.bGShift) |
  345. (bBlueDst <<m_stBitsMaskInfo.bBShift)); }
  346. }
  347. }
  348. else
  349. {
  350. if ((nShadowCenterX+nLastWidth+((-nRealCenterY/2)-nYCnt/2)) < 0 && (nShadowCenterX+nCurrWidth+((-nRealCenterY/2)-nYCnt/2)) >= 0 )
  351. {
  352. }
  353. else if ((nShadowCenterX+nLastWidth+((-nRealCenterY/2)-nYCnt/2)) < wClipWidth && (nShadowCenterX+nCurrWidth+((-nRealCenterY/2)-nYCnt/2)) >= wClipWidth )
  354. {
  355. }
  356. else if ( (nShadowCenterX+nCurrWidth+((-nRealCenterY/2)-nYCnt/2)) < 0 )
  357. {
  358. }
  359. else if ( (nShadowCenterX+nCurrWidth+((-nRealCenterY/2)-nYCnt/2)) >= wClipWidth )
  360. {
  361. }
  362. else
  363. {
  364. // memset(&pwdDst[nDstYPos*(ddsd.lPitch >> 1) + (nShadowCenterX+nLastWidth+((-nRealCenterY/2)-nYCnt/2))], wSahdowColor, sizeof(WORD)*nCntCopyWord);
  365. memcpy(&pwdDst[nDstYPos*(ddsd.lPitch >> 1) + (nShadowCenterX+nLastWidth+((-nRealCenterY/2)-nYCnt/2))], pwShadowClrSrc, sizeof(WORD)*nCntCopyWord);
  366. }
  367. }
  368. x += nCntCopyWord;
  369. }
  370. }
  371. // 扼牢狼 场阑 促澜 扼牢狼 矫累栏肺 颗败霖促.
  372. nWidthEnd++;
  373. nWidthStart = nWidthEnd;
  374. nCurrWidth = 0;
  375. }
  376. }
  377. m_pddsBackBuffer->Unlock(NULL);
  378. }
  379. }
  380. }
  381. BOOL CWHDXGraphicWindow::DrawWithABlendCompDataWithLightedColor(INT nX, INT nY, 
  382.     INT nXSize, INT nYSize, WORD* pwSrc,
  383.     WORD wClipWidth, WORD wClipHeight,
  384.     WORD wChooseColor1, WORD wChooseColor2)
  385. {
  386. RECT rc;
  387. DDSURFACEDESC2 ddsd;
  388. INT nWidth = nXSize;
  389. INT nHeight = nYSize;
  390. INT nXOffset = 0;
  391. INT nYOffset = 0;
  392. INT nStartX = 0;
  393. INT nStartY = 0;
  394. INT nEndX = wClipWidth -1;
  395. INT nEndY = wClipHeight-1;
  396. FLOAT fBright = 0.3f;
  397. if ( m_pddsBackBuffer != NULL )
  398. {
  399. if (nX < nStartX )
  400. nXOffset = nStartX - nX;
  401. nWidth = nXSize - nXOffset;
  402. }
  403. if ( (nX+nXSize-1) > nEndX )
  404. nWidth = nEndX - nX - nXOffset + 1;
  405. if ( nY < nStartY )
  406. nYOffset = nStartY - nY;
  407. nHeight = nYSize - nYOffset;
  408. }
  409. if ( (nY+nYSize-1) > nEndY )
  410. nHeight = nEndY - nY - nYOffset + 1;
  411. if ( (nWidth > 0) && (nHeight > 0) )
  412. {
  413. rc.left = nXOffset;
  414. rc.right = nXOffset+nWidth;
  415. rc.top = nYOffset;
  416. rc.bottom = nYOffset+nHeight;
  417. ddsd.dwSize = sizeof(DDSURFACEDESC2);
  418. ddsd.lpSurface = NULL;
  419. m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  420. if ( !ddsd.lpSurface ) return FALSE;
  421. WORD* pwdDst;
  422. pwdDst = (WORD*)ddsd.lpSurface;
  423. INT nWidthStart = 0;
  424. INT nWidthEnd = 0;
  425. INT nCurrWidth  = 0;
  426. INT nCntCopyWord = 0;
  427. INT nYCnt =0;
  428. INT nLastWidth = 0;
  429. BYTE  bRedWantedColor, bGreenWantedColor, bBlueWantedColor;
  430. BYTE bRedSrc, bGreenSrc, bBlueSrc;
  431. WORD wPixel;
  432. WORD wDyingKind, wChooseColor;
  433. FLOAT rBlueRate, rGreenRate, bRedRate;
  434. // y绵 努府俏.
  435.    for ( nYCnt=0 ; nYCnt < rc.top ; nYCnt++ )
  436. {
  437. nWidthEnd += pwSrc[nWidthStart];
  438. nWidthStart++;
  439. nWidthEnd++;
  440. nWidthStart = nWidthEnd;
  441. }
  442. // y绵俊 措秦辑 角力肺 风俏矫懦 Count父阑 沥茄促.
  443. for ( nYCnt=rc.top ; nYCnt < rc.bottom ; nYCnt++ )
  444. {
  445. // 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
  446. nWidthEnd += pwSrc[nWidthStart];
  447. nWidthStart++;
  448. // 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
  449. for ( INT x = nWidthStart; x < nWidthEnd ; )
  450. {
  451. if ( pwSrc[x] == 0xC0 )
  452. {
  453. x++;
  454. nCntCopyWord = pwSrc[x];
  455. x++;
  456. nCurrWidth += nCntCopyWord;
  457. }
  458. else if ( pwSrc[x] == 0xC1 )
  459. {
  460. x++;
  461. nCntCopyWord = pwSrc[x];
  462. x++;
  463. nLastWidth = nCurrWidth;
  464. nCurrWidth += nCntCopyWord;
  465. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  466. {
  467. x += nCntCopyWord;
  468. }
  469. else
  470. {
  471. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  472. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  473. {
  474. x += (rc.left-nLastWidth);
  475. for ( INT nCheck = 0; nCheck < nCurrWidth-rc.left; nCheck++ )
  476. {
  477. wPixel = pwSrc[x+nCheck];
  478. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  479. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  480. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  481. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  482. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  483. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  484. bBlueSrc = (BYTE)((FLOAT)bBlueSrc + ((FLOAT)bBlueSrc*rBlueRate*fBright));
  485. bGreenSrc = (BYTE)((FLOAT)bGreenSrc + ((FLOAT)bGreenSrc*rGreenRate*fBright));
  486. bRedSrc = (BYTE)((FLOAT)bRedSrc + ((FLOAT)bRedSrc*bRedRate*fBright));
  487. if ( bBlueSrc > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  488. bBlueSrc = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  489. if ( bGreenSrc > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  490. bGreenSrc = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  491. if ( bRedSrc > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  492. bRedSrc = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  493. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (rc.left+nX+nCheck)] = ((bBlueSrc <<m_stBitsMaskInfo.bBShift) |
  494.    (bGreenSrc<<m_stBitsMaskInfo.bGShift) |
  495.    (bRedSrc  <<m_stBitsMaskInfo.bRShift));
  496. }
  497. x += (nCurrWidth-rc.left);
  498. }
  499. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  500. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  501. {
  502. for ( INT nCheck = 0; nCheck < rc.right-nLastWidth; nCheck++ )
  503. {
  504. wPixel = pwSrc[x+nCheck];
  505. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  506. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  507. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  508. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  509. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  510. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  511. bBlueSrc = (BYTE)((FLOAT)bBlueSrc + ((FLOAT)bBlueSrc*rBlueRate*fBright));
  512. bGreenSrc = (BYTE)((FLOAT)bGreenSrc + ((FLOAT)bGreenSrc*rGreenRate*fBright));
  513. bRedSrc = (BYTE)((FLOAT)bRedSrc + ((FLOAT)bRedSrc*bRedRate*fBright));
  514. if ( bBlueSrc > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  515. bBlueSrc = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  516. if ( bGreenSrc > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  517. bGreenSrc = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  518. if ( bRedSrc > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  519. bRedSrc = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  520. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bBlueSrc <<m_stBitsMaskInfo.bRShift) |
  521.       (bGreenSrc<<m_stBitsMaskInfo.bGShift) |
  522.   (bRedSrc  <<m_stBitsMaskInfo.bBShift));
  523. }
  524. x += nCntCopyWord;
  525. }
  526. else
  527. {
  528. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  529. {
  530. wPixel = pwSrc[x+nCheck];
  531. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  532. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  533. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  534. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  535. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  536. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  537. bBlueSrc = (BYTE)((FLOAT)bBlueSrc + ((FLOAT)bBlueSrc*rBlueRate*fBright));
  538. bGreenSrc = (BYTE)((FLOAT)bGreenSrc + ((FLOAT)bGreenSrc*rGreenRate*fBright));
  539. bRedSrc = (BYTE)((FLOAT)bRedSrc + ((FLOAT)bRedSrc*bRedRate*fBright));
  540. if ( bBlueSrc > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  541. bBlueSrc = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  542. if ( bGreenSrc > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  543. bGreenSrc = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  544. if ( bRedSrc > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  545. bRedSrc = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  546. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bBlueSrc <<m_stBitsMaskInfo.bBShift) |
  547.       (bGreenSrc<<m_stBitsMaskInfo.bGShift) |
  548.   (bRedSrc  <<m_stBitsMaskInfo.bRShift));
  549. }
  550. x += nCntCopyWord;
  551. }
  552. }
  553. }
  554. else if ( pwSrc[x] == 0xC2 || pwSrc[x] == 0xC3 )
  555. {
  556. wDyingKind = pwSrc[x];
  557. switch ( wDyingKind )
  558. {
  559. case 0xC2: 
  560. wChooseColor = wChooseColor1;
  561. break;
  562. case 0xC3: 
  563. wChooseColor = wChooseColor2;
  564. break;
  565. }
  566. x++;
  567. nCntCopyWord = pwSrc[x];
  568. x++;
  569. nLastWidth = nCurrWidth;
  570. nCurrWidth += nCntCopyWord;
  571. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  572. {
  573. x += nCntCopyWord;
  574. }
  575. else
  576. {
  577. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  578. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  579. {
  580. x += (rc.left-nLastWidth);
  581. for ( INT nCheck = 0; nCheck < nCurrWidth-rc.left; nCheck++ )
  582. {
  583. wPixel   = wChooseColor;
  584. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  585. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  586. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  587. wPixel   = pwSrc[x+nCheck];
  588. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  589. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  590. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  591. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  592. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  593. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  594. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  595. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  596. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  597. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  598. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  599. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  600. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  601. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  602. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  603. bBlueSrc = bBlueWantedColor;
  604. bGreenSrc = bGreenWantedColor;
  605. bRedSrc = bRedWantedColor;
  606. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  607. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  608. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  609. bBlueSrc = (BYTE)((FLOAT)bBlueSrc + ((FLOAT)bBlueSrc*rBlueRate*fBright));
  610. bGreenSrc = (BYTE)((FLOAT)bGreenSrc + ((FLOAT)bGreenSrc*rGreenRate*fBright));
  611. bRedSrc = (BYTE)((FLOAT)bRedSrc + ((FLOAT)bRedSrc*bRedRate*fBright));
  612. if ( bBlueSrc > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  613. bBlueSrc = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  614. if ( bGreenSrc > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  615. bGreenSrc = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  616. if ( bRedSrc > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  617. bRedSrc = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  618. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (rc.left+nX+nCheck)] = ((bBlueSrc <<m_stBitsMaskInfo.bBShift) |
  619.    (bGreenSrc<<m_stBitsMaskInfo.bGShift) |
  620.    (bRedSrc  <<m_stBitsMaskInfo.bRShift));
  621. }
  622. x += (nCurrWidth-rc.left);
  623. }
  624. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  625. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  626. {
  627. for ( INT nCheck = 0; nCheck < rc.right-nLastWidth; nCheck++ )
  628. {
  629. wPixel   = wChooseColor;
  630. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  631. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  632. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  633. wPixel   = pwSrc[x+nCheck];
  634. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  635. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  636. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  637. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  638. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  639. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  640. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  641. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  642. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  643. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  644. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  645. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  646. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  647. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  648. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  649. bBlueSrc = bBlueWantedColor;
  650. bGreenSrc = bGreenWantedColor;
  651. bRedSrc = bRedWantedColor;
  652. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  653. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  654. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  655. bBlueSrc = (BYTE)((FLOAT)bBlueSrc + ((FLOAT)bBlueSrc*rBlueRate*fBright));
  656. bGreenSrc = (BYTE)((FLOAT)bGreenSrc + ((FLOAT)bGreenSrc*rGreenRate*fBright ));
  657. bRedSrc = (BYTE)((FLOAT)bRedSrc + ((FLOAT)bRedSrc*bRedRate*fBright));
  658. if ( bBlueSrc > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  659. bBlueSrc = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  660. if ( bGreenSrc > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  661. bGreenSrc = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  662. if ( bRedSrc > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  663. bRedSrc = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  664. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bBlueSrc <<m_stBitsMaskInfo.bRShift) |
  665.       (bGreenSrc<<m_stBitsMaskInfo.bGShift) |
  666.   (bRedSrc  <<m_stBitsMaskInfo.bBShift));
  667. }
  668. x += nCntCopyWord;
  669. }
  670. else
  671. {
  672. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  673. {
  674. wPixel   = wChooseColor;
  675. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  676. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  677. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  678. wPixel   = pwSrc[x+nCheck];
  679. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  680. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  681. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  682. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  683. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  684. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  685. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  686. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  687. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  688. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  689. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  690. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  691. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  692. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  693. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  694. bBlueSrc = bBlueWantedColor;
  695. bGreenSrc = bGreenWantedColor;
  696. bRedSrc = bRedWantedColor;
  697. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  698. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  699. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  700. bBlueSrc = (BYTE)((FLOAT)bBlueSrc + ((FLOAT)bBlueSrc*rBlueRate*fBright));
  701. bGreenSrc = (BYTE)((FLOAT)bGreenSrc + ((FLOAT)bGreenSrc*rGreenRate*fBright));
  702. bRedSrc = (BYTE)((FLOAT)bRedSrc + ((FLOAT)bRedSrc*bRedRate*fBright));
  703. if ( bBlueSrc > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  704. bBlueSrc = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  705. if ( bGreenSrc > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  706. bGreenSrc = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  707. if ( bRedSrc > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  708. bRedSrc = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  709. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bBlueSrc <<m_stBitsMaskInfo.bBShift) |
  710.       (bGreenSrc<<m_stBitsMaskInfo.bGShift) |
  711.   (bRedSrc  <<m_stBitsMaskInfo.bRShift));
  712. }
  713. x += nCntCopyWord;
  714. }
  715. }
  716. }
  717. }
  718. // 扼牢狼 场阑 促澜 扼牢狼 矫累栏肺 颗败霖促.
  719. nWidthEnd++;
  720. nWidthStart = nWidthEnd;
  721. nCurrWidth = 0;
  722. }
  723. }
  724. m_pddsBackBuffer->Unlock(NULL);
  725. return TRUE;
  726. }
  727. return FALSE;
  728. }
  729. BOOL CWHDXGraphicWindow::DrawWithImageForCompClipRgnColor(INT nX, INT nY, INT nXSize, INT nYSize, WORD* pwSrc, WORD wClipWidth, WORD wClipHeight, WORD wColor, BOOL bFocused, BOOL bBlend)
  730. {
  731. RECT rc;
  732. DDSURFACEDESC2 ddsd;
  733. INT nWidth = nXSize;
  734. INT nHeight = nYSize;
  735. INT nXOffset = 0;
  736. INT nYOffset = 0;
  737. INT nStartX = 0;
  738. INT nStartY = 0;
  739. INT nEndX = wClipWidth -1;
  740. INT nEndY = wClipHeight-1;
  741. if ( m_pddsBackBuffer != NULL )
  742. {
  743. if (nX < nStartX )
  744. nXOffset = nStartX - nX;
  745. nWidth = nXSize - nXOffset;
  746. }
  747. if ( (nX+nXSize-1) > nEndX )
  748. nWidth = nEndX - nX - nXOffset + 1;
  749. if ( nY < nStartY )
  750. nYOffset = nStartY - nY;
  751. nHeight = nYSize - nYOffset;
  752. }
  753. if ( (nY+nYSize-1) > nEndY )
  754. nHeight = nEndY - nY - nYOffset + 1;
  755. if ( (nWidth > 0) && (nHeight > 0) )
  756. {
  757. rc.left = nXOffset;
  758. rc.right = nXOffset+nWidth;
  759. rc.top = nYOffset;
  760. rc.bottom = nYOffset+nHeight;
  761. ddsd.dwSize = sizeof(DDSURFACEDESC2);
  762. ddsd.lpSurface = NULL;
  763. m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  764. if ( !ddsd.lpSurface ) return FALSE;
  765. WORD* pwdDst;
  766. pwdDst = (WORD*)ddsd.lpSurface;
  767. INT nWidthStart = 0;
  768. INT nWidthEnd = 0;
  769. INT nCurrWidth  = 0;
  770. INT nCntCopyWord = 0;
  771. INT nYCnt =0;
  772. INT nLastWidth = 0;
  773. BYTE  bRedStateColor,  bGreenStateColor,  bBlueStateColor;
  774. BYTE  bRedSrc, bGreenSrc, bBlueSrc;
  775. BYTE  bBlueDst, bGreenDst, bRedDst;
  776. WORD  wPixel;
  777. FLOAT rBlueRate, rGreenRate, rRedRate;
  778. FLOAT rbLightRate = 0.0f;
  779. // y绵 努府俏.
  780.    for ( nYCnt=0 ; nYCnt < rc.top ; nYCnt++ )
  781. {
  782. nWidthEnd += pwSrc[nWidthStart];
  783. nWidthStart++;
  784. nWidthEnd++;
  785. nWidthStart = nWidthEnd;
  786. }
  787. // y绵俊 措秦辑 角力肺 风俏矫懦 Count父阑 沥茄促.
  788. for ( nYCnt=rc.top ; nYCnt < rc.bottom ; nYCnt++ )
  789. {
  790. // 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
  791. nWidthEnd += pwSrc[nWidthStart];
  792. nWidthStart++;
  793. // 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
  794. for ( INT x = nWidthStart; x < nWidthEnd ; )
  795. {
  796. if ( pwSrc[x] == 0xC0 )
  797. {
  798. x++;
  799. nCntCopyWord = pwSrc[x];
  800. x++;
  801. nCurrWidth += nCntCopyWord;
  802. }
  803. else if ( pwSrc[x] == 0xC1 || pwSrc[x] == 0xC2 || pwSrc[x] == 0xC3 )
  804. {
  805. x++;
  806. nCntCopyWord = pwSrc[x];
  807. x++;
  808. nLastWidth = nCurrWidth;
  809. nCurrWidth += nCntCopyWord;
  810. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  811. {
  812. x += nCntCopyWord;
  813. }
  814. else
  815. {
  816. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  817. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  818. {
  819. x += (rc.left-nLastWidth);
  820. for ( INT nCheck = 0; nCheck < nCurrWidth-rc.left; nCheck++ )
  821. {
  822. wPixel = wColor;
  823. bBlueStateColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  824. bGreenStateColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  825. bRedStateColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  826. wPixel = pwSrc[x+nCheck];
  827. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  828. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  829. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  830. // Focus咯何.
  831. if ( bFocused ) rbLightRate = 0.6f;
  832. else rbLightRate = 0.0f;
  833. if ( !wColor )
  834. {
  835. BYTE bTemp = (BYTE)(bBlueSrc+(bGreenSrc>>1)+bRedSrc)/3;
  836. bTemp = bTemp + (BYTE)(bTemp*rbLightRate);
  837. if ( bTemp > 31 ) bTemp = 31;
  838. bBlueStateColor = bRedStateColor = bTemp;
  839. bGreenStateColor = bTemp<<1;
  840. }
  841. else
  842. {
  843. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  844. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  845. rRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  846. bBlueStateColor  = ( (BYTE)((FLOAT)bBlueStateColor *rBlueRate ) + (BYTE)((FLOAT)bBlueStateColor *rBlueRate *rbLightRate) );
  847. bGreenStateColor = ( (BYTE)((FLOAT)bGreenStateColor*rGreenRate) + (BYTE)((FLOAT)bGreenStateColor*rGreenRate*rbLightRate) );
  848. bRedStateColor   = ( (BYTE)((FLOAT)bRedStateColor  *rRedRate  ) + (BYTE)((FLOAT)bRedStateColor  *rRedRate  *rbLightRate) );
  849. if ( bBlueStateColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  850. bBlueStateColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  851. if ( bGreenStateColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  852. bGreenStateColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  853. if ( bRedStateColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  854. bRedStateColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  855. }
  856. if ( bBlend )
  857. {
  858. wPixel    = pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)];
  859. bBlueDst   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  860. bGreenDst  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  861. bRedDst    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  862. bBlueDst   = (BYTE)((50*(bBlueDst -bBlueStateColor )+100*bBlueStateColor  ) / 100);
  863. bGreenDst  = (BYTE)((50*(bGreenDst-bGreenStateColor)+100*bGreenStateColor ) / 100);
  864. bRedDst    = (BYTE)((50*(bRedDst  -bRedStateColor  )+100*bRedStateColor   ) / 100);
  865. }
  866. else
  867. {
  868. bBlueDst   = bBlueStateColor;
  869. bGreenDst  = bGreenStateColor;
  870. bRedDst    = bRedStateColor;
  871. }
  872. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (rc.left+nX+nCheck)] = ((bBlueDst <<m_stBitsMaskInfo.bBShift) |
  873.    (bGreenDst<<m_stBitsMaskInfo.bGShift) |
  874.    (bRedDst  <<m_stBitsMaskInfo.bRShift));
  875. }
  876. x += (nCurrWidth-rc.left);
  877. }
  878. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  879. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  880. {
  881. for ( INT nCheck = 0; nCheck < rc.right-nLastWidth; nCheck++ )
  882. {
  883. wPixel = wColor;
  884. bBlueStateColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  885. bGreenStateColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  886. bRedStateColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  887. wPixel = pwSrc[x+nCheck];
  888. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  889. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  890. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  891. // Focus咯何.
  892. if ( bFocused ) rbLightRate = 0.6f;
  893. else rbLightRate = 0.0f;
  894. if ( !wColor )
  895. {
  896. BYTE bTemp = (BYTE)(bBlueSrc+(bGreenSrc>>1)+bRedSrc)/3;
  897. bTemp = bTemp + (BYTE)(bTemp*rbLightRate);
  898. if ( bTemp > 31 ) bTemp = 31;
  899. bBlueStateColor = bRedStateColor = bTemp;
  900. bGreenStateColor = bTemp<<1;
  901. }
  902. else
  903. {
  904. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  905. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  906. rRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  907. bBlueStateColor  = ( (BYTE)((FLOAT)bBlueStateColor *rBlueRate ) + (BYTE)((FLOAT)bBlueStateColor *rBlueRate *rbLightRate) );
  908. bGreenStateColor = ( (BYTE)((FLOAT)bGreenStateColor*rGreenRate) + (BYTE)((FLOAT)bGreenStateColor*rGreenRate*rbLightRate) );
  909. bRedStateColor   = ( (BYTE)((FLOAT)bRedStateColor  *rRedRate  ) + (BYTE)((FLOAT)bRedStateColor  *rRedRate  *rbLightRate) );
  910. if ( bBlueStateColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  911. bBlueStateColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  912. if ( bGreenStateColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  913. bGreenStateColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  914. if ( bRedStateColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  915. bRedStateColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  916. }
  917. if ( bBlend )
  918. {
  919. wPixel    = pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)];
  920. bBlueDst   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  921. bGreenDst  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  922. bRedDst    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  923. bBlueDst   = (BYTE)((50*(bBlueDst -bBlueStateColor )+100*bBlueStateColor  ) / 100);
  924. bGreenDst  = (BYTE)((50*(bGreenDst-bGreenStateColor)+100*bGreenStateColor ) / 100);
  925. bRedDst    = (BYTE)((50*(bRedDst  -bRedStateColor  )+100*bRedStateColor   ) / 100);
  926. }
  927. else
  928. {
  929. bBlueDst   = bBlueStateColor;
  930. bGreenDst  = bGreenStateColor;
  931. bRedDst    = bRedStateColor;
  932. }
  933. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bBlueDst <<m_stBitsMaskInfo.bRShift) |
  934.       (bGreenDst<<m_stBitsMaskInfo.bGShift) |
  935.   (bRedDst  <<m_stBitsMaskInfo.bBShift));
  936. }
  937. x += nCntCopyWord;
  938. }
  939. else
  940. {
  941. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  942. {
  943. wPixel = wColor;
  944. bBlueStateColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  945. bGreenStateColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  946. bRedStateColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  947. wPixel = pwSrc[x+nCheck];
  948. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  949. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  950. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  951. // Focus咯何.
  952. if ( bFocused ) rbLightRate = 0.6f;
  953. else rbLightRate = 0.0f;
  954. if ( !wColor )
  955. {
  956. BYTE bTemp = (BYTE)(bBlueSrc+(bGreenSrc>>1)+bRedSrc)/3;
  957. bTemp = bTemp + (BYTE)(bTemp*rbLightRate);
  958. if ( bTemp > 31 ) bTemp = 31;
  959. bBlueStateColor = bRedStateColor = bTemp;
  960. bGreenStateColor = bTemp<<1;
  961. }
  962. else
  963. {
  964. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  965. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  966. rRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  967. bBlueStateColor  = ( (BYTE)((FLOAT)bBlueStateColor *rBlueRate ) + (BYTE)((FLOAT)bBlueStateColor *rBlueRate *rbLightRate) );
  968. bGreenStateColor = ( (BYTE)((FLOAT)bGreenStateColor*rGreenRate) + (BYTE)((FLOAT)bGreenStateColor*rGreenRate*rbLightRate) );
  969. bRedStateColor   = ( (BYTE)((FLOAT)bRedStateColor  *rRedRate  ) + (BYTE)((FLOAT)bRedStateColor  *rRedRate  *rbLightRate) );
  970. if ( bBlueStateColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  971. bBlueStateColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  972. if ( bGreenStateColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  973. bGreenStateColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  974. if ( bRedStateColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  975. bRedStateColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  976. }
  977. if ( bBlend )
  978. {
  979. wPixel    = pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)];
  980. bBlueDst   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  981. bGreenDst  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  982. bRedDst    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  983. bBlueDst   = (BYTE)((50*(bBlueDst -bBlueStateColor )+100*bBlueStateColor  ) / 100);
  984. bGreenDst  = (BYTE)((50*(bGreenDst-bGreenStateColor)+100*bGreenStateColor ) / 100);
  985. bRedDst    = (BYTE)((50*(bRedDst  -bRedStateColor  )+100*bRedStateColor   ) / 100);
  986. }
  987. else
  988. {
  989. bBlueDst   = bBlueStateColor;
  990. bGreenDst  = bGreenStateColor;
  991. bRedDst    = bRedStateColor;
  992. }
  993. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bBlueDst <<m_stBitsMaskInfo.bBShift) |
  994.       (bGreenDst<<m_stBitsMaskInfo.bGShift) |
  995.   (bRedDst  <<m_stBitsMaskInfo.bRShift));
  996. }
  997. x += nCntCopyWord;
  998. }
  999. }
  1000. }
  1001. }
  1002. // 扼牢狼 场阑 促澜 扼牢狼 矫累栏肺 颗败霖促.
  1003. nWidthEnd++;
  1004. nWidthStart = nWidthEnd;
  1005. nCurrWidth = 0;
  1006. }
  1007. }
  1008. m_pddsBackBuffer->Unlock(NULL);
  1009. return TRUE;
  1010. }
  1011. return FALSE;
  1012. }
  1013. BOOL CWHDXGraphicWindow::DrawWithImageForCompClipRgnColor(INT nX, INT nY, INT nXSize, INT nYSize, WORD* pwSrc, WORD wClipWidth, WORD wClipHeight,WORD wColor , WORD wChooseColor1, WORD wChooseColor2)
  1014. {
  1015. RECT rc;
  1016. DDSURFACEDESC2 ddsd;
  1017. INT nWidth = nXSize;
  1018. INT nHeight = nYSize;
  1019. INT nXOffset = 0;
  1020. INT nYOffset = 0;
  1021. INT nStartX = 0;
  1022. INT nStartY = 0;
  1023. INT nEndX = wClipWidth -1;
  1024. INT nEndY = wClipHeight-1;
  1025. INT FiveMiddle = 0xf;
  1026. INT SixMiddle = 0x1f;
  1027. BYTE bsBlueColor,bsGreenColor,bsRedColor;
  1028. BYTE bdBlueColor,bdGreenColor,bdRedColor;
  1029. bdBlueColor  = (BYTE)((wColor & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1030. bdGreenColor = (BYTE)((wColor & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1031. bdRedColor   = (BYTE)((wColor & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1032. if ( m_pddsBackBuffer != NULL )
  1033. {
  1034. if (nX < nStartX )
  1035. nXOffset = nStartX - nX;
  1036. nWidth = nXSize - nXOffset;
  1037. }
  1038. if ( (nX+nXSize-1) > nEndX )
  1039. nWidth = nEndX - nX - nXOffset + 1;
  1040. if ( nY < nStartY )
  1041. nYOffset = nStartY - nY;
  1042. nHeight = nYSize - nYOffset;
  1043. }
  1044. if ( (nY+nYSize-1) > nEndY )
  1045. nHeight = nEndY - nY - nYOffset + 1;
  1046. if ( (nWidth > 0) && (nHeight > 0) )
  1047. {
  1048. rc.left = nXOffset;
  1049. rc.right = nXOffset+nWidth;
  1050. rc.top = nYOffset;
  1051. rc.bottom = nYOffset+nHeight;
  1052. ddsd.dwSize = sizeof(DDSURFACEDESC2);
  1053. ddsd.lpSurface = NULL;
  1054. m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  1055. if ( !ddsd.lpSurface ) return FALSE;
  1056. WORD* pwdDst;
  1057. pwdDst = (WORD*)ddsd.lpSurface;
  1058. INT nWidthStart = 0;
  1059. INT nWidthEnd = 0;
  1060. INT nCurrWidth  = 0;
  1061. INT nCntCopyWord = 0;
  1062. INT nYCnt =0;
  1063. INT nLastWidth = 0;
  1064. FLOAT rBlueRate, rGreenRate, bRedRate;
  1065. BYTE  bRedSrc, bGreenSrc, bBlueSrc;
  1066. BYTE  bRedWantedColor, bGreenWantedColor, bBlueWantedColor;
  1067. WORD  wPixel;
  1068. // y绵 努府俏.
  1069. for ( nYCnt=0 ; nYCnt < rc.top ; nYCnt++ )
  1070. {
  1071. nWidthEnd += pwSrc[nWidthStart];
  1072. nWidthStart++;
  1073. nWidthEnd++;
  1074. nWidthStart = nWidthEnd;
  1075. }
  1076. // y绵俊 措秦辑 角力肺 风俏矫懦 Count父阑 沥茄促.
  1077. for ( nYCnt=rc.top ; nYCnt < rc.bottom ; nYCnt++ )
  1078. {
  1079. // 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
  1080. nWidthEnd += pwSrc[nWidthStart];
  1081. nWidthStart++;
  1082. // 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
  1083. for ( INT x = nWidthStart; x < nWidthEnd ; )
  1084. {
  1085. if ( pwSrc[x] == 0xC0 )
  1086. {
  1087. x++;
  1088. nCntCopyWord = pwSrc[x];
  1089. x++;
  1090. nCurrWidth += nCntCopyWord;
  1091. }
  1092. else if ( pwSrc[x] == 0xC1 )
  1093. {
  1094. x++;
  1095. nCntCopyWord = pwSrc[x]; // 肮荐
  1096. x++;
  1097. nLastWidth = nCurrWidth;
  1098. nCurrWidth += nCntCopyWord;
  1099. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  1100. {
  1101. x += nCntCopyWord; // 倔配 寸配 臼篮 版快
  1102. }
  1103. else
  1104. {
  1105. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1106. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  1107. {
  1108. x += (rc.left-nLastWidth);
  1109. for(WORD i = 0 ; i < (sizeof(WORD)*(nCurrWidth-rc.left)/2);i++)
  1110. {
  1111. bsBlueColor  = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1112. bsGreenColor = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1113. bsRedColor   = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1114. BYTE temp;
  1115. temp = (bsRedColor+(bsGreenColor>>1)+bsBlueColor)/3;
  1116. bsBlueColor = temp>0 ? (temp&bdBlueColor) : 0;
  1117. bsGreenColor = temp>0 ? (temp&(bdGreenColor<<1)) : 0;
  1118. bsRedColor = temp>0 ? (temp&bdRedColor) :  0;
  1119. if ( bsBlueColor >= 32 )  bsBlueColor = 31;
  1120. if ( bsGreenColor >= 64 )  bsGreenColor = 63;
  1121. if ( bsRedColor >= 32 )  bsRedColor = 31;
  1122. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (rc.left+nX) + i] = (bsBlueColor<<m_stBitsMaskInfo.bBShift) |  (bsGreenColor<<m_stBitsMaskInfo.bGShift) | (bsRedColor<<m_stBitsMaskInfo.bRShift);
  1123. }
  1124. x += (nCurrWidth-rc.left);
  1125. }
  1126. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1127. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  1128. {
  1129. for(WORD i = 0 ; i < (sizeof(WORD)*(rc.right-nLastWidth));i++)
  1130. {
  1131. bsBlueColor  = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1132. bsGreenColor = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1133. bsRedColor   = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1134. BYTE temp;
  1135. temp = (bsRedColor+(bsGreenColor>>1)+bsBlueColor)/3;
  1136. bsBlueColor = temp>0 ? (temp&bdBlueColor) : 0;
  1137. bsGreenColor = temp>0 ? (temp&(bdGreenColor<<1)) : 0;
  1138. bsRedColor = temp>0 ? (temp&bdRedColor) :  0;
  1139. if ( bsBlueColor >= 32 )  bsBlueColor = 31;
  1140. if ( bsGreenColor >= 64 )  bsGreenColor = 63;
  1141. if ( bsRedColor >= 32 )  bsRedColor = 31;
  1142. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX) + i] = (bsBlueColor<<m_stBitsMaskInfo.bBShift) |  (bsGreenColor<<m_stBitsMaskInfo.bGShift) | (bsRedColor<<m_stBitsMaskInfo.bRShift);
  1143. }
  1144. // memcpy(&pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX)], &pwSrc[x], sizeof(WORD)*(rc.right-nLastWidth));
  1145. x += nCntCopyWord;
  1146. }
  1147. else
  1148. {
  1149. for(WORD i = 0 ; i < (sizeof(WORD)*nCntCopyWord/2);i++)
  1150. {
  1151. bsBlueColor  = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1152. bsGreenColor = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1153. bsRedColor   = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1154. BYTE temp;
  1155. temp = (bsRedColor+(bsGreenColor>>1)+bsBlueColor)/3;
  1156. bsBlueColor = temp>0 ? (temp&bdBlueColor) : 0;
  1157. bsGreenColor = temp>0 ? (temp&(bdGreenColor<<1)) : 0;
  1158. bsRedColor = temp>0 ? (temp&bdRedColor) :  0;
  1159. if ( bsBlueColor >= 32 )  bsBlueColor = 31;
  1160. if ( bsGreenColor >= 64 )  bsGreenColor = 63;
  1161. if ( bsRedColor >= 32 )  bsRedColor = 31;
  1162. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX) + i] = (bsBlueColor<<m_stBitsMaskInfo.bBShift) |  (bsGreenColor<<m_stBitsMaskInfo.bGShift) | (bsRedColor<<m_stBitsMaskInfo.bRShift);
  1163. }
  1164. x += nCntCopyWord;
  1165. }
  1166. }
  1167. }
  1168. else if ( pwSrc[x] == 0xC2 || pwSrc[x] == 0xC3 )
  1169. {
  1170. WORD wDyingKind, wChooseColor;
  1171. wDyingKind = pwSrc[x];
  1172. switch ( wDyingKind )
  1173. {
  1174. case 0xC2: 
  1175. wChooseColor = wChooseColor1;
  1176. break;
  1177. case 0xC3: 
  1178. wChooseColor = wChooseColor2;
  1179. break;
  1180. }
  1181. x++;
  1182. nCntCopyWord = pwSrc[x];
  1183. x++;
  1184. nLastWidth = nCurrWidth;
  1185. nCurrWidth += nCntCopyWord;
  1186. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  1187. {
  1188. x += nCntCopyWord;
  1189. }
  1190. else
  1191. {
  1192. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1193. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  1194. {
  1195. x += (rc.left-nLastWidth);
  1196. for ( INT nCheck = 0; nCheck < nCurrWidth-rc.left; nCheck++ )
  1197. {
  1198. wPixel   = wChooseColor;
  1199. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1200. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1201. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1202. wPixel   = pwSrc[x+nCheck];
  1203. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1204. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1205. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1206. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1207. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1208. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1209. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  1210. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  1211. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  1212. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1213. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1214. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1215. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1216. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1217. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1218. BYTE temp;
  1219. temp = (bsRedColor+(bGreenWantedColor>>1)+bBlueWantedColor)/3;
  1220. bBlueWantedColor = temp>0 ? (temp&bdBlueColor) : 0;
  1221. bGreenWantedColor = temp>0 ? (temp&(bdGreenColor<<1)) : 0;
  1222. bRedWantedColor = temp>0 ? (temp&bdRedColor) :  0;
  1223. if ( bBlueWantedColor >= 32 )  bBlueWantedColor = 31;
  1224. if ( bGreenWantedColor >= 64 )  bGreenWantedColor = 63;
  1225. if ( bRedWantedColor >= 32 )  bRedWantedColor = 31;
  1226. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  1227.   (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  1228.   (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  1229. }
  1230. x += (nCurrWidth-rc.left);
  1231. }
  1232. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1233. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  1234. {
  1235. for ( INT nCheck = 0; nCheck < rc.right-nLastWidth; nCheck++ )
  1236. {
  1237. wPixel   = wChooseColor;
  1238. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1239. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1240. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1241. wPixel   = pwSrc[x+nCheck];
  1242. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1243. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1244. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1245. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1246. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1247. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1248. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  1249. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  1250. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  1251. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1252. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1253. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1254. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1255. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1256. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1257. BYTE temp;
  1258. temp = (bsRedColor+(bGreenWantedColor>>1)+bBlueWantedColor)/3;
  1259. bBlueWantedColor = temp>0 ? (temp&bdBlueColor) : 0;
  1260. bGreenWantedColor = temp>0 ? (temp&(bdGreenColor<<1)) : 0;
  1261. bRedWantedColor = temp>0 ? (temp&bdRedColor) :  0;
  1262. if ( bBlueWantedColor >= 32 )  bBlueWantedColor = 31;
  1263. if ( bGreenWantedColor >= 64 )  bGreenWantedColor = 63;
  1264. if ( bRedWantedColor >= 32 )  bRedWantedColor = 31;
  1265. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  1266.   (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  1267.   (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  1268. }
  1269. x += nCntCopyWord;
  1270. }
  1271. else
  1272. {
  1273. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  1274. {
  1275. wPixel   = wChooseColor;
  1276. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1277. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1278. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1279. wPixel   = pwSrc[x+nCheck];
  1280. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1281. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1282. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1283. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1284. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1285. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1286. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  1287. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  1288. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  1289. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1290. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1291. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1292. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1293. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1294. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1295. BYTE temp;
  1296. temp = (bsRedColor+(bGreenWantedColor>>1)+bBlueWantedColor)/3;
  1297. bBlueWantedColor = temp>0 ? (temp&bdBlueColor) : 0;
  1298. bGreenWantedColor = temp>0 ? (temp&(bdGreenColor<<1)) : 0;
  1299. bRedWantedColor = temp>0 ? (temp&bdRedColor) :  0;
  1300. if ( bBlueWantedColor >= 32 )  bBlueWantedColor = 31;
  1301. if ( bGreenWantedColor >= 64 )  bGreenWantedColor = 63;
  1302. if ( bRedWantedColor >= 32 )  bRedWantedColor = 31;
  1303. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  1304.   (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  1305.     (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  1306. }
  1307. x += nCntCopyWord;
  1308. }
  1309. }
  1310. }
  1311. }
  1312. // 扼牢狼 场阑 促澜 扼牢狼 矫累栏肺 颗败霖促.
  1313. nWidthEnd++;
  1314. nWidthStart = nWidthEnd;
  1315. nCurrWidth = 0;
  1316. }
  1317. }
  1318. m_pddsBackBuffer->Unlock(NULL);
  1319. return TRUE;
  1320. }
  1321. return FALSE;
  1322. }
  1323. BOOL CWHDXGraphicWindow::DrawWithImageForCompClipRgnGray(INT nX, INT nY, INT nXSize, INT nYSize, WORD* pwSrc , WORD wClipWidth, WORD wClipHeight, WORD wChooseColor1, WORD wChooseColor2)
  1324. {
  1325. RECT rc;
  1326. DDSURFACEDESC2 ddsd;
  1327. INT nWidth = nXSize;
  1328. INT nHeight = nYSize;
  1329. INT nXOffset = 0;
  1330. INT nYOffset = 0;
  1331. INT nStartX = 0;
  1332. INT nStartY = 0;
  1333. INT nEndX = wClipWidth -1;
  1334. INT nEndY = wClipHeight-1;
  1335. INT FiveMiddle = 0xf;
  1336. INT SixMiddle = 0x1f;
  1337. BYTE bsBlueColor,bsGreenColor,bsRedColor;
  1338. BYTE bdBlueColor,bdGreenColor,bdRedColor;
  1339. bdBlueColor  = 0x0f;
  1340. bdGreenColor = 0x1f;
  1341. bdRedColor   = 0x0f;
  1342. if ( m_pddsBackBuffer != NULL )
  1343. {
  1344. if (nX < nStartX )
  1345. nXOffset = nStartX - nX;
  1346. nWidth = nXSize - nXOffset;
  1347. }
  1348. if ( (nX+nXSize-1) > nEndX )
  1349. nWidth = nEndX - nX - nXOffset + 1;
  1350. if ( nY < nStartY )
  1351. nYOffset = nStartY - nY;
  1352. nHeight = nYSize - nYOffset;
  1353. }
  1354. if ( (nY+nYSize-1) > nEndY )
  1355. nHeight = nEndY - nY - nYOffset + 1;
  1356. if ( (nWidth > 0) && (nHeight > 0) )
  1357. {
  1358. rc.left = nXOffset;
  1359. rc.right = nXOffset+nWidth;
  1360. rc.top = nYOffset;
  1361. rc.bottom = nYOffset+nHeight;
  1362. ddsd.dwSize = sizeof(DDSURFACEDESC2);
  1363. ddsd.lpSurface = NULL;
  1364. m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  1365. if ( !ddsd.lpSurface ) return FALSE;
  1366. WORD* pwdDst;
  1367. pwdDst = (WORD*)ddsd.lpSurface;
  1368. INT nWidthStart = 0;
  1369. INT nWidthEnd = 0;
  1370. INT nCurrWidth  = 0;
  1371. INT nCntCopyWord = 0;
  1372. INT nYCnt =0;
  1373. INT nLastWidth = 0;
  1374. FLOAT rBlueRate, rGreenRate, bRedRate;
  1375. BYTE  bRedSrc, bGreenSrc, bBlueSrc;
  1376. BYTE  bRedWantedColor, bGreenWantedColor, bBlueWantedColor;
  1377. WORD  wPixel;
  1378. // y绵 努府俏.
  1379. for ( nYCnt=0 ; nYCnt < rc.top ; nYCnt++ )
  1380. {
  1381. nWidthEnd += pwSrc[nWidthStart];
  1382. nWidthStart++;
  1383. nWidthEnd++;
  1384. nWidthStart = nWidthEnd;
  1385. }
  1386. // y绵俊 措秦辑 角力肺 风俏矫懦 Count父阑 沥茄促.
  1387. for ( nYCnt=rc.top ; nYCnt < rc.bottom ; nYCnt++ )
  1388. {
  1389. // 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
  1390. nWidthEnd += pwSrc[nWidthStart];
  1391. nWidthStart++;
  1392. // 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
  1393. for ( INT x = nWidthStart; x < nWidthEnd ; )
  1394. {
  1395. if ( pwSrc[x] == 0xC0 )
  1396. {
  1397. x++;
  1398. nCntCopyWord = pwSrc[x];
  1399. x++;
  1400. nCurrWidth += nCntCopyWord;
  1401. }
  1402. else if ( pwSrc[x] == 0xC1 )
  1403. {
  1404. x++;
  1405. nCntCopyWord = pwSrc[x]; // 肮荐
  1406. x++;
  1407. nLastWidth = nCurrWidth;
  1408. nCurrWidth += nCntCopyWord;
  1409. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  1410. {
  1411. x += nCntCopyWord; // 倔配 寸配 臼篮 版快
  1412. }
  1413. else
  1414. {
  1415. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1416. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  1417. {
  1418. x += (rc.left-nLastWidth);
  1419. for(WORD i = 0 ; i < (sizeof(WORD)*(nCurrWidth-rc.left)/2);i++)
  1420. {
  1421. bsBlueColor  = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1422. bsGreenColor = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1423. bsRedColor   = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1424. // Draw Gray 
  1425. BYTE temp;
  1426. temp = (bsRedColor+bsGreenColor/2+bsBlueColor)/3;
  1427. bsBlueColor = temp>0 ? (temp) : 0;
  1428. bsGreenColor = temp>0 ? (temp<<1) : 0;
  1429. bsRedColor = temp>0 ? (temp) :  0;
  1430. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (rc.left+nX) + i] = (bsBlueColor<<m_stBitsMaskInfo.bBShift) |  (bsGreenColor<<m_stBitsMaskInfo.bGShift) | (bsRedColor<<m_stBitsMaskInfo.bRShift);
  1431. }
  1432. x += (nCurrWidth-rc.left);
  1433. }
  1434. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1435. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  1436. {
  1437. for(WORD i = 0 ; i < (sizeof(WORD)*(rc.right-nLastWidth));i++)
  1438. {
  1439. bsBlueColor  = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1440. bsGreenColor = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1441. bsRedColor   = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1442. // Draw Gray 
  1443. BYTE temp;
  1444. temp = (bsRedColor+bsGreenColor/2+bsBlueColor)/3;
  1445. bsBlueColor = temp>0 ? (temp) : 0;
  1446. bsGreenColor = temp>0 ? (temp<<1) : 0;
  1447. bsRedColor = temp>0 ? (temp) :  0;
  1448. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX) + i] = (bsBlueColor<<m_stBitsMaskInfo.bBShift) |  (bsGreenColor<<m_stBitsMaskInfo.bGShift) | (bsRedColor<<m_stBitsMaskInfo.bRShift);
  1449. }
  1450. // memcpy(&pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX)], &pwSrc[x], sizeof(WORD)*(rc.right-nLastWidth));
  1451. x += nCntCopyWord;
  1452. }
  1453. else
  1454. {
  1455. for(WORD i = 0 ; i < (sizeof(WORD)*nCntCopyWord/2);i++)
  1456. {
  1457. bsBlueColor  = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1458. bsGreenColor = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1459. bsRedColor   = (BYTE)((pwSrc[x+i] & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1460. // Draw Gray 
  1461. BYTE temp;
  1462. temp = (bsRedColor+bsGreenColor/2+bsBlueColor)/3;
  1463. bsBlueColor = temp>0 ? (temp) : 0;
  1464. bsGreenColor = temp>0 ? (temp<<1) : 0;
  1465. bsRedColor = temp>0 ? (temp) :  0;
  1466. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX) + i] = (bsBlueColor<<m_stBitsMaskInfo.bBShift) |  (bsGreenColor<<m_stBitsMaskInfo.bGShift) | (bsRedColor<<m_stBitsMaskInfo.bRShift);
  1467. }
  1468. x += nCntCopyWord;
  1469. }
  1470. }
  1471. }
  1472. else if ( pwSrc[x] == 0xC2 || pwSrc[x] == 0xC3 )
  1473. {
  1474. WORD wDyingKind, wChooseColor;
  1475. wDyingKind = pwSrc[x];
  1476. switch ( wDyingKind )
  1477. {
  1478. case 0xC2: 
  1479. wChooseColor = wChooseColor1;
  1480. break;
  1481. case 0xC3: 
  1482. wChooseColor = wChooseColor2;
  1483. break;
  1484. }
  1485. x++;
  1486. nCntCopyWord = pwSrc[x];
  1487. x++;
  1488. nLastWidth = nCurrWidth;
  1489. nCurrWidth += nCntCopyWord;
  1490. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  1491. {
  1492. x += nCntCopyWord;
  1493. }
  1494. else
  1495. {
  1496. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1497. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  1498. {
  1499. x += (rc.left-nLastWidth);
  1500. for ( INT nCheck = 0; nCheck < nCurrWidth-rc.left; nCheck++ )
  1501. {
  1502. wPixel   = wChooseColor;
  1503. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1504. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1505. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1506. wPixel   = pwSrc[x+nCheck];
  1507. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1508. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1509. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1510. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1511. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1512. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1513. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  1514. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  1515. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  1516. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1517. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1518. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1519. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1520. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1521. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1522. // Draw Gray 
  1523. BYTE temp;
  1524. temp = (bRedWantedColor+bGreenWantedColor/2+bBlueWantedColor)/3;
  1525. bBlueWantedColor = temp>0 ? (temp) : 0;
  1526. bGreenWantedColor = temp>0 ? (temp<<1) : 0;
  1527. bRedWantedColor = temp>0 ? (temp) :  0;
  1528. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  1529.   (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  1530.   (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  1531. }
  1532. x += (nCurrWidth-rc.left);
  1533. }
  1534. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1535. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  1536. {
  1537. for ( INT nCheck = 0; nCheck < rc.right-nLastWidth; nCheck++ )
  1538. {
  1539. wPixel   = wChooseColor;
  1540. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1541. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1542. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1543. wPixel   = pwSrc[x+nCheck];
  1544. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1545. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1546. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1547. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1548. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1549. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1550. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  1551. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  1552. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  1553. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1554. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1555. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1556. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1557. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1558. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1559. // Draw Gray 
  1560. BYTE temp;
  1561. temp = (bRedWantedColor+bGreenWantedColor/2+bBlueWantedColor)/3;
  1562. bBlueWantedColor = temp>0 ? (temp) : 0;
  1563. bGreenWantedColor = temp>0 ? (temp<<1) : 0;
  1564. bRedWantedColor = temp>0 ? (temp) :  0;
  1565. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  1566.   (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  1567.   (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  1568. }
  1569. x += nCntCopyWord;
  1570. }
  1571. else
  1572. {
  1573. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  1574. {
  1575. wPixel   = wChooseColor;
  1576. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1577. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1578. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1579. wPixel   = pwSrc[x+nCheck];
  1580. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1581. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1582. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1583. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1584. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1585. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1586. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  1587. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  1588. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  1589. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1590. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1591. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1592. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1593. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1594. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1595. // Draw Gray 
  1596. BYTE temp;
  1597. temp = (bRedWantedColor+bGreenWantedColor/2+bBlueWantedColor)/3;
  1598. bBlueWantedColor = temp>0 ? (temp) : 0;
  1599. bGreenWantedColor = temp>0 ? (temp<<1) : 0;
  1600. bRedWantedColor = temp>0 ? (temp) :  0;
  1601. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  1602.   (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  1603.     (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  1604. }
  1605. x += nCntCopyWord;
  1606. }
  1607. }
  1608. }
  1609. }
  1610. // 扼牢狼 场阑 促澜 扼牢狼 矫累栏肺 颗败霖促.
  1611. nWidthEnd++;
  1612. nWidthStart = nWidthEnd;
  1613. nCurrWidth = 0;
  1614. }
  1615. }
  1616. m_pddsBackBuffer->Unlock(NULL);
  1617. return TRUE;
  1618. }
  1619. return FALSE;
  1620. }
  1621. VOID CWHDXGraphicWindow::DrawWithGrayBackBuffer()
  1622. {
  1623. DDSURFACEDESC2 ddsd;
  1624. RECT rc = {0, 0, 800, 500};
  1625. if ( m_pddsBackBuffer == NULL ) return;
  1626. ddsd.dwSize = sizeof(DDSURFACEDESC2);
  1627. ddsd.lpSurface = NULL;
  1628. m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  1629. if ( !ddsd.lpSurface ) return;
  1630. WORD *pwdSrc, *pwdDst;
  1631. BYTE bsBlueColor, bsGreenColor, bsRedColor;
  1632. pwdDst = (WORD*)ddsd.lpSurface;
  1633. pwdSrc = (WORD*)ddsd.lpSurface;
  1634. for ( INT y=rc.top ; y < rc.bottom ; y++ )
  1635. {
  1636. for ( INT x=rc.left ; x < rc.right ; x++ )
  1637. {
  1638. bsBlueColor  = (BYTE)((pwdSrc[y * (ddsd.lPitch >> 1) + x] & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1639. bsGreenColor = (BYTE)((pwdSrc[y * (ddsd.lPitch >> 1) + x] & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1640. bsRedColor   = (BYTE)((pwdSrc[y * (ddsd.lPitch >> 1) + x] & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1641. // Draw Gray 
  1642. BYTE temp;
  1643. temp = (bsRedColor+bsGreenColor/2+bsBlueColor)/3;
  1644. bsBlueColor  = temp>0 ? (temp)    : 0;
  1645. bsGreenColor = temp>0 ? (temp<<1) : 0;
  1646. bsRedColor   = temp>0 ? (temp)    : 0;
  1647. pwdDst[y * (ddsd.lPitch >> 1) + x] = (bsBlueColor<<m_stBitsMaskInfo.bBShift) |  (bsGreenColor<<m_stBitsMaskInfo.bGShift) | (bsRedColor<<m_stBitsMaskInfo.bRShift);
  1648. }
  1649. }
  1650. m_pddsBackBuffer->Unlock(NULL);
  1651. }
  1652. /******************************************************************************************************************
  1653. 窃荐疙 : CWHDXGraphicWindow::DrawWithImageForCompClipRgnToMem()
  1654. 累己磊 : 
  1655. 累己老 : 
  1656. 格利   : 拘绵等 家胶 捞固瘤狼 盔窍绰 荤捞令 拘绵阑 钱篮 惑怕肺 傈崔罐篮 皋葛府(pwDst)俊 墨乔茄促.
  1657. 涝仿   : INT nStartX
  1658.          INT nStartY
  1659.          INT nWantedXSize
  1660.          INT nWantedYSize
  1661.          WORD* pwSrc
  1662.          WORD wClipWidth
  1663.          WORD wClipHeight
  1664.          WORD wChooseColor1
  1665.          WORD wChooseColor2
  1666. 免仿   : BOOL
  1667. [老磊][荐沥磊] : 荐沥郴侩
  1668. *******************************************************************************************************************/
  1669. BOOL CWHDXGraphicWindow::DrawWithImageForCompColorToMem(RECT rcWanted, WORD* pwSrc, WORD wColor, WORD* pwDst)
  1670. {
  1671. if ( rcWanted.left < 0 || rcWanted.right < 0 || rcWanted.top < 0 || rcWanted.bottom < 0 ||
  1672.  rcWanted.right - rcWanted.left < 0 || rcWanted.bottom - rcWanted.top < 0 || pwDst == NULL )
  1673.  return FALSE;
  1674. INT nWidthStart = 0;
  1675. INT nWidthEnd = 0;
  1676. INT nCurrWidth = 0;
  1677. INT nCntCopyWord = 0;
  1678. INT nYCnt = 0;
  1679. INT nLastWidth = 0;
  1680. // y绵 努府俏.
  1681.    for ( nYCnt=0 ; nYCnt < rcWanted.top ; nYCnt++ )
  1682. {
  1683.   nWidthEnd += pwSrc[nWidthStart];
  1684. nWidthStart++;
  1685. nWidthEnd++;
  1686. nWidthStart = nWidthEnd;
  1687. }
  1688. INT nNewCurrWidth = 0;
  1689. FLOAT rBlueRate, rGreenRate, rRedRate;
  1690. BYTE  bRedSrc, bGreenSrc, bBlueSrc;
  1691. BYTE  bRedStateColor, bGreenStateColor, bBlueStateColor;
  1692. WORD  wPixel;
  1693. // y绵俊 措秦辑 角力肺 风俏矫懦 Count父阑 沥茄促.
  1694. for ( nYCnt=rcWanted.top ; nYCnt < rcWanted.bottom ; nYCnt++ )
  1695. {
  1696. // 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
  1697. nWidthEnd += pwSrc[nWidthStart];
  1698. nWidthStart++;
  1699. // 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
  1700. for ( INT x = nWidthStart; x < nWidthEnd ; )
  1701. {
  1702. if ( pwSrc[x] == 0xC0 )
  1703. {
  1704. x++;
  1705. nCntCopyWord = pwSrc[x];
  1706. x++;
  1707. nLastWidth = nCurrWidth;
  1708. nCurrWidth += nCntCopyWord;
  1709. // rcWanted.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1710. if ( nLastWidth <= rcWanted.left && nCurrWidth >= rcWanted.right )
  1711. {
  1712. memset(&pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left))  + nNewCurrWidth], 0, sizeof(WORD)*(rcWanted.right-rcWanted.left));
  1713. nNewCurrWidth += rcWanted.right-rcWanted.left;
  1714. }
  1715. else if ( nLastWidth < rcWanted.left && nCurrWidth > rcWanted.left )
  1716. {
  1717. memset(&pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + nNewCurrWidth], 0, sizeof(WORD)*(nCurrWidth-rcWanted.left));
  1718. nNewCurrWidth += nCurrWidth-rcWanted.left;
  1719. }
  1720. else if ( nLastWidth >= rcWanted.left && nCurrWidth <= rcWanted.right )
  1721. {
  1722. memset(&pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left))  + nNewCurrWidth], 0, sizeof(WORD)*(nCntCopyWord));
  1723. nNewCurrWidth += nCntCopyWord;
  1724. }
  1725. // rcWanted.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1726. else if ( nLastWidth < rcWanted.right && nCurrWidth > rcWanted.right )
  1727. {
  1728. memset(&pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + nNewCurrWidth], 0, sizeof(WORD)*(rcWanted.right-nLastWidth));
  1729. nNewCurrWidth += rcWanted.right-nLastWidth;
  1730. }
  1731. }
  1732. else if ( pwSrc[x] == 0xC1 || pwSrc[x] == 0xC2 || pwSrc[x] == 0xC3 )
  1733. {
  1734. x++;
  1735. nCntCopyWord = pwSrc[x];
  1736. x++;
  1737. nLastWidth = nCurrWidth;
  1738. nCurrWidth += nCntCopyWord;
  1739. if ( rcWanted.left > nCurrWidth || rcWanted.right < nLastWidth )
  1740. {
  1741. x += nCntCopyWord;
  1742. }
  1743. else
  1744. {
  1745. // rcWanted.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1746. if ( nLastWidth <= rcWanted.left && nCurrWidth >= rcWanted.right )
  1747. {
  1748. x += (rcWanted.left-nLastWidth);
  1749. for ( INT nCheck = 0; nCheck < rcWanted.right-rcWanted.left; nCheck++ )
  1750. {
  1751. wPixel = wColor;
  1752. bBlueStateColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1753. bGreenStateColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1754. bRedStateColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1755. wPixel = pwSrc[x+nCheck];
  1756. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1757. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1758. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1759. if ( !wColor )
  1760. {
  1761. BYTE bTemp = (BYTE)(bBlueSrc+(bGreenSrc>>1)+bRedSrc)/3;
  1762. if ( bTemp > 31 ) bTemp = 31;
  1763. bBlueStateColor = bRedStateColor = bTemp;
  1764. bGreenStateColor = bTemp<<1;
  1765. }
  1766. else
  1767. {
  1768. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1769. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1770. rRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1771. bBlueStateColor  = (BYTE)((FLOAT)bBlueStateColor *rBlueRate );
  1772. bGreenStateColor = (BYTE)((FLOAT)bGreenStateColor*rGreenRate);
  1773. bRedStateColor   = (BYTE)((FLOAT)bRedStateColor  *rRedRate  );
  1774. if ( bBlueStateColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1775. bBlueStateColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1776. if ( bGreenStateColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1777. bGreenStateColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1778. if ( bRedStateColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1779. bRedStateColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1780. }
  1781. if ( !bRedStateColor && !bGreenStateColor && !bBlueStateColor ) bRedStateColor = bGreenStateColor = bBlueStateColor = 1;
  1782. pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + (nNewCurrWidth+nCheck)] = ((bRedStateColor  <<m_stBitsMaskInfo.bRShift) |
  1783.    (bGreenStateColor<<m_stBitsMaskInfo.bGShift) |
  1784.    (bBlueStateColor <<m_stBitsMaskInfo.bBShift));
  1785. }
  1786. nNewCurrWidth += rcWanted.right-rcWanted.left;
  1787. x += (nCurrWidth-rcWanted.left);
  1788. }
  1789. else if ( nLastWidth < rcWanted.left && nCurrWidth > rcWanted.left )
  1790. {
  1791. x += (rcWanted.left-nLastWidth);
  1792. for ( INT nCheck = 0; nCheck < nCurrWidth-rcWanted.left; nCheck++ )
  1793. {
  1794. wPixel = wColor;
  1795. bBlueStateColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1796. bGreenStateColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1797. bRedStateColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1798. wPixel = pwSrc[x+nCheck];
  1799. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1800. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1801. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1802. if ( !wColor )
  1803. {
  1804. BYTE bTemp = (BYTE)(bBlueSrc+(bGreenSrc>>1)+bRedSrc)/3;
  1805. if ( bTemp > 31 ) bTemp = 31;
  1806. bBlueStateColor = bRedStateColor = bTemp;
  1807. bGreenStateColor = bTemp<<1;
  1808. }
  1809. else
  1810. {
  1811. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1812. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1813. rRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1814. bBlueStateColor  = (BYTE)((FLOAT)bBlueStateColor *rBlueRate );
  1815. bGreenStateColor = (BYTE)((FLOAT)bGreenStateColor*rGreenRate);
  1816. bRedStateColor   = (BYTE)((FLOAT)bRedStateColor  *rRedRate  );
  1817. if ( bBlueStateColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1818. bBlueStateColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1819. if ( bGreenStateColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1820. bGreenStateColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1821. if ( bRedStateColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1822. bRedStateColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1823. }
  1824. if ( !bRedStateColor && !bGreenStateColor && !bBlueStateColor ) bRedStateColor = bGreenStateColor = bBlueStateColor = 1;
  1825. pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + (nNewCurrWidth+nCheck)] = ((bRedStateColor  <<m_stBitsMaskInfo.bRShift) |
  1826.    (bGreenStateColor<<m_stBitsMaskInfo.bGShift) |
  1827.    (bBlueStateColor <<m_stBitsMaskInfo.bBShift));
  1828. }
  1829. nNewCurrWidth += nCurrWidth-rcWanted.left;
  1830. x += (nCurrWidth-rcWanted.left);
  1831. }
  1832. else if ( nLastWidth >= rcWanted.left && nCurrWidth <= rcWanted.right )
  1833. {
  1834. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  1835. {
  1836. wPixel = wColor;
  1837. bBlueStateColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1838. bGreenStateColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1839. bRedStateColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1840. wPixel = pwSrc[x+nCheck];
  1841. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1842. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1843. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1844. if ( !wColor )
  1845. {
  1846. BYTE bTemp = (BYTE)(bBlueSrc+(bGreenSrc>>1)+bRedSrc)/3;
  1847. if ( bTemp > 31 ) bTemp = 31;
  1848. bBlueStateColor = bRedStateColor = bTemp;
  1849. bGreenStateColor = bTemp<<1;
  1850. }
  1851. else
  1852. {
  1853. if ( nCheck == 17 )
  1854. int b = 0;
  1855. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1856. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1857. rRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1858. bBlueStateColor  = (BYTE)((FLOAT)bBlueStateColor *rBlueRate );
  1859. bGreenStateColor = (BYTE)((FLOAT)bGreenStateColor*rGreenRate);
  1860. bRedStateColor   = (BYTE)((FLOAT)bRedStateColor  *rRedRate  );
  1861. if ( bBlueStateColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1862. bBlueStateColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1863. if ( bGreenStateColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1864. bGreenStateColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1865. if ( bRedStateColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1866. bRedStateColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1867. }
  1868. if ( !bRedStateColor && !bGreenStateColor && !bBlueStateColor ) bRedStateColor = bGreenStateColor = bBlueStateColor = 1;
  1869. pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + (nNewCurrWidth+nCheck)] = ((bRedStateColor  <<m_stBitsMaskInfo.bRShift) |
  1870.    (bGreenStateColor<<m_stBitsMaskInfo.bGShift) |
  1871.    (bBlueStateColor <<m_stBitsMaskInfo.bBShift));
  1872. }
  1873. nNewCurrWidth += nCntCopyWord;
  1874. x += nCntCopyWord;
  1875. }
  1876. // rcWanted.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1877. else if ( nLastWidth < rcWanted.right && nCurrWidth > rcWanted.right )
  1878. {
  1879. for ( INT nCheck = 0; nCheck < rcWanted.right-nLastWidth; nCheck++ )
  1880. {
  1881. wPixel = wColor;
  1882. bBlueStateColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1883. bGreenStateColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1884. bRedStateColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1885. wPixel = pwSrc[x+nCheck];
  1886. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1887. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1888. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1889. if ( !wColor )
  1890. {
  1891. BYTE bTemp = (BYTE)(bBlueSrc+(bGreenSrc>>1)+bRedSrc)/3;
  1892. if ( bTemp > 31 ) bTemp = 31;
  1893. bBlueStateColor = bRedStateColor = bTemp;
  1894. bGreenStateColor = bTemp<<1;
  1895. }
  1896. else
  1897. {
  1898. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1899. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1900. rRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1901. bBlueStateColor  = (BYTE)((FLOAT)bBlueStateColor *rBlueRate );
  1902. bGreenStateColor = (BYTE)((FLOAT)bGreenStateColor*rGreenRate);
  1903. bRedStateColor   = (BYTE)((FLOAT)bRedStateColor  *rRedRate  );
  1904. if ( bBlueStateColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1905. bBlueStateColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1906. if ( bGreenStateColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1907. bGreenStateColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1908. if ( bRedStateColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1909. bRedStateColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1910. }
  1911. if ( !bRedStateColor && !bGreenStateColor && !bBlueStateColor ) bRedStateColor = bGreenStateColor = bBlueStateColor = 1;
  1912. pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + (nNewCurrWidth+nCheck)] = ((bRedStateColor  <<m_stBitsMaskInfo.bRShift) |
  1913.    (bGreenStateColor<<m_stBitsMaskInfo.bGShift) |
  1914.    (bBlueStateColor <<m_stBitsMaskInfo.bBShift));
  1915. }
  1916. nNewCurrWidth += rcWanted.right-nLastWidth;
  1917. x += nCntCopyWord;
  1918. }
  1919. else
  1920. {
  1921. x += nCntCopyWord;
  1922. }
  1923. }
  1924. }
  1925. }
  1926. // 扼牢狼 场阑 促澜 扼牢狼 矫累栏肺 颗败霖促.
  1927. nWidthEnd++;
  1928. nWidthStart = nWidthEnd;
  1929. nCurrWidth = 0;
  1930. nNewCurrWidth = 0;
  1931. }
  1932. return TRUE;
  1933. }
  1934. BOOL CWHDXGraphicWindow::DrawWithImageForCompToMem(RECT rcWanted, WORD* pwSrc, WORD wChooseColor1, WORD wChooseColor2, WORD* pwDst)
  1935. {
  1936. if ( rcWanted.left < 0 || rcWanted.right < 0 || rcWanted.top < 0 || rcWanted.bottom < 0 ||
  1937.  rcWanted.right - rcWanted.left < 0 || rcWanted.bottom - rcWanted.top < 0 || pwDst == NULL )
  1938.  return FALSE;
  1939. INT nWidthStart = 0;
  1940. INT nWidthEnd = 0;
  1941. INT nCurrWidth = 0;
  1942. INT nCntCopyWord = 0;
  1943. INT nYCnt = 0;
  1944. INT nLastWidth = 0;
  1945. // y绵 努府俏.
  1946.    for ( nYCnt=0 ; nYCnt < rcWanted.top ; nYCnt++ )
  1947. {
  1948.   nWidthEnd += pwSrc[nWidthStart];
  1949. nWidthStart++;
  1950. nWidthEnd++;
  1951. nWidthStart = nWidthEnd;
  1952. }
  1953. INT nNewCurrWidth = 0;
  1954. FLOAT rBlueRate, rGreenRate, bRedRate;
  1955. BYTE  bRedSrc, bGreenSrc, bBlueSrc;
  1956. BYTE  bRedWantedColor, bGreenWantedColor, bBlueWantedColor;
  1957. WORD  wPixel;
  1958. // y绵俊 措秦辑 角力肺 风俏矫懦 Count父阑 沥茄促.
  1959. for ( nYCnt=rcWanted.top ; nYCnt < rcWanted.bottom ; nYCnt++ )
  1960. {
  1961. // 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
  1962. nWidthEnd += pwSrc[nWidthStart];
  1963. nWidthStart++;
  1964. // 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
  1965. for ( INT x = nWidthStart; x < nWidthEnd ; )
  1966. {
  1967. if ( pwSrc[x] == 0xC0 )
  1968. {
  1969. x++;
  1970. nCntCopyWord = pwSrc[x];
  1971. x++;
  1972. nLastWidth = nCurrWidth;
  1973. nCurrWidth += nCntCopyWord;
  1974. // rcWanted.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1975. if ( nLastWidth <= rcWanted.left && nCurrWidth >= rcWanted.right )
  1976. {
  1977. memset(&pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left))  + nNewCurrWidth], 0, sizeof(WORD)*(rcWanted.right-rcWanted.left));
  1978. nNewCurrWidth += rcWanted.right-rcWanted.left;
  1979. }
  1980. else if ( nLastWidth < rcWanted.left && nCurrWidth > rcWanted.left )
  1981. {
  1982. memset(&pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + nNewCurrWidth], 0, sizeof(WORD)*(nCurrWidth-rcWanted.left));
  1983. nNewCurrWidth += nCurrWidth-rcWanted.left;
  1984. }
  1985. else if ( nLastWidth >= rcWanted.left && nCurrWidth <= rcWanted.right )
  1986. {
  1987. memset(&pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left))  + nNewCurrWidth], 0, sizeof(WORD)*(nCntCopyWord));
  1988. nNewCurrWidth += nCntCopyWord;
  1989. }
  1990. // rcWanted.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1991. else if ( nLastWidth < rcWanted.right && nCurrWidth > rcWanted.right )
  1992. {
  1993. memset(&pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + nNewCurrWidth], 0, sizeof(WORD)*(rcWanted.right-nLastWidth));
  1994. nNewCurrWidth += rcWanted.right-nLastWidth;
  1995. }
  1996. }
  1997. else if ( pwSrc[x] == 0xC1 )
  1998. {
  1999. x++;
  2000. nCntCopyWord = pwSrc[x];
  2001. x++;
  2002. nLastWidth = nCurrWidth;
  2003. nCurrWidth += nCntCopyWord;
  2004. if ( rcWanted.left > nCurrWidth || rcWanted.right < nLastWidth )
  2005. {
  2006. x += nCntCopyWord;
  2007. }
  2008. else
  2009. {
  2010. // rcWanted.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  2011. if ( nLastWidth <= rcWanted.left && nCurrWidth >= rcWanted.right )
  2012. {
  2013. x += (rcWanted.left-nLastWidth);
  2014. memcpy(&pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + nNewCurrWidth], &pwSrc[x], sizeof(WORD)*(rcWanted.right-rcWanted.left));
  2015. nNewCurrWidth += rcWanted.right-rcWanted.left;
  2016. x += (nCurrWidth-rcWanted.left);
  2017. }
  2018. else if ( nLastWidth < rcWanted.left && nCurrWidth > rcWanted.left )
  2019. {
  2020. x += (rcWanted.left-nLastWidth);
  2021. memcpy(&pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + nNewCurrWidth], &pwSrc[x], sizeof(WORD)*(nCurrWidth-rcWanted.left));
  2022. nNewCurrWidth += nCurrWidth-rcWanted.left;
  2023. x += (nCurrWidth-rcWanted.left);
  2024. }
  2025. else if ( nLastWidth >= rcWanted.left && nCurrWidth <= rcWanted.right )
  2026. {
  2027. memcpy(&pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + nNewCurrWidth], &pwSrc[x], sizeof(WORD)*nCntCopyWord);
  2028. nNewCurrWidth += nCntCopyWord;
  2029. x += nCntCopyWord;
  2030. }
  2031. // rcWanted.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  2032. else if ( nLastWidth < rcWanted.right && nCurrWidth > rcWanted.right )
  2033. {
  2034. memcpy(&pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + nNewCurrWidth], &pwSrc[x], sizeof(WORD)*(rcWanted.right-nLastWidth));
  2035. nNewCurrWidth += rcWanted.right-nLastWidth;
  2036. x += nCntCopyWord;
  2037. }
  2038. else
  2039. {
  2040. x += nCntCopyWord;
  2041. }
  2042. }
  2043. }
  2044. else if ( pwSrc[x] == 0xC2 || pwSrc[x] == 0xC3 )
  2045. {
  2046. WORD wDyingKind, wChooseColor;
  2047. wDyingKind = pwSrc[x];
  2048. switch ( wDyingKind )
  2049. {
  2050. case 0xC2: 
  2051. wChooseColor = wChooseColor1;
  2052. break;
  2053. case 0xC3: 
  2054. wChooseColor = wChooseColor2;
  2055. break;
  2056. }
  2057. x++;
  2058. nCntCopyWord = pwSrc[x];
  2059. x++;
  2060. nLastWidth = nCurrWidth;
  2061. nCurrWidth += nCntCopyWord;
  2062. if ( rcWanted.left > nCurrWidth || rcWanted.right < nLastWidth )
  2063. {
  2064. x += nCntCopyWord;
  2065. }
  2066. else
  2067. {
  2068. // rcWanted.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  2069. if ( nLastWidth <= rcWanted.left && nCurrWidth >= rcWanted.right )
  2070. {
  2071. x += (rcWanted.left-nLastWidth);
  2072. for ( INT nCheck = 0; nCheck < rcWanted.right-rcWanted.left; nCheck++ )
  2073. {
  2074. wPixel   = wChooseColor;
  2075. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2076. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2077. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2078. wPixel   = pwSrc[x+nCheck];
  2079. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2080. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2081. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2082. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  2083. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  2084. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  2085. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  2086. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  2087. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  2088. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  2089. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  2090. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  2091. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  2092. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  2093. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  2094. pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + (nNewCurrWidth+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  2095.    (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  2096.    (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  2097. }
  2098. nNewCurrWidth += rcWanted.right-rcWanted.left;
  2099. x += (nCurrWidth-rcWanted.left);
  2100. }
  2101. else if ( nLastWidth < rcWanted.left && nCurrWidth > rcWanted.left )
  2102. {
  2103. x += (rcWanted.left-nLastWidth);
  2104. for ( INT nCheck = 0; nCheck < nCurrWidth-rcWanted.left; nCheck++ )
  2105. {
  2106. wPixel   = wChooseColor;
  2107. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2108. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2109. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2110. wPixel   = pwSrc[x+nCheck];
  2111. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2112. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2113. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2114. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  2115. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  2116. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  2117. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  2118. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  2119. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  2120. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  2121. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  2122. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  2123. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  2124. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  2125. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  2126. pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + (nNewCurrWidth+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  2127.    (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  2128.    (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  2129. }
  2130. nNewCurrWidth += nCurrWidth-rcWanted.left;
  2131. x += (nCurrWidth-rcWanted.left);
  2132. }
  2133. else if ( nLastWidth >= rcWanted.left && nCurrWidth <= rcWanted.right )
  2134. {
  2135. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  2136. {
  2137. wPixel   = wChooseColor;
  2138. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2139. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2140. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2141. wPixel   = pwSrc[x+nCheck];
  2142. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2143. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2144. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2145. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  2146. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  2147. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  2148. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  2149. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  2150. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  2151. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  2152. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  2153. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  2154. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  2155. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  2156. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  2157. pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + (nNewCurrWidth+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  2158.    (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  2159.    (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  2160. }
  2161. nNewCurrWidth += nCntCopyWord;
  2162. x += nCntCopyWord;
  2163. }
  2164. // rcWanted.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  2165. else if ( nLastWidth < rcWanted.right && nCurrWidth > rcWanted.right )
  2166. {
  2167. for ( INT nCheck = 0; nCheck < rcWanted.right-nLastWidth; nCheck++ )
  2168. {
  2169. wPixel   = wChooseColor;
  2170. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2171. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2172. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2173. wPixel   = pwSrc[x+nCheck];
  2174. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2175. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2176. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2177. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  2178. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  2179. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  2180. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  2181. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  2182. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  2183. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  2184. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  2185. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  2186. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  2187. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  2188. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  2189. pwDst[((nYCnt-rcWanted.top) * (rcWanted.right-rcWanted.left)) + (nNewCurrWidth+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  2190.    (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  2191.    (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  2192. }
  2193. nNewCurrWidth += rcWanted.right-nLastWidth;
  2194. x += nCntCopyWord;
  2195. }
  2196. else
  2197. {
  2198. x += nCntCopyWord;
  2199. }
  2200. }
  2201. }
  2202. }
  2203. // 扼牢狼 场阑 促澜 扼牢狼 矫累栏肺 颗败霖促.
  2204. nWidthEnd++;
  2205. nWidthStart = nWidthEnd;
  2206. nCurrWidth = 0;
  2207. nNewCurrWidth = 0;
  2208. }
  2209. return TRUE;
  2210. }
  2211. /******************************************************************************************************************
  2212. 窃荐疙 : CWHDXGraphicWindow::DrawWithABlendForIntersectCompData()
  2213. 累己磊 : 
  2214. 累己老 : 
  2215. 格利   : 
  2216. 涝仿   : INT nX : 归滚欺惑狼 弊覆矫累困摹.
  2217.          INT nY
  2218.          INT nSrcXSize : 盔夯弊覆狼 荤捞令.
  2219.          INT nSrcYSize
  2220.          WORD* pwSrc : 盔夯弊覆狼 单捞鸥.
  2221.          INT nDstXSize : 鸥百弊覆狼 荤捞令.
  2222.          INT nDstYSize
  2223.          WORD* pwDst : 鸥百弊覆狼 单捞鸥.
  2224.          WORD wSrcChooseColor1 : 盔夯弊覆狼 堪祸 捞固瘤1 拿矾.
  2225.          WORD wSrcChooseColor2
  2226.          WORD wDstChooseColor1 : 鸥百弊覆狼 堪祸 捞固瘤1 拿矾.
  2227.          WORD wDstChooseColor2
  2228. 免仿   : BOOL 
  2229. [老磊][荐沥磊] : 荐沥郴侩
  2230. *******************************************************************************************************************/
  2231. BOOL CWHDXGraphicWindow::DrawWithABlendForIntersectCompData(INT nSrcX, INT nSrcY, 
  2232. INT nSrcXSize, INT nSrcYSize, WORD* pwSrc,
  2233. INT nDstX, INT nDstY,
  2234. INT nDstXSize, INT nDstYSize, WORD* pwDst,
  2235. WORD wClipWidth, WORD wClipHeight,
  2236. BYTE bOpa, BOOL bFocused,
  2237. WORD wSrcChooseColor1, WORD wSrcChooseColor2, 
  2238. WORD wDstChooseColor1, WORD wDstChooseColor2,
  2239. WORD wSrcColor, WORD wDstColor)
  2240. {
  2241. DDSURFACEDESC2 ddsd;
  2242. RECT rcSrc, rcDst;
  2243. RECT rcSrcIntersect = { 0, 0, 0, 0 };
  2244. RECT rcDstIntersect = { 0, 0, 0, 0 };
  2245. WORD* pwdDst = NULL;
  2246. INT nSrcWidth = nSrcXSize;
  2247. INT nSrcHeight = nSrcYSize;
  2248. INT nXSrcOffset = 0;
  2249. INT nYSrcOffset = 0;
  2250. INT nDstWidth = nDstXSize;
  2251. INT nDstHeight = nDstYSize;
  2252. INT nXDstOffset = 0;
  2253. INT nYDstOffset = 0;
  2254. INT nEndX = wClipWidth -1;
  2255. INT nEndY = wClipHeight-1;
  2256. INT nStartX = 0;
  2257. INT nStartY = 0;
  2258. WORD* pwDstSave = NULL;
  2259. WORD* pwSrcSave = NULL;
  2260. if ( m_pddsBackBuffer != NULL )
  2261. {
  2262. // Source狼 拳搁努府俏茄 康开.
  2263. if ( nSrcX < nStartX )
  2264. nXSrcOffset = nStartX - nSrcX;
  2265. nSrcWidth = nSrcXSize - nXSrcOffset;
  2266. }
  2267. if ( (nSrcX+nSrcXSize-1) > nEndX )
  2268. nSrcWidth = nEndX - nSrcX - nXSrcOffset + 1;
  2269. if ( nSrcY < nStartY )
  2270. nYSrcOffset = nStartY - nSrcY;
  2271. nSrcHeight = nSrcYSize - nYSrcOffset;
  2272. }
  2273. if ( (nSrcY+nSrcYSize-1) > nEndY )
  2274. nSrcHeight = nEndY - nSrcY - nYSrcOffset + 1;
  2275. if ( (nSrcWidth > 0) && (nSrcHeight > 0) )
  2276. {
  2277. // Source康开狼 汲沥.
  2278. rcSrc.left = nXSrcOffset;
  2279. rcSrc.right = nXSrcOffset+nSrcWidth;
  2280. rcSrc.top = nYSrcOffset;
  2281. rcSrc.bottom = nYSrcOffset+nSrcHeight;
  2282. // Destination狼 拳搁努府俏茄 康开.
  2283. if ( nDstX < nStartX )
  2284. nXDstOffset = nStartX - nDstX;
  2285. nDstWidth = nDstXSize - nXDstOffset;
  2286. }
  2287. if ( (nDstX+nDstXSize-1) > nEndX )
  2288. nDstWidth = nEndX - nDstX - nXDstOffset + 1;
  2289. if ( nDstY < nStartY )
  2290. nYDstOffset = nStartY - nDstY;
  2291. nDstHeight = nDstYSize - nYDstOffset;
  2292. }
  2293. if ( (nDstY+nDstYSize-1) > nEndY )
  2294. nDstHeight = nEndY - nDstY - nYDstOffset + 1;
  2295. if ( (nDstWidth > 0) && (nDstHeight > 0) )
  2296. {
  2297. // Destination康开狼 汲沥.
  2298. rcDst.left = nXDstOffset;
  2299. rcDst.right = nXDstOffset+nDstWidth;
  2300. rcDst.top = nYDstOffset;
  2301. rcDst.bottom = nYDstOffset+nDstHeight;
  2302. // 滴捞固瘤狼 般摹绰 康开阑 备茄促.
  2303. RECT rcTemp;
  2304. // 家胶康开俊 惑措利牢 单胶飘康开阑 备茄促.
  2305. rcTemp.left = rcDst.left + (nDstX-nSrcX);
  2306. rcTemp.top = rcDst.top + (nDstY-nSrcY);
  2307. rcTemp.right = rcDst.right + (nDstX-nSrcX);
  2308. rcTemp.bottom = rcDst.bottom + (nDstY-nSrcY);
  2309. // 家胶 泛飘康开阑 扁霖栏肺 茄 滴 荤阿屈狼 背瞒荤阿屈阑 备茄促.
  2310. IntersectRect(&rcSrcIntersect, &rcSrc, &rcTemp);
  2311. // 单胶飘康开俊 惑措利牢 家胶康开阑 备茄促.
  2312. rcTemp.left = rcSrc.left + (nSrcX-nDstX);
  2313. rcTemp.top = rcSrc.top + (nSrcY-nDstY);
  2314. rcTemp.right = rcSrc.right + (nSrcX-nDstX);
  2315. rcTemp.bottom = rcSrc.bottom + (nSrcY-nDstY);
  2316. // 单胶飘 泛飘康开阑 扁霖栏肺 茄 滴 荤阿屈狼 背瞒荤阿屈阑 备茄促.
  2317. IntersectRect(&rcDstIntersect, &rcTemp, &rcDst);
  2318. ddsd.dwSize = sizeof(DDSURFACEDESC2);
  2319. ddsd.lpSurface = NULL;
  2320. m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  2321. if ( !ddsd.lpSurface ) return FALSE;
  2322. pwdDst = (WORD*)ddsd.lpSurface;
  2323. pwSrcSave = new WORD[(rcSrcIntersect.right-rcSrcIntersect.left)*(rcSrcIntersect.bottom-rcSrcIntersect.top)];
  2324. pwDstSave = new WORD[(rcDstIntersect.right-rcDstIntersect.left)*(rcDstIntersect.bottom-rcDstIntersect.top)];
  2325. if ( wSrcColor == 0XFFFF && wDstColor == 0XFFFF )
  2326. {
  2327. DrawWithImageForCompToMem(rcSrcIntersect, (WORD*)pwSrc, wSrcChooseColor1, wSrcChooseColor2, pwSrcSave);
  2328. DrawWithImageForCompToMem(rcDstIntersect, (WORD*)pwDst, wDstChooseColor1, wDstChooseColor2, pwDstSave);
  2329. }
  2330. else if ( wSrcColor != 0XFFFF && wDstColor == 0XFFFF )
  2331. {
  2332. DrawWithImageForCompColorToMem(rcSrcIntersect, (WORD*)pwSrc, wSrcColor, pwSrcSave);
  2333. DrawWithImageForCompToMem(rcDstIntersect, (WORD*)pwDst, wDstChooseColor1, wDstChooseColor2, pwDstSave);
  2334. }
  2335. else if ( wSrcColor == 0XFFFF && wDstColor != 0XFFFF )
  2336. {
  2337. DrawWithImageForCompToMem(rcSrcIntersect, (WORD*)pwSrc, wSrcChooseColor1, wSrcChooseColor2, pwSrcSave);
  2338. DrawWithImageForCompColorToMem(rcDstIntersect, (WORD*)pwDst, wDstColor, pwDstSave);
  2339. }
  2340. else
  2341. {
  2342. DrawWithImageForCompColorToMem(rcSrcIntersect, (WORD*)pwSrc, wSrcColor, pwSrcSave);
  2343. DrawWithImageForCompColorToMem(rcDstIntersect, (WORD*)pwDst, wDstColor, pwDstSave);
  2344. }
  2345. BYTE bRedDst, bGreenDst, bBlueDst;
  2346. BYTE bRedSrc, bGreenSrc, bBlueSrc;
  2347. WORD wSrcPixel, wDstPixel;
  2348. FLOAT rBlueRate, rGreenRate, bRedRate;
  2349. for ( INT nYCnt = 0; nYCnt < rcSrcIntersect.bottom - rcSrcIntersect.top; nYCnt++ )
  2350. for ( INT nXCnt = 0; nXCnt < rcSrcIntersect.right - rcSrcIntersect.left; nXCnt++ )
  2351. {
  2352. wSrcPixel = pwSrcSave[nYCnt*(rcSrcIntersect.right - rcSrcIntersect.left) + nXCnt];
  2353. wDstPixel = pwDstSave[nYCnt*(rcDstIntersect.right - rcDstIntersect.left) + nXCnt];
  2354. if ( wSrcPixel != 0 && wDstPixel != 0 )
  2355. {
  2356. bBlueSrc  = (BYTE)((wSrcPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2357. bGreenSrc = (BYTE)((wSrcPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2358. bRedSrc   = (BYTE)((wSrcPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2359. if ( bFocused )
  2360. {
  2361. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  2362. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  2363. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  2364. bBlueSrc = (BYTE)((FLOAT)bBlueSrc + ((FLOAT)bBlueSrc*rBlueRate));
  2365. bGreenSrc = (BYTE)((FLOAT)bGreenSrc + ((FLOAT)bGreenSrc*rGreenRate));
  2366. bRedSrc = (BYTE)((FLOAT)bRedSrc + ((FLOAT)bRedSrc*bRedRate));
  2367. if ( bBlueSrc > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  2368. bBlueSrc = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  2369. if ( bGreenSrc > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  2370. bGreenSrc = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  2371. if ( bRedSrc > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  2372. bRedSrc = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  2373. // 器目胶啊 灯阑锭 Opacity蔼阑 臭咯霖促.
  2374. bOpa = 40;
  2375. }
  2376. bBlueDst  = (BYTE)((wDstPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2377. bGreenDst = (BYTE)((wDstPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2378. bRedDst   = (BYTE)((wDstPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2379. bBlueDst  = (BYTE)((bOpa*(bBlueDst -bBlueSrc )+100*bBlueSrc ) / 100);
  2380. bGreenDst = (BYTE)((bOpa*(bGreenDst-bGreenSrc)+100*bGreenSrc) / 100);
  2381. bRedDst   = (BYTE)((bOpa*(bRedDst  -bRedSrc  )+100*bRedSrc  ) / 100);
  2382. pwdDst[((nYCnt+nSrcY+rcSrcIntersect.top) * (ddsd.lPitch >> 1)) + (rcSrcIntersect.left+nSrcX+nXCnt)] = 
  2383. ((bRedDst  <<m_stBitsMaskInfo.bRShift) |
  2384.  (bGreenDst<<m_stBitsMaskInfo.bGShift) |
  2385.  (bBlueDst <<m_stBitsMaskInfo.bBShift));
  2386. }
  2387. }
  2388. SAFE_DELETE(pwSrcSave);
  2389. SAFE_DELETE(pwDstSave);
  2390. m_pddsBackBuffer->Unlock(NULL);
  2391. return TRUE;
  2392. }
  2393. }
  2394. }
  2395. return FALSE;
  2396. }
  2397. /******************************************************************************************************************
  2398. 窃荐疙 : CWHDXGraphicWindow::Present()
  2399. 累己磊 : 
  2400. 累己老 : 
  2401. 格利   : 
  2402. 涝仿   : LPRECT lprcDest
  2403.          LPRECT lprcSrc
  2404.          BYTE bCntRgn
  2405. 免仿   : HRESULT 
  2406. [老磊][荐沥磊] : 荐沥郴侩
  2407. *******************************************************************************************************************/
  2408. HRESULT CWHDXGraphicWindow::Present()
  2409. {
  2410. HRESULT hr;
  2411. if ( NULL == m_pddsFrontBuffer || NULL == m_pddsBackBuffer )
  2412. {
  2413. return E_POINTER;
  2414. }
  2415. while ( TRUE )
  2416. {
  2417. // if ( m_bScreenModeFlag & _DXG_SCREENMODE_WINDOW )
  2418. // {
  2419. //  俊叼飘扩档快 免仿阑 困秦辑 努府欺甫 技泼茄促.
  2420. m_pddsFrontBuffer->SetClipper(m_lpcClipper);
  2421. hr = m_pddsFrontBuffer->Blt(&m_rcWindow, m_pddsBackBuffer, NULL, DDBLT_WAIT, NULL);
  2422. /* }
  2423. else
  2424. {
  2425. hr = m_pddsFrontBuffer->Flip(NULL, DDFLIP_WAIT );
  2426. }
  2427. */
  2428. if(hr == DDERR_SURFACELOST)
  2429. {
  2430. m_pddsFrontBuffer->Restore();
  2431. m_pddsBackBuffer->Restore();
  2432. }
  2433. if(hr != DDERR_WASSTILLDRAWING)
  2434. return hr;
  2435. }
  2436. /******************************************************************************************************************
  2437. 窃荐疙 : RestoreSurfaces()
  2438. 累己磊 : 
  2439. 累己老 : 
  2440. 格利   : 
  2441. 免仿   : HRESULT 
  2442. [老磊][荐沥磊] : 荐沥郴侩
  2443. *******************************************************************************************************************/
  2444. HRESULT CWHDXGraphicWindow::RestoreSurfaces()
  2445. {
  2446.     HRESULT hr;
  2447. if ( !m_pDD )
  2448. return E_FAIL;
  2449.     if ( FAILED(hr = m_pDD->RestoreAllSurfaces()) )
  2450.         return hr;
  2451.     return S_OK;
  2452. }
  2453. /******************************************************************************************************************
  2454.   Callback Function
  2455. *******************************************************************************************************************/
  2456. /******************************************************************************************************************
  2457. 窃荐疙 : WINAPI DXGDriverEnumCallbackEx()
  2458. 累己磊 : 
  2459. 累己老 : 
  2460. 格利   : 
  2461. 涝仿   : GUID *pGUID
  2462.          LPSTR szDesc
  2463.          LPSTR szName
  2464.          LPVOID pContext
  2465.          HMONITOR hm
  2466. 免仿   : static BOOL 
  2467. [老磊][荐沥磊] : 荐沥郴侩
  2468. *******************************************************************************************************************/
  2469. static BOOL WINAPI DXGDriverEnumCallbackEx(GUID *pGUID, LPSTR szDesc, LPSTR szName, LPVOID pContext, HMONITOR hm)
  2470. {
  2471.     LPDIRECTDRAW7 pDD  = NULL;
  2472.     LPDIRECT3D7 pD3D = NULL;
  2473. DXG_ENUM_DEVICEINFO stDXGEnumDeviceInfo;
  2474.     HRESULT hr;
  2475.     if ( FAILED(hr = DirectDrawCreateEx(pGUID, (VOID**) &pDD, IID_IDirectDraw7, NULL)) )
  2476. {
  2477. MessageBox(NULL, TEXT("[DXGDriverEnumCallbackEx]") TEXT("Can't create DDraw during enumeration!"), "MirDXG", MB_ICONERROR | MB_OK);
  2478.         return D3DENUMRET_OK;
  2479. }
  2480.     if ( FAILED(hr = pDD->QueryInterface(IID_IDirect3D7, (VOID**) &pD3D)) )
  2481.     {
  2482. SAFE_RELEASE(pDD);
  2483. MessageBox(NULL, TEXT("[DXGDriverEnumCallbackEx]") TEXT("Can't query IDirect3D7 during enumeration!"), "MirDXG", MB_ICONERROR | MB_OK);
  2484.         return D3DENUMRET_OK;
  2485.     }
  2486.     ZeroMemory(&stDXGEnumDeviceInfo, sizeof(DXG_ENUM_DEVICEINFO));
  2487.     lstrcpyn(stDXGEnumDeviceInfo.szDriverDesc, szDesc, 255);
  2488.     stDXGEnumDeviceInfo.ddDriverCaps.dwSize = sizeof(DDCAPS);
  2489.     stDXGEnumDeviceInfo.ddHELCaps.dwSize    = sizeof(DDCAPS);
  2490.     pDD->GetCaps(&stDXGEnumDeviceInfo.ddDriverCaps, &stDXGEnumDeviceInfo.ddHELCaps);
  2491.     if ( pGUID )
  2492.     {
  2493.         stDXGEnumDeviceInfo.guidDriver  = (*pGUID);
  2494.         stDXGEnumDeviceInfo.pDriverGUID = &stDXGEnumDeviceInfo.guidDriver;
  2495.     }
  2496.     if ( FAILED(hr = pDD->EnumDisplayModes(0, NULL, &stDXGEnumDeviceInfo, DXGEnumDisplayModeCallback)) )
  2497. {
  2498. MessageBox(NULL, TEXT("[DXGDriverEnumCallbackEx]") TEXT("Can't enumerate displaymode!"), "MirDXG", MB_ICONERROR | MB_OK);
  2499. }
  2500.     qsort(stDXGEnumDeviceInfo.pddsdModes, stDXGEnumDeviceInfo.dwNumModes, sizeof(DDSURFACEDESC2), DXGModesSortCallback);
  2501.     if ( FAILED(hr = pD3D->EnumDevices(DXG3DDeviceEnumCallback, &stDXGEnumDeviceInfo)) )
  2502. {
  2503. MessageBox(NULL, TEXT("[DXGDriverEnumCallbackEx]") TEXT("Can't enumerate device!"), "MirDXG", MB_ICONERROR | MB_OK);
  2504. }
  2505.     SAFE_DELETE(stDXGEnumDeviceInfo.pddsdModes);
  2506. SAFE_RELEASE(pD3D);
  2507. SAFE_RELEASE(pDD);
  2508. return DDENUMRET_OK;
  2509. }
  2510. /******************************************************************************************************************
  2511. 窃荐疙 : WINAPI DXGEnumDisplayModeCallback()
  2512. 累己磊 : 
  2513. 累己老 : 
  2514. 格利   : 
  2515. 涝仿   : DDSURFACEDESC2* pddsd
  2516.          VOID* pParentInfo
  2517. 免仿   : static HRESULT 
  2518. [老磊][荐沥磊] : 荐沥郴侩
  2519. *******************************************************************************************************************/
  2520. static HRESULT WINAPI DXGEnumDisplayModeCallback(DDSURFACEDESC2* pddsd, VOID* pParentInfo)
  2521. {
  2522.     DXG_ENUM_DEVICEINFO* pDevice = (DXG_ENUM_DEVICEINFO*) pParentInfo;
  2523.     DDSURFACEDESC2* pddsdNewModes = new DDSURFACEDESC2[pDevice->dwNumModes+1];
  2524.     memcpy(pddsdNewModes, pDevice->pddsdModes, pDevice->dwNumModes * sizeof(DDSURFACEDESC2));
  2525.     SAFE_DELETE(pDevice->pddsdModes);
  2526.     pDevice->pddsdModes = pddsdNewModes;
  2527.     pDevice->pddsdModes[pDevice->dwNumModes++] = (*pddsd);
  2528.     return DDENUMRET_OK;
  2529. }
  2530. /******************************************************************************************************************
  2531. 窃荐疙 : DXGModesSortCallback()
  2532. 累己磊 : 
  2533. 累己老 : 
  2534. 格利   : 
  2535. 涝仿   : const VOID* arg1
  2536.          const VOID* arg2
  2537. 免仿   : static int 
  2538. [老磊][荐沥磊] : 荐沥郴侩
  2539. *******************************************************************************************************************/
  2540. static int DXGModesSortCallback(const VOID* arg1, const VOID* arg2)
  2541. {
  2542.     DDSURFACEDESC2* p1 = (DDSURFACEDESC2*)arg1;
  2543.     DDSURFACEDESC2* p2 = (DDSURFACEDESC2*)arg2;
  2544.     if ( p1->dwWidth < p2->dwWidth )        return -1;
  2545.     if ( p1->dwWidth > p2->dwWidth )        return +1;
  2546.     if ( p1->dwHeight < p2->dwHeight )      return -1;
  2547.     if ( p1->dwHeight > p2->dwHeight )      return +1;
  2548.     if ( p1->ddpfPixelFormat.dwRGBBitCount < p2->ddpfPixelFormat.dwRGBBitCount )        return -1;
  2549.     if ( p1->ddpfPixelFormat.dwRGBBitCount > p2->ddpfPixelFormat.dwRGBBitCount )        return +1;
  2550.     return 0;
  2551. }
  2552. /******************************************************************************************************************
  2553. 窃荐疙 : WINAPI DXG3DDeviceEnumCallback()
  2554. 累己磊 : 
  2555. 累己老 : 
  2556. 格利   : 
  2557. 涝仿   : TCHAR* szDesc
  2558.          TCHAR* szName
  2559.          D3DDEVICEDESC7* pDesc
  2560.          VOID* pParentInfo
  2561. 免仿   : static HRESULT 
  2562. [老磊][荐沥磊] : 荐沥郴侩
  2563. *******************************************************************************************************************/
  2564. static HRESULT WINAPI DXG3DDeviceEnumCallback(TCHAR* szDesc, TCHAR* szName, D3DDEVICEDESC7* pDesc, VOID* pParentInfo)
  2565. {
  2566.     DXG_ENUM_DEVICEINFO* pDriverInfo = (DXG_ENUM_DEVICEINFO*)pParentInfo;
  2567.     DXG_ENUM_DEVICEINFO* pDeviceInfo = &g_stDXGEnumDeviceInfo[g_bNumDevices];
  2568.     ZeroMemory(pDeviceInfo, sizeof(DXG_ENUM_DEVICEINFO));
  2569.     pDeviceInfo->f3DHardware = pDesc->dwDevCaps & D3DDEVCAPS_HWRASTERIZATION;
  2570.     memcpy(&pDeviceInfo->ddDeviceDesc, pDesc, sizeof(D3DDEVICEDESC7));
  2571.     pDeviceInfo->ddDriverCaps       = pDriverInfo->ddDriverCaps;
  2572.     pDeviceInfo->ddHELCaps          = pDriverInfo->ddHELCaps;
  2573.     pDeviceInfo->guidDevice         = pDesc->deviceGUID;
  2574.     pDeviceInfo->pDeviceGUID        = &pDeviceInfo->guidDevice;
  2575.     pDeviceInfo->pddsdModes         = new DDSURFACEDESC2[pDriverInfo->dwNumModes];
  2576.     if ( pDriverInfo->pDriverGUID )
  2577.     {
  2578.         pDeviceInfo->guidDriver  = pDriverInfo->guidDriver;
  2579.         pDeviceInfo->pDriverGUID = &pDeviceInfo->guidDriver;
  2580.     }
  2581.     else
  2582.     {
  2583.         pDeviceInfo->pDriverGUID = NULL;
  2584.     }
  2585.     lstrcpyn(pDeviceInfo->szDriverDesc, pDriverInfo->szDriverDesc, 255);
  2586.     lstrcpyn(pDeviceInfo->szDeviceDesc, szName, 255);
  2587.     for ( DWORD dwCnt=0; dwCnt<pDriverInfo->dwNumModes; dwCnt++ )
  2588.     {
  2589.         DDSURFACEDESC2 ddsdMode = pDriverInfo->pddsdModes[dwCnt];
  2590.         DWORD dwRenderDepths    = pDeviceInfo->ddDeviceDesc.dwDeviceRenderBitDepth;
  2591.         DWORD dwDepth           = ddsdMode.ddpfPixelFormat.dwRGBBitCount;
  2592.         if ( ( ( dwDepth == 32 ) && ( dwRenderDepths & DDBD_32 ) ) ||
  2593.              ( ( dwDepth == 24 ) && ( dwRenderDepths & DDBD_24 ) ) ||
  2594.              ( ( dwDepth == 16 ) && ( dwRenderDepths & DDBD_16 ) ) )
  2595.         {
  2596.             pDeviceInfo->pddsdModes[pDeviceInfo->dwNumModes++] = ddsdMode;
  2597.         }
  2598.     }
  2599.     if ( 0 == pDeviceInfo->dwNumModes )
  2600.         return D3DENUMRET_OK;
  2601.     g_bNumDevices++;
  2602.     if ( NULL != pDeviceInfo->pDriverGUID && FALSE == pDeviceInfo->f3DHardware )
  2603.             return D3DENUMRET_OK;
  2604.     return D3DENUMRET_OK;
  2605. }
  2606. /******************************************************************************************************************
  2607. 窃荐疙 : WINAPI DXGEnumZBufferFormatsCallback()
  2608. 累己磊 : 
  2609. 累己老 : 
  2610. 格利   : 
  2611. 涝仿   : DDPIXELFORMAT* pddpf
  2612.          VOID* pContext
  2613. 免仿   : static HRESULT 
  2614. [老磊][荐沥磊] : 荐沥郴侩
  2615. *******************************************************************************************************************/
  2616. static HRESULT WINAPI DXGEnumZBufferFormatsCallback(DDPIXELFORMAT* pddpf, VOID* pContext)
  2617. {
  2618.     DDPIXELFORMAT* pddpfOut = (DDPIXELFORMAT*) pContext;
  2619.     if ( pddpfOut->dwRGBBitCount == pddpf->dwRGBBitCount )
  2620.     {
  2621.         (*pddpfOut) = (*pddpf);
  2622.         return D3DENUMRET_CANCEL;
  2623.     }
  2624.     return D3DENUMRET_OK;
  2625. }