cSurface.cpp
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:5k
源码类别:

游戏

开发平台:

Visual C++

  1. // CMAIN LIB - APPLICATION AND DIRECT WRAPPER
  2. //
  3. // Written by Mauricio Teichmann Ritter
  4. //
  5. // Copyright (C) 2002, Brazil. All rights reserved.
  6. // 
  7. //
  8. // cSurface.cpp: implementation of the cSurface class.
  9. //
  10. //////////////////////////////////////////////////////////////////////
  11. #include "stdafx.h"
  12. #include "cSurface.h"
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. cSurface::cSurface()
  17. {
  18. m_pSurface = NULL;
  19. m_ColorKey = -1;
  20. }
  21. cSurface::cSurface(HINSTANCE hInst, UINT nResource, int nWidth, int nHeight, COLORREF dwColorKey)
  22. {
  23. m_pSurface = NULL;
  24. m_ColorKey = -1;
  25. Create(nWidth, nHeight, dwColorKey);
  26. this->LoadBitmap(hInst, nResource);
  27. }
  28. cSurface::~cSurface()
  29. {
  30. if(m_pSurface != NULL)
  31. {
  32. OutputDebugString("Surface Destroyedn");
  33. m_pSurface->Release();
  34. m_pSurface = NULL;
  35. }
  36. }
  37. BOOL cSurface::LoadBitmap(HINSTANCE hInst, UINT nRes, int nX, int nY, int nWidth, int nHeight)
  38. {
  39.     HDC                     hdcImage;
  40.     HDC                     hdc;
  41.     BITMAP                  bm;
  42.     DDSURFACEDESC2          ddsd;
  43.     HRESULT                 hr;
  44. HBITMAP hbm;
  45. hbm = (HBITMAP) LoadImage(hInst, MAKEINTRESOURCE(nRes), IMAGE_BITMAP, nWidth, nHeight, 0L);
  46.     if (hbm == NULL || m_pSurface == NULL)
  47.         return FALSE;
  48.     // Make sure this surface is restored.
  49.     m_pSurface->Restore();
  50.     // Select bitmap into a memoryDC so we can use it.
  51.     hdcImage = CreateCompatibleDC(NULL);
  52.     if (!hdcImage)
  53.         return FALSE;
  54.     SelectObject(hdcImage, hbm);
  55.     // Get size of the bitmap
  56.     GetObject(hbm, sizeof(bm), &bm);
  57. if(nWidth == 0)
  58. nWidth = bm.bmWidth;
  59. if(nHeight == 0)
  60. nHeight = bm.bmHeight;
  61.     
  62.     // Get size of surface.
  63.     ddsd.dwSize = sizeof(ddsd);
  64.     ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
  65.     m_pSurface->GetSurfaceDesc(&ddsd);
  66.     if ((hr = m_pSurface->GetDC(&hdc)) == DD_OK)
  67.     {
  68.         /*StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, nX, nY,
  69.                    nWidth, nHeight, SRCCOPY);*/
  70.         BitBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, 0, 0,
  71.                     SRCCOPY);
  72.         m_pSurface->ReleaseDC(hdc);
  73.     }
  74.     DeleteDC(hdcImage);
  75. m_srcInfo.m_hInstance = hInst;
  76. m_srcInfo.m_nResource = nRes;
  77. m_srcInfo.m_iX   = nX;
  78. m_srcInfo.m_iY   = nY;
  79. m_srcInfo.m_iWidth    = nWidth;
  80. m_srcInfo.m_iHeight   = nHeight;
  81. return TRUE;
  82. }
  83. BOOL cSurface::Create(int nWidth, int nHeight, COLORREF dwColorKey)
  84. {
  85. Destroy();
  86.     DDSURFACEDESC2 ddsd;
  87. HRESULT hRet;
  88.     DDCOLORKEY          ddck;
  89. m_ColorKey = dwColorKey;
  90.     ZeroMemory( &ddsd, sizeof( ddsd ) );
  91.     ddsd.dwSize = sizeof( DDSURFACEDESC2 );
  92. ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
  93.     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
  94. ddsd.dwWidth  = (DWORD) nWidth;
  95.     ddsd.dwHeight = (DWORD) nHeight;
  96.     hRet = GetMainApp()->GetDirectDraw()->CreateSurface(&ddsd, &m_pSurface, NULL );
  97.     if( hRet != DD_OK )
  98. {
  99. #ifdef _DEBUG
  100. Log("Surface: %d - %s - Height: %d, Width: %dn", hRet, DXGetErrorString8(hRet), nHeight, nWidth);
  101. #endif
  102. //if(hRet == DDERR_OUTOFVIDEOMEMORY)
  103. //{
  104. DXTRACE_MSG("Not enought memory");
  105. ZeroMemory( &ddsd, sizeof( ddsd ) );
  106. ddsd.dwSize = sizeof( ddsd );
  107. ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
  108. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  109.   DDSCAPS_SYSTEMMEMORY;
  110. m_pSurface = NULL;
  111. hRet = GetMainApp()->GetDirectDraw()->CreateSurface(&ddsd, &m_pSurface, NULL );
  112. //}
  113. if( hRet != DD_OK )
  114. {
  115. DXTRACE_MSG("DirectDraw Surface Creation Failed");
  116. #ifdef _DEBUG
  117. Log("Surface: %d - %sn", hRet, DXGetErrorString8(hRet));
  118. #endif
  119. return FALSE;
  120. }
  121. }
  122. if((int)dwColorKey != -1)
  123. {
  124. ddck.dwColorSpaceLowValue = dwColorKey;
  125. ddck.dwColorSpaceHighValue = 0;
  126. m_pSurface->SetColorKey(DDCKEY_SRCBLT, &ddck);
  127. }
  128. m_Width  = nWidth;
  129. m_Height = nHeight;
  130. return TRUE;
  131. }
  132. BOOL cSurface::Draw(LPDIRECTDRAWSURFACE7 lpDest, int iDestX, int iDestY, int iSrcX, int iSrcY, int nWidth, int nHeight)
  133. {
  134. RECT rcRect;
  135. HRESULT hRet;
  136. if(nWidth == 0)
  137. nWidth = m_Width;
  138. if(nHeight == 0)
  139. nHeight = m_Height;
  140. rcRect.left   = iSrcX;
  141. rcRect.top    = iSrcY;
  142. rcRect.right  = nWidth  + iSrcX;
  143. rcRect.bottom = nHeight + iSrcY;
  144. while(1)
  145. {
  146. if((int)m_ColorKey < 0)
  147. {
  148. hRet = lpDest->BltFast(iDestX, iDestY, m_pSurface, &rcRect,  DDBLTFAST_NOCOLORKEY);
  149. }
  150. else
  151. {
  152. hRet = lpDest->BltFast(iDestX, iDestY, m_pSurface, &rcRect,  DDBLTFAST_SRCCOLORKEY);
  153. }
  154. if(hRet == DD_OK)
  155. break;
  156. if(hRet == DDERR_SURFACELOST)
  157. {
  158. Restore();
  159. }
  160. else
  161. {
  162. if(hRet != DDERR_WASSTILLDRAWING)
  163. return FALSE;
  164. }
  165. }
  166. return TRUE;
  167. }
  168. void cSurface::Destroy()
  169. {
  170. if(m_pSurface != NULL)
  171. {
  172. m_pSurface->Release();
  173. m_pSurface = NULL;
  174. }
  175. }
  176. UINT cSurface::Height()
  177. {
  178. return m_Height;
  179. }
  180. UINT cSurface::Width()
  181. {
  182. return m_Width;
  183. }
  184. LPDIRECTDRAWSURFACE7 cSurface::GetSurface()
  185. {
  186. return m_pSurface;
  187. }
  188. void cSurface::Restore()
  189. {
  190. m_pSurface->Restore();
  191. }