tdf#153440: Add test
Change-Id: I0c036cd1d8022e6ff265aa67ab177c57eba0c4ac
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152934
Tested-by: Jenkins
Reviewed-by: خالد حسني <khaled@libreoffice.org>
(cherry picked from commit 6b178c6e88ec5a765ad2b3ccd98182286222f550)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153338
diff --git a/vcl/qa/cppunit/complextext.cxx b/vcl/qa/cppunit/complextext.cxx
index 9473d5b..631a243 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 0000000..933e747
--- /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 0000000..6fffab0
--- /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.)