summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Jaap <patrick.jaap@tu-dresden.de>2017-08-01 16:24:01 +0200
committerArmin Le Grand <Armin.Le.Grand@cib.de>2017-08-04 09:19:35 +0200
commita3926e25bb0a9c79e3ea1f413b8fa83b91915758 (patch)
treed5a2f045caee61c9c53015d801ebf89605867d21
parentc2fdf096b40f87436b3ee74a1cdeb014cb5a7bbf (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.cxx28
-rw-r--r--drawinglayer/source/tools/emfppen.cxx4
-rw-r--r--drawinglayer/source/tools/emfppen.hxx2
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;