fdo#37129: Fix the drawing of dotted and dashed borders in Calc.
This commit is contained in:
committed by
Cédric Bosdonnat
parent
8eb50d3b4b
commit
8c2902ecbf
@@ -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);
|
||||
|
@@ -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 );
|
||||
|
@@ -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--;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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 );
|
||||
|
||||
|
@@ -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 )
|
||||
{
|
||||
|
Reference in New Issue
Block a user