Kaydet (Commit) 7809ec85 authored tarafından Bartosz Kosiorek's avatar Bartosz Kosiorek

tdf#122498 EMF+ Fix rotation of Ellipse, Arc and Pie

To draw any shape with EMF+ the shape needs to be created
and next the transformation matrix needs to be applied.
Unfortunately for Ellipse, Arc and Pie only position and ratio
was transformed. The rotation was not handled correctly.
With this patch the transformation matrix is applied after
creation of the shape.

Change-Id: I63a797e7cddfd304f94e7e5c8e2ce15063dc55e5
Reviewed-on: https://gerrit.libreoffice.org/65898
Tested-by: Jenkins
Reviewed-by: 's avatarBartosz Kosiorek <gang65@poczta.onet.pl>
üst a6572f5f
...@@ -971,8 +971,6 @@ namespace emfplushelper ...@@ -971,8 +971,6 @@ namespace emfplushelper
SAL_INFO("drawinglayer", "EMF+\t RectData: " << dx << "," << dy << " " << dw << "x" << dh); SAL_INFO("drawinglayer", "EMF+\t RectData: " << dx << "," << dy << " " << dw << "x" << dh);
startAngle = basegfx::deg2rad(startAngle); startAngle = basegfx::deg2rad(startAngle);
sweepAngle = basegfx::deg2rad(sweepAngle); sweepAngle = basegfx::deg2rad(sweepAngle);
::basegfx::B2DPoint mappedCenter(Map(dx + dw / 2, dy + dh / 2));
::basegfx::B2DSize mappedSize(MapSize(dw / 2, dh / 2));
float endAngle = startAngle + sweepAngle; float endAngle = startAngle + sweepAngle;
startAngle = fmodf(startAngle, static_cast<float>(M_PI * 2)); startAngle = fmodf(startAngle, static_cast<float>(M_PI * 2));
...@@ -980,14 +978,12 @@ namespace emfplushelper ...@@ -980,14 +978,12 @@ namespace emfplushelper
{ {
startAngle += static_cast<float>(M_PI * 2.0); startAngle += static_cast<float>(M_PI * 2.0);
} }
endAngle = fmodf(endAngle, static_cast<float>(M_PI * 2.0)); endAngle = fmodf(endAngle, static_cast<float>(M_PI * 2.0));
if (endAngle < 0.0) if (endAngle < 0.0)
{ {
endAngle += static_cast<float>(M_PI * 2.0); endAngle += static_cast<float>(M_PI * 2.0);
} }
if (sweepAngle < 0) if (sweepAngle < 0)
{ {
std::swap(endAngle, startAngle); std::swap(endAngle, startAngle);
...@@ -996,17 +992,18 @@ namespace emfplushelper ...@@ -996,17 +992,18 @@ namespace emfplushelper
SAL_INFO("drawinglayer", "EMF+\t adjusted angles: start " << SAL_INFO("drawinglayer", "EMF+\t adjusted angles: start " <<
basegfx::rad2deg(startAngle) << ", end: " << basegfx::rad2deg(endAngle) << basegfx::rad2deg(startAngle) << ", end: " << basegfx::rad2deg(endAngle) <<
" startAngle: " << startAngle << " sweepAngle: " << sweepAngle); " startAngle: " << startAngle << " sweepAngle: " << sweepAngle);
const ::basegfx::B2DPoint centerPoint(dx + 0.5 * dw, dy + 0.5 * dh);
::basegfx::B2DPolygon polygon = basegfx::utils::createPolygonFromEllipseSegment( ::basegfx::B2DPolygon polygon(
mappedCenter, mappedSize.getX(), mappedSize.getY(), startAngle, endAngle); ::basegfx::utils::createPolygonFromEllipseSegment(centerPoint,
0.5 * dw, 0.5 * dh,
startAngle, endAngle));
if (type != EmfPlusRecordTypeDrawArc) if (type != EmfPlusRecordTypeDrawArc)
{ {
polygon.append(mappedCenter); polygon.append(centerPoint);
polygon.setClosed(true); polygon.setClosed(true);
} }
::basegfx::B2DPolyPolygon polyPolygon(polygon); ::basegfx::B2DPolyPolygon polyPolygon(polygon);
polyPolygon.transform(maMapTransform);
if (type == EmfPlusRecordTypeFillPie) if (type == EmfPlusRecordTypeFillPie)
EMFPPlusFillPolygon(polyPolygon, flags & 0x8000, brushIndexOrColor); EMFPPlusFillPolygon(polyPolygon, flags & 0x8000, brushIndexOrColor);
else else
...@@ -1054,11 +1051,10 @@ namespace emfplushelper ...@@ -1054,11 +1051,10 @@ namespace emfplushelper
float dx, dy, dw, dh; float dx, dy, dw, dh;
ReadRectangle(rMS, dx, dy, dw, dh, bool(flags & 0x4000)); ReadRectangle(rMS, dx, dy, dw, dh, bool(flags & 0x4000));
SAL_INFO("drawinglayer", "EMF+ RectData: " << dx << "," << dy << " " << dw << "x" << dh); SAL_INFO("drawinglayer", "EMF+ RectData: " << dx << "," << dy << " " << dw << "x" << dh);
::basegfx::B2DPoint mappedCenter(Map(dx + dw / 2, dy + dh / 2));
::basegfx::B2DSize mappedSize(MapSize(dw / 2, dh / 2));
::basegfx::B2DPolyPolygon polyPolygon( ::basegfx::B2DPolyPolygon polyPolygon(
::basegfx::utils::createPolygonFromEllipse(mappedCenter, mappedSize.getX(), mappedSize.getY())); ::basegfx::utils::createPolygonFromEllipse(::basegfx::B2DPoint(dx + 0.5 * dw, dy + 0.5 * dh),
0.5 * dw, 0.5 * dh));
polyPolygon.transform(maMapTransform);
if (type == EmfPlusRecordTypeFillEllipse) if (type == EmfPlusRecordTypeFillEllipse)
EMFPPlusFillPolygon(polyPolygon, flags & 0x8000, brushIndexOrColor); EMFPPlusFillPolygon(polyPolygon, flags & 0x8000, brushIndexOrColor);
else else
...@@ -1518,7 +1514,7 @@ namespace emfplushelper ...@@ -1518,7 +1514,7 @@ namespace emfplushelper
} }
case EmfPlusRecordTypeSetWorldTransform: case EmfPlusRecordTypeSetWorldTransform:
{ {
SAL_INFO("drawinglayer", "EMF+ SetWorldTransform, Post multiply: " << (flags & 0x2000)); SAL_INFO("drawinglayer", "EMF+ SetWorldTransform, Post multiply: " << bool(flags & 0x2000));
readXForm(rMS, maWorldTransform); readXForm(rMS, maWorldTransform);
mappingChanged(); mappingChanged();
SAL_INFO("drawinglayer", "EMF+\t: " << maWorldTransform); SAL_INFO("drawinglayer", "EMF+\t: " << maWorldTransform);
...@@ -1536,7 +1532,7 @@ namespace emfplushelper ...@@ -1536,7 +1532,7 @@ namespace emfplushelper
} }
case EmfPlusRecordTypeMultiplyWorldTransform: case EmfPlusRecordTypeMultiplyWorldTransform:
{ {
SAL_INFO("drawinglayer", "EMF+ MultiplyWorldTransform, post multiply: " << (flags & 0x2000)); SAL_INFO("drawinglayer", "EMF+ MultiplyWorldTransform, post multiply: " << bool(flags & 0x2000));
basegfx::B2DHomMatrix transform; basegfx::B2DHomMatrix transform;
readXForm(rMS, transform); readXForm(rMS, transform);
...@@ -1563,7 +1559,7 @@ namespace emfplushelper ...@@ -1563,7 +1559,7 @@ namespace emfplushelper
} }
case EmfPlusRecordTypeTranslateWorldTransform: case EmfPlusRecordTypeTranslateWorldTransform:
{ {
SAL_INFO("drawinglayer", "EMF+ TranslateWorldTransform, Post multiply: " << (flags & 0x2000)); SAL_INFO("drawinglayer", "EMF+ TranslateWorldTransform, Post multiply: " << bool(flags & 0x2000));
basegfx::B2DHomMatrix transform; basegfx::B2DHomMatrix transform;
float eDx, eDy; float eDx, eDy;
...@@ -1601,7 +1597,7 @@ namespace emfplushelper ...@@ -1601,7 +1597,7 @@ namespace emfplushelper
transform.set(1, 1, eSy); transform.set(1, 1, eSy);
SAL_INFO("drawinglayer", "EMF+ ScaleWorldTransform Sx: " << eSx << SAL_INFO("drawinglayer", "EMF+ ScaleWorldTransform Sx: " << eSx <<
" Sy: " << eSy << ", Post multiply:" << (flags & 0x2000)); " Sy: " << eSy << ", Post multiply:" << bool(flags & 0x2000));
SAL_INFO("drawinglayer", SAL_INFO("drawinglayer",
"EMF+\t World transform matrix: " << maWorldTransform); "EMF+\t World transform matrix: " << maWorldTransform);
...@@ -1630,7 +1626,7 @@ namespace emfplushelper ...@@ -1630,7 +1626,7 @@ namespace emfplushelper
rMS.ReadFloat(eAngle); rMS.ReadFloat(eAngle);
SAL_INFO("drawinglayer", "EMF+ RotateWorldTransform Angle: " << eAngle << SAL_INFO("drawinglayer", "EMF+ RotateWorldTransform Angle: " << eAngle <<
", post multiply: " << (flags & 0x2000)); ", post multiply: " << bool(flags & 0x2000));
// Skipping flags & 0x2000 // Skipping flags & 0x2000
// For rotation transformation there is no difference between post and pre multiply // For rotation transformation there is no difference between post and pre multiply
maWorldTransform.rotate(basegfx::deg2rad(eAngle)); maWorldTransform.rotate(basegfx::deg2rad(eAngle));
......
...@@ -173,6 +173,7 @@ namespace emfplushelper ...@@ -173,6 +173,7 @@ namespace emfplushelper
if (penDataFlags & PenDataTransform) if (penDataFlags & PenDataTransform)
{ {
EmfPlusHelperData::readXForm(s, pen_transformation); EmfPlusHelperData::readXForm(s, pen_transformation);
SAL_WARN("drawinglayer", "EMF+\t\t TODO PenDataTransform: " << pen_transformation);
} }
if (penDataFlags & PenDataStartCap) if (penDataFlags & PenDataStartCap)
...@@ -198,6 +199,7 @@ namespace emfplushelper ...@@ -198,6 +199,7 @@ namespace emfplushelper
if (penDataFlags & PenDataJoin) if (penDataFlags & PenDataJoin)
{ {
s.ReadInt32(lineJoin); s.ReadInt32(lineJoin);
SAL_WARN("drawinglayer", "EMF+\t\t TODO PenDataJoin: 0x" << std::hex << lineJoin);
} }
else else
{ {
...@@ -207,6 +209,7 @@ namespace emfplushelper ...@@ -207,6 +209,7 @@ namespace emfplushelper
if (penDataFlags & PenDataMiterLimit) if (penDataFlags & PenDataMiterLimit)
{ {
s.ReadFloat(mitterLimit); s.ReadFloat(mitterLimit);
SAL_WARN("drawinglayer", "EMF+\t\t TODO PenDataMiterLimit: 0x" << std::hex << mitterLimit);
} }
else else
{ {
...@@ -226,6 +229,7 @@ namespace emfplushelper ...@@ -226,6 +229,7 @@ namespace emfplushelper
if (penDataFlags & PenDataDashedLineCap) if (penDataFlags & PenDataDashedLineCap)
{ {
s.ReadInt32(dashCap); s.ReadInt32(dashCap);
SAL_WARN("drawinglayer", "EMF+\t\t TODO PenDataDashedLineCap: 0x" << std::hex << dashCap);
} }
else else
{ {
...@@ -235,6 +239,7 @@ namespace emfplushelper ...@@ -235,6 +239,7 @@ namespace emfplushelper
if (penDataFlags & PenDataDashedLineOffset) if (penDataFlags & PenDataDashedLineOffset)
{ {
s.ReadFloat(dashOffset); s.ReadFloat(dashOffset);
SAL_WARN("drawinglayer", "EMF+\t\t TODO PenDataDashedLineOffset: 0x" << std::hex << dashOffset);
} }
else else
{ {
...@@ -266,6 +271,7 @@ namespace emfplushelper ...@@ -266,6 +271,7 @@ namespace emfplushelper
if (penDataFlags & PenDataNonCenter) if (penDataFlags & PenDataNonCenter)
{ {
s.ReadInt32(alignment); s.ReadInt32(alignment);
SAL_WARN("drawinglayer", "EMF+\t\t TODO PenDataNonCenter: 0x" << std::hex << alignment);
} }
else else
{ {
...@@ -288,6 +294,7 @@ namespace emfplushelper ...@@ -288,6 +294,7 @@ namespace emfplushelper
{ {
s.ReadFloat(compoundArray[i]); s.ReadFloat(compoundArray[i]);
} }
SAL_WARN("drawinglayer", "EMF+\t\t TODO PenDataCompoundLine: 0x");
} }
if (penDataFlags & PenDataCustomStartCap) if (penDataFlags & PenDataCustomStartCap)
......
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