[Libreoffice-commits] .: drawinglayer/inc drawinglayer/source svtools/inc svtools/source

Cédric Bosdonnat cbosdo at kemper.freedesktop.org
Thu Oct 20 02:05:39 PDT 2011


 drawinglayer/inc/drawinglayer/primitive2d/borderlineprimitive2d.hxx |    6 +++
 drawinglayer/source/primitive2d/borderlineprimitive2d.cxx           |    9 +++--
 drawinglayer/source/processor2d/vclprocessor2d.cxx                  |    7 +++
 svtools/inc/svtools/borderhelper.hxx                                |    3 +
 svtools/source/control/ctrlbox.cxx                                  |   18 ++++++++++
 5 files changed, 40 insertions(+), 3 deletions(-)

New commits:
commit 8c2902ecbf135fae070ea032fa10a59bb76ec1b0
Author: Tomofumi Yagi <yagit at mknada.sakura.ne.jp>
Date:   Thu Oct 20 11:03:54 2011 +0200

    fdo#37129: Fix the drawing of dotted and dashed borders in Calc.

diff --git a/drawinglayer/inc/drawinglayer/primitive2d/borderlineprimitive2d.hxx b/drawinglayer/inc/drawinglayer/primitive2d/borderlineprimitive2d.hxx
index 0bd537d..1449e2b 100644
--- a/drawinglayer/inc/drawinglayer/primitive2d/borderlineprimitive2d.hxx
+++ b/drawinglayer/inc/drawinglayer/primitive2d/borderlineprimitive2d.hxx
@@ -35,6 +35,7 @@
 #include <basegfx/color/bcolor.hxx>
 #include <basegfx/matrix/b2dhommatrix.hxx>
 #include <basegfx/polygon/b2dpolypolygon.hxx>
+#include <svtools/ctrlbox.hxx>
 
 //////////////////////////////////////////////////////////////////////////////
 
@@ -112,6 +113,11 @@ namespace drawinglayer
                 return basegfx::fTools::equal(1.0, mfRightWidth);
             }
 
+            bool isSolidLine() const
+            {
+                return (mnStyle==STYLE_SOLID);
+            }
+
             bool isInsideUsed() const
             {
                 return !basegfx::fTools::equalZero(mfLeftWidth);
diff --git a/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx b/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx
index 9738e14..df6f381 100644
--- a/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx
@@ -29,6 +29,7 @@
 // MARKER(update_precomp.py): autogen include statement, do not remove
 #include "precompiled_drawinglayer.hxx"
 
+#include <drawinglayer/geometry/viewinformation2d.hxx>
 #include <drawinglayer/primitive2d/borderlineprimitive2d.hxx>
 #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
 #include <basegfx/polygon/b2dpolygon.hxx>
@@ -79,7 +80,7 @@ namespace drawinglayer
             return basegfx::B2DPolyPolygon( clipPolygon );
         }
 
-        Primitive2DSequence BorderLinePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
+        Primitive2DSequence BorderLinePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
         {
             Primitive2DSequence xRetval;
 
@@ -214,6 +215,7 @@ namespace drawinglayer
 
                     // Get which is the line to show
                     bool bIsHairline = leftIsHairline();
+                    bool bIsSolidline = isSolidLine();
                     double nWidth = getCorrectedLeftWidth();
                     basegfx::BColor aColor = getRGBColorLeft();
                     if ( basegfx::fTools::equal( 0.0, mfLeftWidth ) )
@@ -223,7 +225,7 @@ namespace drawinglayer
                         aColor = getRGBColorRight();
                     }
 
