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

Symbian

开发平台:

Visual C++

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