From ca7004569b39721c3e7247551a43d544fd3204fe Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Mon, 2 Dec 2019 21:01:19 +0100 Subject: [PATCH] tdf#128429 VML import: let mso-layout-flow-alt:bottom-to-top imply vertical Normally layout flow is set to vertical to denote TBRL, and then optionally there is a layout flow alt to denote BTLR, but the bugdoc shows that the first may be missing. So map to BTLR even in case only the alt layout flow is found in the file. Change-Id: I06fce738fca9aedc0de90ccebda3a24e99425326 Reviewed-on: https://gerrit.libreoffice.org/84275 Tested-by: Jenkins Reviewed-by: Miklos Vajna --- oox/CppunitTest_oox_vml.mk | 45 ++++++++++ oox/Module_oox.mk | 1 + oox/qa/unit/data/layout-flow-alt-alone.docx | Bin 0 -> 7669 bytes oox/qa/unit/vml.cxx | 89 ++++++++++++++++++++ oox/source/vml/vmlshape.cxx | 16 ++-- 5 files changed, 145 insertions(+), 6 deletions(-) create mode 100644 oox/CppunitTest_oox_vml.mk create mode 100644 oox/qa/unit/data/layout-flow-alt-alone.docx create mode 100644 oox/qa/unit/vml.cxx diff --git a/oox/CppunitTest_oox_vml.mk b/oox/CppunitTest_oox_vml.mk new file mode 100644 index 000000000000..aa12fa423d65 --- /dev/null +++ b/oox/CppunitTest_oox_vml.mk @@ -0,0 +1,45 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,oox_vml)) + +$(eval $(call gb_CppunitTest_use_externals,oox_vml,\ + boost_headers \ +)) + +$(eval $(call gb_CppunitTest_add_exception_objects,oox_vml, \ + oox/qa/unit/vml \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,oox_vml, \ + comphelper \ + cppu \ + oox \ + sal \ + test \ + unotest \ + utl \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,oox_vml)) + +$(eval $(call gb_CppunitTest_use_ure,oox_vml)) +$(eval $(call gb_CppunitTest_use_vcl,oox_vml)) + +$(eval $(call gb_CppunitTest_use_rdb,oox_vml,services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,oox_vml,\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,oox_vml)) + +# vim: set noet sw=4 ts=4: diff --git a/oox/Module_oox.mk b/oox/Module_oox.mk index 6078a7e24c0c..a40c46aaebbc 100644 --- a/oox/Module_oox.mk +++ b/oox/Module_oox.mk @@ -27,6 +27,7 @@ $(eval $(call gb_Module_add_check_targets,oox,\ CppunitTest_oox_crypto \ CppunitTest_oox_mathml \ CppunitTest_oox_drawingml \ + CppunitTest_oox_vml \ )) # vim: set noet sw=4 ts=4: diff --git a/oox/qa/unit/data/layout-flow-alt-alone.docx b/oox/qa/unit/data/layout-flow-alt-alone.docx new file mode 100644 index 0000000000000000000000000000000000000000..59c2db23d588ba6a4c36b8f357803a7c8dbbd242 GIT binary patch literal 7669 zcmeHM1y@{MvTdB;4#9)FLkRA{JrLYo8h3Yh3mQU#1b1j8!QI_0Sa5>t>tyDelq zIBqli@LoPMGE%tXvxTrd%NU5o(rtmCnM8kr8Kf={H!1y2o9^>+&<6tyso1bC+5I98 zR{O$?7p4lzJ$!~_)dlhPOLdoNzHIMvSf{2fd$pP%Yi}j*UUGThR8a&`nd;_imsfK$ zVavN4kLl;R7ujE1awH?U>6qVp=5iwqAFFV@9uY2cKhfZRTUVb<^GQp>_0fU@=rz#X zV?Cz39y#=(V~*e~NAYhANFN}xL1i%esvamIC{K=Pij0{FQ3zFz%CfNr6$BNa77bZP0G;r{x{=*b5R9uX9 z9*_hn3E3R;B-yNK=+#KFC@GN$NXk9;LNDRAFSu6%(9b7tzXqY`(%6}s-WK7gGA5-} z2`MX}9DXjUQv>lzFeA!KQZ_ln=td5{0CZnN{9Ygb=aBU6if5R!6ZrjUUx4;NF#bfxK6v$Qp?7jw)7(F!UIKI5xVTxZ$6i zUc1vYL{#<#lNOCa4tWJKS=6H97=l7tj-5*>1w5{8$HZAjsyxw0g=Ec@K`#W}SdA1- z-&9xyq)H}v)S8x<3G=pQf{bhqzvk!5*u>A`XkDx`MnNbGlkOX#=p$sCXd}7n*Y3uY z8^DtUNxUwKIf8@7rweSMkeGeBV`WAUl&{))9MUX^nN? zTYCzegL%aT=Nh!%`~sa!9N2!c8?7{C31+wTh&JG`Xo9GlMb49!AGeO*&pxSJUrWLz z@%&)>u4X|$N}FQvlDe;{qo7(mmJsw ze!@1+W}Ph3J4v-8xg`oDT41;vWg0P=ubh}TStqeEuCHW=tRpRqP#MOBHELEu=|Z6lZen2k?-U*VqR82k)}*Jc4vwX69M5{7*S4zlJ~PLKASymG z==y=e-Sz6M?7M$L7wMeKLML zybHVI@3n`WYtJ&8vV>qn9C;3K}gx>Q9M+pjMI`-x@^}+0!{#s4qUhIlB}1 zv`mDPV25*4nwWoNfOC>oVY0I_ED@c3Bo+KNipGrl?B&~=Z8H-28Sf%4EE&}Ocl+g{ zf=YCIaQ;yknPl$m?1QUw0g+g=vk@j0TV%t~u@y;nUebXs)pN+oVrjmxaNT@20l4Pk z$&*_4o2u(H!%hNx1lVV*sBhBqL0J!XmC{(R8b5&18-4Srrwl z9_lNVfC+6Tbqy-OrT(X@O)43d#A)qtY^Era5Hffq;`hPrWM?k~ko9ByVf^BNG-Dif zg3bq9w-Et=wze)>^oFiW%ix_FK4#Y%A=Rzy0E_~b0eEW;QVMbr5#KPHcZeVO#n{fy zBjQz|q!f1)qkc2Bv@oF9E; z&AggMsO~

`a8iNIRR_nxMGt&Q}U;9ZG3``K9K1#*wdW+N+ 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 +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +char const DATA_DIRECTORY[] = "/oox/qa/unit/data/"; + +/// oox vml tests. +class OoxVmlTest : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference mxComponentContext; + uno::Reference mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference& getComponent() { return mxComponent; } + void load(const OUString& rURL); +}; + +void OoxVmlTest::setUp() +{ + test::BootstrapFixture::setUp(); + + mxComponentContext.set(comphelper::getComponentContext(getMultiServiceFactory())); + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void OoxVmlTest::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +void OoxVmlTest::load(const OUString& rFileName) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + rFileName; + mxComponent = loadFromDesktop(aURL); +} + +CPPUNIT_TEST_FIXTURE(OoxVmlTest, testLayoutFlowAltAlone) +{ + // mso-layout-flow-alt:bottom-to-top without a matching layout-flow:vertical. + load("layout-flow-alt-alone.docx"); + + uno::Reference xDrawPagesSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + uno::Reference xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + sal_Int16 nWritingMode = 0; + xShape->getPropertyValue("WritingMode") >>= nWritingMode; + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 5 [ BTLR ] + // - Actual : 4 [ PAGE ] + // i.e. in case layout-flow:vertical was missing, the text was not vertical. + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, nWritingMode); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx index 604c2e867250..b928638954c4 100644 --- a/oox/source/vml/vmlshape.cxx +++ b/oox/source/vml/vmlshape.cxx @@ -728,13 +728,17 @@ Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes PropertySet( xShape ).setAnyProperty( PROP_BottomBorderDistance, makeAny( sal_Int32( getTextBox()->borderDistanceBottom ))); } - if (getTextBox()->maLayoutFlow == "vertical") + sal_Int16 nWritingMode = text::WritingMode2::LR_TB; + if (getTextBox()->maLayoutFlow == "vertical" && maTypeModel.maLayoutFlowAlt.isEmpty()) + { + nWritingMode = text::WritingMode2::TB_RL; + } + else if (maTypeModel.maLayoutFlowAlt == "bottom-to-top") + { + nWritingMode = text::WritingMode2::BT_LR; + } + if (nWritingMode != text::WritingMode2::LR_TB) { - sal_Int16 nWritingMode = text::WritingMode2::TB_RL; - if (maTypeModel.maLayoutFlowAlt == "bottom-to-top") - { - nWritingMode = text::WritingMode2::BT_LR; - } PropertySet(xShape).setAnyProperty(PROP_WritingMode, uno::makeAny(nWritingMode)); } }