pximage.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:19k
源码类别:

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. #ifndef _PXIMAGE_H
  36. #define _PXIMAGE_H
  37. // Forward class declarations
  38. class PXImage;
  39. class CHXBaseCountingObject;
  40. class PXRect;
  41. class PXColor;
  42. // Forward interface declarations
  43. typedef _INTERFACE IUnknown         IUnknown;
  44. typedef _INTERFACE IHXBuffer       IHXBuffer;
  45. typedef _INTERFACE IHXVideoSurface IHXVideoSurface;
  46. enum
  47. {
  48.     kIterLRTB,
  49.     kIterLRBT,
  50.     kIterRLTB,
  51.     kIterRLBT,
  52.     kIterTBLR,
  53.     kIterTBRL,
  54.     kIterBTLR,
  55.     kIterBTRL
  56. };
  57. class PXImageIterator
  58. {
  59. public:
  60.     PXImageIterator(PXImage* pImg, INT32 lX, INT32 lY);
  61.     virtual ~PXImageIterator();
  62.     BOOL                     operator == (const PXImageIterator& rItr);
  63.     BOOL                     operator != (const PXImageIterator& rItr);
  64.     virtual PXImageIterator& operator ++ () = 0;
  65.     UINT32&                  operator *  ();
  66.     UINT32&                  GetPixel();
  67. protected:
  68.     PXImage* m_pImage;
  69.     UINT32*  m_pPixel;
  70.     INT32    m_lX;
  71.     INT32    m_lY;
  72. };
  73. class PXImage : public CHXBaseCountingObject,
  74.                 public IUnknown
  75. {
  76. public:
  77.     enum
  78.     {
  79.         kWriteFormatBinaryRaw,
  80.         kWriteFormatAscii
  81.     };
  82.     PXImage();
  83.     virtual ~PXImage();
  84.     static HX_RESULT CreateObject(PXImage** ppImg);
  85.     static HX_RESULT CreateInstance(PXImage** ppImg);
  86.     // IUnknown methods
  87.     STDMETHOD(QueryInterface)  (THIS_ REFIID riid, void** ppvObj);
  88.     STDMETHOD_(UINT32,AddRef)  (THIS);
  89.     STDMETHOD_(UINT32,Release) (THIS);
  90.     HX_RESULT Create(INT32 lW, INT32 lH, UINT32 ulBpp, UINT32 ulFormat,
  91.                      BOOL bRowsInverted, BOOL bAlloc = TRUE);
  92.     HX_RESULT CreateFromBuffer(INT32 lW, INT32 lH, UINT32 ulBpp, UINT32 ulFormat,
  93.                                BOOL bRowsInverted, IHXBuffer* pBuffer);
  94.     HX_RESULT CreateSubImageFromBuffer(PXImage* pImg, INT32 lX, INT32 lY,
  95.                                        INT32 lW, INT32 lH, IHXBuffer* pBuffer);
  96.     HX_RESULT CreateSubImageFromBuffer(PXImage* pImg, const PXRect& rSubRect, IHXBuffer* pBuffer);
  97.     HX_RESULT CreateSubImage(PXImage* pImg, INT32 lX = 0, INT32 lY = 0,
  98.                              INT32 lW = 0, INT32 lH = 0, BOOL bCopy = FALSE, BOOL bAlloc = FALSE);
  99.     HX_RESULT CreateSubImage(PXImage* pImg, const PXRect& rSubRect,
  100.                              BOOL bCopy = FALSE, BOOL bAlloc = FALSE);
  101.     HX_RESULT CreateSubImage(PXImage* pImg, const HXxRect& rSubRect,
  102.                              BOOL bCopy = FALSE, BOOL bAlloc = FALSE);
  103.     void      Destroy();
  104.     HX_RESULT Fill(const PXColor& rColor);
  105.     HX_RESULT Fill32(UINT32 ulColor);
  106.     HX_RESULT Blend(PXImage* pImg1, PXImage* pImg2, BYTE* pLUT1, BYTE* pLUT2);
  107.     HX_RESULT RecursiveBlend(PXImage* pImg1, BYTE* pLUT1, BYTE* pSelfLUT);
  108.     HX_RESULT BlendToColor(PXImage* pImg1, const PXColor& rColor, BYTE* pLUT1, BYTE* pLUT2);
  109.     HX_RESULT RecursiveBlendToColor(const PXColor& rColor, BYTE* pLUT1, BYTE* pLUT2);
  110.     HX_RESULT ChangeSizeFromNN(PXImage* pImg);
  111.     HX_RESULT ChangeSizeFromNNTransparent32(PXImage* pImg);
  112.     HX_RESULT ChangeSizeIntoNN(PXImage* pImg);
  113.     HX_RESULT ChangeSizeIntoNNTransparent32(PXImage* pImg);
  114.     HX_RESULT CopyFrom(PXImage* pImg);
  115.     HX_RESULT CopyFromTransparent32(PXImage* pImg);
  116.     HX_RESULT CopyFromAlpha32(PXImage* pImg, BYTE* pLUT);
  117.     HX_RESULT CopyTo(PXImage* pImg);
  118.     HX_RESULT CopyToTransparent32(PXImage* pImg);
  119.     HX_RESULT CopyToAlpha32(PXImage* pImg, BYTE* pLUT);
  120.     HX_RESULT FlipFrom(PXImage* pImg, BOOL bVerticalAxis);
  121.     HX_RESULT FlipTo(PXImage* pImg, BOOL bVerticalAxis);
  122.     HX_RESULT Wipe(PXImage* pStartImg, PXImage* pEndImg, UINT32 ulType, UINT32 ulDirection,
  123.                    UINT32 ulTime, UINT32 ulDuration);
  124.     HX_RESULT RecursiveWipe(PXImage* pEndImage, UINT32 ulType, UINT32 ulDirection, UINT32 ulLastTime,
  125.                             UINT32 ulTime, UINT32 ulDuration, PXRect& rDamageRect);
  126.     HX_RESULT IntraCopy(const PXRect& rSrcRect, const PXRect& rDstRect);
  127.     HX_RESULT DrawToHXSurface(IHXVideoSurface* pSurface, HXxRect& rDstRect);
  128.     HX_RESULT DrawToHXSurface(IHXVideoSurface* pSurface, HXxRect& rSrcRect, HXxRect& rDstRect);
  129.     HX_RESULT GetPixel(INT32 lX, INT32 lY, BYTE** ppPixel);
  130.     BYTE*     GetPixel(INT32 lX, INT32 lY);
  131.     HX_RESULT GetImageStore(IHXBuffer** ppBuffer);
  132.     void      ConvertToRGBOrder(INT32 lScanline, BYTE* pLine);
  133.     void      ConvertFromRGBOrder(INT32 lScanline, BYTE* pLine);
  134.     INT32     GetWidth()           const { return m_lSubImageWidth;            }
  135.     INT32     GetHeight()          const { return m_lSubImageHeight;           }
  136.     UINT32    GetFormat()          const { return m_cBitmapInfo.biCompression; }
  137.     UINT32    GetBitsPerPixel()    const { return m_cBitmapInfo.biBitCount;    }
  138.     UINT32    GetBytesPerPixel()   const { return m_ulBytesPerPixel;           }
  139.     BOOL      GetRowsInverted()    const { return m_bRowsInverted;             }
  140.     BYTE*     GetImageBuffer()     const { return m_pImageBuffer;              }
  141.     UINT32    GetImageBufferSize() const { return m_lSubImageWidth * m_lSubImageHeight * m_ulBytesPerPixel; }
  142.     INT32     GetRowStride()       const { return m_lRowStride;                }
  143.     INT32     GetRowJump()         const { return m_lRowJump;                  }
  144.     INT32     GetRowJump32()       const { return m_lRowJump >> 2;             }
  145.     UINT32    GetImageStoreSize()  const { return (m_pImageStore ? m_pImageStore->GetSize() : 0); }
  146.     BOOL      GetHasAlpha()        const { return m_bHasAlpha;                 }
  147.     void      SetHasAlpha(BOOL bFlag)    { m_bHasAlpha = bFlag;                }
  148.     void      GetSubRect(HXxRect& rRect) const { rRect = m_cSubImageRect; }
  149.     void      GetSubRect(PXRect& rRect) const;
  150.     void      Write(const char* pszFileName, UINT32 ulWriteFormat);
  151.     void      SelfDetermineHasAlpha();
  152.     void      PreMultiplyAlphaChannel(UINT32 ulColor);
  153.     BOOL      CompressionSupported();
  154.     HX_RESULT GetIterator(PXImageIterator** ppIterator, UINT32 ulType = kIterLRTB);
  155.     BOOL      SameSize(PXImage* pImg) const;
  156.     BOOL      Compatible(PXImage* pImg) const;
  157.     static UINT32 GetMaxWidth()  { return kMaxWidth;  }
  158.     static UINT32 GetMaxHeight() { return kMaxHeight; }
  159. protected:
  160.     enum
  161.     {
  162.         kMaxWidth  = 16834,
  163.         kMaxHeight = 16384
  164.     };
  165.     INT32               m_lRefCount;
  166.     HXBitmapInfoHeader m_cBitmapInfo;
  167.     HXxRect             m_cSubImageRect;
  168.     INT32               m_lSubImageWidth;
  169.     INT32               m_lSubImageHeight;
  170.     UINT32              m_ulBytesPerPixel;
  171.     INT32               m_lRowBytes;
  172.     INT32               m_lRowStride;
  173.     INT32               m_lRowJump;
  174.     BOOL                m_bRowsInverted;
  175.     BYTE*               m_pImageBuffer;
  176.     IHXBuffer*         m_pImageStore;
  177.     BOOL                m_bInitialized;
  178.     BOOL                m_bHasAlpha;
  179.     void                ResetMembers();
  180.     void                Copy32(UINT32* pSrc, UINT32* pDst, INT32 lSrcJump, INT32 lDstJump, BOOL bUseAlpha = FALSE);
  181.     void                CopyTransparent32(UINT32* pSrc, UINT32* pDst, INT32 lSrcJump, INT32 lDstJump);
  182.     void                CopyAlpha32(UINT32* pSrc, UINT32* pDst, INT32 lSrcJump, INT32 lDstJump, BYTE* pLUT);
  183.     HX_RESULT           ChangeSize32NN(UINT32* pSrc, INT32 lSrcW, INT32 lSrcH, INT32 lSrcJump,
  184.                                        UINT32* pDst, INT32 lDstW, INT32 lDstH, INT32 lDstJump);
  185.     HX_RESULT           ChangeSize32NNTransparent(UINT32* pSrc, INT32 lSrcW, INT32 lSrcH, INT32 lSrcJump,
  186.                                                   UINT32* pDst, INT32 lDstW, INT32 lDstH, INT32 lDstJump);
  187.     void                HorzAxisFlip32(UINT32* pSrc, INT32 lSrcW, INT32 lSrcH, INT32 lSrcJump,
  188.                                        UINT32* pDst, INT32 lDstW, INT32 lDstH, INT32 lDstJump);
  189.     void                VertAxisFlip32(UINT32* pSrc, INT32 lSrcW, INT32 lSrcH, INT32 lSrcJump,
  190.                                        UINT32* pDst, INT32 lDstW, INT32 lDstH, INT32 lDstJump);
  191. };
  192. class PXImageIteratorLRTB : public PXImageIterator
  193. {
  194. public:
  195.     PXImageIteratorLRTB(PXImage* pImg)
  196.         : PXImageIterator(pImg, 0, 0) {};
  197.     ~PXImageIteratorLRTB() {};
  198.     PXImageIterator& operator ++ ();
  199. };
  200. class PXImageIteratorLRBT : public PXImageIterator
  201. {
  202. public:
  203.     PXImageIteratorLRBT(PXImage* pImg)
  204.         : PXImageIterator(pImg, 0, pImg->GetHeight() - 1) {};
  205.     ~PXImageIteratorLRBT() {};
  206.     PXImageIterator& operator ++ ();
  207. };
  208. class PXImageIteratorRLTB : public PXImageIterator
  209. {
  210. public:
  211.     PXImageIteratorRLTB(PXImage* pImg)
  212.         : PXImageIterator(pImg, pImg->GetWidth() - 1, 0) {};
  213.     ~PXImageIteratorRLTB() {};
  214.     PXImageIterator& operator ++ ();
  215. };
  216. class PXImageIteratorRLBT : public PXImageIterator
  217. {
  218. public:
  219.     PXImageIteratorRLBT(PXImage* pImg)
  220.         : PXImageIterator(pImg, pImg->GetWidth() - 1, pImg->GetHeight() - 1) {};
  221.     ~PXImageIteratorRLBT() {};
  222.     PXImageIterator& operator ++ ();
  223. };
  224. class PXImageIteratorTBLR : public PXImageIterator
  225. {
  226. public:
  227.     PXImageIteratorTBLR(PXImage* pImg)
  228.         : PXImageIterator(pImg, 0, 0) {};
  229.     ~PXImageIteratorTBLR() {};
  230.     PXImageIterator& operator ++ ();
  231. };
  232. class PXImageIteratorTBRL : public PXImageIterator
  233. {
  234. public:
  235.     PXImageIteratorTBRL(PXImage* pImg)
  236.         : PXImageIterator(pImg, pImg->GetWidth() - 1, 0) {};
  237.     ~PXImageIteratorTBRL() {};
  238.     PXImageIterator& operator ++ ();
  239. };
  240. class PXImageIteratorBTLR : public PXImageIterator
  241. {
  242. public:
  243.     PXImageIteratorBTLR(PXImage* pImg)
  244.         : PXImageIterator(pImg, 0, pImg->GetHeight() - 1) {};
  245.     ~PXImageIteratorBTLR() {};
  246.     PXImageIterator& operator ++ ();
  247. };
  248. class PXImageIteratorBTRL : public PXImageIterator
  249. {
  250. public:
  251.     PXImageIteratorBTRL(PXImage* pImg)
  252.         : PXImageIterator(pImg, pImg->GetWidth() - 1, pImg->GetHeight() - 1) {};
  253.     ~PXImageIteratorBTRL() {};
  254.     PXImageIterator& operator ++ ();
  255. };
  256. inline PXImageIterator::PXImageIterator(PXImage* pImg, INT32 lX, INT32 lY)
  257. {
  258.     HX_ASSERT(pImg);
  259.     m_pImage = pImg;
  260.     m_lX     = lX;
  261.     m_lY     = lY;
  262.     if (m_lX >= 0 && m_lX < m_pImage->GetWidth() &&
  263.         m_lY >= 0 && m_lY < m_pImage->GetHeight())
  264.     {
  265.         m_pPixel = (UINT32*) m_pImage->GetPixel(m_lX, m_lY);
  266.     }
  267.     else
  268.     {
  269.         m_pPixel = NULL;
  270.     }
  271.     m_pImage->AddRef();
  272. }
  273. inline PXImageIterator::~PXImageIterator()
  274. {
  275.     HX_RELEASE(m_pImage);
  276. }
  277. inline BOOL PXImageIterator::operator == (const PXImageIterator& itr)
  278. {
  279.     BOOL bRet = FALSE;
  280.     if (m_pImage == itr.m_pImage &&
  281.         m_lX     == itr.m_lX     &&
  282.         m_lY     == itr.m_lY)
  283.     {
  284.         bRet = TRUE;
  285.     }
  286.     return bRet;
  287. }
  288. inline BOOL PXImageIterator::operator != (const PXImageIterator& itr)
  289. {
  290.     return !(*this == itr);
  291. }
  292. inline UINT32& PXImageIterator::operator * ()
  293. {
  294.     HX_ASSERT(m_pPixel);
  295.     return *m_pPixel;
  296. }
  297. inline UINT32& PXImageIterator::GetPixel()
  298. {
  299.     HX_ASSERT(m_pPixel);
  300.     return *m_pPixel;
  301. }
  302. inline PXImageIterator& PXImageIteratorLRTB::operator ++ ()
  303. {
  304.     if (m_lX >= 0 && m_lX < m_pImage->GetWidth() &&
  305.         m_lY >= 0 && m_lY < m_pImage->GetHeight())
  306.     {
  307.         m_lX++;
  308.         if (m_lX < m_pImage->GetWidth())
  309.         {
  310.             m_pPixel++;
  311.         }
  312.         else
  313.         {
  314.             m_lY++;
  315.             if (m_lY < m_pImage->GetHeight())
  316.             {
  317.                 m_lX     = 0;
  318.                 m_pPixel = (UINT32*) m_pImage->GetPixel(m_lX, m_lY);
  319.             }
  320.         }
  321.     }
  322.     return *this;
  323. }
  324. inline PXImageIterator& PXImageIteratorLRBT::operator ++ ()
  325. {
  326.     if (m_lX >= 0 && m_lX < m_pImage->GetWidth() &&
  327.         m_lY >= 0 && m_lY < m_pImage->GetHeight())
  328.     {
  329.         m_lX++;
  330.         if (m_lX < m_pImage->GetWidth())
  331.         {
  332.             m_pPixel++;
  333.         }
  334.         else
  335.         {
  336.             m_lY--;
  337.             if (m_lY >= 0)
  338.             {
  339.                 m_lX     = 0;
  340.                 m_pPixel = (UINT32*) m_pImage->GetPixel(m_lX, m_lY);
  341.             }
  342.             else
  343.             {
  344.                 m_lX = m_pImage->GetWidth();
  345.                 m_lY = m_pImage->GetHeight();
  346.             }
  347.         }
  348.     }
  349.     return *this;
  350. }
  351. inline PXImageIterator& PXImageIteratorRLTB::operator ++ ()
  352. {
  353.     if (m_lX >= 0 && m_lX < m_pImage->GetWidth() &&
  354.         m_lY >= 0 && m_lY < m_pImage->GetHeight())
  355.     {
  356.         m_lX--;
  357.         if (m_lX >= 0)
  358.         {
  359.             m_pPixel--;
  360.         }
  361.         else
  362.         {
  363.             m_lY++;
  364.             if (m_lY < m_pImage->GetHeight())
  365.             {
  366.                 m_lX     = m_pImage->GetWidth() - 1;
  367.                 m_pPixel = (UINT32*) m_pImage->GetPixel(m_lX, m_lY);
  368.             }
  369.             else
  370.             {
  371.                 m_lX = m_pImage->GetWidth();
  372.                 m_lY = m_pImage->GetHeight();
  373.             }
  374.         }
  375.     }
  376.     return *this;
  377. }
  378. inline PXImageIterator& PXImageIteratorRLBT::operator ++ ()
  379. {
  380.     if (m_lX >= 0 && m_lX < m_pImage->GetWidth() &&
  381.         m_lY >= 0 && m_lY < m_pImage->GetHeight())
  382.     {
  383.         m_lX--;
  384.         if (m_lX >= 0)
  385.         {
  386.             m_pPixel--;
  387.         }
  388.         else
  389.         {
  390.             m_lY--;
  391.             if (m_lY >= 0)
  392.             {
  393.                 m_lX     = m_pImage->GetWidth() - 1;
  394.                 m_pPixel = (UINT32*) m_pImage->GetPixel(m_lX, m_lY);
  395.             }
  396.             else
  397.             {
  398.                 m_lX = m_pImage->GetWidth();
  399.                 m_lY = m_pImage->GetHeight();
  400.             }
  401.         }
  402.     }
  403.     return *this;
  404. }
  405. inline PXImageIterator& PXImageIteratorTBLR::operator ++ ()
  406. {
  407.     if (m_lX >= 0 && m_lX < m_pImage->GetWidth() &&
  408.         m_lY >= 0 && m_lY < m_pImage->GetHeight())
  409.     {
  410.         m_lY++;
  411.         if (m_lY < m_pImage->GetHeight())
  412.         {
  413.             m_pPixel += m_pImage->GetRowJump32();
  414.         }
  415.         else
  416.         {
  417.             m_lX++;
  418.             if (m_lX < m_pImage->GetWidth())
  419.             {
  420.                 m_lY     = 0;
  421.                 m_pPixel = (UINT32*) m_pImage->GetPixel(m_lX, m_lY);
  422.             }
  423.             else
  424.             {
  425.                 m_lX = m_pImage->GetWidth();
  426.                 m_lY = m_pImage->GetHeight();
  427.             }
  428.         }
  429.     }
  430.     return *this;
  431. }
  432. inline PXImageIterator& PXImageIteratorTBRL::operator ++ ()
  433. {
  434.     if (m_lX >= 0 && m_lX < m_pImage->GetWidth() &&
  435.         m_lY >= 0 && m_lY < m_pImage->GetHeight())
  436.     {
  437.         m_lY++;
  438.         if (m_lY < m_pImage->GetHeight())
  439.         {
  440.             m_pPixel += m_pImage->GetRowJump32();
  441.         }
  442.         else
  443.         {
  444.             m_lX--;
  445.             if (m_lX >= 0)
  446.             {
  447.                 m_lY     = 0;
  448.                 m_pPixel = (UINT32*) m_pImage->GetPixel(m_lX, m_lY);
  449.             }
  450.             else
  451.             {
  452.                 m_lX = m_pImage->GetWidth();
  453.                 m_lY = m_pImage->GetHeight();
  454.             }
  455.         }
  456.     }
  457.     return *this;
  458. }
  459. inline PXImageIterator& PXImageIteratorBTLR::operator ++ ()
  460. {
  461.     if (m_lX >= 0 && m_lX < m_pImage->GetWidth() &&
  462.         m_lY >= 0 && m_lY < m_pImage->GetHeight())
  463.     {
  464.         m_lY--;
  465.         if (m_lY >= 0)
  466.         {
  467.             m_pPixel -= m_pImage->GetRowJump32();
  468.         }
  469.         else
  470.         {
  471.             m_lX++;
  472.             if (m_lX < m_pImage->GetWidth())
  473.             {
  474.                 m_lY     = m_pImage->GetHeight() - 1;
  475.                 m_pPixel = (UINT32*) m_pImage->GetPixel(m_lX, m_lY);
  476.             }
  477.             else
  478.             {
  479.                 m_lX = m_pImage->GetWidth();
  480.                 m_lY = m_pImage->GetHeight();
  481.             }
  482.         }
  483.     }
  484.     return *this;
  485. }
  486. inline PXImageIterator& PXImageIteratorBTRL::operator ++ ()
  487. {
  488.     if (m_lX >= 0 && m_lX < m_pImage->GetWidth() &&
  489.         m_lY >= 0 && m_lY < m_pImage->GetHeight())
  490.     {
  491.         m_lY--;
  492.         if (m_lY >= 0)
  493.         {
  494.             m_pPixel -= m_pImage->GetRowJump32();
  495.         }
  496.         else
  497.         {
  498.             m_lX--;
  499.             if (m_lX >= 0)
  500.             {
  501.                 m_lY     = m_pImage->GetHeight() - 1;
  502.                 m_pPixel = (UINT32*) m_pImage->GetPixel(m_lX, m_lY);
  503.             }
  504.             else
  505.             {
  506.                 m_lX = m_pImage->GetWidth();
  507.                 m_lY = m_pImage->GetHeight();
  508.             }
  509.         }
  510.     }
  511.     return *this;
  512. }
  513. #define GETALPHA32(p)        ( (p)               >> 24)
  514. #define GETRED32(p)          (((p) & 0x00FF0000) >> 16)
  515. #define GETGREEN32(p)        (((p) & 0x0000FF00) >>  8)
  516. #define GETBLUE32(p)         ( (p) & 0x000000FF       )
  517. #define BLENDMULT(A,B,a)     (((A)*(a) + (B)*(256-(a))) >> 8)
  518. #define ALPHA_EXACT(A,B,a)   ((((A)*(a) + (B)*(255-(a))) + 127) / 255)
  519. #define ALPHABLEND(A,B,a)    (((A)*(a) + (B)*(256-(a)) + 128) >> 8)
  520. #define MAKEPIXEL32(r,g,b)   (((r) << 16) | ((g) << 8) | (b))
  521. #define MAKE_RGB32(r,g,b)    (((r) << 16) | ((g) << 8) | (b))
  522. #define MAKE_RGBA32(r,g,b,a) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
  523. #define FILTER_OUT_UNSUPPORTED_FORMATS      
  524. if (m_cBitmapInfo.biBitCount != 32 ||       
  525.     m_cBitmapInfo.biCompression != HX_RGB) 
  526. {                                           
  527.     HX_ASSERT(FALSE);                       
  528.     return HXR_FAIL;                        
  529. }
  530. #endif