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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: wingapiblt.cpp,v 1.2.4.1 2004/07/09 01:59:24 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 "wingapiblt.h"
  53. CGAPIBlt::CGAPIBlt()
  54.  :  CWinBlt()
  55.  ,  m_bxdp(NULL)
  56.  ,  m_pMemory(NULL)
  57. {
  58.     memset(&m_gxdp,0,sizeof(m_gxdp));
  59. }
  60. CGAPIBlt::~CGAPIBlt()
  61. {
  62.     DestroySurface(0);
  63. }
  64. //----------------------------------------------
  65. // determine if the gapi interface works on this device
  66. // and whether we can use it
  67. BOOL CGAPIBlt::CanCreateSurface()
  68. {
  69.     if (!GXOpenDisplay(NULL, NULL))
  70. return false;
  71.     // Get the Display properties
  72.     m_gxdp = GXGetDisplayProperties();
  73.     GXCloseDisplay();
  74.     if (m_gxdp.cBPP != 16 || m_gxdp.cbxPitch != 2)
  75. return false;
  76.     return true;
  77. }
  78. HX_RESULT CGAPIBlt::CreateSurface(int cidIn, int& cidOut,
  79.                                 int nWidth, int nHeight,
  80.                                 int nFlags, HWND hWnd,
  81.                                 int nCountIn, int& nCountOut)
  82. {
  83.     HRESULT hr = HXR_OK;
  84.     m_hWnd = hWnd;
  85.     if (!m_bxdp)
  86.     {
  87. //if (GXOpenDisplay(hWnd, GX_FULLSCREEN))
  88. if (GXOpenDisplay(NULL, NULL))
  89. {
  90.     // Initialize the Hardware Buttons
  91.     GXOpenInput();
  92.     // Get the Display properties
  93.     m_gxdp = GXGetDisplayProperties();
  94.     if (m_gxdp.cBPP == 16 /*|| m_gxdp.cBPP == 8*/)
  95.     {
  96. m_nCID = CID_UNKNOWN;
  97. if (m_gxdp.ffFormat & kfDirect555)
  98.     m_nCID = CID_RGB555;
  99. if (m_gxdp.ffFormat & kfDirect565)
  100.     m_nCID = CID_RGB565;
  101. //if (m_gxdp.cBPP == 8)
  102. //    m_nCID = CID_RGB8;
  103. if (m_nCID == CID_UNKNOWN)
  104. {
  105.     hr = HXR_FAIL;
  106. }
  107. else
  108. {
  109.     m_nMemoryYPitch = nWidth * m_gxdp.cbxPitch;
  110.     int len = m_nMemoryYPitch*nHeight;
  111.     m_pMemory = (UCHAR *) malloc(len);
  112.     if (NULL == m_pMemory)
  113. hr = HXR_FAIL;
  114.     else
  115.      m_bxdp = true;
  116. }
  117.     }
  118.     else
  119.     {
  120. hr = HXR_FAIL;
  121.     }
  122. }
  123. else
  124. {
  125.     hr = HXR_FAIL;
  126. }
  127.     }
  128.     return hr;
  129. }
  130. HX_RESULT CGAPIBlt::LockSurface(UCHAR** ppDestPtr,
  131.                               LONG32* pnDestPitch,
  132.                               int& cid,
  133.                               REF(HXxSize) dstSize,
  134.                               int nIndex)
  135. {
  136. //    *ppDestPtr = (UCHAR *) GXBeginDraw();
  137.     *ppDestPtr = m_pMemory;
  138.     *pnDestPitch = m_nMemoryYPitch;
  139.     if (m_pMemory)
  140. return HXR_OK;
  141.     else
  142. return HXR_FAIL;
  143. }
  144. //-----------------------------------------------------------
  145. HX_RESULT CGAPIBlt::FillSurface(int cidIn,
  146.                               UCHAR* pSrcBuffer,
  147.                               HXxSize* pSrcSize,
  148.                               HXxRect* prSrcRect,
  149.                               UCHAR* pDstBuffer,
  150.                               LONG32 nDstPitch,
  151.                               HXxRect* prDestRect)
  152. {
  153.     return HXR_FAIL;
  154. }
  155. //-----------------------------------------------------
  156. HX_RESULT CGAPIBlt::UnlockSurface(UCHAR* pSurfPtr, int nIndex)
  157. {
  158. //    GXEndDraw();
  159.     if (m_pMemory)
  160.         return HXR_OK;
  161.     else
  162. return HXR_FAIL;
  163. }
  164. //----------------------------------------------------------
  165. HX_RESULT CGAPIBlt::RenderSurface(HXxSize* pSrcSize,
  166.                                 HXxRect* prSrcRect,
  167.                                 HXxRect* prDestRect,
  168.                                 int nIndex)
  169. {
  170.     int nLeft=0,nTop=0; // number of off screen pixels/lines
  171.     if (NULL == m_pMemory)
  172. return HXR_FAIL;
  173.     // Map to screen coordinates
  174.     POINT   po = {0,0};
  175.     ClientToScreen(m_hWnd, &po);
  176.     if (po.x < 0)
  177.     {
  178. nLeft = abs(po.x);
  179. po.x = 0;
  180.     }
  181.     if (po.y < 0)
  182.     {
  183. nTop = abs(po.y);
  184. po.y = 0;
  185.     }
  186.     RECT rc;
  187.     GetClientRect(m_hWnd, &rc);
  188.     POINT pul = {rc.left,rc.top};
  189.     ClientToScreen(m_hWnd,&pul);
  190.     if (pul.x >= GetSystemMetrics(SM_CXSCREEN))
  191. return HXR_OK;// left is off screen to right
  192.     if (pul.y >= GetSystemMetrics(SM_CYSCREEN))
  193. return HXR_OK;// top is off screen to bottom
  194.     // width of image, width of window
  195.     int nWidth = min(rc.right,pSrcSize->cx-nLeft);
  196.     if ((po.x+nWidth) > GetSystemMetrics(SM_CXSCREEN))
  197. nWidth = GetSystemMetrics(SM_CXSCREEN)-po.x;
  198.     if (nWidth <= 0)
  199. return HXR_OK;
  200.     // height of image, height of window
  201.     int nHeight = min(rc.bottom,pSrcSize->cy-nTop);
  202.     if ((po.y+nHeight) > GetSystemMetrics(SM_CYSCREEN))
  203. nHeight = GetSystemMetrics(SM_CYSCREEN)-po.y;
  204.     if (nHeight <= 0)
  205. return HXR_OK;
  206.     unsigned short *dptr = (unsigned short *) GXBeginDraw();
  207.     unsigned short *sptr = (unsigned short *) m_pMemory;
  208.     if (NULL == dptr)
  209.     {
  210. GXEndDraw();
  211. return HXR_FAIL;
  212.     }
  213.     unsigned short * puDst;
  214.     unsigned short * puSrc;
  215.     for (int y = 0; y < nHeight; y++) // for each line
  216.     {
  217. puDst = dptr + (y+po.y)*m_gxdp.cbyPitch/2 + po.x;
  218. puSrc = sptr + (y+nTop)*m_nMemoryYPitch/2 + nLeft;
  219. memcpy(puDst,puSrc,2*nWidth);
  220.     }
  221.     GXEndDraw();
  222.     return HXR_OK;
  223. }
  224. //-------------------------------------------------------
  225. HX_RESULT CGAPIBlt::DestroySurface(int cid)
  226. {
  227.     if (m_pMemory)
  228. free(m_pMemory);
  229.     m_pMemory = NULL;
  230.     GXCloseDisplay();
  231.     GXCloseInput();
  232.     return HXR_OK;
  233. }