1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #ifndef INCLUDED_VCL_REGION_HXX
21 #define INCLUDED_VCL_REGION_HXX
23 #include <tools/gen.hxx>
24 #include <tools/poly.hxx>
25 #include <vcl/dllapi.h>
26 #include <basegfx/polygon/b2dpolypolygon.hxx>
32 namespace vcl
{ class Window
; }
36 typedef std::vector
< tools::Rectangle
> RectangleVector
;
40 class SAL_WARN_UNUSED VCL_DLLPUBLIC Region
43 friend class ::OutputDevice
;
44 friend class ::vcl::Window
;
45 friend class ::Bitmap
;
48 std::optional
< basegfx::B2DPolyPolygon
>
50 std::optional
< tools::PolyPolygon
>
52 std::shared_ptr
< RegionBand
>
58 SAL_DLLPRIVATE
void ImplCreatePolyPolyRegion( const tools::PolyPolygon
& rPolyPoly
);
59 SAL_DLLPRIVATE
void ImplCreatePolyPolyRegion( const basegfx::B2DPolyPolygon
& rPolyPoly
);
61 SAL_DLLPRIVATE
tools::PolyPolygon
ImplCreatePolyPolygonFromRegionBand() const;
62 SAL_DLLPRIVATE
basegfx::B2DPolyPolygon
ImplCreateB2DPolyPolygonFromRegionBand() const;
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
;
75 // direct access to contents
76 const std::optional
<basegfx::B2DPolyPolygon
>& getB2DPolyPolygon() const { return mpB2DPolyPolygon
; }
77 const std::optional
<tools::PolyPolygon
>& getPolyPolygon() const { return mpPolyPolygon
; }
78 const RegionBand
* getRegionBand() const { return mpRegionBand
.get(); }
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;
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
);
99 bool IsNull() const { return mbIsNull
;}
104 bool IsRectangle() const;
106 tools::Rectangle
GetBoundRect() const;
107 bool HasPolyPolygonOrB2DPolyPolygon() const { return (getB2DPolyPolygon() || getPolyPolygon()); }
108 void GetRegionRectangles(RectangleVector
& rTarget
) const;
110 bool Contains( const Point
& rPoint
) const;
111 bool Overlaps( const tools::Rectangle
& rRect
) const;
113 vcl::Region
& operator=( const vcl::Region
& rRegion
);
114 vcl::Region
& operator=( vcl::Region
&& rRegion
) noexcept
;
115 vcl::Region
& operator=( const tools::Rectangle
& rRect
);
117 bool operator==( const vcl::Region
& rRegion
) const;
118 bool operator!=( const vcl::Region
& rRegion
) const { return !(Region::operator==( rRegion
)); }
120 friend VCL_DLLPUBLIC SvStream
& ReadRegion( SvStream
& rIStm
, vcl::Region
& rRegion
);
121 friend SvStream
& WriteRegion( SvStream
& rOStm
, const vcl::Region
& rRegion
);
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
132 static vcl::Region
GetRegionFromPolyPolygon( const tools::PolyPolygon
& rPolyPoly
);
135 template< typename charT
, typename traits
>
136 inline std::basic_ostream
<charT
, traits
> & operator <<(
137 std::basic_ostream
<charT
, traits
> & stream
, const Region
& rRegion
)
139 if (rRegion
.IsEmpty())
140 return stream
<< "EMPTY";
141 if (rRegion
.getB2DPolyPolygon())
142 return stream
<< "B2DPolyPolygon("
143 << *rRegion
.getB2DPolyPolygon()
145 if (rRegion
.getPolyPolygon())
146 return stream
<< "PolyPolygon("
147 << *rRegion
.getPolyPolygon()
149 if (rRegion
.getRegionBand())
150 { // inlined because RegionBand is private to vcl
151 stream
<< "RegionBand(";
152 RectangleVector rects
;
153 rRegion
.GetRegionRectangles(rects
);
156 for (size_t i
= 0; i
< rects
.size(); ++i
)
157 stream
<< "[" << i
<< "] " << rects
[i
];
163 } /* namespace vcl */
165 #endif // INCLUDED_VCL_REGION_HXX
167 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */