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

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 _PXRECT_H
  36. #define _PXRECT_H
  37. class PXRect : public CHXBaseCountingObject,
  38.                public CUnknownIMP
  39. {
  40.     DECLARE_UNKNOWN(PXRect)
  41. public:
  42.     PXRect();
  43.     virtual ~PXRect() {};
  44.     UINT32 GetX()      const     { return m_ulX; };
  45.     UINT32 GetY()      const     { return m_ulY; };
  46.     UINT32 GetWidth()  const     { return m_ulW; };
  47.     UINT32 GetHeight() const     { return m_ulH; };
  48.     void   SetX(UINT32 ulX)      { m_ulX = ulX; };
  49.     void   SetY(UINT32 ulY)      { m_ulY = ulY; };
  50.     void   SetWidth(UINT32 ulW)  { m_ulW = ulW; };
  51.     void   SetHeight(UINT32 ulH) { m_ulH = ulH; };
  52.     void   Set(UINT32 ulX, UINT32 ulY, UINT32 ulW, UINT32 ulH);
  53.     BOOL   IsNull();
  54.     BOOL   IsOverlapped(const PXRect& rRect);
  55.     BOOL   Contains(const PXRect& rRect) const;
  56.     void   Clip(const PXRect& rRect);
  57.     void   ChangeOriginTo(const PXRect& rRect);
  58.     void   ChangeOriginFrom(const PXRect& rRect);
  59.     void   Scale(const PXRect& rSrc, const PXRect& rDst);
  60.     void   AdjustForZeroValues(UINT32 ulW, UINT32 ulH);
  61.     void   AdjustForOvershoot(UINT32 ulW, UINT32 ulH);
  62.     void   InterpolateRect(UINT32 ulTime, UINT32 ulStart, UINT32 ulEnd,
  63.                            const PXRect& rStart, const PXRect& rEnd);
  64.     void   Pack(BYTE * &pBuffer, UINT32 ulMajVer, UINT32 ulMinVer);
  65.     void   UnPack(BYTE * &pBuffer, UINT32 ulMajVer, UINT32 ulMinVer);
  66.     const PXRect & operator = (const PXRect& rRect);
  67.     BOOL           operator == (const PXRect& rRect) const;
  68.     BOOL           operator != (const PXRect& rRect) const;
  69. protected:
  70.     UINT32 m_ulX;
  71.     UINT32 m_ulY;
  72.     UINT32 m_ulW;
  73.     UINT32 m_ulH;
  74. };
  75. inline PXRect::PXRect()
  76. {
  77.     m_ulX = m_ulY = m_ulW = m_ulH = 0;
  78. }
  79. inline void PXRect::Set(UINT32 ulX, UINT32 ulY, UINT32 ulW, UINT32 ulH)
  80. {
  81.     m_ulX = ulX;
  82.     m_ulY = ulY;
  83.     m_ulW = ulW;
  84.     m_ulH = ulH;
  85. }
  86. inline const PXRect& PXRect::operator = (const PXRect &rRect)
  87. {
  88.     Set(rRect.m_ulX, rRect.m_ulY, rRect.m_ulW, rRect.m_ulH);
  89.     return *this;
  90. }
  91. inline BOOL PXRect::operator == (const PXRect& rRect) const
  92. {
  93.     BOOL bRet = TRUE;
  94.     if (rRect.m_ulX != m_ulX ||
  95.         rRect.m_ulY != m_ulY ||
  96.         rRect.m_ulW != m_ulW ||
  97.         rRect.m_ulH != m_ulH)
  98.     {
  99.         bRet = FALSE;
  100.     }
  101.     return bRet;
  102. }
  103. inline BOOL PXRect::operator != (const PXRect& rRect) const
  104. {
  105.     BOOL bRet = FALSE;
  106.     if (rRect.m_ulX != m_ulX ||
  107.         rRect.m_ulY != m_ulY ||
  108.         rRect.m_ulW != m_ulW ||
  109.         rRect.m_ulH != m_ulH)
  110.     {
  111.         bRet = TRUE;
  112.     }
  113.     return bRet;
  114. }
  115. inline BOOL PXRect::IsNull()
  116. {
  117.     return (m_ulX | m_ulY | m_ulW | m_ulH ? FALSE : TRUE);
  118. }
  119. inline BOOL PXRect::IsOverlapped(const PXRect& rRect)
  120. {
  121.     BOOL bOverlap = FALSE;
  122.     if (rRect.m_ulX               < m_ulX + m_ulW &&
  123.         rRect.m_ulY               < m_ulY + m_ulH &&
  124.         rRect.m_ulX + rRect.m_ulW > m_ulX         &&
  125.         rRect.m_ulY + rRect.m_ulH > m_ulY)
  126.     {
  127.         bOverlap = TRUE;
  128.     }
  129.     return bOverlap;
  130. }
  131. inline BOOL PXRect::Contains(const PXRect& rRect) const
  132. {
  133.     BOOL bContain = FALSE;
  134.     if (rRect.m_ulX               >= m_ulX         &&
  135.         rRect.m_ulY               >= m_ulY         &&
  136.         rRect.m_ulX + rRect.m_ulW <= m_ulX + m_ulW &&
  137.         rRect.m_ulY + rRect.m_ulH <= m_ulY + m_ulH)
  138.     {
  139.         bContain = TRUE;
  140.     }
  141.     return bContain;
  142. }
  143. inline void PXRect::Clip(const PXRect& rRect)
  144. {
  145.     UINT32 ulRight1    = m_ulX + m_ulW;
  146.     UINT32 ulRight2    = rRect.m_ulX + rRect.m_ulW;
  147.     UINT32 ulBottom1   = m_ulY + m_ulH;
  148.     UINT32 ulBottom2   = rRect.m_ulY + rRect.m_ulH;
  149.     UINT32 ulNewRight  = (ulRight1 < ulRight2 ? ulRight1 : ulRight2);
  150.     UINT32 ulNewBottom = (ulBottom1 < ulBottom2 ? ulBottom1 : ulBottom2);
  151.     m_ulX              = (m_ulX > rRect.m_ulX ? m_ulX : rRect.m_ulX);
  152.     m_ulY              = (m_ulY > rRect.m_ulY ? m_ulY : rRect.m_ulY);
  153.     m_ulW              = (ulNewRight >= m_ulX ? ulNewRight - m_ulX : 0);
  154.     m_ulH              = (ulNewBottom >= m_ulY ? ulNewBottom - m_ulY : 0);
  155. }
  156. inline void PXRect::ChangeOriginTo(const PXRect& rRect)
  157. {
  158.     if (m_ulX >= rRect.m_ulX && m_ulY >= rRect.m_ulY)
  159.     {
  160.         m_ulX -= rRect.m_ulX;
  161.         m_ulY -= rRect.m_ulY;
  162.     }
  163. }
  164. inline void PXRect::ChangeOriginFrom(const PXRect& rRect)
  165. {
  166.     m_ulX += rRect.m_ulX;
  167.     m_ulY += rRect.m_ulY;
  168. }
  169. inline void PXRect::Scale(const PXRect& rSrc, const PXRect& rDst)
  170. {
  171.     if (rSrc.GetWidth() > 0 && rSrc.GetHeight() > 0)
  172.     {
  173.         m_ulX = m_ulX * rDst.GetWidth()  / rSrc.GetWidth();
  174.         m_ulY = m_ulY * rDst.GetHeight() / rSrc.GetHeight();
  175.         m_ulW = m_ulW * rDst.GetWidth()  / rSrc.GetWidth();
  176.         m_ulH = m_ulH * rDst.GetHeight() / rSrc.GetHeight();
  177.     }
  178. }
  179. inline void PXRect::AdjustForZeroValues(UINT32 ulW, UINT32 ulH)
  180. {
  181.     if (!m_ulW)
  182.     {
  183.         m_ulW = ulW;
  184.     }
  185.     if (!m_ulH)
  186.     {
  187.         m_ulH = ulH;
  188.     }
  189. }
  190. inline void PXRect::AdjustForOvershoot(UINT32 ulW, UINT32 ulH)
  191. {
  192.     if (m_ulW > ulW)
  193.     {
  194.         m_ulW = ulW;
  195.     }
  196.     if (m_ulX + m_ulW > ulW)
  197.     {
  198.         m_ulX = ulW - m_ulW;
  199.     }
  200.     if (m_ulH > ulH)
  201.     {
  202.         m_ulH = ulH;
  203.     }
  204.     if (m_ulY + m_ulH > ulH)
  205.     {
  206.         m_ulY = ulH - m_ulH;
  207.     }
  208. }
  209. #endif