/src/libreoffice/include/vcl/region.hxx
Line | Count | Source |
1 | | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 | | /* |
3 | | * This file is part of the LibreOffice project. |
4 | | * |
5 | | * This Source Code Form is subject to the terms of the Mozilla Public |
6 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
7 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
8 | | * |
9 | | * This file incorporates work covered by the following license notice: |
10 | | * |
11 | | * Licensed to the Apache Software Foundation (ASF) under one or more |
12 | | * contributor license agreements. See the NOTICE file distributed |
13 | | * with this work for additional information regarding copyright |
14 | | * ownership. The ASF licenses this file to you under the Apache |
15 | | * License, Version 2.0 (the "License"); you may not use this file |
16 | | * except in compliance with the License. You may obtain a copy of |
17 | | * the License at http://www.apache.org/licenses/LICENSE-2.0 . |
18 | | */ |
19 | | |
20 | | #ifndef INCLUDED_VCL_REGION_HXX |
21 | | #define INCLUDED_VCL_REGION_HXX |
22 | | |
23 | | #include <tools/gen.hxx> |
24 | | #include <tools/poly.hxx> |
25 | | #include <vcl/dllapi.h> |
26 | | #include <basegfx/polygon/b2dpolypolygon.hxx> |
27 | | #include <memory> |
28 | | #include <optional> |
29 | | |
30 | | class RegionBand; |
31 | | |
32 | | namespace vcl { class Window; } |
33 | | class OutputDevice; |
34 | | class Bitmap; |
35 | | |
36 | | typedef std::vector< tools::Rectangle > RectangleVector; |
37 | | |
38 | | namespace vcl { |
39 | | |
40 | | class SAL_WARN_UNUSED VCL_DLLPUBLIC Region |
41 | | { |
42 | | private: |
43 | | friend class ::OutputDevice; |
44 | | friend class ::vcl::Window; |
45 | | friend class ::Bitmap; |
46 | | |
47 | | // possible contents |
48 | | std::optional< basegfx::B2DPolyPolygon > |
49 | | mpB2DPolyPolygon; |
50 | | std::optional< tools::PolyPolygon > |
51 | | mpPolyPolygon; |
52 | | std::shared_ptr< RegionBand > |
53 | | mpRegionBand; |
54 | | |
55 | | bool mbIsNull : 1; |
56 | | |
57 | | // helpers |
58 | | SAL_DLLPRIVATE void ImplCreatePolyPolyRegion( const tools::PolyPolygon& rPolyPoly ); |
59 | | SAL_DLLPRIVATE void ImplCreatePolyPolyRegion( const basegfx::B2DPolyPolygon& rPolyPoly ); |
60 | | |
61 | | SAL_DLLPRIVATE tools::PolyPolygon ImplCreatePolyPolygonFromRegionBand() const; |
62 | | SAL_DLLPRIVATE basegfx::B2DPolyPolygon ImplCreateB2DPolyPolygonFromRegionBand() const; |
63 | | |
64 | | public: |
65 | | |
66 | | explicit Region(bool bIsNull = false); // default creates empty region, with true a null region is created |
67 | | explicit Region(const tools::Rectangle& rRect); |
68 | | explicit Region(const tools::Polygon& rPolygon); |
69 | | explicit Region(const tools::PolyPolygon& rPolyPoly); |
70 | | explicit Region(const basegfx::B2DPolyPolygon&); |
71 | | Region(const vcl::Region& rRegion); |
72 | | Region(vcl::Region&& rRegion) noexcept; |
73 | | ~Region(); |
74 | | |
75 | | // direct access to contents |
76 | 14.6M | const std::optional<basegfx::B2DPolyPolygon>& getB2DPolyPolygon() const { return mpB2DPolyPolygon; } |
77 | 14.4M | const std::optional<tools::PolyPolygon>& getPolyPolygon() const { return mpPolyPolygon; } |
78 | 29.3M | const RegionBand* getRegionBand() const { return mpRegionBand.get(); } |
79 | | |
80 | | // access with converters, the asked data will be created from the most |
81 | | // valuable data, buffered and returned |
82 | | tools::PolyPolygon GetAsPolyPolygon() const; |
83 | | basegfx::B2DPolyPolygon GetAsB2DPolyPolygon() const; |
84 | | const RegionBand* GetAsRegionBand() const; |
85 | | |
86 | | // manipulators |
87 | | void Move( tools::Long nHorzMove, tools::Long nVertMove ); |
88 | | void Scale( double fScaleX, double fScaleY ); |
89 | | void Union( const tools::Rectangle& rRegion ); |
90 | | void Intersect( const tools::Rectangle& rRegion ); |
91 | | void Exclude( const tools::Rectangle& rRegion ); |
92 | | void XOr( const tools::Rectangle& rRegion ); |
93 | | void Union( const vcl::Region& rRegion ); |
94 | | void Intersect( const vcl::Region& rRegion ); |
95 | | void Exclude( const vcl::Region& rRegion ); |
96 | | bool XOr( const vcl::Region& rRegion ); |
97 | | |
98 | | bool IsEmpty() const; |
99 | 19.6M | bool IsNull() const { return mbIsNull;} |
100 | | |
101 | | void SetEmpty(); |
102 | | void SetNull(); |
103 | | |
104 | | bool IsRectangle() const; |
105 | | |
106 | | tools::Rectangle GetBoundRect() const; |
107 | 150k | bool HasPolyPolygonOrB2DPolyPolygon() const { return (getB2DPolyPolygon() || getPolyPolygon()); } |
108 | | void GetRegionRectangles(RectangleVector& rTarget) const; |
109 | | |
110 | | bool Contains( const Point& rPoint ) const; |
111 | | bool Overlaps( const tools::Rectangle& rRect ) const; |
112 | | |
113 | | vcl::Region& operator=( const vcl::Region& rRegion ); |
114 | | vcl::Region& operator=( vcl::Region&& rRegion ) noexcept; |
115 | | vcl::Region& operator=( const tools::Rectangle& rRect ); |
116 | | |
117 | | bool operator==( const vcl::Region& rRegion ) const; |
118 | 6 | bool operator!=( const vcl::Region& rRegion ) const { return !(Region::operator==( rRegion )); } |
119 | | |
120 | | friend VCL_DLLPUBLIC SvStream& ReadRegion( SvStream& rIStm, vcl::Region& rRegion ); |
121 | | friend SvStream& WriteRegion( SvStream& rOStm, const vcl::Region& rRegion ); |
122 | | |
123 | | /* workaround: faster conversion for PolyPolygons |
124 | | * if half of the Polygons contained in rPolyPoly are actually |
125 | | * rectangles, then the returned vcl::Region will be constructed by |
126 | | * XOr'ing the contained Polygons together; in the case of |
127 | | * only Rectangles this can be up to eight times faster than |
128 | | * Region( const tools::PolyPolygon& ). |
129 | | * Caution: this is only useful if the vcl::Region is known to be |
130 | | * changed to rectangles; e.g. if being set as clip region |
131 | | */ |
132 | | static vcl::Region GetRegionFromPolyPolygon( const tools::PolyPolygon& rPolyPoly ); |
133 | | }; |
134 | | |
135 | | template< typename charT, typename traits > |
136 | | inline std::basic_ostream<charT, traits> & operator <<( |
137 | | std::basic_ostream<charT, traits> & stream, const Region& rRegion) |
138 | | { |
139 | | if (rRegion.IsEmpty()) |
140 | | return stream << "EMPTY"; |
141 | | if (rRegion.getB2DPolyPolygon()) |
142 | | return stream << "B2DPolyPolygon(" |
143 | | << *rRegion.getB2DPolyPolygon() |
144 | | << ")"; |
145 | | if (rRegion.getPolyPolygon()) |
146 | | return stream << "PolyPolygon(" |
147 | | << *rRegion.getPolyPolygon() |
148 | | << ")"; |
149 | | if (rRegion.getRegionBand()) |
150 | | { // inlined because RegionBand is private to vcl |
151 | | stream << "RegionBand("; |
152 | | RectangleVector rects; |
153 | | rRegion.GetRegionRectangles(rects); |
154 | | if (rects.empty()) |
155 | | stream << "EMPTY"; |
156 | | for (size_t i = 0; i < rects.size(); ++i) |
157 | | stream << "[" << i << "] " << rects[i]; |
158 | | stream << ")"; |
159 | | } |
160 | | return stream; |
161 | | } |
162 | | |
163 | | } /* namespace vcl */ |
164 | | |
165 | | #endif // INCLUDED_VCL_REGION_HXX |
166 | | |
167 | | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |