You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is mainly a problem of the AGG backends. Quartz and QPainter backends already have the correct behavior.
Basically, user code should be able to call show_text on the following string: "Kiva Graphics一番😎" and have it render correctly even if the currently selected font only supports Latin characters.
To get to this point, we need to do a few things:
Collect writing system information for entries in our font database
Make low level text drawing functions return the text cursor position after drawing a run of glyphs (or work around the absence by calling get_text_extent on every chunk of a string before drawing)
Bring everything together in the show_text method so that mixed strings can be drawn
QFreeTypeFontDatabase::addTTFile (qtbase.git/tree/src/gui/text/freetype/qfreetypefontdatabase.cpp):
Scans a font for the following information: weight, style, fixed-width, supported writing systems (unicode range, codepage range), family name
QPlatformFontDatabase::fallbacksForFamily (qtbase.git/tree/src/gui/text/qfontdatabase.cpp):
Takes a style and script ID and returns a list of fonts which support that script with that style (or just support the script)
QPainter::drawText (qtbase.git/tree/src/gui/painting/qpainter.cpp): Basically Qt's show_text.
Uses QStackTextEngine for shaping, breaking of input string. Breaks into QScriptItem objects. Picks the font per item and draws it.
QStackTextEngine/QScriptItem/QTextItemInt (qtbase.git/tree/src/gui/text/qtextengine.cpp)
These are the components which break up a string into chunks which can be shaped and drawn as a unit.
The text was updated successfully, but these errors were encountered:
Having played with [mapping of "Han" to a CJK language] a bit more, we should only use [the locale-based guess] when it's not otherwise clear from the context. For instance if a string already contains Hiragana or Katakana, then Han should be mapped to "Japanese". If Hangul is encountered, Han maps to "Korean". Only if the Han is mixed with some non-CJK language should we fall back to this locale-based guess.
This is mainly a problem of the AGG backends. Quartz and QPainter backends already have the correct behavior.
Basically, user code should be able to call
show_text
on the following string:"Kiva Graphics一番😎"
and have it render correctly even if the currently selected font only supports Latin characters.To get to this point, we need to do a few things:
get_text_extent
on every chunk of a string before drawing)show_text
method so that mixed strings can be drawnThis is roughly what Qt does, based on a quick skim of the code: https://code.qt.io/cgit/qt/qtbase.git/
QFreeTypeFontDatabase::addTTFile
(qtbase.git/tree/src/gui/text/freetype/qfreetypefontdatabase.cpp):Scans a font for the following information: weight, style, fixed-width, supported writing systems (unicode range, codepage range), family name
QPlatformFontDatabase::fallbacksForFamily
(qtbase.git/tree/src/gui/text/qfontdatabase.cpp):Takes a style and script ID and returns a list of fonts which support that script with that style (or just support the script)
QPainter::drawText
(qtbase.git/tree/src/gui/painting/qpainter.cpp): Basically Qt'sshow_text
.Uses
QStackTextEngine
for shaping, breaking of input string. Breaks intoQScriptItem
objects. Picks the font per item and draws it.QStackTextEngine
/QScriptItem
/QTextItemInt
(qtbase.git/tree/src/gui/text/qtextengine.cpp)These are the components which break up a string into chunks which can be shaped and drawn as a unit.
The text was updated successfully, but these errors were encountered: