sw/qa/extras/ooxmlexport/data/picture-wrap-polygon.docx |binary sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx | 12 ++++++ sw/source/filter/ww8/docxsdrexport.cxx | 29 +++++++++++++++ sw/source/filter/ww8/writerhelper.cxx | 30 ++++++++++++++++ sw/source/filter/ww8/writerhelper.hxx | 3 + sw/source/filter/ww8/wrtw8esh.cxx | 27 -------------- writerfilter/source/ooxml/model.xml | 1 7 files changed, 75 insertions(+), 27 deletions(-)
New commits: commit b818256d1c0f467d1064a0ebc1b17d079e74f38a Author: Miklos Vajna <[email protected]> Date: Tue Aug 12 16:48:27 2014 +0200 DOCX export: handle wrap polygon around pictures Change-Id: I83d9d42cd48ba4dcd86c6506c7dbd6493bb4d204 diff --git a/sw/qa/extras/ooxmlexport/data/picture-wrap-polygon.docx b/sw/qa/extras/ooxmlexport/data/picture-wrap-polygon.docx new file mode 100644 index 0000000..f858a05 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/picture-wrap-polygon.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx index fc4c1c2..7dfa7ad 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx @@ -18,6 +18,7 @@ #include <com/sun/star/drawing/Hatch.hpp> #include <com/sun/star/drawing/LineJoint.hpp> #include <com/sun/star/drawing/LineStyle.hpp> +#include <com/sun/star/drawing/PointSequenceSequence.hpp> #include <com/sun/star/drawing/TextVerticalAdjust.hpp> #include <com/sun/star/style/LineSpacing.hpp> #include <com/sun/star/style/LineSpacingMode.hpp> @@ -1792,6 +1793,17 @@ DECLARE_OOXMLEXPORT_TEST(testWrapTightThrough, "wrap-tight-through.docx") } } +DECLARE_OOXMLEXPORT_TEST(testPictureWrapPolygon, "picture-wrap-polygon.docx") +{ + // The problem was that the wrap polygon was ignored during export. + drawing::PointSequenceSequence aSeqSeq = getProperty<drawing::PointSequenceSequence>(getShape(1), "ContourPolyPolygon"); + // This was 0: the polygon list was empty. + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), aSeqSeq.getLength()); + + drawing::PointSequence aSeq = aSeqSeq[0]; + CPPUNIT_ASSERT_EQUAL(sal_Int32(11), aSeq.getLength()); +} + #endif CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/filter/ww8/docxsdrexport.cxx b/sw/source/filter/ww8/docxsdrexport.cxx index 7265745..2c1f7bc 100644 --- a/sw/source/filter/ww8/docxsdrexport.cxx +++ b/sw/source/filter/ww8/docxsdrexport.cxx @@ -51,6 +51,7 @@ #include <IDocumentDrawModelAccess.hxx> +#include <writerhelper.hxx> using namespace com::sun::star; using namespace oox; @@ -682,6 +683,34 @@ void DocxSdrExport::startDMLAnchorInline(const SwFrmFmt* pFrmFmt, const Size& rS } } + // Or if we have a contour. + if (!nWrapToken && pFrmFmt->GetSurround().IsContour()) + { + if (const SwNoTxtNode* pNd = sw::util::GetNoTxtNodeFromSwFrmFmt(*pFrmFmt)) + { + const PolyPolygon* pPolyPoly = pNd->HasContour(); + if (pPolyPoly && pPolyPoly->Count()) + { + nWrapToken = XML_wrapTight; + m_pImpl->m_pSerializer->startElementNS(XML_wp, nWrapToken, + XML_wrapText, "bothSides", FSEND); + + m_pImpl->m_pSerializer->startElementNS(XML_wp, XML_wrapPolygon, + XML_edited, "0", + FSEND); + Polygon aPoly = sw::util::CorrectWordWrapPolygonForExport(*pPolyPoly, pNd); + for (sal_uInt16 i = 0; i < aPoly.GetSize(); ++i) + m_pImpl->m_pSerializer->singleElementNS(XML_wp, (i == 0 ? XML_start : XML_lineTo), + XML_x, OString::number(aPoly[i].X()), + XML_y, OString::number(aPoly[i].Y()), + FSEND); + m_pImpl->m_pSerializer->endElementNS(XML_wp, XML_wrapPolygon); + + m_pImpl->m_pSerializer->endElementNS(XML_wp, nWrapToken); + } + } + } + // No? Then just approximate based on what we have. if (isAnchor && !nWrapToken) { commit 959a843f48be63071c64ba9e20c9389ebc390e81 Author: Miklos Vajna <[email protected]> Date: Tue Aug 12 11:40:13 2014 +0200 DOC export: factor out wrap polygon handling to to sw::util So that it'll be possible to reuse it in the DOCX exporter. Change-Id: Ib7371c92c4fd93d7c6f3271ca81311bac8f1a1a7 diff --git a/sw/source/filter/ww8/writerhelper.cxx b/sw/source/filter/ww8/writerhelper.cxx index 015b076..85891c3 100644 --- a/sw/source/filter/ww8/writerhelper.cxx +++ b/sw/source/filter/ww8/writerhelper.cxx @@ -660,6 +660,36 @@ namespace sw } } + Polygon CorrectWordWrapPolygonForExport(const PolyPolygon& rPolyPoly, const SwNoTxtNode* pNd) + { + Polygon aPoly(PolygonFromPolyPolygon(rPolyPoly)); + const Size &rOrigSize = pNd->GetGraphic().GetPrefSize(); + Fraction aMapPolyX(ww::nWrap100Percent, rOrigSize.Width()); + Fraction aMapPolyY(ww::nWrap100Percent, rOrigSize.Height()); + aPoly.Scale(aMapPolyX, aMapPolyY); + + /* + a) stretch right bound by 15twips + b) shrink bottom bound to where it would have been in word + c) Move it to the left by 15twips + + See the import for details + */ + const Size &rSize = pNd->GetTwipSize(); + Fraction aMoveHack(ww::nWrap100Percent, rSize.Width()); + aMoveHack *= Fraction(15, 1); + long nMove(aMoveHack); + + Fraction aHackX(ww::nWrap100Percent + nMove, + ww::nWrap100Percent); + Fraction aHackY(ww::nWrap100Percent - nMove, + ww::nWrap100Percent); + aPoly.Scale(aHackX, aHackY); + + aPoly.Move(-nMove, 0); + return aPoly; + } + Size GetSwappedInSize(const SwNoTxtNode& rNd) { Size aGrTwipSz(rNd.GetTwipSize()); diff --git a/sw/source/filter/ww8/writerhelper.hxx b/sw/source/filter/ww8/writerhelper.hxx index 8a99413..5928499 100644 --- a/sw/source/filter/ww8/writerhelper.hxx +++ b/sw/source/filter/ww8/writerhelper.hxx @@ -741,6 +741,9 @@ namespace sw */ Polygon PolygonFromPolyPolygon(const PolyPolygon &rPolyPoly); + /// Undo all scaling / move tricks of the wrap polygon done during import. + Polygon CorrectWordWrapPolygonForExport(const PolyPolygon& rPolyPoly, const SwNoTxtNode* pNd); + /** Make setting a drawing object's layer in a Writer document easy Word has the simple concept of a drawing object either in the diff --git a/sw/source/filter/ww8/wrtw8esh.cxx b/sw/source/filter/ww8/wrtw8esh.cxx index 0808b15..18f0591 100644 --- a/sw/source/filter/ww8/wrtw8esh.cxx +++ b/sw/source/filter/ww8/wrtw8esh.cxx @@ -2106,32 +2106,7 @@ sal_Int32 SwEscherEx::WriteFlyFrameAttr(const SwFrmFmt& rFmt, MSO_SPT eShapeType const PolyPolygon *pPolyPoly = pNd->HasContour(); if (pPolyPoly && pPolyPoly->Count()) { - Polygon aPoly(PolygonFromPolyPolygon(*pPolyPoly)); - const Size &rOrigSize = pNd->GetGraphic().GetPrefSize(); - Fraction aMapPolyX(ww::nWrap100Percent, rOrigSize.Width()); - Fraction aMapPolyY(ww::nWrap100Percent, rOrigSize.Height()); - aPoly.Scale(aMapPolyX, aMapPolyY); - - /* - a) stretch right bound by 15twips - b) shrink bottom bound to where it would have been in word - c) Move it to the left by 15twips - - See the import for details - */ - const Size &rSize = pNd->GetTwipSize(); - Fraction aMoveHack(ww::nWrap100Percent, rSize.Width()); - aMoveHack *= Fraction(15, 1); - long nMove(aMoveHack); - - Fraction aHackX(ww::nWrap100Percent + nMove, - ww::nWrap100Percent); - Fraction aHackY(ww::nWrap100Percent - nMove, - ww::nWrap100Percent); - aPoly.Scale(aHackX, aHackY); - - aPoly.Move(-nMove, 0); - + Polygon aPoly = CorrectWordWrapPolygonForExport(*pPolyPoly, pNd); SvMemoryStream aPolyDump; aPolyDump.SetNumberFormatInt(NUMBERFORMAT_INT_LITTLEENDIAN); commit bea342be301063d761f95177d8b65c88a52d1a1e Author: Miklos Vajna <[email protected]> Date: Tue Aug 12 09:26:04 2014 +0200 Remove unused default element Change-Id: I703f54ef8640f9be70f16441c330e53fce3f7489 diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index f2b8aeb..4763305 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -18228,7 +18228,6 @@ <resource name="ST_Merge" resource="List"> <value tokenid="ooxml:Value_ST_Merge_continue">continue</value> <value tokenid="ooxml:Value_ST_Merge_restart">restart</value> - <default tokenid="ooxml:Value_ST_Merge_continue"/> </resource> <resource name="CT_VMerge" resource="Value"> <attribute name="val" tokenid="ooxml:CT_VMerge_val" action="setValue"/> _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
