vcl/qa/cppunit/complextext.cxx           |   60 ++++++++++++++++++++++++++++++-
 vcl/qa/cppunit/data/tdf153440.ttf        |binary
 vcl/qa/cppunit/data/tdf153440.ttf.readme |   12 ++++++
 3 files changed, 71 insertions(+), 1 deletion(-)

New commits:
commit 6b178c6e88ec5a765ad2b3ccd98182286222f550
Author:     Khaled Hosny <kha...@libreoffice.org>
AuthorDate: Mon Jun 12 22:48:59 2023 +0300
Commit:     خالد حسني <kha...@libreoffice.org>
CommitDate: Tue Jun 13 22:44:52 2023 +0200

    tdf#153440: Add test
    
    Change-Id: I0c036cd1d8022e6ff265aa67ab177c57eba0c4ac
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152934
    Tested-by: Jenkins
    Reviewed-by: خالد حسني <kha...@libreoffice.org>

diff --git a/vcl/qa/cppunit/complextext.cxx b/vcl/qa/cppunit/complextext.cxx
index 9473d5b7b696..631a24379a7f 100644
--- a/vcl/qa/cppunit/complextext.cxx
+++ b/vcl/qa/cppunit/complextext.cxx
@@ -44,8 +44,27 @@ static std::ostream& operator<<(std::ostream& rStream, const 
std::vector<sal_Int
 
 class VclComplexTextTest : public test::BootstrapFixture
 {
+    OUString maDataUrl = u"/vcl/qa/cppunit/data/";
+
 public:
-    VclComplexTextTest() : BootstrapFixture(true, false) {}
+    OUString getFullUrl(std::u16string_view sFileName)
+    {
+        return m_directories.getURLFromSrc(maDataUrl) + sFileName;
+    }
+
+    bool addFont(OutputDevice* pOutDev, std::u16string_view sFileName,
+                 std::u16string_view sFamilyName)
+    {
+        OutputDevice::ImplClearAllFontData(true);
+        bool bAdded = pOutDev->AddTempDevFont(getFullUrl(sFileName), 
OUString(sFamilyName));
+        OutputDevice::ImplRefreshAllFontData(true);
+        return bAdded;
+    }
+
+    VclComplexTextTest()
+        : BootstrapFixture(true, false)
+    {
+    }
 };
 
 CPPUNIT_TEST_FIXTURE(VclComplexTextTest, testArabic)
@@ -421,4 +440,43 @@ CPPUNIT_TEST_FIXTURE(VclComplexTextTest, testTdf152048_2)
 #endif
 }
 
+CPPUNIT_TEST_FIXTURE(VclComplexTextTest, testTdf153440)
+{
+#if HAVE_MORE_FONTS
+    vcl::Font aFont(u"Noto Naskh Arabic", u"Regular", Size(0, 72));
+
+    ScopedVclPtrInstance<VirtualDevice> pOutDev;
+    pOutDev->SetFont(aFont);
+
+#if !defined _WIN32 // TODO: Fails on jenkins but passes locally
+    // Add an emoji font so that we are sure a font will be found for the
+    // emoji. The font is subset and supports only 🌿.
+    bool bAdded = addFont(pOutDev, u"tdf153440.ttf", u"Noto Emoji");
+    CPPUNIT_ASSERT_EQUAL(true, bAdded);
+#endif
+
+    for (auto& aString : { u"ع 🌿 ع", u"a 🌿 a" })
+    {
+        OUString aText(aString);
+        bool bRTL = aText.startsWith(u"ع");
+
+        auto pLayout = pOutDev->ImplLayout(aText, 0, -1, Point(0, 0), 0, {}, 
{});
+
+        int nStart = 0;
+        DevicePoint aPos;
+        const GlyphItem* pGlyphItem;
+        while (pLayout->GetNextGlyph(&pGlyphItem, aPos, nStart))
+        {
+            // Assert glyph ID is not 0, if it is 0 then font fallback didn’t
+            // happen.
+            CPPUNIT_ASSERT(pGlyphItem->glyphId());
+
+            // Assert that we are indeed doing RTL layout for RTL text since
+            // the bug does not happen for LTR text.
+            CPPUNIT_ASSERT_EQUAL(bRTL, pGlyphItem->IsRTLGlyph());
+        }
+    }
+#endif
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qa/cppunit/data/tdf153440.ttf 
b/vcl/qa/cppunit/data/tdf153440.ttf
new file mode 100644
index 000000000000..933e74733b0a
Binary files /dev/null and b/vcl/qa/cppunit/data/tdf153440.ttf differ
diff --git a/vcl/qa/cppunit/data/tdf153440.ttf.readme 
b/vcl/qa/cppunit/data/tdf153440.ttf.readme
new file mode 100644
index 000000000000..6fffab0decab
--- /dev/null
+++ b/vcl/qa/cppunit/data/tdf153440.ttf.readme
@@ -0,0 +1,12 @@
+This is a subset copy of Noto Emoji font licensed under Open Font License and
+obtained from:
+
+  https://fonts.google.com/noto/specimen/Noto+Emoji
+
+And subset using hb-subset to contain only the one glyph used in the test:
+
+  hb-subset static/NotoEmoji-Regular.ttf "🌿 " -o tdf153440.ttf 
--drop-tables=GSUB,STAT,vhea,vmtx
+
+The space is added to the subset as it seems needed to get the font to work on
+Windows. (The --drop-tables argument is not necessary be saves a few bytes of
+stuff we don’t need.)

Reply via email to