1/*
2 * Copyright 2003-2014 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef	_REGION_H
6#define	_REGION_H
7
8
9#include <Rect.h>
10
11
12namespace BPrivate {
13	class ServerLink;
14	class LinkReceiver;
15};
16
17/* Integer rect used to define a clipping rectangle. All bounds are inclusive. */
18/* Moved from DirectWindow.h */
19typedef struct {
20	int32	left;
21	int32	top;
22	int32	right;
23	int32	bottom;
24} clipping_rect;
25
26
27class BRegion {
28public:
29								BRegion();
30								BRegion(const BRegion& other);
31								BRegion(const BRect rect);
32	virtual						~BRegion();
33
34			BRegion&			operator=(const BRegion& other);
35			bool				operator==(const BRegion& other) const;
36
37			void				Set(BRect rect);
38			void				Set(clipping_rect clipping);
39
40			BRect				Frame() const;
41			clipping_rect		FrameInt() const;
42
43			BRect				RectAt(int32 index);
44			BRect				RectAt(int32 index) const;
45			clipping_rect		RectAtInt(int32 index);
46			clipping_rect		RectAtInt(int32 index) const;
47
48			int32				CountRects();
49			int32				CountRects() const;
50
51			bool				Intersects(BRect rect) const;
52			bool				Intersects(clipping_rect clipping) const;
53
54			bool				Contains(BPoint point) const;
55			bool				Contains(int32 x, int32 y);
56			bool				Contains(int32 x, int32 y) const;
57
58			void				PrintToStream() const;
59
60			void				OffsetBy(const BPoint& point);
61			void				OffsetBy(int32 x, int32 y);
62			void				ScaleBy(BSize scale);
63			void				ScaleBy(float x, float y);
64
65			void				MakeEmpty();
66
67			void				Include(BRect rect);
68			void				Include(clipping_rect clipping);
69			void				Include(const BRegion* region);
70
71			void				Exclude(BRect rect);
72			void				Exclude(clipping_rect clipping);
73			void				Exclude(const BRegion* region);
74
75			void				IntersectWith(const BRegion* region);
76
77			void				ExclusiveInclude(const BRegion* region);
78
79private:
80	friend class BDirectWindow;
81	friend class BPrivate::ServerLink;
82	friend class BPrivate::LinkReceiver;
83
84	class Support;
85	friend class Support;
86
87private:
88								BRegion(const clipping_rect& clipping);
89
90			void				_AdoptRegionData(BRegion& region);
91			bool				_SetSize(int32 newSize);
92
93			clipping_rect		_Convert(const BRect& rect) const;
94			clipping_rect		_ConvertToInternal(const BRect& rect) const;
95			clipping_rect		_ConvertToInternal(
96									const clipping_rect& rect) const;
97
98private:
99			int32				fCount;
100			int32				fDataSize;
101			clipping_rect		fBounds;
102			clipping_rect*		fData;
103};
104
105
106#endif // _REGION_H
107