Difference between revisions of "User:Alissa Sabre/Notes on fontconfig"
Jump to navigation
Jump to search
Alissa Sabre (talk | contribs) |
Alissa Sabre (talk | contribs) |
||
Line 1: | Line 1: | ||
This is a discussion paper to use fontconfig in SL Viewer. | |||
Comments are welcome. | |||
= What is fontconfig? = | = What is fontconfig? = | ||
* Fontconfig is an open source library that helps applications to pick up appropriate font files. | * Fontconfig is an open source library that helps applications to pick up appropriate font files. | ||
* Fontconfig can enumerate all available font files for applications' and/or users' selection, or it can build and show a list of font files based on some criteria. | * Fontconfig can enumerate all available font files for applications' and/or users' selection, or it can build and show a list of font files based on some criteria. | ||
* Fontconfig is already used by some well known open source projects, including GTK+. | * Fontconfig is already used by some well known open source projects, including GTK+. | ||
Line 14: | Line 16: | ||
* Fontconfig is available on virtually all Linux desktop these days. | * Fontconfig is available on virtually all Linux desktop these days. | ||
* On Linux, fontconfig mediates distribution differences such as font file paths, availability of particular fonts, or file naming. | * On Linux, fontconfig mediates distribution differences such as font file paths, availability of particular fonts, or file naming. | ||
* Fontconfig is open source, so we can run it on Windows and MacOS. | * Fontconfig is open source, so we can run it on Windows and MacOS. | ||
* Fontconfig has some knowledge on laguages and scripts, allowing prioritized listing of fonts suitable for a particular language environment. | * Fontconfig has some knowledge on laguages and scripts, allowing prioritized listing of fonts suitable for a particular language environment. | ||
* Fontconfig is compatible with FreeType, that SL viewer relies on. | * Fontconfig is compatible with FreeType, that SL viewer relies on. | ||
Line 26: | Line 24: | ||
* Fontconfig is not usually available on Windows and MacOS. We can run it on them, but it doesn't work great without pre-configured font database. | * Fontconfig is not usually available on Windows and MacOS. We can run it on them, but it doesn't work great without pre-configured font database. | ||
* Creation of the font database is a time consuming job. Usually takes tens of seconds to several minutes, depending on the configuration. (On Linux, font database is cached on disk. On Windows and MacOS, it is not as default.) | * Creation of the font database is a time consuming job. Usually takes tens of seconds to several minutes, depending on the configuration. (On Linux, font database is cached on disk. On Windows and MacOS, it is not as default.) | ||
* Fontconfig only knows about ''serif'', ''sans serif'', and ''monospaced'' styles. Moreover, its style recognition is totally human definition of an external config file. There are no guarantee that a set of selected fonts shares same or similar design. | * Fontconfig only knows about ''serif'', ''sans serif'', and ''monospaced'' styles. Moreover, its style recognition is totally human definition of an external config file. There are no guarantee that a set of selected fonts shares same or similar design. | ||
Line 36: | Line 32: | ||
* It may be possible to replace current fallback definition (FontSansSerifFallback in settings.xml) by fontconfig. | * It may be possible to replace current fallback definition (FontSansSerifFallback in settings.xml) by fontconfig. | ||
* We can even use both; i.e., mixing fontconfig created list of fonts and those in settings.xml. | * We can even use both; i.e., mixing fontconfig created list of fonts and those in settings.xml. | ||
* We can use fontconfig on Linux only, or can use on all platforms. | * We can use fontconfig on Linux only, or can use on all platforms. | ||
* We can use fontconfig to simply enumerate all available fonts and use our own defintion to pick up ones to use. | * We can use fontconfig to simply enumerate all available fonts and use our own defintion to pick up ones to use. | ||
* Building a list of fonts using fontconfig is somewhat time consuming, so it's better to build the list once during startup. | * Building a list of fonts using fontconfig is somewhat time consuming, so it's better to build the list once during startup. | ||
== Implementation == | == Implementation == | ||
The changes to use fontconfig will primarily go into LLFontGL::loadFace, LLFontGL::loadFaceFallback and related methods in linden/indra/llrender/llfontgl.cpp. | |||
* If we use fontconfig only as a font enumerator and only on Linux, uses of getFontPathSystem() will be replaced by some calls to fontconfig functions enclosed in #ifdef LL_LINUX. | * If we use fontconfig only as a font enumerator and only on Linux, uses of getFontPathSystem() will be replaced by some calls to fontconfig functions enclosed in #ifdef LL_LINUX - #endif block. | ||
* If we use fontconfig to find a list of suitable fonts, loadFaceFallback method will be rewrote entirely. | * If we use fontconfig to find a list of suitable fonts, loadFaceFallback method will be rewrote entirely. | ||
Line 62: | Line 54: | ||
== Linux uniqueness of font availability and fontconfig == | == Linux uniqueness of font availability and fontconfig == | ||
When comparing Windows/MacOS, Linux font environment is unique | When comparing Windows/MacOS, Linux font environment is unique as follows: | ||
* Linux has no ''standard'' fonts; availability of particular fonts depends on distributions. | * Linux has no ''standard'' fonts; availability of particular fonts depends on distributions. | ||
* Default fonts for a particular language/script are not the same either. | * Default fonts for a particular language/script are not the same either. | ||
* Linux defines no common font file directory. | * Linux defines no common font file directory. | ||
This is one of the reason why fontconfig was originally written. | This is why the current SL viewer uses uncide.ttf symbolic link. It is also one of the reason why fontconfig was originally written. | ||
== Preferred language and fonts == | |||
= | = Viewer's current handling of fonts = | ||
== Face/family abstraction == | == Face/family abstraction == | ||
Line 95: | Line 86: | ||
== MacOS == | == MacOS == | ||
== Windows == | |||
== Linux == | |||
* Linux version of viewer comes with a symbolic link of the name "unciode.ttf". | |||
* The link target may or may not be a valid path. | |||
* A user is expected to correct the symbolic link to an existing font that contains all characters needed for his/her preferred language. |
Revision as of 08:41, 21 June 2007
This is a discussion paper to use fontconfig in SL Viewer.
Comments are welcome.
What is fontconfig?
- Fontconfig is an open source library that helps applications to pick up appropriate font files.
- Fontconfig can enumerate all available font files for applications' and/or users' selection, or it can build and show a list of font files based on some criteria.
- Fontconfig is already used by some well known open source projects, including GTK+.
Why we should or should not use it
Primarily to avoid unicode.ttf hack on Linux, and possibly to improve font finding mechanisms on all platforms.
Pluses
- Fontconfig is available on virtually all Linux desktop these days.
- On Linux, fontconfig mediates distribution differences such as font file paths, availability of particular fonts, or file naming.
- Fontconfig is open source, so we can run it on Windows and MacOS.
- Fontconfig has some knowledge on laguages and scripts, allowing prioritized listing of fonts suitable for a particular language environment.
- Fontconfig is compatible with FreeType, that SL viewer relies on.
Minuses
- Fontconfig is not usually available on Windows and MacOS. We can run it on them, but it doesn't work great without pre-configured font database.
- Creation of the font database is a time consuming job. Usually takes tens of seconds to several minutes, depending on the configuration. (On Linux, font database is cached on disk. On Windows and MacOS, it is not as default.)
- Fontconfig only knows about serif, sans serif, and monospaced styles. Moreover, its style recognition is totally human definition of an external config file. There are no guarantee that a set of selected fonts shares same or similar design.
How we can use fontconfig in Viewer
Possibilities
- It may be possible to replace current fallback definition (FontSansSerifFallback in settings.xml) by fontconfig.
- We can even use both; i.e., mixing fontconfig created list of fonts and those in settings.xml.
- We can use fontconfig on Linux only, or can use on all platforms.
- We can use fontconfig to simply enumerate all available fonts and use our own defintion to pick up ones to use.
- Building a list of fonts using fontconfig is somewhat time consuming, so it's better to build the list once during startup.
Implementation
The changes to use fontconfig will primarily go into LLFontGL::loadFace, LLFontGL::loadFaceFallback and related methods in linden/indra/llrender/llfontgl.cpp.
- If we use fontconfig only as a font enumerator and only on Linux, uses of getFontPathSystem() will be replaced by some calls to fontconfig functions enclosed in #ifdef LL_LINUX - #endif block.
- If we use fontconfig to find a list of suitable fonts, loadFaceFallback method will be rewrote entirely.
Related issues
- VWR-593: Better display of UTF characters
- VWR-257: Symlink to unicode.ttf is invalid on some systems
- VWR-81: Non-Latin characters such as Japanese Kanji or Korean Hangul appear as dots/lines
- Discussion on sldev: Matsuu, Tofu, and me.
Linux uniqueness of font availability and fontconfig
When comparing Windows/MacOS, Linux font environment is unique as follows:
- Linux has no standard fonts; availability of particular fonts depends on distributions.
- Default fonts for a particular language/script are not the same either.
- Linux defines no common font file directory.
This is why the current SL viewer uses uncide.ttf symbolic link. It is also one of the reason why fontconfig was originally written.
Preferred language and fonts
Viewer's current handling of fonts
Face/family abstraction
- SL Viewer uses a Monospace font and a series of SansSerif font.
- Monospace has a fixed height, contains Latin-1 characters only, and is used for debug/stats views.
- SansSerif is available in four hights: small, normal, big, huge.
- SansSerif of normal height has another variant: bold. (Itallic is not available in SL Viewer.)
- Viewer doesn't use Serif fonts.
Base fonts and fallback fonts
- SL Viewer is distributed with three font files. They are used as the base fonts.
- ProFontWindows (profontwindows.ttf) is for Monospace.
- MetaBookLF Roman (MtBkLfRg.ttf) is for SanSerif (of all heights).
- MetaBoldLF Roman (MtBdLfRg.ttf) is for SanSerifBold.
- Base fonts contain Latin-1 characters only.
- Non-Latin-1 characters (glyphs) are handled by fallback font mechanism.
- Fallback font is an ordered list of font files. A requested character is searched in the list, and the first one found in a file is used.
- Particular fallback fonts are defined in settings.xml by the FontSansSerifFallback parameter.
MacOS
Windows
Linux
- Linux version of viewer comes with a symbolic link of the name "unciode.ttf".
- The link target may or may not be a valid path.
- A user is expected to correct the symbolic link to an existing font that contains all characters needed for his/her preferred language.