diff options
author | Tor Arne Vestbø <tor.arne.vestbo@digia.com> | 2013-01-11 16:58:43 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-01-14 14:07:48 +0100 |
commit | e11cf63b0babcba8709cd39ff46e43e773f7fa9f (patch) | |
tree | 9e225f8c34ac39aa5b8e69d25eb6a1bdd9e011b2 | |
parent | 9941bf5118f1944fe882497444308e7d3a48e349 (diff) |
Fix crash when trying to create paths for color-glyphs (Emoji) on Mac
CoreText segfaults when creating paths for color-glyphs:
0 0x00007fff8fd41e69 in TFont::FindColourBitmapForGlyph ()
1 0x00007fff8fd417ac in TFont::CreatePathForGlyph ()
2 0x000000010567d1af in QCoreTextFontEngine::addGlyphsToPath (...)
So we shortcut the code-path, since we don't support Emoji yet anyways.
Task-number: QTBUG-28615
Change-Id: Ife16ae4959077d9eaaf6ea5cd1f27a4e2e01e7f5
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
-rw-r--r-- | src/gui/text/qfontengineglyphcache_p.h | 3 | ||||
-rw-r--r-- | src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm | 13 | ||||
-rw-r--r-- | src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h | 15 |
3 files changed, 28 insertions, 3 deletions
diff --git a/src/gui/text/qfontengineglyphcache_p.h b/src/gui/text/qfontengineglyphcache_p.h index 18440f22fa..092873a4d4 100644 --- a/src/gui/text/qfontengineglyphcache_p.h +++ b/src/gui/text/qfontengineglyphcache_p.h @@ -69,7 +69,8 @@ public: enum Type { Raster_RGBMask, Raster_A8, - Raster_Mono + Raster_Mono, + Raster_ARGB }; QFontEngineGlyphCache(const QTransform &matrix, Type type) : m_transform(matrix), m_type(type) { } diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm index 1087d18891..4923950c13 100644 --- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm +++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm @@ -149,8 +149,6 @@ void QCoreTextFontEngine::init() Q_ASSERT(ctfont != NULL); Q_ASSERT(cgFont != NULL); - glyphFormat = defaultGlyphFormat; - QCFString family = CTFontCopyFamilyName(ctfont); fontDef.family = family; @@ -159,6 +157,14 @@ void QCoreTextFontEngine::init() synthesisFlags = 0; CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(ctfont); + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 + if (supportsColorGlyphs() && (traits & kCTFontColorGlyphsTrait)) + glyphFormat = QFontEngineGlyphCache::Raster_ARGB; + else +#endif + glyphFormat = defaultGlyphFormat; + if (traits & kCTFontItalicTrait) fontDef.style = QFont::StyleItalic; @@ -422,6 +428,9 @@ static void convertCGPathToQPainterPath(void *info, const CGPathElement *element void QCoreTextFontEngine::addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nGlyphs, QPainterPath *path, QTextItem::RenderFlags) { + if (glyphFormat == QFontEngineGlyphCache::Raster_ARGB) + return; // We can't convert color-glyphs to path + CGAffineTransform cgMatrix = CGAffineTransformIdentity; cgMatrix = CGAffineTransformScale(cgMatrix, 1, -1); diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h b/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h index 6c5c557b13..b3a0968c4b 100644 --- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h +++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h @@ -108,6 +108,21 @@ public: virtual QFontEngine *cloneWithSize(qreal pixelSize) const; virtual int glyphMargin(QFontEngineGlyphCache::Type type) { Q_UNUSED(type); return 0; } + static bool supportsColorGlyphs() + { +#if defined(Q_OS_IOS) + return true; +#elif MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 + #if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + return &CTFontDrawGlyphs; + #else + return true; + #endif +#else + return false; +#endif + } + static int antialiasingThreshold; static QFontEngineGlyphCache::Type defaultGlyphFormat; |