Kaydet (Commit) 8c2902ec authored tarafından Tomofumi Yagi's avatar Tomofumi Yagi Kaydeden (comit) Cédric Bosdonnat

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

üst 8eb50d3b
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <basegfx/color/bcolor.hxx> #include <basegfx/color/bcolor.hxx>
#include <basegfx/matrix/b2dhommatrix.hxx> #include <basegfx/matrix/b2dhommatrix.hxx>
#include <basegfx/polygon/b2dpolypolygon.hxx> #include <basegfx/polygon/b2dpolypolygon.hxx>
#include <svtools/ctrlbox.hxx>
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
...@@ -112,6 +113,11 @@ namespace drawinglayer ...@@ -112,6 +113,11 @@ namespace drawinglayer
return basegfx::fTools::equal(1.0, mfRightWidth); return basegfx::fTools::equal(1.0, mfRightWidth);
} }
bool isSolidLine() const
{
return (mnStyle==STYLE_SOLID);
}
bool isInsideUsed() const bool isInsideUsed() const
{ {
return !basegfx::fTools::equalZero(mfLeftWidth); return !basegfx::fTools::equalZero(mfLeftWidth);
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
// MARKER(update_precomp.py): autogen include statement, do not remove // MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_drawinglayer.hxx" #include "precompiled_drawinglayer.hxx"
#include <drawinglayer/geometry/viewinformation2d.hxx>
#include <drawinglayer/primitive2d/borderlineprimitive2d.hxx> #include <drawinglayer/primitive2d/borderlineprimitive2d.hxx>
#include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx> #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
#include <basegfx/polygon/b2dpolygon.hxx> #include <basegfx/polygon/b2dpolygon.hxx>
...@@ -79,7 +80,7 @@ namespace drawinglayer ...@@ -79,7 +80,7 @@ namespace drawinglayer
return basegfx::B2DPolyPolygon( clipPolygon ); return basegfx::B2DPolyPolygon( clipPolygon );
} }
Primitive2DSequence BorderLinePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const Primitive2DSequence BorderLinePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
{ {
Primitive2DSequence xRetval; Primitive2DSequence xRetval;
...@@ -214,6 +215,7 @@ namespace drawinglayer ...@@ -214,6 +215,7 @@ namespace drawinglayer
// Get which is the line to show // Get which is the line to show
bool bIsHairline = leftIsHairline(); bool bIsHairline = leftIsHairline();
bool bIsSolidline = isSolidLine();
double nWidth = getCorrectedLeftWidth(); double nWidth = getCorrectedLeftWidth();
basegfx::BColor aColor = getRGBColorLeft(); basegfx::BColor aColor = getRGBColorLeft();
if ( basegfx::fTools::equal( 0.0, mfLeftWidth ) ) if ( basegfx::fTools::equal( 0.0, mfLeftWidth ) )
...@@ -223,7 +225,7 @@ namespace drawinglayer ...@@ -223,7 +225,7 @@ namespace drawinglayer
aColor = getRGBColorRight(); aColor = getRGBColorRight();
} }
if(bIsHairline) if(bIsHairline && bIsSolidline)
{ {
// create hairline primitive // create hairline primitive
aPolygon.append( getStart() ); aPolygon.append( getStart() );
...@@ -237,12 +239,13 @@ namespace drawinglayer ...@@ -237,12 +239,13 @@ namespace drawinglayer
{ {
// create filled polygon primitive // create filled polygon primitive
const basegfx::B2DVector aLineWidthOffset(((nWidth + 1) * 0.5) * aPerpendicular); const basegfx::B2DVector aLineWidthOffset(((nWidth + 1) * 0.5) * aPerpendicular);
basegfx::B2DVector aScale( rViewInformation.getInverseObjectToViewTransformation() * aVector );
aPolygon.append( aTmpStart ); aPolygon.append( aTmpStart );
aPolygon.append( aTmpEnd ); aPolygon.append( aTmpEnd );
basegfx::B2DPolyPolygon aDashed = svtools::ApplyLineDashing( 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++ ) for (sal_uInt32 i = 0; i < aDashed.count(); i++ )
{ {
basegfx::B2DPolygon aDash = aDashed.getB2DPolygon( i ); basegfx::B2DPolygon aDash = aDashed.getB2DPolygon( i );
......
...@@ -837,6 +837,10 @@ namespace drawinglayer ...@@ -837,6 +837,10 @@ namespace drawinglayer
} }
else else
{ {
// remember that we enter a PolygonStrokePrimitive2D decomposition,
// used for AA thick line drawing
mnPolygonStrokePrimitive2D++;
mpOutputDevice->DrawPolyPolygon(aLocalPolyPolygon); mpOutputDevice->DrawPolyPolygon(aLocalPolyPolygon);
if(mnPolygonStrokePrimitive2D if(mnPolygonStrokePrimitive2D
...@@ -854,6 +858,9 @@ namespace drawinglayer ...@@ -854,6 +858,9 @@ namespace drawinglayer
mpOutputDevice->DrawPolyLine(aLocalPolyPolygon.getB2DPolygon(a), 0.0); mpOutputDevice->DrawPolyLine(aLocalPolyPolygon.getB2DPolygon(a), 0.0);
} }
} }
// leave PolygonStrokePrimitive2D
mnPolygonStrokePrimitive2D--;
} }
} }
......
...@@ -42,6 +42,9 @@ namespace svtools ...@@ -42,6 +42,9 @@ namespace svtools
SVT_DLLPUBLIC basegfx::B2DPolyPolygon ApplyLineDashing( const basegfx::B2DPolygon& rPolygon, SVT_DLLPUBLIC basegfx::B2DPolyPolygon ApplyLineDashing( const basegfx::B2DPolygon& rPolygon,
sal_uInt16 nDashing, MapUnit eUnit ); 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, SVT_DLLPUBLIC void DrawLine( OutputDevice& rDev, const basegfx::B2DPoint& rBeg,
const basegfx::B2DPoint& rEnd, sal_uInt32 nWidth, sal_uInt16 nDashing ); const basegfx::B2DPoint& rEnd, sal_uInt32 nWidth, sal_uInt16 nDashing );
......
...@@ -594,6 +594,24 @@ namespace svtools ...@@ -594,6 +594,24 @@ namespace svtools
return aPolygons; 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, void DrawLine( OutputDevice& rDev, const Point& rP1, const Point& rP2,
sal_uInt32 nWidth, sal_uInt16 nDashing ) sal_uInt32 nWidth, sal_uInt16 nDashing )
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment