[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-5.3' - editeng/qa editeng/source

Szymon Kłos szymon.klos at collabora.com
Tue Mar 13 13:08:54 UTC 2018


 editeng/qa/unit/core-test.cxx       |   94 ++++++++++++++++++++++++++++++++++++
 editeng/source/editeng/impedit3.cxx |   13 ++--
 2 files changed, 100 insertions(+), 7 deletions(-)

New commits:
commit 3b05be050d4cadfa37e7e4db052ba2e070d0bbc1
Author: Szymon Kłos <szymon.klos at collabora.com>
Date:   Fri Mar 9 14:48:49 2018 +0100

    tdf#116101 Correct bullet position for linespacing > 100%
    
    Change-Id: Ia900636d4013ab2a9c893c8246391db867fe1543
    Reviewed-on: https://gerrit.libreoffice.org/51017
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Szymon Kłos <szymon.klos at collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/51167
    Reviewed-by: Andras Timar <andras.timar at collabora.com>
    Tested-by: Andras Timar <andras.timar at collabora.com>

diff --git a/editeng/qa/unit/core-test.cxx b/editeng/qa/unit/core-test.cxx
index 892293f43117..01d51eb271d3 100644
--- a/editeng/qa/unit/core-test.cxx
+++ b/editeng/qa/unit/core-test.cxx
@@ -19,6 +19,9 @@
 #include "editeng/eeitem.hxx"
 #include "editeng/editids.hrc"
 #include "editeng/editdoc.hxx"
+#include "editeng/fontitem.hxx"
+#include "editeng/fhgtitem.hxx"
+#include "editeng/lspcitem.hxx"
 #include "editeng/svxacorr.hxx"
 #include "editeng/unofield.hxx"
 #include "editeng/wghtitem.hxx"
@@ -45,6 +48,9 @@ public:
     virtual void setUp() override;
     virtual void tearDown() override;
 
+    /// Test text portions position when percentage line spacing is set
+    void testLineSpacing();
+
     void testConstruction();
 
     /// Test UNO service class that implements text field items.
@@ -63,6 +69,7 @@ public:
 
     CPPUNIT_TEST_SUITE(Test);
     CPPUNIT_TEST(testConstruction);
+    CPPUNIT_TEST(testLineSpacing);
     CPPUNIT_TEST(testUnoTextFields);
     CPPUNIT_TEST(testAutocorrect);
     CPPUNIT_TEST(testHyperlinkSearch);
@@ -110,6 +117,93 @@ bool includes(const uno::Sequence<OUString>& rSeq, const OUString& rVal)
 
 }
 
