[Libreoffice-commits] core.git: Branch 'feature/borderline3' - include/svx svx/source

Armin Le Grand Armin.Le.Grand at cib.de
Thu Aug 31 12:11:11 UTC 2017


 include/svx/framelink.hxx            |   49 +---
 svx/source/dialog/framelink.cxx      |  130 +++--------
 svx/source/dialog/framelinkarray.cxx |  387 ++++++++++++++++++-----------------
 3 files changed, 264 insertions(+), 302 deletions(-)

New commits:
commit df3e2aa2464dfc98cc516398ada3560796142ba0
Author: Armin Le Grand <Armin.Le.Grand at cib.de>
Date:   Thu Aug 31 14:05:12 2017 +0200

    borderline: move geometry creation to linear algebra
    
    Adapted Array::DrawRange to Style/Vector usages, feeding new
    CreateBorderPrimitives method. That one roughly feeds the old
    implementations to test and check (and keep working)
    
    Change-Id: I09557f826cd023d27db6b53e53aa69c149308711

diff --git a/include/svx/framelink.hxx b/include/svx/framelink.hxx
index d0fb165eef79..3efd7165c75a 100644
--- a/include/svx/framelink.hxx
+++ b/include/svx/framelink.hxx
@@ -334,41 +334,36 @@ SVX_DLLPUBLIC void CreateBorderPrimitives(
     const Color*        pForceColor     /// If specified, overrides frame border color.
 );
 
-/** Draws both diagonal frame borders, regards all connected frame styles.
-
-One or both passed diagonal frame styles may be invisible.
-
-The function preserves all settings of the passed output device.
-*/
-SVX_DLLPUBLIC void CreateDiagFrameBorderPrimitives(
-    drawinglayer::primitive2d::Primitive2DContainer&    rTarget,        /// target for created primitives
-
-    const basegfx::B2DPoint&                            rOrigin,        /// Origin of the coordinate system spawning the cell
-    const basegfx::B2DVector&                           rXAxis,         /// X-Axis of the coordinate system spawning the cell
-    const basegfx::B2DVector&                           rYAxis,         /// Y-Axis of the coordinate system spawning the cell
+class StyleVectorCombination
+{
+private:
+    const Style&                mrStyle;
+    const basegfx::B2DVector&   mrB2DVector;
 
-    const Style&        rTLBR,          /// Style of the processed top-left to bottom-right diagonal frame border.
-    const Style&        rBLTR,          /// Style of the processed bottom-left to top-right diagonal frame border.
+public:
+    StyleVectorCombination(const Style& rStyle, const basegfx::B2DVector& rB2DVector) :
+        mrStyle(rStyle),
+        mrB2DVector(rB2DVector)
+    {}
 
-    const Style&        rTLFromB,       /// Vertical frame border from bottom to top-left end of rTLBR.
-    const Style&        rTLFromR,       /// Horizontal frame border from right to top-left end of rTLBR.
-    const Style&        rBRFromT,       /// Vertical frame border from top to bottom-right end of rTLBR.
-    const Style&        rBRFromL,       /// Horizontal frame border from left to bottom-right end of rTLBR.
+    const Style& getStyle() const { return mrStyle; }
+    const basegfx::B2DVector& getB2DVector() const { return mrB2DVector; }
+};
 
-    const Style&        rBLFromT,       /// Vertical frame border from top to bottom-left end of rBLTR.
-    const Style&        rBLFromR,       /// Horizontal frame border from right to bottom-left end of rBLTR.
-    const Style&        rTRFromB,       /// Vertical frame border from bottom to top-right end of rBLTR.
-    const Style&        rTRFromL,       /// Horizontal frame border from left to top-right end of rBLTR.
+typedef std::vector< StyleVectorCombination > StyleVectorTable;
 
-    const Color*        pForceColor     /// If specified, overrides frame border color.
+SVX_DLLPUBLIC void CreateBorderPrimitives(
+    drawinglayer::primitive2d::Primitive2DContainer&    rTarget,        /// target for created primitives
+    const basegfx::B2DPoint&    rOrigin,                /// start point of borderline
+    const basegfx::B2DVector&   rX,                     /// X-Axis of borderline with length
+    const Style&                rBorder,                /// Style of borderline
+    const StyleVectorTable&     rStartStyleVectorTable, /// Styles and vectors (pointing away) at borderline start, ccw
+    const StyleVectorTable&     rEndStyleVectorTable,   /// Styles and vectors (pointing away) at borderline end, cw
+    const Color*                pForceColor             /// If specified, overrides frame border color.
 );
 
-
 }
 }
 
-/* Yes, I love ASCII art. :-) -DR- */
-
 #endif
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/source/dialog/framelink.cxx b/svx/source/dialog/framelink.cxx
index 4f333828f3d6..36c5e9ae8130 100644
--- a/svx/source/dialog/framelink.cxx
+++ b/svx/source/dialog/framelink.cxx
@@ -624,6 +624,44 @@ void CreateBorderPrimitives(
     drawinglayer::primitive2d::Primitive2DContainer& rTarget,
     const basegfx::B2DPoint& rOrigin,
     const basegfx::B2DVector& rX,
+    const Style& rBorder,
+    const StyleVectorTable& rStartStyleVectorTable,
+    const StyleVectorTable& rEndStyleVectorTable,
+    const Color* pForceColor)
+{
+    /// rough mapping for testing
+    if (rBorder.Prim() || rBorder.Secn())
+    {
+        const size_t nStart(rStartStyleVectorTable.size());
+        const size_t nEnd(rEndStyleVectorTable.size());
+
+        CreateBorderPrimitives(
+            rTarget,
+            rOrigin,
+            rX,
+            basegfx::getNormalizedPerpendicular(rX),
+            rBorder,
+
+            2 == nStart ? rStartStyleVectorTable[0].getStyle() : 5 == nStart ? rStartStyleVectorTable[0].getStyle() : Style(),
+            5 == nStart ? rStartStyleVectorTable[1].getStyle() : Style(),
+            5 == nStart ? rStartStyleVectorTable[2].getStyle() : Style(),
+            5 == nStart ? rStartStyleVectorTable[3].getStyle() : Style(),
+            2 == nStart ? rStartStyleVectorTable[1].getStyle() : 5 == nStart ? rStartStyleVectorTable[4].getStyle() : Style(),
+
+            2 == nEnd ? rEndStyleVectorTable[0].getStyle() : 5 == nEnd ? rEndStyleVectorTable[0].getStyle() : Style(),
+            5 == nEnd ? rEndStyleVectorTable[1].getStyle() : Style(),
+            5 == nEnd ? rEndStyleVectorTable[2].getStyle() : Style(),
+            5 == nEnd ? rEndStyleVectorTable[3].getStyle() : Style(),
+            2 == nEnd ? rEndStyleVectorTable[1].getStyle() : 5 == nEnd ? rEndStyleVectorTable[4].getStyle() : Style(),
+
+            pForceColor);
+    }
+}
+
+void CreateBorderPrimitives(
+    drawinglayer::primitive2d::Primitive2DContainer& rTarget,
+    const basegfx::B2DPoint& rOrigin,
+    const basegfx::B2DVector& rX,
     const basegfx::B2DVector& rY,
     const Style& rBorder,
     const Style& rLFromT,
@@ -656,98 +694,6 @@ void CreateBorderPrimitives(
     }
 }
 
-void CreateDiagFrameBorderPrimitives(
-    drawinglayer::primitive2d::Primitive2DContainer& rTarget,
-    const basegfx::B2DPoint& rOrigin,
-    const basegfx::B2DVector& rXAxis,
-    const basegfx::B2DVector& rYAxis,
-    const Style& rTLBR,
-    const Style& rBLTR,
-    const Style& /*rTLFromB*/,
-    const Style& /*rTLFromR*/,
-    const Style& /*rBRFromT*/,
-    const Style& /*rBRFromL*/,
-    const Style& /*rBLFromT*/,
-    const Style& /*rBLFromR*/,
-    const Style& /*rTRFromB*/,
-    const Style& /*rTRFromL*/,
-    const Color* pForceColor)
-{
-    // currently the diagonal edges are just added as-is without cutting them against the incoming
-    // edges. This needs to be improved in the future, so please do *not* remove the currently unused
-    // parameters from above
-    if (rTLBR.Prim())
-    {
-        // top-left to bottom-right
-        if (basegfx::fTools::equalZero(rTLBR.Secn()))
-        {
-            rTarget.append(
-                new drawinglayer::primitive2d::BorderLinePrimitive2D(
-                    rOrigin,
-                    rOrigin + rXAxis + rYAxis,
-                    drawinglayer::primitive2d::BorderLine(
-                        rTLBR.Prim(),
-                        (pForceColor ? *pForceColor : rTLBR.GetColorPrim()).getBColor()),
-                    rTLBR.Type(),
-                    rTLBR.PatternScale()));
-        }
-        else
-        {
-            rTarget.append(
-                new drawinglayer::primitive2d::BorderLinePrimitive2D(
-                    rOrigin,
-                    rOrigin + rXAxis + rYAxis,
-                    drawinglayer::primitive2d::BorderLine(
-                        rTLBR.Prim(),
-                        (pForceColor ? *pForceColor : rTLBR.GetColorPrim()).getBColor()),
-                    drawinglayer::primitive2d::BorderLine(
-                        rTLBR.Dist(),
-                        (pForceColor ? *pForceColor : rTLBR.GetColorGap()).getBColor()),
-                    drawinglayer::primitive2d::BorderLine(
-                        rTLBR.Secn(),
-                        (pForceColor ? *pForceColor : rTLBR.GetColorSecn()).getBColor()),
-                    rTLBR.UseGapColor(),
-                    rTLBR.Type(),
-                    rTLBR.PatternScale()));
-        }
-    }
-
-    if (rBLTR.Prim())
-    {
-        // bottom-left to top-right
-        if (basegfx::fTools::equalZero(rTLBR.Secn()))
-        {
-            rTarget.append(
-                new drawinglayer::primitive2d::BorderLinePrimitive2D(
-                    rOrigin + rYAxis,
-                    rOrigin + rXAxis,
-                    drawinglayer::primitive2d::BorderLine(
-                        rTLBR.Prim(),
-                        (pForceColor ? *pForceColor : rTLBR.GetColorPrim()).getBColor()),
-                    rBLTR.Type(),
-                    rBLTR.PatternScale()));
-        }
-        else
-        {
-            rTarget.append(
-                new drawinglayer::primitive2d::BorderLinePrimitive2D(
-                    rOrigin + rYAxis,
-                    rOrigin + rXAxis,
-                    drawinglayer::primitive2d::BorderLine(
-                        rTLBR.Prim(),
-                        (pForceColor ? *pForceColor : rTLBR.GetColorPrim()).getBColor()),
-                    drawinglayer::primitive2d::BorderLine(
-                        rTLBR.Dist(),
-                        (pForceColor ? *pForceColor : rTLBR.GetColorGap()).getBColor()),
-                    drawinglayer::primitive2d::BorderLine(
-                        rTLBR.Secn(),
-                        (pForceColor ? *pForceColor : rTLBR.GetColorSecn()).getBColor()),
-                    rBLTR.UseGapColor(),
-                    rBLTR.Type(),
-                    rBLTR.PatternScale()));
-        }
-    }
-}
 }
 }
 
diff --git a/svx/source/dialog/framelinkarray.cxx b/svx/source/dialog/framelinkarray.cxx
index 70a7175e7d96..586e095f18bc 100644
--- a/svx/source/dialog/framelinkarray.cxx
+++ b/svx/source/dialog/framelinkarray.cxx
@@ -97,38 +97,42 @@ basegfx::B2DHomMatrix Cell::CreateCoordinateSystem(const Array& rArray) const
     if(-1 != maCellIndex)
     {
         const basegfx::B2DRange aRange(rArray.GetCellRange(maCellIndex));
-        basegfx::B2DPoint aOrigin(aRange.getMinimum());
-        basegfx::B2DVector aX(aRange.getWidth(), 0.0);
-        basegfx::B2DVector aY(0.0, aRange.getHeight());
 
-        if (IsRotated() && SvxRotateMode::SVX_ROTATE_MODE_STANDARD != meRotMode)
+        if(!aRange.isEmpty())
         {
-            // when rotated, adapt values. Get Skew (cos/sin == 1/tan)
-            const double fSkew(aY.getY() * (cos(mfOrientation) / sin(mfOrientation)));
+            basegfx::B2DPoint aOrigin(aRange.getMinimum());
+            basegfx::B2DVector aX(aRange.getWidth(), 0.0);
+            basegfx::B2DVector aY(0.0, aRange.getHeight());
 
-            switch (meRotMode)
+            if (IsRotated() && SvxRotateMode::SVX_ROTATE_MODE_STANDARD != meRotMode)
             {
-            case SvxRotateMode::SVX_ROTATE_MODE_TOP:
-                // shear Y-Axis
-                aY.setX(-fSkew);
-                break;
-            case SvxRotateMode::SVX_ROTATE_MODE_CENTER:
-                // shear origin half, Y full
-                aOrigin.setX(aOrigin.getX() + (fSkew * 0.5));
-                aY.setX(-fSkew);
-                break;
-            case SvxRotateMode::SVX_ROTATE_MODE_BOTTOM:
-                // shear origin full, Y full
-                aOrigin.setX(aOrigin.getX() + fSkew);
-                aY.setX(-fSkew);
-                break;
-            default: // SvxRotateMode::SVX_ROTATE_MODE_STANDARD, already excluded above
-                break;
+                // when rotated, adapt values. Get Skew (cos/sin == 1/tan)
+                const double fSkew(aY.getY() * (cos(mfOrientation) / sin(mfOrientation)));
+
+                switch (meRotMode)
+                {
+                case SvxRotateMode::SVX_ROTATE_MODE_TOP:
+                    // shear Y-Axis
+                    aY.setX(-fSkew);
+                    break;
+                case SvxRotateMode::SVX_ROTATE_MODE_CENTER:
+                    // shear origin half, Y full
+                    aOrigin.setX(aOrigin.getX() + (fSkew * 0.5));
+                    aY.setX(-fSkew);
+                    break;
+                case SvxRotateMode::SVX_ROTATE_MODE_BOTTOM:
+                    // shear origin full, Y full
+                    aOrigin.setX(aOrigin.getX() + fSkew);
+                    aY.setX(-fSkew);
+                    break;
+                default: // SvxRotateMode::SVX_ROTATE_MODE_STANDARD, already excluded above
+                    break;
+                }
             }
-        }
 
-        // use column vectors as coordinate axes, homogen column for translation
-        const_cast<Cell*>(this)->maCoordinateSystem = basegfx::tools::createCoordinateSystemTransform(aOrigin, aX, aY);
+            // use column vectors as coordinate axes, homogen column for translation
+            const_cast<Cell*>(this)->maCoordinateSystem = basegfx::tools::createCoordinateSystemTransform(aOrigin, aX, aY);
+        }
     }
 
     return maCoordinateSystem;
@@ -928,6 +932,84 @@ void Array::MirrorSelfX()
 }
 
 // drawing
+void HelperCreateHorizontalBorderPrimitives(
+    const basegfx::B2DHomMatrix& rCoordinateSystem, drawinglayer::primitive2d::Primitive2DContainer& rSequence, bool bUpper, const Style& rBorder,
+    const Style& rStartFromTR, const Style& rStartLFromT, const Style& rStartLFromL, const Style& rStartLFromB, const Style& rStartFromBR,
+    const Style& rEndFromTL, const Style& rEndRFromT, const Style& rEndRFromR, const Style& rEndRFromB, const Style& rEndFromBL,
+    const Color* pForceColor)
+{
+    const basegfx::B2DVector aX(basegfx::tools::getColumn(rCoordinateSystem, 0));
+    const basegfx::B2DVector aY(basegfx::tools::getColumn(rCoordinateSystem, 1));
+
+    if(!aX.equalZero() && !aY.equalZero())
+    {
+        const basegfx::B2DPoint aOrigin(basegfx::tools::getColumn(rCoordinateSystem, 2));
+        StyleVectorTable aStart;
+        StyleVectorTable aEnd;
+
+        if(rStartFromTR.Prim()) aStart.push_back(StyleVectorCombination(rStartFromTR, aX - aY));
+        if(rStartLFromT.Prim()) aStart.push_back(StyleVectorCombination(rStartLFromT, -aY));
+        if(rStartLFromL.Prim()) aStart.push_back(StyleVectorCombination(rStartLFromL, -aX));
+        if(rStartLFromB.Prim()) aStart.push_back(StyleVectorCombination(rStartLFromB, aY));
+        if(rStartFromBR.Prim()) aStart.push_back(StyleVectorCombination(rStartFromBR, aX + aY));
+
+        if(rEndFromTL.Prim()) aEnd.push_back(StyleVectorCombination(rEndFromTL, -aX -aY));
+        if(rEndRFromT.Prim()) aEnd.push_back(StyleVectorCombination(rEndRFromT, -aY));
+        if(rEndRFromR.Prim()) aEnd.push_back(StyleVectorCombination(rEndRFromR, aX));
+        if(rEndRFromB.Prim()) aEnd.push_back(StyleVectorCombination(rEndRFromB, aY));
+        if(rEndFromBL.Prim()) aEnd.push_back(StyleVectorCombination(rEndFromBL, aY - aX));
+
+        CreateBorderPrimitives(
+            rSequence,
+            bUpper ? aOrigin : aOrigin + aY,
+            aX,
+            rBorder,
+            aStart,
+            aEnd,
+            pForceColor
+        );
+    }
+}
+
+void HelperCreateVerticalBorderPrimitives(
+    const basegfx::B2DHomMatrix& rCoordinateSystem, drawinglayer::primitive2d::Primitive2DContainer& rSequence, bool bLeft, const Style& rBorder,
+    const Style& rStartFromBR, const Style& rStartTFromR, const Style& rStartTFromT, const Style& rStartTFromL, const Style& rStartFromBL,
+    const Style& rEndFromTR, const Style& rEndBFromR, const Style& rEndBFromB, const Style& rEndBFromL, const Style& rEndFromTL,
+    const Color* pForceColor)
+{
+    const basegfx::B2DVector aX(basegfx::tools::getColumn(rCoordinateSystem, 0));
+    const basegfx::B2DVector aY(basegfx::tools::getColumn(rCoordinateSystem, 1));
+
+    if(!aX.equalZero() && !aY.equalZero())
+    {
+        const basegfx::B2DPoint aOrigin(basegfx::tools::getColumn(rCoordinateSystem, 2));
+        StyleVectorTable aStart;
+        StyleVectorTable aEnd;
+
+        if(rStartFromBR.Prim()) aStart.push_back(StyleVectorCombination(rStartFromBR, aX + aY));
+        if(rStartTFromR.Prim()) aStart.push_back(StyleVectorCombination(rStartTFromR, aX));
+        if(rStartTFromT.Prim()) aStart.push_back(StyleVectorCombination(rStartTFromT, aY));
+        if(rStartTFromL.Prim()) aStart.push_back(StyleVectorCombination(rStartTFromL, -aX));
+        if(rStartFromBL.Prim()) aStart.push_back(StyleVectorCombination(rStartFromBL, aY - aX));
+
+        if(rEndFromTR.Prim()) aEnd.push_back(StyleVectorCombination(rEndFromTR, aX - aY));
+        if(rEndBFromR.Prim()) aEnd.push_back(StyleVectorCombination(rEndBFromR, aX));
+        if(rEndBFromB.Prim()) aEnd.push_back(StyleVectorCombination(rEndBFromB, -aY));
+        if(rEndBFromL.Prim()) aEnd.push_back(StyleVectorCombination(rEndBFromL, aX));
+        if(rEndFromTL.Prim()) aEnd.push_back(StyleVectorCombination(rEndFromTL, aX + aY));
+
+        CreateBorderPrimitives(
+            rSequence,
+            bLeft ? aOrigin : aOrigin + aX,
+            aY,
+            rBorder,
+            aStart,
+            aEnd,
+            pForceColor
+        );
+    }
+}
+
 void Array::DrawRange( drawinglayer::processor2d::BaseProcessor2D& rProcessor,
         size_t nFirstCol, size_t nFirstRow, size_t nLastCol, size_t nLastRow,
         const Color* pForceColor ) const
@@ -950,38 +1032,81 @@ void Array::DrawRange( drawinglayer::processor2d::BaseProcessor2D& rProcessor,
 
             if ((!bOverlapX && !bOverlapY) || (bFirstCol && bFirstRow) || (!bOverlapY && bFirstCol) || (!bOverlapX && bFirstRow))
             {
-                const basegfx::B2DRange aRange(GetCellRange(nCol, nRow));
+                size_t _nFirstCol = mxImpl->GetMergedFirstCol(nCol, nRow);
+                size_t _nFirstRow = mxImpl->GetMergedFirstRow(nCol, nRow);
+                const Style& rTLBR = GetCellStyleTLBR(_nFirstCol, _nFirstRow);
+                const Style& rBLTR = GetCellStyleBLTR(_nFirstCol, _nFirstRow);
 
-                if (!aRange.isEmpty())
+                if (rTLBR.GetWidth() || rBLTR.GetWidth())
                 {
-                    size_t _nFirstCol = mxImpl->GetMergedFirstCol(nCol, nRow);
-                    size_t _nFirstRow = mxImpl->GetMergedFirstRow(nCol, nRow);
-                    size_t _nLastCol = mxImpl->GetMergedLastCol(nCol, nRow);
-                    size_t _nLastRow = mxImpl->GetMergedLastRow(nCol, nRow);
-                    const Style& rTLBR = GetCellStyleTLBR(_nFirstCol, _nFirstRow);
-                    const Style& rBLTR = GetCellStyleBLTR(_nFirstCol, _nFirstRow);
-
-                    if (rTLBR.GetWidth() || rBLTR.GetWidth())
+                    basegfx::B2DHomMatrix aCoordinateSystem(rCell.CreateCoordinateSystem(*this));
+                    const basegfx::B2DVector aX(basegfx::tools::getColumn(aCoordinateSystem, 0));
+                    const basegfx::B2DVector aY(basegfx::tools::getColumn(aCoordinateSystem, 1));
+
+                    if(!aX.equalZero() && !aY.equalZero())
                     {
+                        size_t _nLastCol = mxImpl->GetMergedLastCol(nCol, nRow);
+                        size_t _nLastRow = mxImpl->GetMergedLastRow(nCol, nRow);
+                        const basegfx::B2DPoint aOrigin(basegfx::tools::getColumn(aCoordinateSystem, 2));
                         drawinglayer::primitive2d::Primitive2DContainer aSequence;
-                        basegfx::B2DHomMatrix aCoordinateSystem(rCell.CreateCoordinateSystem(*this));
-
-                        CreateDiagFrameBorderPrimitives(
-                            aSequence,
-                            basegfx::tools::getColumn(aCoordinateSystem, 2),
-                            basegfx::tools::getColumn(aCoordinateSystem, 0),
-                            basegfx::tools::getColumn(aCoordinateSystem, 1),
-                            rTLBR,
-                            rBLTR,
-                            GetCellStyleLeft(_nFirstCol, _nFirstRow),
-                            GetCellStyleTop(_nFirstCol, _nFirstRow),
-                            GetCellStyleRight(_nLastCol, _nLastRow),
-                            GetCellStyleBottom(_nLastCol, _nLastRow),
-                            GetCellStyleLeft(_nFirstCol, _nLastRow),
-                            GetCellStyleBottom(_nFirstCol, _nLastRow),
-                            GetCellStyleRight(_nLastCol, _nFirstRow),
-                            GetCellStyleTop(_nLastCol, _nFirstRow),
-                            pForceColor);
+
+                        if(rTLBR.GetWidth())
+                        {
+                            /// top-left and bottom-right Style Tables
+                            StyleVectorTable aStart;
+                            StyleVectorTable aEnd;
+
+                            /// Fill top-left Style Table
+                            const Style& rTLFromRight(GetCellStyleTop(_nFirstCol, _nFirstRow));
+                            if(rTLFromRight.Prim()) aStart.push_back(StyleVectorCombination(rTLFromRight, aX));
+                            const Style& rTLFromBottom(GetCellStyleLeft(_nFirstCol, _nFirstRow));
+                            if(rTLFromBottom.Prim()) aStart.push_back(StyleVectorCombination(rTLFromBottom, aY));
+
+                            /// Fill bottom-right Style Table
+                            const Style& rBRFromBottom(GetCellStyleRight(_nLastCol, _nLastRow));
+                            if(rBRFromBottom.Prim()) aEnd.push_back(StyleVectorCombination(rBRFromBottom, -aY));
+                            const Style& rBRFromLeft(GetCellStyleBottom(_nLastCol, _nLastRow));
+                            if(rBRFromLeft.Prim()) aEnd.push_back(StyleVectorCombination(rBRFromLeft, -aX));
+
+                            CreateBorderPrimitives(
+                                aSequence,
+                                aOrigin,
+                                aX + aY,
+                                rTLBR,
+                                aStart,
+                                aEnd,
+                                pForceColor
+                            );
+                        }
+
+                        if(rBLTR.GetWidth())
+                        {
+                            /// bottom-left and top-right Style Tables
+                            StyleVectorTable aStart;
+                            StyleVectorTable aEnd;
+
+                            /// Fill bottom-left Style Table
+                            const Style& rBLFromTop(GetCellStyleLeft(_nFirstCol, _nLastRow));
+                            if(rBLFromTop.Prim()) aStart.push_back(StyleVectorCombination(rBLFromTop, -aY));
+                            const Style& rBLFromBottom(GetCellStyleBottom(_nFirstCol, _nLastRow));
+                            if(rBLFromBottom.Prim()) aStart.push_back(StyleVectorCombination(rBLFromBottom, aX));
+
+                            /// Fill top-right Style Table
+                            const Style& rTRFromBottom(GetCellStyleRight(_nLastCol, _nFirstRow));
+                            if(rTRFromBottom.Prim()) aEnd.push_back(StyleVectorCombination(rTRFromBottom, -aY));
+                            const Style& rTRFromLeft(GetCellStyleTop(_nLastCol, _nFirstRow));
+                            if(rTRFromLeft.Prim()) aEnd.push_back(StyleVectorCombination(rTRFromLeft, -aX));
+
+                            CreateBorderPrimitives(
+                                aSequence,
+                                aOrigin + aY,
+                                aX - aY,
+                                rBLTR,
+                                aStart,
+                                aEnd,
+                                pForceColor
+                            );
+                        }
 
                         rProcessor.process(aSequence);
                     }
@@ -1038,34 +1163,15 @@ void Array::DrawRange( drawinglayer::processor2d::BaseProcessor2D& rProcessor,
 
                     if(pCell)
                     {
-                        basegfx::B2DHomMatrix aCoordinateSystem(pCell->CreateCoordinateSystem(*this));
+                        const basegfx::B2DHomMatrix aCoordinateSystem(pCell->CreateCoordinateSystem(*this));
+                        drawinglayer::primitive2d::Primitive2DContainer aSequence;
                         const bool bUpper(&pCell->GetStyleTop() == pStart);
 
-                        if(!bUpper)
-                        {
-                            // for the lower edge we need to translate to get to the
-                            // borderline coordinate system
-                            aCoordinateSystem.set(0, 2, aCoordinateSystem.get(0, 2) + aCoordinateSystem.get(0, 1));
-                            aCoordinateSystem.set(1, 2, aCoordinateSystem.get(1, 2) + aCoordinateSystem.get(1, 1));
-                        }
-                        drawinglayer::primitive2d::Primitive2DContainer aSequence;
-                        CreateBorderPrimitives(
-                            aSequence,
-                            basegfx::tools::getColumn(aCoordinateSystem, 2),
-                            basegfx::tools::getColumn(aCoordinateSystem, 0),
-                            basegfx::B2DVector(basegfx::tools::getColumn(aCoordinateSystem, 1)).normalize(),
-                            *pStart,
-                            aStartLFromTR,
-                            *pStartLFromT,
-                            *pStartLFromL,
-                            *pStartLFromB,
-                            aStartLFromBR,
-                            aEndRFromTL,
-                            *pEndRFromT,
-                            *pEndRFromR,
-                            *pEndRFromB,
-                            aEndRFromBL,
-                            pForceColor);
+                        HelperCreateHorizontalBorderPrimitives(
+                            aCoordinateSystem, aSequence, bUpper, *pStart,
+                            aStartLFromTR, *pStartLFromT, *pStartLFromL, *pStartLFromB, aStartLFromBR,
+                            aEndRFromTL, *pEndRFromT, *pEndRFromR, *pEndRFromB, aEndRFromBL, pForceColor);
+
                         rProcessor.process(aSequence);
                     }
                 }
@@ -1098,35 +1204,15 @@ void Array::DrawRange( drawinglayer::processor2d::BaseProcessor2D& rProcessor,
 
             if(pCell)
             {
-                basegfx::B2DHomMatrix aCoordinateSystem(pCell->CreateCoordinateSystem(*this));
+                const basegfx::B2DHomMatrix aCoordinateSystem(pCell->CreateCoordinateSystem(*this));
+                drawinglayer::primitive2d::Primitive2DContainer aSequence;
                 const bool bUpper(&pCell->GetStyleTop() == pStart);
 
-                if(!bUpper)
-                {
-                    // for the lower edge we need to translate to get to the
-                    // borderline coordinate system
-                    aCoordinateSystem.set(0, 2, aCoordinateSystem.get(0, 2) + aCoordinateSystem.get(0, 1));
-                    aCoordinateSystem.set(1, 2, aCoordinateSystem.get(1, 2) + aCoordinateSystem.get(1, 1));
-                }
+                HelperCreateHorizontalBorderPrimitives(
+                    aCoordinateSystem, aSequence, bUpper, *pStart,
+                    aStartLFromTR, *pStartLFromT, *pStartLFromL, *pStartLFromB, aStartLFromBR,
+                    aEndRFromTL, *pEndRFromT, *pEndRFromR, *pEndRFromB, aEndRFromBL, pForceColor);
 
-                drawinglayer::primitive2d::Primitive2DContainer aSequence;
-                CreateBorderPrimitives(
-                    aSequence,
-                    basegfx::tools::getColumn(aCoordinateSystem, 2),
-                    basegfx::tools::getColumn(aCoordinateSystem, 0),
-                    basegfx::B2DVector(basegfx::tools::getColumn(aCoordinateSystem, 1)).normalize(),
-                    *pStart,
-                    aStartLFromTR,
-                    *pStartLFromT,
-                    *pStartLFromL,
-                    *pStartLFromB,
-                    aStartLFromBR,
-                    aEndRFromTL,
-                    *pEndRFromT,
-                    *pEndRFromR,
-                    *pEndRFromB,
-                    aEndRFromBL,
-                    pForceColor);
                 rProcessor.process(aSequence);
             }
         }
@@ -1181,51 +1267,15 @@ void Array::DrawRange( drawinglayer::processor2d::BaseProcessor2D& rProcessor,
 
                     if(pCell)
                     {
-                         basegfx::B2DHomMatrix aCoordinateSystem(pCell->CreateCoordinateSystem(*this));
+                        const basegfx::B2DHomMatrix aCoordinateSystem(pCell->CreateCoordinateSystem(*this));
+                        drawinglayer::primitive2d::Primitive2DContainer aSequence;
                         const bool bLeft(&pCell->GetStyleLeft() == pStart);
 
-                        if(!bLeft)
-                        {
-                            // for the Right edge we need to translate to get to the
-                            // borderline coordinate system
-                            aCoordinateSystem.set(0, 2, aCoordinateSystem.get(0, 2) + aCoordinateSystem.get(0, 0));
-                            aCoordinateSystem.set(1, 2, aCoordinateSystem.get(1, 2) + aCoordinateSystem.get(1, 0));
-                        }
+                        HelperCreateVerticalBorderPrimitives(
+                            aCoordinateSystem, aSequence, bLeft, *pStart,
+                            aStartTFromBR, *pStartTFromR, *pStartTFromT, *pStartTFromL, aStartTFromBL,
+                            aEndBFromTR, *pEndBFromR, *pEndBFromB, *pEndBFromL, aEndBFromTL, pForceColor);
 
-                        // The *coordinate system* of the edge has to be given, which for vertical
-                        // lines uses the Y-Vector as X-Axis and the X-Vector as Y-Axis, so swap both
-                        // and mirror aX to keep the same orientation (should be (-1.0, 0.0) for
-                        // horizontal lines anyways, this could be used as test here, checked in debug mode)
-                        const basegfx::B2DTuple aX(basegfx::tools::getColumn(aCoordinateSystem, 0));
-                        const basegfx::B2DTuple aY(basegfx::tools::getColumn(aCoordinateSystem, 1));
-                        aCoordinateSystem = basegfx::tools::createCoordinateSystemTransform(basegfx::tools::getColumn(aCoordinateSystem, 2), aY, -aX);
-
-                        drawinglayer::primitive2d::Primitive2DContainer aSequence;
-                        CreateBorderPrimitives(
-                            // This replaces DrawVerFrameBorder which went from top to bottom. To be able to use
-                            // the same method as for horizontal (CreateBorderPrimitives), the given borders
-                            // have to be rearranged. Best is to look at the explanations of parameters in
-                            // framelink.hxx and the former calls to DrawVerFrameBorder and it's parameters.
-                            // In principle, the order of the five TFrom and BFrom has to be
-                            // inverted to get the same orientation. Before, EndPos and StartPos were changed
-                            // which avoids the reordering, but also leads to inverted line patters for vertical
-                            // lines.
-                            aSequence,
-                            basegfx::tools::getColumn(aCoordinateSystem, 2),
-                            basegfx::tools::getColumn(aCoordinateSystem, 0),
-                            basegfx::B2DVector(basegfx::tools::getColumn(aCoordinateSystem, 1)).normalize(),
-                            *pStart,
-                            aStartTFromBR,
-                            *pStartTFromR,
-                            *pStartTFromT,
-                            *pStartTFromL,
-                            aStartTFromBL,
-                            aEndBFromTR,
-                            *pEndBFromR,
-                            *pEndBFromB,
-                            *pEndBFromL,
-                            aEndBFromTL,
-                            pForceColor);
                         rProcessor.process(aSequence);
                     }
                 }
@@ -1258,44 +1308,15 @@ void Array::DrawRange( drawinglayer::processor2d::BaseProcessor2D& rProcessor,
 
             if(pCell)
             {
-                basegfx::B2DHomMatrix aCoordinateSystem(pCell->CreateCoordinateSystem(*this));
+                const basegfx::B2DHomMatrix aCoordinateSystem(pCell->CreateCoordinateSystem(*this));
+                drawinglayer::primitive2d::Primitive2DContainer aSequence;
                 const bool bLeft(&pCell->GetStyleLeft() == pStart);
 
-                if(!bLeft)
-                {
-                    // for the Right edge we need to translate to get to the
-                    // borderline coordinate system
-                    aCoordinateSystem.set(0, 2, aCoordinateSystem.get(0, 2) + aCoordinateSystem.get(0, 0));
-                    aCoordinateSystem.set(1, 2, aCoordinateSystem.get(1, 2) + aCoordinateSystem.get(1, 0));
-                }
+                HelperCreateVerticalBorderPrimitives(
+                    aCoordinateSystem, aSequence, bLeft, *pStart,
+                    aStartTFromBR, *pStartTFromR, *pStartTFromT, *pStartTFromL, aStartTFromBL,
+                    aEndBFromTR, *pEndBFromR, *pEndBFromB, *pEndBFromL, aEndBFromTL, pForceColor);
 
-                // The *coordinate system* of the edge has to be given, which for vertical
-                // lines uses the Y-Vector as X-Axis and the X-Vector as Y-Axis, so swap both
-                // and mirror aX to keep the same orientation (should be (-1.0, 0.0) for
-                // horizontal lines anyways, this could be used as test here, checked in debug mode)
-                const basegfx::B2DTuple aX(basegfx::tools::getColumn(aCoordinateSystem, 0));
-                const basegfx::B2DTuple aY(basegfx::tools::getColumn(aCoordinateSystem, 1));
-                aCoordinateSystem = basegfx::tools::createCoordinateSystemTransform(basegfx::tools::getColumn(aCoordinateSystem, 2), aY, -aX);
-
-                drawinglayer::primitive2d::Primitive2DContainer aSequence;
-                CreateBorderPrimitives(
-                    // also reordered, see call to CreateBorderPrimitives above
-                    aSequence,
-                    basegfx::tools::getColumn(aCoordinateSystem, 2),
-                    basegfx::tools::getColumn(aCoordinateSystem, 0),
-                    basegfx::B2DVector(basegfx::tools::getColumn(aCoordinateSystem, 1)).normalize(),
-                    *pStart,
-                    aStartTFromBR,
-                    *pStartTFromR,
-                    *pStartTFromT,
-                    *pStartTFromL,
-                    aStartTFromBL,
-                    aEndBFromTR,
-                    *pEndBFromR,
-                    *pEndBFromB,
-                    *pEndBFromL,
-                    aEndBFromTL,
-                    pForceColor);
                 rProcessor.process(aSequence);
             }
         }


More information about the Libreoffice-commits mailing list