From 4d104eb33542b78e233abb9a0d6d4a0ee1495868 Mon Sep 17 00:00:00 2001 From: Jiang Jiang Date: Mon, 14 Mar 2011 12:04:31 +0100 Subject: Add RightToLeft direction forcing to Core Text shaper So that setting Qt::TextForceRightToLeft flag on QTextLayout can work. Reviewed-by: Eskil --- src/gui/text/qfontengine_coretext.mm | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/gui/text/qfontengine_coretext.mm b/src/gui/text/qfontengine_coretext.mm index 0209689..4b65cf5 100644 --- a/src/gui/text/qfontengine_coretext.mm +++ b/src/gui/text/qfontengine_coretext.mm @@ -119,14 +119,25 @@ uint QCoreTextFontEngineMulti::fontIndexForFont(CTFontRef id) const return engines.count() - 1; } -bool QCoreTextFontEngineMulti::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, QTextEngine::ShaperFlags, +bool QCoreTextFontEngineMulti::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, QTextEngine::ShaperFlags flags, unsigned short *logClusters, const HB_CharAttributes *) const { QCFType cfstring = CFStringCreateWithCharactersNoCopy(0, reinterpret_cast(str), len, kCFAllocatorNull); QCFType attributedString = CFAttributedStringCreate(0, cfstring, attributeDict); - QCFType typeSetter = CTTypesetterCreateWithAttributedString(attributedString); + QCFType typeSetter; + + if (flags & QTextEngine::RightToLeft) { + const void *optionKeys[] = { kCTTypesetterOptionForcedEmbeddingLevel }; + const short rtlForcedEmbeddingLevelValue = 1; + const void *rtlOptionValues[] = { CFNumberCreate(kCFAllocatorDefault, kCFNumberShortType, &rtlForcedEmbeddingLevelValue) }; + QCFType options = CFDictionaryCreate(kCFAllocatorDefault, optionKeys, rtlOptionValues, 1, + &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + typeSetter = CTTypesetterCreateWithAttributedStringAndOptions(attributedString, options); + } else + typeSetter = CTTypesetterCreateWithAttributedString(attributedString); + CFRange range = {0, 0}; QCFType line = CTTypesetterCreateLine(typeSetter, range); CFArrayRef array = CTLineGetGlyphRuns(line); -- cgit v0.12