+void Test::testLineSpacing()
+{
+    // Create EditEngine's instance
+    EditEngine aEditEngine(mpItemPool);
+
+    if(aEditEngine.GetRefDevice()->GetDPIY() != 96
+        || !basegfx::fTools::equal(aEditEngine.GetRefDevice()->GetDPIScaleFactor(), 1.0))
+        return;
+
+    // Get EditDoc for current EditEngine's instance
+    EditDoc &rDoc = aEditEngine.GetEditDoc();
+
+    // Initially no text should be there
+    CPPUNIT_ASSERT_EQUAL(sal_uLong(0), rDoc.GetTextLen());
+    CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetParaAsString(sal_Int32(0)));
+
+    // Set initial text
+    OUString aText = "This is multi-line paragraph";
+
+    sal_Int32 aTextLen = aText.getLength();
+    aEditEngine.SetText(aText);
+
+    // Assert changes - text insertion
+    CPPUNIT_ASSERT_EQUAL(sal_uLong(aTextLen), rDoc.GetTextLen());
+    CPPUNIT_ASSERT_EQUAL(aText, rDoc.GetParaAsString(sal_Int32(0)));
+
+    // Get ItemSet for line spacing - 60%
+    std::unique_ptr<SfxItemSet> pSet(new SfxItemSet(aEditEngine.GetEmptyItemSet()));
+    SvxLineSpacingItem aLineSpacing(LINE_SPACE_DEFAULT_HEIGHT, EE_PARA_SBL);
+    aLineSpacing.SetPropLineSpace(60);
+    pSet->Put(aLineSpacing);
+
+    // Set font
+    SvxFontItem aFont(EE_CHAR_FONTINFO);
+    aFont.SetFamilyName("Liberation Sans");
+    pSet->Put(aFont);
+    SvxFontHeightItem aFontSize(240, 100, EE_CHAR_FONTHEIGHT);
+    pSet->Put(aFontSize);
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(3), pSet->Count());
+
+    // Select all paragraphs and set spacing
+    ESelection aSelection(0, 0, 0, aTextLen);
+    aEditEngine.QuickSetAttribs(*pSet, aSelection);
+
+    // Force multiple lines
+    aEditEngine.SetPaperSize(Size(1000, 6000));
+    CPPUNIT_ASSERT_EQUAL((sal_Int32)4, aEditEngine.GetLineCount(0));
+
+    // Assert changes
+    ParaPortion* pParaPortion = aEditEngine.GetParaPortions()[0];
+    ContentNode* const pNode = pParaPortion->GetNode();
+    const SfxPoolItem& rLSItem = pNode->GetContentAttribs().GetItem(EE_PARA_SBL);
+    const SvxLineSpacingItem* pLSItem = static_cast<const SvxLineSpacingItem*>(&rLSItem);
+    CPPUNIT_ASSERT(SvxInterLineSpaceRule::Prop == pLSItem->GetInterLineSpaceRule());
+    CPPUNIT_ASSERT_EQUAL((sal_uInt16)60, pLSItem->GetPropLineSpace());
+
+    // Check the first line
+    ParagraphInfos aInfo = aEditEngine.GetParagraphInfos(0);
+    CPPUNIT_ASSERT_EQUAL((sal_uInt16)122, aInfo.nFirstLineMaxAscent);
+    CPPUNIT_ASSERT_EQUAL((sal_uInt16)153, (sal_uInt16)aEditEngine.GetLineHeight(0));
+
+    // Prepare second case - 150%
+    std::unique_ptr<SfxItemSet> pSet2(new SfxItemSet(aEditEngine.GetEmptyItemSet()));
+    SvxLineSpacingItem aLineSpacing2(LINE_SPACE_DEFAULT_HEIGHT, EE_PARA_SBL);
+    aLineSpacing2.SetPropLineSpace(150);
+    pSet2->Put(aLineSpacing2);
+    pSet2->Put(aFont);
+    pSet2->Put(aFontSize);
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(3), pSet2->Count());
+
+    // Select all paragraphs and set spacing
+    aEditEngine.QuickSetAttribs(*pSet2, aSelection);
+
+    // Assert changes
+    const SfxPoolItem& rLSItem2 = pNode->GetContentAttribs().GetItem(EE_PARA_SBL);
+    const SvxLineSpacingItem* pLSItem2 = static_cast<const SvxLineSpacingItem*>(&rLSItem2);
+    CPPUNIT_ASSERT(SvxInterLineSpaceRule::Prop == pLSItem2->GetInterLineSpaceRule());
+    CPPUNIT_ASSERT_EQUAL((sal_uInt16)150, pLSItem2->GetPropLineSpace());
+
+    // Check the first line
+    ParagraphInfos aInfo2 = aEditEngine.GetParagraphInfos(0);
+    CPPUNIT_ASSERT_EQUAL(sal_uInt16(311), aInfo2.nFirstLineMaxAscent);
+    CPPUNIT_ASSERT_EQUAL(sal_uInt16(382), static_cast<sal_uInt16>(aEditEngine.GetLineHeight(0)));
+}
+
 void Test::testUnoTextFields()
 {
     {
diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx
index e021aac81082..01050ab5d3c8 100644
--- a/editeng/source/editeng/impedit3.cxx
+++ b/editeng/source/editeng/impedit3.cxx
@@ -1416,15 +1416,14 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY )
                 else if ( rLSItem.GetPropLineSpace() && ( rLSItem.GetPropLineSpace() != 100 ) )
                 {
                     sal_uInt16 nTxtHeight = pLine->GetHeight();
-                    sal_Int32 nH = nTxtHeight;
-                    nH *= rLSItem.GetPropLineSpace();
-                    nH /= 100;
+                    sal_Int32 nTxtHeightProp = nTxtHeight * rLSItem.GetPropLineSpace() / 100;
+                    sal_Int32 nHeightProp = pLine->GetHeight() * rLSItem.GetPropLineSpace() / 100;
                     // The Ascent has to be adjusted for the difference:
-                    long nDiff = pLine->GetHeight() - nH;
+                    long nDiff = ( pLine->GetHeight() - nTxtHeightProp ) * 4 / 5;
                     if ( nDiff > pLine->GetMaxAscent() )
-                        nDiff = pLine->GetMaxAscent();
-                    pLine->SetMaxAscent( (sal_uInt16)( pLine->GetMaxAscent() - nDiff ) * 4 / 5 ); // 80%
-                    pLine->SetHeight( (sal_uInt16)nH, nTxtHeight );
+                        nDiff = pLine->GetMaxAscent() * 4 / 5;
+                    pLine->SetMaxAscent( static_cast<sal_uInt16>( pLine->GetMaxAscent() - nDiff ) ); // 80%
+                    pLine->SetHeight( static_cast<sal_uInt16>( nHeightProp ), nTxtHeightProp );
                 }
             }
         }


More information about the Libreoffice-commits mailing list