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

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