2010-10-14 08:27:31 +02:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
2012-07-11 09:51:50 +01:00
|
|
|
/*
|
|
|
|
* This file is part of the LibreOffice project.
|
2007-04-11 19:12:02 +00:00
|
|
|
*
|
2012-07-11 09:51:50 +01:00
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
2007-04-11 19:12:02 +00:00
|
|
|
*
|
2012-07-11 09:51:50 +01:00
|
|
|
* This file incorporates work covered by the following license notice:
|
2007-04-11 19:12:02 +00:00
|
|
|
*
|
2012-07-11 09:51:50 +01:00
|
|
|
* 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 .
|
|
|
|
*/
|
2013-10-23 19:15:52 +02:00
|
|
|
#ifndef INCLUDED_TOOLS_GEN_HXX
|
|
|
|
#define INCLUDED_TOOLS_GEN_HXX
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2013-11-09 15:37:43 -06:00
|
|
|
#include <tools/toolsdllapi.h>
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2007-04-25 14:21:13 +00:00
|
|
|
#include <limits.h>
|
2014-07-08 01:05:33 +03:00
|
|
|
#include <algorithm>
|
2012-11-21 18:24:28 +01:00
|
|
|
#include <ostream>
|
2007-04-25 14:21:13 +00:00
|
|
|
|
2007-04-11 19:12:02 +00:00
|
|
|
class SvStream;
|
2015-02-17 15:28:31 +01:00
|
|
|
namespace rtl
|
|
|
|
{
|
|
|
|
class OString;
|
|
|
|
}
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2014-02-24 12:25:02 +01:00
|
|
|
enum TriState { TRISTATE_FALSE, TRISTATE_TRUE, TRISTATE_INDET };
|
|
|
|
|
2018-05-16 08:50:47 +01:00
|
|
|
// Pair
|
|
|
|
|
|
|
|
class SAL_WARN_UNUSED Pair
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Pair() : nA(0), nB(0) {}
|
|
|
|
Pair( long _nA, long _nB ) : nA(_nA), nB(_nB) {}
|
|
|
|
|
|
|
|
long A() const { return nA; }
|
|
|
|
long B() const { return nB; }
|
|
|
|
|
|
|
|
long& A() { return nA; }
|
|
|
|
long& B() { return nB; }
|
|
|
|
|
|
|
|
TOOLS_DLLPUBLIC rtl::OString toString() const;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
long nA;
|
|
|
|
long nB;
|
|
|
|
};
|
|
|
|
|
|
|
|
namespace tools { namespace detail {
|
|
|
|
|
|
|
|
// Used to implement operator == for subclasses of Pair:
|
|
|
|
inline bool equal(Pair const & p1, Pair const & p2)
|
|
|
|
{
|
|
|
|
return p1.A() == p2.A() && p1.B() == p2.B();
|
|
|
|
}
|
|
|
|
|
|
|
|
} }
|
|
|
|
|
2012-08-13 22:51:30 +02:00
|
|
|
// Point
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-02-23 15:52:25 +02:00
|
|
|
class Size;
|
2018-02-09 10:49:54 +02:00
|
|
|
class SAL_WARN_UNUSED SAL_DLLPUBLIC_EXPORT Point final : protected Pair
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
public:
|
2015-08-20 16:46:41 +02:00
|
|
|
Point() {}
|
2018-04-07 11:45:13 +02:00
|
|
|
Point( long nX, long nY ) : Pair( nX, nY ) {}
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
long X() const { return nA; }
|
|
|
|
long Y() const { return nB; }
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
void Move( long nHorzMove, long nVertMove );
|
2018-02-23 15:52:25 +02:00
|
|
|
void Move( Size const & s );
|
2018-04-07 11:45:13 +02:00
|
|
|
long AdjustX( long nHorzMove ) { nA += nHorzMove; return nA; }
|
|
|
|
long AdjustY( long nVertMove ) { nB += nVertMove; return nB; }
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
void RotateAround( long& rX, long& rY, short nOrientation ) const;
|
2018-02-27 17:12:50 +02:00
|
|
|
void RotateAround( Point&, short nOrientation ) const;
|
2014-11-01 21:33:09 +11:00
|
|
|
|
2007-04-11 19:12:02 +00:00
|
|
|
Point& operator += ( const Point& rPoint );
|
|
|
|
Point& operator -= ( const Point& rPoint );
|
2018-04-07 11:45:13 +02:00
|
|
|
Point& operator *= ( const long nVal );
|
|
|
|
Point& operator /= ( const long nVal );
|
2007-04-11 19:12:02 +00:00
|
|
|
|
|
|
|
friend inline Point operator+( const Point &rVal1, const Point &rVal2 );
|
|
|
|
friend inline Point operator-( const Point &rVal1, const Point &rVal2 );
|
2018-04-07 11:45:13 +02:00
|
|
|
friend inline Point operator*( const Point &rVal1, const long nVal2 );
|
|
|
|
friend inline Point operator/( const Point &rVal1, const long nVal2 );
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
long getX() const { return X(); }
|
|
|
|
long getY() const { return Y(); }
|
|
|
|
void setX(long nX) { nA = nX; }
|
|
|
|
void setY(long nY) { nB = nY; }
|
2018-02-09 10:49:54 +02:00
|
|
|
|
|
|
|
Pair const & toPair() const { return *this; }
|
|
|
|
Pair & toPair() { return *this; }
|
|
|
|
|
|
|
|
using Pair::toString;
|
2007-04-11 19:12:02 +00:00
|
|
|
};
|
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
inline void Point::Move( long nHorzMove, long nVertMove )
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
nA += nHorzMove;
|
|
|
|
nB += nVertMove;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline Point& Point::operator += ( const Point& rPoint )
|
|
|
|
{
|
|
|
|
nA += rPoint.nA;
|
|
|
|
nB += rPoint.nB;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline Point& Point::operator -= ( const Point& rPoint )
|
|
|
|
{
|
|
|
|
nA -= rPoint.nA;
|
|
|
|
nB -= rPoint.nB;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
inline Point& Point::operator *= ( const long nVal )
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
nA *= nVal;
|
|
|
|
nB *= nVal;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
inline Point& Point::operator /= ( const long nVal )
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
nA /= nVal;
|
|
|
|
nB /= nVal;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline Point operator+( const Point &rVal1, const Point &rVal2 )
|
|
|
|
{
|
|
|
|
return Point( rVal1.nA+rVal2.nA, rVal1.nB+rVal2.nB );
|
|
|
|
}
|
|
|
|
|
|
|
|
inline Point operator-( const Point &rVal1, const Point &rVal2 )
|
|
|
|
{
|
|
|
|
return Point( rVal1.nA-rVal2.nA, rVal1.nB-rVal2.nB );
|
|
|
|
}
|
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
inline Point operator*( const Point &rVal1, const long nVal2 )
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
return Point( rVal1.nA*nVal2, rVal1.nB*nVal2 );
|
|
|
|
}
|
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
inline Point operator/( const Point &rVal1, const long nVal2 )
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
return Point( rVal1.nA/nVal2, rVal1.nB/nVal2 );
|
|
|
|
}
|
|
|
|
|
2016-11-09 12:17:04 +01:00
|
|
|
inline bool operator ==(Point const & p1, Point const & p2)
|
|
|
|
{
|
2018-02-09 10:49:54 +02:00
|
|
|
return tools::detail::equal(p1.toPair(), p2.toPair());
|
2016-11-09 12:17:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
inline bool operator !=(Point const & p1, Point const & p2)
|
|
|
|
{
|
|
|
|
return !(p1 == p2);
|
|
|
|
}
|
|
|
|
|
2012-11-21 17:52:00 +01:00
|
|
|
template< typename charT, typename traits >
|
|
|
|
inline std::basic_ostream<charT, traits> & operator <<(
|
|
|
|
std::basic_ostream<charT, traits> & stream, const Point& point )
|
|
|
|
{
|
|
|
|
return stream << point.X() << ',' << point.Y();
|
|
|
|
}
|
|
|
|
|
2012-08-13 22:51:30 +02:00
|
|
|
// Size
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-02-09 10:49:54 +02:00
|
|
|
class SAL_WARN_UNUSED Size final : protected Pair
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
public:
|
2015-08-20 16:46:41 +02:00
|
|
|
Size() {}
|
2018-04-07 11:45:13 +02:00
|
|
|
Size( long nWidth, long nHeight ) : Pair( nWidth, nHeight ) {}
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
long Width() const { return nA; }
|
|
|
|
long Height() const { return nB; }
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
long AdjustWidth( long n ) { nA += n; return nA; }
|
|
|
|
long AdjustHeight( long n ) { nB += n; return nB; }
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
long getWidth() const { return Width(); }
|
|
|
|
long getHeight() const { return Height(); }
|
|
|
|
void setWidth(long nWidth) { nA = nWidth; }
|
|
|
|
void setHeight(long nHeight) { nB = nHeight; }
|
2018-02-09 10:49:54 +02:00
|
|
|
|
2019-04-03 12:21:08 +09:00
|
|
|
void extendBy(long x, long y)
|
|
|
|
{
|
|
|
|
nA += x;
|
|
|
|
nB += y;
|
|
|
|
}
|
|
|
|
|
2018-02-09 10:49:54 +02:00
|
|
|
Pair const & toPair() const { return *this; }
|
|
|
|
Pair & toPair() { return *this; }
|
|
|
|
|
|
|
|
using Pair::toString;
|
2007-04-11 19:12:02 +00:00
|
|
|
};
|
|
|
|
|
2016-11-09 12:17:04 +01:00
|
|
|
inline bool operator ==(Size const & s1, Size const & s2)
|
|
|
|
{
|
2018-02-09 10:49:54 +02:00
|
|
|
return tools::detail::equal(s1.toPair(), s2.toPair());
|
2016-11-09 12:17:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
inline bool operator !=(Size const & s1, Size const & s2)
|
|
|
|
{
|
|
|
|
return !(s1 == s2);
|
|
|
|
}
|
|
|
|
|
2012-11-21 17:52:00 +01:00
|
|
|
template< typename charT, typename traits >
|
|
|
|
inline std::basic_ostream<charT, traits> & operator <<(
|
|
|
|
std::basic_ostream<charT, traits> & stream, const Size& size )
|
|
|
|
{
|
|
|
|
return stream << size.Width() << 'x' << size.Height();
|
|
|
|
}
|
|
|
|
|
2018-02-23 15:52:25 +02:00
|
|
|
inline void Point::Move( Size const & s )
|
|
|
|
{
|
|
|
|
AdjustX(s.Width());
|
|
|
|
AdjustY(s.Height());
|
|
|
|
}
|
|
|
|
|
2012-08-13 22:51:30 +02:00
|
|
|
// Range
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
#define RANGE_MAX LONG_MAX
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-02-09 10:49:54 +02:00
|
|
|
class SAL_WARN_UNUSED Range final : protected Pair
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
public:
|
2015-08-20 16:46:41 +02:00
|
|
|
Range() {}
|
2018-04-07 11:45:13 +02:00
|
|
|
Range( long nMin, long nMax ) : Pair( nMin, nMax ) {}
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
long Min() const { return nA; }
|
|
|
|
long Max() const { return nB; }
|
|
|
|
long Len() const { return nB - nA + 1; }
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
long& Min() { return nA; }
|
|
|
|
long& Max() { return nB; }
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
bool IsInside( long nIs ) const;
|
2007-04-11 19:12:02 +00:00
|
|
|
|
|
|
|
void Justify();
|
2018-02-09 10:49:54 +02:00
|
|
|
|
|
|
|
Pair const & toPair() const { return *this; }
|
|
|
|
Pair & toPair() { return *this; }
|
|
|
|
|
|
|
|
using Pair::toString;
|
2007-04-11 19:12:02 +00:00
|
|
|
};
|
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
inline bool Range::IsInside( long nIs ) const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
return ((nA <= nIs) && (nIs <= nB ));
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void Range::Justify()
|
|
|
|
{
|
|
|
|
if ( nA > nB )
|
|
|
|
{
|
2018-04-07 11:45:13 +02:00
|
|
|
long nHelp = nA;
|
2007-04-11 19:12:02 +00:00
|
|
|
nA = nB;
|
|
|
|
nB = nHelp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-09 12:17:04 +01:00
|
|
|
inline bool operator ==(Range const & r1, Range const & r2)
|
|
|
|
{
|
2018-02-09 10:49:54 +02:00
|
|
|
return tools::detail::equal(r1.toPair(), r2.toPair());
|
2016-11-09 12:17:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
inline bool operator !=(Range const & r1, Range const & r2)
|
|
|
|
{
|
|
|
|
return !(r1 == r2);
|
|
|
|
}
|
|
|
|
|
2012-11-21 17:52:00 +01:00
|
|
|
template< typename charT, typename traits >
|
|
|
|
inline std::basic_ostream<charT, traits> & operator <<(
|
|
|
|
std::basic_ostream<charT, traits> & stream, const Range& range )
|
|
|
|
{
|
|
|
|
return stream << range.Min() << '-' << range.Max();
|
|
|
|
}
|
|
|
|
|
2012-08-13 22:51:30 +02:00
|
|
|
// Selection
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
#define SELECTION_MIN LONG_MIN
|
|
|
|
#define SELECTION_MAX LONG_MAX
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-02-09 10:49:54 +02:00
|
|
|
class SAL_WARN_UNUSED Selection final : protected Pair
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
public:
|
2015-08-20 16:46:41 +02:00
|
|
|
Selection() {}
|
2018-04-07 11:45:13 +02:00
|
|
|
Selection( long nPos ) : Pair( nPos, nPos ) {}
|
|
|
|
Selection( long nMin, long nMax ) : Pair( nMin, nMax ) {}
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
long Min() const { return nA; }
|
|
|
|
long Max() const { return nB; }
|
|
|
|
long Len() const { return nB - nA; }
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
long& Min() { return nA; }
|
|
|
|
long& Max() { return nB; }
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
bool IsInside( long nIs ) const;
|
2007-04-11 19:12:02 +00:00
|
|
|
|
|
|
|
void Justify();
|
|
|
|
|
2013-06-29 23:57:38 -05:00
|
|
|
bool operator !() const { return !Len(); }
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
long getMin() const { return Min(); }
|
|
|
|
void setMin(long nMin) { Min() = nMin; }
|
|
|
|
void setMax(long nMax) { Max() = nMax; }
|
2018-02-09 10:49:54 +02:00
|
|
|
|
|
|
|
Pair const & toPair() const { return *this; }
|
|
|
|
Pair & toPair() { return *this; }
|
|
|
|
|
|
|
|
using Pair::toString;
|
2007-04-11 19:12:02 +00:00
|
|
|
};
|
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
inline bool Selection::IsInside( long nIs ) const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
return ((nA <= nIs) && (nIs < nB ));
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void Selection::Justify()
|
|
|
|
{
|
|
|
|
if ( nA > nB )
|
|
|
|
{
|
2018-04-07 11:45:13 +02:00
|
|
|
long nHelp = nA;
|
2007-04-11 19:12:02 +00:00
|
|
|
nA = nB;
|
|
|
|
nB = nHelp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-09 12:17:04 +01:00
|
|
|
inline bool operator ==(Selection const & s1, Selection const & s2)
|
|
|
|
{
|
2018-02-09 10:49:54 +02:00
|
|
|
return tools::detail::equal(s1.toPair(), s2.toPair());
|
2016-11-09 12:17:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
inline bool operator !=(Selection const & s1, Selection const & s2)
|
|
|
|
{
|
|
|
|
return !(s1 == s2);
|
|
|
|
}
|
|
|
|
|
2012-11-21 17:52:00 +01:00
|
|
|
template< typename charT, typename traits >
|
|
|
|
inline std::basic_ostream<charT, traits> & operator <<(
|
|
|
|
std::basic_ostream<charT, traits> & stream, const Selection& selection )
|
|
|
|
{
|
|
|
|
return stream << selection.Min() << '-' << selection.Max();
|
|
|
|
}
|
2012-08-13 22:51:30 +02:00
|
|
|
// Rectangle
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
#define RECT_MAX LONG_MAX
|
|
|
|
#define RECT_MIN LONG_MIN
|
|
|
|
|
2016-12-06 22:49:09 +01:00
|
|
|
/// Note: this class is a true marvel of engineering: because the author
|
|
|
|
/// could not decide whether it's better to have a closed or half-open
|
|
|
|
/// interval, they just implemented *both* in the same class!
|
|
|
|
///
|
|
|
|
/// If you have the misfortune of having to use this class, don't immediately
|
|
|
|
/// despair but first take note that the uppercase GetWidth() / GetHeight()
|
|
|
|
/// etc. methods interpret the interval as closed, while the lowercase
|
|
|
|
/// getWidth() / getHeight() etc. methods interpret the interval as half-open.
|
|
|
|
/// Ok, now is the time for despair.
|
2017-03-30 20:27:55 +02:00
|
|
|
namespace tools
|
|
|
|
{
|
2018-02-09 10:49:54 +02:00
|
|
|
class SAL_WARN_UNUSED TOOLS_DLLPUBLIC Rectangle final
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
2018-04-07 11:45:13 +02:00
|
|
|
static constexpr short RECT_EMPTY = -32767;
|
2007-04-11 19:12:02 +00:00
|
|
|
public:
|
|
|
|
Rectangle();
|
|
|
|
Rectangle( const Point& rLT, const Point& rRB );
|
2018-04-07 11:45:13 +02:00
|
|
|
Rectangle( long nLeft, long nTop,
|
|
|
|
long nRight, long nBottom );
|
2018-01-25 14:56:44 +02:00
|
|
|
/// Constructs an empty Rectangle, with top/left at the specified params
|
2018-04-07 11:45:13 +02:00
|
|
|
Rectangle( long nLeft, long nTop );
|
2007-04-11 19:12:02 +00:00
|
|
|
Rectangle( const Point& rLT, const Size& rSize );
|
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
long Left() const { return nLeft; }
|
2019-07-12 12:06:41 +02:00
|
|
|
long Right() const;
|
2018-04-07 11:45:13 +02:00
|
|
|
long Top() const { return nTop; }
|
2019-07-12 17:06:28 +02:00
|
|
|
long Bottom() const;
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
void SetLeft(long v) { nLeft = v; }
|
2019-06-12 09:14:03 +02:00
|
|
|
void SetRight(long v) { nRight = v; }
|
2018-04-07 11:45:13 +02:00
|
|
|
void SetTop(long v) { nTop = v; }
|
|
|
|
void SetBottom(long v) { nBottom = v; }
|
2018-02-08 15:51:39 +02:00
|
|
|
|
2012-12-13 13:36:57 +02:00
|
|
|
inline Point TopLeft() const;
|
|
|
|
inline Point TopRight() const;
|
|
|
|
inline Point TopCenter() const;
|
|
|
|
inline Point BottomLeft() const;
|
|
|
|
inline Point BottomRight() const;
|
|
|
|
inline Point BottomCenter() const;
|
|
|
|
inline Point LeftCenter() const;
|
|
|
|
inline Point RightCenter() const;
|
|
|
|
inline Point Center() const;
|
|
|
|
|
2015-08-20 14:22:06 +02:00
|
|
|
/// Move the top and left edges by a delta, preserving width and height
|
2018-04-07 11:45:13 +02:00
|
|
|
inline void Move( long nHorzMoveDelta, long nVertMoveDelta );
|
2018-02-23 15:52:25 +02:00
|
|
|
void Move( Size const & s ) { Move(s.Width(), s.Height()); }
|
2018-04-07 11:45:13 +02:00
|
|
|
long AdjustLeft( long nHorzMoveDelta ) { nLeft += nHorzMoveDelta; return nLeft; }
|
2019-07-09 14:51:19 +02:00
|
|
|
long AdjustRight( long nHorzMoveDelta );
|
2018-04-07 11:45:13 +02:00
|
|
|
long AdjustTop( long nVertMoveDelta ) { nTop += nVertMoveDelta; return nTop; }
|
2019-07-10 08:39:11 +02:00
|
|
|
long AdjustBottom( long nVertMoveDelta );
|
2007-04-11 19:12:02 +00:00
|
|
|
inline void SetPos( const Point& rPoint );
|
|
|
|
void SetSize( const Size& rSize );
|
|
|
|
inline Size GetSize() const;
|
|
|
|
|
2015-07-07 14:07:33 +02:00
|
|
|
/// Returns the difference between right and left, assuming the range is inclusive.
|
2018-04-07 11:45:13 +02:00
|
|
|
inline long GetWidth() const;
|
2015-07-07 14:07:33 +02:00
|
|
|
/// Returns the difference between bottom and top, assuming the range is inclusive.
|
2018-04-07 11:45:13 +02:00
|
|
|
inline long GetHeight() const;
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
tools::Rectangle& Union( const tools::Rectangle& rRect );
|
|
|
|
tools::Rectangle& Intersection( const tools::Rectangle& rRect );
|
|
|
|
inline tools::Rectangle GetUnion( const tools::Rectangle& rRect ) const;
|
|
|
|
inline tools::Rectangle GetIntersection( const tools::Rectangle& rRect ) const;
|
2007-04-11 19:12:02 +00:00
|
|
|
|
|
|
|
void Justify();
|
|
|
|
|
2013-06-29 23:57:38 -05:00
|
|
|
bool IsInside( const Point& rPOINT ) const;
|
2017-03-30 20:27:55 +02:00
|
|
|
bool IsInside( const tools::Rectangle& rRect ) const;
|
|
|
|
bool IsOver( const tools::Rectangle& rRect ) const;
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2019-06-12 09:14:03 +02:00
|
|
|
void SetEmpty() { nRight = nBottom = RECT_EMPTY; }
|
|
|
|
void SetWidthEmpty() { nRight = RECT_EMPTY; }
|
2018-01-25 14:56:44 +02:00
|
|
|
void SetHeightEmpty() { nBottom = RECT_EMPTY; }
|
2013-06-29 23:57:38 -05:00
|
|
|
inline bool IsEmpty() const;
|
2019-06-12 09:14:03 +02:00
|
|
|
bool IsWidthEmpty() const { return nRight == RECT_EMPTY; }
|
2018-01-25 14:56:44 +02:00
|
|
|
bool IsHeightEmpty() const { return nBottom == RECT_EMPTY; }
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline bool operator == ( const tools::Rectangle& rRect ) const;
|
|
|
|
inline bool operator != ( const tools::Rectangle& rRect ) const;
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline tools::Rectangle& operator += ( const Point& rPt );
|
|
|
|
inline tools::Rectangle& operator -= ( const Point& rPt );
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
friend inline tools::Rectangle operator + ( const tools::Rectangle& rRect, const Point& rPt );
|
|
|
|
friend inline tools::Rectangle operator - ( const tools::Rectangle& rRect, const Point& rPt );
|
2007-04-11 19:12:02 +00:00
|
|
|
|
|
|
|
// ONE
|
2018-04-07 11:45:13 +02:00
|
|
|
long getX() const { return nLeft; }
|
|
|
|
long getY() const { return nTop; }
|
2015-07-07 14:07:33 +02:00
|
|
|
/// Returns the difference between right and left, assuming the range includes one end, but not the other.
|
2019-07-12 20:16:40 +02:00
|
|
|
long getWidth() const;
|
2015-07-07 14:07:33 +02:00
|
|
|
/// Returns the difference between bottom and top, assuming the range includes one end, but not the other.
|
2019-07-15 09:44:10 +02:00
|
|
|
long getHeight() const;
|
2015-08-20 14:22:06 +02:00
|
|
|
/// Set the left edge of the rectangle to x, preserving the width
|
2019-07-10 10:04:19 +02:00
|
|
|
void setX( long x );
|
2015-08-20 14:22:06 +02:00
|
|
|
/// Set the top edge of the rectangle to y, preserving the height
|
2019-07-10 12:32:15 +02:00
|
|
|
void setY( long y );
|
2019-06-12 09:14:03 +02:00
|
|
|
void setWidth( long n ) { nRight = nLeft + n; }
|
2018-04-07 11:45:13 +02:00
|
|
|
void setHeight( long n ) { nBottom = nTop + n; }
|
2015-03-16 15:33:25 +01:00
|
|
|
/// Returns the string representation of the rectangle, format is "x, y, width, height".
|
2015-02-17 15:28:31 +01:00
|
|
|
rtl::OString toString() const;
|
2012-10-28 23:23:53 +01:00
|
|
|
|
2015-05-12 14:59:39 +09:00
|
|
|
/**
|
|
|
|
* Expands the rectangle in all directions by the input value.
|
|
|
|
*/
|
2019-07-08 16:40:05 +02:00
|
|
|
void expand(long nExpandBy);
|
2019-07-09 13:33:41 +02:00
|
|
|
void shrink(long nShrinkBy);
|
2015-05-12 14:59:39 +09:00
|
|
|
|
2018-01-18 21:28:02 +00:00
|
|
|
/**
|
|
|
|
* Sanitizing variants for handling data from the outside
|
|
|
|
*/
|
|
|
|
void SaturatingSetSize(const Size& rSize);
|
2018-04-07 11:45:13 +02:00
|
|
|
void SaturatingSetX(long x);
|
|
|
|
void SaturatingSetY(long y);
|
2018-03-12 21:26:31 +00:00
|
|
|
|
2012-10-28 23:23:53 +01:00
|
|
|
private:
|
2018-04-07 11:45:13 +02:00
|
|
|
long nLeft;
|
|
|
|
long nTop;
|
|
|
|
long nRight;
|
|
|
|
long nBottom;
|
2007-04-11 19:12:02 +00:00
|
|
|
};
|
2017-03-30 20:27:55 +02:00
|
|
|
}
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline tools::Rectangle::Rectangle()
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
nLeft = nTop = 0;
|
2019-06-12 09:14:03 +02:00
|
|
|
nRight = nBottom = RECT_EMPTY;
|
2007-04-11 19:12:02 +00:00
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline tools::Rectangle::Rectangle( const Point& rLT, const Point& rRB )
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
nLeft = rLT.X();
|
|
|
|
nTop = rLT.Y();
|
|
|
|
nRight = rRB.X();
|
|
|
|
nBottom = rRB.Y();
|
|
|
|
}
|
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
inline tools::Rectangle::Rectangle( long _nLeft, long _nTop,
|
|
|
|
long _nRight, long _nBottom )
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
nLeft = _nLeft;
|
|
|
|
nTop = _nTop;
|
|
|
|
nRight = _nRight;
|
|
|
|
nBottom = _nBottom;
|
|
|
|
}
|
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
inline tools::Rectangle::Rectangle( long _nLeft, long _nTop )
|
2018-01-25 14:56:44 +02:00
|
|
|
{
|
|
|
|
nLeft = _nLeft;
|
|
|
|
nTop = _nTop;
|
2019-06-12 09:14:03 +02:00
|
|
|
nRight = nBottom = RECT_EMPTY;
|
2018-01-25 14:56:44 +02:00
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline tools::Rectangle::Rectangle( const Point& rLT, const Size& rSize )
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
nLeft = rLT.X();
|
|
|
|
nTop = rLT.Y();
|
2019-06-12 09:14:03 +02:00
|
|
|
nRight = rSize.Width() ? nLeft+(rSize.Width()-1) : RECT_EMPTY;
|
Avoid signed integer overflow during BrowseBox::AutoSizeLastColumn
Observed with UBSan with `soffice --base`, "Finish", "Save", "Tables", "Create
Table in Design View...":
> include/tools/gen.hxx:485:37: runtime error: signed integer overflow: 288 + 9223372036854775803 cannot be represented in type 'long'
> #0 0x7fe2d7f827dd in tools::Rectangle::Rectangle(Point const&, Size const&) include/tools/gen.hxx:485:37
> #1 0x7fe2d7f73833 in BrowseBox::ImplFieldRectPixel(long, unsigned short) const svtools/source/brwbox/brwbox1.cxx:2039:12
> #2 0x7fe2d7f57d46 in BrowseBox::GetFieldRectPixel(long, unsigned short, bool) const svtools/source/brwbox/brwbox1.cxx:1977:29
> #3 0x7fe2d7f42bdb in BrowseBox::GetFieldRect(unsigned short) const svtools/source/brwbox/brwbox1.cxx:2068:12
> #4 0x7fe2d7f4502b in BrowseBox::SetColumnWidth(unsigned short, unsigned long) svtools/source/brwbox/brwbox1.cxx:542:19
> #5 0x7fe2d7f48d18 in BrowseBox::AutoSizeLastColumn() svtools/source/brwbox/brwbox1.cxx:633:9
> #6 0x7fe2d7fd299c in BrowseBox::Resize() svtools/source/brwbox/brwbox2.cxx:537:5
> #7 0x7fe2d807ee7a in svt::EditBrowseBox::Resize() svtools/source/brwbox/editbrowsebox.cxx:1095:20
> #8 0x7fe2cdbe5711 in vcl::Window::ImplCallResize() vcl/source/window/event.cxx:522:5
> #9 0x7fe2ce1c8f71 in vcl::Window::Show(bool, ShowFlags) vcl/source/window/window.cxx:2261:13
> #10 0x7fe25d27b58f in dbaui::OTableDesignView::initialize() dbaccess/source/ui/tabledesign/TableDesignView.cxx:199:22
> #11 0x7fe25d23403b in dbaui::OTableController::impl_initialize() dbaccess/source/ui/tabledesign/TableController.cxx:519:20
> #12 0x7fe25c3dd649 in dbaui::OGenericUnoController::initialize(com::sun::star::uno::Sequence<com::sun::star::uno::Any> const&) dbaccess/source/ui/browser/genericcontroller.cxx:270:9
> #13 0x7fe25c3361cd in DBContentLoader::load(com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&, rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&, com::sun::star::uno::Reference<com::sun::star::frame::XLoadEventListener> const&) dbaccess/source/ui/browser/dbloader.cxx:270:19
> #14 0x7fe28521412a in framework::LoadEnv::impl_loadContent() framework/source/loadenv/loadenv.cxx:1101:23
> #15 0x7fe285209e0a in framework::LoadEnv::startLoading() framework/source/loadenv/loadenv.cxx:375:20
> #16 0x7fe28520738b in framework::LoadEnv::loadComponentFromURL(com::sun::star::uno::Reference<com::sun::star::frame::XComponentLoader> const&, com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) framework/source/loadenv/loadenv.cxx:161:14
> #17 0x7fe285332ba8 in (anonymous namespace)::Frame::loadComponentFromURL(rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) framework/source/services/frame.cxx:589:12
> #18 0x7fe285349f7d in non-virtual thunk to (anonymous namespace)::Frame::loadComponentFromURL(rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) framework/source/services/frame.cxx
> #19 0x7fe25cba4dae in dbaui::DatabaseObjectView::doDispatch(comphelper::NamedValueCollection const&) dbaccess/source/ui/misc/databaseobjectview.cxx:140:41
> #20 0x7fe25cba3514 in dbaui::DatabaseObjectView::doCreateView(com::sun::star::uno::Any const&, rtl::OUString const&, comphelper::NamedValueCollection const&) dbaccess/source/ui/misc/databaseobjectview.cxx:97:16
> #21 0x7fe25cba667c in dbaui::TableDesigner::doCreateView(com::sun::star::uno::Any const&, rtl::OUString const&, comphelper::NamedValueCollection const&) dbaccess/source/ui/misc/databaseobjectview.cxx:233:40
> #22 0x7fe25cba2fec in dbaui::DatabaseObjectView::createNew(com::sun::star::uno::Reference<com::sun::star::sdbc::XDataSource> const&, comphelper::NamedValueCollection const&) dbaccess/source/ui/misc/databaseobjectview.cxx:79:16
> #23 0x7fe25c07bdfe in dbaui::OApplicationController::newElement(dbaui::ElementType, comphelper::NamedValueCollection const&, com::sun::star::uno::Reference<com::sun::star::lang::XComponent>&) dbaccess/source/ui/app/AppController.cxx:1968:40
> #24 0x7fe25c076546 in dbaui::OApplicationController::Execute(unsigned short, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) dbaccess/source/ui/app/AppController.cxx:1223:25
> #25 0x7fe25c3ef474 in dbaui::OGenericUnoController::executeChecked(com::sun::star::util::URL const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) dbaccess/source/ui/browser/genericcontroller.cxx:1061:13
> #26 0x7fe25c1dd91a in dbaui::OCreationList::onSelected(SvTreeListEntry const*) const dbaccess/source/ui/app/AppDetailView.cxx:309:81
> #27 0x7fe25c1e0de9 in dbaui::OCreationList::MouseButtonUp(MouseEvent const&) dbaccess/source/ui/app/AppDetailView.cxx:275:9
> #28 0x7fe2ce263026 in ImplHandleMouseEvent(VclPtr<vcl::Window> const&, MouseNotifyEvent, bool, long, long, unsigned long, unsigned short, MouseEventModifiers) vcl/source/window/winproc.cxx:711:25
> #29 0x7fe2ce298c14 in ImplHandleSalMouseButtonUp(vcl::Window*, SalMouseEvent const*) vcl/source/window/winproc.cxx:1994:12
> #30 0x7fe2ce27c59c in ImplWindowFrameProc(vcl::Window*, SalEvent, void const*) vcl/source/window/winproc.cxx:2329:20
> #31 0x7fe29bebd05a in SalFrame::CallCallback(SalEvent, void const*) const vcl/inc/salframe.hxx:275:29
> #32 0x7fe29be5cfad in GtkSalFrame::CallCallbackExc(SalEvent, void const*) const vcl/unx/gtk3/gtk3gtkframe.cxx:4318:16
> #33 0x7fe29be755ac in GtkSalFrame::signalButton(_GtkWidget*, _GdkEventButton*, void*) vcl/unx/gtk3/gtk3gtkframe.cxx:2620:16
> #34 0x7fe29b2a4a7a (/lib64/libgtk-3.so.0+0x233a7a)
> #35 0x7fe2f60c373c in g_closure_invoke (/lib64/libgobject-2.0.so.0+0xf73c)
> #36 0x7fe2f60d64dd (/lib64/libgobject-2.0.so.0+0x224dd)
> #37 0x7fe2f60de69e in g_signal_emit_valist (/lib64/libgobject-2.0.so.0+0x2a69e)
> #38 0x7fe2f60df66e in g_signal_emit (/lib64/libgobject-2.0.so.0+0x2b66e)
> #39 0x7fe29b3efcd3 (/lib64/libgtk-3.so.0+0x37ecd3)
> #40 0x7fe29b2a1a4d (/lib64/libgtk-3.so.0+0x230a4d)
> #41 0x7fe29b2a3b6f in gtk_main_do_event (/lib64/libgtk-3.so.0+0x232b6f)
> #42 0x7fe29adb1304 (/lib64/libgdk-3.so.0+0x37304)
> #43 0x7fe29ae0ddf1 (/lib64/libgdk-3.so.0+0x93df1)
> #44 0x7fe2f5deab76 in g_main_context_dispatch (/lib64/libglib-2.0.so.0+0x4ab76)
> #45 0x7fe2f5deaf1f (/lib64/libglib-2.0.so.0+0x4af1f)
> #46 0x7fe2f5deafab in g_main_context_iteration (/lib64/libglib-2.0.so.0+0x4afab)
> #47 0x7fe29bcbdbca in GtkSalData::Yield(bool, bool) vcl/unx/gtk3/gtk3gtkdata.cxx:459:31
> #48 0x7fe29bccd0d2 in GtkInstance::DoYield(bool, bool) vcl/unx/gtk3/../gtk/gtkinst.cxx:410:29
> #49 0x7fe2cf6a65e3 in ImplYield(bool, bool) vcl/source/app/svapp.cxx:469:48
> #50 0x7fe2cf68ef1b in Application::Yield() vcl/source/app/svapp.cxx:534:5
> #51 0x7fe2cf68eda3 in Application::Execute() vcl/source/app/svapp.cxx:449:9
> #52 0x7fe2f7e1eef8 in desktop::Desktop::Main() desktop/source/app/app.cxx:1622:17
> #53 0x7fe2cf6d8687 in ImplSVMain() vcl/source/app/svmain.cxx:194:35
> #54 0x7fe2cf6e1f7f in SVMain() vcl/source/app/svmain.cxx:232:16
> #55 0x7fe2f7f466b4 in soffice_main desktop/source/app/sofficemain.cxx:166:12
> #56 0x42a83c in sal_main desktop/source/app/main.c:48:15
> #57 0x42a816 in main desktop/source/app/main.c:47:1
> #58 0x7fe2f67a6009 in __libc_start_main (/lib64/libc.so.6+0x21009)
> #59 0x402e69 in _start (instdir/program/soffice.bin+0x402e69)
Change-Id: I6a92a87b481396955cfc1f21bf88e2f0ad9cea9f
Reviewed-on: https://gerrit.libreoffice.org/49279
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
2018-02-06 10:43:46 +01:00
|
|
|
nBottom = rSize.Height() ? nTop+(rSize.Height()-1) : RECT_EMPTY;
|
2007-04-11 19:12:02 +00:00
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline bool tools::Rectangle::IsEmpty() const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
2019-06-12 09:14:03 +02:00
|
|
|
return (nRight == RECT_EMPTY) || (nBottom == RECT_EMPTY);
|
2007-04-11 19:12:02 +00:00
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline Point tools::Rectangle::TopLeft() const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
return Point( nLeft, nTop );
|
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline Point tools::Rectangle::TopRight() const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
2019-06-12 09:14:03 +02:00
|
|
|
return Point( (nRight == RECT_EMPTY) ? nLeft : nRight, nTop );
|
2007-04-11 19:12:02 +00:00
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline Point tools::Rectangle::BottomLeft() const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
return Point( nLeft, (nBottom == RECT_EMPTY) ? nTop : nBottom );
|
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline Point tools::Rectangle::BottomRight() const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
2019-06-12 09:14:03 +02:00
|
|
|
return Point( (nRight == RECT_EMPTY) ? nLeft : nRight,
|
2007-04-11 19:12:02 +00:00
|
|
|
(nBottom == RECT_EMPTY) ? nTop : nBottom );
|
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline Point tools::Rectangle::TopCenter() const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
if ( IsEmpty() )
|
|
|
|
return Point( nLeft, nTop );
|
|
|
|
else
|
2013-04-11 00:21:40 -03:00
|
|
|
return Point( std::min( nLeft, nRight ) + std::abs( (nRight - nLeft)/2 ),
|
|
|
|
std::min( nTop, nBottom) );
|
2007-04-11 19:12:02 +00:00
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline Point tools::Rectangle::BottomCenter() const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
if ( IsEmpty() )
|
|
|
|
return Point( nLeft, nTop );
|
|
|
|
else
|
2013-04-11 00:21:40 -03:00
|
|
|
return Point( std::min( nLeft, nRight ) + std::abs( (nRight - nLeft)/2 ),
|
|
|
|
std::max( nTop, nBottom) );
|
2007-04-11 19:12:02 +00:00
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline Point tools::Rectangle::LeftCenter() const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
if ( IsEmpty() )
|
|
|
|
return Point( nLeft, nTop );
|
|
|
|
else
|
2013-04-11 00:21:40 -03:00
|
|
|
return Point( std::min( nLeft, nRight ), nTop + (nBottom - nTop)/2 );
|
2007-04-11 19:12:02 +00:00
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline Point tools::Rectangle::RightCenter() const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
if ( IsEmpty() )
|
|
|
|
return Point( nLeft, nTop );
|
|
|
|
else
|
2013-04-11 00:21:40 -03:00
|
|
|
return Point( std::max( nLeft, nRight ), nTop + (nBottom - nTop)/2 );
|
2007-04-11 19:12:02 +00:00
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline Point tools::Rectangle::Center() const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
if ( IsEmpty() )
|
|
|
|
return Point( nLeft, nTop );
|
|
|
|
else
|
|
|
|
return Point( nLeft+(nRight-nLeft)/2 , nTop+(nBottom-nTop)/2 );
|
|
|
|
}
|
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
inline void tools::Rectangle::Move( long nHorzMove, long nVertMove )
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
nLeft += nHorzMove;
|
|
|
|
nTop += nVertMove;
|
2019-06-12 09:14:03 +02:00
|
|
|
if ( nRight != RECT_EMPTY )
|
2007-04-11 19:12:02 +00:00
|
|
|
nRight += nHorzMove;
|
|
|
|
if ( nBottom != RECT_EMPTY )
|
|
|
|
nBottom += nVertMove;
|
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline void tools::Rectangle::SetPos( const Point& rPoint )
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
2019-06-12 09:14:03 +02:00
|
|
|
if ( nRight != RECT_EMPTY )
|
2007-04-11 19:12:02 +00:00
|
|
|
nRight += rPoint.X() - nLeft;
|
|
|
|
if ( nBottom != RECT_EMPTY )
|
|
|
|
nBottom += rPoint.Y() - nTop;
|
|
|
|
nLeft = rPoint.X();
|
|
|
|
nTop = rPoint.Y();
|
|
|
|
}
|
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
inline long tools::Rectangle::GetWidth() const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
2018-04-07 11:45:13 +02:00
|
|
|
long n;
|
2019-06-12 09:14:03 +02:00
|
|
|
if ( nRight == RECT_EMPTY )
|
2007-04-11 19:12:02 +00:00
|
|
|
n = 0;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
n = nRight - nLeft;
|
|
|
|
if( n < 0 )
|
|
|
|
n--;
|
|
|
|
else
|
|
|
|
n++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
inline long tools::Rectangle::GetHeight() const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
2018-04-07 11:45:13 +02:00
|
|
|
long n;
|
2007-04-11 19:12:02 +00:00
|
|
|
if ( nBottom == RECT_EMPTY )
|
|
|
|
n = 0;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
n = nBottom - nTop;
|
|
|
|
if ( n < 0 )
|
|
|
|
n--;
|
|
|
|
else
|
|
|
|
n++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline Size tools::Rectangle::GetSize() const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
return Size( GetWidth(), GetHeight() );
|
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline tools::Rectangle tools::Rectangle::GetUnion( const tools::Rectangle& rRect ) const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
2017-03-30 20:27:55 +02:00
|
|
|
tools::Rectangle aTmpRect( *this );
|
2007-04-11 19:12:02 +00:00
|
|
|
return aTmpRect.Union( rRect );
|
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline tools::Rectangle tools::Rectangle::GetIntersection( const tools::Rectangle& rRect ) const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
2017-03-30 20:27:55 +02:00
|
|
|
tools::Rectangle aTmpRect( *this );
|
2007-04-11 19:12:02 +00:00
|
|
|
return aTmpRect.Intersection( rRect );
|
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline bool tools::Rectangle::operator == ( const tools::Rectangle& rRect ) const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
2015-08-20 16:46:41 +02:00
|
|
|
return (nLeft == rRect.nLeft ) &&
|
|
|
|
(nTop == rRect.nTop ) &&
|
|
|
|
(nRight == rRect.nRight ) &&
|
2019-06-12 09:14:03 +02:00
|
|
|
(nBottom == rRect.nBottom );
|
2007-04-11 19:12:02 +00:00
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline bool tools::Rectangle::operator != ( const tools::Rectangle& rRect ) const
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
2019-06-12 09:14:03 +02:00
|
|
|
return (nLeft != rRect.nLeft ) ||
|
|
|
|
(nTop != rRect.nTop ) ||
|
|
|
|
(nRight != rRect.nRight ) ||
|
|
|
|
(nBottom != rRect.nBottom );
|
2007-04-11 19:12:02 +00:00
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline tools::Rectangle& tools::Rectangle::operator +=( const Point& rPt )
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
nLeft += rPt.X();
|
|
|
|
nTop += rPt.Y();
|
2019-06-12 09:14:03 +02:00
|
|
|
if ( nRight != RECT_EMPTY )
|
2007-04-11 19:12:02 +00:00
|
|
|
nRight += rPt.X();
|
|
|
|
if ( nBottom != RECT_EMPTY )
|
|
|
|
nBottom += rPt.Y();
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
inline tools::Rectangle& tools::Rectangle::operator -= ( const Point& rPt )
|
2007-04-11 19:12:02 +00:00
|
|
|
{
|
|
|
|
nLeft -= rPt.X();
|
|
|
|
nTop -= rPt.Y();
|
2019-06-12 09:14:03 +02:00
|
|
|
if ( nRight != RECT_EMPTY )
|
2007-04-11 19:12:02 +00:00
|
|
|
nRight -= rPt.X();
|
|
|
|
if ( nBottom != RECT_EMPTY )
|
|
|
|
nBottom -= rPt.Y();
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
namespace tools
|
|
|
|
{
|
2007-04-11 19:12:02 +00:00
|
|
|
inline Rectangle operator + ( const Rectangle& rRect, const Point& rPt )
|
|
|
|
{
|
2018-01-25 14:56:44 +02:00
|
|
|
return rRect.IsEmpty()
|
|
|
|
? Rectangle( rRect.nLeft + rPt.X(), rRect.nTop + rPt.Y() )
|
|
|
|
: Rectangle( rRect.nLeft + rPt.X(), rRect.nTop + rPt.Y(),
|
|
|
|
rRect.nRight + rPt.X(), rRect.nBottom + rPt.Y() );
|
2007-04-11 19:12:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
inline Rectangle operator - ( const Rectangle& rRect, const Point& rPt )
|
|
|
|
{
|
2018-01-25 14:56:44 +02:00
|
|
|
return rRect.IsEmpty()
|
|
|
|
? Rectangle( rRect.nLeft - rPt.X(), rRect.nTop - rPt.Y() )
|
|
|
|
: Rectangle( rRect.nLeft - rPt.X(), rRect.nTop - rPt.Y(),
|
|
|
|
rRect.nRight - rPt.X(), rRect.nBottom - rPt.Y() );
|
2007-04-11 19:12:02 +00:00
|
|
|
}
|
2017-03-30 20:27:55 +02:00
|
|
|
}
|
2007-04-11 19:12:02 +00:00
|
|
|
|
2012-11-21 17:52:00 +01:00
|
|
|
template< typename charT, typename traits >
|
|
|
|
inline std::basic_ostream<charT, traits> & operator <<(
|
2017-03-30 20:27:55 +02:00
|
|
|
std::basic_ostream<charT, traits> & stream, const tools::Rectangle& rectangle )
|
2012-11-21 17:52:00 +01:00
|
|
|
{
|
2013-03-25 12:38:24 +02:00
|
|
|
if (rectangle.IsEmpty())
|
|
|
|
return stream << "EMPTY";
|
|
|
|
else
|
|
|
|
return stream << rectangle.getWidth() << 'x' << rectangle.getHeight()
|
|
|
|
<< "@(" << rectangle.getX() << ',' << rectangle.getY() << ")";
|
2012-11-21 17:52:00 +01:00
|
|
|
}
|
|
|
|
|
2012-08-13 23:14:08 +02:00
|
|
|
#endif
|
2010-10-14 08:27:31 +02:00
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|