haiku/src/servers/app/IntRect.h
Stephan Aßmus 264fe59ded * introduced IntPoint and IntRect, which are just like BPoint and BRect,
but use integer coordinates. These are now used in ViewLayer for the
  coordinate system (layout, scrolling offset, view bitmap layout)
* modest performance improvements by inlining some very often used
  methods, and by preventing to go down the entire layer tree too often,
  for example InvalidateScreenClipping was always called in the deep
  mode, therefor it is save to assume that the tree does not have to
  be traversed as soon as the clipping is already invalid


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19390 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-11-29 03:20:07 +00:00

240 lines
4.3 KiB
C++

/*
* Copyright 2001-2006, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Frans van Nispen
* Stephan Aßmus <superstippi@gmx.de>
*/
#ifndef INT_RECT_H
#define INT_RECT_H
#include <Region.h>
#include "IntPoint.h"
class IntRect {
public:
int32 left;
int32 top;
int32 right;
int32 bottom;
IntRect();
IntRect(const IntRect& r);
IntRect(const BRect& r);
IntRect(int32 l, int32 t, int32 r, int32 b);
IntRect(const IntPoint& lt,
const IntPoint& rb);
IntRect& operator=(const IntRect &r);
void Set(int32 l, int32 t, int32 r, int32 b);
void PrintToStream() const;
IntPoint LeftTop() const;
IntPoint RightBottom() const;
IntPoint LeftBottom() const;
IntPoint RightTop() const;
void SetLeftTop(const IntPoint& p);
void SetRightBottom(const IntPoint& p);
void SetLeftBottom(const IntPoint& p);
void SetRightTop(const IntPoint& p);
// transformation
void InsetBy(const IntPoint& p);
void InsetBy(int32 dx, int32 dy);
void OffsetBy(const IntPoint& p);
void OffsetBy(int32 dx, int32 dy);
void OffsetTo(const IntPoint& p);
void OffsetTo(int32 x, int32 y);
// expression transformations
IntRect& InsetBySelf(const IntPoint& p);
IntRect& InsetBySelf(int32 dx, int32 dy);
IntRect InsetByCopy(const IntPoint& p);
IntRect InsetByCopy(int32 dx, int32 dy);
IntRect& OffsetBySelf(const IntPoint& p);
IntRect& OffsetBySelf(int32 dx, int32 dy);
IntRect OffsetByCopy(const IntPoint& p);
IntRect OffsetByCopy(int32 dx, int32 dy);
IntRect& OffsetToSelf(const IntPoint& p);
IntRect& OffsetToSelf(int32 dx, int32 dy);
IntRect OffsetToCopy(const IntPoint& p);
IntRect OffsetToCopy(int32 dx, int32 dy);
// comparison
bool operator==(const IntRect& r) const;
bool operator!=(const IntRect& r) const;
// intersection and union
IntRect operator&(const IntRect& r) const;
IntRect operator|(const IntRect& r) const;
// conversion to BRect and clipping_rect
operator clipping_rect() const;
operator BRect() const
{ return BRect(left, top,
right, bottom); }
bool Intersects(const IntRect& r) const;
bool IsValid() const;
int32 Width() const;
int32 IntegerWidth() const;
int32 Height() const;
int32 IntegerHeight() const;
bool Contains(const IntPoint& p) const;
bool Contains(const IntRect& r) const;
};
// inline definitions ----------------------------------------------------------
inline IntPoint
IntRect::LeftTop() const
{
return *(const IntPoint*)&left;
}
inline IntPoint
IntRect::RightBottom() const
{
return *(const IntPoint*)&right;
}
inline IntPoint
IntRect::LeftBottom() const
{
return IntPoint(left, bottom);
}
inline IntPoint
IntRect::RightTop() const
{
return IntPoint(right, top);
}
inline
IntRect::IntRect()
{
top = left = 0;
bottom = right = -1;
}
inline
IntRect::IntRect(int32 l, int32 t, int32 r, int32 b)
{
left = l;
top = t;
right = r;
bottom = b;
}
inline
IntRect::IntRect(const IntRect &r)
{
left = r.left;
top = r.top;
right = r.right;
bottom = r.bottom;
}
inline
IntRect::IntRect(const BRect &r)
{
left = (int32)r.left;
top = (int32)r.top;
right = (int32)r.right;
bottom = (int32)r.bottom;
}
inline
IntRect::IntRect(const IntPoint& leftTop, const IntPoint& rightBottom)
{
left = leftTop.x;
top = leftTop.y;
right = rightBottom.x;
bottom = rightBottom.y;
}
inline IntRect &
IntRect::operator=(const IntRect& from)
{
left = from.left;
top = from.top;
right = from.right;
bottom = from.bottom;
return *this;
}
inline void
IntRect::Set(int32 l, int32 t, int32 r, int32 b)
{
left = l;
top = t;
right = r;
bottom = b;
}
inline bool
IntRect::IsValid() const
{
return left <= right && top <= bottom;
}
inline int32
IntRect::IntegerWidth() const
{
return right - left;
}
inline int32
IntRect::Width() const
{
return right - left;
}
inline int32
IntRect::IntegerHeight() const
{
return bottom - top;
}
inline int32
IntRect::Height() const
{
return bottom - top;
}
inline
IntRect::operator clipping_rect() const
{
clipping_rect r;
r.left = left;
r.top = top;
r.right = right;
r.bottom = bottom;
return r;
}
#endif // INT_RECT_H