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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: diballoc.cpp,v 1.3.42.2 2004/07/26 09:01:25 pankajgupta 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 "hxtypes.h"
  50. #include <windows.h>
  51. #include <windowsx.h>
  52. #include "hxmap.h"
  53. #include "hxassert.h"
  54. #include "hxerrors.h"
  55. #include "diballoc.h"
  56. #include "hxheap.h"
  57. ///////////////////
  58. // private data
  59. #ifdef _DEBUG
  60. #undef HX_THIS_FILE
  61. static const char HX_THIS_FILE[] = __FILE__;
  62. #endif
  63. CHXDIBits::CHXDIBits()
  64. {
  65.     m_hDIB = NULL;
  66. }
  67. CHXDIBits::~CHXDIBits()
  68. {
  69.     if (m_hDIB)
  70.     {
  71. GlobalFree(m_hDIB);
  72. m_hDIB = NULL;
  73.     }
  74. }
  75. HX_RESULT
  76. CHXDIBits::GetDIBits(HDC hDC,
  77.      HBITMAP hBM,
  78.      UCHAR*& pBits,
  79.      BITMAPINFOHEADER*& pHeader)
  80. {
  81.     HX_RESULT hr = HXR_OK;
  82.     WORD wBits = 0;
  83.     DWORD    dwLen = 0;
  84.     BITMAP bm;
  85.     BITMAPINFOHEADER bi;
  86.     LPBITMAPINFOHEADER lpbi = NULL;
  87.     pBits = NULL;
  88.     pHeader = NULL;
  89.     if (!hDC || !hBM)
  90.     {
  91. hr = HXR_FAILED;
  92. goto cleanup;
  93.     }
  94.     GetObject(hBM, sizeof(bm), &bm);
  95.     wBits = (WORD)(bm.bmPlanes * bm.bmBitsPixel);
  96.     bi.biSize = sizeof(BITMAPINFOHEADER);
  97.     bi.biWidth = bm.bmWidth;
  98.     bi.biHeight = bm.bmHeight;
  99.     bi.biPlanes = 1;
  100.     bi.biBitCount = wBits;
  101.     bi.biCompression = BI_RGB;
  102.     bi.biSizeImage = WIDTHBYTES(bm.bmWidth * wBits) * bm.bmHeight;
  103.     bi.biXPelsPerMeter = 0;
  104.     bi.biYPelsPerMeter  = 0;
  105.     bi.biClrUsed = 0;
  106.     bi.biClrImportant = 0;
  107.     dwLen = bi.biSize + DibNumColors(&bi) * sizeof(RGBQUAD) + bi.biSizeImage;
  108.     if (!m_hDIB)
  109.     {
  110. m_hDIB = GlobalAlloc(GMEM_MOVEABLE, dwLen);
  111.     }
  112.     else if (m_hDIB && (GlobalSize(m_hDIB) != dwLen))
  113.     {
  114. GlobalFree(m_hDIB);
  115. m_hDIB = GlobalAlloc(GMEM_MOVEABLE, dwLen);
  116.     }
  117.     lpbi = (LPBITMAPINFOHEADER)GlobalLock(m_hDIB);
  118.     if (!lpbi)
  119.     {
  120. // This is bad, it's not clear how callers of this class can
  121. // really handle a failure case. So, we need to make sure that
  122. // all our callers do handle this correctly.
  123. HX_ASSERT(lpbi);
  124. hr = HXR_FAILED;
  125. goto cleanup;
  126.     }
  127.     *lpbi = bi;
  128.     ::GetDIBits(hDC,
  129.       hBM,
  130.       0,
  131.       (WORD)bi.biHeight,
  132.       DibPtr(lpbi),
  133.       (LPBITMAPINFO)lpbi,
  134.       DIB_RGB_COLORS);
  135.     bi = *lpbi;
  136.     lpbi->biClrUsed = DibNumColors(lpbi);
  137.     pBits = (UCHAR*)DibPtr(lpbi);
  138.     pHeader = lpbi;
  139.     GlobalUnlock(m_hDIB);
  140. cleanup:
  141.     return hr;
  142. }