summaryrefslogtreecommitdiff
path: root/vcl/qa/cppunit
diff options
context:
space:
mode:
authorKhaled Hosny <khaled@libreoffice.org>2023-06-12 22:48:59 +0300
committerخالد حسني <khaled@libreoffice.org>2023-06-13 22:44:52 +0200
commit6b178c6e88ec5a765ad2b3ccd98182286222f550 (patch)
tree1c2c70a484b08c9bda17c445234cf6929d7990b2 /vcl/qa/cppunit
parent3d4c4a95c32ad2a96831c3db552b0c389c596aea (diff)
tdf#153440: Add test
Change-Id: I0c036cd1d8022e6ff265aa67ab177c57eba0c4ac Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152934 Tested-by: Jenkins Reviewed-by: خالد حسني <khaled@libreoffice.org>
Diffstat (limited to 'vcl/qa/cppunit')
-rw-r--r--vcl/qa/cppunit/complextext.cxx60
-rw-r--r--vcl/qa/cppunit/data/tdf153440.ttfbin0 -> 1804 bytes
-rw-r--r--vcl/qa/cppunit/data/tdf153440.ttf.readme12
3 files changed, 71 insertions, 1 deletions
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
--- /dev/null
+++ b/vcl/qa/cppunit/data/tdf153440.ttf
Binary files 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.)