[Libreoffice-commits] core.git: sw/inc sw/qa sw/source

Justin Luth (via logerrit) logerrit at kemper.freedesktop.org
Tue Feb 23 05:14:47 UTC 2021


 sw/inc/ndtxt.hxx                                          |    2 
 sw/qa/extras/tiledrendering/data/tdf114799_highlight.docx |binary
 sw/qa/extras/tiledrendering/tiledrendering.cxx            |   29 +++++++++++++-
 sw/source/core/text/txtfld.cxx                            |   16 +++++--
 sw/source/core/txtnode/thints.cxx                         |   10 +++-
 5 files changed, 48 insertions(+), 9 deletions(-)

New commits:
commit 873df086db969cadc66087a5abdb1ff33f2c99f1
Author:     Justin Luth <justin.luth at collabora.com>
AuthorDate: Fri Feb 19 08:37:44 2021 +0200
Commit:     Justin Luth <justin_luth at sil.org>
CommitDate: Tue Feb 23 06:14:03 2021 +0100

    tdf#135774, tdf#114799 Char highlight: apply to numbering
    
    This is a partial revert of LO 7.0's
    commit 315d56582f8a56d8f2d3ea6cda63ea4832249608
    
    The character background is exported as either w:highlight
    or w:shd, based on a user setting. w:shd does not affect
    numbering in MS Word, only the 16 color w:highlight does.
    (tools - options - Load/Save - Microsoft Office -
     Character highlighting export as: Highlight or Shading)
    
    I replaced tdf114799.docx with a version that uses w:highlight
    instead of w:shd. The test was doing it backwards - MS Word
    was NOT highlighting the numbering in the original unit test.
    
    I added another test using the original unit test to ensure
    that the numbering was not affected by the paragraph's
    char shading.
    
    There are many other "Char highlight:" patches in 7.2
    that are not going to be backported.
    See http://wiki.documentfoundation.org/Documentation/CharHighlight
    for more details about this topic.
    
    Change-Id: I38b6f700895e29f634f07430f6c7a13722ffa4f4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111201
    Tested-by: Justin Luth <justin_luth at sil.org>
    Reviewed-by: Justin Luth <justin_luth at sil.org>

diff --git a/sw/inc/ndtxt.hxx b/sw/inc/ndtxt.hxx
index f83bab3cebba..cc071f28b70e 100644
--- a/sw/inc/ndtxt.hxx
+++ b/sw/inc/ndtxt.hxx
@@ -804,7 +804,7 @@ public:
     virtual drawinglayer::attribute::SdrAllFillAttributesHelperPtr getSdrAllFillAttributesHelper() const override;
 
     /// In MS Word, the font underline setting of the paragraph end position won't affect the formatting of numbering, so we ignore it
-    static bool IsIgnoredCharFormatForNumbering(const sal_uInt16 nWhich);
+    static bool IsIgnoredCharFormatForNumbering(const sal_uInt16 nWhich, bool bIsCharStyle = false);
     void FormatDropNotify(const SwFormatDrop& rDrop) override
             { TriggerNodeUpdate(sw::LegacyModifyHint(&rDrop, &rDrop)); };
 };
diff --git a/sw/qa/extras/tiledrendering/data/tdf114799_highlight.docx b/sw/qa/extras/tiledrendering/data/tdf114799_highlight.docx
new file mode 100644
index 000000000000..3a64d71d7cfd
Binary files /dev/null and b/sw/qa/extras/tiledrendering/data/tdf114799_highlight.docx differ
diff --git a/sw/qa/extras/tiledrendering/data/tdf114799.docx b/sw/qa/extras/tiledrendering/data/tdf114799_shd.docx
similarity index 100%
rename from sw/qa/extras/tiledrendering/data/tdf114799.docx
rename to sw/qa/extras/tiledrendering/data/tdf114799_shd.docx
diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx b/sw/qa/extras/tiledrendering/tiledrendering.cxx
index 41249cd9f3ac..54dd09b7d191 100644
--- a/sw/qa/extras/tiledrendering/tiledrendering.cxx
+++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx
@@ -135,6 +135,7 @@ public:
     void testDeselectCustomShape();
     void testSemiTransparent();
     void testHighlightNumbering();
+    void testHighlightNumbering_shd();
     void testPilcrowRedlining();
     void testClipText();
     void testAnchorTypes();
@@ -212,6 +213,7 @@ public:
     CPPUNIT_TEST(testDeselectCustomShape);
     CPPUNIT_TEST(testSemiTransparent);
     CPPUNIT_TEST(testHighlightNumbering);
+    CPPUNIT_TEST(testHighlightNumbering_shd);
     CPPUNIT_TEST(testPilcrowRedlining);
     CPPUNIT_TEST(testClipText);
     CPPUNIT_TEST(testAnchorTypes);
@@ -2441,7 +2443,7 @@ void SwTiledRenderingTest::testSemiTransparent()
 void SwTiledRenderingTest::testHighlightNumbering()
 {
     // Load a document where the top left tile contains a semi-transparent rectangle shape.
-    SwXTextDocument* pXTextDocument = createDoc("tdf114799.docx");
+    SwXTextDocument* pXTextDocument = createDoc("tdf114799_highlight.docx");
 
     // Render a larger area, and then get the color of the bottom right corner of our tile.
     size_t nCanvasWidth = 1024;
@@ -2463,6 +2465,31 @@ void SwTiledRenderingTest::testHighlightNumbering()
     CPPUNIT_ASSERT_EQUAL(COL_YELLOW, aColor);
 }
 
