diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2015-09-27 22:46:11 +1000 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2016-03-19 11:51:06 +0000 |
commit | 5ca1f04976930c6fd656ebf89d667c80e2466897 (patch) | |
tree | af2c86dda10482a3e3bcc679090c09f38dbbf395 | |
parent | 0eea1465a06119903fca5f5b6dfe5b05a80546ba (diff) |
tdf#93124: Fix incorrect text fit in imported PPT
To make text adjustment to full width, the alignment optimizations
had to be removed, and bAutoFit was removed, too.
Allso, to fix tdf#41245 again, the SDRTEXTFIT_AUTOFIT that is set in
SdStyleSheetPool::CreateLayoutStyleSheets had to be overridden.
I touch the following commits:
http://cgit.freedesktop.org/libreoffice/core/commit/?id=d2000efb31f864e912c6cf52760eea0e602b6893
http://cgit.freedesktop.org/libreoffice/core/commit/?id=3550256daa5451c1d51d220d5489c1b20150c374
http://cgit.freedesktop.org/libreoffice/core/commit/?id=812aff65ad0661fed9687a429c763dc8f2144a0c
Change-Id: I7f7934e2982baf0240c740e09fcb9bd348079064
Reviewed-on: https://gerrit.libreoffice.org/18895
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Tested-by: Michael Meeks <michael.meeks@collabora.com>
-rw-r--r-- | filter/source/msfilter/svdfppt.cxx | 126 | ||||
-rw-r--r-- | sd/CppunitTest_sd_import_tests.mk | 1 | ||||
-rw-r--r-- | sd/qa/unit/data/ppt/tdf93124.ppt | bin | 0 -> 85504 bytes | |||
-rw-r--r-- | sd/qa/unit/import-tests.cxx | 51 |
4 files changed, 88 insertions, 90 deletions
diff --git a/filter/source/msfilter/svdfppt.cxx b/filter/source/msfilter/svdfppt.cxx index ebea1c297280..7765dac96aeb 100644 --- a/filter/source/msfilter/svdfppt.cxx +++ b/filter/source/msfilter/svdfppt.cxx @@ -893,31 +893,6 @@ SdrObject* SdrEscherImport::ProcessObj( SvStream& rSt, DffObjData& rObjData, voi eTHA = SDRTEXTHORZADJUST_LEFT; break; } - // if there is a 100% use of following attributes, the textbox can been aligned also in vertical direction - switch ( eTextAnchor ) - { - case mso_anchorTopCentered : - case mso_anchorMiddleCentered : - case mso_anchorBottomCentered : - case mso_anchorTopCenteredBaseline: - case mso_anchorBottomCenteredBaseline: - { - // check if it is sensible to use the centered alignment - sal_uInt32 nMask = PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT; - if ( ( nTextFlags & nMask ) != nMask ) // if the textobject has left and also right aligned pararagraphs - eTVA = SDRTEXTVERTADJUST_CENTER; // the text has to be displayed using the full width; - } - break; - - default : - { - if ( nTextFlags == PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT ) - eTVA = SDRTEXTVERTADJUST_TOP; - else if ( nTextFlags == PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT ) - eTVA = SDRTEXTVERTADJUST_BOTTOM; - } - break; - } nMinFrameWidth = rTextRect.GetWidth() - ( nTextLeft + nTextRight ); } else @@ -949,31 +924,6 @@ SdrObject* SdrEscherImport::ProcessObj( SvStream& rSt, DffObjData& rObjData, voi eTVA = SDRTEXTVERTADJUST_BOTTOM; break; } - // if there is a 100% usage of following attributes, the textbox can be aligned also in horizontal direction - switch ( eTextAnchor ) - { - case mso_anchorTopCentered : - case mso_anchorMiddleCentered : - case mso_anchorBottomCentered : - case mso_anchorTopCenteredBaseline: - case mso_anchorBottomCenteredBaseline: - { - // check if it is sensible to use the centered alignment - sal_uInt32 nMask = PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT; - if ( ( nTextFlags & nMask ) != nMask ) // if the textobject has left and also right aligned pararagraphs - eTHA = SDRTEXTHORZADJUST_CENTER; // the text has to be displayed using the full width; - } - break; - - default : - { - if ( nTextFlags == PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT ) - eTHA = SDRTEXTHORZADJUST_LEFT; - else if ( nTextFlags == PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT ) - eTHA = SDRTEXTHORZADJUST_RIGHT; - } - break; - } nMinFrameHeight = rTextRect.GetHeight() - ( nTextTop + nTextBottom ); } @@ -1021,7 +971,6 @@ SdrObject* SdrEscherImport::ProcessObj( SvStream& rSt, DffObjData& rObjData, voi } aTextObj.SetDestinationInstance( (sal_uInt16)nDestinationInstance ); - bool bAutoFit = false; // auto-scale text into shape box switch ( aTextObj.GetInstance() ) { case TSS_TYPE_PAGETITLE : @@ -1029,7 +978,7 @@ SdrObject* SdrEscherImport::ProcessObj( SvStream& rSt, DffObjData& rObjData, voi case TSS_TYPE_SUBTITLE : eTextKind = OBJ_TEXT; break; case TSS_TYPE_BODY : case TSS_TYPE_HALFBODY : - case TSS_TYPE_QUARTERBODY : eTextKind = OBJ_OUTLINETEXT; bAutoFit = true; break; + case TSS_TYPE_QUARTERBODY : eTextKind = OBJ_OUTLINETEXT; break; } if ( aTextObj.GetDestinationInstance() != TSS_TYPE_TEXT_IN_SHAPE ) { @@ -1088,47 +1037,44 @@ SdrObject* SdrEscherImport::ProcessObj( SvStream& rSt, DffObjData& rObjData, voi } pTObj->SetMergedItem( SvxFrameDirectionItem( bVerticalText ? FRMDIR_VERT_TOP_RIGHT : FRMDIR_HORI_LEFT_TOP, EE_PARA_WRITINGDIR ) ); - //Autofit text only if there is no auto grow height and width - //See fdo#41245 - if (bAutoFit && !bAutoGrowHeight && !bAutoGrowWidth) + // SdStyleSheetPool::CreateLayoutStyleSheets in stlpool.cxx applies SDRTEXTFIT_AUTOFIT by default, + // so need to override here + pTObj->SetMergedItem(SdrTextFitToSizeTypeItem(SDRTEXTFIT_NONE)); + + if ( dynamic_cast<const SdrObjCustomShape* >(pTObj) == nullptr ) { - pTObj->SetMergedItem( SdrTextFitToSizeTypeItem(SDRTEXTFIT_AUTOFIT) ); + pTObj->SetMergedItem( makeSdrTextAutoGrowWidthItem( bAutoGrowWidth ) ); + pTObj->SetMergedItem( makeSdrTextAutoGrowHeightItem( bAutoGrowHeight ) ); + } + else + { + pTObj->SetMergedItem( makeSdrTextWordWrapItem( bWordWrap ) ); + pTObj->SetMergedItem( makeSdrTextAutoGrowHeightItem( bFitShapeToText ) ); } - if ( dynamic_cast<const SdrObjCustomShape* >(pTObj) == nullptr ) - { - pTObj->SetMergedItem( makeSdrTextAutoGrowWidthItem( bAutoGrowWidth ) ); - pTObj->SetMergedItem( makeSdrTextAutoGrowHeightItem( bAutoGrowHeight ) ); - } - else - { - pTObj->SetMergedItem( makeSdrTextWordWrapItem( bWordWrap ) ); - pTObj->SetMergedItem( makeSdrTextAutoGrowHeightItem( bFitShapeToText ) ); - } - - pTObj->SetMergedItem( SdrTextVertAdjustItem( eTVA ) ); - pTObj->SetMergedItem( SdrTextHorzAdjustItem( eTHA ) ); + pTObj->SetMergedItem( SdrTextVertAdjustItem( eTVA ) ); + pTObj->SetMergedItem( SdrTextHorzAdjustItem( eTHA ) ); - if ( nMinFrameHeight < 0 ) - nMinFrameHeight = 0; - if ( dynamic_cast<const SdrObjCustomShape* >(pTObj) == nullptr ) - pTObj->SetMergedItem( makeSdrTextMinFrameHeightItem( nMinFrameHeight ) ); + if ( nMinFrameHeight < 0 ) + nMinFrameHeight = 0; + if ( dynamic_cast<const SdrObjCustomShape* >(pTObj) == nullptr ) + pTObj->SetMergedItem( makeSdrTextMinFrameHeightItem( nMinFrameHeight ) ); - if ( nMinFrameWidth < 0 ) - nMinFrameWidth = 0; - if ( dynamic_cast<const SdrObjCustomShape* >(pTObj) == nullptr ) - pTObj->SetMergedItem( makeSdrTextMinFrameWidthItem( nMinFrameWidth ) ); + if ( nMinFrameWidth < 0 ) + nMinFrameWidth = 0; + if ( dynamic_cast<const SdrObjCustomShape* >(pTObj) == nullptr ) + pTObj->SetMergedItem( makeSdrTextMinFrameWidthItem( nMinFrameWidth ) ); - // set margins at the borders of the textbox - pTObj->SetMergedItem( makeSdrTextLeftDistItem( nTextLeft ) ); - pTObj->SetMergedItem( makeSdrTextRightDistItem( nTextRight ) ); - pTObj->SetMergedItem( makeSdrTextUpperDistItem( nTextTop ) ); - pTObj->SetMergedItem( makeSdrTextLowerDistItem( nTextBottom ) ); - pTObj->SetMergedItem( SdrTextFixedCellHeightItem( true ) ); + // set margins at the borders of the textbox + pTObj->SetMergedItem( makeSdrTextLeftDistItem( nTextLeft ) ); + pTObj->SetMergedItem( makeSdrTextRightDistItem( nTextRight ) ); + pTObj->SetMergedItem( makeSdrTextUpperDistItem( nTextTop ) ); + pTObj->SetMergedItem( makeSdrTextLowerDistItem( nTextBottom ) ); + pTObj->SetMergedItem( SdrTextFixedCellHeightItem( true ) ); - if ( dynamic_cast<const SdrObjCustomShape* >(pTObj) == nullptr ) - pTObj->SetSnapRect( rTextRect ); - pTObj = ReadObjText( &aTextObj, pTObj, rData.pPage ); + if ( dynamic_cast<const SdrObjCustomShape* >(pTObj) == nullptr ) + pTObj->SetSnapRect( rTextRect ); + pTObj = ReadObjText( &aTextObj, pTObj, rData.pPage ); if ( pTObj ) { @@ -1393,7 +1339,7 @@ SdrPowerPointImport::SdrPowerPointImport( PowerPointImportParam& rParam, const O if ( pPersistPtr[ nOfs ] > nStreamLen ) { bOk = false; - OSL_FAIL("SdrPowerPointImport::Ctor(): Ungueltiger Eintrag im Persist-Directory!"); + OSL_FAIL("SdrPowerPointImport::Ctor(): Invalid entry in Persist-Directory!"); } } nAnz--; @@ -1401,7 +1347,7 @@ SdrPowerPointImport::SdrPowerPointImport( PowerPointImportParam& rParam, const O } if ( bOk && nAnz > 0 ) { - OSL_FAIL("SdrPowerPointImport::Ctor(): Nicht alle Persist-Directory Entraege gelesen!"); + OSL_FAIL("SdrPowerPointImport::Ctor(): Not all Persist-Directory entries read!"); bOk = false; } } @@ -1423,7 +1369,7 @@ SdrPowerPointImport::SdrPowerPointImport( PowerPointImportParam& rParam, const O nDocStreamPos = aUserEditAtom.nDocumentRef; if ( nDocStreamPos > nPersistPtrAnz ) { - OSL_FAIL("SdrPowerPointImport::Ctor(): aUserEditAtom.nDocumentRef ungueltig!"); + OSL_FAIL("SdrPowerPointImport::Ctor(): aUserEditAtom.nDocumentRef is invalid!"); bOk = false; } } @@ -1615,7 +1561,7 @@ SdrPowerPointImport::SdrPowerPointImport( PowerPointImportParam& rParam, const O } else { - OSL_FAIL("SdrPowerPointImport::Ctor(): Persist-Eintrag fehlerhaft! (SJ)"); + OSL_FAIL("SdrPowerPointImport::Ctor(): Persist-Entry is faulty! (SJ)"); } } } diff --git a/sd/CppunitTest_sd_import_tests.mk b/sd/CppunitTest_sd_import_tests.mk index 6058e8e58cfc..33a7ad28d463 100644 --- a/sd/CppunitTest_sd_import_tests.mk +++ b/sd/CppunitTest_sd_import_tests.mk @@ -96,6 +96,7 @@ $(eval $(call gb_CppunitTest_use_components,sd_import_tests,\ sot/util/sot \ svl/source/fsstor/fsstorage \ svtools/util/svt \ + svx/util/svxcore \ toolkit/util/tk \ ucb/source/core/ucb1 \ ucb/source/ucp/expand/ucpexpand1 \ diff --git a/sd/qa/unit/data/ppt/tdf93124.ppt b/sd/qa/unit/data/ppt/tdf93124.ppt Binary files differnew file mode 100644 index 000000000000..fad847898cc6 --- /dev/null +++ b/sd/qa/unit/data/ppt/tdf93124.ppt diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index b1023968ebe6..29bcc05024be 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -41,9 +41,11 @@ #include <animations/animationnodehelper.hxx> #include <sax/tools/converter.hxx> +#include <comphelper/processfactory.hxx> #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp> #include <com/sun/star/drawing/XDrawPage.hpp> #include <com/sun/star/drawing/XDrawPagesSupplier.hpp> +#include <com/sun/star/drawing/GraphicExportFilter.hpp> #include <com/sun/star/animations/XAnimationNodeSupplier.hpp> #include <com/sun/star/animations/XAnimationNode.hpp> #include <com/sun/star/animations/XAnimate.hpp> @@ -62,6 +64,8 @@ #include <com/sun/star/table/XTableRows.hpp> #include <stlpool.hxx> +#include <vcl/pngread.hxx> +#include <vcl/bitmapaccess.hxx> using namespace ::com::sun::star; @@ -110,6 +114,7 @@ public: void testTdf93097(); void testTdf62255(); void testTdf89927(); + void testTdf93124(); CPPUNIT_TEST_SUITE(SdImportTest); @@ -154,6 +159,7 @@ public: CPPUNIT_TEST(testTdf93097); CPPUNIT_TEST(testTdf62255); CPPUNIT_TEST(testTdf89927); + CPPUNIT_TEST(testTdf93124); CPPUNIT_TEST_SUITE_END(); }; @@ -1219,6 +1225,51 @@ void SdImportTest::testTdf89927() xDocShRef->DoClose(); } +void SdImportTest::testTdf93124() +{ + sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/ppt/tdf93124.ppt"), PPT); + uno::Reference < uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext(); + uno::Reference< drawing::XGraphicExportFilter > xGraphicExporter = drawing::GraphicExportFilter::create(xContext); + + uno::Sequence< beans::PropertyValue > aFilterData(2); + aFilterData[0].Name = "PixelWidth"; + aFilterData[0].Value <<= (sal_Int32)(320); + aFilterData[1].Name = "PixelHeight"; + aFilterData[1].Value <<= (sal_Int32)(180); + + utl::TempFile aTempFile; + aTempFile.EnableKillingFile(); + + uno::Sequence< beans::PropertyValue > aDescriptor(3); + aDescriptor[0].Name = "URL"; + aDescriptor[0].Value <<= aTempFile.GetURL(); + aDescriptor[1].Name = "FilterName"; + aDescriptor[1].Value <<= OUString("PNG"); + aDescriptor[2].Name = "FilterData"; + aDescriptor[2].Value <<= aFilterData; + + uno::Reference< lang::XComponent > xPage(getPage(0, xDocShRef), uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xPage); + xGraphicExporter->filter(aDescriptor); + + SvFileStream aFileStream(aTempFile.GetURL(), StreamMode::READ); + vcl::PNGReader aPNGReader(aFileStream); + BitmapEx aBMPEx = aPNGReader.Read(); + Bitmap aBMP = aBMPEx.GetBitmap(); + BitmapReadAccess* pRead = aBMP.AcquireReadAccess(); + int nNonWhiteCount = 0; + // The word "Top" should be in rectangle 34,4 - 76,30. If text alignment is wrong, the rectangle will be white. + for (long nX = 34; nX < (34 + 43); ++nX) + for (long nY = 4; nY < (4 + 26); ++nY) + { + const Color aColor = pRead->GetColor(nY, nX); + if ((aColor.GetRed() != 0xff) || (aColor.GetGreen() != 0xff) || (aColor.GetBlue() != 0xff)) + ++nNonWhiteCount; + } + CPPUNIT_ASSERT_MESSAGE("Tdf93124: vertical alignment of text is incorrect!", nNonWhiteCount>100); + xDocShRef->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTest); CPPUNIT_PLUGIN_IMPLEMENT(); |