summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomofumi Yagi <yagit@mknada.sakura.ne.jp>2011-10-20 11:03:54 +0200
committerCédric Bosdonnat <cedric.bosdonnat@free.fr>2011-10-20 11:05:17 +0200
commit8c2902ecbf135fae070ea032fa10a59bb76ec1b0 (patch)
tree7b87fcb52ef5eddf9998b9b4fee2652ec7959b8a
parent8eb50d3b4be4df15f830e4b36449c9fcf05aa71b (diff)
fdo#37129: Fix the drawing of dotted and dashed borders in Calc.
-rw-r--r--drawinglayer/inc/drawinglayer/primitive2d/borderlineprimitive2d.hxx6
-rw-r--r--drawinglayer/source/primitive2d/borderlineprimitive2d.cxx9
-rw-r--r--drawinglayer/source/processor2d/vclprocessor2d.cxx7
-rw-r--r--svtools/inc/svtools/borderhelper.hxx3
-rw-r--r--svtools/source/control/ctrlbox.cxx18
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 )
{