+void SwTiledRenderingTest::testHighlightNumbering_shd()
+{
+    // Load a document where the top left tile contains a semi-transparent rectangle shape.
+    SwXTextDocument* pXTextDocument = createDoc("tdf114799_shd.docx");
+
+    // Render a larger area, and then get the color of the bottom right corner of our tile.
+    size_t nCanvasWidth = 1024;
+    size_t nCanvasHeight = 512;
+    size_t nTileSize = 256;
+    std::vector<unsigned char> aPixmap(nCanvasWidth * nCanvasHeight * 4, 0);
+    ScopedVclPtrInstance<VirtualDevice> pDevice(DeviceFormat::DEFAULT);
+    pDevice->SetBackground(Wallpaper(COL_TRANSPARENT));
+    pDevice->SetOutputSizePixelScaleOffsetAndBuffer(Size(nCanvasWidth, nCanvasHeight),
+                                                    Fraction(1.0), Point(), aPixmap.data());
+    pXTextDocument->paintTile(*pDevice, nCanvasWidth, nCanvasHeight, /*nTilePosX=*/0,
+                              /*nTilePosY=*/0, /*nTileWidth=*/15360, /*nTileHeight=*/7680);
+    pDevice->EnableMapMode(false);
+    Bitmap aBitmap = pDevice->GetBitmap(Point(0, 0), Size(nTileSize, nTileSize));
+    Bitmap::ScopedReadAccess pAccess(aBitmap);
+
+    // No highlighting over numbering - w:shd does not apply to numbering.
+    Color aColor(pAccess->GetPixel(103, 148));
+    CPPUNIT_ASSERT_EQUAL(COL_WHITE, aColor);
+}
+
 void SwTiledRenderingTest::testPilcrowRedlining()
 {
     // Load a document where the top left tile contains
diff --git a/sw/source/core/text/txtfld.cxx b/sw/source/core/text/txtfld.cxx
index e4211667ba5b..0c303d54b37e 100644
--- a/sw/source/core/text/txtfld.cxx
+++ b/sw/source/core/text/txtfld.cxx
@@ -472,7 +472,7 @@ static void checkApplyParagraphMarkFormatToNumbering(SwFont* pNumFnt, SwTextForm
         sal_uInt16 nWhich = aIter.FirstWhich();
         while (nWhich)
         {
-            if (!SwTextNode::IsIgnoredCharFormatForNumbering(nWhich)
+            if (!SwTextNode::IsIgnoredCharFormatForNumbering(nWhich, /*bIsCharStyle=*/true)
                 && !pCleanedSet->HasItem(nWhich)
                 && !(pFormat && pFormat->HasItem(nWhich)) )
             {
@@ -492,12 +492,18 @@ static void checkApplyParagraphMarkFormatToNumbering(SwFont* pNumFnt, SwTextForm
     const SfxPoolItem* pItem = aIter.GetCurItem();
     while (pItem)
     {
-        if (pItem->Which() != RES_CHRATR_BACKGROUND)
+        if (SwTextNode::IsIgnoredCharFormatForNumbering(pItem->Which()))
+            pCleanedSet->ClearItem(pItem->Which());
+        else if (pFormat && pFormat->HasItem(pItem->Which()))
+            pCleanedSet->ClearItem(pItem->Which());
+        else if (pItem->Which() == RES_CHRATR_BACKGROUND)
         {
-            if (SwTextNode::IsIgnoredCharFormatForNumbering(pItem->Which()))
-                pCleanedSet->ClearItem(pItem->Which());
-            else if (pFormat && pFormat->HasItem(pItem->Which()))
+            // If used, BACKGROUND is converted to HIGHLIGHT. So also ignore if a highlight already exists.
+            if (pCleanedSet->HasItem(RES_CHRATR_HIGHLIGHT)
+                || (pFormat && pFormat->HasItem(RES_CHRATR_HIGHLIGHT)))
+            {
                 pCleanedSet->ClearItem(pItem->Which());
+            }
         }
         pItem = aIter.NextItem();
     };
diff --git a/sw/source/core/txtnode/thints.cxx b/sw/source/core/txtnode/thints.cxx
index 6052754c8b46..41e9adefd9d5 100644
--- a/sw/source/core/txtnode/thints.cxx
+++ b/sw/source/core/txtnode/thints.cxx
@@ -45,6 +45,7 @@
 #include <txtftn.hxx>
 #include <txtfld.hxx>
 #include <txtannotationfld.hxx>
+#include <unotools/fltrcfg.hxx>
 #include <charfmt.hxx>
 #include <frmfmt.hxx>
 #include <ftnidx.hxx>
@@ -1809,9 +1810,14 @@ void SwTextNode::DelSoftHyph( const sal_Int32 nStt, const sal_Int32 nEnd )
     }
 }
 
-bool SwTextNode::IsIgnoredCharFormatForNumbering(const sal_uInt16 nWhich)
+bool SwTextNode::IsIgnoredCharFormatForNumbering(const sal_uInt16 nWhich, bool bIsCharStyle)
 {
-    return (nWhich == RES_CHRATR_UNDERLINE || nWhich == RES_CHRATR_BACKGROUND
+    // LO can save the char background as either shading or highlight, so check which mode is currently chosen.
+    // Shading does not affect the numbering. Highlighting does (but isn't allowed in a char style).
+    if (nWhich == RES_CHRATR_BACKGROUND)
+        return bIsCharStyle || SvtFilterOptions::Get().IsCharBackground2Shading();
+
+    return (nWhich == RES_CHRATR_UNDERLINE
             || nWhich == RES_CHRATR_ESCAPEMENT);
 }
 


More information about the Libreoffice-commits mailing list