diff options
author | Tomofumi Yagi <yagit@mknada.sakura.ne.jp> | 2011-10-20 11:03:54 +0200 |
---|---|---|
committer | Cédric Bosdonnat <cedric.bosdonnat@free.fr> | 2011-10-20 11:05:17 +0200 |
commit | 8c2902ecbf135fae070ea032fa10a59bb76ec1b0 (patch) | |
tree | 7b87fcb52ef5eddf9998b9b4fee2652ec7959b8a | |
parent | 8eb50d3b4be4df15f830e4b36449c9fcf05aa71b (diff) |
fdo#37129: Fix the drawing of dotted and dashed borders in Calc.
5 files changed, 40 insertions, 3 deletions
diff --git a/drawinglayer/inc/drawinglayer/primitive2d/borderlineprimitive2d.hxx b/drawinglayer/inc/drawinglayer/primitive2d/borderlineprimitive2d.hxx index 0bd537de41b3..1449e2b630c7 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 9738e14b503d..df6f381c69ec 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 a13ca70f948e..c02151987643 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 de24369929f5..486eaef8ded1 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 810a41b6fbc1..bf412d4b8cc3 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 ) { |