QTextEngine: Do not disable graphite2 HB shaper backend

This fixes-up bf013c9e74 by specifying
graphite2 shaper in a "safe" shaper list, one used for non-CoreText
font engines (currently, FreeType font engine only).

Make the the comment and the code a bit cleaner about the fallback
shaper list.

Change-Id: Ib0cedc0b593023c9ee771e8e98c314d9c8f13037
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
This commit is contained in:
Konstantin Ritt 2015-11-07 09:54:21 +04:00
parent 2316db05a8
commit 50af66293d
1 changed files with 14 additions and 15 deletions

View File

@ -1120,15 +1120,6 @@ QT_BEGIN_INCLUDE_NAMESPACE
QT_END_INCLUDE_NAMESPACE
#if defined(Q_OS_OSX) && !defined(QT_NO_FREETYPE)
static const char *s_shapersForOsxFreeType[] =
{
"ot",
"fallback",
Q_NULLPTR
};
#endif
int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *string, int itemLength, QFontEngine *fontEngine, const QVector<uint> &itemBoundaries, bool kerningEnabled) const
{
uint glyphs_shaped = 0;
@ -1182,13 +1173,21 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *st
const int num_features = 1;
const char *const *shaper_list = Q_NULLPTR;
#if defined(Q_OS_OSX) && !defined(QT_NO_FREETYPE)
// What's behind QFontEngine::FaceData::user_data isn't compatible between CoreText and
// FreeType font engines - specifically functions in hb-coretext.cc would run into undefined
// behavior with data from the FreeType engine. The OpenType shaper works with that engine.
if (actualFontEngine->type() == QFontEngine::Freetype)
shaper_list = s_shapersForOsxFreeType;
#if defined(Q_OS_DARWIN)
// What's behind QFontEngine::FaceData::user_data isn't compatible between different font engines
// - specifically functions in hb-coretext.cc would run into undefined behavior with data
// from non-CoreText engine. The other shapers works with that engine just fine.
if (actualFontEngine->type() != QFontEngine::Mac) {
static const char *s_shaper_list_without_coretext[] = {
"graphite2",
"ot",
"fallback",
Q_NULLPTR
};
shaper_list = s_shaper_list_without_coretext;
}
#endif
bool shapedOk = hb_shape_full(hb_font, buffer, features, num_features, shaper_list);
if (Q_UNLIKELY(!shapedOk)) {
hb_buffer_destroy(buffer);