blob: 3a7ab58b6ef3df1e9dc2bff025c177d6aa6f2806 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _BGFX_RANGE_B2IRANGE_HXX
#define _BGFX_RANGE_B2IRANGE_HXX
#include <basegfx/point/b2ipoint.hxx>
#include <basegfx/point/b2dpoint.hxx>
#include <basegfx/tuple/b2ituple.hxx>
#include <basegfx/tuple/b2i64tuple.hxx>
#include <basegfx/range/basicrange.hxx>
#include <vector>
namespace basegfx
{
class B2IRange
{
public:
typedef sal_Int32 ValueType;
typedef Int32Traits TraitsType;
B2IRange()
{
}
explicit B2IRange(const B2ITuple& rTuple)
: maRangeX(rTuple.getX()),
maRangeY(rTuple.getY())
{
}
B2IRange(sal_Int32 x1,
sal_Int32 y1,
sal_Int32 x2,
sal_Int32 y2)
: maRangeX(x1),
maRangeY(y1)
{
maRangeX.expand(x2);
maRangeY.expand(y2);
}
B2IRange(const B2ITuple& rTuple1,
const B2ITuple& rTuple2)
: maRangeX(rTuple1.getX()),
maRangeY(rTuple1.getY())
{
expand( rTuple2 );
}
B2IRange(const B2IRange& rRange)
: maRangeX(rRange.maRangeX),
maRangeY(rRange.maRangeY)
{
}
bool isEmpty() const
{
return maRangeX.isEmpty() || maRangeY.isEmpty();
}
void reset()
{
maRangeX.reset();
maRangeY.reset();
}
bool operator==( const B2IRange& rRange ) const
{
return (maRangeX == rRange.maRangeX
&& maRangeY == rRange.maRangeY);
}
bool operator!=( const B2IRange& rRange ) const
{
return (maRangeX != rRange.maRangeX
|| maRangeY != rRange.maRangeY);
}
B2IRange& operator=(const B2IRange& rRange)
{
maRangeX = rRange.maRangeX;
maRangeY = rRange.maRangeY;
return *this;
}
sal_Int32 getMinX() const
{
return maRangeX.getMinimum();
}
sal_Int32 getMinY() const
{
return maRangeY.getMinimum();
}
sal_Int32 getMaxX() const
{
return maRangeX.getMaximum();
}
sal_Int32 getMaxY() const
{
return maRangeY.getMaximum();
}
sal_Int64 getWidth() const
{
return maRangeX.getRange();
}
sal_Int64 getHeight() const
{
return maRangeY.getRange();
}
B2IPoint getMinimum() const
{
return B2IPoint(
maRangeX.getMinimum(),
maRangeY.getMinimum()
);
}
B2IPoint getMaximum() const
{
return B2IPoint(
maRangeX.getMaximum(),
maRangeY.getMaximum()
);
}
B2I64Tuple getRange() const
{
return B2I64Tuple(
maRangeX.getRange(),
maRangeY.getRange()
);
}
B2DPoint getCenter() const
{
return B2DPoint(
maRangeX.getCenter(),
maRangeY.getCenter()
);
}
bool isInside(const B2ITuple& rTuple) const
{
return (
maRangeX.isInside(rTuple.getX())
&& maRangeY.isInside(rTuple.getY())
);
}
bool isInside(const B2IRange& rRange) const
{
return (
maRangeX.isInside(rRange.maRangeX)
&& maRangeY.isInside(rRange.maRangeY)
);
}
bool overlaps(const B2IRange& rRange) const
{
return (
maRangeX.overlaps(rRange.maRangeX)
&& maRangeY.overlaps(rRange.maRangeY)
);
}
void expand(const B2ITuple& rTuple)
{
maRangeX.expand(rTuple.getX());
maRangeY.expand(rTuple.getY());
}
void expand(const B2IRange& rRange)
{
maRangeX.expand(rRange.maRangeX);
maRangeY.expand(rRange.maRangeY);
}
void intersect(const B2IRange& rRange)
{
maRangeX.intersect(rRange.maRangeX);
maRangeY.intersect(rRange.maRangeY);
}
void grow(sal_Int32 nValue)
{
maRangeX.grow(nValue);
maRangeY.grow(nValue);
}
private:
typedef ::basegfx::BasicRange< ValueType, TraitsType > MyBasicRange;
MyBasicRange maRangeX;
MyBasicRange maRangeY;
};
/** Compute the set difference of the two given ranges
This method calculates the symmetric difference (aka XOR)
between the two given ranges, and returning the resulting
ranges. Thus, the result will contain all areas where one, but
not both ranges lie.
@param o_rResult
Result vector. The up to four difference ranges are returned
within this vector
@param rFirst
The first range
@param rSecond
The second range
@return the input vector
*/
::std::vector< B2IRange >& computeSetDifference( ::std::vector< B2IRange >& o_rResult,
const B2IRange& rFirst,
const B2IRange& rSecond );
} // end of namespace basegfx
#endif /* _BGFX_RANGE_B2IRANGE_HXX */