-                    if(bIsHairline)
+                    if(bIsHairline && bIsSolidline)
                     {
                         // create hairline primitive
                         aPolygon.append( getStart() );
@@ -237,12 +239,13 @@ namespace drawinglayer
                     {
                         // create filled polygon primitive
                         const basegfx::B2DVector aLineWidthOffset(((nWidth + 1) * 0.5) * aPerpendicular);
+                        basegfx::B2DVector aScale( rViewInformation.getInverseObjectToViewTransformation() * aVector );
 
                         aPolygon.append( aTmpStart );
                         aPolygon.append( aTmpEnd );
 
                         basegfx::B2DPolyPolygon aDashed = svtools::ApplyLineDashing(
-                               aPolygon, getStyle(), MAP_100TH_MM );
+                               aPolygon, getStyle(), MAP_PIXEL, aScale.getLength() );
                         for (sal_uInt32 i = 0; i < aDashed.count(); i++ )
                         {
                             basegfx::B2DPolygon aDash = aDashed.getB2DPolygon( i );
diff --git a/drawinglayer/source/processor2d/vclprocessor2d.cxx b/drawinglayer/source/processor2d/vclprocessor2d.cxx
index a13ca70..c021519 100644
--- a/drawinglayer/source/processor2d/vclprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclprocessor2d.cxx
@@ -837,6 +837,10 @@ namespace drawinglayer
             }
             else
             {
+                // remember that we enter a PolygonStrokePrimitive2D decomposition,
+                // used for AA thick line drawing
+                mnPolygonStrokePrimitive2D++;
+
                 mpOutputDevice->DrawPolyPolygon(aLocalPolyPolygon);
 
                 if(mnPolygonStrokePrimitive2D
@@ -854,6 +858,9 @@ namespace drawinglayer
                         mpOutputDevice->DrawPolyLine(aLocalPolyPolygon.getB2DPolygon(a), 0.0);
                     }
                 }
+
+                // leave PolygonStrokePrimitive2D
+                mnPolygonStrokePrimitive2D--;
             }
         }
 
diff --git a/svtools/inc/svtools/borderhelper.hxx b/svtools/inc/svtools/borderhelper.hxx
index de24369..486eaef 100644
--- a/svtools/inc/svtools/borderhelper.hxx
+++ b/svtools/inc/svtools/borderhelper.hxx
@@ -42,6 +42,9 @@ namespace svtools
     SVT_DLLPUBLIC basegfx::B2DPolyPolygon ApplyLineDashing( const basegfx::B2DPolygon& rPolygon,
             sal_uInt16 nDashing, MapUnit eUnit );
 
+    SVT_DLLPUBLIC basegfx::B2DPolyPolygon ApplyLineDashing( const basegfx::B2DPolygon& rPolygon,
+            sal_uInt16 nDashing, MapUnit eUnit, double fScale );
+
     SVT_DLLPUBLIC void DrawLine( OutputDevice& rDev, const basegfx::B2DPoint& rBeg,
             const basegfx::B2DPoint& rEnd, sal_uInt32 nWidth, sal_uInt16 nDashing );
 
diff --git a/svtools/source/control/ctrlbox.cxx b/svtools/source/control/ctrlbox.cxx
index 810a41b..bf412d4 100644
--- a/svtools/source/control/ctrlbox.cxx
+++ b/svtools/source/control/ctrlbox.cxx
@@ -594,6 +594,24 @@ namespace svtools
         return aPolygons;
     }
 
+    basegfx::B2DPolyPolygon ApplyLineDashing( const basegfx::B2DPolygon& rPolygon, sal_uInt16 nDashing, MapUnit eUnit, double fScale )
+    {
+        std::vector< double > aPattern = GetDashing( nDashing, eUnit );
+        std::vector< double >::iterator i = aPattern.begin();
+        while( i != aPattern.end() ) {
+            (*i) *= fScale;
+            ++i;
+        }
+
+        basegfx::B2DPolyPolygon aPolygons;
+        if ( ! aPattern.empty() )
+            basegfx::tools::applyLineDashing( rPolygon, aPattern, &aPolygons );
+        else
+            aPolygons.append( rPolygon );
+
+        return aPolygons;
+    }
+
     void DrawLine( OutputDevice& rDev, const Point& rP1, const Point& rP2,
         sal_uInt32 nWidth, sal_uInt16 nDashing )
     {


More information about the Libreoffice-commits mailing list