enthought / enthought/enable

Provide better support for mixed writing systems

Open
#762 3 comments 1 reaction 0 assignees View on GitHub
difficulty: advanced ETS Backlog type: enhancement
Dominant language
C
Stars
97
Forks
45
PR merge metrics
No merged PRs in 30d

Description

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:
- [x] Collect writing system information for entries in our font database
- [x] Build fallback lists for font families and styles
- [x] Find a library to use, or failing that, write our own function which breaks a string up into chunks which share the same writing system (see: https://stackoverflow.com/questions/9868792/find-out-the-unicode-script-of-a-character)
- [x] 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
- [ ] Bonus: Support bidirectional text mixing

This 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'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.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.