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 .
25 #include <basegfx/basegfxdllapi.h>
26 #include <basegfx/vector/b2dvector.hxx>
27 #include <basegfx/point/b2dpoint.hxx>
28 #include <basegfx/range/basicrange.hxx>
29 #include <basegfx/range/Range2D.hxx>
36 /** A two-dimensional interval over doubles
38 This is a set of real numbers, bounded by a lower and an upper
39 pair. All inbetween values are included in the set (see also
40 http://en.wikipedia.org/wiki/Interval_%28mathematics%29).
42 The set is closed, i.e. the upper and the lower bound are
43 included (if you're used to the notation - we're talking about
44 [a,b] here, compared to half-open [a,b) or open intervals
47 That means, isInside(val) will return true also for values of
52 class SAL_WARN_UNUSED B2DRange
: public Range2D
<double, DoubleTraits
>
59 /// Create degenerate interval consisting of a single point
60 explicit B2DRange(const Tuple2D
<ValueType
>& rTuple
)
65 /// Create proper interval between the two given points
66 B2DRange(const Tuple2D
<ValueType
>& rTuple1
,
67 const Tuple2D
<ValueType
>& rTuple2
)
68 : Range2D(rTuple1
, rTuple2
)
72 B2DRange(ValueType x1
, ValueType y1
, ValueType x2
, ValueType y2
)
73 : Range2D(x1
, y1
, x2
, y2
)
76 BASEGFX_DLLPUBLIC
explicit B2DRange(const B2IRange
& rRange
);
78 /// get lower bound of the set. returns arbitrary values for empty sets.
79 B2DPoint
getMinimum() const
82 maRangeX
.getMinimum(),
87 /// get upper bound of the set. returns arbitrary values for empty sets.
88 B2DPoint
getMaximum() const
91 maRangeX
.getMaximum(),
96 /// return difference between upper and lower point. returns (0,0) for empty sets.
97 B2DVector
getRange() const
105 /// return center point of set. returns (0,0) for empty sets.
106 B2DPoint
getCenter() const
109 maRangeX
.getCenter(),
114 /** Transform Range by given transformation matrix. */
115 BASEGFX_DLLPUBLIC
void transform(const B2DHomMatrix
& rMatrix
);
117 /** Transform Range by given transformation matrix.
119 This operation transforms the Range by transforming all four possible
120 extrema points (corners) of the given range and building a new one.
121 This means that the range will grow evtl. when a shear and/or rotation
122 is part of the transformation.
124 BASEGFX_DLLPUBLIC B2DRange
& operator*=( const ::basegfx::B2DHomMatrix
& rMat
);
126 /** Get a range filled with (0.0, 0.0, 1.0, 1.0) */
127 BASEGFX_DLLPUBLIC
static const B2DRange
& getUnitB2DRange();
130 /** Transform B2DRange by given transformation matrix (see operator*=())
132 B2DRange
operator*( const B2DHomMatrix
& rMat
, const B2DRange
& rB2DRange
);
134 /** Round double to nearest integer for 2D range
136 @return the nearest integer for this range
138 BASEGFX_DLLPUBLIC B2IRange
fround(const B2DRange
& rRange
);
140 /** Compute the set difference of the two given ranges
142 This method calculates the symmetric difference (aka XOR)
143 between the two given ranges, and returning the resulting
144 ranges. Thus, the result will contain all areas where one, but
148 Result vector. The up to four difference ranges are returned
157 @return the input vector
159 BASEGFX_DLLPUBLIC
std::vector
<B2DRange
>& computeSetDifference(
160 std::vector
<B2DRange
>& o_rResult
,
161 const B2DRange
& rFirst
,
162 const B2DRange
& rSecond
);
164 /** Write to char stream */
165 template<typename charT
, typename traits
>
166 inline std::basic_ostream
<charT
, traits
>& operator<<(
167 std::basic_ostream
<charT
, traits
>& stream
, const B2DRange
& range
)
169 return stream
<< range
.getWidth() << "x" << range
.getHeight() << "@" << range
.getMinimum();
172 } // end of namespace basegfx
174 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */