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

Armin Le Grand Armin.Le.Grand at cib.de
Tue Sep 5 10:58:45 UTC 2017


 include/svx/sdr/primitive2d/svx_primitivetypes2d.hxx |   19 
 svx/source/table/viewcontactoftableobj.cxx           |  583 +++----------------
 2 files changed, 116 insertions(+), 486 deletions(-)

New commits:
commit 709ad663a4bb998a8c90f32c584347121f972b2b
Author: Armin Le Grand <Armin.Le.Grand at cib.de>
Date:   Tue Sep 5 12:54:16 2017 +0200

    borderline: Adapt ViewContactOfTableObj
    
    Adapted to usage of svx::frame::Style helpers for primitive
    creation, need much less SvxBorderLine classes and less
    overhead. Class SdrBorderlinePrimitive2D completely removed
    
    Change-Id: I6176b4a300de9aa1e09c85f7b5874a82738e9bbb

diff --git a/include/svx/sdr/primitive2d/svx_primitivetypes2d.hxx b/include/svx/sdr/primitive2d/svx_primitivetypes2d.hxx
index 5123b811a0e3..d2a16623dd02 100644
--- a/include/svx/sdr/primitive2d/svx_primitivetypes2d.hxx
+++ b/include/svx/sdr/primitive2d/svx_primitivetypes2d.hxx
@@ -38,16 +38,15 @@
 #define PRIMITIVE2D_ID_SDRBLOCKTEXTPRIMITIVE2D          (PRIMITIVE2D_ID_RANGE_SVX| 12)
 #define PRIMITIVE2D_ID_SDRSTRETCHTEXTPRIMITIVE2D        (PRIMITIVE2D_ID_RANGE_SVX| 13)
 #define PRIMITIVE2D_ID_SDRCELLPRIMITIVE2D               (PRIMITIVE2D_ID_RANGE_SVX| 14)
-#define PRIMITIVE2D_ID_SDRBORDERLINEPRIMITIVE2D         (PRIMITIVE2D_ID_RANGE_SVX| 15)
-#define PRIMITIVE2D_ID_OVERLAYBITMAPEXPRIMITIVE         (PRIMITIVE2D_ID_RANGE_SVX| 16)
-#define PRIMITIVE2D_ID_OVERLAYCROSSHAIRPRIMITIVE        (PRIMITIVE2D_ID_RANGE_SVX| 17)
-#define PRIMITIVE2D_ID_OVERLAYRECTANGLEPRIMITIVE        (PRIMITIVE2D_ID_RANGE_SVX| 18)
-#define PRIMITIVE2D_ID_OVERLAYHELPLINESTRIPEDPRIMITIVE  (PRIMITIVE2D_ID_RANGE_SVX| 19)
-#define PRIMITIVE2D_ID_OVERLAYROLLINGRECTANGLEPRIMITIVE (PRIMITIVE2D_ID_RANGE_SVX| 20)
-#define PRIMITIVE2D_ID_SDRCONTROLPRIMITIVE2D            (PRIMITIVE2D_ID_RANGE_SVX| 21)
-#define PRIMITIVE2D_ID_SDROLECONTENTPRIMITIVE2D         (PRIMITIVE2D_ID_RANGE_SVX| 22)
-#define PRIMITIVE2D_ID_SDRAUTOFITTEXTPRIMITIVE2D        (PRIMITIVE2D_ID_RANGE_SVX| 23)
-#define PRIMITIVE2D_ID_SDRCHAINEDTEXTPRIMITIVE2D        (PRIMITIVE2D_ID_RANGE_SVX| 24)
+#define PRIMITIVE2D_ID_OVERLAYBITMAPEXPRIMITIVE         (PRIMITIVE2D_ID_RANGE_SVX| 15)
+#define PRIMITIVE2D_ID_OVERLAYCROSSHAIRPRIMITIVE        (PRIMITIVE2D_ID_RANGE_SVX| 16)
+#define PRIMITIVE2D_ID_OVERLAYRECTANGLEPRIMITIVE        (PRIMITIVE2D_ID_RANGE_SVX| 17)
+#define PRIMITIVE2D_ID_OVERLAYHELPLINESTRIPEDPRIMITIVE  (PRIMITIVE2D_ID_RANGE_SVX| 18)
+#define PRIMITIVE2D_ID_OVERLAYROLLINGRECTANGLEPRIMITIVE (PRIMITIVE2D_ID_RANGE_SVX| 19)
+#define PRIMITIVE2D_ID_SDRCONTROLPRIMITIVE2D            (PRIMITIVE2D_ID_RANGE_SVX| 20)
+#define PRIMITIVE2D_ID_SDROLECONTENTPRIMITIVE2D         (PRIMITIVE2D_ID_RANGE_SVX| 21)
+#define PRIMITIVE2D_ID_SDRAUTOFITTEXTPRIMITIVE2D        (PRIMITIVE2D_ID_RANGE_SVX| 22)
+#define PRIMITIVE2D_ID_SDRCHAINEDTEXTPRIMITIVE2D        (PRIMITIVE2D_ID_RANGE_SVX| 23)
 
 
 #endif // INCLUDED_SVX_SDR_PRIMITIVE2D_SVX_PRIMITIVETYPES2D_HXX
diff --git a/svx/source/table/viewcontactoftableobj.cxx b/svx/source/table/viewcontactoftableobj.cxx
index 0ee957466b83..d696569dc329 100644
--- a/svx/source/table/viewcontactoftableobj.cxx
+++ b/svx/source/table/viewcontactoftableobj.cxx
@@ -37,6 +37,7 @@
 #include <drawinglayer/attribute/sdrshadowattribute.hxx>
 #include <drawinglayer/primitive2d/sdrdecompositiontools2d.hxx>
 #include <basegfx/matrix/b2dhommatrixtools.hxx>
+#include <svx/framelink.hxx>
 
 #include "cell.hxx"
 #include "tablelayouter.hxx"
@@ -142,415 +143,18 @@ namespace drawinglayer
     } // end of namespace primitive2d
 } // end of namespace drawinglayer
 
-
-namespace drawinglayer
-{
-    namespace primitive2d
-    {
-        class SdrBorderlinePrimitive2D : public BufferedDecompositionPrimitive2D
-        {
-        private:
-            basegfx::B2DHomMatrix                       maTransform;
-            SvxBorderLine                               maLeftLine;
-            SvxBorderLine                               maBottomLine;
-            SvxBorderLine                               maRightLine;
-            SvxBorderLine                               maTopLine;
-
-            // Neighbor cells' borders
-            SvxBorderLine                               maLeftFromTLine;
-            SvxBorderLine                               maLeftFromBLine;
-            SvxBorderLine                               maRightFromTLine;
-            SvxBorderLine                               maRightFromBLine;
-            SvxBorderLine                               maTopFromLLine;
-            SvxBorderLine                               maTopFromRLine;
-            SvxBorderLine                               maBottomFromLLine;
-            SvxBorderLine                               maBottomFromRLine;
-
-            bool                                        mbLeftIsOutside : 1;
-            bool                                        mbBottomIsOutside : 1;
-            bool                                        mbRightIsOutside : 1;
-            bool                                        mbTopIsOutside : 1;
-
-        protected:
-            // local decomposition.
-            virtual void create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& aViewInformation) const override;
-
-        public:
-            SdrBorderlinePrimitive2D(
-                const basegfx::B2DHomMatrix& rTransform,
-                const SvxBorderLine& rLeftLine,
-                const SvxBorderLine& rBottomLine,
-                const SvxBorderLine& rRightLine,
-                const SvxBorderLine& rTopLine,
-                const SvxBorderLine& rLeftFromTLine,
-                const SvxBorderLine& rLeftFromBLine,
-                const SvxBorderLine& rRightFromTLine,
-                const SvxBorderLine& rRightFromBLine,
-                const SvxBorderLine& rTopFromLLine,
-                const SvxBorderLine& rTopFromRLine,
-                const SvxBorderLine& rBottomFromLLine,
-                const SvxBorderLine& rBottomFromRLine,
-                bool bLeftIsOutside,
-                bool bBottomIsOutside,
-                bool bRightIsOutside,
-                bool bTopIsOutside)
-            :   BufferedDecompositionPrimitive2D(),
-                maTransform(rTransform),
-                maLeftLine(rLeftLine),
-                maBottomLine(rBottomLine),
-                maRightLine(rRightLine),
-                maTopLine(rTopLine),
-                maLeftFromTLine(rLeftFromTLine),
-                maLeftFromBLine(rLeftFromBLine),
-                maRightFromTLine(rRightFromTLine),
-                maRightFromBLine(rRightFromBLine),
-                maTopFromLLine(rTopFromLLine),
-                maTopFromRLine(rTopFromRLine),
-                maBottomFromLLine(rBottomFromLLine),
-                maBottomFromRLine(rBottomFromRLine),
-                mbLeftIsOutside(bLeftIsOutside),
-                mbBottomIsOutside(bBottomIsOutside),
-                mbRightIsOutside(bRightIsOutside),
-                mbTopIsOutside(bTopIsOutside)
-            {
-            }
-
-            // data access
-            const basegfx::B2DHomMatrix& getTransform() const { return maTransform; }
-            const SvxBorderLine& getLeftLine() const { return maLeftLine; }
-            const SvxBorderLine& getBottomLine() const { return maBottomLine; }
-            const SvxBorderLine& getRightLine() const { return maRightLine; }
-            const SvxBorderLine& getTopLine() const { return maTopLine; }
-
-            // compare operator
-            virtual bool operator==(const BasePrimitive2D& rPrimitive) const override;
-
-            // provide unique ID
-            DeclPrimitive2DIDBlock()
-        };
-
-        sal_uInt16 getBorderLineOutWidth(const SvxBorderLine& rLineA)
-        {
-            return (1 == rLineA.GetOutWidth() ? 0 : rLineA.GetOutWidth());
-        }
-
-        sal_uInt16 getBorderLineDistance(const SvxBorderLine& rLineA)
-        {
-            return (1 == rLineA.GetDistance() ? 0 : rLineA.GetDistance());
-        }
-
-        sal_uInt16 getBorderLineInWidth(const SvxBorderLine& rLineA)
-        {
-            return (1 == rLineA.GetInWidth() ? 0 : rLineA.GetInWidth());
-        }
-
-        sal_uInt16 getBorderLineWidth(const SvxBorderLine& rLineA)
-        {
-            return getBorderLineOutWidth(rLineA) + getBorderLineDistance(rLineA) + getBorderLineInWidth(rLineA);
-        }
-
-        double getExtend(const SvxBorderLine& rLineSide, const SvxBorderLine& rLineOpposite)
-        {
-            double nExtend = 0.0;
-            if(!rLineSide.isEmpty())
-            {
-                // reduce to inner edge of associated matching line
-                nExtend = -(getBorderLineWidth(rLineSide) / 2.0);
-            }
-            else
-            {
-                nExtend = (getBorderLineWidth(rLineOpposite) / 2.0);
-            }
-
-            return nExtend;
-        }
-
-        double getChangedValue(sal_uInt16 nValue, bool bChangeToMM)
-        {
-            if(1 == nValue)
-                return 1.0;
-
-            if(bChangeToMM)
-                return nValue * (127.0 / 72.0);
-
-            return (double)nValue;
-        }
-
-        void SdrBorderlinePrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*aViewInformation*/) const
-        {
-            const double fTwipsToMM(127.0 / 72.0);
-
-            if(!getLeftLine().isEmpty())
-            {
-                // create left line from top to bottom
-                basegfx::B2DPoint aStart(getTransform() * basegfx::B2DPoint(0.0, 0.0));
-                basegfx::B2DPoint aEnd(getTransform() * basegfx::B2DPoint(0.0, 1.0));
-
-                // Move the left border to the left.
-                double fOffset = getChangedValue(getLeftLine().GetDistance(), true/*InTwips*/);
-                aStart += basegfx::B2DPoint(-fOffset,-fOffset);
-                aEnd += basegfx::B2DPoint(-fOffset,fOffset);
-
-                if(!aStart.equal(aEnd))
-                {
-                    const double fExtendIS(getExtend(getTopLine(), maTopFromLLine) * fTwipsToMM);
-                    const double fExtendIE(getExtend(getBottomLine(), maBottomFromLLine) * fTwipsToMM);
-
-                    if (basegfx::fTools::equalZero(getLeftLine().GetInWidth()))
-                    {
-                        rContainer.push_back(
-                            new BorderLinePrimitive2D(
-                                aStart,
-                                aEnd,
-                                BorderLine(
-                                    getChangedValue(getLeftLine().GetOutWidth(), true/*InTwips*/),
-                                    getLeftLine().GetColorOut().getBColor(),
-                                    BorderLineExtend(
-                                        fExtendIS,
-                                        fExtendIE)),
-                                getLeftLine().GetBorderLineStyle()));
-                    }
-                    else
-                    {
-                        const double fExtendOS(getExtend(maTopFromLLine, getTopLine()) * fTwipsToMM);
-                        const double fExtendOE(getExtend(maBottomFromLLine, getBottomLine()) * fTwipsToMM);
-
-                        rContainer.push_back(
-                            new BorderLinePrimitive2D(
-                                aStart,
-                                aEnd,
-                                BorderLine(
-                                    getChangedValue(getLeftLine().GetOutWidth(), true/*InTwips*/),
-                                    getLeftLine().GetColorOut().getBColor(),
-                                    BorderLineExtend(
-                                        fExtendIS,
-                                        fExtendIE)),
-                                BorderLine(
-                                    getChangedValue(getLeftLine().GetDistance(), true/*InTwips*/),
-                                    getLeftLine().GetColorGap().getBColor()),
-                                BorderLine(getChangedValue(
-                                    getLeftLine().GetInWidth(), true/*InTwips*/),
-                                    getLeftLine().GetColorIn().getBColor(),
-                                    BorderLineExtend(
-                                        fExtendOS,
-                                        fExtendOE)),
-                                getLeftLine().HasGapColor(),
-                                getLeftLine().GetBorderLineStyle()));
-                    }
-                }
-            }
-
-            if(!getBottomLine().isEmpty() && mbBottomIsOutside)
-            {
-                // create bottom line from left to right
-                const basegfx::B2DPoint aStart(getTransform() * basegfx::B2DPoint(0.0, 1.0));
-                const basegfx::B2DPoint aEnd(getTransform() * basegfx::B2DPoint(1.0, 1.0));
-
-                if(!aStart.equal(aEnd))
-                {
-                    const double fExtendIS(getExtend(getLeftLine(), maLeftFromBLine) * fTwipsToMM);
-                    const double fExtendIE(getExtend(getRightLine(), maRightFromBLine) * fTwipsToMM);
-
-                    if (basegfx::fTools::equalZero(getBottomLine().GetInWidth()))
-                    {
-                        rContainer.push_back(
-                            new BorderLinePrimitive2D(
-                                aStart,
-                                aEnd,
-                                BorderLine(
-                                    getChangedValue(getBottomLine().GetOutWidth(), true/*InTwips*/),
-                                    getBottomLine().GetColorOut(false).getBColor(),
-                                    BorderLineExtend(
-                                        fExtendIS,
-                                        fExtendIE)),
-                                getBottomLine().GetBorderLineStyle()));
-                    }
-                    else
-                    {
-                        const double fExtendOS(getExtend(maLeftFromBLine, getLeftLine()) * fTwipsToMM);
-                        const double fExtendOE(getExtend(maRightFromBLine, getRightLine()) * fTwipsToMM);
-
-                        rContainer.push_back(
-                            new BorderLinePrimitive2D(
-                                aStart,
-                                aEnd,
-                                BorderLine(
-                                    getChangedValue(getBottomLine().GetOutWidth(), true/*InTwips*/),
-                                    getBottomLine().GetColorOut(false).getBColor(),
-                                    BorderLineExtend(
-                                        fExtendIS,
-                                        fExtendIE)),
-                                BorderLine(
-                                    getChangedValue(getBottomLine().GetDistance(), true/*InTwips*/),
-                                    getBottomLine().GetColorGap().getBColor()),
-                                BorderLine(
-                                    getChangedValue(getBottomLine().GetInWidth(), true/*InTwips*/),
-                                    getBottomLine().GetColorIn(false).getBColor(),
-                                    BorderLineExtend(
-                                        fExtendOS,
-                                        fExtendOE)),
-                                getBottomLine().HasGapColor(),
-                                getBottomLine().GetBorderLineStyle()));
-                    }
-                }
-            }
-
-            if(!getRightLine().isEmpty())
-            {
-                // create right line from top to bottom
-                const basegfx::B2DPoint aStart(getTransform() * basegfx::B2DPoint(1.0, 0.0));
-                const basegfx::B2DPoint aEnd(getTransform() * basegfx::B2DPoint(1.0, 1.0));
-
-                if(!aStart.equal(aEnd))
-                {
-                    const double fExtendOS(getExtend(maTopFromRLine, getTopLine()) * fTwipsToMM);
-                    const double fExtendOE(getExtend(maBottomFromRLine, getBottomLine()) * fTwipsToMM);
-
-                    if (basegfx::fTools::equalZero(getRightLine().GetInWidth()))
-                    {
-                        rContainer.push_back(
-                            new BorderLinePrimitive2D(
-                                aStart,
-                                aEnd,
-                                BorderLine(
-                                    getChangedValue(getRightLine().GetOutWidth(), true/*InTwips*/),
-                                    getRightLine().GetColorOut().getBColor(),
-                                    BorderLineExtend(
-                                        fExtendOS,
-                                        fExtendOE)),
-                                getRightLine().GetBorderLineStyle()));
-                    }
-                    else
-                    {
-                        const double fExtendIS(getExtend(getTopLine(), maTopFromRLine) * fTwipsToMM);
-                        const double fExtendIE(getExtend(getBottomLine(), maBottomFromRLine) * fTwipsToMM);
-
-                        rContainer.push_back(
-                            new BorderLinePrimitive2D(
-                                aStart,
-                                aEnd,
-                                BorderLine(
-                                    getChangedValue(getRightLine().GetOutWidth(), true/*InTwips*/),
-                                    getRightLine().GetColorOut().getBColor(),
-                                    BorderLineExtend(
-                                        fExtendOS,
-                                        fExtendOE)),
-                                BorderLine(
-                                    getChangedValue(getRightLine().GetDistance(), true/*InTwips*/),
-                                    getRightLine().GetColorGap().getBColor()),
-                                BorderLine(
-                                    getChangedValue(getRightLine().GetInWidth(), true/*InTwips*/),
-                                    getRightLine().GetColorIn().getBColor(),
-                                    BorderLineExtend(
-                                        fExtendIS,
-                                        fExtendIE)),
-                                getRightLine().HasGapColor(),
-                                getRightLine().GetBorderLineStyle()));
-                    }
-                }
-            }
-
-            if(!getTopLine().isEmpty())
-            {
-                // create top line from left to right
-                basegfx::B2DPoint aStart(getTransform() * basegfx::B2DPoint(0.0, 0.0));
-                basegfx::B2DPoint aEnd(getTransform() * basegfx::B2DPoint(1.0, 0.0));
-
-                // Move the top border up a bit.
-                double fOffset = getChangedValue(getTopLine().GetDistance(), true/*InTwips*/);
-                aStart += basegfx::B2DPoint(-fOffset,-fOffset);
-                aEnd += basegfx::B2DPoint(fOffset,-fOffset);
-
-                if(!aStart.equal(aEnd))
-                {
-                    const double fExtendOS(getExtend(maLeftFromTLine, getLeftLine()) * fTwipsToMM);
-                    const double fExtendOE(getExtend(maRightFromTLine, getRightLine()) * fTwipsToMM);
-
-                    if (basegfx::fTools::equalZero(getTopLine().GetInWidth()))
-                    {
-                        rContainer.push_back(
-                            new BorderLinePrimitive2D(
-                                aStart,
-                                aEnd,
-                                BorderLine(
-                                    getChangedValue(getTopLine().GetOutWidth(), true/*InTwips*/),
-                                    getTopLine().GetColorOut(false).getBColor(),
-                                    BorderLineExtend(
-                                        fExtendOS,
-                                        fExtendOE)),
-                                getTopLine().GetBorderLineStyle()));
-                    }
-                    else
-                    {
-                        const double fExtendIS(getExtend(getLeftLine(), maLeftFromTLine) * fTwipsToMM);
-                        const double fExtendIE(getExtend(getRightLine(), maRightFromTLine) * fTwipsToMM);
-
-                        rContainer.push_back(
-                            new BorderLinePrimitive2D(
-                                aStart,
-                                aEnd,
-                                BorderLine(
-                                    getChangedValue(getTopLine().GetOutWidth(), true/*InTwips*/),
-                                    getTopLine().GetColorOut(false).getBColor(),
-                                    BorderLineExtend(
-                                        fExtendOS,
-                                        fExtendOE)),
-                                BorderLine(
-                                    getChangedValue(getTopLine().GetDistance(), true/*InTwips*/),
-                                    getTopLine().GetColorGap().getBColor()),
-                                BorderLine(
-                                    getChangedValue(getTopLine().GetInWidth(), true/*InTwips*/),
-                                    getTopLine().GetColorIn(false).getBColor(),
-                                    BorderLineExtend(
-                                        fExtendIS,
-                                        fExtendIE)),
-                                getTopLine().HasGapColor(),
-                                getTopLine().GetBorderLineStyle()));
-                    }
-                }
-            }
-        }
-
-        bool SdrBorderlinePrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
-        {
-            if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
-            {
-                const SdrBorderlinePrimitive2D& rCompare = static_cast<const SdrBorderlinePrimitive2D&>(rPrimitive);
-
-                return (getTransform() == rCompare.getTransform()
-                    && getLeftLine() == rCompare.getLeftLine()
-                    && getBottomLine() == rCompare.getBottomLine()
-                    && getRightLine() == rCompare.getRightLine()
-                    && getTopLine() == rCompare.getTopLine()
-                    && maLeftFromTLine == rCompare.maLeftFromTLine
-                    && maLeftFromBLine == rCompare.maLeftFromBLine
-                    && maRightFromTLine == rCompare.maRightFromTLine
-                    && maRightFromBLine == rCompare.maRightFromBLine
-                    && maTopFromLLine == rCompare.maTopFromLLine
-                    && maTopFromRLine == rCompare.maTopFromRLine
-                    && maBottomFromLLine == rCompare.maBottomFromLLine
-                    && maBottomFromRLine == rCompare.maBottomFromRLine
-                    && mbLeftIsOutside == rCompare.mbLeftIsOutside
-                    && mbBottomIsOutside == rCompare.mbBottomIsOutside
-                    && mbRightIsOutside == rCompare.mbRightIsOutside
-                    && mbTopIsOutside == rCompare.mbTopIsOutside);
-            }
-
-            return false;
-        }
-
-        // provide unique ID
-        ImplPrimitive2DIDBlock(SdrBorderlinePrimitive2D, PRIMITIVE2D_ID_SDRBORDERLINEPRIMITIVE2D)
-
-    } // end of namespace primitive2d
-} // end of namespace drawinglayer
-
-
 namespace sdr
 {
     namespace contact
     {
-        void impGetLine(SvxBorderLine& aLine, const sdr::table::TableLayouter& rLayouter, sal_Int32 nX, sal_Int32 nY, bool bHorizontal, sal_Int32 nColCount, sal_Int32 nRowCount, bool bIsRTL)
+        svx::frame::Style impGetLineStyle(
+            const sdr::table::TableLayouter& rLayouter,
+            sal_Int32 nX,
+            sal_Int32 nY,
+            bool bHorizontal,
+            sal_Int32 nColCount,
+            sal_Int32 nRowCount,
+            bool bIsRTL)
         {
             if(nX >= 0 && nX <= nColCount && nY >= 0 && nY <= nRowCount)
             {
@@ -559,7 +163,7 @@ namespace sdr
                 if(pLine)
                 {
                     // copy line content
-                    aLine = *pLine;
+                    SvxBorderLine aLine(*pLine);
 
                     // check for mirroring. This shall always be done when it is
                     // not a top- or rightmost line
@@ -584,13 +188,45 @@ namespace sdr
                         aLine.SetMirrorWidths( );
                     }
 
-                    return;
+                    const double fTwipsToMM(127.0 / 72.0);
+                    return svx::frame::Style(&aLine, fTwipsToMM);
                 }
             }
 
             // no success, copy empty line
-            const SvxBorderLine aEmptyLine;
-            aLine = aEmptyLine;
+            return svx::frame::Style();
+        }
+
+        void createForVector(drawinglayer::primitive2d::Primitive2DContainer& rContainer, const basegfx::B2DPoint& rOrigin, const basegfx::B2DVector& rX,
+            const svx::frame::Style& rLine,
+            const svx::frame::Style& rLeftA, const svx::frame::Style& rLeftB, const svx::frame::Style& rLeftC,
+            const svx::frame::Style& rRightA, const svx::frame::Style& rRightB, const svx::frame::Style& rRightC)
+        {
+            /// top-left and bottom-right Style Tables
+            svx::frame::StyleVectorTable aStart;
+            svx::frame::StyleVectorTable aEnd;
+            const basegfx::B2DVector aY(basegfx::getNormalizedPerpendicular(rX));
+            const double fTwipsToMM(127.0 / 72.0);
+
+            /// Fill top-left Style Table
+            if(rLeftA.IsUsed()) aStart.push_back(svx::frame::StyleVectorCombination(rLeftA, -aY));
+            if(rLeftB.IsUsed()) aStart.push_back(svx::frame::StyleVectorCombination(rLeftB, -rX));
+            if(rLeftC.IsUsed()) aStart.push_back(svx::frame::StyleVectorCombination(rLeftC, aY));
+
+            /// Fill bottom-right Style Table
+            if(rRightA.IsUsed()) aEnd.push_back(svx::frame::StyleVectorCombination(rRightA, -aY));
+            if(rRightB.IsUsed()) aEnd.push_back(svx::frame::StyleVectorCombination(rRightB, rX));
+            if(rRightC.IsUsed()) aEnd.push_back(svx::frame::StyleVectorCombination(rRightC, aY));
+
+            CreateBorderPrimitives(
+                rContainer,
+                rOrigin,
+                rX,
+                rLine,
+                aStart,
+                aEnd,
+                nullptr
+            );
         }
 
         drawinglayer::primitive2d::Primitive2DContainer ViewContactOfTableObj::createViewIndependentPrimitive2DSequence() const
@@ -600,8 +236,10 @@ namespace sdr
 
             if(xTable.is())
             {
-                // create primitive representation for table
-                drawinglayer::primitive2d::Primitive2DContainer xRetval;
+                // create primitive representation for table. Cell info goes
+                // directly to aRetval, Border info to aBorderSequence and added
+                // later to get the correct overlapping
+                drawinglayer::primitive2d::Primitive2DContainer aRetval;
                 const sal_Int32 nRowCount(xTable->getRowCount());
                 const sal_Int32 nColCount(xTable->getColumnCount());
                 const sal_Int32 nAllCount(nRowCount * nColCount);
@@ -621,25 +259,7 @@ namespace sdr
 
                     // for each cell we need potentially a cell primitive and a border primitive
                     // (e.g. single cell). Prepare sequences and input counters
-                    drawinglayer::primitive2d::Primitive2DContainer xCellSequence(nAllCount);
-                    drawinglayer::primitive2d::Primitive2DContainer xBorderSequence(nAllCount);
-                    sal_uInt32 nCellInsert(0);
-                    sal_uInt32 nBorderInsert(0);
-
-                    // variables for border lines
-                    SvxBorderLine aLeftLine;
-                    SvxBorderLine aBottomLine;
-                    SvxBorderLine aRightLine;
-                    SvxBorderLine aTopLine;
-
-                    SvxBorderLine aLeftFromTLine;
-                    SvxBorderLine aLeftFromBLine;
-                    SvxBorderLine aRightFromTLine;
-                    SvxBorderLine aRightFromBLine;
-                    SvxBorderLine aTopFromLLine;
-                    SvxBorderLine aTopFromRLine;
-                    SvxBorderLine aBottomFromLLine;
-                    SvxBorderLine aBottomFromRLine;
+                    drawinglayer::primitive2d::Primitive2DContainer aBorderSequence;
 
                     // create single primitives per cell
                     for(aCellPos.mnRow = 0; aCellPos.mnRow < nRowCount; aCellPos.mnRow++)
@@ -693,7 +313,7 @@ namespace sdr
                                         const drawinglayer::primitive2d::Primitive2DReference xCellReference(
                                             new drawinglayer::primitive2d::SdrCellPrimitive2D(
                                                 aCellMatrix, aAttribute));
-                                        xCellSequence[nCellInsert++] = xCellReference;
+                                        aRetval.append(xCellReference);
                                     }
 
                                     // handle cell borders
@@ -707,58 +327,69 @@ namespace sdr
                                     const sal_Int32 nYBottom(nY + nYSpan);
 
                                     // get basic lines
-                                    impGetLine(aLeftLine, rTableLayouter, nX, nY, false, nColCount, nRowCount, bIsRTL);
+                                    const svx::frame::Style aLeftLine(impGetLineStyle(rTableLayouter, nX, nY, false, nColCount, nRowCount, bIsRTL));
                                     //To resolve the bug fdo#59117
                                     //In RTL table as BottomLine & TopLine are drawn from Left Side to Right, nX should be nX-1
-                                    impGetLine(aBottomLine, rTableLayouter, bIsRTL?nX-1:nX, nYBottom, true, nColCount, nRowCount, bIsRTL);
-                                    impGetLine(aRightLine, rTableLayouter, nXRight, nY, false, nColCount, nRowCount, bIsRTL);
-                                    impGetLine(aTopLine, rTableLayouter, bIsRTL?nX-1:nX, nY, true, nColCount, nRowCount, bIsRTL);
-
-                                    // get the neighbor cells' borders
-                                    impGetLine(aLeftFromTLine, rTableLayouter, nX, nY - 1, false, nColCount, nRowCount, bIsRTL);
-                                    impGetLine(aLeftFromBLine, rTableLayouter, nX, nYBottom + 1, false, nColCount, nRowCount, bIsRTL);
-                                    impGetLine(aRightFromTLine, rTableLayouter, nXRight, nY - 1, false, nColCount, nRowCount, bIsRTL);
-                                    impGetLine(aRightFromBLine, rTableLayouter, nXRight, nYBottom + 1, false, nColCount, nRowCount, bIsRTL);
-                                    impGetLine(aTopFromLLine, rTableLayouter, nX - 1, nY, true, nColCount, nRowCount, bIsRTL);
-                                    impGetLine(aTopFromRLine, rTableLayouter, nXRight + 1, nY, true, nColCount, nRowCount, bIsRTL);
-                                    impGetLine(aBottomFromLLine, rTableLayouter, nX - 1, nYBottom, true, nColCount, nRowCount, bIsRTL);
-                                    impGetLine(aBottomFromRLine, rTableLayouter, nXRight + 1, nYBottom, true, nColCount, nRowCount, bIsRTL);
-
-                                    // create the primtive containing all data for one cell with borders
-                                    xBorderSequence[nBorderInsert++] = drawinglayer::primitive2d::Primitive2DReference(
-                                        new drawinglayer::primitive2d::SdrBorderlinePrimitive2D(
-                                            aCellMatrix,
-                                            aLeftLine,
-                                            aBottomLine,
-                                            aRightLine,
-                                            aTopLine,
-                                            aLeftFromTLine,
-                                            aLeftFromBLine,
-                                            aRightFromTLine,
-                                            aRightFromBLine,
-                                            aTopFromLLine,
-                                            aTopFromRLine,
-                                            aBottomFromLLine,
-                                            aBottomFromRLine,
-                                            bIsRTL ? nX == nColCount : 0 == nX,
-                                            nRowCount == nYBottom,
-                                            bIsRTL ? 0 == nXRight : nXRight == nColCount,
-                                            0 == nY));
+                                    const svx::frame::Style aBottomLine(impGetLineStyle(rTableLayouter, bIsRTL?nX-1:nX, nYBottom, true, nColCount, nRowCount, bIsRTL));
+                                    const svx::frame::Style aRightLine(impGetLineStyle(rTableLayouter, nXRight, nY, false, nColCount, nRowCount, bIsRTL));
+                                    const svx::frame::Style aTopLine(impGetLineStyle(rTableLayouter, bIsRTL?nX-1:nX, nY, true, nColCount, nRowCount, bIsRTL));
+
+                                    if(aLeftLine.IsUsed() || aBottomLine.IsUsed() || aRightLine.IsUsed() || aTopLine.IsUsed())
+                                    {
+                                        // get the neighbor cells' borders
+                                        const svx::frame::Style aLeftFromTLine(impGetLineStyle(rTableLayouter, nX, nY - 1, false, nColCount, nRowCount, bIsRTL));
+                                        const svx::frame::Style aLeftFromBLine(impGetLineStyle(rTableLayouter, nX, nYBottom + 1, false, nColCount, nRowCount, bIsRTL));
+                                        const svx::frame::Style aRightFromTLine(impGetLineStyle(rTableLayouter, nXRight, nY - 1, false, nColCount, nRowCount, bIsRTL));
+                                        const svx::frame::Style aRightFromBLine(impGetLineStyle(rTableLayouter, nXRight, nYBottom + 1, false, nColCount, nRowCount, bIsRTL));
+                                        const svx::frame::Style aTopFromLLine(impGetLineStyle(rTableLayouter, nX - 1, nY, true, nColCount, nRowCount, bIsRTL));
+                                        const svx::frame::Style aTopFromRLine(impGetLineStyle(rTableLayouter, nXRight + 1, nY, true, nColCount, nRowCount, bIsRTL));
+                                        const svx::frame::Style aBottomFromLLine(impGetLineStyle(rTableLayouter, nX - 1, nYBottom, true, nColCount, nRowCount, bIsRTL));
+                                        const svx::frame::Style aBottomFromRLine(impGetLineStyle(rTableLayouter, nXRight + 1, nYBottom, true, nColCount, nRowCount, bIsRTL));
+
+                                        // get cell coordinate system
+                                        const basegfx::B2DPoint aOrigin(aCellMatrix * basegfx::B2DPoint(0.0, 0.0));
+                                        const basegfx::B2DVector aX(aCellMatrix * basegfx::B2DVector(1.0, 0.0));
+                                        const basegfx::B2DVector aY(aCellMatrix * basegfx::B2DVector(0.0, 1.0));
+                                        const double fTwipsToMM(127.0 / 72.0);
+
+                                        if(aLeftLine.IsUsed())
+                                        {
+                                            createForVector(aBorderSequence, aOrigin, aY, aLeftLine,
+                                                aTopLine, aLeftFromTLine, aTopFromLLine,
+                                                aBottomLine, aLeftFromBLine, aBottomFromLLine);
+                                        }
+
+                                        if(aBottomLine.IsUsed())
+                                        {
+                                            createForVector(aBorderSequence, aOrigin + aY, aX, aBottomLine,
+                                                aLeftLine, aBottomFromLLine, aLeftFromBLine,
+                                                aRightLine, aBottomFromRLine, aRightFromBLine);
+                                        }
+
+                                        if(aRightLine.IsUsed())
+                                        {
+                                            createForVector(aBorderSequence, aOrigin + aX, aY, aRightLine,
+                                                aTopFromRLine, aRightFromTLine, aTopLine,
+                                                aBottomFromRLine, aRightFromBLine, aBottomLine);
+                                        }
+
+                                        if(aTopLine.IsUsed())
+                                        {
+                                            createForVector(aBorderSequence, aOrigin, aX, aTopLine,
+                                                aLeftFromTLine, aTopFromLLine, aLeftLine,
+                                                aRightFromTLine, aTopFromRLine, aRightLine);
+                                        }
+                                    }
                                 }
                             }
                         }
                     }
 
-                    // no empty references; reallocate sequences by used count
-                    xCellSequence.resize(nCellInsert);
-                    xBorderSequence.resize(nBorderInsert);
-
-                    // append to target. We want fillings and text first
-                    xRetval = xCellSequence;
-                    xRetval.append(xBorderSequence);
+                    // append Border info to target. We want fillings and text first
+                    aRetval.append(aBorderSequence);
                 }
 
-                if(!xRetval.empty())
+                if(!aRetval.empty())
                 {
                     // check and create evtl. shadow for created content
                     const SfxItemSet& rObjectItemSet = rTableObj.GetMergedItemSet();
@@ -767,11 +398,11 @@ namespace sdr
 
                     if(!aNewShadowAttribute.isDefault())
                     {
-                        xRetval = drawinglayer::primitive2d::createEmbeddedShadowPrimitive(xRetval, aNewShadowAttribute);
+                        aRetval = drawinglayer::primitive2d::createEmbeddedShadowPrimitive(aRetval, aNewShadowAttribute);
                     }
                 }
 
-                return xRetval;
+                return aRetval;
             }
             else
             {


More information about the Libreoffice-commits mailing list