rfbRegion.h
3.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright (C) 2002-2003 RealVNC Ltd. All Rights Reserved.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
//
// If the source code for the program is not available from the place from
// which you received this file, check http://www.realvnc.com/ or contact
// the authors on info@realvnc.com for information on obtaining it.
#define USE_X11_REGIONS
#ifdef USE_X11_REGIONS
#include "rfbRegion_X11.h"
#else
#ifdef WIN32
#include "rfbRegion_win32.h"
#else
#error "using custom region code"
// rfb::Region and rfb::Region2D classes
#ifndef __RFB_REGION_INCLUDED__
#define __RFB_REGION_INCLUDED__
#include "rfbRect.h"
#include <vector>
namespace rfb {
struct Span;
// rfb::Region
//
// The Region class is used to represent N-dimensional
// regions.
// Each Region is a one-dimensional collection of
// non-overlapping Spans. Each span may itself contain
// a child Region, thus allowing multi-dimensional
// regions to be expressed.
//
// Regions may be infinite, empty or non-empty.
class Region {
public:
Region(bool infinite_=false);
Region(int start, int end, const Region &sub);
Region intersect(const Region &src) const {
Region tmp; do_intersect(tmp, src); return tmp;
}
Region union_(const Region &src) const {
Region tmp; do_union_(tmp, src); return tmp;
}
Region subtract(const Region &src) const {
Region tmp; do_subtract(tmp, src); return tmp;
}
void translate(const int offset);
void reset(int start, int end, const Region &subspans);
void clear();
bool equals(const Region &b) const;
bool is_empty() const {return spans.empty() && !infinite;};
bool is_infinite() const {return infinite;};
const std::vector<Span> &get_spans() const {return spans;};
Span get_extent() const;
void debug_print(const char *prefix) const;
protected:
void do_intersect(Region &dest, const Region &src) const;
void do_union_(Region &dest, const Region &src) const;
void do_subtract(Region &dest, const Region &src) const;
protected:
bool infinite;
std::vector<Span> spans;
};
class Region2D : public Region {
public:
Region2D();
Region2D(int x1, int y1, int x2, int y2);
Region2D(const Rect &r);
Region2D intersect(const Region2D &src) const {
Region2D tmp; do_intersect(tmp, src); return tmp;
}
Region2D union_(const Region2D &src) const {
Region2D tmp; do_union_(tmp, src); return tmp;
}
Region2D subtract(const Region2D &src) const {
Region2D tmp; do_subtract(tmp, src); return tmp;
}
void reset(int x1, int y1, int x2, int y2);
void translate(const rfb::Point &p);
bool get_rects(rfb::RectVector &rects, bool left2right, bool topdown) const;
Rect get_bounding_rect() const;
};
struct Span {
Span() : start(0), end(0) {};
Span(int start, int end, const Region &r);
bool equals(const Span &b) const;
void append_to(std::vector<Span> &spans) const;
int start;
int end;
Region subspans;
};
typedef std::vector<Span> SpanVector;
};
#endif // __RFB_REGION_INCLUDED__
#endif // WIN32
#endif // X11