blob: 0d950b26f77ded88230aab79b101de12659623fa [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 _SV_GEN_HXX
#define _SV_GEN_HXX
#include "tools/toolsdllapi.h"
#include <tools/solar.h>
#include <limits.h>
class SvStream;
// --------------------
// - Helper functions -
// --------------------
inline long MinMax( long nVal, long nMin, long nMax );
inline long AlignedWidth4Bytes( long nWidthBits );
inline long FRound( double fVal );
// ---------------
// - Inlines -
// ---------------
inline long MinMax( long nVal, long nMin, long nMax )
{
return( nVal >= nMin ? ( nVal <= nMax ? nVal : nMax ) : nMin );
}
// ------------------------------------------------------------------
inline long AlignedWidth4Bytes( long nWidthBits )
{
return( ( ( nWidthBits + 31 ) >> 5 ) << 2 );
}
// ------------------------------------------------------------------
inline long FRound( double fVal )
{
return( fVal > 0.0 ? (long) ( fVal + 0.5 ) : -(long) ( -fVal + 0.5 ) );
}
// --------
// - Pair -
// --------
class Pair
{
public:
long nA;
long nB;
Pair();
Pair( long nA, long nB );
long A() const { return nA; }
long B() const { return nB; }
long& A() { return nA; }
long& B() { return nB; }
sal_Bool operator == ( const Pair& rPair ) const;
sal_Bool operator != ( const Pair& rPair ) const;
TOOLS_DLLPUBLIC friend SvStream& operator>>( SvStream& rIStream, Pair& rPair );
TOOLS_DLLPUBLIC friend SvStream& operator<<( SvStream& rOStream, const Pair& rPair );
};
inline Pair::Pair()
{
nA = nB = 0;
}
inline Pair::Pair( long _nA, long _nB )
{
Pair::nA = _nA;
Pair::nB = _nB;
}
inline sal_Bool Pair::operator == ( const Pair& rPair ) const
{
return ((nA == rPair.nA) && (nB == rPair.nB));
}
inline sal_Bool Pair::operator != ( const Pair& rPair ) const
{
return ((nA != rPair.nA) || (nB != rPair.nB));
}
// ---------
// - Point -
// ---------
class Point : public Pair
{
public:
Point();
Point( long nX, long nY );
long X() const { return nA; }
long Y() const { return nB; }
long& X() { return nA; }
long& Y() { return nB; }
void Move( long nHorzMove, long nVertMove );
sal_Bool IsAbove( const Point& rPoint ) const;
sal_Bool IsBelow( const Point& rPoint ) const;
sal_Bool IsLeft( const Point& rPoint ) const;
sal_Bool IsRight( const Point& rPoint ) const;
Point& operator += ( const Point& rPoint );
Point& operator -= ( const Point& rPoint );
Point& operator *= ( const long nVal );
Point& operator /= ( const long nVal );
#ifdef __BORLANDC__
friend Point operator+( const Point &rVal1, const Point &rVal2 );
friend Point operator-( const Point &rVal1, const Point &rVal2 );
friend Point operator*( const Point &rVal1, const long nVal2 );
friend Point operator/( const Point &rVal1, const long nVal2 );
#else
friend inline Point operator+( const Point &rVal1, const Point &rVal2 );
friend inline Point operator-( const Point &rVal1, const Point &rVal2 );
friend inline Point operator*( const Point &rVal1, const long nVal2 );
friend inline Point operator/( const Point &rVal1, const long nVal2 );
#endif
long getX() const { return X(); }
long getY() const { return Y(); }
void setX(long nX) { X() = nX; }
void setY(long nY) { Y() = nY; }
};
inline Point::Point()
{
}
inline Point::Point( long nX, long nY ) : Pair( nX, nY )
{
}
inline void Point::Move( long nHorzMove, long nVertMove )
{
nA += nHorzMove;
nB += nVertMove;
}
inline sal_Bool Point::IsAbove( const Point& rPoint ) const
{
return (nB > rPoint.nB);
}
inline sal_Bool Point::IsBelow( const Point& rPoint ) const
{
return (nB < rPoint.nB);
}
inline sal_Bool Point::IsLeft( const Point& rPoint ) const
{
return (nA < rPoint.nA);
}
inline sal_Bool Point::IsRight( const Point& rPoint ) const
{
return (nA > rPoint.nA);
}
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;
}
inline Point& Point::operator *= ( const long nVal )
{
nA *= nVal;
nB *= nVal;
return *this;
}
inline Point& Point::operator /= ( const long nVal )
{
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 );
}
inline Point operator*( const Point &rVal1, const long nVal2 )
{
return Point( rVal1.nA*nVal2, rVal1.nB*nVal2 );
}
inline Point operator/( const Point &rVal1, const long nVal2 )
{
return Point( rVal1.nA/nVal2, rVal1.nB/nVal2 );
}
// --------
// - Size -
// --------
class Size : public Pair
{
public:
Size();
Size( long nWidth, long nHeight );
long Width() const { return nA; }
long Height() const { return nB; }
long& Width() { return nA; }
long& Height() { return nB; }
long getWidth() const { return Width(); }
long getHeight() const { return Height(); }
void setWidth(long nWidth) { Width() = nWidth; }
void setHeight(long nHeight) { Height() = nHeight; }
};
inline Size::Size()
{
}
inline Size::Size( long nWidth, long nHeight ) :
Pair( nWidth, nHeight )
{
}
// ---------
// - Range -
// ---------
#define RANGE_MIN LONG_MIN
#define RANGE_MAX LONG_MAX
class Range : public Pair
{
public:
Range();
Range( long nMin, long nMax );
long Min() const { return nA; }
long Max() const { return nB; }
long Len() const { return nB - nA + 1; }
long& Min() { return nA; }
long& Max() { return nB; }
sal_Bool IsInside( long nIs ) const;
void Justify();
};
inline Range::Range()
{
}
inline Range::Range( long nMin, long nMax ) : Pair( nMin, nMax )
{
}
inline sal_Bool Range::IsInside( long nIs ) const
{
return ((nA <= nIs) && (nIs <= nB ));
}
inline void Range::Justify()
{
if ( nA > nB )
{
long nHelp = nA;
nA = nB;
nB = nHelp;
}
}
// -------------
// - Selection -
// -------------
#define SELECTION_MIN LONG_MIN
#define SELECTION_MAX LONG_MAX
class Selection : public Pair
{
public:
Selection();
Selection( long nPos );
Selection( long nMin, long nMax );
long Min() const { return nA; }
long Max() const { return nB; }
long Len() const { return nB - nA; }
long& Min() { return nA; }
long& Max() { return nB; }
sal_Bool IsInside( long nIs ) const;
void Justify();
sal_Bool operator !() const { return !Len(); }
long getMin() const { return Min(); }
long getMax() const { return Max(); }
void setMin(long nMin) { Min() = nMin; }
void setMax(long nMax) { Max() = nMax; }
};
inline Selection::Selection()
{
}
inline Selection::Selection( long nPos ) : Pair( nPos, nPos )
{
}
inline Selection::Selection( long nMin, long nMax ) :
Pair( nMin, nMax )
{
}
inline sal_Bool Selection::IsInside( long nIs ) const
{
return ((nA <= nIs) && (nIs < nB ));
}
inline void Selection::Justify()
{
if ( nA > nB )
{
long nHelp = nA;
nA = nB;
nB = nHelp;
}
}
// -------------
// - Rectangle -
// -------------
#define RECT_EMPTY ((short)-32767)
class TOOLS_DLLPUBLIC Rectangle
{
public:
long nLeft;
long nTop;
long nRight;
long nBottom;
Rectangle();
Rectangle( const Point& rLT, const Point& rRB );
Rectangle( long nLeft, long nTop,
long nRight, long nBottom );
Rectangle( const Point& rLT, const Size& rSize );
long Left() const { return nLeft; }
long Right() const { return nRight; }
long Top() const { return nTop; }
long Bottom() const { return nBottom; }
long& Left() { return nLeft; }
long& Right() { return nRight; }
long& Top() { return nTop; }
long& Bottom() { return nBottom; }
inline Point TopLeft() const;
Point TopRight() const;
Point TopCenter() const;
Point BottomLeft() const;
Point BottomRight() const;
Point BottomCenter() const;
Point LeftCenter() const;
Point RightCenter() const;
Point Center() const;
void Move( long nHorzMove, long nVertMove );
inline void Transpose();
inline void SetPos( const Point& rPoint );
void SetSize( const Size& rSize );
inline Size GetSize() const;
long GetWidth() const;
long GetHeight() const;
Rectangle& Union( const Rectangle& rRect );
Rectangle& Intersection( const Rectangle& rRect );
Rectangle GetUnion( const Rectangle& rRect ) const;
Rectangle GetIntersection( const Rectangle& rRect ) const;
void Justify();
sal_Bool IsInside( const Point& rPOINT ) const;
sal_Bool IsInside( const Rectangle& rRect ) const;
sal_Bool IsOver( const Rectangle& rRect ) const;
void SetEmpty() { nRight = nBottom = RECT_EMPTY; }
sal_Bool IsEmpty() const;
sal_Bool operator == ( const Rectangle& rRect ) const;
sal_Bool operator != ( const Rectangle& rRect ) const;
Rectangle& operator += ( const Point& rPt );
Rectangle& operator -= ( const Point& rPt );
#ifdef __BORLANDC__
friend Rectangle operator + ( const Rectangle& rRect, const Point& rPt );
friend Rectangle operator - ( const Rectangle& rRect, const Point& rPt );
#else
friend inline Rectangle operator + ( const Rectangle& rRect, const Point& rPt );
friend inline Rectangle operator - ( const Rectangle& rRect, const Point& rPt );
#endif
TOOLS_DLLPUBLIC friend SvStream& operator>>( SvStream& rIStream, Rectangle& rRect );
TOOLS_DLLPUBLIC friend SvStream& operator<<( SvStream& rOStream, const Rectangle& rRect );
// ONE
long getX() const { return nLeft; }
long getY() const { return nTop; }
long getWidth() const { return nRight - nLeft; }
long getHeight() const { return nBottom - nTop; }
void setX( long n ) { nRight += n-nLeft; nLeft = n; }
void setY( long n ) { nBottom += n-nTop; nTop = n; }
void setWidth( long n ) { nRight = nLeft + n; }
void setHeight( long n ) { nBottom = nTop + n; }
};
inline Rectangle::Rectangle()
{
nLeft = nTop = 0;
nRight = nBottom = RECT_EMPTY;
}
inline Rectangle::Rectangle( const Point& rLT, const Point& rRB )
{
nLeft = rLT.X();
nTop = rLT.Y();
nRight = rRB.X();
nBottom = rRB.Y();
}
inline Rectangle::Rectangle( long _nLeft, long _nTop,
long _nRight, long _nBottom )
{
nLeft = _nLeft;
nTop = _nTop;
nRight = _nRight;
nBottom = _nBottom;
}
inline Rectangle::Rectangle( const Point& rLT, const Size& rSize )
{
nLeft = rLT.X();
nTop = rLT.Y();
nRight = rSize.Width() ? nLeft+rSize.Width()-1 : RECT_EMPTY;
nBottom = rSize.Height() ? nTop+rSize.Height()-1 : RECT_EMPTY;
}
inline sal_Bool Rectangle::IsEmpty() const
{
return ((nRight == RECT_EMPTY) || (nBottom == RECT_EMPTY));
}
inline Point Rectangle::TopLeft() const
{
return Point( nLeft, nTop );
}
inline Point Rectangle::TopRight() const
{
return Point( (nRight == RECT_EMPTY) ? nLeft : nRight, nTop );
}
inline Point Rectangle::BottomLeft() const
{
return Point( nLeft, (nBottom == RECT_EMPTY) ? nTop : nBottom );
}
inline Point Rectangle::BottomRight() const
{
return Point( (nRight == RECT_EMPTY) ? nLeft : nRight,
(nBottom == RECT_EMPTY) ? nTop : nBottom );
}
inline Point Rectangle::TopCenter() const
{
if ( IsEmpty() )
return Point( nLeft, nTop );
else
return Point( Min( nLeft, nRight ) + Abs( (nRight - nLeft)/2 ),
Min( nTop, nBottom) );
}
inline Point Rectangle::BottomCenter() const
{
if ( IsEmpty() )
return Point( nLeft, nTop );
else
return Point( Min( nLeft, nRight ) + Abs( (nRight - nLeft)/2 ),
Max( nTop, nBottom) );
}
inline Point Rectangle::LeftCenter() const
{
if ( IsEmpty() )
return Point( nLeft, nTop );
else
return Point( Min( nLeft, nRight ), nTop + (nBottom - nTop)/2 );
}
inline Point Rectangle::RightCenter() const
{
if ( IsEmpty() )
return Point( nLeft, nTop );
else
return Point( Max( nLeft, nRight ), nTop + (nBottom - nTop)/2 );
}
inline Point Rectangle::Center() const
{
if ( IsEmpty() )
return Point( nLeft, nTop );
else
return Point( nLeft+(nRight-nLeft)/2 , nTop+(nBottom-nTop)/2 );
}
inline void Rectangle::Move( long nHorzMove, long nVertMove )
{
nLeft += nHorzMove;
nTop += nVertMove;
if ( nRight != RECT_EMPTY )
nRight += nHorzMove;
if ( nBottom != RECT_EMPTY )
nBottom += nVertMove;
}
void Rectangle::Transpose()
{
if ( !IsEmpty() )
{
long swap( nLeft );
nLeft = nTop;
nTop = swap;
swap = nRight;
nRight = nBottom;
nBottom = swap;
}
}
inline void Rectangle::SetPos( const Point& rPoint )
{
if ( nRight != RECT_EMPTY )
nRight += rPoint.X() - nLeft;
if ( nBottom != RECT_EMPTY )
nBottom += rPoint.Y() - nTop;
nLeft = rPoint.X();
nTop = rPoint.Y();
}
inline long Rectangle::GetWidth() const
{
long n;
if ( nRight == RECT_EMPTY )
n = 0;
else
{
n = nRight - nLeft;
if( n < 0 )
n--;
else
n++;
}
return n;
}
inline long Rectangle::GetHeight() const
{
long n;
if ( nBottom == RECT_EMPTY )
n = 0;
else
{
n = nBottom - nTop;
if ( n < 0 )
n--;
else
n++;
}
return n;
}
inline Size Rectangle::GetSize() const
{
return Size( GetWidth(), GetHeight() );
}
inline Rectangle Rectangle::GetUnion( const Rectangle& rRect ) const
{
Rectangle aTmpRect( *this );
return aTmpRect.Union( rRect );
}
inline Rectangle Rectangle::GetIntersection( const Rectangle& rRect ) const
{
Rectangle aTmpRect( *this );
return aTmpRect.Intersection( rRect );
}
inline sal_Bool Rectangle::operator == ( const Rectangle& rRect ) const
{
return ((nLeft == rRect.nLeft ) &&
(nTop == rRect.nTop ) &&
(nRight == rRect.nRight ) &&
(nBottom == rRect.nBottom ));
}
inline sal_Bool Rectangle::operator != ( const Rectangle& rRect ) const
{
return ((nLeft != rRect.nLeft ) ||
(nTop != rRect.nTop ) ||
(nRight != rRect.nRight ) ||
(nBottom != rRect.nBottom ));
}
inline Rectangle& Rectangle::operator +=( const Point& rPt )
{
nLeft += rPt.X();
nTop += rPt.Y();
if ( nRight != RECT_EMPTY )
nRight += rPt.X();
if ( nBottom != RECT_EMPTY )
nBottom += rPt.Y();
return *this;
}
inline Rectangle& Rectangle::operator -= ( const Point& rPt )
{
nLeft -= rPt.X();
nTop -= rPt.Y();
if ( nRight != RECT_EMPTY )
nRight -= rPt.X();
if ( nBottom != RECT_EMPTY )
nBottom -= rPt.Y();
return *this;
}
inline Rectangle operator + ( const Rectangle& rRect, const Point& rPt )
{
Rectangle aRect( rRect.nLeft + rPt.X(), rRect.nTop + rPt.Y(),
(rRect.nRight == RECT_EMPTY) ? RECT_EMPTY : rRect.nRight + rPt.X(),
(rRect.nBottom == RECT_EMPTY) ? RECT_EMPTY : rRect.nBottom + rPt.Y() );
return aRect;
}
inline Rectangle operator - ( const Rectangle& rRect, const Point& rPt )
{
Rectangle aRect( rRect.nLeft - rPt.X(),
rRect.nTop - rPt.Y(),
(rRect.nRight == RECT_EMPTY) ? RECT_EMPTY : rRect.nRight - rPt.X(),
(rRect.nBottom == RECT_EMPTY) ? RECT_EMPTY : rRect.nBottom - rPt.Y() );
return aRect;
}
#endif // _GEN_HXX