From 940b21a87cffffca0985c33e9ebb78ddf3aa0c3b Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Wed, 13 Apr 2016 20:07:52 +1000 Subject: [PATCH] tdf#93124: Fix incorrect text fit in imported PPT - take two This patch just fixes incorrect decision when the block alignment must be applied. Also, unit test is included. Change-Id: I458184778c5e9e115d1a4eac749ecb6991b227a8 Reviewed-on: https://gerrit.libreoffice.org/24648 Tested-by: Jenkins Reviewed-by: Miklos Vajna --- filter/source/msfilter/svdfppt.cxx | 54 ++++++++++++++--------------- sd/CppunitTest_sd_import_tests.mk | 1 + sd/qa/unit/data/ppt/tdf93124.ppt | Bin 0 -> 85504 bytes sd/qa/unit/import-tests.cxx | 51 +++++++++++++++++++++++++++ 4 files changed, 78 insertions(+), 28 deletions(-) create mode 100644 sd/qa/unit/data/ppt/tdf93124.ppt diff --git a/filter/source/msfilter/svdfppt.cxx b/filter/source/msfilter/svdfppt.cxx index 437207f12503..7ac251cbfe02 100644 --- a/filter/source/msfilter/svdfppt.cxx +++ b/filter/source/msfilter/svdfppt.cxx @@ -893,7 +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 : @@ -903,20 +902,20 @@ SdrObject* SdrEscherImport::ProcessObj( SvStream& rSt, DffObjData& rObjData, voi 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; + const sal_uInt32 nMask = PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_CENTER | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_BLOCK; + switch (nTextFlags & nMask) + { + case PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT: + case PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_CENTER: + case PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT: + case PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_BLOCK: + eTVA = SDRTEXTVERTADJUST_CENTER; // If the textobject has only one type of alignment, then the text has not to be displayed using the full width; + break; + } + break; } - 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; + default: + break; } nMinFrameWidth = rTextRect.GetWidth() - ( nTextLeft + nTextRight ); } @@ -949,7 +948,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 : @@ -959,20 +957,20 @@ SdrObject* SdrEscherImport::ProcessObj( SvStream& rSt, DffObjData& rObjData, voi 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; + const sal_uInt32 nMask = PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_CENTER | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_BLOCK; + switch (nTextFlags & nMask) + { + case PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT: + case PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_CENTER: + case PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT: + case PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_BLOCK: + eTHA = SDRTEXTHORZADJUST_CENTER; // If the textobject has only one type of alignment, then the text has not to be displayed using the full width; + break; + } + break; } - 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; + default: + break; } nMinFrameHeight = rTextRect.GetHeight() - ( nTextTop + nTextBottom ); } 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 new file mode 100644 index 0000000000000000000000000000000000000000..fad847898cc669ed5d4a7cd6d9628d3b418a7b65 GIT binary patch literal 85504 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 #include +#include #include #include #include @@ -64,6 +65,9 @@ #include #include +#include +#include +#include using namespace ::com::sun::star; @@ -112,6 +116,7 @@ public: void testTdf93830(); void testTdf93097(); void testTdf62255(); + void testTdf93124(); void testTdf89927(); void testTdf93868(); void testTdf95932(); @@ -160,6 +165,7 @@ public: CPPUNIT_TEST(testTdf93830); CPPUNIT_TEST(testTdf93097); CPPUNIT_TEST(testTdf62255); + CPPUNIT_TEST(testTdf93124); CPPUNIT_TEST(testTdf89927); CPPUNIT_TEST(testTdf93868); CPPUNIT_TEST(testTdf95932); @@ -1259,6 +1265,51 @@ void SdImportTest::testTdf62255() 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(); +} + void SdImportTest::testTdf89927() { sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/pptx/tdf89927.pptx"), PPTX);