diff options
author | Patrick Jaap <patrick.jaap@tu-dresden.de> | 2017-08-01 16:24:01 +0200 |
---|---|---|
committer | Armin Le Grand <Armin.Le.Grand@cib.de> | 2017-08-04 09:19:35 +0200 |
commit | a3926e25bb0a9c79e3ea1f413b8fa83b91915758 (patch) | |
tree | d5a2f045caee61c9c53015d801ebf89605867d21 | |
parent | c2fdf096b40f87436b3ee74a1cdeb014cb5a7bbf (diff) |
new EMF+ parser: EMFPPlusDrawPolygon: use correct pen width
the current implementation uses PolyPolygonHairlinePrimitive2D for
polygons. This patch uses a PolyPolygonStrokePrimitive2D which makes
use of the correct (transformed) pen width and some basic join and cap
attributes.
Change-Id: Ifbd8cbbc41004d9d45f3c48f2c13fe449025a229
Reviewed-on: https://gerrit.libreoffice.org/40638
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Armin Le Grand <Armin.Le.Grand@cib.de>
-rw-r--r-- | drawinglayer/source/tools/emfphelperdata.cxx | 28 | ||||
-rw-r--r-- | drawinglayer/source/tools/emfppen.cxx | 4 | ||||
-rw-r--r-- | drawinglayer/source/tools/emfppen.hxx | 2 |
3 files changed, 29 insertions, 5 deletions
diff --git a/drawinglayer/source/tools/emfphelperdata.cxx b/drawinglayer/source/tools/emfphelperdata.cxx index a648117982ff..d7919234842f 100644 --- a/drawinglayer/source/tools/emfphelperdata.cxx +++ b/drawinglayer/source/tools/emfphelperdata.cxx @@ -331,10 +331,30 @@ namespace emfplushelper if (pen && polygon.count()) { - mrTargetHolders.Current().append( - new drawinglayer::primitive2d::PolyPolygonHairlinePrimitive2D( - polygon, - pen->GetColor().getBColor())); + // we need a line join attribute + basegfx::B2DLineJoin lineJoin = basegfx::B2DLineJoin::Round; + if (pen->penDataFlags & 0x00000008) // additional line join information + { + lineJoin = static_cast<basegfx::B2DLineJoin>(EMFPPen::lcl_convertLineJoinType(pen->lineJoin)); + } + + // we need a line cap attribute + css::drawing::LineCap lineCap = css::drawing::LineCap_BUTT; + if (pen->penDataFlags & 0x00000002) // additional line cap information + { + lineCap = static_cast<css::drawing::LineCap>(EMFPPen::lcl_convertStrokeCap(pen->startCap)); + SAL_WARN_IF(pen->startCap != pen->endCap, "cppcanvas.emf", "emf+ pen uses different start and end cap"); + } + // transform the pen width + const double transformedPenWidth = MapSize(pen->penWidth, 0).getX(); + drawinglayer::attribute::LineAttribute lineAttribute(pen->GetColor().getBColor(), + transformedPenWidth, + lineJoin, + lineCap); + mrTargetHolders.Current().append( + new drawinglayer::primitive2d::PolyPolygonStrokePrimitive2D( + polygon, + lineAttribute)); } } diff --git a/drawinglayer/source/tools/emfppen.cxx b/drawinglayer/source/tools/emfppen.cxx index 9bc66e6716af..1905b8cb6f48 100644 --- a/drawinglayer/source/tools/emfppen.cxx +++ b/drawinglayer/source/tools/emfppen.cxx @@ -69,6 +69,8 @@ namespace emfplushelper EMFPPen::EMFPPen() : EMFPBrush() + , penDataFlags(0) + , penUnit(0) , penWidth(0.0) , startCap(0) , endCap(0) @@ -169,7 +171,7 @@ namespace emfplushelper void EMFPPen::Read(SvStream& s, EmfPlusHelperData& rR) { - sal_uInt32 graphicsVersion, penType, penDataFlags, penUnit; + sal_uInt32 graphicsVersion, penType; int i; s.ReadUInt32(graphicsVersion).ReadUInt32(penType).ReadUInt32(penDataFlags).ReadUInt32(penUnit).ReadFloat(penWidth); SAL_INFO("cppcanvas.emf", "EMF+\tpen"); diff --git a/drawinglayer/source/tools/emfppen.hxx b/drawinglayer/source/tools/emfppen.hxx index c338fef62029..7b8f67d41d87 100644 --- a/drawinglayer/source/tools/emfppen.hxx +++ b/drawinglayer/source/tools/emfppen.hxx @@ -39,6 +39,8 @@ namespace emfplushelper struct EMFPPen : public EMFPBrush { basegfx::B2DHomMatrix pen_transformation; //TODO: This isn't used + sal_uInt32 penDataFlags; + sal_uInt32 penUnit; float penWidth; sal_Int32 startCap; sal_Int32 endCap; |