ddblt.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:12k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: ddblt.cpp,v 1.3.34.2 2004/07/09 01:59:19 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "hxcom.h"
  50. #include "hxtypes.h"
  51. #include "hxwintyp.h"
  52. #include "ddblt.h"
  53. #ifdef __cplusplus
  54. extern "C"
  55. #endif
  56. #if 0
  57. static void MovePlain(
  58.     UCHAR *srcPtr, int srcPitch, UCHAR *destPtr, int destPitch,
  59.     int plainWidth, int plainHeight)
  60. {
  61.     register int i;
  62.     for (i = 0; i < plainHeight; i ++)
  63.     {
  64.         /* must be done using MMX movqs,
  65.          * but this is a simple test app, not a production code: */
  66.         memcpy(destPtr, srcPtr, plainWidth); /* Flawfinder: ignore */
  67.         srcPtr += srcPitch;
  68.         destPtr += destPitch;
  69.     }
  70. }
  71. #endif //0
  72. CDDBlt::CDDBlt()
  73.  :  CWinBlt()
  74.  ,  m_pDD(NULL)
  75.  ,  m_pPrimary(NULL)
  76.  ,  m_pOffscreen(NULL)
  77. {
  78. }
  79. CDDBlt::~CDDBlt()
  80. {
  81.     DestroySurface(0);
  82. }
  83. HX_RESULT CDDBlt::CreateSurface(int cidIn, int& cidOut,
  84.                                 int nWidth, int nHeight,
  85.                                 int nFlags, HWND hWnd,
  86.                                 int nCountIn, int& nCountOut)
  87. {
  88.     HRESULT hr;
  89.     if (!m_pDD)
  90.     {
  91.         hr = DirectDrawCreate(NULL, &m_pDD, NULL);
  92.         if (hr)
  93. return HXR_FAIL;
  94.     }
  95.     IDirectDraw2 *pDD2 = NULL;
  96.     hr = m_pDD->QueryInterface(IID_IDirectDraw2, (void **)&pDD2);
  97.     if (!pDD2)
  98.     {
  99. HX_RELEASE(m_pDD);
  100. return HXR_FAIL;
  101.     }
  102.     m_hWnd = hWnd;
  103.     hr = pDD2->SetCooperativeLevel(hWnd, DDSCL_NORMAL);
  104. if (hr)
  105. {
  106.     HX_RELEASE(pDD2);
  107. return HXR_FAIL;
  108. }
  109.     if (!m_pPrimary)
  110.     {
  111. // Create primary surface
  112. DDSURFACEDESC ddsd;
  113. ZeroMemory(&ddsd, sizeof(ddsd));
  114. ddsd.dwSize = sizeof(ddsd);
  115. ddsd.dwFlags = DDSD_CAPS;
  116. ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
  117. hr = pDD2->CreateSurface (&ddsd, &m_pPrimary, NULL);
  118. if (!m_pPrimary || hr != DD_OK)
  119. {
  120.     HX_RELEASE(m_pDD);
  121.     HX_RELEASE(pDD2);
  122.     return HXR_FAIL;
  123. }
  124. IDirectDrawClipper *pDDclip;
  125. if (DD_OK == pDD2->CreateClipper(0, &pDDclip, NULL))
  126. {
  127.     pDDclip->SetHWnd(0, m_hWnd);
  128.     m_pPrimary->SetClipper(pDDclip);
  129.     HX_RELEASE(pDDclip);
  130. }
  131.     }
  132.     // Create offscreen surface
  133.     DDSURFACEDESC ddsd;
  134.     memset(&ddsd, 0, sizeof(ddsd));
  135.     ddsd.dwSize = sizeof(ddsd);
  136.     ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
  137.     ddsd.dwWidth = nWidth;
  138.     ddsd.dwHeight = nHeight;
  139.     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
  140. #ifndef HELIX_FEATURE_DD_AUTOPIXELFORMAT
  141.     ddsd.dwFlags |= DDSD_PIXELFORMAT;
  142.     ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
  143. #endif  //!HELIX_FEATURE_DD_AUTOPIXELFORMAT
  144.     const int nOutputFormats = 6;
  145.     UINT32 fourCC[nOutputFormats];
  146.     UINT32 bbp[nOutputFormats];
  147.     UINT32 rbm[nOutputFormats];
  148.     UINT32 gbm[nOutputFormats];
  149.     UINT32 bbm[nOutputFormats];
  150.     UINT32 flags[nOutputFormats];
  151.     int    cid[nOutputFormats];
  152.     memset(&rbm, 0, sizeof(rbm));
  153.     memset(&gbm, 0, sizeof(gbm));
  154.     memset(&bbm, 0, sizeof(bbm));
  155.     memset(&flags, 0, sizeof(flags));
  156.     int nOutputTypes = 0;
  157. #if defined (HELIX_FEATURE_CC_I420out)
  158.     fourCC[nOutputTypes] = MAKEFOURCC('I', '4', '2', '0');
  159.     bbp[nOutputTypes] = 12;
  160.     cid[nOutputTypes] = CID_I420;
  161.     flags[nOutputTypes] = DDPF_FOURCC;
  162.     ++nOutputTypes;
  163. #endif //HELIX_FEATURE_CC_I420out
  164. #if defined (HELIX_FEATURE_CC_YV12out)
  165.     fourCC[nOutputTypes] = MAKEFOURCC('Y', 'V', '1', '2');
  166.     bbp[nOutputTypes] = 12;
  167.     cid[nOutputTypes] = CID_YV12;
  168.     flags[nOutputTypes] = DDPF_FOURCC;
  169.     ++nOutputTypes;
  170. #endif //HELIX_FEATURE_CC_YV12out
  171. #if defined (HELIX_FEATURE_CC_YUY2out)
  172.     fourCC[nOutputTypes] = MAKEFOURCC('Y', 'U', 'Y', '2');
  173.     bbp[nOutputTypes] = 16;
  174.     cid[nOutputTypes] = CID_YUY2;
  175.     flags[nOutputTypes] = DDPF_FOURCC;
  176.     ++nOutputTypes;
  177. #endif //HELIX_FEATURE_CC_YUY2out
  178. #if defined (HELIX_FEATURE_CC_UYVYout)
  179.     fourCC[nOutputTypes] = MAKEFOURCC('U', 'Y', 'V', 'Y');
  180.     bbp[nOutputTypes] = 16;
  181.     cid[nOutputTypes] = CID_UYVY;
  182.     flags[nOutputTypes] = DDPF_FOURCC;
  183.     ++nOutputTypes;
  184. #endif //HELIX_FEATURE_CC_UYVYout
  185. #if defined (HELIX_FEATURE_CC_RGB32out)
  186.     fourCC[nOutputTypes] = BI_RGB;
  187.     bbp[nOutputTypes] = 32;
  188.     cid[nOutputTypes] = CID_RGB32;
  189.     rbm[nOutputTypes] = 0xFF0000;
  190.     gbm[nOutputTypes] = 0x00FF00;
  191.     bbm[nOutputTypes] = 0x0000FF;
  192. #if defined (HELIX_FEATURE_DD_AUTOPIXELFORMAT)
  193.     flags[nOutputTypes] = DDPF_RGB|DDPF_ALPHAPREMULT|DDPF_ALPHAPIXELS;
  194. #else
  195. flags[nOutputTypes] = DDPF_RGB;
  196. #endif //HELIX_FEATURE_DD_AUTOPIXELFORMAT
  197.     ++nOutputTypes;
  198. #endif //HELIX_FEATURE_CC_RGB32out
  199. #if defined (HELIX_FEATURE_CC_RGB565out)
  200.     fourCC[nOutputTypes] = BI_RGB;
  201.     bbp[nOutputTypes] = 16;
  202.     cid[nOutputTypes] = CID_RGB565;
  203.     rbm[nOutputTypes] = 0x7C00;
  204.     gbm[nOutputTypes] = 0x03E0;
  205.     bbm[nOutputTypes] = 0x001F;
  206.     flags[nOutputTypes] = DDPF_RGB;
  207.     ++nOutputTypes;
  208. #endif //HELIX_FEATURE_CC_RGB565out
  209.     for (int i=0; i<nOutputTypes; i++)
  210.     {
  211. ddsd.ddpfPixelFormat.dwFourCC       = fourCC[i];
  212.         ddsd.ddpfPixelFormat.dwRGBBitCount  = bbp[i];
  213.         ddsd.ddpfPixelFormat.dwRBitMask     = rbm[i];
  214.         ddsd.ddpfPixelFormat.dwGBitMask     = gbm[i];
  215.         ddsd.ddpfPixelFormat.dwBBitMask     = bbm[i];
  216.         ddsd.ddpfPixelFormat.dwFlags        = flags[i];
  217. #ifdef _DEBUG
  218. HX_TRACE( "CDDBlt::CreateSurface: BEFORE CreateSurface(Offscreen) returned: n");
  219. HX_TRACE( "   CCFormat: 0x%08X n", ddsd.ddpfPixelFormat.dwFourCC );
  220. HX_TRACE( "   RGBBitCount (bbp): %d n", ddsd.ddpfPixelFormat.dwRGBBitCount );
  221. HX_TRACE( "   Flags: 0x%08X n", ddsd.ddpfPixelFormat.dwFlags );
  222. HX_TRACE( "   RBitMask: 0x%08X n", ddsd.ddpfPixelFormat.dwRBitMask );
  223. HX_TRACE( "   GBitMask: 0x%08X n", ddsd.ddpfPixelFormat.dwGBitMask );
  224. HX_TRACE( "   BBitMask: 0x%08X n", ddsd.ddpfPixelFormat.dwBBitMask );
  225. #endif //_DEBUG
  226. hr = pDD2->CreateSurface (&ddsd, &m_pOffscreen, NULL);
  227.         if (DD_OK == hr)
  228.         {
  229.             m_nCID = cid[i];
  230. #ifdef _DEBUG
  231. memset( &(ddsd.ddpfPixelFormat), 0, sizeof(ddsd.ddpfPixelFormat) );
  232.     ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
  233. hr = m_pOffscreen->GetPixelFormat( &(ddsd.ddpfPixelFormat) );
  234. if (FAILED(hr))
  235. {
  236. }
  237. else
  238. {
  239. HX_TRACE( "CDDBlt::CreateSurface: AFTER CreateSurface(Offscreen) returned: n");
  240. HX_TRACE( "   CCFormat: 0x%08X n", ddsd.ddpfPixelFormat.dwFourCC );
  241. HX_TRACE( "   RGBBitCount (bbp): %d n", ddsd.ddpfPixelFormat.dwRGBBitCount );
  242. HX_TRACE( "   Flags: 0x%08X n", ddsd.ddpfPixelFormat.dwFlags );
  243. HX_TRACE( "   RBitMask: 0x%08X n", ddsd.ddpfPixelFormat.dwRBitMask );
  244. HX_TRACE( "   GBitMask: 0x%08X n", ddsd.ddpfPixelFormat.dwGBitMask );
  245. HX_TRACE( "   BBitMask: 0x%08X n", ddsd.ddpfPixelFormat.dwBBitMask );
  246. }
  247. #endif //_DEBUG
  248.             break;
  249.         }
  250.     }
  251.     HX_RELEASE(pDD2);
  252.     // Don't use DirectDraw
  253.     if (!m_pOffscreen)
  254.     {
  255.         HX_RELEASE(m_pPrimary);
  256.         HX_RELEASE(m_pDD);
  257.         return HXR_FAIL;
  258.     }
  259.     return HXR_OK;
  260. }
  261. HX_RESULT CDDBlt::LockSurface(UCHAR** ppDestPtr,
  262.                               LONG32* pnDestPitch,
  263.                               int& cid,
  264.                               REF(HXxSize) dstSize,
  265.                               int nIndex)
  266. {
  267. if (!m_pPrimary || !m_pOffscreen)
  268. return HXR_FAIL;
  269.     DDSURFACEDESC ddsd;
  270.     memset(&ddsd, 0, sizeof(ddsd));
  271.     ddsd.dwSize = sizeof(ddsd);
  272.     HRESULT hr;
  273.     for (int i=0; i<3; i++)
  274.     {
  275. hr = m_pOffscreen->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  276.         if (DDERR_SURFACELOST == hr)
  277. {
  278.     m_pOffscreen->Restore();
  279.     m_pPrimary->Restore();
  280. }
  281. else if (DD_OK == hr)
  282. {
  283.     *ppDestPtr = (UCHAR*)ddsd.lpSurface;
  284.     *pnDestPitch = ddsd.lPitch;
  285.     break;
  286. }
  287. else
  288. {
  289.     return HXR_FAIL;
  290. }
  291.     }
  292.     return HXR_OK;
  293. }
  294. HX_RESULT CDDBlt::FillSurface(int cidIn,
  295.                               UCHAR* pSrcBuffer,
  296.                               HXxSize* pSrcSize,
  297.                               HXxRect* prSrcRect,
  298.                               UCHAR* pDstBuffer,
  299.                               LONG32 nDstPitch,
  300.                               HXxRect* prDestRect)
  301. {
  302. #if 1
  303.     return HXR_FAIL;
  304. #else
  305.     // If input and output are both planar, just copy each plane
  306.     if (CID_YV12 != m_nCID ||
  307.         (cidIn != CID_I420 && cidIn != CID_XING))
  308.         return HXR_FAIL;
  309.     INT32 yPitch = pSrcSize->cx;
  310.     INT32 uvPitch = pSrcSize->cx/2;
  311.     UCHAR *pU = pSrcBuffer + pSrcSize->cy*yPitch;
  312.     UCHAR *pV = pU + pSrcSize->cy/2*uvPitch;
  313.     if (cidIn == CID_XING)
  314.     {
  315.         yPitch = 768;
  316.         uvPitch = 768;
  317.         pU = pSrcBuffer + pSrcSize->cy*yPitch;
  318.         pV = pU + yPitch/2;
  319.     }
  320.     // We only support YV12
  321.     UCHAR *pDestV = pDstBuffer + pSrcSize->cy*nDstPitch;
  322.     UCHAR *pDestU = pDestV + pSrcSize->cy*nDstPitch/4;
  323.     MovePlain(pSrcBuffer, yPitch, pDstBuffer, nDstPitch,
  324.               pSrcSize->cx,pSrcSize->cy);
  325.     MovePlain(pU, uvPitch, pDestU, nDstPitch/2,
  326.               pSrcSize->cx/2,pSrcSize->cy/2);
  327.     MovePlain(pV, uvPitch, pDestV, nDstPitch/2,
  328.               pSrcSize->cx/2,pSrcSize->cy/2);
  329. #endif //1
  330.     return HXR_OK;
  331. }
  332. HX_RESULT CDDBlt::UnlockSurface(UCHAR* pSurfPtr, int nIndex)
  333. {
  334.     m_pOffscreen->Unlock(NULL);
  335.     return HXR_OK;
  336. }
  337. HX_RESULT CDDBlt::RenderSurface(HXxSize* pSrcSize,
  338.                                 HXxRect* prSrcRect,
  339.                                 HXxRect* prDestRect,
  340.                                 int nIndex)
  341. {
  342.     // Map to screen coordinates
  343.     POINT   po = {0,0};
  344.     ClientToScreen(m_hWnd, &po);
  345.     RECT rc;
  346.     GetClientRect(m_hWnd, &rc);
  347.     rc.left += po.x;
  348.     rc.right += po.x;
  349.     rc.top += po.y;
  350.     rc.bottom += po.y;
  351.     DDBLTFX ddbltfx;
  352.     memset(&ddbltfx, 0, sizeof(ddbltfx));
  353.     ddbltfx.dwSize = sizeof(ddbltfx);
  354.     ddbltfx.dwDDFX = DDBLTFX_NOTEARING;
  355.     HRESULT hr = m_pPrimary->Blt(&rc, m_pOffscreen, NULL, DDBLT_WAIT, &ddbltfx);
  356.     if (DD_OK == hr)
  357.         return HXR_OK;
  358.     else
  359.         return HXR_FAIL;
  360. }
  361. HX_RESULT CDDBlt::DestroySurface(int cid)
  362. {
  363.     HX_RELEASE(m_pPrimary);
  364.     HX_RELEASE(m_pOffscreen);
  365.     HX_RELEASE(m_pDD);
  366.     return HXR_OK;
  367. }