tdf#55058 tdf#143875 EMF+ Don't change line weight while rotating
Previously when TranfromationMatrix was used with rotation,
the line weight and dashed line shapes were changed.
In worst case if angle was larger than 90 degrees,
the lines just disappear.
This patch fixes that. The line looks exactly after rotation
(with TranfromationMatrix).
The tests were updated (added some additional rotation),
to prove that now it is working correctly.
Change-Id: Ic2382fa8d1b711a6bf06c94b2d0b9da9e7d396f0
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133329
Tested-by: Jenkins
Reviewed-by: Bartosz Kosiorek <gang65@poczta.onet.pl>
diff --git a/drawinglayer/source/tools/emfphelperdata.cxx b/drawinglayer/source/tools/emfphelperdata.cxx
index 84d848e..a7f8093 100644
--- a/drawinglayer/source/tools/emfphelperdata.cxx
+++ b/drawinglayer/source/tools/emfphelperdata.cxx
@@ -442,6 +442,10 @@ namespace emfplushelper
maMapTransform *= basegfx::utils::createScaleTranslateB2DHomMatrix(100.0 * mnMmX / mnPixX, 100.0 * mnMmY / mnPixY,
double(-mnFrameLeft), double(-mnFrameTop));
maMapTransform *= maBaseTransform;
// Used only for performance optimization, to do not calculate it every line draw
mdExtractedXScale = std::hypot(maMapTransform.a(), maMapTransform.b());
mdExtractedYScale = std::hypot(maMapTransform.c(), maMapTransform.d());
}
::basegfx::B2DPoint EmfPlusHelperData::Map(double ix, double iy) const
@@ -531,7 +535,7 @@ namespace emfplushelper
SAL_WARN_IF(pen->startCap != pen->endCap, "drawinglayer.emf", "emf+ pen uses different start and end cap");
}
const double transformedPenWidth = maMapTransform.get(0, 0) * pen->penWidth;
const double transformedPenWidth = mdExtractedYScale * pen->penWidth;
drawinglayer::attribute::LineAttribute lineAttribute(pen->GetColor().getBColor(),
transformedPenWidth,
pen->GetLineJoinType(),
@@ -543,7 +547,7 @@ namespace emfplushelper
new drawinglayer::primitive2d::PolyPolygonStrokePrimitive2D(
polygon,
lineAttribute,
pen->GetStrokeAttribute(maMapTransform.get(1, 1))));
pen->GetStrokeAttribute(mdExtractedXScale)));
}
else
{
@@ -551,7 +555,7 @@ namespace emfplushelper
new drawinglayer::primitive2d::PolyPolygonStrokePrimitive2D(
polygon,
lineAttribute,
pen->GetStrokeAttribute(maMapTransform.get(1, 1))));
pen->GetStrokeAttribute(mdExtractedXScale)));
mrTargetHolders.Current().append(
new drawinglayer::primitive2d::UnifiedTransparencePrimitive2D(
diff --git a/drawinglayer/source/tools/emfphelperdata.hxx b/drawinglayer/source/tools/emfphelperdata.hxx
index 563f777..600f666 100644
--- a/drawinglayer/source/tools/emfphelperdata.hxx
+++ b/drawinglayer/source/tools/emfphelperdata.hxx
@@ -210,6 +210,11 @@ namespace emfplushelper
GraphicStateMap mGSStack;
GraphicStateMap mGSContainerStack;
/* Performance optimizators */
/* Extracted Scale values from Transformation Matrix */
double mdExtractedXScale;
double mdExtractedYScale;
/// data holders
wmfemfhelper::TargetHolders& mrTargetHolders;
wmfemfhelper::PropertyHolders& mrPropertyHolders;
diff --git a/drawinglayer/source/tools/primitive2dxmldump.cxx b/drawinglayer/source/tools/primitive2dxmldump.cxx
index 6126449..3074ad3 100644
--- a/drawinglayer/source/tools/primitive2dxmldump.cxx
+++ b/drawinglayer/source/tools/primitive2dxmldump.cxx
@@ -143,7 +143,7 @@ void writeStrokeAttribute(::tools::XmlWriter& rWriter,
OUString sDotDash;
for (double fDotDash : rStrokeAttribute.getDotDashArray())
{
sDotDash += OUString::number(round(100.0 * fDotDash)) + " ";
sDotDash += OUString::number(lround(fDotDash)) + " ";
}
rWriter.attribute("dotDashArray", sDotDash);
rWriter.attribute("fullDotDashLength", rStrokeAttribute.getFullDotDashLen());
diff --git a/emfio/qa/cppunit/emf/EmfImportTest.cxx b/emfio/qa/cppunit/emf/EmfImportTest.cxx
index 6c4785b..e8db00e 100644
--- a/emfio/qa/cppunit/emf/EmfImportTest.cxx
+++ b/emfio/qa/cppunit/emf/EmfImportTest.cxx
@@ -385,13 +385,13 @@ void Test::TestDrawLine()
// check correct import of the DrawLine: color and width of the line
assertXPath(pDocument, aXPathPrefix + "polypolygonstroke/line", "color", "#000000");
assertXPath(pDocument, aXPathPrefix + "polypolygonstroke/line", "width", "33");
assertXPath(pDocument, aXPathPrefix + "polypolygonstroke/line", "width", "23");
}
void Test::TestDrawLineWithDash()
{
// EMF+ with records: DrawLine
// The lines with different dash styles
// EMF+ with records: DrawLine, ScaleWorldTransform, RotateWorldTransform
// Test lines with different dash styles and different World Rotation
Primitive2DSequence aSequence
= parseEmf(u"/emfio/qa/cppunit/emf/data/TestEmfPlusDrawLineWithDash.emf");
CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aSequence.getLength()));
@@ -400,23 +400,31 @@ void Test::TestDrawLineWithDash()
CPPUNIT_ASSERT(pDocument);
// check correct import of the DrawLine: color and width of the line
assertXPath(pDocument, aXPathPrefix + "polypolygonstroke", 10);
assertXPath(pDocument, aXPathPrefix + "polypolygonstroke[1]/line", "color", "#000000");
assertXPath(pDocument, aXPathPrefix + "polypolygonstroke[1]/line", "width", "132");
assertXPath(pDocument, aXPathPrefix + "polypolygonstroke[1]/stroke", 0);
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke", 12);
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[1]/line", "color", "#000000");
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[1]/line", "width", "185");
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[1]/stroke", 0);
assertXPath(pDocument, aXPathPrefix + "polypolygonstroke[2]/line", "width", "132");
assertXPath(pDocument, aXPathPrefix + "polypolygonstroke[2]/stroke", "dotDashArray",
"13225 13225 ");
assertXPath(pDocument, aXPathPrefix + "polypolygonstroke[3]/stroke", "dotDashArray",
"39674 13225 ");
assertXPath(pDocument, aXPathPrefix + "polypolygonstroke[4]/stroke", "dotDashArray",
"39674 13225 13225 13225 ");
assertXPath(pDocument, aXPathPrefix + "polypolygonstroke[5]/stroke", "dotDashArray",
"39674 13225 13225 13225 13225 13225 ");
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[2]/line", "width", "185");
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[2]/stroke", "dotDashArray",
"185 185 ");
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[3]/line", "width", "185");
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[3]/stroke", "dotDashArray",
"556 185 ");
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[4]/line", "width", "185");
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[4]/stroke", "dotDashArray",
"556 185 185 185 ");
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[5]/line", "width", "370");
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[5]/stroke", "dotDashArray",
"556 185 185 185 185 185 ");
//TODO polypolygonstroke[6-9]/stroke add support for PenDataDashedLineOffset
assertXPath(pDocument, aXPathPrefix + "polypolygonstroke[10]/stroke", "dotDashArray",
"66124 26450 198372 52899 ");
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[10]/line", "width", "370");
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[10]/stroke", "dotDashArray",
"1851 741 5554 1481 ");
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[11]/line", "width", "370");
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[11]/stroke", "dotDashArray",
"1851 741 5554 1481 ");
assertXPath(pDocument, aXPathPrefix + "mask/polypolygonstroke[12]/line", "width", "370");
}
void Test::TestLinearGradient()
diff --git a/emfio/qa/cppunit/emf/data/TestEmfPlusDrawLineWithDash.emf b/emfio/qa/cppunit/emf/data/TestEmfPlusDrawLineWithDash.emf
index dc5af59..547cfca 100644
--- a/emfio/qa/cppunit/emf/data/TestEmfPlusDrawLineWithDash.emf
+++ b/emfio/qa/cppunit/emf/data/TestEmfPlusDrawLineWithDash.emf
Binary files differ