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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: gdiblt.cpp,v 1.6.20.1 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. #ifndef _WINCE
  53. #include <ddraw.h>
  54. #endif
  55. #include "colormap.h"
  56. #if defined (HELIX_FEATURE_CC_RGB8out)
  57. #include "colorlib.h"
  58. #endif
  59. #include "gdiblt.h"
  60. CGDIBlt::CGDIBlt()
  61.  :  CWinBlt()
  62.  ,  m_pGdiSurface(NULL)
  63. #if defined (HELIX_FEATURE_CC_RGB8out)
  64.  ,  m_nSystemColors(0)
  65. #endif
  66. {
  67.     memset(&m_gdiInfo, 0, sizeof(m_gdiInfo));
  68. }
  69. CGDIBlt::~CGDIBlt()
  70. {
  71.     DestroySurface(0);
  72. }
  73. HX_RESULT CGDIBlt::CreateSurface(int cidIn, int& cidOut,
  74.                                  int nWidth, int nHeight,
  75.                                  int nFlags, HWND hWnd,
  76.                                  int nCountIn, int& nCountOut)
  77. {
  78.     HANDLE      hMapping;       // handle to mapped object
  79.     HBITMAP     hBitmap;        // DIB section bitmap handle
  80.     BYTE        *pBase;         // pointer to the actual image
  81.     BITMAPINFO  *pbmi;
  82.     BYTE        *pbmiBuf = NULL;
  83.     int         nSize = sizeof(BITMAPINFO);
  84.     int         nColors = 0;
  85.     void        *pPalette = NULL;
  86.     HX_RESULT   hr = HXR_OK;
  87.     m_hWnd = hWnd;
  88. #if defined (HELIX_FEATURE_CC_RGB32out)
  89.     m_nCID = CID_RGB32;
  90. #elif defined (HELIX_FEATURE_CC_RGB24out)
  91.     m_nCID = CID_RGB24;
  92. #elif defined (HELIX_FEATURE_CC_RGB565out)
  93.     m_nCID = CID_RGB565;
  94.     nSize += 3 * sizeof(ULONG32);
  95. #elif defined (HELIX_FEATURE_CC_RGB555out)
  96.     m_nCID = CID_RGB555;
  97.     nSize += 3 * sizeof(ULONG32);
  98. #elif defined (HELIX_FEATURE_CC_RGB444out)
  99.     m_nCID = CID_RGB444;
  100.     nSize += 3 * sizeof(ULONG32);
  101. #elif defined (HELIX_FEATURE_CC_RGB8out)
  102.     m_nCID = CID_RGB8;
  103.     nColors = 256;
  104.     nSize += nColors * sizeof(PALETTEENTRY);
  105.     // get system palette first
  106.     HDC hDC = GetDC(NULL);
  107.     PALETTEENTRY SystemPalette[256];
  108.     
  109.     if (hDC) 
  110.     {
  111.         m_nSystemColors = GetSystemPaletteEntries (hDC, 0, 256, SystemPalette);
  112.         ReleaseDC (NULL,hDC);
  113.         // generate palette index
  114.         for (int i=0; i<m_nSystemColors; i++)
  115.         {
  116.         m_SystemPaletteIndices[i] = i;
  117.         m_SystemPaletteRGB[i].rgbBlue = SystemPalette[i].peBlue;
  118.         m_SystemPaletteRGB[i].rgbGreen = SystemPalette[i].peGreen;
  119.         m_SystemPaletteRGB[i].rgbRed = SystemPalette[i].peRed;
  120.         m_SystemPaletteRGB[i].rgbReserved = 0;
  121.         }
  122.         // update color converter's palette with the current system palette entries
  123.         SetDestRGB8Palette(m_nSystemColors, (unsigned int *)SystemPalette, m_SystemPaletteIndices);
  124.         pPalette = SystemPalette;
  125.     }
  126. #endif
  127.     
  128.     cidOut = m_nCID;
  129.     // allocate the buffer for the BITMAPINFO
  130.     pbmiBuf = new BYTE[nSize];
  131.     if (!pbmiBuf)
  132.         return HXR_OUTOFMEMORY;
  133.     memset(pbmiBuf, 0, nSize);
  134.     pbmi = (BITMAPINFO*)pbmiBuf;
  135.     
  136.     // initialize the BITMAPINFO values
  137.     MakeBitmap (pbmi, nSize, cidOut, nWidth, nHeight, (PALETTEENTRY*)pPalette, nColors);
  138.     // allocate a new GDISURFACE structure to use:
  139.     m_pGdiSurface = new GDISURFACE;
  140.     
  141.     if (m_pGdiSurface != NULL)
  142.     {
  143.         // create a file mapping object and map into our address space
  144. #ifndef WINCE
  145.         hMapping = CreateFileMapping ((HANDLE) 0xFFFFFFFF,
  146.                                       NULL, PAGE_READWRITE,
  147.                                       (DWORD) 0,
  148.                                       pbmi->bmiHeader.biSizeImage, NULL);
  149.         if (hMapping != NULL)
  150. #else
  151. hMapping = NULL;
  152. #endif
  153.         {
  154.             // create a DIB section using given image format
  155. #ifdef WINCE
  156. pBase = NULL;
  157. #endif
  158.             hBitmap = CreateDIBSection ((HDC) NULL, pbmi, DIB_RGB_COLORS, (VOID **) &pBase, hMapping, (DWORD) 0);
  159.             if (hBitmap != NULL && pBase != NULL)
  160.             {
  161.                 // initialise the GDISURFACE structure
  162.                 m_pGdiSurface->hBitMap = hBitmap;
  163.                 m_pGdiSurface->lpBase = pBase;
  164.                 m_pGdiSurface->nPitch = nWidth*pbmi->bmiHeader.biBitCount/8;
  165.                 m_pGdiSurface->nPitch = -((m_pGdiSurface->nPitch + 3) & ~3);
  166.                 // m_pGdiSurface->PaletteVersion = PALETTE_VERSION
  167.                 GetObject (hBitmap, sizeof (DIBSECTION), (VOID *)& (m_pGdiSurface->DibSection));
  168.             }
  169.             // close file mapping
  170. #ifndef WINCE
  171.             CloseHandle (hMapping);
  172. #endif
  173.             m_gdiInfo.hDC = GetDC(m_hWnd);
  174.             m_gdiInfo.hMemoryDC = CreateCompatibleDC(m_gdiInfo.hDC);
  175.         }
  176.     }
  177. #ifndef WINCE
  178.     else
  179.         hr = HXR_FAIL;
  180. #endif
  181.     HX_VECTOR_DELETE(pbmi);
  182.     return hr;
  183. }
  184. HX_RESULT CGDIBlt::LockSurface(UCHAR** ppDestPtr,
  185.                               LONG32* pnDestPitch,
  186.                               int& cid,
  187.                               REF(HXxSize) dstSize,
  188.                               int nIndex)
  189. {
  190.     *ppDestPtr = m_pGdiSurface->lpBase;
  191.     *pnDestPitch = m_pGdiSurface->nPitch;
  192.     cid = m_nCID;
  193.     return HXR_OK;
  194. }
  195. HX_RESULT CGDIBlt::FillSurface(int cidIn,
  196.                                UCHAR* pSrcBuffer,
  197.                                HXxSize* pSrcSize,
  198.                                HXxRect* prSrcRect,
  199.                                UCHAR* pDstBuffer,
  200.                                LONG32 nDstPitch,
  201.                                HXxRect* prDestRect)
  202. {
  203.     
  204.     return HXR_NOTIMPL;
  205. }
  206. HX_RESULT CGDIBlt::UnlockSurface(UCHAR* pSurfPtr, int nIndex)
  207. {
  208.     return HXR_OK;
  209. }
  210. HX_RESULT CGDIBlt::RenderSurface(HXxSize* pSrcSize,
  211.                                  HXxRect* prSrcRect,
  212.                                  HXxRect* prDestRect,
  213.                                  int nIndex)
  214. {
  215.     // Map to screen coordinates
  216.     //POINT   po = {0,0};
  217.     //ClientToScreen(m_hWnd, &po);
  218.     
  219.     RECT rc;
  220.     GetClientRect(m_hWnd, &rc);
  221.     
  222.     /*rc.left += po.x;
  223.     rc.right += po.x;
  224.     rc.top += po.y;
  225.     rc.bottom += po.y;*/
  226.     
  227.     BOOL bResult;
  228.     HBITMAP hOldBitmap;
  229.     
  230.     /* get sizes of source/destination rectangles: */
  231.     LONG lTargetWidth  = rc.right  - rc.left;
  232.     LONG lTargetHeight = rc.bottom - rc.top;
  233.     LONG lSourceWidth  = prSrcRect->right  - prSrcRect->left;
  234.     LONG lSourceHeight = prSrcRect->bottom - prSrcRect->top;
  235.     
  236.     /* select bitmap to blit: */
  237.     hOldBitmap = (HBITMAP) SelectObject (m_gdiInfo.hMemoryDC, m_pGdiSurface->hBitMap);
  238.     
  239. #if defined (HELIX_FEATURE_CC_RGB8out)
  240.     SetDIBColorTable(m_gdiInfo.hMemoryDC, 0, m_nSystemColors, m_SystemPaletteRGB);
  241. #endif
  242.     /* is the window the same size as the video: */
  243.     if (lTargetWidth == lSourceWidth && lTargetHeight == lSourceHeight)
  244.     {
  245. /* put the image straight into the window: */
  246.         bResult = BitBlt (
  247.             m_gdiInfo.hDC,     /* target device HDC        */
  248.             rc.left,       /* x sink position          */
  249.             rc.top,        /* y sink position          */
  250.             lTargetWidth,           /* destination width        */
  251.             lTargetHeight,          /* destination height       */
  252.             m_gdiInfo.hMemoryDC,    /* source device context    */
  253.             prSrcRect->left,        /* x source position        */
  254.             prSrcRect->top,         /* y source position        */
  255.             SRCCOPY);               /* simple copy              */
  256.     } else {
  257.         /* stretch the image when copying to the window: */
  258.         bResult = StretchBlt (
  259.             m_gdiInfo.hDC,     /* target device HDC        */
  260.             rc.left,       /* x sink position          */
  261.             rc.top,        /* y sink position          */
  262.             lTargetWidth,           /* destination width        */
  263.             lTargetHeight,          /* destination height       */
  264.             m_gdiInfo.hMemoryDC,    /* source device HDC        */
  265.             prSrcRect->left,        /* x source position        */
  266.             prSrcRect->top,         /* y source position        */
  267.             lSourceWidth,           /* source width             */
  268.             lSourceHeight,          /* source height            */
  269.             SRCCOPY);               /* simple copy              */
  270.     }
  271.     /* put the old bitmap back into the device context so we don't leak */
  272.     SelectObject (m_gdiInfo.hMemoryDC, hOldBitmap);
  273.     
  274.     return HXR_OK;
  275. }
  276. HX_RESULT CGDIBlt::DestroySurface(int cid)
  277. {
  278.     if (m_gdiInfo.hDC) 
  279.         ReleaseDC (m_hWnd, m_gdiInfo.hDC);   
  280.     if (m_gdiInfo.hMemoryDC) 
  281.         DeleteDC (m_gdiInfo.hMemoryDC);
  282.     
  283.     memset(&m_gdiInfo, 0, sizeof(m_gdiInfo));
  284.     if (m_pGdiSurface)
  285.     {
  286.         DeleteObject (m_pGdiSurface->hBitMap);
  287.         HX_DELETE(m_pGdiSurface);
  288.     }
  289.     return HXR_OK;
  290. }