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 <vcl/dllapi.h>
25 #include <basegfx/polygon/b2dpolypolygon.hxx>
35 namespace vcl
{ class Window
; }
39 typedef std::vector
< tools::Rectangle
> RectangleVector
;
43 class SAL_WARN_UNUSED VCL_DLLPUBLIC Region
46 friend class ::OutputDevice
;
47 friend class ::vcl::Window
;
48 friend class ::Bitmap
;
51 std::shared_ptr
< basegfx::B2DPolyPolygon
>
53 std::shared_ptr
< tools::PolyPolygon
>
55 std::shared_ptr
< RegionBand
>
61 SAL_DLLPRIVATE
void ImplCreatePolyPolyRegion( const tools::PolyPolygon
& rPolyPoly
);
62 SAL_DLLPRIVATE
void ImplCreatePolyPolyRegion( const basegfx::B2DPolyPolygon
& rPolyPoly
);
64 SAL_DLLPRIVATE
tools::PolyPolygon
ImplCreatePolyPolygonFromRegionBand() const;
65 SAL_DLLPRIVATE
basegfx::B2DPolyPolygon
ImplCreateB2DPolyPolygonFromRegionBand() const;
69 explicit Region(bool bIsNull
= false); // default creates empty region, with true a null region is created
70 explicit Region(const tools::Rectangle
& rRect
);
71 explicit Region(const tools::Polygon
& rPolygon
);
72 explicit Region(const tools::PolyPolygon
& rPolyPoly
);
73 explicit Region(const basegfx::B2DPolyPolygon
&);
74 Region(const vcl::Region
& rRegion
);
75 Region(vcl::Region
&& rRegion
) noexcept
;
78 // direct access to contents
79 const basegfx::B2DPolyPolygon
* getB2DPolyPolygon() const { return mpB2DPolyPolygon
.get(); }
80 const tools::PolyPolygon
* getPolyPolygon() const { return mpPolyPolygon
.get(); }
81 const RegionBand
* getRegionBand() const { return mpRegionBand
.get(); }
83 // access with converters, the asked data will be created from the most
84 // valuable data, buffered and returned
85 tools::PolyPolygon
GetAsPolyPolygon() const;
86 basegfx::B2DPolyPolygon
GetAsB2DPolyPolygon() const;
87 const RegionBand
* GetAsRegionBand() const;
90 void Move( tools::Long nHorzMove
, tools::Long nVertMove
);
91 void Scale( double fScaleX
, double fScaleY
);
92 void Union( const tools::Rectangle
& rRegion
);
93 void Intersect( const tools::Rectangle
& rRegion
);
94 void Exclude( const tools::Rectangle
& rRegion
);
95 void XOr( const tools::Rectangle
& rRegion
);
96 void Union( const vcl::Region
& rRegion
);
97 void Intersect( const vcl::Region
& rRegion
);
98 void Exclude( const vcl::Region
& rRegion
);
99 bool XOr( const vcl::Region
& rRegion
);
101 bool IsEmpty() const;
102 bool IsNull() const { return mbIsNull
;}
107 bool IsRectangle() const;
109 tools::Rectangle
GetBoundRect() const;
110 bool HasPolyPolygonOrB2DPolyPolygon() const { return (getB2DPolyPolygon() || getPolyPolygon()); }
111 void GetRegionRectangles(RectangleVector
& rTarget
) const;
113 bool IsInside( const Point
& rPoint
) const;
114 bool IsOver( const tools::Rectangle
& rRect
) const;
116 vcl::Region
& operator=( const vcl::Region
& rRegion
);
117 vcl::Region
& operator=( vcl::Region
&& rRegion
) noexcept
;
118 vcl::Region
& operator=( const tools::Rectangle
& rRect
);
120 bool operator==( const vcl::Region
& rRegion
) const;
121 bool operator!=( const vcl::Region
& rRegion
) const { return !(Region::operator==( rRegion
)); }
123 friend VCL_DLLPUBLIC SvStream
& ReadRegion( SvStream
& rIStm
, vcl::Region
& rRegion
);
124 friend VCL_DLLPUBLIC SvStream
& WriteRegion( SvStream
& rOStm
, const vcl::Region
& rRegion
);
126 /* workaround: faster conversion for PolyPolygons
127 * if half of the Polygons contained in rPolyPoly are actually
128 * rectangles, then the returned vcl::Region will be constructed by
129 * XOr'ing the contained Polygons together; in the case of
130 * only Rectangles this can be up to eight times faster than
131 * Region( const tools::PolyPolygon& ).
132 * Caution: this is only useful if the vcl::Region is known to be
133 * changed to rectangles; e.g. if being set as clip region
135 static vcl::Region
GetRegionFromPolyPolygon( const tools::PolyPolygon
& rPolyPoly
);
138 template< typename charT
, typename traits
>
139 inline std::basic_ostream
<charT
, traits
> & operator <<(
140 std::basic_ostream
<charT
, traits
> & stream
, const Region
& rRegion
)
142 if (rRegion
.IsEmpty())
143 return stream
<< "EMPTY";
144 if (rRegion
.getB2DPolyPolygon())
145 return stream
<< "B2DPolyPolygon("
146 << *rRegion
.getB2DPolyPolygon()
148 if (rRegion
.getPolyPolygon())
149 return stream
<< "unimplemented";
150 if (rRegion
.getRegionBand())
151 { // inlined because RegionBand is private to vcl
152 stream
<< "RegionBand(";
153 RectangleVector rects
;
154 rRegion
.GetRegionRectangles(rects
);
157 for (size_t i
= 0; i
< rects
.size(); ++i
)
158 stream
<< "[" << i
<< "] " << rects
[i
];
164 } /* namespace vcl */
166 #endif // INCLUDED_VCL_REGION_HXX
168 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */