LCOV - code coverage report
Current view: top level - include/tools - gen.hxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 234 275 85.1 %
Date: 2015-06-13 12:38:46 Functions: 93 107 86.9 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       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/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      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 .
      18             :  */
      19             : #ifndef INCLUDED_TOOLS_GEN_HXX
      20             : #define INCLUDED_TOOLS_GEN_HXX
      21             : 
      22             : #include <tools/toolsdllapi.h>
      23             : 
      24             : #include <limits.h>
      25             : #include <algorithm>
      26             : #include <ostream>
      27             : #include <cstdlib>
      28             : 
      29             : class SvStream;
      30             : namespace rtl
      31             : {
      32             :     class OString;
      33             : }
      34             : 
      35             : enum TriState { TRISTATE_FALSE, TRISTATE_TRUE, TRISTATE_INDET };
      36             : 
      37             : // Pair
      38             : 
      39             : class SAL_WARN_UNUSED Pair
      40             : {
      41             : public:
      42             :                         Pair();
      43             :                         Pair( long nA, long nB );
      44             : 
      45           5 :     long                A() const { return nA; }
      46          16 :     long                B() const { return nB; }
      47             : 
      48      112671 :     long&               A() { return nA; }
      49      112644 :     long&               B() { return nB; }
      50             : 
      51             :     bool                operator == ( const Pair& rPair ) const;
      52             :     bool                operator != ( const Pair& rPair ) const;
      53             : 
      54             :     TOOLS_DLLPUBLIC friend SvStream&    ReadPair( SvStream& rIStream, Pair& rPair );
      55             :     TOOLS_DLLPUBLIC friend SvStream&    WritePair( SvStream& rOStream, const Pair& rPair );
      56             : 
      57             : protected:
      58             :     long                nA;
      59             :     long                nB;
      60             : };
      61             : 
      62    42190481 : inline Pair::Pair()
      63             : {
      64    42190481 :     nA = nB = 0;
      65    42190481 : }
      66             : 
      67   187087280 : inline Pair::Pair( long _nA, long _nB )
      68             : {
      69   187087280 :     Pair::nA = _nA;
      70   187087280 :     Pair::nB = _nB;
      71   187087280 : }
      72             : 
      73    55259564 : inline bool Pair::operator == ( const Pair& rPair ) const
      74             : {
      75    55259564 :     return ((nA == rPair.nA) && (nB == rPair.nB));
      76             : }
      77             : 
      78    66423196 : inline bool Pair::operator != ( const Pair& rPair ) const
      79             : {
      80    66423196 :     return ((nA != rPair.nA) || (nB != rPair.nB));
      81             : }
      82             : 
      83             : // Point
      84             : 
      85             : class SAL_DLLPUBLIC_EXPORT SAL_WARN_UNUSED Point : public Pair
      86             : {
      87             : public:
      88             :                         Point();
      89             :                         Point( long nX, long nY );
      90             : 
      91   286733741 :     long                X() const { return nA; }
      92   260914421 :     long                Y() const { return nB; }
      93             : 
      94    84396116 :     long&               X() { return nA; }
      95    72177090 :     long&               Y() { return nB; }
      96             : 
      97             :     void                Move( long nHorzMove, long nVertMove );
      98             :     bool                IsAbove( const Point& rPoint ) const;
      99             :     bool                IsBelow( const Point& rPoint ) const;
     100             :     bool                IsLeft( const Point& rPoint ) const;
     101             :     bool                IsRight( const Point& rPoint ) const;
     102             : 
     103             :     void                RotateAround( long& rX, long& rY, short nOrientation ) const;
     104             : 
     105             : 
     106             :     Point&              operator += ( const Point& rPoint );
     107             :     Point&              operator -= ( const Point& rPoint );
     108             :     Point&              operator *= ( const long nVal );
     109             :     Point&              operator /= ( const long nVal );
     110             : 
     111             :     friend inline Point operator+( const Point &rVal1, const Point &rVal2 );
     112             :     friend inline Point operator-( const Point &rVal1, const Point &rVal2 );
     113             :     friend inline Point operator*( const Point &rVal1, const long nVal2 );
     114             :     friend inline Point operator/( const Point &rVal1, const long nVal2 );
     115             : 
     116   119051864 :     long                getX() const { return X(); }
     117   116215425 :     long                getY() const { return Y(); }
     118      820332 :     void                setX(long nX)  { X() = nX; }
     119      888339 :     void                setY(long nY)  { Y() = nY; }
     120             : };
     121             : 
     122    12065346 : inline Point::Point()
     123             : {
     124    12065346 : }
     125             : 
     126   115208381 : inline Point::Point( long nX, long nY ) : Pair( nX, nY )
     127             : {
     128   115208381 : }
     129             : 
     130        1413 : inline void Point::Move( long nHorzMove, long nVertMove )
     131             : {
     132        1413 :     nA += nHorzMove;
     133        1413 :     nB += nVertMove;
     134        1413 : }
     135             : 
     136             : inline bool Point::IsAbove( const Point& rPoint ) const
     137             : {
     138             :     return (nB > rPoint.nB);
     139             : }
     140             : 
     141             : inline bool Point::IsBelow( const Point& rPoint ) const
     142             : {
     143             :     return (nB < rPoint.nB);
     144             : }
     145             : 
     146             : inline bool Point::IsLeft( const Point& rPoint ) const
     147             : {
     148             :     return (nA < rPoint.nA);
     149             : }
     150             : 
     151             : inline bool Point::IsRight( const Point& rPoint ) const
     152             : {
     153             :     return (nA > rPoint.nA);
     154             : }
     155             : 
     156     4205683 : inline Point& Point::operator += ( const Point& rPoint )
     157             : {
     158     4205683 :     nA += rPoint.nA;
     159     4205683 :     nB += rPoint.nB;
     160     4205683 :     return *this;
     161             : }
     162             : 
     163      360502 : inline Point& Point::operator -= ( const Point& rPoint )
     164             : {
     165      360502 :     nA -= rPoint.nA;
     166      360502 :     nB -= rPoint.nB;
     167      360502 :     return *this;
     168             : }
     169             : 
     170         104 : inline Point& Point::operator *= ( const long nVal )
     171             : {
     172         104 :     nA *= nVal;
     173         104 :     nB *= nVal;
     174         104 :     return *this;
     175             : }
     176             : 
     177           0 : inline Point& Point::operator /= ( const long nVal )
     178             : {
     179           0 :     nA /= nVal;
     180           0 :     nB /= nVal;
     181           0 :     return *this;
     182             : }
     183             : 
     184     3924746 : inline Point operator+( const Point &rVal1, const Point &rVal2 )
     185             : {
     186     3924746 :     return Point( rVal1.nA+rVal2.nA, rVal1.nB+rVal2.nB );
     187             : }
     188             : 
     189     3618684 : inline Point operator-( const Point &rVal1, const Point &rVal2 )
     190             : {
     191     3618684 :     return Point( rVal1.nA-rVal2.nA, rVal1.nB-rVal2.nB );
     192             : }
     193             : 
     194           0 : inline Point operator*( const Point &rVal1, const long nVal2 )
     195             : {
     196           0 :     return Point( rVal1.nA*nVal2, rVal1.nB*nVal2 );
     197             : }
     198             : 
     199           0 : inline Point operator/( const Point &rVal1, const long nVal2 )
     200             : {
     201           0 :     return Point( rVal1.nA/nVal2, rVal1.nB/nVal2 );
     202             : }
     203             : 
     204             : template< typename charT, typename traits >
     205             : inline std::basic_ostream<charT, traits> & operator <<(
     206             :     std::basic_ostream<charT, traits> & stream, const Point& point )
     207             : {
     208             :     return stream << point.X() << ',' << point.Y();
     209             : }
     210             : 
     211             : // Size
     212             : 
     213             : class SAL_WARN_UNUSED Size : public Pair
     214             : {
     215             : public:
     216             :                     Size();
     217             :                     Size( long nWidth, long nHeight );
     218             : 
     219   251106581 :     long            Width() const  { return nA; }
     220   297939099 :     long            Height() const { return nB; }
     221             : 
     222   110234636 :     long&           Width()  { return nA; }
     223    19050184 :     long&           Height() { return nB; }
     224             : 
     225   226236869 :     long            getWidth() const { return Width(); }
     226   274901491 :     long            getHeight() const { return Height(); }
     227     3370730 :     void            setWidth(long nWidth)  { Width() = nWidth; }
     228     3223108 :     void            setHeight(long nHeight)  { Height() = nHeight; }
     229             : };
     230             : 
     231    30110809 : inline Size::Size()
     232             : {
     233    30110809 : }
     234             : 
     235    71271356 : inline Size::Size( long nWidth, long nHeight ) :
     236    71271356 :                 Pair( nWidth, nHeight )
     237             : {
     238    71271356 : }
     239             : 
     240             : template< typename charT, typename traits >
     241           0 : inline std::basic_ostream<charT, traits> & operator <<(
     242             :     std::basic_ostream<charT, traits> & stream, const Size& size )
     243             : {
     244           0 :     return stream << size.Width() << 'x' << size.Height();
     245             : }
     246             : 
     247             : // Range
     248             : 
     249             : #define RANGE_MAX   LONG_MAX
     250             : 
     251             : class SAL_WARN_UNUSED Range : public Pair
     252             : {
     253             : public:
     254             :                     Range();
     255             :                     Range( long nMin, long nMax );
     256             : 
     257       16839 :     long            Min() const { return nA; }
     258       17096 :     long            Max() const { return nB; }
     259      413161 :     long            Len() const { return nB - nA + 1; }
     260             : 
     261     1208333 :     long&           Min() { return nA; }
     262     2117048 :     long&           Max() { return nB; }
     263             : 
     264             :     bool            IsInside( long nIs ) const;
     265             : 
     266             :     void            Justify();
     267             : };
     268             : 
     269         346 : inline Range::Range()
     270             : {
     271         346 : }
     272             : 
     273      598721 : inline Range::Range( long nMin, long nMax ) : Pair( nMin, nMax )
     274             : {
     275      598721 : }
     276             : 
     277         541 : inline bool Range::IsInside( long nIs ) const
     278             : {
     279         541 :     return ((nA <= nIs) && (nIs <= nB ));
     280             : }
     281             : 
     282       78386 : inline void Range::Justify()
     283             : {
     284       78386 :     if ( nA > nB )
     285             :     {
     286         182 :         long nHelp = nA;
     287         182 :         nA = nB;
     288         182 :         nB = nHelp;
     289             :     }
     290       78386 : }
     291             : 
     292             : template< typename charT, typename traits >
     293             : inline std::basic_ostream<charT, traits> & operator <<(
     294             :     std::basic_ostream<charT, traits> & stream, const Range& range )
     295             : {
     296             :     return stream << range.Min() << '-' << range.Max();
     297             : }
     298             : 
     299             : // Selection
     300             : 
     301             : #define SELECTION_MIN   LONG_MIN
     302             : #define SELECTION_MAX   LONG_MAX
     303             : 
     304             : class SAL_WARN_UNUSED Selection : public Pair
     305             : {
     306             : public:
     307             :                     Selection();
     308             :                     Selection( long nPos );
     309             :                     Selection( long nMin, long nMax );
     310             : 
     311           0 :     long            Min() const { return nA; }
     312           0 :     long            Max() const { return nB; }
     313       43943 :     long            Len() const { return nB - nA; }
     314             : 
     315       94650 :     long&           Min() { return nA; }
     316       81896 :     long&           Max() { return nB; }
     317             : 
     318             :     bool            IsInside( long nIs ) const;
     319             : 
     320             :     void            Justify();
     321             : 
     322        1121 :     bool            operator !() const { return !Len(); }
     323             : 
     324           0 :     long            getMin() const { return Min(); }
     325             :     long            getMax() const { return Max(); }
     326           0 :     void            setMin(long nMin)  { Min() = nMin; }
     327           0 :     void            setMax(long nMax)  { Max() = nMax; }
     328             : };
     329             : 
     330       13977 : inline Selection::Selection()
     331             : {
     332       13977 : }
     333             : 
     334           0 : inline Selection::Selection( long nPos ) : Pair( nPos, nPos )
     335             : {
     336           0 : }
     337             : 
     338        8793 : inline Selection::Selection( long nMin, long nMax ) :
     339        8793 :            Pair( nMin, nMax )
     340             : {
     341        8793 : }
     342             : 
     343           0 : inline bool Selection::IsInside( long nIs ) const
     344             : {
     345           0 :     return ((nA <= nIs) && (nIs < nB ));
     346             : }
     347             : 
     348       14444 : inline void Selection::Justify()
     349             : {
     350       14444 :     if ( nA > nB )
     351             :     {
     352           1 :         long nHelp = nA;
     353           1 :         nA = nB;
     354           1 :         nB = nHelp;
     355             :     }
     356       14444 : }
     357             : 
     358             : template< typename charT, typename traits >
     359             : inline std::basic_ostream<charT, traits> & operator <<(
     360             :     std::basic_ostream<charT, traits> & stream, const Selection& selection )
     361             : {
     362             :     return stream << selection.Min() << '-' << selection.Max();
     363             : }
     364             : // Rectangle
     365             : 
     366             : #define RECT_EMPTY  ((short)-32767)
     367             : #define RECT_MAX    LONG_MAX
     368             : #define RECT_MIN    LONG_MIN
     369             : 
     370             : class TOOLS_DLLPUBLIC SAL_WARN_UNUSED Rectangle
     371             : {
     372             : public:
     373             :                         Rectangle();
     374             :                         Rectangle( const Point& rLT, const Point& rRB );
     375             :                         Rectangle( long nLeft, long nTop,
     376             :                                    long nRight, long nBottom );
     377             :                         Rectangle( const Point& rLT, const Size& rSize );
     378             : 
     379    12265842 :     long                Left() const    { return nLeft;   }
     380    11558926 :     long                Right() const   { return nRight;  }
     381    11978944 :     long                Top() const     { return nTop;    }
     382    11356187 :     long                Bottom() const  { return nBottom; }
     383             : 
     384     7292660 :     long&               Left()          { return nLeft;   }
     385     4313886 :     long&               Right()         { return nRight;  }
     386     8058764 :     long&               Top()           { return nTop;    }
     387     5124349 :     long&               Bottom()        { return nBottom; }
     388             : 
     389             :     inline Point        TopLeft() const;
     390             :     inline Point        TopRight() const;
     391             :     inline Point        TopCenter() const;
     392             :     inline Point        BottomLeft() const;
     393             :     inline Point        BottomRight() const;
     394             :     inline Point        BottomCenter() const;
     395             :     inline Point        LeftCenter() const;
     396             :     inline Point        RightCenter() const;
     397             :     inline Point        Center() const;
     398             : 
     399             :     inline void         Move( long nHorzMove, long nVertMove );
     400             :     inline void         Transpose();
     401             :     inline void         SetPos( const Point& rPoint );
     402             :     void                SetSize( const Size& rSize );
     403             :     inline Size         GetSize() const;
     404             : 
     405             :     inline long         GetWidth() const;
     406             :     inline long         GetHeight() const;
     407             : 
     408             :     Rectangle&          Union( const Rectangle& rRect );
     409             :     Rectangle&          Intersection( const Rectangle& rRect );
     410             :     inline Rectangle    GetUnion( const Rectangle& rRect ) const;
     411             :     inline Rectangle    GetIntersection( const Rectangle& rRect ) const;
     412             : 
     413             :     void                Justify();
     414             : 
     415             :     bool                IsInside( const Point& rPOINT ) const;
     416             :     bool                IsInside( const Rectangle& rRect ) const;
     417             :     bool                IsOver( const Rectangle& rRect ) const;
     418             : 
     419      631561 :     void                SetEmpty() { nRight = nBottom = RECT_EMPTY; }
     420             :     inline bool         IsEmpty() const;
     421             : 
     422             :     inline bool         operator == ( const Rectangle& rRect ) const;
     423             :     inline bool         operator != ( const Rectangle& rRect ) const;
     424             : 
     425             :     inline Rectangle&   operator += ( const Point& rPt );
     426             :     inline Rectangle&   operator -= ( const Point& rPt );
     427             : 
     428             :     friend inline Rectangle operator + ( const Rectangle& rRect, const Point& rPt );
     429             :     friend inline Rectangle operator - ( const Rectangle& rRect, const Point& rPt );
     430             : 
     431             :     TOOLS_DLLPUBLIC friend SvStream&    ReadRectangle( SvStream& rIStream, Rectangle& rRect );
     432             :     TOOLS_DLLPUBLIC friend SvStream&    WriteRectangle( SvStream& rOStream, const Rectangle& rRect );
     433             : 
     434             :     // ONE
     435       34277 :     long                getX() const { return nLeft; }
     436       71808 :     long                getY() const { return nTop; }
     437      154535 :     long                getWidth() const { return nRight - nLeft; }
     438      149992 :     long                getHeight() const { return nBottom - nTop; }
     439       23309 :     void                setX( long n ) { nRight += n-nLeft; nLeft = n; }
     440       23309 :     void                setY( long n ) { nBottom += n-nTop; nTop = n; }
     441      144053 :     void                setWidth( long n ) { nRight = nLeft + n; }
     442      160034 :     void                setHeight( long n ) { nBottom = nTop + n; }
     443             :     /// Returns the string representation of the rectangle, format is "x, y, width, height".
     444             :     rtl::OString        toString() const;
     445             : 
     446             :     /**
     447             :      * Expands the rectangle in all directions by the input value.
     448             :      */
     449             :     inline void expand(long nExpandBy);
     450             :     /**
     451             :      * Contracts the rectangle in all directions by the input value.
     452             :      */
     453             :     inline void contract(long nContractBy);
     454             : 
     455             : private:
     456             :     long                nLeft;
     457             :     long                nTop;
     458             :     long                nRight;
     459             :     long                nBottom;
     460             : };
     461             : 
     462    11089831 : inline Rectangle::Rectangle()
     463             : {
     464    11089831 :     nLeft = nTop = 0;
     465    11089831 :     nRight = nBottom = RECT_EMPTY;
     466    11089831 : }
     467             : 
     468      756078 : inline Rectangle::Rectangle( const Point& rLT, const Point& rRB )
     469             : {
     470      756078 :     nLeft   = rLT.X();
     471      756078 :     nTop    = rLT.Y();
     472      756078 :     nRight  = rRB.X();
     473      756078 :     nBottom = rRB.Y();
     474      756078 : }
     475             : 
     476     6222823 : inline Rectangle::Rectangle( long _nLeft,  long _nTop,
     477             :                              long _nRight, long _nBottom )
     478             : {
     479     6222823 :     nLeft   = _nLeft;
     480     6222823 :     nTop    = _nTop;
     481     6222823 :     nRight  = _nRight;
     482     6222823 :     nBottom = _nBottom;
     483     6222823 : }
     484             : 
     485     5706800 : inline Rectangle::Rectangle( const Point& rLT, const Size& rSize )
     486             : {
     487     5706800 :     nLeft   = rLT.X();
     488     5706800 :     nTop    = rLT.Y();
     489     5706800 :     nRight  = rSize.Width()  ? nLeft+rSize.Width()-1 : RECT_EMPTY;
     490     5706800 :     nBottom = rSize.Height() ? nTop+rSize.Height()-1 : RECT_EMPTY;
     491     5706800 : }
     492             : 
     493    17201556 : inline bool Rectangle::IsEmpty() const
     494             : {
     495    17201556 :     return ((nRight == RECT_EMPTY) || (nBottom == RECT_EMPTY));
     496             : }
     497             : 
     498     3044583 : inline Point Rectangle::TopLeft() const
     499             : {
     500     3044583 :     return Point( nLeft, nTop );
     501             : }
     502             : 
     503     1867803 : inline Point Rectangle::TopRight() const
     504             : {
     505     1867803 :     return Point( (nRight == RECT_EMPTY) ? nLeft : nRight, nTop );
     506             : }
     507             : 
     508     1895277 : inline Point Rectangle::BottomLeft() const
     509             : {
     510     1895277 :     return Point( nLeft, (nBottom == RECT_EMPTY) ? nTop : nBottom );
     511             : }
     512             : 
     513     1913412 : inline Point Rectangle::BottomRight() const
     514             : {
     515     1913412 :     return Point( (nRight  == RECT_EMPTY) ? nLeft : nRight,
     516     3826824 :                   (nBottom == RECT_EMPTY) ? nTop  : nBottom );
     517             : }
     518             : 
     519         343 : inline Point Rectangle::TopCenter() const
     520             : {
     521         343 :     if ( IsEmpty() )
     522           0 :         return Point( nLeft, nTop );
     523             :     else
     524         686 :         return Point( std::min( nLeft, nRight ) + std::abs( (nRight - nLeft)/2 ),
     525        1029 :                       std::min( nTop,  nBottom) );
     526             : }
     527             : 
     528         360 : inline Point Rectangle::BottomCenter() const
     529             : {
     530         360 :     if ( IsEmpty() )
     531           0 :         return Point( nLeft, nTop );
     532             :     else
     533         720 :         return Point( std::min( nLeft, nRight ) + std::abs( (nRight - nLeft)/2 ),
     534        1080 :                       std::max( nTop,  nBottom) );
     535             : }
     536             : 
     537         335 : inline Point Rectangle::LeftCenter() const
     538             : {
     539         335 :     if ( IsEmpty() )
     540           0 :         return Point( nLeft, nTop );
     541             :     else
     542         335 :         return Point( std::min( nLeft, nRight ), nTop + (nBottom - nTop)/2 );
     543             : }
     544             : 
     545         335 : inline Point Rectangle::RightCenter() const
     546             : {
     547         335 :     if ( IsEmpty() )
     548           0 :         return Point( nLeft, nTop );
     549             :     else
     550         335 :         return Point( std::max( nLeft, nRight ), nTop + (nBottom - nTop)/2 );
     551             : }
     552             : 
     553      303638 : inline Point Rectangle::Center() const
     554             : {
     555      303638 :     if ( IsEmpty() )
     556       74722 :         return Point( nLeft, nTop );
     557             :     else
     558      228916 :         return Point( nLeft+(nRight-nLeft)/2 , nTop+(nBottom-nTop)/2 );
     559             : }
     560             : 
     561      478661 : inline void Rectangle::Move( long nHorzMove, long nVertMove )
     562             : {
     563      478661 :     nLeft += nHorzMove;
     564      478661 :     nTop  += nVertMove;
     565      478661 :     if ( nRight != RECT_EMPTY )
     566      308536 :         nRight += nHorzMove;
     567      478661 :     if ( nBottom != RECT_EMPTY )
     568      306946 :         nBottom += nVertMove;
     569      478661 : }
     570             : 
     571           0 : void Rectangle::Transpose()
     572             : {
     573           0 :     if ( !IsEmpty() )
     574             :     {
     575           0 :         long swap( nLeft );
     576           0 :         nLeft = nTop;
     577           0 :         nTop = swap;
     578             : 
     579           0 :         swap = nRight;
     580           0 :         nRight = nBottom;
     581           0 :         nBottom = swap;
     582             :     }
     583           0 : }
     584             : 
     585        6608 : inline void Rectangle::SetPos( const Point& rPoint )
     586             : {
     587        6608 :     if ( nRight != RECT_EMPTY )
     588        4166 :         nRight += rPoint.X() - nLeft;
     589        6608 :     if ( nBottom != RECT_EMPTY )
     590        4167 :         nBottom += rPoint.Y() - nTop;
     591        6608 :     nLeft = rPoint.X();
     592        6608 :     nTop  = rPoint.Y();
     593        6608 : }
     594             : 
     595     5034032 : inline long Rectangle::GetWidth() const
     596             : {
     597             :     long n;
     598     5034032 :     if ( nRight == RECT_EMPTY )
     599       90706 :         n = 0;
     600             :     else
     601             :     {
     602     4943326 :         n = nRight - nLeft;
     603     4943326 :         if( n < 0 )
     604        7291 :             n--;
     605             :         else
     606     4936035 :             n++;
     607             :     }
     608             : 
     609     5034032 :     return n;
     610             : }
     611             : 
     612     5509891 : inline long Rectangle::GetHeight() const
     613             : {
     614             :     long n;
     615     5509891 :     if ( nBottom == RECT_EMPTY )
     616       86551 :         n = 0;
     617             :     else
     618             :     {
     619     5423340 :         n = nBottom - nTop;
     620     5423340 :         if ( n < 0 )
     621        6607 :             n--;
     622             :         else
     623     5416733 :             n++;
     624             :     }
     625             : 
     626     5509891 :     return n;
     627             : }
     628             : 
     629      670336 : inline Size Rectangle::GetSize() const
     630             : {
     631      670336 :     return Size( GetWidth(), GetHeight() );
     632             : }
     633             : 
     634           0 : inline Rectangle Rectangle::GetUnion( const Rectangle& rRect ) const
     635             : {
     636           0 :     Rectangle aTmpRect( *this );
     637           0 :     return aTmpRect.Union( rRect );
     638             : }
     639             : 
     640      206629 : inline Rectangle Rectangle::GetIntersection( const Rectangle& rRect ) const
     641             : {
     642      206629 :     Rectangle aTmpRect( *this );
     643      206629 :     return aTmpRect.Intersection( rRect );
     644             : }
     645             : 
     646       81058 : inline bool Rectangle::operator == ( const Rectangle& rRect ) const
     647             : {
     648      121884 :     return ((nLeft   == rRect.nLeft   ) &&
     649       81036 :             (nTop    == rRect.nTop    ) &&
     650      145483 :             (nRight  == rRect.nRight  ) &&
     651      105273 :             (nBottom == rRect.nBottom ));
     652             : }
     653             : 
     654      211288 : inline bool Rectangle::operator != ( const Rectangle& rRect ) const
     655             : {
     656      373727 :     return ((nLeft   != rRect.nLeft   ) ||
     657      322426 :             (nTop    != rRect.nTop    ) ||
     658      513905 :             (nRight  != rRect.nRight  ) ||
     659      353918 :             (nBottom != rRect.nBottom ));
     660             : }
     661             : 
     662     1677994 : inline Rectangle& Rectangle::operator +=( const Point& rPt )
     663             : {
     664     1677994 :     nLeft += rPt.X();
     665     1677994 :     nTop  += rPt.Y();
     666     1677994 :     if ( nRight != RECT_EMPTY )
     667     1677067 :         nRight += rPt.X();
     668     1677994 :     if ( nBottom != RECT_EMPTY )
     669     1599410 :         nBottom += rPt.Y();
     670     1677994 :     return *this;
     671             : }
     672             : 
     673       40972 : inline Rectangle& Rectangle::operator -= ( const Point& rPt )
     674             : {
     675       40972 :     nLeft -= rPt.X();
     676       40972 :     nTop  -= rPt.Y();
     677       40972 :     if ( nRight != RECT_EMPTY )
     678       40972 :         nRight -= rPt.X();
     679       40972 :     if ( nBottom != RECT_EMPTY )
     680       40972 :         nBottom -= rPt.Y();
     681       40972 :     return *this;
     682             : }
     683             : 
     684       20518 : inline Rectangle operator + ( const Rectangle& rRect, const Point& rPt )
     685             : {
     686       41036 :     Rectangle aRect( rRect.nLeft  + rPt.X(), rRect.nTop    + rPt.Y(),
     687       41036 :                      (rRect.nRight  == RECT_EMPTY) ? RECT_EMPTY : rRect.nRight + rPt.X(),
     688      102590 :                      (rRect.nBottom == RECT_EMPTY) ? RECT_EMPTY : rRect.nBottom + rPt.Y() );
     689       20518 :     return aRect;
     690             : }
     691             : 
     692        1451 : inline Rectangle operator - ( const Rectangle& rRect, const Point& rPt )
     693             : {
     694        1451 :     Rectangle aRect( rRect.nLeft - rPt.X(),
     695        1451 :                      rRect.nTop - rPt.Y(),
     696        2902 :                      (rRect.nRight  == RECT_EMPTY) ? RECT_EMPTY : rRect.nRight - rPt.X(),
     697        7255 :                      (rRect.nBottom == RECT_EMPTY) ? RECT_EMPTY : rRect.nBottom - rPt.Y() );
     698        1451 :     return aRect;
     699             : }
     700             : 
     701           0 : inline void Rectangle::expand(long nExpandBy)
     702             : {
     703           0 :     nLeft   -= nExpandBy;
     704           0 :     nTop    -= nExpandBy;
     705           0 :     nRight  += nExpandBy;
     706           0 :     nBottom += nExpandBy;
     707           0 : }
     708             : 
     709             : inline void Rectangle::contract(long nContractBy)
     710             : {
     711             :     nLeft   += nContractBy;
     712             :     nTop    += nContractBy;
     713             :     nRight  -= nContractBy;
     714             :     nBottom -= nContractBy;
     715             : }
     716             : 
     717             : template< typename charT, typename traits >
     718             : inline std::basic_ostream<charT, traits> & operator <<(
     719             :     std::basic_ostream<charT, traits> & stream, const Rectangle& rectangle )
     720             : {
     721             :     if (rectangle.IsEmpty())
     722             :         return stream << "EMPTY";
     723             :     else
     724             :         return stream << rectangle.getWidth() << 'x' << rectangle.getHeight()
     725             :                       << "@(" << rectangle.getX() << ',' << rectangle.getY() << ")";
     726             : }
     727             : 
     728             : #endif
     729             : 
     730             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11