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

模拟服务器

开发平台:

Visual C++

  1. /******************************************************************************************************************
  2.                                                                                                                    
  3. 葛碘疙:
  4. 累己磊:
  5. 累己老:
  6. [老磊][荐沥磊] : 荐沥 郴侩
  7.                                                                                                                    
  8. *******************************************************************************************************************/
  9. #include "stdafx.h"
  10. #include "WHEngine.h"
  11. /******************************************************************************************************************
  12. CWHDXGraphicWindow Functions
  13. *******************************************************************************************************************/
  14. static BYTE g_bNumDevices = 0;
  15. static DXG_ENUM_DEVICEINFO g_stDXGEnumDeviceInfo[_MAX_DEVICES];
  16. static INT DXGModesSortCallback(const VOID* arg1, const VOID* arg2);
  17. static BOOL WINAPI DXGDriverEnumCallbackEx(GUID* pGUID, LPSTR szDesc, LPSTR szName, LPVOID pContext, HMONITOR hm);
  18. static HRESULT WINAPI DXGEnumDisplayModeCallback(DDSURFACEDESC2* pddsd, VOID* pParentInfo);
  19. static HRESULT WINAPI DXG3DDeviceEnumCallback(TCHAR* szDesc, TCHAR* szName, D3DDEVICEDESC7* pDesc, VOID* pParentInfo);
  20. static HRESULT WINAPI DXGEnumZBufferFormatsCallback(DDPIXELFORMAT* pddpf, VOID* pContext);
  21. CWHDXGraphicWindow* CWHDXGraphicWindow::m_pxDXGWnd = NULL;
  22. CWHDXGraphicWindow* GetDXGWindowPtr()
  23. {
  24. return CWHDXGraphicWindow::m_pxDXGWnd;
  25. }
  26. /******************************************************************************************************************
  27. 窃荐疙 : CWHDXGraphicWindow::CWHDXGraphicWindow()
  28. 累己磊 : 
  29. 累己老 : 
  30. 格利   : 
  31. 涝仿   : WORD wWidth
  32.          WORD wHeight
  33.          WORD wBpp
  34. 免仿   : 
  35. [老磊][荐沥磊] : 荐沥郴侩
  36. *******************************************************************************************************************/
  37. CWHDXGraphicWindow::CWHDXGraphicWindow(WORD wWidth, WORD wHeight, WORD wBpp)
  38. {
  39. m_pDD = NULL;
  40. m_pD3D = NULL;
  41. m_hDefGameFont = NULL;
  42. m_pd3dDevice = NULL;
  43. m_pddsZBuffer = NULL;
  44.     m_pddsFrontBuffer = NULL;
  45.     m_pddsBackBuffer = NULL;
  46. // 俊叼飘扩档快 免仿阑 困秦辑 努府欺甫 技泼茄促.
  47. m_lpcClipper = NULL;
  48. m_stDisplayInfo.wWidth = wWidth;
  49. m_stDisplayInfo.wHeight = wHeight;
  50. m_stDisplayInfo.wBPP = wBpp;
  51. m_bScreenModeFlag = _DXG_SCREENMODE_WINDOW;
  52. m_bDeviceModeFlag = _DXG_DEVICEMODE_PRIMARY;
  53. SetRect(&m_rcWindow, 0, 0, 0, 0);
  54. ZeroMemory(&m_stBitsMaskInfo, sizeof(DXG_MASKINFO));
  55. m_pxDXGWnd = this;
  56. m_bIsWindowActive = FALSE;
  57. m_bIsWindowReady = FALSE;
  58. m_dwTextureTotal = 0;
  59. m_dwTextureFree = 0;
  60. m_dwVideoTotal = 0;
  61. m_dwVideoFree = 0;
  62. m_pxDefProcess = NULL;
  63. }
  64. VOID CWHDXGraphicWindow::UsedAndFreeMemoryCheck()
  65. {
  66. DDSCAPS2     ddsCaps2; 
  67. ZeroMemory(&ddsCaps2, sizeof(ddsCaps2));
  68. ddsCaps2.dwCaps = DDSCAPS_TEXTURE;
  69. m_pDD->GetAvailableVidMem(&ddsCaps2, &m_dwTextureTotal, &m_dwTextureFree); 
  70. ZeroMemory(&ddsCaps2, sizeof(ddsCaps2));
  71. ddsCaps2.dwCaps = DDSCAPS_VIDEOMEMORY;
  72. m_pDD->GetAvailableVidMem(&ddsCaps2, &m_dwVideoTotal, &m_dwVideoFree); 
  73. /******************************************************************************************************************
  74. 窃荐疙 : CWHDXGraphicWindow::~CWHDXGraphicWindow()
  75. 累己磊 : 
  76. 累己老 : 
  77. 格利   : 
  78. 免仿   : 
  79. [老磊][荐沥磊] : 荐沥郴侩
  80. *******************************************************************************************************************/
  81. CWHDXGraphicWindow::~CWHDXGraphicWindow()
  82. {
  83. FreeDXGEnumModeResources();
  84.     DestroyDXGObjects();
  85. m_pxDefProcess = NULL;
  86. m_pxDXGWnd = NULL;
  87. }
  88. /******************************************************************************************************************
  89. 窃荐疙 : CWHDXGraphicWindow::Create()
  90. 累己磊 : 
  91. 累己老 : 
  92. 格利   : 
  93. 涝仿   : LPTSTR lpCaption
  94.          CHAR *pszMenuName
  95.          BYTE bScreenModeFlag
  96.          BYTE bDeviceModeFlag
  97. 免仿   : BOOL 
  98. [老磊][荐沥磊] : 荐沥郴侩
  99. *******************************************************************************************************************/
  100. BOOL CWHDXGraphicWindow::Create(HINSTANCE hInst, LPTSTR lpCaption, CHAR *pszMenuName, CHAR* pszIconName, BYTE bScreenModeFlag, BYTE bDeviceModeFlag)
  101. {
  102. DWORD dwStyle;
  103. if ( !CWHWindow::Create(hInst, lpCaption, pszMenuName, pszIconName) )
  104. {
  105. MessageBox(m_hWnd, TEXT("[CWHDXGraphicWindow::Create]") TEXT("Window create failed."), "MirDXG", MB_ICONERROR | MB_OK);
  106. return FALSE;
  107. }
  108. m_bScreenModeFlag = bScreenModeFlag;
  109. m_bDeviceModeFlag = bDeviceModeFlag;
  110. if ( m_bScreenModeFlag & _DXG_SCREENMODE_WINDOW )
  111. {
  112. dwStyle  = GetWindowStyle(m_hWnd);
  113. dwStyle &= ~WS_POPUP;
  114. dwStyle |= WS_POPUP;//WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_SYSMENU;
  115. SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);
  116. }
  117. else
  118. {
  119. dwStyle  = GetWindowStyle(m_hWnd);
  120. dwStyle &= ~dwStyle;
  121. dwStyle |= WS_POPUP;
  122. SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);
  123. }
  124. HRESULT hr;
  125. if ( hr = SUCCEEDED(DirectDrawEnumerateEx(DXGDriverEnumCallbackEx, NULL,
  126.   DDENUM_ATTACHEDSECONDARYDEVICES | DDENUM_DETACHEDSECONDARYDEVICES | DDENUM_NONDISPLAYDEVICES)) )
  127. {
  128. if ( hr = SUCCEEDED(CreateDXG()) )
  129. {
  130. m_bIsWindowReady = TRUE;
  131. CreateDefFont();
  132. return TRUE;
  133. }
  134. else
  135. {
  136. MessageBox(m_hWnd, TEXT("[CWHDXGraphicWindow::Create]") TEXT("DirectGraphic create failed."), "MirDXG", MB_ICONERROR | MB_OK);
  137. return FALSE;
  138. }
  139. }
  140. return FALSE;
  141. }
  142. /******************************************************************************************************************
  143. 窃荐疙 : CWHDXGraphicWindow::MainWndProcDXG()
  144. 累己磊 : 
  145. 累己老 : 
  146. 格利   : 
  147. 涝仿   : HWND hWnd
  148.          UINT uMsg
  149.          WPARAM wParam
  150.          LPARAM lParam
  151. 免仿   : LRESULT 
  152. [老磊][荐沥磊] : 荐沥郴侩
  153. *******************************************************************************************************************/
  154. LRESULT CWHDXGraphicWindow::MainWndProcDXG(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
  155. {
  156. switch (uMsg)
  157. {
  158. case WM_SYSKEYDOWN:
  159. return OnSysKeyDown(wParam, lParam);
  160. case WM_MOVE:
  161. return OnMove(wParam, lParam);
  162. case WM_SIZE:
  163. return OnSize(wParam, lParam);
  164. case WM_DESTROY:
  165. return OnDestroy();
  166.         case WM_SETCURSOR:
  167. return OnSetCursor();   
  168.  //      case WM_GETMINMAXINFO:
  169. // return OnGetMinMaxInfo(wParam, lParam);
  170. default:
  171. break;
  172. }
  173.     return CWHWindow::MainWndProc(hWnd, uMsg, wParam, lParam);
  174. }
  175. LRESULT CWHDXGraphicWindow::OnGetMinMaxInfo(WPARAM wParam, LPARAM lParam)
  176. {
  177. if ( m_hWnd )
  178. {
  179. MINMAXINFO* pMinMax = (MINMAXINFO*) lParam;
  180. DWORD dwFrameWidth    = GetSystemMetrics( SM_CXSIZEFRAME );
  181. DWORD dwFrameHeight   = GetSystemMetrics( SM_CYSIZEFRAME );
  182. DWORD dwMenuHeight;
  183. if( GetMenu( m_hWnd ) )
  184. dwMenuHeight    = GetSystemMetrics( SM_CYMENU );
  185. else
  186. dwMenuHeight    = 0;
  187. DWORD dwCaptionHeight = GetSystemMetrics( SM_CYCAPTION );
  188. pMinMax->ptMinTrackSize.x = m_stDisplayInfo.wWidth  + dwFrameWidth * 2;
  189. pMinMax->ptMinTrackSize.y = m_stDisplayInfo.wHeight + dwFrameHeight * 2 + 
  190. dwMenuHeight + dwCaptionHeight;
  191. pMinMax->ptMaxTrackSize.x = pMinMax->ptMinTrackSize.x;
  192. pMinMax->ptMaxTrackSize.y = pMinMax->ptMinTrackSize.y;
  193. }
  194.     return 0L;
  195. }
  196. LRESULT CWHDXGraphicWindow::OnSetCursor()
  197. {
  198.     SetCursor(LoadCursor(NULL, IDC_ARROW));
  199.     return 0L;
  200. }
  201. /******************************************************************************************************************
  202. 窃荐疙 : CWHDXGraphicWindow::OnSize()
  203. 累己磊 : 
  204. 累己老 : 
  205. 格利   : 
  206. 涝仿   : WPARAM wParam
  207.          LPARAM lParam
  208. 免仿   : LRESULT 
  209. [老磊][荐沥磊] : 荐沥郴侩
  210. *******************************************************************************************************************/
  211. LRESULT CWHDXGraphicWindow::OnSize(WPARAM wParam, LPARAM lParam)
  212. {
  213.     if ( SIZE_MAXHIDE == wParam || SIZE_MINIMIZED == wParam )
  214.         m_bIsWindowActive = FALSE;
  215.     else
  216.         m_bIsWindowActive = TRUE;
  217. UpdateBoundsWnd();
  218.   return 0L;
  219. }
  220. /******************************************************************************************************************
  221. 窃荐疙 : CWHDXGraphicWindow::OnMove()
  222. 累己磊 : 
  223. 累己老 : 
  224. 格利   : 
  225. 涝仿   : WPARAM wParam
  226.          LPARAM lParam
  227. 免仿   : LRESULT 
  228. [老磊][荐沥磊] : 荐沥郴侩
  229. *******************************************************************************************************************/
  230. LRESULT CWHDXGraphicWindow::OnMove(WPARAM wParam, LPARAM lParam)
  231. {
  232. UpdateBoundsWnd();
  233. return 0L;
  234. }
  235. /******************************************************************************************************************
  236. 窃荐疙 : CWHDXGraphicWindow::OnDestroy()
  237. 累己磊 : 
  238. 累己老 : 
  239. 格利   : 
  240. 免仿   : BOOL 
  241. [老磊][荐沥磊] : 荐沥郴侩
  242. *******************************************************************************************************************/
  243. LRESULT CWHDXGraphicWindow::OnDestroy()
  244. {
  245. return CWHWindow::OnDestroy();
  246. }
  247. /******************************************************************************************************************
  248. 窃荐疙 : CWHDXGraphicWindow::OnSysKeyDown()
  249. 累己磊 : 
  250. 累己老 : 
  251. 格利   : 
  252. 涝仿   : WPARAM wParam
  253.          LPARAM lParam
  254. 免仿   : LRESULT 
  255. [老磊][荐沥磊] : 荐沥郴侩
  256. *******************************************************************************************************************/
  257. LRESULT CWHDXGraphicWindow::OnSysKeyDown(WPARAM wParam, LPARAM lParam)
  258. {
  259. if ( wParam == VK_RETURN )
  260. {
  261. m_bIsWindowReady = FALSE;
  262.   D3DTextr_InvalidateAllTextures();
  263. D3DWILTextr_InvalidateAllTextures();
  264. D3DWILTextr_DestroyAllTextures();
  265. if ( m_bScreenModeFlag & _DXG_SCREENMODE_WINDOW )
  266. {
  267. if ( FAILED(ResetDXG(_SCREEN_WIDTH, _SCREEN_HEIGHT, _SCREEN_BPP, _DXG_SCREENMODE_FULLSCREEN, _DXG_DEVICEMODE_PRIMARY|_DXG_DEVICEMODE_D3D)) )
  268. {
  269. MessageBox(m_hWnd, TEXT("DirectDraw RESETUP failed!!!") TEXT("The Program will now exit."), TEXT("MirDXG"), MB_ICONERROR | MB_OK);
  270. }
  271. }
  272. else
  273. {
  274. if ( FAILED(ResetDXG(_SCREEN_WIDTH, _SCREEN_HEIGHT, _SCREEN_BPP, _DXG_SCREENMODE_WINDOW, _DXG_DEVICEMODE_PRIMARY|_DXG_DEVICEMODE_D3D)) )
  275. {
  276. MessageBox(m_hWnd, TEXT("DirectDraw RESETUP failed!!!") TEXT("The Program will now exit."), TEXT("MirDXG"), MB_ICONERROR | MB_OK);
  277. }
  278. }
  279. D3DTextr_RestoreAllTextures(m_pd3dDevice);
  280. m_bIsWindowReady = TRUE;
  281. }
  282. return 0L;
  283. }
  284. /******************************************************************************************************************
  285. 窃荐疙 : CWHDXGraphicWindow::FindDriverAndDevice()
  286. 累己磊 : 
  287. 累己老 : 
  288. 格利   : 
  289. 免仿   : DWORD 
  290. [老磊][荐沥磊] : 荐沥郴侩
  291. *******************************************************************************************************************/
  292. BYTE CWHDXGraphicWindow::FindDriverAndDevice()
  293. {
  294. BYTE bNum = 0;
  295. CHAR bCnt;
  296.  
  297. if ( m_bDeviceModeFlag & _DXG_DEVICEMODE_PRIMARY )
  298. {
  299. for ( bCnt = 0; bCnt < g_bNumDevices; bCnt++ )
  300. {
  301. if ( !g_stDXGEnumDeviceInfo[bCnt].pDriverGUID )
  302. {
  303. if ( g_stDXGEnumDeviceInfo[bCnt].f3DHardware ) return bCnt;
  304. else bNum = bCnt;
  305. }
  306. }
  307. }
  308. else
  309. {
  310. for ( bCnt = g_bNumDevices-1; bCnt >= 0; bCnt-- )
  311. {
  312. // 厚叼坷 墨靛啊 2俺捞惑
  313. if( g_bNumDevices > 2 )
  314. {
  315. if ( g_stDXGEnumDeviceInfo[0].dwNumModes != g_stDXGEnumDeviceInfo[bCnt].dwNumModes )
  316. {
  317. if ( g_stDXGEnumDeviceInfo[bCnt].f3DHardware ) return bCnt;
  318. else
  319. {
  320. bNum = bCnt;
  321. break;
  322. }
  323. }
  324. }
  325. else
  326. {
  327. if ( g_stDXGEnumDeviceInfo[bCnt].f3DHardware ) return bCnt;
  328. else bNum = bCnt;
  329. }
  330. }
  331. }
  332. return bNum;
  333. }
  334. /******************************************************************************************************************
  335. 窃荐疙 : CWHDXGraphicWindow::DestroyDXGObjects()
  336. 累己磊 : 
  337. 累己老 : 
  338. 格利   : 
  339. 免仿   : HRESULT 
  340. [老磊][荐沥磊] : 荐沥郴侩
  341. *******************************************************************************************************************/
  342. HRESULT CWHDXGraphicWindow::DestroyDXGObjects()
  343. {
  344. HRESULT hr;
  345. LONG lDDRefCnt  = 0L;
  346.     LONG lD3DRefCnt = 0L;
  347. if ( !(m_bScreenModeFlag & _DXG_SCREENMODE_WINDOW) )
  348. {
  349. if ( FAILED(hr = m_pDD->RestoreDisplayMode()) )
  350. return E_FAIL;
  351. }
  352.     if ( m_pDD )
  353. {
  354. if ( FAILED(hr = m_pDD->SetCooperativeLevel(m_hWnd, DDSCL_NORMAL)) )
  355. return E_FAIL;
  356. }
  357.     if ( m_pd3dDevice )
  358. {
  359.         if ( 0 < ( lD3DRefCnt = m_pd3dDevice->Release() ) )
  360. return E_FAIL;
  361. }
  362.     m_pd3dDevice = NULL;
  363.     SAFE_RELEASE(m_pddsBackBuffer);
  364.     SAFE_RELEASE(m_pddsFrontBuffer);
  365.     SAFE_RELEASE(m_pddsZBuffer);
  366. // 俊叼飘扩档快 免仿阑 困秦辑 努府欺甫 技泼茄促.
  367. SAFE_RELEASE(m_lpcClipper);
  368.     SAFE_RELEASE(m_pD3D);
  369.     if ( m_pDD )
  370.     {
  371.         if ( 0 < ( lDDRefCnt = m_pDD->Release() ) )
  372. INT nAAAAAA = 0;
  373. // return E_FAIL;
  374.     }
  375.     m_pDD = NULL;
  376. if ( m_hDefGameFont != NULL )
  377. {
  378. DeleteObject(m_hDefGameFont);
  379. m_hDefGameFont = NULL; 
  380. }
  381. return S_OK;
  382. //    return ( lDDRefCnt==0 && lD3DRefCnt==0 ) ? S_OK : E_FAIL;
  383. }
  384. /******************************************************************************************************************
  385. 窃荐疙 : CWHDXGraphicWindow::FreeDXGEnumModeResources()
  386. 累己磊 : 
  387. 累己老 : 
  388. 格利   : 
  389. 免仿   : VOID 
  390. [老磊][荐沥磊] : 荐沥郴侩
  391. *******************************************************************************************************************/
  392. VOID CWHDXGraphicWindow::FreeDXGEnumModeResources()
  393. {
  394.     for ( BYTE bCnt = 0; bCnt < g_bNumDevices; bCnt++ )
  395.     {
  396.         SAFE_DELETE( g_stDXGEnumDeviceInfo[bCnt].pddsdModes );
  397.     }
  398. }
  399. /******************************************************************************************************************
  400. 窃荐疙 : CWHDXGraphicWindow::CreateDXG()
  401. 累己磊 : 
  402. 累己老 : 
  403. 格利   : 
  404. 免仿   : HRESULT 
  405. [老磊][荐沥磊] : 荐沥郴侩
  406. *******************************************************************************************************************/
  407. HRESULT CWHDXGraphicWindow::CreateDXG() 
  408. {
  409.     HRESULT hr;
  410. BYTE bSelecedDevice = FindDriverAndDevice();
  411. if ( SUCCEEDED(hr = DirectDrawCreateEx(g_stDXGEnumDeviceInfo[bSelecedDevice].pDriverGUID, (VOID**)&m_pDD, IID_IDirectDraw7, NULL)) ) 
  412. {
  413. if ( m_bScreenModeFlag & _DXG_SCREENMODE_WINDOW )
  414. {
  415. if ( FAILED(hr = m_pDD->SetCooperativeLevel(m_hWnd, DDSCL_NORMAL)) )
  416. return E_FAIL;
  417. }
  418. else
  419. {
  420. if ( FAILED(hr = m_pDD->SetCooperativeLevel(m_hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT)) )
  421. return E_FAIL;
  422. if ( FAILED(hr = m_pDD->SetDisplayMode(m_stDisplayInfo.wWidth, m_stDisplayInfo.wHeight, m_stDisplayInfo.wBPP, 0, 0)) )
  423. return E_FAIL;
  424. }
  425. if ( FAILED(hr == CreatePrimarySurface()) )
  426. {
  427. MessageBox(m_hWnd, TEXT("[CWHDXGraphicWindow::CreateDXG]") TEXT("Primary surface create failed."), TEXT("MirDXG"), MB_ICONERROR | MB_OK);
  428. return E_FAIL;
  429. }
  430. UpdateBoundsWnd();
  431. if ( m_bDeviceModeFlag & _DXG_DEVICEMODE_D3D )
  432. {
  433. if ( FAILED( hr = m_pDD->QueryInterface(IID_IDirect3D7, (VOID**)&m_pD3D)) )
  434. return E_FAIL;
  435. if ( FAILED(hr = m_pD3D->CreateDevice(*g_stDXGEnumDeviceInfo[bSelecedDevice].pDeviceGUID, m_pddsBackBuffer, &m_pd3dDevice)) )
  436. return E_FAIL;
  437. D3DVIEWPORT7 d3dVP = { 0, 0, m_stDisplayInfo.wWidth, m_stDisplayInfo.wHeight, 0.0f, 1.0f };
  438. if ( FAILED( hr = m_pd3dDevice->SetViewport(&d3dVP)) ) return hr;
  439. if ( m_bDeviceModeFlag & _DXG_DEVICEMODE_ZBUFFER )
  440. {
  441. if ( FAILED(hr = CreateZBuffer(g_stDXGEnumDeviceInfo[bSelecedDevice].pDeviceGUID)) )
  442. {
  443. MessageBox(m_hWnd, TEXT("[CWHDXGraphicWindow::CreateDXG]") TEXT("ZBuffer create failed."), TEXT("MirDXG"), MB_ICONERROR | MB_OK);
  444. return E_FAIL;
  445. }
  446. }
  447. }
  448. m_stBitsMaskInfo = GetRGBMaskInfoIN16Bits(m_pddsBackBuffer);
  449. Init3DDeviceObjects();
  450. return S_OK;
  451. }
  452. return hr;
  453. }
  454. /******************************************************************************************************************
  455. 窃荐疙 : CDXGraphic::ResetDXG()
  456. 累己磊 : 
  457. 累己老 : 
  458. 格利   : 
  459. 涝仿   : WORD wWidth
  460.          WORD wHeight
  461.          WORD wBPP
  462.          BYTE bScreenModeFlag
  463.          BYTE bDeviceModeFlag
  464. 免仿   : HRESULT 
  465. [老磊][荐沥磊] : 荐沥郴侩
  466. *******************************************************************************************************************/
  467. HRESULT CWHDXGraphicWindow::ResetDXG(WORD wWidth, WORD wHeight, WORD wBPP, BYTE bScreenModeFlag, BYTE bDeviceModeFlag)
  468. {
  469.     HRESULT hr;
  470.     DWORD dwStyle;
  471. if ( m_bDeviceModeFlag == bDeviceModeFlag && m_bScreenModeFlag == bScreenModeFlag && 
  472.  m_stDisplayInfo.wWidth == wWidth && m_stDisplayInfo.wHeight == wHeight && m_stDisplayInfo.wBPP == wBPP )
  473. return E_FAIL;     
  474.     if ( FAILED(DestroyDXGObjects()) )
  475. {
  476. MessageBox(m_hWnd, TEXT("[CWHDXGraphicWindow::ResetDXG]") TEXT("DirectGraphic reset failed."), "MirDXG", MB_ICONERROR | MB_OK);
  477. return E_FAIL;
  478. }
  479. m_stDisplayInfo.wWidth = wWidth;
  480. m_stDisplayInfo.wHeight = wHeight;
  481. m_stDisplayInfo.wBPP = wBPP;
  482. m_bScreenModeFlag = bScreenModeFlag;
  483. m_bDeviceModeFlag = bDeviceModeFlag;
  484. if ( m_bScreenModeFlag & _DXG_SCREENMODE_WINDOW )
  485. {
  486. dwStyle  = GetWindowStyle(m_hWnd);
  487. dwStyle &= ~WS_POPUP;
  488. dwStyle |= WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_SYSMENU;
  489. SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);
  490. }
  491. else
  492. {
  493. dwStyle  = GetWindowStyle(m_hWnd);
  494. dwStyle &= ~dwStyle;
  495. dwStyle |= WS_POPUP;
  496. SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);
  497. }
  498. if ( hr = FAILED(CreateDXG()) )
  499. {
  500. MessageBox(m_hWnd, TEXT("[CWHDXGraphicWindow::ResetDXG]") TEXT("DirectGraphic create failed."), "MirDXG", MB_ICONERROR | MB_OK);
  501. return E_FAIL;
  502. }
  503. CreateDefFont();
  504. return S_OK;
  505. }
  506. /******************************************************************************************************************
  507. 窃荐疙 : CWHDXGraphicWindow::CreatePrimarySurface()
  508. 累己磊 : 
  509. 累己老 : 
  510. 格利   : 
  511. 免仿   : HRESULT 
  512. [老磊][荐沥磊] : 荐沥郴侩
  513. *******************************************************************************************************************/
  514. HRESULT CWHDXGraphicWindow::CreatePrimarySurface()
  515. {
  516.     DDSURFACEDESC2 ddsd;
  517.     HRESULT hr;
  518. ZeroMemory(&ddsd, sizeof(ddsd));
  519. ddsd.dwSize = sizeof(ddsd);
  520. if ( m_bScreenModeFlag & _DXG_SCREENMODE_WINDOW )
  521. {
  522. RECT rcWork;
  523. RECT rcTemp;
  524.     GetWindowRect(m_hWnd, &rcTemp);
  525. // 努扼捞攫飘康开狼 农扁甫 棱绰何盒篮 扩档快狼 积己苞 包访捞 乐促.
  526. // 拳搁秦惑档 溜, 努扼捞攫飘 荤阿屈 康开狼 农扁甫 掘绢柯促.
  527. SetRect(&rcTemp, 0, 0, m_stDisplayInfo.wWidth, m_stDisplayInfo.wHeight);
  528. // 努扼捞攫飘 荤阿屈 康开农扁俊辑 扩档快 傈眉康开狼 农扁肺 函券茄促.
  529. AdjustWindowRectEx(&rcTemp, GetWindowStyle(m_hWnd), GetMenu(m_hWnd) != NULL, GetWindowExStyle(m_hWnd));
  530. // 扩档快 傈眉康开农扁肺 扩档快甫 技泼茄促. 窜 矫累谅钎绰 公矫等促.
  531. SetWindowPos(m_hWnd, NULL, 0, 0, rcTemp.right-rcTemp.left, rcTemp.bottom-rcTemp.top,
  532.  SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
  533. // HWND_NOTOPMOST甫 技泼窍扁 困秦辑捞促.
  534. SetWindowPos(m_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
  535. // 官帕拳搁康开狼 农扁甫 掘绢柯促..
  536. SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWork, 0);
  537. GetWindowRect(m_hWnd, &rcTemp);
  538. if ( rcTemp.left < rcWork.left ) rcTemp.left = rcWork.left;
  539. if ( rcTemp.top  < rcWork.top ) rcTemp.top  = rcWork.top;
  540. // 扩档快狼 矫累谅钎甫 技泼茄促.
  541. SetWindowPos(m_hWnd, NULL, rcTemp.left, rcTemp.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
  542.     
  543. ddsd.dwFlags        = DDSD_CAPS;
  544. ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
  545. if ( FAILED(hr = m_pDD->CreateSurface(&ddsd, &m_pddsFrontBuffer, NULL)) ) return E_FAIL;
  546. ddsd.dwFlags        = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
  547. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
  548. if ( m_bDeviceModeFlag & _DXG_DEVICEMODE_D3D )
  549. ddsd.ddsCaps.dwCaps |= DDSCAPS_3DDEVICE;
  550. ddsd.dwWidth    = m_stDisplayInfo.wWidth;
  551. ddsd.dwHeight   = m_stDisplayInfo.wHeight;
  552. if ( FAILED(hr = m_pDD->CreateSurface(&ddsd, &m_pddsBackBuffer, NULL)) ) return E_FAIL;
  553. }
  554. else
  555. {
  556. ddsd.dwFlags           = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
  557. ddsd.ddsCaps.dwCaps    = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
  558. ddsd.dwBackBufferCount = 1;
  559. if ( m_bDeviceModeFlag & _DXG_DEVICEMODE_D3D )
  560. ddsd.ddsCaps.dwCaps |= DDSCAPS_3DDEVICE;
  561. if ( FAILED(hr = m_pDD->CreateSurface(&ddsd, &m_pddsFrontBuffer, NULL)) ) return E_FAIL;
  562. DDSCAPS2 ddscaps;
  563. ZeroMemory(&ddscaps, sizeof(ddscaps));
  564. ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
  565. if ( FAILED(hr = m_pddsFrontBuffer->GetAttachedSurface(&ddscaps, &m_pddsBackBuffer)) )
  566. return E_FAIL;
  567. }
  568. // 俊叼飘扩档快 免仿阑 困秦辑 努府欺甫 技泼茄促.////////////////////////////////////////////////////////////////
  569. if ( FAILED(hr = m_pDD->CreateClipper(0, &m_lpcClipper, NULL)) ) return E_FAIL;
  570. if ( FAILED(hr = m_lpcClipper->SetHWnd(0, m_hWnd)) )
  571. {
  572. m_lpcClipper->Release();
  573. return E_FAIL;
  574. }
  575. if ( FAILED(hr = m_pddsFrontBuffer->SetClipper(m_lpcClipper)) )
  576. {
  577. m_lpcClipper->Release();
  578. return E_FAIL;
  579. }
  580.     m_pDD->FlipToGDISurface();
  581. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  582. return S_OK;
  583. }
  584. /******************************************************************************************************************
  585. 窃荐疙 : CWHDXGraphicWindow::UpdateBoundsWnd()
  586. 累己磊 : 
  587. 累己老 : 
  588. 格利   : 
  589. 免仿   : VOID 
  590. [老磊][荐沥磊] : 荐沥郴侩
  591. *******************************************************************************************************************/
  592. VOID CWHDXGraphicWindow::UpdateBoundsWnd()
  593. {
  594. if ( m_bScreenModeFlag & _DXG_SCREENMODE_WINDOW )
  595. {
  596.         GetClientRect(m_hWnd, &m_rcWindow);
  597.         ClientToScreen(m_hWnd, (POINT*)&m_rcWindow);
  598.         ClientToScreen(m_hWnd, (POINT*)&m_rcWindow+1);
  599.     }
  600.     else
  601.     {
  602.         SetRect(&m_rcWindow, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
  603.     }
  604. }
  605. /******************************************************************************************************************
  606. 窃荐疙 : CWHDXGraphicWindow::CreateZBuffer()
  607. 累己磊 : 
  608. 累己老 : 
  609. 格利   : 
  610. 涝仿   : GUID* pDeviceGUID
  611. 免仿   : HRESULT 
  612. [老磊][荐沥磊] : 荐沥郴侩
  613. *******************************************************************************************************************/
  614. HRESULT CWHDXGraphicWindow::CreateZBuffer(GUID* pDeviceGUID)
  615. {
  616.     HRESULT hr;
  617.     D3DDEVICEDESC7 ddDesc;
  618.     m_pd3dDevice->GetCaps(&ddDesc);
  619.     if (ddDesc.dpcTriCaps.dwRasterCaps & D3DPRASTERCAPS_ZBUFFERLESSHSR)
  620.         return S_OK;
  621.     DDSURFACEDESC2 ddsd;
  622. ZeroMemory(&ddsd, sizeof(DDSURFACEDESC2));
  623.     ddsd.dwSize = sizeof(ddsd);
  624.     m_pddsBackBuffer->GetSurfaceDesc(&ddsd);
  625.     ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT;
  626.     ddsd.ddsCaps.dwCaps = DDSCAPS_ZBUFFER;
  627.     ddsd.ddpfPixelFormat.dwSize = 0;
  628.     if ( FAILED(hr = m_pD3D->EnumZBufferFormats(*pDeviceGUID, DXGEnumZBufferFormatsCallback, (VOID*)&ddsd.ddpfPixelFormat)) )
  629.         return E_FAIL;
  630.     if ( 0 == ddsd.ddpfPixelFormat.dwSize )
  631.     {
  632.         ddsd.ddpfPixelFormat.dwRGBBitCount = 16;
  633.         if ( FAILED(hr = m_pD3D->EnumZBufferFormats(*pDeviceGUID, DXGEnumZBufferFormatsCallback,  (VOID*)&ddsd.ddpfPixelFormat)) )
  634.         return E_FAIL;
  635.         if ( 0 == ddsd.ddpfPixelFormat.dwSize )
  636.         return E_FAIL;
  637.     }
  638.     if ( FAILED(hr = m_pDD->CreateSurface(&ddsd, &m_pddsZBuffer, NULL)) ) return E_FAIL;
  639.     if ( FAILED(hr = m_pddsBackBuffer->AddAttachedSurface(m_pddsZBuffer)) )     return E_FAIL;
  640.     if ( FAILED(hr = m_pd3dDevice->SetRenderTarget(m_pddsBackBuffer, 0L)) )
  641.     {
  642.         return E_FAIL;
  643.     }
  644.     return S_OK;
  645. }
  646. HRESULT CWHDXGraphicWindow::Init3DDeviceObjects()
  647. {
  648.     // Set the transform matrices
  649.     D3DMATRIX matWorld, matView, matProj;
  650. // 泅犁 800*600拳搁俊 嘎霸 3D 谅钎拌甫 汲沥茄促.
  651.   D3DVECTOR vEyePt    = D3DVECTOR(0, 0, -300.0f);
  652.     D3DVECTOR vLookatPt = D3DVECTOR(0, 0, 0);
  653.     D3DVECTOR vUpVec    = D3DVECTOR(0, 1, 0);
  654.     D3DUtil_SetIdentityMatrix(matWorld);
  655.     D3DUtil_SetViewMatrix(matView, vEyePt, vLookatPt, vUpVec);
  656.     D3DUtil_SetProjectionMatrix(matProj, g_PI/2, float(600.0f/800.0f), -1.0f, 1.0f);
  657. // MATRIAL狼 檬扁拳甫 汲沥茄促.
  658.     D3DMATERIAL7 mtrl;
  659. ZeroMemory(&mtrl, sizeof(mtrl));
  660. mtrl.diffuse.r = mtrl.diffuse.g = mtrl.diffuse.b = 0.1f;
  661. mtrl.ambient.r = mtrl.ambient.g = mtrl.ambient.b = 1.0f;
  662.     m_pd3dDevice->SetMaterial(&mtrl);
  663. if ( !m_pd3dDevice )
  664. return E_FAIL;
  665.     m_pd3dDevice->SetTransform(D3DTRANSFORMSTATE_WORLD,      &matWorld);
  666.     m_pd3dDevice->SetTransform(D3DTRANSFORMSTATE_VIEW,       &matView);
  667.     m_pd3dDevice->SetTransform(D3DTRANSFORMSTATE_PROJECTION, &matProj);
  668. // RenderState狼 檬扁蔼 汲沥.
  669. m_pd3dDevice->SetRenderState(D3DRENDERSTATE_AMBIENT, 0xFFFFFFFF);
  670.     m_pd3dDevice->SetRenderState(D3DRENDERSTATE_DITHERENABLE, FALSE); 
  671. m_pd3dDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_NONE); 
  672. m_pd3dDevice->SetRenderState(D3DRENDERSTATE_ZENABLE, D3DZB_FALSE);
  673. m_pd3dDevice->SetRenderState(D3DRENDERSTATE_FILLMODE, D3DFILL_SOLID);
  674. // m_pd3dDevice->SetRenderState(D3DRENDERSTATE_FILLMODE, D3DFILL_WIREFRAME);
  675. // m_pd3dDevice->SetRenderState(D3DRENDERSTATE_SHADEMODE, D3DSHADE_GOURAUD);
  676.     // TextureStageState狼 檬扁蔼 汲沥.
  677. m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  678.     m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); 
  679.     m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_MODULATE);
  680.     m_pd3dDevice->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTFN_POINT); 
  681.     m_pd3dDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTFG_POINT);
  682. m_pd3dDevice->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTFP_NONE);
  683.     return S_OK;
  684. }
  685. /******************************************************************************************************************
  686. 窃荐疙 : CWHDXGraphicWindow::CreateGameFont()
  687. 累己磊 : 
  688. 累己老 : 
  689. 格利   : 
  690. 涝仿   : LPCSTR szFontName
  691.          INT nXsize
  692.          INT nYsize
  693.          BYTE bFontType
  694. 免仿   : VOID 
  695. [老磊][荐沥磊] : 荐沥郴侩
  696. *******************************************************************************************************************/
  697. HFONT CWHDXGraphicWindow::CreateGameFont(LPCSTR szFontName, INT nHeight, INT nWidth, INT nWeight, BOOL bItalic, BOOL bULine, BOOL bStrikeOut, DWORD dwCharSet)
  698. {
  699. INT nYsize;
  700. // 迄飘农扁 嘎眠扁.
  701. if ( m_pddsBackBuffer )
  702. {
  703. HDC hDC;
  704. m_pddsBackBuffer->GetDC(&hDC);
  705. nYsize = -MulDiv(nHeight, GetDeviceCaps(hDC, LOGPIXELSY), 72); 
  706. m_pddsBackBuffer->ReleaseDC(hDC);
  707. }
  708. return CreateFont(nYsize, nWidth, 0, 0, nWeight, bItalic, bULine, bStrikeOut, dwCharSet, 
  709.   OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, 
  710.   DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, szFontName);
  711. }
  712. VOID CWHDXGraphicWindow::CreateDefFont()
  713. {
  714. // 捞固 扁夯迄飘啊 积己登绢 乐栏搁 货肺 父甸荐 乐档废 Clear.
  715. if ( m_hDefGameFont != NULL )
  716. {
  717. DeleteObject(m_hDefGameFont); 
  718. m_hDefGameFont = NULL;
  719. }
  720. m_hDefGameFont = CreateGameFont("奔覆", 9);
  721. }
  722. VOID CWHDXGraphicWindow::StringPlus(CHAR* szResult, CHAR* szSrc, ...)
  723. {
  724. INT nCnt = 0;
  725. va_list vaMarker;
  726. CHAR* pszString;
  727. // ZeroMemory(szResult, strlen(szResult));
  728. va_start(vaMarker, szSrc);
  729. pszString = szSrc;
  730. while ( TRUE )
  731. {
  732. strcpy(&szResult[strlen(szResult)], pszString);
  733. if ( !strcmp(pszString,  "") ) break;
  734. pszString = (CHAR*)va_arg(vaMarker, CHAR*);
  735. }
  736. va_end(vaMarker);
  737. }
  738. CHAR* CWHDXGraphicWindow::IntToStr(INT nNum)
  739. {
  740. static CHAR szResult[MAX_PATH];
  741. ZeroMemory(szResult, MAX_PATH);
  742. _itoa(nNum, szResult, 10);
  743. return szResult;
  744. }
  745. /******************************************************************************************************************
  746. 窃荐疙 : CWHDXGraphicWindow::PutsHan()
  747. 累己磊 : 
  748. 累己老 : 
  749. 格利   : 
  750. 涝仿   : LPDIRECTDRAWSURFACE7 pSurface
  751.          INT nX
  752.          INT nY
  753.          COLORREF foreColor
  754.          COLORREF backColor
  755.          CHAR* szFormat
  756.          ...
  757. 免仿   : VOID 
  758. [老磊][荐沥磊] : 荐沥郴侩
  759. *******************************************************************************************************************/
  760. VOID CWHDXGraphicWindow::PutsHan(LPDIRECTDRAWSURFACE7 pSurface, INT nX, INT nY, COLORREF foreColor, COLORREF backColor, CHAR* szText, HFONT hFont)
  761. {
  762. HDC hDC;
  763. HFONT hOldFont;
  764.     if (NULL == pSurface)
  765. pSurface = m_pddsBackBuffer;
  766.     if ( NULL == pSurface )
  767. return;
  768. if ( NULL == hFont )
  769. hFont = m_hDefGameFont;
  770. HRESULT hr = pSurface->GetDC(&hDC);
  771. if (backColor == RGB( 0, 0, 0 )) SetBkMode(hDC, TRANSPARENT);
  772. else SetBkColor(hDC, backColor);
  773. hOldFont = (HFONT)SelectObject(hDC, hFont);
  774. SetTextColor(hDC, foreColor);
  775. TextOut(hDC, nX, nY, szText, strlen(szText));
  776. SelectObject(hDC, hOldFont);
  777. if ( hFont != m_hDefGameFont )
  778. DeleteObject(hFont);
  779. pSurface->ReleaseDC(hDC);
  780. }
  781. /******************************************************************************************************************
  782. 窃荐疙 : CWHDXGraphicWindow::PutsHan()
  783. 累己磊 : 
  784. 累己老 : 
  785. 格利   : 
  786. 涝仿   : LPDIRECTDRAWSURFACE7 pSurface
  787.          INT nX
  788.          INT nY
  789.          COLORREF foreColor
  790.          COLORREF backColor
  791.          CHAR* szFormat
  792.          ...
  793. 免仿   : VOID 
  794. [老磊][荐沥磊] : 荐沥郴侩
  795. *******************************************************************************************************************/
  796. VOID CWHDXGraphicWindow::PutsHan(LPDIRECTDRAWSURFACE7 pSurface, RECT rc, COLORREF foreColor, COLORREF backColor, CHAR* szText, HFONT hFont)
  797. {
  798. HDC hDC;
  799. HFONT hOldFont;
  800.     if (NULL == pSurface)
  801. pSurface = m_pddsBackBuffer;
  802.     if ( NULL == pSurface )
  803. return;
  804. if ( NULL == hFont )
  805. hFont = m_hDefGameFont;
  806. HRESULT hr = pSurface->GetDC(&hDC);
  807. if (backColor == RGB( 0, 0, 0 )) SetBkMode(hDC, TRANSPARENT);
  808. else SetBkColor(hDC, backColor);
  809. hOldFont = (HFONT)SelectObject(hDC, hFont);
  810. SetTextColor(hDC, foreColor);
  811. DrawText(hDC, szText, -1, &rc, DT_CENTER|DT_SINGLELINE);
  812. SelectObject(hDC, hOldFont);
  813. if ( hFont != m_hDefGameFont )
  814. DeleteObject(hFont);
  815. pSurface->ReleaseDC(hDC);
  816. }
  817. SIZE CWHDXGraphicWindow::GetStrLength(LPDIRECTDRAWSURFACE7 pSurface, HFONT hFont, CHAR* szFormat, ...)
  818. {
  819. HDC hDC;
  820. va_list arg;
  821.     CHAR szBuf[1024];
  822. SIZE sSize;
  823. sSize.cx = 0;
  824. sSize.cy = 0;
  825. HFONT hOldFont;
  826. if ( NULL == pSurface )
  827. pSurface = m_pddsBackBuffer;
  828.     if ( NULL == pSurface ) return sSize;
  829. if ( NULL == hFont )
  830. hFont = m_hDefGameFont;
  831. HRESULT hr = pSurface->GetDC(&hDC);
  832. va_start(arg, szFormat);
  833.     vsprintf(szBuf, szFormat, arg);
  834.     va_end(arg);
  835. hOldFont = (HFONT)SelectObject(hDC, hFont);
  836. GetTextExtentPoint32(hDC,szBuf,strlen(szBuf),&sSize);
  837. SelectObject(hDC, hOldFont);
  838. pSurface->ReleaseDC(hDC);
  839. return sSize;
  840. }
  841. /*BOOL CWHDXGraphicWindow::StringDivideLen(INT nDivideLen, INT& nDividedLine, CHAR* szSrc,CDLList<CHAR*>* m_pxpStr)
  842. {
  843. CHAR szTmpCheck[MAX_PATH];
  844. CHAR szResult[MAX_PATH];
  845. nDividedLine = 1;
  846. INT nStartLen = 0;
  847. INT nEndLen = 0;
  848. INT nResultLen = 0;
  849. INT nWordCheck = 0;
  850. if ( szSrc[0] != NULL )
  851. {
  852. ZeroMemory(szResult,MAX_PATH);
  853. for ( INT nCnt = 0; nCnt < (INT)strlen(szSrc); nCnt++)
  854. {
  855. ZeroMemory(szTmpCheck, MAX_PATH);
  856. nEndLen = nCnt+1;
  857. // 泅犁何盒鳖瘤狼 巩磊凯阑 佬绰促.
  858. memcpy(&szTmpCheck, &szSrc[nStartLen], nEndLen-nStartLen);
  859. INT nsLen;
  860. nsLen = strlen(szTmpCheck);
  861. // 泅犁鳖瘤 佬绢柯 何盒捞 倾侩承捞甫 逞绢脊阑锭.
  862. if (nsLen > nDivideLen )
  863. {
  864. // 泅犁 2官捞飘 巩磊扼搁. 
  865. if ( szSrc[nEndLen-1] < 0 )
  866. {
  867. // 泅犁 菊俊巩磊啊 2官捞飘 巩磊啊 酒聪扼搁
  868. if ( !(nWordCheck%2) )
  869. {
  870. nStartLen += strlen(szTmpCheck)-1;
  871. nCnt--;
  872. CHAR* pszNewLine;
  873. pszNewLine = new CHAR[nResultLen+1];
  874. memcpy(pszNewLine,szResult,nResultLen);
  875. pszNewLine[nResultLen]=NULL;
  876. m_pxpStr->AddNode(pszNewLine);
  877. nResultLen = 0;
  878. nDividedLine++;
  879. }
  880. else
  881. {
  882. nStartLen += strlen(szTmpCheck)-2;
  883. nCnt -= 2;
  884. CHAR* pszNewLine;
  885. pszNewLine = new CHAR[nResultLen];
  886. memcpy(pszNewLine,szResult,nResultLen-1);
  887. pszNewLine[nResultLen-1]=NULL;
  888. m_pxpStr->AddNode(pszNewLine);
  889. nResultLen = 0;
  890. nDividedLine++;
  891. nWordCheck--;
  892. }
  893. }
  894. // 1官捞飘 巩磊. 
  895. // 泅犁焊促 茄官捞飘菊何盒鳖瘤父 绊妨秦林搁 等促.
  896. else
  897. {
  898. nStartLen += strlen(szTmpCheck)-1;
  899. nCnt--;
  900. CHAR* pszNewLine;
  901. pszNewLine = new CHAR[nResultLen+1];
  902. memcpy(pszNewLine,szResult,nResultLen);
  903. pszNewLine[nResultLen]=NULL;
  904. m_pxpStr->AddNode(pszNewLine);
  905. nResultLen=0;
  906. nDividedLine++;
  907. }
  908. }
  909. else if(szSrc[nEndLen-1]=='n') // 碍力俺青     n栏肺窍搁  Error ????
  910. {
  911. nStartLen += strlen(szTmpCheck)-1;
  912. CHAR* pszNewLine;
  913. pszNewLine = new CHAR[nResultLen+1];
  914. memcpy(pszNewLine,szResult,nResultLen);
  915. pszNewLine[nResultLen]=NULL;
  916. m_pxpStr->AddNode(pszNewLine);
  917. nResultLen=0;
  918. nDividedLine++;
  919. }
  920. else
  921. {
  922. if ( szSrc[nEndLen-1] < 0 )
  923. nWordCheck++;
  924. szResult[nResultLen] = szSrc[nEndLen-1];
  925. nResultLen++;
  926. }
  927. }
  928. if(nResultLen!=0)
  929. {
  930. CHAR* pszNewLine;
  931. pszNewLine = new CHAR[nResultLen+1];
  932. memcpy(pszNewLine,szResult,nResultLen);
  933. pszNewLine[nResultLen]=NULL;
  934. m_pxpStr->AddNode(pszNewLine);
  935. nDividedLine++;
  936. nResultLen=0;
  937. }
  938. return TRUE;
  939. }
  940. return FALSE;
  941. }
  942. */
  943. BOOL CWHDXGraphicWindow::StringDivide(INT nDivideWidth, INT& nDividedLine, CHAR* szSrc, CHAR* szResult)
  944. {
  945. CHAR szTmpCheck[MAX_PATH];
  946. nDividedLine = 1;
  947. INT nStartLen = 0;
  948. INT nEndLen = 0;
  949. INT nResultLen = 0;
  950. INT nWordCheck = 0;
  951. if ( szSrc[0] != NULL )
  952. {
  953. ZeroMemory(szResult, MAX_PATH);
  954. for ( INT nCnt = 0; nCnt < (INT)strlen(szSrc); nCnt++)
  955. {
  956. ZeroMemory(szTmpCheck, MAX_PATH);
  957. nEndLen = nCnt+1;
  958. // 父距俊 臂磊农扁啊 弥措 臂磊农扁甫 逞绢啊搁 弥措摹肺 嘎苗霖促.
  959. if ( nEndLen >= MAX_PATH )
  960. {
  961. szResult[MAX_PATH-1] = NULL;
  962. break;
  963. }
  964. // 泅犁何盒鳖瘤狼 巩磊凯阑 佬绰促.
  965. memcpy(&szTmpCheck, &szSrc[nStartLen], nEndLen-nStartLen);
  966. SIZE sizeLen;
  967. sizeLen = GetStrLength(NULL, NULL, szTmpCheck);
  968. // 泅犁鳖瘤 佬绢柯 何盒捞 倾侩承捞甫 逞绢脊阑锭.
  969. if ( sizeLen.cx > nDivideWidth )
  970. {
  971. // 泅犁 2官捞飘 巩磊扼搁. 
  972. if ( szSrc[nEndLen-1] < 0 )
  973. {
  974. // 泅犁 菊俊巩磊啊 2官捞飘 巩磊啊 酒聪扼搁
  975. if ( !(nWordCheck%2) )
  976. {
  977. nStartLen += strlen(szTmpCheck)-1;
  978. nCnt--;
  979. szResult[nResultLen] = '`';
  980. nResultLen++;
  981. nDividedLine++;
  982. }
  983. else
  984. {
  985. nStartLen += strlen(szTmpCheck)-2;
  986. nCnt -= 2;
  987. szResult[nResultLen-1] = '`';
  988. nDividedLine++;
  989. nWordCheck--;
  990. }
  991. }
  992. // 1官捞飘 巩磊. 
  993. // 泅犁焊促 茄官捞飘菊何盒鳖瘤父 绊妨秦林搁 等促.
  994. else
  995. {
  996. nStartLen += strlen(szTmpCheck)-1;
  997. nCnt--;
  998. szResult[nResultLen] = '`';
  999. nResultLen++;
  1000. nDividedLine++;
  1001. }
  1002. }
  1003. else
  1004. {
  1005. if ( szSrc[nEndLen-1] < 0 )
  1006. nWordCheck++;
  1007. szResult[nResultLen] = szSrc[nEndLen-1];
  1008. nResultLen++;
  1009. }
  1010. }
  1011. return TRUE;
  1012. }
  1013. return FALSE;
  1014. }
  1015. /******************************************************************************************************************
  1016. 窃荐疙 : CWHDXGraphicWindow::GetRGBMaskInfoIN16Bits()
  1017. 累己磊 : 
  1018. 累己老 : 
  1019. 格利   : 
  1020. 涝仿   : LPDIRECTDRAWSURFACE7 pSurface
  1021. 免仿   : DXG_MASKINFO 
  1022. [老磊][荐沥磊] : 荐沥郴侩
  1023. *******************************************************************************************************************/
  1024. DXG_MASKINFO CWHDXGraphicWindow::GetRGBMaskInfoIN16Bits(LPDIRECTDRAWSURFACE7 pSurface)
  1025. {
  1026. DDPIXELFORMAT ddpf;
  1027. DXG_MASKINFO stRGBMaskInfo;
  1028. ZeroMemory(&stRGBMaskInfo, sizeof(DXG_MASKINFO));
  1029. if ( pSurface == NULL ) pSurface = m_pddsBackBuffer;
  1030.     if ( pSurface )
  1031. {
  1032. memset(&ddpf, 0, sizeof(ddpf));
  1033. ddpf.dwSize = sizeof(ddpf);
  1034. ddpf.dwFlags = DDPF_RGB;
  1035. pSurface->GetPixelFormat(&ddpf);
  1036. stRGBMaskInfo.dwRMask = ddpf.dwRBitMask;
  1037. stRGBMaskInfo.dwGMask = ddpf.dwGBitMask;
  1038. stRGBMaskInfo.dwBMask = ddpf.dwBBitMask;
  1039. DWORD dwCnt;
  1040. DWORD dwMask;
  1041. for ( dwCnt = 0, dwMask = ddpf.dwRBitMask; !( dwMask & 1 ); dwCnt++, dwMask >>= 1 );
  1042. stRGBMaskInfo.bRShift = (BYTE) dwCnt;
  1043. for ( dwCnt = 0; ( ( dwMask>>dwCnt ) & 1 ); dwCnt++ );
  1044. stRGBMaskInfo.bRCnt = (BYTE) dwCnt;
  1045. for ( dwCnt = 0, dwMask = ddpf.dwGBitMask; !( dwMask & 1 ); dwCnt++, dwMask >>= 1 );
  1046. stRGBMaskInfo.bGShift = (BYTE) dwCnt;
  1047. for ( dwCnt = 0; ( ( dwMask>>dwCnt ) & 1 ); dwCnt++ );
  1048. stRGBMaskInfo.bGCnt = (BYTE) dwCnt;
  1049. for ( dwCnt = 0, dwMask = ddpf.dwBBitMask; !( dwMask & 1 ); dwCnt++, dwMask >>= 1 );
  1050. stRGBMaskInfo.bBShift = (BYTE) dwCnt;
  1051. for ( dwCnt = 0; ( ( dwMask>>dwCnt ) & 1 ); dwCnt++ );
  1052. stRGBMaskInfo.bBCnt = (BYTE) dwCnt;
  1053. }
  1054. return stRGBMaskInfo;
  1055. }
  1056. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1057. // 弊府绰 窃荐甸 葛澜.
  1058. WORD CWHDXGraphicWindow::ConvertColor24To16(COLORREF dwColor)
  1059. {
  1060. WORD wRet;
  1061. INT nRed  = RGB_GETRED(dwColor);
  1062. INT nGreen = RGB_GETGREEN(dwColor);
  1063. INT nBlue   = RGB_GETBLUE(dwColor);
  1064. nRed = (nRed*(1<<m_stBitsMaskInfo.bRCnt))/(1<<8);
  1065. nGreen = (nGreen*(1<<m_stBitsMaskInfo.bGCnt))/(1<<8);
  1066. nBlue = (nBlue*(1<<m_stBitsMaskInfo.bBCnt))/(1<<8);
  1067. wRet = (nRed << m_stBitsMaskInfo.bRShift) | (nGreen << m_stBitsMaskInfo.bGShift) | (nBlue << m_stBitsMaskInfo.bBShift); 
  1068. return wRet;
  1069. }
  1070. /******************************************************************************************************************
  1071. 窃荐疙 : CWHDXGraphicWindow::DrawWithGDI()
  1072. 累己磊 : 
  1073. 累己老 : 
  1074. 格利   : 
  1075. 涝仿   : RECT rc
  1076.          LPDIRECTDRAWSURFACE7 pSurface
  1077.          DWORD dwColor
  1078.          DWORD dwPenStyleFlg
  1079.          BYTE bKind
  1080. 免仿   : HRESULT 
  1081. [老磊][荐沥磊] : 荐沥郴侩
  1082. *******************************************************************************************************************/
  1083. HRESULT CWHDXGraphicWindow::DrawWithGDI(RECT rc, LPDIRECTDRAWSURFACE7 pSurface, DWORD dwColor, BYTE bKind)
  1084. {
  1085. POINT pt;
  1086. HDC hDC;
  1087. HPEN hPen, hOldPen;
  1088. HBRUSH hBrush, hOldBrush;
  1089. HRESULT hr;
  1090. if ( pSurface == NULL )
  1091. {
  1092. pSurface = m_pddsBackBuffer;
  1093. }
  1094. if ( pSurface == NULL )
  1095. return E_FAIL;
  1096. if ( FAILED(hr = pSurface->GetDC(&hDC)) )
  1097. {
  1098. return E_FAIL;
  1099. }
  1100. switch ( bKind )
  1101. {
  1102. case 0:
  1103. {
  1104. hPen = CreatePen(PS_SOLID, NULL, dwColor);
  1105. hOldPen = (HPEN)SelectObject(hDC, hPen);
  1106. MoveToEx(hDC, rc.left, rc.top, &pt);
  1107. LineTo(hDC, rc.right, rc.bottom);
  1108. SelectObject(hDC, hOldPen);
  1109. DeleteObject(hPen);
  1110. }
  1111. break;
  1112. case 1:
  1113. {
  1114. hBrush = CreateSolidBrush(dwColor);
  1115. hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
  1116. FrameRect(hDC, &rc, hBrush);
  1117. SelectObject(hDC, hOldBrush);
  1118. DeleteObject(hBrush);
  1119. }
  1120. break;
  1121. case 2:
  1122. {
  1123. hBrush = CreateSolidBrush(dwColor);
  1124. hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
  1125. FillRect(hDC, &rc, hBrush);
  1126. SelectObject(hDC, hOldBrush);
  1127. DeleteObject(hBrush);
  1128. }
  1129. break;
  1130. default:
  1131. break;
  1132. }
  1133. pSurface->ReleaseDC(hDC);
  1134. return S_OK;
  1135. }
  1136. /******************************************************************************************************************
  1137. 窃荐疙 : CWHDXGraphicWindow::DrawSprite()
  1138. 累己磊 : 
  1139. 累己老 : 
  1140. 格利   : 老馆利牢 弊府扁. 茄侨伎究 弊赴促. 胶农赴康开 努府俏, 家胶康开 努府俏
  1141. 涝仿   : INT nX
  1142.          INT nY
  1143.          INT nXSize
  1144.          INT nYSize
  1145.          WORD* pwSrc
  1146. 免仿   : VOID 
  1147. [老磊][荐沥磊] : 荐沥郴侩
  1148. *******************************************************************************************************************/
  1149. BOOL CWHDXGraphicWindow::DrawWithImage(INT nX, INT nY, INT nXSize, INT nYSize, WORD* pwSrc)
  1150. {
  1151. RECT rc;
  1152. DDSURFACEDESC2 ddsd;
  1153. INT nWidth = nXSize;
  1154. INT nHeight = nYSize;
  1155. INT nXOffset = 0;
  1156. INT nYOffset = 0;
  1157. INT nStartX = 0;
  1158. INT nStartY = 0;
  1159. INT nEndX = m_stDisplayInfo.wWidth -1;
  1160. INT nEndY = m_stDisplayInfo.wHeight-1;
  1161. if ( m_pddsBackBuffer != NULL )
  1162. {
  1163. if (nX < nStartX )
  1164. nXOffset = nStartX - nX;
  1165. nWidth  = nXSize - nXOffset;
  1166. }
  1167. if ( (nX+nXSize-1) > nEndX )
  1168. nWidth  = nEndX - nX - nXOffset + 1;
  1169. if ( nY < nStartY )
  1170. nYOffset = nStartY - nY;
  1171. nHeight = nYSize - nYOffset;
  1172. }
  1173. if ( (nY+nYSize-1) > nEndY )
  1174. nHeight = nEndY - nY - nYOffset + 1;
  1175. if ( (nWidth > 0) && (nHeight > 0) )
  1176. {
  1177. rc.left = nXOffset;
  1178. rc.right = nXOffset + nWidth;
  1179. rc.top = nYOffset;
  1180. rc.bottom = nYOffset + nHeight;
  1181. ddsd.dwSize = sizeof(DDSURFACEDESC2);
  1182. ddsd.lpSurface = NULL;
  1183. m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  1184. if ( !ddsd.lpSurface ) return FALSE;
  1185. WORD* pwdDst;
  1186. pwdDst = (WORD*)ddsd.lpSurface;
  1187. for ( INT y=rc.top ; y < rc.bottom ; y++ )
  1188. {
  1189. for ( INT x=rc.left ; x < rc.right ; x++ )
  1190. {
  1191. if ( pwSrc[y * nXSize + x] != 0 )
  1192. {
  1193. pwdDst[((y+nY) * (ddsd.lPitch >> 1)) + (nX+x)] = pwSrc[y * nXSize + x];
  1194. }
  1195. }
  1196. }
  1197. m_pddsBackBuffer->Unlock(NULL);
  1198. }
  1199. return TRUE;
  1200. }
  1201. return FALSE;
  1202. }
  1203. BOOL CWHDXGraphicWindow::DrawWithImagePerLineClipRgn(INT nX, INT nY, INT nXSize, INT nYSize, WORD* pwSrc, WORD wClipWidth, WORD wClipHeight)
  1204. {
  1205. RECT rc;
  1206. DDSURFACEDESC2 ddsd;
  1207. INT nWidth = nXSize;
  1208. INT nHeight = nYSize;
  1209. INT nXOffset = 0;
  1210. INT nYOffset = 0;
  1211. INT nStartX = 0;
  1212. INT nStartY = 0;
  1213. INT nEndX = wClipWidth  - 1;
  1214. INT nEndY = wClipHeight - 1;
  1215. if ( m_pddsBackBuffer != NULL )
  1216. {
  1217. if (nX < nStartX )
  1218. nXOffset = nStartX - nX;
  1219. nWidth  = nXSize - nXOffset;
  1220. }
  1221. if ( (nX+nXSize-1) > nEndX )
  1222. nWidth  = nEndX - nX - nXOffset + 1;
  1223. if ( nY < nStartY )
  1224. nYOffset = nStartY - nY;
  1225. nHeight = nYSize - nYOffset;
  1226. }
  1227. if ( (nY+nYSize-1) > nEndY )
  1228. nHeight = nEndY - nY - nYOffset + 1;
  1229. if ( (nWidth > 0) && (nHeight > 0) )
  1230. {
  1231. rc.left = nXOffset;
  1232. rc.right = nXOffset + nWidth;
  1233. rc.top = nYOffset;
  1234. rc.bottom = nYOffset + nHeight;
  1235. ddsd.dwSize = sizeof(DDSURFACEDESC2);
  1236. ddsd.lpSurface = NULL;
  1237. m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  1238. if ( !ddsd.lpSurface ) return FALSE;
  1239. WORD* pwdDst;
  1240. pwdDst = (WORD*)ddsd.lpSurface;
  1241. for ( INT y=rc.top ; y < rc.bottom ; y++ )
  1242. {
  1243. memcpy(&pwdDst[((y+nY) * (ddsd.lPitch >> 1)) + (nX + rc.left)], &pwSrc[y * nXSize + rc.left], (rc.right-rc.left)*2);
  1244. }
  1245. m_pddsBackBuffer->Unlock(NULL);
  1246. }
  1247. return TRUE;
  1248. }
  1249. return FALSE;
  1250. }
  1251. /******************************************************************************************************************
  1252. 窃荐疙 : CWHDXGraphicWindow::DrawWithSurface()
  1253. 累己磊 : 
  1254. 累己老 : 
  1255. 格利   : 
  1256. 涝仿   : LPDIRECTDRAWSURFACE7 pddsSrc
  1257.          RECT* prcSrc
  1258.          RECT* prcDst
  1259. 免仿   : BOOL 
  1260. [老磊][荐沥磊] : 荐沥郴侩
  1261. *******************************************************************************************************************/
  1262. BOOL CWHDXGraphicWindow::DrawWithSurface(INT nX, INT nY, INT nXSize, INT nYSize, LPDIRECTDRAWSURFACE7 pddsSrc)
  1263. {
  1264. RECT rc;
  1265. RECT rcDst;
  1266. INT nXOffset = 0;
  1267. INT nYOffset = 0;
  1268. INT nWidth = nXSize;
  1269. INT nHeight = nYSize;
  1270. INT nStartX = 0;
  1271. INT nStartY = 0;
  1272. INT nEndX = m_stDisplayInfo.wWidth -1;
  1273. INT nEndY = m_stDisplayInfo.wHeight-1;;
  1274. if ( m_pddsBackBuffer != NULL )
  1275. {
  1276. if (nX < nStartX )
  1277. nXOffset = nStartX - nX;
  1278. nWidth = nXSize - nXOffset;
  1279. }
  1280. if ( (nX+nXSize-1) > nEndX )
  1281. nWidth = nEndX - nX - nXOffset + 1;
  1282. if ( nY < nStartY )
  1283. nYOffset = nStartY - nY;
  1284. nHeight = nYSize - nYOffset;
  1285. }
  1286. if ( (nY+nYSize-1) > nEndY )
  1287. nHeight = nEndY - nY - nYOffset + 1;
  1288. if ( (nWidth > 0) && (nHeight > 0) )
  1289. {
  1290. rc.left  = nXOffset;
  1291. rc.right  = nXOffset+nWidth;
  1292. rc.top  = nYOffset;
  1293. rc.bottom  = nYOffset+nHeight;
  1294. rcDst.left  = rc.left+nX;
  1295. rcDst.top  = rc.top+nY;
  1296. rcDst.right  = rc.right+nX;
  1297. rcDst.bottom = rc.bottom+nY;
  1298. m_pddsBackBuffer->Blt(&rcDst, pddsSrc, &rc, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
  1299. }
  1300. return TRUE;
  1301. }
  1302. return FALSE;
  1303. }
  1304. BOOL CWHDXGraphicWindow::DrawWithImageForCompMemToMem(INT nX, INT nY, INT nXSize, INT nYSize, WORD* pwSrc, INT nDstXSize, INT nDstYSize, WORD* pwDst, WORD wChooseColor1, WORD wChooseColor2)
  1305. {
  1306. RECT rc;
  1307. INT nWidth = nXSize;
  1308. INT nHeight = nYSize;
  1309. INT nXOffset = 0;
  1310. INT nYOffset = 0;
  1311. INT nStartX = 0;
  1312. INT nStartY = 0;
  1313. INT nEndX = nDstXSize - 1;
  1314. INT nEndY = nDstYSize - 1;
  1315. if ( pwDst != NULL )
  1316. {
  1317. if (nX < nStartX )
  1318. nXOffset = nStartX - nX;
  1319. nWidth = nXSize - nXOffset;
  1320. }
  1321. if ( (nX+nXSize-1) > nEndX )
  1322. nWidth = nEndX - nX - nXOffset + 1;
  1323. if ( nY < nStartY ) { 
  1324. nYOffset = nStartY - nY;
  1325. nHeight = nYSize - nYOffset;
  1326. }
  1327. if ( (nY+nYSize-1) > nEndY )
  1328. nHeight = nEndY - nY - nYOffset + 1;
  1329. if ( (nWidth > 0) && (nHeight > 0) )
  1330. {
  1331. rc.left = nXOffset;
  1332. rc.right = nXOffset+nWidth;
  1333. rc.top = nYOffset;
  1334. rc.bottom = nYOffset+nHeight;
  1335. INT nWidthStart = 0;
  1336. INT nWidthEnd = 0;
  1337. INT nCurrWidth  = 0;
  1338. INT nCntCopyWord = 0;
  1339. INT nYCnt =0;
  1340. INT nLastWidth = 0;
  1341. FLOAT rBlueRate, rGreenRate, bRedRate;
  1342. BYTE  bRedSrc, bGreenSrc, bBlueSrc;
  1343. BYTE  bRedWantedColor, bGreenWantedColor, bBlueWantedColor;
  1344. WORD  wPixel;
  1345. // y绵 努府俏.
  1346. for ( nYCnt=0 ; nYCnt < rc.top ; nYCnt++ )
  1347. {
  1348. nWidthEnd += pwSrc[nWidthStart];
  1349. nWidthStart++;
  1350. nWidthEnd++;
  1351. nWidthStart = nWidthEnd;
  1352. }
  1353. // y绵俊 措秦辑 角力肺 风俏矫懦 Count父阑 沥茄促.
  1354. for ( nYCnt=rc.top ; nYCnt < rc.bottom ; nYCnt++ )
  1355. {
  1356. // 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
  1357. nWidthEnd += pwSrc[nWidthStart];
  1358. nWidthStart++;
  1359. // 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
  1360. for ( INT x = nWidthStart; x < nWidthEnd ; )
  1361. {
  1362. if ( pwSrc[x] == 0xC0 )
  1363. {
  1364. x++;
  1365. nCntCopyWord = pwSrc[x];
  1366. x++;
  1367. nCurrWidth += nCntCopyWord;
  1368. }
  1369. else if ( pwSrc[x] == 0xC1 )
  1370. {
  1371. x++;
  1372. nCntCopyWord = pwSrc[x];
  1373. x++;
  1374. nLastWidth = nCurrWidth;
  1375. nCurrWidth += nCntCopyWord;
  1376. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  1377. {
  1378. x += nCntCopyWord;
  1379. }
  1380. else
  1381. {
  1382. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1383. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  1384. {
  1385. x += (rc.left-nLastWidth);
  1386. memcpy(&pwDst[((nYCnt+nY) * nDstXSize) + (rc.left+nX)], &pwSrc[x], sizeof(WORD)*(nCurrWidth-rc.left));
  1387. x += (nCurrWidth-rc.left);
  1388. }
  1389. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1390. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  1391. {
  1392. memcpy(&pwDst[((nYCnt+nY) * nDstXSize) + (nLastWidth+nX)], &pwSrc[x], sizeof(WORD)*(rc.right-nLastWidth));
  1393. x += nCntCopyWord;
  1394. }
  1395. else
  1396. {
  1397. memcpy(&pwDst[((nYCnt+nY) * nDstXSize) + (nLastWidth+nX)], &pwSrc[x], sizeof(WORD)*nCntCopyWord);
  1398. x += nCntCopyWord;
  1399. }
  1400. }
  1401. }
  1402. else if ( pwSrc[x] == 0xC2 || pwSrc[x] == 0xC3 )
  1403. {
  1404. WORD wDyingKind, wChooseColor;
  1405. wDyingKind = pwSrc[x];
  1406. switch ( wDyingKind )
  1407. {
  1408. case 0xC2: 
  1409. wChooseColor = wChooseColor1;
  1410. break;
  1411. case 0xC3: 
  1412. wChooseColor = wChooseColor2;
  1413. break;
  1414. }
  1415. x++;
  1416. nCntCopyWord = pwSrc[x];
  1417. x++;
  1418. nLastWidth = nCurrWidth;
  1419. nCurrWidth += nCntCopyWord;
  1420. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  1421. {
  1422. x += nCntCopyWord;
  1423. }
  1424. else
  1425. {
  1426. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1427. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  1428. {
  1429. x += (rc.left-nLastWidth);
  1430. for ( INT nCheck = 0; nCheck < nCurrWidth-rc.left; nCheck++ )
  1431. {
  1432. wPixel   = wChooseColor;
  1433. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1434. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1435. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1436. wPixel   = pwSrc[x+nCheck];
  1437. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1438. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1439. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1440. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1441. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1442. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1443. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  1444. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  1445. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  1446. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1447. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1448. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1449. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1450. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1451. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1452. pwDst[((nYCnt+nY) * nDstXSize) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  1453.     (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  1454. (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  1455. }
  1456. x += (nCurrWidth-rc.left);
  1457. }
  1458. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1459. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  1460. {
  1461. for ( INT nCheck = 0; nCheck < rc.right-nLastWidth; nCheck++ )
  1462. {
  1463. wPixel   = wChooseColor;
  1464. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1465. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1466. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1467. wPixel   = pwSrc[x+nCheck];
  1468. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1469. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1470. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1471. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1472. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1473. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1474. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  1475. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  1476. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  1477. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1478. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1479. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1480. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1481. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1482. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1483. pwDst[((nYCnt+nY) * nDstXSize) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  1484. (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  1485. (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  1486. }
  1487. x += nCntCopyWord;
  1488. }
  1489. else
  1490. {
  1491. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  1492. {
  1493. wPixel   = wChooseColor;
  1494. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1495. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1496. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1497. wPixel   = pwSrc[x+nCheck];
  1498. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1499. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1500. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1501. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1502. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1503. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1504. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  1505. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  1506. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  1507. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1508. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1509. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1510. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1511. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1512. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1513. pwDst[((nYCnt+nY) * nDstXSize) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  1514. (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  1515. (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  1516. }
  1517. x += nCntCopyWord;
  1518. }
  1519. }
  1520. }
  1521. }
  1522. // 扼牢狼 场阑 促澜 扼牢狼 矫累栏肺 颗败霖促.
  1523. nWidthEnd++;
  1524. nWidthStart = nWidthEnd;
  1525. nCurrWidth = 0;
  1526. }
  1527. }
  1528. m_pddsBackBuffer->Unlock(NULL);
  1529. return TRUE;
  1530. }
  1531. return FALSE;
  1532. }
  1533. BOOL CWHDXGraphicWindow::DrawWithImageForComp(INT nX, INT nY, RECT rcSrc, WORD* pwSrc, WORD wChooseColor1, WORD wChooseColor2)
  1534. {
  1535. RECT rc;
  1536. DDSURFACEDESC2 ddsd;
  1537. INT nWidth = rcSrc.right-rcSrc.left;
  1538. INT nHeight = rcSrc.bottom-rcSrc.top;
  1539. INT nXOffset = rcSrc.left;
  1540. INT nYOffset = rcSrc.top;
  1541. INT nStartX = 0;
  1542. INT nStartY = 0;
  1543. INT nEndX = m_stDisplayInfo.wWidth -1;
  1544. INT nEndY = m_stDisplayInfo.wHeight-1;
  1545. if ( m_pddsBackBuffer != NULL )
  1546. {
  1547. if (nX < nStartX )
  1548. nXOffset += nStartX - nX;
  1549. nWidth  = rcSrc.right - nXOffset;
  1550. }
  1551. if ( (nX+rcSrc.right-rcSrc.left-1) > nEndX )
  1552. nWidth = nEndX - nX - nXOffset + 1;
  1553. if ( nY < nStartY )
  1554. nYOffset += nStartY - nY;
  1555. nHeight  = rcSrc.bottom - nYOffset;
  1556. }
  1557. if ( (nY+rcSrc.bottom-rcSrc.top-1) > nEndY )
  1558. nHeight = nEndY - nY - nYOffset + 1;
  1559. if ( (nWidth > 0) && (nHeight > 0) )
  1560. {
  1561. rc.left = nXOffset;
  1562. rc.right = nXOffset+nWidth;
  1563. rc.top = nYOffset;
  1564. rc.bottom = nYOffset+nHeight;
  1565. ddsd.dwSize = sizeof(DDSURFACEDESC2);
  1566. ddsd.lpSurface = NULL;
  1567. m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  1568. if ( !ddsd.lpSurface ) return FALSE;
  1569. WORD* pwdDst;
  1570. pwdDst = (WORD*)ddsd.lpSurface;
  1571. INT nWidthStart = 0;
  1572. INT nWidthEnd = 0;
  1573. INT nCurrWidth  = 0;
  1574. INT nCntCopyWord = 0;
  1575. INT nYCnt =0;
  1576. INT nLastWidth = 0;
  1577. FLOAT rBlueRate, rGreenRate, bRedRate;
  1578. BYTE  bRedSrc, bGreenSrc, bBlueSrc;
  1579. BYTE  bRedWantedColor, bGreenWantedColor, bBlueWantedColor;
  1580. WORD  wPixel;
  1581. // y绵 努府俏.
  1582. for ( nYCnt=0 ; nYCnt < rc.top ; nYCnt++ )
  1583. {
  1584. nWidthEnd += pwSrc[nWidthStart];
  1585. nWidthStart++;
  1586. nWidthEnd++;
  1587. nWidthStart = nWidthEnd;
  1588. }
  1589. // y绵俊 措秦辑 角力肺 风俏矫懦 Count父阑 沥茄促.
  1590. for ( nYCnt=rc.top ; nYCnt < rc.bottom ; nYCnt++ )
  1591. {
  1592. // 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
  1593. nWidthEnd += pwSrc[nWidthStart];
  1594. nWidthStart++;
  1595. // 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
  1596. for ( INT x = nWidthStart; x < nWidthEnd ; )
  1597. {
  1598. if ( pwSrc[x] == 0xC0 )
  1599. {
  1600. x++;
  1601. nCntCopyWord = pwSrc[x];
  1602. x++;
  1603. nCurrWidth += nCntCopyWord;
  1604. }
  1605. else if ( pwSrc[x] == 0xC1 )
  1606. {
  1607. x++;
  1608. nCntCopyWord = pwSrc[x];
  1609. x++;
  1610. nLastWidth = nCurrWidth;
  1611. nCurrWidth += nCntCopyWord;
  1612. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  1613. {
  1614. x += nCntCopyWord;
  1615. }
  1616. else
  1617. {
  1618. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1619. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  1620. {
  1621. x += (rc.left-nLastWidth);
  1622. memcpy(&pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (rc.left+nX)], &pwSrc[x], sizeof(WORD)*(nCurrWidth-rc.left));
  1623. x += (nCurrWidth-rc.left);
  1624. }
  1625. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1626. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  1627. {
  1628. memcpy(&pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX)], &pwSrc[x], sizeof(WORD)*(rc.right-nLastWidth));
  1629. x += nCntCopyWord;
  1630. }
  1631. else
  1632. {
  1633. memcpy(&pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX)], &pwSrc[x], sizeof(WORD)*nCntCopyWord);
  1634. x += nCntCopyWord;
  1635. }
  1636. }
  1637. }
  1638. else if ( pwSrc[x] == 0xC2 || pwSrc[x] == 0xC3 )
  1639. {
  1640. WORD wDyingKind, wChooseColor;
  1641. wDyingKind = pwSrc[x];
  1642. switch ( wDyingKind )
  1643. {
  1644. case 0xC2: 
  1645. wChooseColor = wChooseColor1;
  1646. break;
  1647. case 0xC3: 
  1648. wChooseColor = wChooseColor2;
  1649. break;
  1650. }
  1651. x++;
  1652. nCntCopyWord = pwSrc[x];
  1653. x++;
  1654. nLastWidth = nCurrWidth;
  1655. nCurrWidth += nCntCopyWord;
  1656. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  1657. {
  1658. x += nCntCopyWord;
  1659. }
  1660. else
  1661. {
  1662. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1663. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  1664. {
  1665. x += (rc.left-nLastWidth);
  1666. for ( INT nCheck = 0; nCheck < nCurrWidth-rc.left; nCheck++ )
  1667. {
  1668. wPixel   = wChooseColor;
  1669. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1670. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1671. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1672. wPixel   = pwSrc[x+nCheck];
  1673. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1674. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1675. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1676. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1677. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1678. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1679. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  1680. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  1681. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  1682. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1683. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1684. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1685. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1686. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1687. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1688. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  1689.   (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  1690.   (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  1691. }
  1692. x += (nCurrWidth-rc.left);
  1693. }
  1694. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1695. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  1696. {
  1697. for ( INT nCheck = 0; nCheck < rc.right-nLastWidth; nCheck++ )
  1698. {
  1699. wPixel   = wChooseColor;
  1700. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1701. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1702. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1703. wPixel   = pwSrc[x+nCheck];
  1704. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1705. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1706. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1707. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1708. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1709. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1710. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  1711. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  1712. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  1713. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1714. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1715. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1716. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1717. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1718. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1719. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  1720.   (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  1721.   (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  1722. }
  1723. x += nCntCopyWord;
  1724. }
  1725. else
  1726. {
  1727. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  1728. {
  1729. wPixel   = wChooseColor;
  1730. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1731. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1732. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1733. wPixel   = pwSrc[x+nCheck];
  1734. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1735. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1736. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1737. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1738. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1739. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1740. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  1741. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  1742. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  1743. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1744. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1745. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1746. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1747. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1748. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1749. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  1750.   (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  1751.     (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  1752. }
  1753. x += nCntCopyWord;
  1754. }
  1755. }
  1756. }
  1757. }
  1758. // 扼牢狼 场阑 促澜 扼牢狼 矫累栏肺 颗败霖促.
  1759. nWidthEnd++;
  1760. nWidthStart = nWidthEnd;
  1761. nCurrWidth = 0;
  1762. }
  1763. }
  1764. m_pddsBackBuffer->Unlock(NULL);
  1765. return TRUE;
  1766. }
  1767. return FALSE;
  1768. }
  1769. BOOL CWHDXGraphicWindow::DrawWithImageForComp(INT nX, INT nY, INT nXSize, INT nYSize, WORD* pwSrc, WORD wChooseColor1, WORD wChooseColor2)
  1770. {
  1771. RECT rc;
  1772. DDSURFACEDESC2 ddsd;
  1773. INT nWidth = nXSize;
  1774. INT nHeight = nYSize;
  1775. INT nXOffset = 0;
  1776. INT nYOffset = 0;
  1777. INT nStartX = 0;
  1778. INT nStartY = 0;
  1779. INT nEndX = m_stDisplayInfo.wWidth -1;
  1780. INT nEndY = m_stDisplayInfo.wHeight-1;
  1781. if ( m_pddsBackBuffer != NULL )
  1782. {
  1783. if (nX < nStartX )
  1784. nXOffset = nStartX - nX;
  1785. nWidth = nXSize - nXOffset;
  1786. }
  1787. if ( (nX+nXSize-1) > nEndX )
  1788. nWidth = nEndX - nX - nXOffset + 1;
  1789. if ( nY < nStartY )
  1790. nYOffset = nStartY - nY;
  1791. nHeight = nYSize - nYOffset;
  1792. }
  1793. if ( (nY+nYSize-1) > nEndY )
  1794. nHeight = nEndY - nY - nYOffset + 1;
  1795. if ( (nWidth > 0) && (nHeight > 0) )
  1796. {
  1797. rc.left = nXOffset;
  1798. rc.right = nXOffset+nWidth;
  1799. rc.top = nYOffset;
  1800. rc.bottom = nYOffset+nHeight;
  1801. ddsd.dwSize = sizeof(DDSURFACEDESC2);
  1802. ddsd.lpSurface = NULL;
  1803. m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  1804. if ( !ddsd.lpSurface ) return FALSE;
  1805. WORD* pwdDst;
  1806. pwdDst = (WORD*)ddsd.lpSurface;
  1807. INT nWidthStart = 0;
  1808. INT nWidthEnd = 0;
  1809. INT nCurrWidth  = 0;
  1810. INT nCntCopyWord = 0;
  1811. INT nYCnt =0;
  1812. INT nLastWidth = 0;
  1813. FLOAT rBlueRate, rGreenRate, bRedRate;
  1814. BYTE  bRedSrc, bGreenSrc, bBlueSrc;
  1815. BYTE  bRedWantedColor, bGreenWantedColor, bBlueWantedColor;
  1816. WORD  wPixel;
  1817. // y绵 努府俏.
  1818. for ( nYCnt=0 ; nYCnt < rc.top ; nYCnt++ )
  1819. {
  1820. nWidthEnd += pwSrc[nWidthStart];
  1821. nWidthStart++;
  1822. nWidthEnd++;
  1823. nWidthStart = nWidthEnd;
  1824. }
  1825. // y绵俊 措秦辑 角力肺 风俏矫懦 Count父阑 沥茄促.
  1826. for ( nYCnt=rc.top ; nYCnt < rc.bottom ; nYCnt++ )
  1827. {
  1828. // 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
  1829. nWidthEnd += pwSrc[nWidthStart];
  1830. nWidthStart++;
  1831. // 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
  1832. for ( INT x = nWidthStart; x < nWidthEnd ; )
  1833. {
  1834. if ( pwSrc[x] == 0xC0 )
  1835. {
  1836. x++;
  1837. nCntCopyWord = pwSrc[x];
  1838. x++;
  1839. nCurrWidth += nCntCopyWord;
  1840. }
  1841. else if ( pwSrc[x] == 0xC1 )
  1842. {
  1843. x++;
  1844. nCntCopyWord = pwSrc[x];
  1845. x++;
  1846. nLastWidth = nCurrWidth;
  1847. nCurrWidth += nCntCopyWord;
  1848. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  1849. {
  1850. x += nCntCopyWord;
  1851. }
  1852. else
  1853. {
  1854. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1855. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  1856. {
  1857. x += (rc.left-nLastWidth);
  1858. memcpy(&pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (rc.left+nX)], &pwSrc[x], sizeof(WORD)*(nCurrWidth-rc.left));
  1859. x += (nCurrWidth-rc.left);
  1860. }
  1861. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1862. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  1863. {
  1864. memcpy(&pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX)], &pwSrc[x], sizeof(WORD)*(rc.right-nLastWidth));
  1865. x += nCntCopyWord;
  1866. }
  1867. else
  1868. {
  1869. memcpy(&pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX)], &pwSrc[x], sizeof(WORD)*nCntCopyWord);
  1870. x += nCntCopyWord;
  1871. }
  1872. }
  1873. }
  1874. else if ( pwSrc[x] == 0xC2 || pwSrc[x] == 0xC3 )
  1875. {
  1876. WORD wDyingKind, wChooseColor;
  1877. wDyingKind = pwSrc[x];
  1878. switch ( wDyingKind )
  1879. {
  1880. case 0xC2: 
  1881. wChooseColor = wChooseColor1;
  1882. break;
  1883. case 0xC3: 
  1884. wChooseColor = wChooseColor2;
  1885. break;
  1886. }
  1887. x++;
  1888. nCntCopyWord = pwSrc[x];
  1889. x++;
  1890. nLastWidth = nCurrWidth;
  1891. nCurrWidth += nCntCopyWord;
  1892. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  1893. {
  1894. x += nCntCopyWord;
  1895. }
  1896. else
  1897. {
  1898. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1899. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  1900. {
  1901. x += (rc.left-nLastWidth);
  1902. for ( INT nCheck = 0; nCheck < nCurrWidth-rc.left; nCheck++ )
  1903. {
  1904. wPixel   = wChooseColor;
  1905. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1906. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1907. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1908. wPixel   = pwSrc[x+nCheck];
  1909. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1910. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1911. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1912. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1913. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1914. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1915. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  1916. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  1917. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  1918. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1919. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1920. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1921. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1922. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1923. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1924. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  1925.   (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  1926.   (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  1927. }
  1928. x += (nCurrWidth-rc.left);
  1929. }
  1930. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  1931. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  1932. {
  1933. for ( INT nCheck = 0; nCheck < rc.right-nLastWidth; nCheck++ )
  1934. {
  1935. wPixel   = wChooseColor;
  1936. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1937. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1938. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1939. wPixel   = pwSrc[x+nCheck];
  1940. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1941. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1942. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1943. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1944. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1945. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1946. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  1947. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  1948. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  1949. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1950. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1951. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1952. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1953. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1954. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1955. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  1956.   (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  1957.   (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  1958. }
  1959. x += nCntCopyWord;
  1960. }
  1961. else
  1962. {
  1963. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  1964. {
  1965. wPixel   = wChooseColor;
  1966. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1967. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1968. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1969. wPixel   = pwSrc[x+nCheck];
  1970. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  1971. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  1972. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  1973. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  1974. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  1975. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  1976. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  1977. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  1978. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  1979. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  1980. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  1981. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  1982. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  1983. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  1984. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  1985. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  1986.   (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  1987.     (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  1988. }
  1989. x += nCntCopyWord;
  1990. }
  1991. }
  1992. }
  1993. }
  1994. // 扼牢狼 场阑 促澜 扼牢狼 矫累栏肺 颗败霖促.
  1995. nWidthEnd++;
  1996. nWidthStart = nWidthEnd;
  1997. nCurrWidth = 0;
  1998. }
  1999. }
  2000. m_pddsBackBuffer->Unlock(NULL);
  2001. return TRUE;
  2002. }
  2003. return FALSE;
  2004. }
  2005. BOOL CWHDXGraphicWindow::DrawWithImageForCompClipRgnBase(INT nX, INT nY, INT nXSize, INT nYSize, WORD* pwSrc, WORD wClipWidth, WORD wClipHeight, WORD wChooseColor1, WORD wChooseColor2)
  2006. {
  2007. RECT rc;
  2008. DDSURFACEDESC2 ddsd;
  2009. INT nWidth = nXSize;
  2010. INT nHeight = nYSize;
  2011. INT nXOffset = 0;
  2012. INT nYOffset = 0;
  2013. INT nStartX = 0;
  2014. INT nStartY = 0;
  2015. INT nEndX = wClipWidth -1;
  2016. INT nEndY = wClipHeight-1;
  2017. if ( m_pddsBackBuffer != NULL )
  2018. {
  2019. if (nX < nStartX )
  2020. nXOffset = nStartX - nX;
  2021. nWidth = nXSize - nXOffset;
  2022. }
  2023. if ( (nX+nXSize-1) > nEndX )
  2024. nWidth = nEndX - nX - nXOffset + 1;
  2025. if ( nY < nStartY )
  2026. nYOffset = nStartY - nY;
  2027. nHeight = nYSize - nYOffset;
  2028. }
  2029. if ( (nY+nYSize-1) > nEndY )
  2030. nHeight = nEndY - nY - nYOffset + 1;
  2031. if ( (nWidth > 0) && (nHeight > 0) )
  2032. {
  2033. rc.left = nXOffset;
  2034. rc.right = nXOffset+nWidth;
  2035. rc.top = nYOffset;
  2036. rc.bottom = nYOffset+nHeight;
  2037. ddsd.dwSize = sizeof(DDSURFACEDESC2);
  2038. ddsd.lpSurface = NULL;
  2039. m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  2040. if ( !ddsd.lpSurface ) return FALSE;
  2041. WORD* pwdDst;
  2042. pwdDst = (WORD*)ddsd.lpSurface;
  2043. INT nWidthStart = 0;
  2044. INT nWidthEnd = 0;
  2045. INT nCurrWidth  = 0;
  2046. INT nCntCopyWord = 0;
  2047. INT nYCnt =0;
  2048. INT nLastWidth = 0;
  2049. FLOAT rBlueRate, rGreenRate, bRedRate;
  2050. BYTE  bRedSrc, bGreenSrc, bBlueSrc;
  2051. BYTE  bRedWantedColor, bGreenWantedColor, bBlueWantedColor;
  2052. WORD  wPixel;
  2053. // y绵 努府俏.
  2054.    for ( nYCnt=0 ; nYCnt < rc.top ; nYCnt++ )
  2055. {
  2056. nWidthEnd += pwSrc[nWidthStart];
  2057. nWidthStart++;
  2058. nWidthEnd++;
  2059. nWidthStart = nWidthEnd;
  2060. }
  2061. // y绵俊 措秦辑 角力肺 风俏矫懦 Count父阑 沥茄促.
  2062. for ( nYCnt=rc.top ; nYCnt < rc.bottom ; nYCnt++ )
  2063. {
  2064. // 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
  2065. nWidthEnd += pwSrc[nWidthStart];
  2066. nWidthStart++;
  2067. // 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
  2068. for ( INT x = nWidthStart; x < nWidthEnd ; )
  2069. {
  2070. if ( pwSrc[x] == 0xC0 )
  2071. {
  2072. x++;
  2073. nCntCopyWord = pwSrc[x];
  2074. x++;
  2075. nCurrWidth += nCntCopyWord;
  2076. }
  2077. else if ( pwSrc[x] == 0xC1 )
  2078. {
  2079. x++;
  2080. nCntCopyWord = pwSrc[x];
  2081. x++;
  2082. nLastWidth = nCurrWidth;
  2083. nCurrWidth += nCntCopyWord;
  2084. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  2085. {
  2086. x += nCntCopyWord;
  2087. }
  2088. else
  2089. {
  2090. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  2091. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  2092. {
  2093. x += (rc.left-nLastWidth);
  2094. memcpy(&pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (rc.left+nX)], &pwSrc[x], sizeof(WORD)*(nCurrWidth-rc.left));
  2095. x += (nCurrWidth-rc.left);
  2096. }
  2097. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  2098. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  2099. {
  2100. memcpy(&pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX)], &pwSrc[x], sizeof(WORD)*(rc.right-nLastWidth));
  2101. x += nCntCopyWord;
  2102. }
  2103. else
  2104. {
  2105. memcpy(&pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX)], &pwSrc[x], sizeof(WORD)*nCntCopyWord);
  2106. x += nCntCopyWord;
  2107. }
  2108. }
  2109. }
  2110. else if ( pwSrc[x] == 0xC2 || pwSrc[x] == 0xC3 )
  2111. {
  2112. WORD wDyingKind, wChooseColor;
  2113. wDyingKind = pwSrc[x];
  2114. switch ( wDyingKind )
  2115. {
  2116. case 0xC2: 
  2117. wChooseColor = wChooseColor1;
  2118. break;
  2119. case 0xC3: 
  2120. wChooseColor = wChooseColor2;
  2121. break;
  2122. }
  2123. x++;
  2124. nCntCopyWord = pwSrc[x];
  2125. x++;
  2126. nLastWidth = nCurrWidth;
  2127. nCurrWidth += nCntCopyWord;
  2128. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  2129. {
  2130. x += nCntCopyWord;
  2131. }
  2132. else
  2133. {
  2134. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  2135. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  2136. {
  2137. x += (rc.left-nLastWidth);
  2138. for ( INT nCheck = 0; nCheck < nCurrWidth-rc.left; nCheck++ )
  2139. {
  2140. wPixel   = wChooseColor;
  2141. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2142. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2143. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2144. wPixel   = pwSrc[x+nCheck];
  2145. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2146. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2147. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2148. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  2149. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  2150. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  2151. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  2152. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  2153. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  2154. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  2155. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  2156. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  2157. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  2158. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  2159. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  2160. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  2161.   (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  2162.     (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  2163. }
  2164. x += (nCurrWidth-rc.left);
  2165. }
  2166. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  2167. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  2168. {
  2169. for ( INT nCheck = 0; nCheck < rc.right-nLastWidth; nCheck++ )
  2170. {
  2171. wPixel   = wChooseColor;
  2172. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2173. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2174. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2175. wPixel   = pwSrc[x+nCheck];
  2176. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2177. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2178. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2179. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  2180. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  2181. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  2182. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  2183. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  2184. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  2185. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  2186. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  2187. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  2188. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  2189. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  2190. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  2191. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  2192.   (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  2193.     (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  2194. }
  2195. x += nCntCopyWord;
  2196. }
  2197. else
  2198. {
  2199. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  2200. {
  2201. wPixel   = wChooseColor;
  2202. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2203. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2204. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2205. wPixel   = pwSrc[x+nCheck];
  2206. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2207. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2208. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2209. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  2210. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  2211. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  2212. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  2213. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  2214. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  2215. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  2216. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  2217. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  2218. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  2219. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  2220. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  2221. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor  <<m_stBitsMaskInfo.bRShift) |
  2222.   (bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
  2223.     (bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
  2224. }
  2225. x += nCntCopyWord;
  2226. }
  2227. }
  2228. }
  2229. }
  2230. // 扼牢狼 场阑 促澜 扼牢狼 矫累栏肺 颗败霖促.
  2231. nWidthEnd++;
  2232. nWidthStart = nWidthEnd;
  2233. nCurrWidth = 0;
  2234. }
  2235. }
  2236. m_pddsBackBuffer->Unlock(NULL);
  2237. return TRUE;
  2238. }
  2239. return FALSE;
  2240. }
  2241. BOOL CWHDXGraphicWindow::DrawWithABlendCompDataWithBackBuffer(INT nX, INT nY, 
  2242.   INT nXSize, INT nYSize, WORD* pwSrc,
  2243.   WORD wClipWidth, WORD wClipHeight,
  2244.   WORD wChooseColor1, WORD wChooseColor2, BYTE bOpa)
  2245. {
  2246. RECT rc;
  2247. DDSURFACEDESC2 ddsd;
  2248. INT nWidth = nXSize;
  2249. INT nHeight = nYSize;
  2250. INT nXOffset = 0;
  2251. INT nYOffset = 0;
  2252. INT nStartX = 0;
  2253. INT nStartY = 0;
  2254. INT nEndX = wClipWidth -1;
  2255. INT nEndY = wClipHeight-1;
  2256. WORD wDyingKind, wChooseColor;
  2257. if ( m_pddsBackBuffer != NULL )
  2258. {
  2259. if (nX < nStartX )
  2260. nXOffset = nStartX - nX;
  2261. nWidth = nXSize - nXOffset;
  2262. }
  2263. if ( (nX+nXSize-1) > nEndX )
  2264. nWidth = nEndX - nX - nXOffset + 1;
  2265. if ( nY < nStartY )
  2266. nYOffset = nStartY - nY;
  2267. nHeight = nYSize - nYOffset;
  2268. }
  2269. if ( (nY+nYSize-1) > nEndY )
  2270. nHeight = nEndY - nY - nYOffset + 1;
  2271. if ( (nWidth > 0) && (nHeight > 0) )
  2272. {
  2273. rc.left = nXOffset;
  2274. rc.right = nXOffset+nWidth;
  2275. rc.top = nYOffset;
  2276. rc.bottom = nYOffset+nHeight;
  2277. ddsd.dwSize = sizeof(DDSURFACEDESC2);
  2278. ddsd.lpSurface = NULL;
  2279. m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  2280. if ( !ddsd.lpSurface ) return FALSE;
  2281. WORD* pwdDst;
  2282. pwdDst = (WORD*)ddsd.lpSurface;
  2283. INT nWidthStart = 0;
  2284. INT nWidthEnd = 0;
  2285. INT nCurrWidth  = 0;
  2286. INT nCntCopyWord = 0;
  2287. INT nYCnt =0;
  2288. INT nLastWidth = 0;
  2289. BYTE bRedDst, bGreenDst, bBlueDst;
  2290. BYTE bRedSrc, bGreenSrc, bBlueSrc;
  2291. BYTE bRedWantedColor, bGreenWantedColor, bBlueWantedColor;
  2292. WORD wPixel;
  2293. FLOAT rBlueRate, rGreenRate, bRedRate;
  2294. // y绵 努府俏.
  2295.    for ( nYCnt=0 ; nYCnt < rc.top ; nYCnt++ )
  2296. {
  2297. nWidthEnd += pwSrc[nWidthStart];
  2298. nWidthStart++;
  2299. nWidthEnd++;
  2300. nWidthStart = nWidthEnd;
  2301. }
  2302. // y绵俊 措秦辑 角力肺 风俏矫懦 Count父阑 沥茄促.
  2303. for ( nYCnt=rc.top ; nYCnt < rc.bottom ; nYCnt++ )
  2304. {
  2305. // 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
  2306. nWidthEnd += pwSrc[nWidthStart];
  2307. nWidthStart++;
  2308. // 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
  2309. for ( INT x = nWidthStart; x < nWidthEnd ; )
  2310. {
  2311. if ( pwSrc[x] == 0xC0 )
  2312. {
  2313. x++;
  2314. nCntCopyWord = pwSrc[x];
  2315. x++;
  2316. nCurrWidth += nCntCopyWord;
  2317. }
  2318. else if ( pwSrc[x] == 0xC1 )
  2319. {
  2320. x++;
  2321. nCntCopyWord = pwSrc[x];
  2322. x++;
  2323. nLastWidth = nCurrWidth;
  2324. nCurrWidth += nCntCopyWord;
  2325. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  2326. {
  2327. x += nCntCopyWord;
  2328. }
  2329. else
  2330. {
  2331. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  2332. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  2333. {
  2334. x += (rc.left-nLastWidth);
  2335. for ( INT nCheck = 0; nCheck < nCurrWidth-rc.left; nCheck++ )
  2336. {
  2337. wPixel    = pwSrc[x+nCheck];
  2338. bBlueSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2339. bGreenSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2340. bRedSrc    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2341. wPixel    = pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (rc.left+nX+nCheck)];
  2342. bBlueDst   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2343. bGreenDst  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2344. bRedDst    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2345. bBlueDst   = (BYTE)((bOpa*(bBlueDst -bBlueSrc )+100*bBlueSrc  ) / 100);
  2346. bGreenDst  = (BYTE)((bOpa*(bGreenDst-bGreenSrc)+100*bGreenSrc ) / 100);
  2347. bRedDst    = (BYTE)((bOpa*(bRedDst  -bRedSrc  )+100*bRedSrc   ) / 100);
  2348. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (rc.left+nX+nCheck)] = ((bRedDst  <<m_stBitsMaskInfo.bRShift) |
  2349.    (bGreenDst<<m_stBitsMaskInfo.bGShift) |
  2350.    (bBlueDst <<m_stBitsMaskInfo.bBShift));
  2351. }
  2352. x += (nCurrWidth-rc.left);
  2353. }
  2354. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  2355. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  2356. {
  2357. for ( INT nCheck = 0; nCheck < rc.right-nLastWidth; nCheck++ )
  2358. {
  2359. wPixel    = pwSrc[x+nCheck];
  2360. bBlueSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2361. bGreenSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2362. bRedSrc    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2363. wPixel    = pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)];
  2364. bBlueDst   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2365. bGreenDst  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2366. bRedDst    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2367. bBlueDst   = (BYTE)((bOpa*(bBlueDst -bBlueSrc )+100*bBlueSrc  ) / 100);
  2368. bGreenDst  = (BYTE)((bOpa*(bGreenDst-bGreenSrc)+100*bGreenSrc ) / 100);
  2369. bRedDst    = (BYTE)((bOpa*(bRedDst  -bRedSrc  )+100*bRedSrc   ) / 100);
  2370. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedDst  <<m_stBitsMaskInfo.bRShift) |
  2371.       (bGreenDst<<m_stBitsMaskInfo.bGShift) |
  2372.   (bBlueDst <<m_stBitsMaskInfo.bBShift));
  2373. }
  2374. x += nCntCopyWord;
  2375. }
  2376. else
  2377. {
  2378. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  2379. {
  2380. wPixel    = pwSrc[x+nCheck];
  2381. bBlueSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2382. bGreenSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2383. bRedSrc    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2384. wPixel    = pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)];
  2385. bBlueDst   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2386. bGreenDst  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2387. bRedDst    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2388. bBlueDst   = (BYTE)((bOpa*(bBlueDst -bBlueSrc )+100*bBlueSrc  ) / 100);
  2389. bGreenDst  = (BYTE)((bOpa*(bGreenDst-bGreenSrc)+100*bGreenSrc ) / 100);
  2390. bRedDst    = (BYTE)((bOpa*(bRedDst  -bRedSrc  )+100*bRedSrc   ) / 100);
  2391. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedDst  <<m_stBitsMaskInfo.bRShift) |
  2392.       (bGreenDst<<m_stBitsMaskInfo.bGShift) |
  2393.   (bBlueDst <<m_stBitsMaskInfo.bBShift));
  2394. }
  2395. x += nCntCopyWord;
  2396. }
  2397. }
  2398. }
  2399. else if ( pwSrc[x] == 0xC2 || pwSrc[x] == 0xC3 )
  2400. {
  2401. wDyingKind = pwSrc[x];
  2402. switch ( wDyingKind )
  2403. {
  2404. case 0xC2: 
  2405. wChooseColor = wChooseColor1;
  2406. break;
  2407. case 0xC3: 
  2408. wChooseColor = wChooseColor2;
  2409. break;
  2410. }
  2411. x++;
  2412. nCntCopyWord = pwSrc[x];
  2413. x++;
  2414. nLastWidth = nCurrWidth;
  2415. nCurrWidth += nCntCopyWord;
  2416. if ( rc.left > nCurrWidth || rc.right < nLastWidth )
  2417. {
  2418. x += nCntCopyWord;
  2419. }
  2420. else
  2421. {
  2422. // rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  2423. if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
  2424. {
  2425. x += (rc.left-nLastWidth);
  2426. for ( INT nCheck = 0; nCheck < nCurrWidth-rc.left; nCheck++ )
  2427. {
  2428. wPixel   = wChooseColor;
  2429. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2430. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2431. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2432. wPixel   = pwSrc[x+nCheck];
  2433. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2434. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2435. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2436. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  2437. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  2438. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  2439. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  2440. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  2441. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  2442. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  2443. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  2444. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  2445. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  2446. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  2447. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  2448. wPixel  = pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (rc.left+nX+nCheck)];
  2449. bBlueDst   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2450. bGreenDst  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2451. bRedDst    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2452. bBlueDst   = (BYTE)((bOpa*(bBlueDst -bBlueWantedColor )+100*bBlueWantedColor ) / 100);
  2453. bGreenDst  = (BYTE)((bOpa*(bGreenDst-bGreenWantedColor)+100*bGreenWantedColor) / 100);
  2454. bRedDst    = (BYTE)((bOpa*(bRedDst  -bRedWantedColor  )+100*bRedWantedColor  ) / 100);
  2455. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (rc.left+nX+nCheck)] = ((bRedDst  <<m_stBitsMaskInfo.bRShift) |
  2456.    (bGreenDst<<m_stBitsMaskInfo.bGShift) |
  2457.    (bBlueDst <<m_stBitsMaskInfo.bBShift));
  2458. }
  2459. x += (nCurrWidth-rc.left);
  2460. }
  2461. // rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
  2462. else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
  2463. {
  2464. for ( INT nCheck = 0; nCheck < rc.right-nLastWidth; nCheck++ )
  2465. {
  2466. wPixel   = wChooseColor;
  2467. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2468. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2469. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2470. wPixel   = pwSrc[x+nCheck];
  2471. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2472. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2473. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2474. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  2475. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  2476. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  2477. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  2478. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  2479. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  2480. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  2481. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  2482. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  2483. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  2484. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  2485. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  2486. wPixel  = pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)];
  2487. bBlueDst   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2488. bGreenDst  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2489. bRedDst    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2490. bBlueDst   = (BYTE)((bOpa*(bBlueDst -bBlueWantedColor )+100*bBlueWantedColor ) / 100);
  2491. bGreenDst  = (BYTE)((bOpa*(bGreenDst-bGreenWantedColor)+100*bGreenWantedColor) / 100);
  2492. bRedDst    = (BYTE)((bOpa*(bRedDst  -bRedWantedColor  )+100*bRedWantedColor  ) / 100);
  2493. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedDst  <<m_stBitsMaskInfo.bRShift) |
  2494.       (bGreenDst<<m_stBitsMaskInfo.bGShift) |
  2495.   (bBlueDst <<m_stBitsMaskInfo.bBShift));
  2496. }
  2497. x += nCntCopyWord;
  2498. }
  2499. else
  2500. {
  2501. for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
  2502. {
  2503. wPixel   = wChooseColor;
  2504. bBlueWantedColor  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2505. bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2506. bRedWantedColor   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2507. wPixel   = pwSrc[x+nCheck];
  2508. bBlueSrc  = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2509. bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2510. bRedSrc   = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2511. rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
  2512. rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
  2513. bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
  2514. bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
  2515. bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
  2516. bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
  2517. if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
  2518. bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
  2519. if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
  2520. bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
  2521. if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
  2522. bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
  2523. wPixel  = pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)];
  2524. bBlueDst   = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
  2525. bGreenDst  = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
  2526. bRedDst    = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
  2527. bBlueDst   = (BYTE)((bOpa*(bBlueDst -bBlueWantedColor )+100*bBlueWantedColor ) / 100);
  2528. bGreenDst  = (BYTE)((bOpa*(bGreenDst-bGreenWantedColor)+100*bGreenWantedColor) / 100);
  2529. bRedDst    = (BYTE)((bOpa*(bRedDst  -bRedWantedColor  )+100*bRedWantedColor  ) / 100);
  2530. pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedDst  <<m_stBitsMaskInfo.bRShift) |
  2531.       (bGreenDst<<m_stBitsMaskInfo.bGShift) |
  2532.   (bBlueDst <<m_stBitsMaskInfo.bBShift));
  2533. }
  2534. x += nCntCopyWord;
  2535. }
  2536. }
  2537. }
  2538. }
  2539. // 扼牢狼 场阑 促澜 扼牢狼 矫累栏肺 颗败霖促.
  2540. nWidthEnd++;