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