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>
31 namespace tools
{ class PolyPolygon
; }
32 namespace vcl
{ class Window
; }
36 typedef std::shared_ptr
< RegionBand
> RegionBandPtr
;
37 typedef std::shared_ptr
< tools::PolyPolygon
> PolyPolygonPtr
;
38 typedef std::shared_ptr
< basegfx::B2DPolyPolygon
> B2DPolyPolygonPtr
;
39 typedef std::vector
< Rectangle
> RectangleVector
;
43 class VCL_DLLPUBLIC Region
46 friend class ::OutputDevice
;
47 friend class ::vcl::Window
;
48 friend class ::Bitmap
;
51 B2DPolyPolygonPtr mpB2DPolyPolygon
;
52 PolyPolygonPtr mpPolyPolygon
;
53 RegionBandPtr mpRegionBand
;
59 SAL_DLLPRIVATE
void ImplCreatePolyPolyRegion( const tools::PolyPolygon
& rPolyPoly
);
60 SAL_DLLPRIVATE
void ImplCreatePolyPolyRegion( const basegfx::B2DPolyPolygon
& rPolyPoly
);
62 SAL_DLLPRIVATE
tools::PolyPolygon
ImplCreatePolyPolygonFromRegionBand() const;
63 SAL_DLLPRIVATE
basegfx::B2DPolyPolygon
ImplCreateB2DPolyPolygonFromRegionBand() const;
67 explicit Region(bool bIsNull
= false); // default creates empty region, with true a null region is created
68 explicit Region(const Rectangle
& rRect
);
69 explicit Region(const Polygon
& rPolygon
);
70 explicit Region(const tools::PolyPolygon
& rPolyPoly
);
71 explicit Region(const basegfx::B2DPolyPolygon
&);
72 Region(const vcl::Region
& rRegion
);
75 // direct access to contents
76 const basegfx::B2DPolyPolygon
* getB2DPolyPolygon() const { return mpB2DPolyPolygon
.get(); }
77 const tools::PolyPolygon
* getPolyPolygon() const { return mpPolyPolygon
.get(); }
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 const tools::PolyPolygon
GetAsPolyPolygon() const;
83 const basegfx::B2DPolyPolygon
GetAsB2DPolyPolygon() const;
84 const RegionBand
* GetAsRegionBand() const;
87 void Move( long nHorzMove
, long nVertMove
);
88 void Scale( double fScaleX
, double fScaleY
);
89 bool Union( const Rectangle
& rRegion
);
90 bool Intersect( const Rectangle
& rRegion
);
91 bool Exclude( const Rectangle
& rRegion
);
92 bool XOr( const Rectangle
& rRegion
);
93 bool Union( const vcl::Region
& rRegion
);
94 bool Intersect( const vcl::Region
& rRegion
);
95 bool Exclude( const vcl::Region
& rRegion
);
96 bool XOr( const vcl::Region
& rRegion
);
99 bool IsNull() const { return mbIsNull
;}
104 bool IsRectangle() const;
106 Rectangle
GetBoundRect() const;
107 bool HasPolyPolygonOrB2DPolyPolygon() const { return (getB2DPolyPolygon() || getPolyPolygon()); }
108 void GetRegionRectangles(RectangleVector
& rTarget
) const;
110 bool IsInside( const Point
& rPoint
) const;
111 bool IsInside( const Rectangle
& rRect
) const;
112 bool IsOver( const Rectangle
& rRect
) const;
114 vcl::Region
& operator=( const vcl::Region
& rRegion
);
115 vcl::Region
& operator=( const 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 VCL_DLLPUBLIC 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 } /* namespace vcl */
137 template< typename charT
, typename traits
>
138 inline std::basic_ostream
<charT
, traits
> & operator <<(
139 std::basic_ostream
<charT
, traits
> & stream
, const vcl::Region
& rRegion
)
141 if (rRegion
.IsEmpty())
142 return stream
<< "EMPTY";
143 if (rRegion
.getB2DPolyPolygon())
144 return stream
<< "B2DPolyPolygon("
145 << *rRegion
.getB2DPolyPolygon()
147 if (rRegion
.getPolyPolygon())
148 return stream
<< "unimplemented";
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 #endif // INCLUDED_VCL_REGION_HXX
165 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */