[Libreoffice-commits] core.git: filter/source sd/CppunitTest_sd_import_tests.mk sd/qa

Mike Kaganski mike.kaganski at collabora.com
Sat Mar 19 11:51:34 UTC 2016


 filter/source/msfilter/svdfppt.cxx |  126 ++++++++++---------------------------
 sd/CppunitTest_sd_import_tests.mk  |    1 
 sd/qa/unit/data/ppt/tdf93124.ppt   |binary
 sd/qa/unit/import-tests.cxx        |   51 ++++++++++++++
 4 files changed, 88 insertions(+), 90 deletions(-)

New commits:
commit 5ca1f04976930c6fd656ebf89d667c80e2466897
Author: Mike Kaganski <mike.kaganski at collabora.com>
Date:   Sun Sep 27 22:46:11 2015 +1000

    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 at libreoffice.org>
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
    Tested-by: Michael Meeks <michael.meeks at collabora.com>

diff --git a/filter/source/msfilter/svdfppt.cxx b/filter/source/msfilter/svdfppt.cxx
index ebea1c2..7765dac 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 6058e8e..33a7ad2 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 0000000..fad8478
Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf93124.ppt differ
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index b102396..29bcc05 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();


More information about the Libreoffice-commits mailing list