Simplify tools::Rectangle a bit

1. Simplify/delegate ctors
2. Simplify getWidth/getHeight
3. Simplify expand
4. Simplify operators += / -= / + / -

Change-Id: I023aa1bb2905394fbbd29adc7c544d629f9ae2d6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120476
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
diff --git a/include/tools/gen.hxx b/include/tools/gen.hxx
index b8bd6ee..3c97728 100644
--- a/include/tools/gen.hxx
+++ b/include/tools/gen.hxx
@@ -464,7 +464,7 @@ class SAL_WARN_UNUSED TOOLS_DLLPUBLIC Rectangle final
{
    static constexpr short RECT_EMPTY = -32767;
public:
    constexpr Rectangle();
    constexpr Rectangle() = default;
    constexpr Rectangle( const Point& rLT, const Point& rRB );
    constexpr Rectangle( tools::Long nLeft, tools::Long nTop,
                         tools::Long nRight, tools::Long nBottom );
@@ -475,14 +475,14 @@ public:
    static Rectangle    Justify( const Point& rLT, const Point& rRB );

    constexpr tools::Long Left() const { return nLeft; }
    constexpr tools::Long Right() const { return nRight == RECT_EMPTY ? nLeft : nRight; }
    constexpr tools::Long Right() const { return IsWidthEmpty() ? nLeft : nRight; }
    constexpr tools::Long Top() const { return nTop; }
    constexpr tools::Long Bottom() const { return nBottom == RECT_EMPTY ? nTop : nBottom; }
    constexpr tools::Long Bottom() const { return IsHeightEmpty() ? nTop : nBottom; }

    void                SetLeft(tools::Long v)    { nLeft = v;   }
    void                SetRight(tools::Long v)   { nRight = v;  }
    void                SetTop(tools::Long v)     { nTop = v;    }
    void                SetBottom(tools::Long v)  { nBottom = v; }
    constexpr void SetLeft(tools::Long v) { nLeft = v; }
    constexpr void SetRight(tools::Long v) { nRight = v; }
    constexpr void SetTop(tools::Long v) { nTop = v; }
    constexpr void SetBottom(tools::Long v) { nBottom = v; }

    constexpr Point TopLeft() const { return { Left(), Top() }; }
    constexpr Point TopRight() const { return { Right(), Top() }; }
@@ -511,7 +511,7 @@ public:
    {
        tools::Long n = 0;

        if (nRight != RECT_EMPTY)
        if (!IsWidthEmpty())
        {
            n = nRight - nLeft;
            if (n < 0)
@@ -528,7 +528,7 @@ public:
    {
        tools::Long n = 0;

        if (nBottom != RECT_EMPTY)
        if (!IsHeightEmpty())
        {
            n = nBottom - nTop;
            if (n < 0)
@@ -554,9 +554,9 @@ public:
    void                SetEmpty() { nRight = nBottom = RECT_EMPTY; }
    void                SetWidthEmpty() { nRight = RECT_EMPTY; }
    void                SetHeightEmpty() { nBottom = RECT_EMPTY; }
    constexpr bool IsEmpty() const { return (nRight == RECT_EMPTY) || (nBottom == RECT_EMPTY); }
    bool                IsWidthEmpty() const { return nRight == RECT_EMPTY; }
    bool                IsHeightEmpty() const { return nBottom == RECT_EMPTY; }
    constexpr bool IsEmpty() const { return IsWidthEmpty() || IsHeightEmpty(); }
    constexpr bool IsWidthEmpty() const { return nRight == RECT_EMPTY; }
    constexpr bool IsHeightEmpty() const { return nBottom == RECT_EMPTY; }

    inline bool         operator == ( const tools::Rectangle& rRect ) const;
    inline bool         operator != ( const tools::Rectangle& rRect ) const;
@@ -571,9 +571,9 @@ public:
    tools::Long         getX() const { return nLeft; }
    tools::Long         getY() const { return nTop; }
    /// Returns the difference between right and left, assuming the range includes one end, but not the other.
    tools::Long         getWidth() const;
    tools::Long getWidth() const { return Right() - Left(); }
    /// Returns the difference between bottom and top, assuming the range includes one end, but not the other.
    tools::Long         getHeight() const;
    tools::Long getHeight() const { return Bottom() - Top(); }
    /// Set the left edge of the rectangle to x, preserving the width
    void                setX( tools::Long x );
    /// Set the top edge of the rectangle to y, preserving the height
@@ -597,25 +597,15 @@ public:
    void                SaturatingSetY(tools::Long y);

private:
    tools::Long                nLeft;
    tools::Long                nTop;
    tools::Long                nRight;
    tools::Long                nBottom;
    tools::Long nLeft = 0;
    tools::Long nTop = 0;
    tools::Long nRight = RECT_EMPTY;
    tools::Long nBottom = RECT_EMPTY;
};
}

constexpr inline tools::Rectangle::Rectangle()
    : nLeft( 0 )
    , nTop( 0 )
    , nRight( RECT_EMPTY )
    , nBottom( RECT_EMPTY )
{}

constexpr inline tools::Rectangle::Rectangle( const Point& rLT, const Point& rRB )
    : nLeft( rLT.X())
    , nTop( rLT.Y())
    , nRight( rRB.X())
    , nBottom( rRB.Y())
    : Rectangle(rLT.X(), rLT.Y(), rRB.X(), rRB.Y())
{}

constexpr inline tools::Rectangle::Rectangle( tools::Long _nLeft,  tools::Long _nTop,
@@ -627,10 +617,8 @@ constexpr inline tools::Rectangle::Rectangle( tools::Long _nLeft,  tools::Long _
{}

constexpr inline tools::Rectangle::Rectangle( tools::Long _nLeft,  tools::Long _nTop )
    : nLeft( _nLeft )
    , nTop( _nTop )
    , nRight( RECT_EMPTY )
    , nBottom( RECT_EMPTY )
    : nLeft(_nLeft)
    , nTop(_nTop)
{}

constexpr inline tools::Rectangle::Rectangle( const Point& rLT, const Size& rSize )
@@ -644,17 +632,17 @@ inline void tools::Rectangle::Move( tools::Long nHorzMove, tools::Long nVertMove
{
    nLeft += nHorzMove;
    nTop  += nVertMove;
    if ( nRight != RECT_EMPTY )
    if (!IsWidthEmpty())
        nRight += nHorzMove;
    if ( nBottom != RECT_EMPTY )
    if (!IsHeightEmpty())
        nBottom += nVertMove;
}

inline void tools::Rectangle::SetPos( const Point& rPoint )
{
    if ( nRight != RECT_EMPTY )
    if (!IsWidthEmpty())
        nRight += rPoint.X() - nLeft;
    if ( nBottom != RECT_EMPTY )
    if (!IsHeightEmpty())
        nBottom += rPoint.Y() - nTop;
    nLeft = rPoint.X();
    nTop  = rPoint.Y();
@@ -690,23 +678,13 @@ inline bool tools::Rectangle::operator != ( const tools::Rectangle& rRect ) cons

inline tools::Rectangle& tools::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();
    Move(rPt.X(), rPt.Y());
    return *this;
}

inline tools::Rectangle& tools::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();
    Move(-rPt.X(), -rPt.Y());
    return *this;
}

@@ -714,18 +692,12 @@ namespace tools
{
inline Rectangle operator + ( const Rectangle& rRect, const Point& rPt )
{
    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() );
    return Rectangle{ rRect }.operator+=(rPt);
}

inline Rectangle operator - ( const Rectangle& rRect, const Point& rPt )
{
    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() );
    return Rectangle{ rRect }.operator-=(rPt);
}

}
diff --git a/tools/source/generic/gen.cxx b/tools/source/generic/gen.cxx
index 2edb63c..5196ef0 100644
--- a/tools/source/generic/gen.cxx
+++ b/tools/source/generic/gen.cxx
@@ -51,14 +51,14 @@ void tools::Rectangle::SetSize( const Size& rSize )
    else if ( rSize.Width() > 0 )
        nRight  = nLeft + rSize.Width() -1;
    else
        nRight = RECT_EMPTY;
        SetWidthEmpty();

    if ( rSize.Height() < 0 )
        nBottom  = nTop + rSize.Height() +1;
    else if ( rSize.Height() > 0 )
        nBottom  = nTop + rSize.Height() -1;
    else
        nBottom = RECT_EMPTY;
        SetHeightEmpty();
}

void tools::Rectangle::SaturatingSetSize(const Size& rSize)
@@ -68,26 +68,26 @@ void tools::Rectangle::SaturatingSetSize(const Size& rSize)
    else if ( rSize.Width() > 0 )
        nRight = o3tl::saturating_add(nLeft, (rSize.Width() - 1));
    else
        nRight = RECT_EMPTY;
        SetWidthEmpty();

    if ( rSize.Height() < 0 )
        nBottom = o3tl::saturating_add(nTop, (rSize.Height() + 1));
    else if ( rSize.Height() > 0 )
        nBottom = o3tl::saturating_add(nTop, (rSize.Height() - 1));
    else
        nBottom = RECT_EMPTY;
        SetHeightEmpty();
}

void tools::Rectangle::SaturatingSetX(tools::Long x)
{
    if (nRight != RECT_EMPTY)
    if (!IsWidthEmpty())
        nRight = o3tl::saturating_add(nRight, x - nLeft);
    nLeft = x;
}

void tools::Rectangle::SaturatingSetY(tools::Long y)
{
    if (nBottom != RECT_EMPTY)
    if (!IsHeightEmpty())
        nBottom = o3tl::saturating_add(nBottom, y - nTop);
    nTop = y;
}
@@ -138,12 +138,12 @@ tools::Rectangle& tools::Rectangle::Intersection( const tools::Rectangle& rRect 

void tools::Rectangle::Justify()
{
    if ( (nRight < nLeft) && (nRight != RECT_EMPTY) )
    if ((nRight < nLeft) && (!IsWidthEmpty()))
    {
        std::swap(nLeft, nRight);
    }

    if ( (nBottom < nTop) && (nBottom != RECT_EMPTY) )
    if ((nBottom < nTop) && (!IsHeightEmpty()))
    {
        std::swap(nBottom, nTop);
    }
@@ -198,31 +198,25 @@ OString tools::Rectangle::toString() const

void tools::Rectangle::expand(tools::Long nExpandBy)
{
    nLeft   -= nExpandBy;
    nTop    -= nExpandBy;
    if (nRight == RECT_EMPTY)
        nRight = nLeft + nExpandBy - 1;
    else
        nRight += nExpandBy;
    if (nBottom == RECT_EMPTY)
        nBottom = nTop + nExpandBy - 1;
    else
        nBottom += nExpandBy;
    AdjustLeft(-nExpandBy);
    AdjustTop(-nExpandBy);
    AdjustRight(nExpandBy);
    AdjustBottom(nExpandBy);
}

void tools::Rectangle::shrink(tools::Long nShrinkBy)
{
    nLeft   += nShrinkBy;
    nTop    += nShrinkBy;
    if (nRight != RECT_EMPTY)
    if (!IsWidthEmpty())
        nRight -= nShrinkBy;
    if (nBottom != RECT_EMPTY)
    if (!IsHeightEmpty())
        nBottom -= nShrinkBy;
}

tools::Long tools::Rectangle::AdjustRight(tools::Long nHorzMoveDelta)
{
    if (nRight == RECT_EMPTY)
    if (IsWidthEmpty())
        nRight = nLeft + nHorzMoveDelta - 1;
    else
        nRight += nHorzMoveDelta;
@@ -231,7 +225,7 @@ tools::Long tools::Rectangle::AdjustRight(tools::Long nHorzMoveDelta)

tools::Long tools::Rectangle::AdjustBottom( tools::Long nVertMoveDelta )
{
    if (nBottom == RECT_EMPTY)
    if (IsHeightEmpty())
        nBottom = nTop + nVertMoveDelta - 1;
    else
        nBottom += nVertMoveDelta;
@@ -240,28 +234,16 @@ tools::Long tools::Rectangle::AdjustBottom( tools::Long nVertMoveDelta )

void tools::Rectangle::setX( tools::Long x )
{
    if (nRight != RECT_EMPTY)
    if (!IsWidthEmpty())
        nRight += x - nLeft;
    nLeft = x;
}

void tools::Rectangle::setY( tools::Long y )
{
    if (nBottom != RECT_EMPTY)
    if (!IsHeightEmpty())
        nBottom += y - nTop;
    nTop  = y;
}

/// Returns the difference between right and left, assuming the range includes one end, but not the other.
tools::Long tools::Rectangle::getWidth() const
{
    return nRight == RECT_EMPTY ? 0 : nRight - nLeft;
}

/// Returns the difference between bottom and top, assuming the range includes one end, but not the other.
tools::Long tools::Rectangle::getHeight() const
{
    return nBottom == RECT_EMPTY ? 0 : nBottom - nTop;
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */