wingapiblt.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:7k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxcom.h"
  36. #include "hxtypes.h"
  37. #include "hxwintyp.h"
  38. #include "wingapiblt.h"
  39. CGAPIBlt::CGAPIBlt()
  40.  :  CWinBlt()
  41.  ,  m_bxdp(NULL)
  42.  ,  m_pMemory(NULL)
  43. {
  44.     memset(&m_gxdp,0,sizeof(m_gxdp));
  45. }
  46. CGAPIBlt::~CGAPIBlt()
  47. {
  48.     DestroySurface(0);
  49. }
  50. //----------------------------------------------
  51. // determine if the gapi interface works on this device
  52. // and whether we can use it
  53. BOOL CGAPIBlt::CanCreateSurface()
  54. {
  55.     if (!GXOpenDisplay(NULL, NULL))
  56. return false;
  57.     // Get the Display properties
  58.     m_gxdp = GXGetDisplayProperties();
  59.     GXCloseDisplay();
  60.     if (m_gxdp.cBPP != 16 || m_gxdp.cbxPitch != 2)
  61. return false;
  62.     return true;
  63. }
  64. HX_RESULT CGAPIBlt::CreateSurface(int cidIn, int& cidOut,
  65.                                 int nWidth, int nHeight,
  66.                                 int nFlags, HWND hWnd,
  67.                                 int nCountIn, int& nCountOut)
  68. {
  69.     HRESULT hr = HXR_OK;
  70.     m_hWnd = hWnd;
  71.     if (!m_bxdp)
  72.     {
  73. //if (GXOpenDisplay(hWnd, GX_FULLSCREEN))
  74. if (GXOpenDisplay(NULL, NULL))
  75. {
  76.     // Initialize the Hardware Buttons
  77.     GXOpenInput();
  78.     // Get the Display properties
  79.     m_gxdp = GXGetDisplayProperties();
  80.     if (m_gxdp.cBPP == 16 /*|| m_gxdp.cBPP == 8*/)
  81.     {
  82. m_nCID = CID_UNKNOWN;
  83. if (m_gxdp.ffFormat & kfDirect555)
  84.     m_nCID = CID_RGB555;
  85. if (m_gxdp.ffFormat & kfDirect565)
  86.     m_nCID = CID_RGB565;
  87. //if (m_gxdp.cBPP == 8)
  88. //    m_nCID = CID_RGB8;
  89. if (m_nCID == CID_UNKNOWN)
  90. {
  91.     hr = HXR_FAIL;
  92. }
  93. else
  94. {
  95.     m_nMemoryYPitch = nWidth * m_gxdp.cbxPitch;
  96.     int len = m_nMemoryYPitch*nHeight;
  97.     m_pMemory = (UCHAR *) malloc(len);
  98.     if (NULL == m_pMemory)
  99. hr = HXR_FAIL;
  100.     else
  101.      m_bxdp = true;
  102. }
  103.     }
  104.     else
  105.     {
  106. hr = HXR_FAIL;
  107.     }
  108. }
  109. else
  110. {
  111.     hr = HXR_FAIL;
  112. }
  113.     }
  114.     return hr;
  115. }
  116. HX_RESULT CGAPIBlt::LockSurface(UCHAR** ppDestPtr,
  117.                               LONG32* pnDestPitch,
  118.                               int& cid,
  119.                               REF(HXxSize) dstSize,
  120.                               int nIndex)
  121. {
  122. //    *ppDestPtr = (UCHAR *) GXBeginDraw();
  123.     *ppDestPtr = m_pMemory;
  124.     *pnDestPitch = m_nMemoryYPitch;
  125.     if (m_pMemory)
  126. return HXR_OK;
  127.     else
  128. return HXR_FAIL;
  129. }
  130. //-----------------------------------------------------------
  131. HX_RESULT CGAPIBlt::FillSurface(int cidIn,
  132.                               UCHAR* pSrcBuffer,
  133.                               HXxSize* pSrcSize,
  134.                               HXxRect* prSrcRect,
  135.                               UCHAR* pDstBuffer,
  136.                               LONG32 nDstPitch,
  137.                               HXxRect* prDestRect)
  138. {
  139.     return HXR_FAIL;
  140. }
  141. //-----------------------------------------------------
  142. HX_RESULT CGAPIBlt::UnlockSurface(UCHAR* pSurfPtr, int nIndex)
  143. {
  144. //    GXEndDraw();
  145.     if (m_pMemory)
  146.         return HXR_OK;
  147.     else
  148. return HXR_FAIL;
  149. }
  150. //----------------------------------------------------------
  151. HX_RESULT CGAPIBlt::RenderSurface(HXxSize* pSrcSize,
  152.                                 HXxRect* prSrcRect,
  153.                                 HXxRect* prDestRect,
  154.                                 int nIndex)
  155. {
  156.     int nLeft=0,nTop=0; // number of off screen pixels/lines
  157.     if (NULL == m_pMemory)
  158. return HXR_FAIL;
  159.     // Map to screen coordinates
  160.     POINT   po = {0,0};
  161.     ClientToScreen(m_hWnd, &po);
  162.     if (po.x < 0)
  163.     {
  164. nLeft = abs(po.x);
  165. po.x = 0;
  166.     }
  167.     if (po.y < 0)
  168.     {
  169. nTop = abs(po.y);
  170. po.y = 0;
  171.     }
  172.     RECT rc;
  173.     GetClientRect(m_hWnd, &rc);
  174.     POINT pul = {rc.left,rc.top};
  175.     ClientToScreen(m_hWnd,&pul);
  176.     if (pul.x >= GetSystemMetrics(SM_CXSCREEN))
  177. return HXR_OK;// left is off screen to right
  178.     if (pul.y >= GetSystemMetrics(SM_CYSCREEN))
  179. return HXR_OK;// top is off screen to bottom
  180.     // width of image, width of window
  181.     int nWidth = min(rc.right,pSrcSize->cx-nLeft);
  182.     if ((po.x+nWidth) > GetSystemMetrics(SM_CXSCREEN))
  183. nWidth = GetSystemMetrics(SM_CXSCREEN)-po.x;
  184.     if (nWidth <= 0)
  185. return HXR_OK;
  186.     // height of image, height of window
  187.     int nHeight = min(rc.bottom,pSrcSize->cy-nTop);
  188.     if ((po.y+nHeight) > GetSystemMetrics(SM_CYSCREEN))
  189. nHeight = GetSystemMetrics(SM_CYSCREEN)-po.y;
  190.     if (nHeight <= 0)
  191. return HXR_OK;
  192.     unsigned short *dptr = (unsigned short *) GXBeginDraw();
  193.     unsigned short *sptr = (unsigned short *) m_pMemory;
  194.     if (NULL == dptr)
  195.     {
  196. GXEndDraw();
  197. return HXR_FAIL;
  198.     }
  199.     unsigned short * puDst;
  200.     unsigned short * puSrc;
  201.     for (int y = 0; y < nHeight; y++) // for each line
  202.     {
  203. puDst = dptr + (y+po.y)*m_gxdp.cbyPitch/2 + po.x;
  204. puSrc = sptr + (y+nTop)*m_nMemoryYPitch/2 + nLeft;
  205. memcpy(puDst,puSrc,2*nWidth);
  206.     }
  207.     GXEndDraw();
  208.     return HXR_OK;
  209. }
  210. //-------------------------------------------------------
  211. HX_RESULT CGAPIBlt::DestroySurface(int cid)
  212. {
  213.     if (m_pMemory)
  214. free(m_pMemory);
  215.     m_pMemory = NULL;
  216.     GXCloseDisplay();
  217.     GXCloseInput();
  218.     return HXR_OK;
  219. }