tdf#127189 FreeType <= 2.8 will fail to render stretched horizontal brace...
glyphs in starmath at a fairly low stretch ratio. The failure will set CAIRO_STATUS_FREETYPE_ERROR on the surface which cannot be cleared, so all further painting to the surface fails. This appears fixed in 2.9 with https://git.savannah.gnu.org/cgit/freetype/freetype2.git/commit/?id=91015cb41d8f56777f93394f5a60914bc0c0f330 "Improve complex rendering at high ppem" Change-Id: I8cbf8347ccd29beda4057b14f2e68678f6030bf4 Reviewed-on: https://gerrit.libreoffice.org/78587 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
This commit is contained in:
@@ -117,6 +117,13 @@ public:
|
||||
FreetypeFontInstance* GetFontInstance() const { return mpFontInstance.get(); }
|
||||
|
||||
void SetFontVariationsOnHBFont(hb_font_t* pHbFace) const;
|
||||
|
||||
// tdf#127189 FreeType <= 2.8 will fail to render stretched horizontal brace glyphs
|
||||
// in starmath at a fairly low stretch ratio. This appears fixed in 2.9 with
|
||||
// https://git.savannah.gnu.org/cgit/freetype/freetype2.git/commit/?id=91015cb41d8f56777f93394f5a60914bc0c0f330
|
||||
// "Improve complex rendering at high ppem"
|
||||
static bool AlmostHorizontalDrainsRenderingPool();
|
||||
|
||||
private:
|
||||
friend class GlyphCache;
|
||||
friend class FreetypeFontInstance;
|
||||
|
@@ -204,6 +204,22 @@ void CairoTextRender::DrawTextLayout(const GenericSalLayout& rLayout, const SalG
|
||||
if (nWidth == 0 || nHeight == 0)
|
||||
return;
|
||||
|
||||
int nRatio = nWidth * 10 / nHeight;
|
||||
if (nRatio > 100 && rFSD.maTargetName == "OpenSymbol" && FreetypeFont::AlmostHorizontalDrainsRenderingPool())
|
||||
{
|
||||
// tdf#127189 FreeType <= 2.8 will fail to render stretched horizontal
|
||||
// brace glyphs in starmath at a fairly low stretch ratio. The failure
|
||||
// will set CAIRO_STATUS_FREETYPE_ERROR on the surface which cannot be
|
||||
// cleared, so all further painting to the surface fails.
|
||||
|
||||
// This appears fixed in >= freetype 2.9
|
||||
|
||||
// Restrict this bodge to a stretch ratio > ~10 of the OpenSymbol font
|
||||
// where it has been seen in practice.
|
||||
SAL_WARN("vcl", "rendering text would fail with stretch ratio of: " << nRatio << ", with FreeType <= 2.8");
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* It might be ideal to cache surface and cairo context between calls and
|
||||
* only destroy it when the drawable changes, but to do that we need to at
|
||||
@@ -330,6 +346,10 @@ void CairoTextRender::DrawTextLayout(const GenericSalLayout& rLayout, const SalG
|
||||
|
||||
cairo_set_font_matrix(cr, &m);
|
||||
cairo_show_glyphs(cr, &cairo_glyphs[nStartIndex], nLen);
|
||||
if (cairo_status(cr) != CAIRO_STATUS_SUCCESS)
|
||||
{
|
||||
SAL_WARN("vcl", "rendering text failed with stretch ratio of: " << nRatio << ", " << cairo_status_to_string(cairo_status(cr)));
|
||||
}
|
||||
|
||||
#if OSL_DEBUG_LEVEL > 2
|
||||
//draw origin
|
||||
|
@@ -324,6 +324,26 @@ void GlyphCache::InitFreetype()
|
||||
(void)vclFontFileList::get();
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
bool DoesAlmostHorizontalDrainRenderingPool()
|
||||
{
|
||||
FT_Int nMajor, nMinor, nPatch;
|
||||
FT_Library_Version(aLibFT, &nMajor, &nMinor, &nPatch);
|
||||
if (nMajor > 2)
|
||||
return false;
|
||||
if (nMajor == 2 && nMinor <= 8)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool FreetypeFont::AlmostHorizontalDrainsRenderingPool()
|
||||
{
|
||||
static bool bAlmostHorizontalDrainsRenderingPool = DoesAlmostHorizontalDrainRenderingPool();
|
||||
return bAlmostHorizontalDrainsRenderingPool;
|
||||
}
|
||||
|
||||
FT_Face FreetypeFont::GetFtFace() const
|
||||
{
|
||||
FT_Activate_Size( maSizeFT );
|
||||
|
Reference in New Issue
Block a user