1ce9c7ef7SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3ce9c7ef7SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4ce9c7ef7SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5ce9c7ef7SAndrew Rist  * distributed with this work for additional information
6ce9c7ef7SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7ce9c7ef7SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8ce9c7ef7SAndrew Rist  * "License"); you may not use this file except in compliance
9ce9c7ef7SAndrew Rist  * with the License.  You may obtain a copy of the License at
10ce9c7ef7SAndrew Rist  *
11ce9c7ef7SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12ce9c7ef7SAndrew Rist  *
13ce9c7ef7SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14ce9c7ef7SAndrew Rist  * software distributed under the License is distributed on an
15ce9c7ef7SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16ce9c7ef7SAndrew Rist  * KIND, either express or implied.  See the License for the
17ce9c7ef7SAndrew Rist  * specific language governing permissions and limitations
18ce9c7ef7SAndrew Rist  * under the License.
19ce9c7ef7SAndrew Rist  *
20ce9c7ef7SAndrew Rist  *************************************************************/
21ce9c7ef7SAndrew Rist 
22ce9c7ef7SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef _BGFX_RANGE_B2DRANGE_HXX
25cdf0e10cSrcweir #define _BGFX_RANGE_B2DRANGE_HXX
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <basegfx/vector/b2dvector.hxx>
28cdf0e10cSrcweir #include <basegfx/point/b2dpoint.hxx>
29cdf0e10cSrcweir #include <basegfx/tuple/b2dtuple.hxx>
30cdf0e10cSrcweir #include <basegfx/range/basicrange.hxx>
31cdf0e10cSrcweir #include <vector>
32*b63233d8Sdamjan #include <basegfx/basegfxdllapi.h>
33cdf0e10cSrcweir 
34cdf0e10cSrcweir 
35cdf0e10cSrcweir namespace basegfx
36cdf0e10cSrcweir {
37cdf0e10cSrcweir 	// predeclarations
38cdf0e10cSrcweir 	class B2IRange;
39cdf0e10cSrcweir 	class B2DHomMatrix;
40cdf0e10cSrcweir 
41cdf0e10cSrcweir 	class B2DRange
42cdf0e10cSrcweir 	{
43cdf0e10cSrcweir 	public:
44cdf0e10cSrcweir         typedef double 			ValueType;
45cdf0e10cSrcweir         typedef DoubleTraits 	TraitsType;
46cdf0e10cSrcweir 
B2DRange()47cdf0e10cSrcweir 		B2DRange()
48cdf0e10cSrcweir 		{
49cdf0e10cSrcweir 		}
50cdf0e10cSrcweir 
B2DRange(const B2DTuple & rTuple)51cdf0e10cSrcweir 		explicit B2DRange(const B2DTuple& rTuple)
52cdf0e10cSrcweir 		:	maRangeX(rTuple.getX()),
53cdf0e10cSrcweir 			maRangeY(rTuple.getY())
54cdf0e10cSrcweir 		{
55cdf0e10cSrcweir 		}
56cdf0e10cSrcweir 
B2DRange(double x1,double y1,double x2,double y2)57cdf0e10cSrcweir 		B2DRange(double x1,
58cdf0e10cSrcweir                  double y1,
59cdf0e10cSrcweir                  double x2,
60cdf0e10cSrcweir                  double y2)
61cdf0e10cSrcweir 		:	maRangeX(x1),
62cdf0e10cSrcweir 			maRangeY(y1)
63cdf0e10cSrcweir 		{
64cdf0e10cSrcweir 			maRangeX.expand(x2);
65cdf0e10cSrcweir 			maRangeY.expand(y2);
66cdf0e10cSrcweir 		}
67cdf0e10cSrcweir 
B2DRange(const B2DTuple & rTuple1,const B2DTuple & rTuple2)68cdf0e10cSrcweir 		B2DRange(const B2DTuple& rTuple1,
69cdf0e10cSrcweir                  const B2DTuple& rTuple2)
70cdf0e10cSrcweir 		:	maRangeX(rTuple1.getX()),
71cdf0e10cSrcweir 			maRangeY(rTuple1.getY())
72cdf0e10cSrcweir 		{
73cdf0e10cSrcweir             expand( rTuple2 );
74cdf0e10cSrcweir 		}
75cdf0e10cSrcweir 
B2DRange(const B2DRange & rRange)76cdf0e10cSrcweir 		B2DRange(const B2DRange& rRange)
77cdf0e10cSrcweir 		:	maRangeX(rRange.maRangeX),
78cdf0e10cSrcweir 			maRangeY(rRange.maRangeY)
79cdf0e10cSrcweir 		{
80cdf0e10cSrcweir 		}
81cdf0e10cSrcweir 
82*b63233d8Sdamjan 		BASEGFX_DLLPUBLIC explicit B2DRange(const B2IRange& rRange);
83cdf0e10cSrcweir 
isEmpty() const84cdf0e10cSrcweir 		bool isEmpty() const
85cdf0e10cSrcweir 		{
86cdf0e10cSrcweir 			return (
87cdf0e10cSrcweir 				maRangeX.isEmpty()
88cdf0e10cSrcweir 				|| maRangeY.isEmpty()
89cdf0e10cSrcweir 				);
90cdf0e10cSrcweir 		}
91cdf0e10cSrcweir 
reset()92cdf0e10cSrcweir 		void reset()
93cdf0e10cSrcweir 		{
94cdf0e10cSrcweir 			maRangeX.reset();
95cdf0e10cSrcweir 			maRangeY.reset();
96cdf0e10cSrcweir 		}
97cdf0e10cSrcweir 
operator ==(const B2DRange & rRange) const98cdf0e10cSrcweir 		bool operator==( const B2DRange& rRange ) const
99cdf0e10cSrcweir 		{
100cdf0e10cSrcweir 			return (maRangeX == rRange.maRangeX
101cdf0e10cSrcweir 				&& maRangeY == rRange.maRangeY);
102cdf0e10cSrcweir 		}
103cdf0e10cSrcweir 
operator !=(const B2DRange & rRange) const104cdf0e10cSrcweir 		bool operator!=( const B2DRange& rRange ) const
105cdf0e10cSrcweir 		{
106cdf0e10cSrcweir 			return (maRangeX != rRange.maRangeX
107cdf0e10cSrcweir 				|| maRangeY != rRange.maRangeY);
108cdf0e10cSrcweir 		}
109cdf0e10cSrcweir 
operator =(const B2DRange & rRange)110cdf0e10cSrcweir 		B2DRange& operator=(const B2DRange& rRange)
111cdf0e10cSrcweir 		{
112cdf0e10cSrcweir 			maRangeX = rRange.maRangeX;
113cdf0e10cSrcweir 			maRangeY = rRange.maRangeY;
114cdf0e10cSrcweir 			return *this;
115cdf0e10cSrcweir 		}
116cdf0e10cSrcweir 
equal(const B2DRange & rRange) const117cdf0e10cSrcweir 		bool equal(const B2DRange& rRange) const
118cdf0e10cSrcweir         {
119cdf0e10cSrcweir 			return (maRangeX.equal(rRange.maRangeX)
120cdf0e10cSrcweir                     && maRangeY.equal(rRange.maRangeY));
121cdf0e10cSrcweir         }
122cdf0e10cSrcweir 
getMinX() const123cdf0e10cSrcweir         double getMinX() const
124cdf0e10cSrcweir         {
125cdf0e10cSrcweir             return maRangeX.getMinimum();
126cdf0e10cSrcweir         }
127cdf0e10cSrcweir 
getMinY() const128cdf0e10cSrcweir         double getMinY() const
129cdf0e10cSrcweir         {
130cdf0e10cSrcweir             return maRangeY.getMinimum();
131cdf0e10cSrcweir         }
132cdf0e10cSrcweir 
getMaxX() const133cdf0e10cSrcweir         double getMaxX() const
134cdf0e10cSrcweir         {
135cdf0e10cSrcweir             return maRangeX.getMaximum();
136cdf0e10cSrcweir         }
137cdf0e10cSrcweir 
getMaxY() const138cdf0e10cSrcweir         double getMaxY() const
139cdf0e10cSrcweir         {
140cdf0e10cSrcweir             return maRangeY.getMaximum();
141cdf0e10cSrcweir         }
142cdf0e10cSrcweir 
getWidth() const143cdf0e10cSrcweir         double getWidth() const
144cdf0e10cSrcweir         {
145cdf0e10cSrcweir             return maRangeX.getRange();
146cdf0e10cSrcweir         }
147cdf0e10cSrcweir 
getHeight() const148cdf0e10cSrcweir         double getHeight() const
149cdf0e10cSrcweir         {
150cdf0e10cSrcweir             return maRangeY.getRange();
151cdf0e10cSrcweir         }
152cdf0e10cSrcweir 
getMinimum() const153cdf0e10cSrcweir 		B2DPoint getMinimum() const
154cdf0e10cSrcweir 		{
155cdf0e10cSrcweir 			return B2DPoint(
156cdf0e10cSrcweir 				maRangeX.getMinimum(),
157cdf0e10cSrcweir 				maRangeY.getMinimum()
158cdf0e10cSrcweir 				);
159cdf0e10cSrcweir 		}
160cdf0e10cSrcweir 
getMaximum() const161cdf0e10cSrcweir 		B2DPoint getMaximum() const
162cdf0e10cSrcweir 		{
163cdf0e10cSrcweir 			return B2DPoint(
164cdf0e10cSrcweir 				maRangeX.getMaximum(),
165cdf0e10cSrcweir 				maRangeY.getMaximum()
166cdf0e10cSrcweir 				);
167cdf0e10cSrcweir 		}
168cdf0e10cSrcweir 
getRange() const169cdf0e10cSrcweir 		B2DVector getRange() const
170cdf0e10cSrcweir 		{
171cdf0e10cSrcweir 			return B2DVector(
172cdf0e10cSrcweir 				maRangeX.getRange(),
173cdf0e10cSrcweir 				maRangeY.getRange()
174cdf0e10cSrcweir 				);
175cdf0e10cSrcweir 		}
176cdf0e10cSrcweir 
getCenter() const177cdf0e10cSrcweir 		B2DPoint getCenter() const
178cdf0e10cSrcweir 		{
179cdf0e10cSrcweir 			return B2DPoint(
180cdf0e10cSrcweir 				maRangeX.getCenter(),
181cdf0e10cSrcweir 				maRangeY.getCenter()
182cdf0e10cSrcweir 				);
183cdf0e10cSrcweir 		}
184cdf0e10cSrcweir 
getCenterX() const185cdf0e10cSrcweir 		double getCenterX() const
186cdf0e10cSrcweir 		{
187cdf0e10cSrcweir 			return maRangeX.getCenter();
188cdf0e10cSrcweir 		}
189cdf0e10cSrcweir 
getCenterY() const190cdf0e10cSrcweir 		double getCenterY() const
191cdf0e10cSrcweir 		{
192cdf0e10cSrcweir 			return maRangeY.getCenter();
193cdf0e10cSrcweir 		}
194cdf0e10cSrcweir 
isInside(const B2DTuple & rTuple) const195cdf0e10cSrcweir 		bool isInside(const B2DTuple& rTuple) const
196cdf0e10cSrcweir 		{
197cdf0e10cSrcweir 			return (
198cdf0e10cSrcweir 				maRangeX.isInside(rTuple.getX())
199cdf0e10cSrcweir 				&& maRangeY.isInside(rTuple.getY())
200cdf0e10cSrcweir 				);
201cdf0e10cSrcweir 		}
202cdf0e10cSrcweir 
isInside(const B2DRange & rRange) const203cdf0e10cSrcweir 		bool isInside(const B2DRange& rRange) const
204cdf0e10cSrcweir 		{
205cdf0e10cSrcweir 			return (
206cdf0e10cSrcweir 				maRangeX.isInside(rRange.maRangeX)
207cdf0e10cSrcweir 				&& maRangeY.isInside(rRange.maRangeY)
208cdf0e10cSrcweir 				);
209cdf0e10cSrcweir 		}
210cdf0e10cSrcweir 
overlaps(const B2DRange & rRange) const211cdf0e10cSrcweir 		bool overlaps(const B2DRange& rRange) const
212cdf0e10cSrcweir 		{
213cdf0e10cSrcweir 			return (
214cdf0e10cSrcweir 				maRangeX.overlaps(rRange.maRangeX)
215cdf0e10cSrcweir 				&& maRangeY.overlaps(rRange.maRangeY)
216cdf0e10cSrcweir 				);
217cdf0e10cSrcweir 		}
218cdf0e10cSrcweir 
overlapsMore(const B2DRange & rRange) const219cdf0e10cSrcweir 		bool overlapsMore(const B2DRange& rRange) const
220cdf0e10cSrcweir 		{
221cdf0e10cSrcweir 			return (
222cdf0e10cSrcweir 				maRangeX.overlapsMore(rRange.maRangeX)
223cdf0e10cSrcweir 				&& maRangeY.overlapsMore(rRange.maRangeY)
224cdf0e10cSrcweir 				);
225cdf0e10cSrcweir 		}
226cdf0e10cSrcweir 
expand(const B2DTuple & rTuple)227cdf0e10cSrcweir 		void expand(const B2DTuple& rTuple)
228cdf0e10cSrcweir 		{
229cdf0e10cSrcweir 			maRangeX.expand(rTuple.getX());
230cdf0e10cSrcweir 			maRangeY.expand(rTuple.getY());
231cdf0e10cSrcweir 		}
232cdf0e10cSrcweir 
expand(const B2DRange & rRange)233cdf0e10cSrcweir 		void expand(const B2DRange& rRange)
234cdf0e10cSrcweir 		{
235cdf0e10cSrcweir 			maRangeX.expand(rRange.maRangeX);
236cdf0e10cSrcweir 			maRangeY.expand(rRange.maRangeY);
237cdf0e10cSrcweir 		}
238cdf0e10cSrcweir 
intersect(const B2DRange & rRange)239cdf0e10cSrcweir 		void intersect(const B2DRange& rRange)
240cdf0e10cSrcweir 		{
241cdf0e10cSrcweir 			maRangeX.intersect(rRange.maRangeX);
242cdf0e10cSrcweir 			maRangeY.intersect(rRange.maRangeY);
243cdf0e10cSrcweir 		}
244cdf0e10cSrcweir 
grow(double fValue)245cdf0e10cSrcweir 		void grow(double fValue)
246cdf0e10cSrcweir 		{
247cdf0e10cSrcweir 			maRangeX.grow(fValue);
248cdf0e10cSrcweir 			maRangeY.grow(fValue);
249cdf0e10cSrcweir 		}
250cdf0e10cSrcweir 
251*b63233d8Sdamjan 		BASEGFX_DLLPUBLIC void transform(const B2DHomMatrix& rMatrix);
252cdf0e10cSrcweir 
253cdf0e10cSrcweir 	private:
254cdf0e10cSrcweir         typedef ::basegfx::BasicRange< ValueType, TraitsType >	MyBasicRange;
255cdf0e10cSrcweir 
256cdf0e10cSrcweir 		MyBasicRange		maRangeX;
257cdf0e10cSrcweir 		MyBasicRange		maRangeY;
258cdf0e10cSrcweir 	};
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 	/** Round double to nearest integer for 2D range
261cdf0e10cSrcweir 
262cdf0e10cSrcweir 		@return the nearest integer for this range
263cdf0e10cSrcweir 	*/
264*b63233d8Sdamjan 	BASEGFX_DLLPUBLIC B2IRange fround(const B2DRange& rRange);
265cdf0e10cSrcweir 
266cdf0e10cSrcweir     /** Compute the set difference of the two given ranges
267cdf0e10cSrcweir 
268cdf0e10cSrcweir     	This method calculates the symmetric difference (aka XOR)
269cdf0e10cSrcweir     	between the two given ranges, and returning the resulting
270cdf0e10cSrcweir     	ranges. Thus, the result will contain all areas where one, but
271cdf0e10cSrcweir     	not both ranges lie.
272cdf0e10cSrcweir 
273cdf0e10cSrcweir     	@param o_rResult
274cdf0e10cSrcweir         Result vector. The up to four difference ranges are returned
275cdf0e10cSrcweir         within this vector
276cdf0e10cSrcweir 
277cdf0e10cSrcweir         @param rFirst
278cdf0e10cSrcweir         The first range
279cdf0e10cSrcweir 
280cdf0e10cSrcweir         @param rSecond
281cdf0e10cSrcweir         The second range
282cdf0e10cSrcweir 
283cdf0e10cSrcweir         @return the input vector
284cdf0e10cSrcweir      */
285*b63233d8Sdamjan     BASEGFX_DLLPUBLIC ::std::vector< B2DRange >& computeSetDifference( ::std::vector< B2DRange >&	o_rResult,
286cdf0e10cSrcweir                                                      const B2DRange&			rFirst,
287cdf0e10cSrcweir                                                      const B2DRange&			rSecond );
288cdf0e10cSrcweir 
289cdf0e10cSrcweir } // end of namespace basegfx
290cdf0e10cSrcweir 
291cdf0e10cSrcweir 
292cdf0e10cSrcweir #endif /* _BGFX_RANGE_B2DRANGE_HXX */
293