[Libreoffice-commits] core.git: Branch 'distro/nisz/libreoffice-6-4' - sw/qa sw/source writerfilter/qa writerfilter/source
Miklos Vajna (via logerrit)
logerrit at kemper.freedesktop.org
Tue Jul 28 08:53:47 UTC 2020
sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 18 +++++++-----
sw/source/filter/ww8/docxsdrexport.cxx | 3 +-
sw/source/filter/ww8/rtfattributeoutput.cxx | 4 +-
sw/source/filter/ww8/writerhelper.cxx | 24 ++++++++++++++++-
sw/source/filter/ww8/writerhelper.hxx | 2 -
sw/source/filter/ww8/wrtw8esh.cxx | 2 -
writerfilter/qa/cppunittests/dmapper/GraphicImport.cxx | 5 ++-
writerfilter/source/dmapper/WrapPolygonHandler.cxx | 3 +-
8 files changed, 45 insertions(+), 16 deletions(-)
New commits:
commit fe8e7f1058134b6a8c8dfc51966df3b0d2251213
Author: Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Thu May 14 18:02:23 2020 +0200
Commit: Gabor Kelemen <kelemen.gabor2 at nisz.hu>
CommitDate: Tue Jul 28 10:53:14 2020 +0200
DOCX export: fix interaction between the crop and the wrap polygon of image
If the wrap polygon is influenced by crop at import time, we need to do
the opposite at export time.
Do this for RTF and DOCX, where there is matching import code in
writerfilter/, leave DOC alone for now.
Test this by changing testFdo76803 into an export test, then seeing how
the first point's Y position fails and fixing up the exporter, so we
get back the old good value.
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94246
Reviewed-by: Miklos Vajna <vmiklos at collabora.com>
Tested-by: Jenkins
(cherry picked from commit c68b458514b35cae70c9a6630e06f46a867aa3b9)
Change-Id: Ieef18aad3c76f7945c7348201b07bcb27a4cd48d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/99543
Tested-by: Gabor Kelemen <kelemen.gabor2 at nisz.hu>
Reviewed-by: Gabor Kelemen <kelemen.gabor2 at nisz.hu>
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index de03b1c0ce1c..4b2c4cc814bf 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -955,7 +955,7 @@ DECLARE_OOXMLIMPORT_TEST(testFdo75722dml, "fdo75722-dml.docx")
CPPUNIT_ASSERT_EQUAL(sal_Int64(3128), nRot);
}
-DECLARE_OOXMLIMPORT_TEST(testFdo76803, "fdo76803.docx")
+DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testFdo76803, "fdo76803.docx")
{
// The ContourPolyPolygon was wrong
uno::Reference<beans::XPropertySet> xPropertySet(getShape(1), uno::UNO_QUERY);
@@ -971,16 +971,20 @@ DECLARE_OOXMLIMPORT_TEST(testFdo76803, "fdo76803.docx")
CPPUNIT_ASSERT_EQUAL(sal_uInt32(4), aPolygon.count());
- CPPUNIT_ASSERT_EQUAL(double(-162), aPolygon.getB2DPoint(0).getX());
+ CPPUNIT_ASSERT_EQUAL(double(-149), aPolygon.getB2DPoint(0).getX());
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: -35
+ // - Actual : -67
+ // i.e. the cropping did not influence the wrap polygon during export.
CPPUNIT_ASSERT_EQUAL(double(-35), aPolygon.getB2DPoint(0).getY());
- CPPUNIT_ASSERT_EQUAL(double(-162), aPolygon.getB2DPoint(1).getX());
- CPPUNIT_ASSERT_EQUAL(double(3510), aPolygon.getB2DPoint(1).getY());
+ CPPUNIT_ASSERT_EQUAL(double(-149), aPolygon.getB2DPoint(1).getX());
+ CPPUNIT_ASSERT_EQUAL(double(3511), aPolygon.getB2DPoint(1).getY());
- CPPUNIT_ASSERT_EQUAL(double(16892), aPolygon.getB2DPoint(2).getX());
- CPPUNIT_ASSERT_EQUAL(double(3510), aPolygon.getB2DPoint(2).getY());
+ CPPUNIT_ASSERT_EQUAL(double(16889), aPolygon.getB2DPoint(2).getX());
+ CPPUNIT_ASSERT_EQUAL(double(3511), aPolygon.getB2DPoint(2).getY());
- CPPUNIT_ASSERT_EQUAL(double(16892), aPolygon.getB2DPoint(3).getX());
+ CPPUNIT_ASSERT_EQUAL(double(16889), aPolygon.getB2DPoint(3).getX());
CPPUNIT_ASSERT_EQUAL(double(-35), aPolygon.getB2DPoint(3).getY());
}
diff --git a/sw/source/filter/ww8/docxsdrexport.cxx b/sw/source/filter/ww8/docxsdrexport.cxx
index 1fb320916d7a..fdd9635138a3 100644
--- a/sw/source/filter/ww8/docxsdrexport.cxx
+++ b/sw/source/filter/ww8/docxsdrexport.cxx
@@ -778,7 +778,8 @@ void DocxSdrExport::startDMLAnchorInline(const SwFrameFormat* pFrameFormat, cons
"bothSides");
m_pImpl->getSerializer()->startElementNS(XML_wp, XML_wrapPolygon, XML_edited, "0");
- tools::Polygon aPoly = sw::util::CorrectWordWrapPolygonForExport(*pPolyPoly, pNd);
+ tools::Polygon aPoly = sw::util::CorrectWordWrapPolygonForExport(
+ *pPolyPoly, pNd, /*bCorrectCrop=*/true);
for (sal_uInt16 i = 0; i < aPoly.GetSize(); ++i)
m_pImpl->getSerializer()->singleElementNS(
XML_wp, (i == 0 ? XML_start : XML_lineTo), XML_x,
diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx b/sw/source/filter/ww8/rtfattributeoutput.cxx
index 6313472bf728..97801eaba1cc 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.cxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.cxx
@@ -4151,8 +4151,8 @@ void RtfAttributeOutput::FlyFrameGraphic(const SwFlyFrameFormat* pFlyFrameFormat
const tools::PolyPolygon* pPolyPoly = pNd->HasContour();
if (pPolyPoly && pPolyPoly->Count())
{
- tools::Polygon aPoly
- = sw::util::CorrectWordWrapPolygonForExport(*pPolyPoly, pNd);
+ tools::Polygon aPoly = sw::util::CorrectWordWrapPolygonForExport(
+ *pPolyPoly, pNd, /*bCorrectCrop=*/true);
OStringBuffer aVerticies;
for (sal_uInt16 i = 0; i < aPoly.GetSize(); ++i)
aVerticies.append(";(")
diff --git a/sw/source/filter/ww8/writerhelper.cxx b/sw/source/filter/ww8/writerhelper.cxx
index a062941f6b57..104edeaa7608 100644
--- a/sw/source/filter/ww8/writerhelper.cxx
+++ b/sw/source/filter/ww8/writerhelper.cxx
@@ -59,6 +59,7 @@
#include <IDocumentStylePoolAccess.hxx>
#include <IDocumentMarkAccess.hxx>
#include <IMark.hxx>
+#include <grfatr.hxx>
using namespace com::sun::star;
@@ -650,10 +651,31 @@ namespace sw
}
}
- tools::Polygon CorrectWordWrapPolygonForExport(const tools::PolyPolygon& rPolyPoly, const SwNoTextNode* pNd)
+ tools::Polygon CorrectWordWrapPolygonForExport(const tools::PolyPolygon& rPolyPoly, const SwNoTextNode* pNd, bool bCorrectCrop)
{
tools::Polygon aPoly(PolygonFromPolyPolygon(rPolyPoly));
const Size &rOrigSize = pNd->GetGraphic().GetPrefSize();
+
+ const SwAttrSet* pAttrSet = pNd->GetpSwAttrSet();
+ if (bCorrectCrop && pAttrSet)
+ {
+ if (pAttrSet->HasItem(RES_GRFATR_CROPGRF))
+ {
+ // Word's wrap polygon deals with a canvas which has the size of the already
+ // cropped graphic, do the opposite of correctCrop() in writerfilter/.
+ const SwCropGrf& rCrop = pAttrSet->GetCropGrf();
+ sal_Int32 nCropLeft = convertTwipToMm100(rCrop.GetLeft());
+ sal_Int32 nCropRight = convertTwipToMm100(rCrop.GetRight());
+ sal_Int32 nCropTop = convertTwipToMm100(rCrop.GetTop());
+ sal_Int32 nCropBottom = convertTwipToMm100(rCrop.GetBottom());
+ aPoly.Move(-nCropLeft, -nCropTop);
+
+ Fraction aScaleX(rOrigSize.getWidth(), rOrigSize.getWidth() - nCropLeft - nCropRight);
+ Fraction aScaleY(rOrigSize.getHeight(), rOrigSize.getHeight() - nCropTop - nCropBottom);
+ aPoly.Scale(double(aScaleX), double(aScaleY));
+ }
+ }
+
Fraction aMapPolyX(ww::nWrap100Percent, rOrigSize.Width());
Fraction aMapPolyY(ww::nWrap100Percent, rOrigSize.Height());
aPoly.Scale(double(aMapPolyX), double(aMapPolyY));
diff --git a/sw/source/filter/ww8/writerhelper.hxx b/sw/source/filter/ww8/writerhelper.hxx
index 9049b37f4616..f9d186ec58df 100644
--- a/sw/source/filter/ww8/writerhelper.hxx
+++ b/sw/source/filter/ww8/writerhelper.hxx
@@ -608,7 +608,7 @@ namespace sw
tools::Polygon PolygonFromPolyPolygon(const tools::PolyPolygon &rPolyPoly);
/// Undo all scaling / move tricks of the wrap polygon done during import.
- tools::Polygon CorrectWordWrapPolygonForExport(const tools::PolyPolygon& rPolyPoly, const SwNoTextNode* pNd);
+ tools::Polygon CorrectWordWrapPolygonForExport(const tools::PolyPolygon& rPolyPoly, const SwNoTextNode* pNd, bool bCorrectCrop);
/** Make setting a drawing object's layer in a Writer document easy
diff --git a/sw/source/filter/ww8/wrtw8esh.cxx b/sw/source/filter/ww8/wrtw8esh.cxx
index fb90d4c406e8..95cb1a5aa7ce 100644
--- a/sw/source/filter/ww8/wrtw8esh.cxx
+++ b/sw/source/filter/ww8/wrtw8esh.cxx
@@ -2114,7 +2114,7 @@ sal_Int32 SwEscherEx::WriteFlyFrameAttr(const SwFrameFormat& rFormat, MSO_SPT eS
const tools::PolyPolygon *pPolyPoly = pNd->HasContour();
if (pPolyPoly && pPolyPoly->Count())
{
- tools::Polygon aPoly = CorrectWordWrapPolygonForExport(*pPolyPoly, pNd);
+ tools::Polygon aPoly = CorrectWordWrapPolygonForExport(*pPolyPoly, pNd, /*bCorrectCrop=*/false);
SvMemoryStream aPolyDump;
aPolyDump.SetEndian(SvStreamEndian::LITTLE);
diff --git a/writerfilter/qa/cppunittests/dmapper/GraphicImport.cxx b/writerfilter/qa/cppunittests/dmapper/GraphicImport.cxx
index aa0f63d143de..378eb7e00231 100644
--- a/writerfilter/qa/cppunittests/dmapper/GraphicImport.cxx
+++ b/writerfilter/qa/cppunittests/dmapper/GraphicImport.cxx
@@ -128,13 +128,14 @@ CPPUNIT_TEST_FIXTURE(Test, testWrapPolyCrop)
// 10582, the lower 33% of the graphic is cropped, and the wrap polygon covers the middle third
// of the area vertically. Which means 10582*2/3 = 7054.67 is the cropped height, and the top of
// the middle third is 2351.55.
+ // Then there is a 15 twips shift from the origo, so it's 2351.55 + 26.46 = 2378.01 in mm100.
//
// Without the accompanying fix in place, this test would have failed with:
- // - Expected: 2361
+ // - Expected: 2368
// - Actual : 3542
// i.e. the wrap polygon covered a larger-than-correct area, which end the end means 3 lines
// were wrapping around the image, not only 2 as Word does it.
- CPPUNIT_ASSERT_EQUAL(2361., aPolygon.getB2DPoint(0).getY());
+ CPPUNIT_ASSERT_EQUAL(2368., aPolygon.getB2DPoint(0).getY());
}
}
diff --git a/writerfilter/source/dmapper/WrapPolygonHandler.cxx b/writerfilter/source/dmapper/WrapPolygonHandler.cxx
index 14c1d6a0c5bf..aa23342443a4 100644
--- a/writerfilter/source/dmapper/WrapPolygonHandler.cxx
+++ b/writerfilter/source/dmapper/WrapPolygonHandler.cxx
@@ -20,6 +20,7 @@
#include <com/sun/star/drawing/PointSequence.hpp>
#include <com/sun/star/text/GraphicCrop.hpp>
#include <comphelper/sequence.hxx>
+#include <tools/mapunit.hxx>
#include <ooxml/resourceids.hxx>
@@ -99,7 +100,7 @@ WrapPolygon::Pointer_t WrapPolygon::correctWordWrapPolygon(const awt::Size & rSr
const long nWrap100Percent = 21600;
Fraction aMove(nWrap100Percent, rSrcSize.Width);
- aMove = aMove * Fraction(15, 1);
+ aMove = aMove * Fraction(convertTwipToMm100(15), 1);
awt::Point aMovePoint(aMove.operator long(), 0);
pResult = move(aMovePoint);
More information about the Libreoffice-commits
mailing list