Linux Font Rendering Stack
-
Not SyncedOkay, good morning everyone.
-
Not SyncedI'm going to talk about the
Linux Font Rendering stack, -
Not Syncedand that is what I learned the last
four and a half years. -
Not SyncedI worked at the
city administration of Munich. -
Not SyncedFor introduction to font rendering,
-
Not SyncedI can say writing is
the most used interface, -
Not Syncedor probably the most used interface
between humans and the machines. -
Not SyncedSo all of you probably use it everyday
on your computer. -
Not SyncedScreen text is replacing text on paper
more and more -
Not Syncedand this is still an ongoing process.
-
Not SyncedThe way from a string in a computer to
display text is surprisingly complex, -
Not SyncedAnd writing in itself is quite profound.
-
Not SyncedFor example, it's influenced by history
so probably all, or at least most, -
Not Syncedwriting systems are derived from some
pictograph writing systems. -
Not SyncedThis is also true for Roman letters.
-
Not SyncedAnd also the Roman letters themselves,
they changed a lot since 2000 years ago. -
Not SyncedIn the Roman Empire they used some
different letters than we use now. -
Not SyncedSo the goal of this talk is to raise
awareness of font rendering in computing, -
Not Syncedwith the focus on the Linux desktop.
-
Not SyncedNow to the history,
and then I talk about typography. -
Not SyncedText display in early computing.
-
Not SyncedIn early computing it was just
a way to display results. -
Not SyncedBefore that there were
only flashing lights -
Not Syncedwhere you can read the results
and... -
Not Synced[audience member] ??... BT100
?? raise your hand -
Not Synced[Max] And the output device receives
a page or a character stream, -
Not Syncedand then the presentation is the job
of the output device. -
Not SyncedSo for example, a typewriter
or a printer or a terminal. -
Not SyncedAnd this is a BT100
you can see on the right side. -
Not SyncedSo this is a real terminal.
-
Not SyncedBut going on in history
there's the home computer era. -
Not SyncedIn the home computer era you have
fixed character sets -
Not Syncedand most of the time due to system
limiatations, memory limitations, -
Not Syncedyou have graphics mode and text mode.
-
Not SyncedIn the graphics mode you can basically
set the pixels more or less as you want, -
Not Syncedand in the text mode you can use fonts.
-
Not SyncedThe screen configuration at that time
is more or less defined -
Not Syncedby the state of technology.
-
Not SyncedSo every screen at that time has more or
less the same resolution, -
Not Syncedand that's something that the engineers
of that time relied on, -
Not Syncedand also software engineers relied on.
-
Not SyncedThe text rendering was just
using bitmap fonts. -
Not SyncedThat means you have a fixed size character
and you just define it pixelwise -
Not Syncedso it's some kind of hand-crafted
characters. -
Not SyncedYou have a given raster and then
you really display -
Not Syncedthese hard-defined characters.
-
Not SyncedSo then I need to introduce a few
typography terms. -
Not SyncedFirst, there's glyph or a character.
-
Not SyncedThat's...well you can say a symbol.
-
Not SyncedSo I think most people can understand what
that means. -
Not SyncedThen a font, this is a set of glyphs.
-
Not SyncedAnd then we have a collection of fonts,
that is called typeface or font family. -
Not SyncedThose are closely related fonts with
the same visual appearance, -
Not SyncedAnd they differ only in slopes or widths
or weights for example. -
Not SyncedUsually with typesetting, with moving
letters in the printing press, -
Not Syncedyou really had, for weight for example,
different pieces/letters/hardware. -
Not SyncedAnd then the point size,
or typographic unit. -
Not SyncedThis is a measure of the size, and
derives directly from the printing press -
Not Syncedwith moving letters.
-
Not SyncedThere are different definitions, and what
we probably all use as point size is the -
Not SyncedDTP point – desktop publishing point,
-
Not Syncedwhere one point is defined as 1/72 inch,
which is 0.3527 period millimeters. -
Not SyncedIt is interesting to note that this has
nothing to do with pixels. -
Not Synced[question] (unintelligible question)
-
Not Synced[Max] Please use the microphone
if you a question. -
Not Synced[question] ...3257, what's the bar
over the 7 mean? -
Not Synced[Max] It means that the 7 goes
on and on and on forever. -
Not SyncedSo this is typography of the
Latin alphabet...terminology. -
Not SyncedThere's something called kerning.
-
Not SyncedYou can see an example of kerning
on the right side. -
Not SyncedSo in the printing press you have letters
and they usually have a gap. -
Not SyncedTo improve the readability, and to
make all the text appear more uniform -
Not Syncedthe typesetter reduces the gap.
-
Not SyncedWith moving letters they have special
letter pairs... -
Not Syncedif you go on with this
there are ligatures, -
Not Syncedwhich are replacement glyphs for close
standing characters. -
Not SyncedAn example of this is a double f, fi or fl.
-
Not SyncedSo you can see also in the slides here
that double f is such a ligature. -
Not SyncedIt's one connected glyph.
-
Not SyncedAnd then there's a speciality
if you reverse all of the ?? [static]. -
Not SyncedThe term non-proportional font.
-
Not SyncedSo you have a font where very character,
every glyph, has the same width. -
Not SyncedThis is also called monospace font.
-
Not SyncedSometimes you distinguish half-width
and full width letters. -
Not SyncedThis is also something you would see
on a typewriter for example. -
Not SyncedEarly bitmap fonts are usually
monospaced fonts. -
Not SyncedOkay, let's go to
the text rendering stack. -
Not SyncedText rendering today.
-
Not SyncedIn all computing nowadays,
typography is introduced. -
Not SyncedSo won't find many devices on the market
which don't use accurate typography. -
Not SyncedGlyphs are now represented as
size-independent outlines. -
Not SyncedWe can see on the right side there's
a font editor: Font Forge. -
Not SyncedThis is the way that such fonts
are created. -
Not SyncedSo you can see here in the picture
the outline of the "S". -
Not SyncedIt's a size-independent outline and
you can just use that for -
Not Syncedevery kind of display.
-
Not SyncedAnd then you do something that is called
rasterization, or sampling, or rendering -
Not Syncedfor displaying it at the actual display.
-
Not SyncedIn the past this allowed for new
applications for computers. -
Not SyncedFirst it allowed word processing and
computer-based typesetting. -
Not SyncedBefore that typesetting was
a very hard job. -
Not SyncedIt allowed internationalization.
-
Not SyncedIt allows universal graphical interface
which goes -
Not Syncedhand-in-hand with internationalization.
-
Not SyncedCome to think of it, not so long ago it
was not so common that you could -
Not Syncedbuy devices where you can easily switch
the language to -
Not Syncedany language you would like.
-
Not SyncedThis is just a recent development.
-
Not SyncedSo now I will give you an overview of
the formats we see on Linux systems. -
Not SyncedFirst I talk about the bitmap formats.
-
Not SyncedToday we have bitmap formats in the
PC Screen Font format, -
Not SyncedPSF or PSFU.
-
Not SyncedThese are the fonts that are used for the
Linux VT, also known as the console. -
Not SyncedUsually you can store in such a font
256 or 512 glyphs. -
Not SyncedSome of them contain
a Unicode translation table. -
Not SyncedAnd on the other hand there are
X Window System Bitmap Fonts. -
Not SyncedThere are three formats:
-
Not SyncedThere's a Sever normal Format (SNF).
-
Not SyncedGlyph Bitmap Distribution Format (BDF).
-
Not SyncedAnd Portable Compiled Format (PCF).
-
Not SyncedNowadays PCF is the only letter that
you can find on a Linux system if so, -
Not Syncedand the first two are deprecated.
-
Not SyncedAnd also the X Window Bitmap Fonts
themselves are not very common these days. -
Not SyncedTo the outline font formats.
-
Not SyncedThere are Postscript Formats.
-
Not SyncedPostscript Formats have different versions
as I would call them. It's called types. -
Not SyncedType 1 is the one that is still relevant,
to a certain degree. -
Not SyncedThose are the ones you can probably
-
Not Syncedfind on a standard Debian installation
for example. -
Not SyncedIt uses cubic bezier curves.
-
Not SyncedThe file format is divided into
different files. -
Not SyncedSo for every font you have
Printer Font ASCII -
Not Syncedor a Printer Font Binary file,
and you have -
Not Synceda Print Font Metric or
Adobe Font Metric file. -
Not SyncedThen you have the Truetype file format.
-
Not SyncedThis is more common. I guess everyone
heard of that already. -
Not SyncedIt uses quadratic bezier curves.
-
Not SyncedIt can contain optional code for
TrueType Hinting Virtual Machine. -
Not SyncedWhat that means I will explain latter.
-
Not SyncedThere's a third format,
the OpenType format, -
Not Syncedwhich has two possible glyph formats:
one is truetype, -
Not Syncedand the other is Compact Font Format,
which is based on Postscript Type 2. -
Not SyncedSo you can say what is new in this format,
or what's the difference? -
Not SyncedWell it supports so-called Smartfonts.
-
Not SyncedThat means you can have language-specific
ligatures or character substitutions. -
Not SyncedFor example, kerning classes, which means
you have a class of characters like -
Not Syncedthe A and different variations.
-
Not SyncedSo these are A with different diacritic
symbols, -
Not Syncedand you can just use one kerning class for
all of those characters and don't have to -
Not Syncedinvent the wheel for every A with
diacritic symbols anew. -
Not SyncedNow to the font rendering techniques that
I use today. -
Not SyncedThis only applies to the outline fonts
because well rendering bitmap fonts is -
Not Syncedobviously quite easy. You just paint the
pixels that are in the bitmap. -
Not SyncedSo rasterization is all about using
outline fonts. -
Not SyncedThe one library library that is used all
over the free and open source world -
Not Syncedis FreeType.
-
Not SyncedIt is used on Linux system, BSD desktops,
Android, and ReactOS, and also some others. -
Not SyncedFor example it is contained in Ghostscript
and therefore in most of the printers. -
Not SyncedIt's also on iOS [exhale].
-
Not SyncedSo the naive rasterization algorithm would
be just lay a pixel raster over the outline, -
Not Syncedover the character you want to display,
and if the center of the pixel is inside -
Not Syncedthe outline then you
set the color to black. -
Not SyncedThe problem is the so called
aliasing effect. -
Not SyncedThis is what you can see
in the picture below. -
Not SyncedSo those are the same words,
rendered at different resolutions. -
Not SyncedThe left one has 10x the resolution
of the right one. -
Not SyncedYou can see that, for example,
the 'w' is quite deformed. -
Not SyncedOr the curl of the 'g';
there's even a part missing. -
Not SyncedSo you have details of the font
which are lost, -
Not Syncedand you have artefacts.
-
Not SyncedSomehow, especially in the early computing
days you wanted to reduce those, -
Not Syncedand therefore you used a technique
called hinting. -
Not SyncedThis is to avoid such artefacts and
improve the readability -
Not Syncedat lower resolutions.
-
Not SyncedTherefore the outline adjusted to fit the
pixel raster at the rasterization. -
Not SyncedSome of the fonts can contain
instructions, the so-called hints -
Not Syncedwhere the the name comes from.
-
Not SyncedYou can see in the example here,
in the picture above, -
Not Syncedthat it's quite a good result.
-
Not SyncedThis is much more readable
than the word above. -
Not SyncedHowever, with the use of hinting, there
are also characteristics of the font lost -
Not Syncedwhich is obvious because
if you change the outline -
Not Syncedthen obviously characteristics get lost.
-
Not SyncedAnd especially important for
word processing, -
Not Syncedwhat you see is what you get
word processing, -
Not Syncedthat the tracking of the font is changed.
-
Not SyncedSo tracking means the width
of single characters. -
Not SyncedThe picture below, this is a picture I
took from LibreOffice. -
Not SyncedIf you have a close look, you can see
that the gap between those 'i' characters -
Not Syncedis not always the same.
-
Not SyncedBut if do word processing, you actually
want to have a result which looks the same -
Not Syncedas on the printout.
-
Not SyncedSo I would recommend no
to hint fonts in -
Not Synceda what you see is what you get
word processor. -
Not SyncedIf you have a look beyond the backyard,
on macOS, there exists no hinting, -
Not Syncedand in the Windows world, hint can't
be turned off, -
Not Syncedso this is hardwired in the
font rendering of the Windows system. -
Not SyncedWell anther approach to improve
readability is anti-aliasing -
Not Syncedwhich applies multisampling.
-
Not SyncedSo for every pixel you take samples at
different spots -
Not Syncedand then you compute from
that a gray value, -
Not Syncedwhich is a measure of how much of the
area of the pixel is covered by the glyph. -
Not SyncedOn the picture you can see again
the simple raster word, -
Not Syncedand then in the middle you see the word
with anti-alising, -
Not Syncedand below you can see a combination of
hinting and antialiasing. -
Not SyncedSuddenly the text becomes very readable
also on low resolutions. -
Not SyncedThis is what is usually used in
computing in the 90s. -
Not SyncedSo there is another approach to improve
and therefore I have to -
Not Syncedtalk a bit about LCD displays.
-
Not SyncedSo in the picture on the left, above you
can see tube monitor pixels and -
Not Syncedon the bottom you can see
LCD monitor pixels. -
Not SyncedAll of the pixels consist of so-called
subpixels with different colors. -
Not SyncedThe mixture of the three different colors
-
Not Syncedgives them a wide range
of different colors. -
Not SyncedWith the tube monitors this is not used,
but with LCD display -
Not Synceddepending on the
configuration of the subpixels -
Not Syncedit can be used to improve improve the
resolution in one direction. -
Not SyncedTherefore you have to know how the
configuration of the display is. -
Not SyncedSo usually, one pixel, which you can see
in the picture below right? -
Not SyncedThese are the usual computer monitors.
-
Not SyncedOne pixel consists of a red, green and a
blue subpixel in this order. -
Not SyncedBut you have to keep in mind, especially
with tablets, or smartphones, -
Not Syncedyou can rotate the screen, so you have to
keep that in mind. -
Not SyncedAlso there are other subpixel
configurations. -
Not SyncedFor example, depending on the technology
there can be additional red or green -
Not Syncedor even white subpixels.
-
Not SyncedSo there are also multiple possibilities
of the configuration. -
Not SyncedWe can use this configuration as I said
to improve the resolution -
Not Syncedand in the usual case
this is horizontally. -
Not SyncedYou can see on the picture
on the left side, -
Not Syncedfirst there's the naive,
simple rendered character, -
Not Syncedthen the character
just using anti-aliasing, -
Not Syncedand then there's the
subpixel rendered character. -
Not SyncedThis one is the most readable
or most sharp character. -
Not SyncedNot sharp!... but it's most correctly
rendered according to the outline font. -
Not SyncedDepending on the technique of the display,
-
Not Syncedyou can see a color haze
around the characters. -
Not SyncedSo this happens when the software
and the display technology -
Not Synceddon't match each other.
-
Not SyncedSo this is what you can see
on the picture on the right. -
Not SyncedOkay, let's talk about the font rendering
software parts in the Linux desktop. -
Not SyncedThere's the so-called server-side
text rendering. -
Not SyncedSo in the X server there's the
Core Font subsystem. -
Not SyncedWith that, X11 clients can request the
server to display a text -
Not Syncedby sending a string via libXfont
-
Not Syncedand using the so-called
X Logical Font Description (XLFD). -
Not SyncedHere's an example for Adobe Career font,
-
Not Syncedthen the X server has to then
render the text using the font. -
Not SyncedIf you imagine a terminal server setup
with thin clients, -
Not Syncedthen the thin client runs the X server
and the terminal server runs the X client -
Not Syncedand every thin client then has to
handle the font rendering. -
Not SyncedSo I don't know if
this is the only reason, -
Not Syncedbut nowadays server-side font
rendering is not so common. -
Not SyncedProbably not used anymore.
-
Not SyncedNow I have to talk first
about font management. -
Not SyncedIn Linux systems there is
a software called fontconfig, -
Not Syncedwhich manages installed fonts
on the system -
Not Syncedand it configures for example how to
substitute fonts. -
Not SyncedFor example if in a document there's a
font to render a text -
Not Syncedand the font is not
available on the system -
Not Syncedthen in the font config system there can
be rules to replace the font -
Not Syncedwith a similar font.
-
Not SyncedThis is heavily used in Linux systems.
-
Not SyncedThere are also rules for what font to
use if the current selected font -
Not Synceddoesn't contain a character
you want to display. -
Not SyncedYou can see on the picture on the right
that this is also used... -
Not Syncedalthough I have to admit,
-
Not SyncedI had to take this picture on a Debian 5.0
system in LibreOffice -
Not Syncedbecause nowadays
it works a bit different, -
Not Syncedbut this is a good example where
you can see that those characters -
Not Syncedcome from different fonts actually.
-
Not SyncedThere's also a command line tool
which is quite nice. -
Not Syncedfc-match command line tool.
-
Not SyncedSo for example if you want to see what is
the replacement font for, let's say, Arial -
Not Syncedthen you get the output:
okay, it's Nimbus Sans. -
Not SyncedAnd you can also set rendering options,
-
Not Syncedwhich means you can set anti-aliasing
or you can turn off hinting. -
Not SyncedUsually these configurations are stored in
/etc/fonts -
Not Syncedand there is also a per-user configuration
in .config/fontconfig -
Not Syncedand it's in XML file format snippets.
-
Not SyncedIn the picture you can see an example.
-
Not SyncedThis is the replacement rule for
Carlito and Calibri. -
Not SyncedCarlito is a replacement font for the
nowadays often used -
Not SyncedCalibri font from Microsoft.
-
Not SyncedSo this configuration says the one way,
Carlito is the same as Calibri, -
Not Syncedand the other way around.
-
Not SyncedThis is just an example,
-
Not Syncedyou can have a look at /etc/fonts
and a lot of such snippets. -
Not SyncedIt defines how fonts are
displayed on the system. -
Not SyncedAnother thing, and this is the reason
why I had to take the screenshot -
Not Syncedon an older system, there's a piece of
software called HarfBuzz. -
Not SyncedHarfBuzz is Persian for OpenType,
-
Not Syncedso this software relies on the OpenType
font format. -
Not SyncedYou can see on the right side
the HarfBuzz logo -
Not Syncedthat actually says
HarfBuzz in Persian. -
Not SyncedBefore I talked about ligatures,
-
Not SyncedIn some languages ligatures are required
to render fonts correctly -
Not Syncedand this is an example on the left of
Devanagari, which is an Indic script. -
Not SyncedSo if you have the first two characters
combined then this is the rule -
Not Syncedof how to replace those characters
with a third glyph. -
Not SyncedThere were early implementations
by Qt and Pango -
Not Syncedand those were integrated in HarfBuzz.
-
Not SyncedWell those parts are now known as
Harfbuzz Old, -
Not Syncedand the current HarfBuzz is a rewrite.
-
Not SyncedNowaday's it's also used for
the so-called simple script, -
Not Syncedmeaning especially Latin script,
-
Not Syncedand is integrated into Qt, GTK,
LibreOffice, Firefox, Android, and XETEX. -
Not SyncedThis is what I use for the slides here,
-
Not Syncedso all the slides here are
also rendered using HarfBuzz. -
Not SyncedAnd of course the whole
font rendering stack. -
Not SyncedHarfBuzz also has fancy features like
variable widths or weight -
Not Syncedwith only one font or you can define
in the font characters with -
Not Syncedvariable widths and without stepping you
can change it using HarfBuzz. -
Not SyncedThose techniques are used in
client-side rendering. -
Not SyncedOne library often was
until recently often used, Xft. -
Not SyncedWell this is the applications meaning the
X clients render the text -
Not Syncedbased on FreeType and fontconfig.
-
Not SyncedThen the X server
only displays the results. -
Not SyncedWell, there is some caching involved,
-
Not Syncedand it requires
an extension to the protocol. -
Not SyncedIn the widget libraries this was also
used a long time, -
Not Syncedbut now Qt, for example, has it's own
code for font rendering -
Not Syncedbased on HarfBuzz, FreeType,
and fontconfig. -
Not SyncedThere's the combination of
Pango and Cairo, -
Not Syncedwhich is used in the GTK environment.
-
Not SyncedPango derives from Greek and Japanese:
pan means all and go means languages. -
Not SyncedSo this is the background to write
in all languages. -
Not SyncedThis also uses HarfBuzz, FreeType,
and fontconfig. -
Not SyncedAnd if you look at Wayland clients,
they only do client-side rendering. -
Not SyncedTo sum it up, we have a variety of
techniques for text display. -
Not SyncedSome have historical than
practical value nowadays. -
Not SyncedThe modern font rendering stack
is quite complex. -
Not SyncedBut writing is one of the
main interface to computers, -
Not Syncedso developers should be aware
of the complexity. -
Not SyncedKeep that in mind.
-
Not SyncedThank you.
-
Not Synced[applause]
-
Not SyncedAre there any questions?
-
Not Synced[audience] More a request than a question,
I find the topic very interesting -
Not Syncedand I'd like to check it again. I know
your video was not recorded -
Not Syncedor I think it was not recorded...
-
Not Synced[Max] Well it was I think.
-
Not Synced[audience] Okay so nevermind, but still
if you are able to share your presentation -
Not Synced[Max] Yes
-
Not Synced[audience] I would be
very happy to look at it. -
Not Synced[audience] [tests mic] What's the problem
due to the -
Not Syncedcompressed ?? from the software stack
in your open ??. -
Not Synced[Max] The problem of what?
-
Not Synced[audience] What's the problem it came from
this complex software stack -
Not Syncedin your open ??.
-
Not SyncedThere's no problem with that,
or there's some problem -
Not Syncedwith these lot of layers, very lot of
components to render the font. -
Not Synced[Max] Okay, I try to rephrase the question
[question] Please -
Not Synced[Max] What is the reason there is so many
layers in the font rendering stack today. -
Not Synced[Max] Is that correct?
-
Not Synced[audience] And it caused some problem. Do
you know any problem -
Not Syncedwith current rendering system.
-
Not Synced[Max] Colored font rendering system?
-
Not Synced[audience] Current, now.
-
Not Synced[Max] Ah current font-
-
Not Synced[audience 2] The question is
whether the complexity -
Not Syncedmeans that there are
difficulties for developers. -
Not SyncedIs it too complex?
-
Not SyncedDoes that cause problems?
-
Not Synced[Max] Well the complexity is hidden behind
the font rendering stack. -
Not SyncedSo it's a huge collection of software,
-
Not Syncedusually there's HarfBuzz, fontconfig,
and FreeType heavily used nowadays. -
Not SyncedBut it's all encapsulated
in these libraries -
Not Syncedand it's used all over
the free software world -
Not Syncedand it makes it easy to write applications
which are easily translatable. -
Not Synced[audience] Yes but for example,
the fontconfig is not so flexible. -
Not SyncedFor example, when we're using
mainly[?] Japanese -
Not Syncedand other display of the language,
-
Not Syncedthen the font of config chooses the
non-Japanese font like the Chinese one. -
Not SyncedI know some distributions like Ubuntu make
language specific fontconfig file -
Not Syncedfor each language to deal with but
Debian doesn't have such a mechanism. -
Not SyncedSo in my opinion the fontconfig
is a bit terrible so -
Not Syncedis there any ?? meant or hack for it?
-
Not Synced[Max] Okay, the fontconfig system comes
from the time where XML was popular. -
Not Synced[audience] Mhmm
[Max] As you can see. -
Not SyncedWell the problem here is
not so much the software stack -
Not Syncedmore than the Unicode system.
-
Not SyncedSo in the Unicode system there are
same code points for -
Not SyncedJapanese and Chinese characters somewhere
although they have different appearances. -
Not SyncedIn the fontconfig system there are
replacement rules for characters -
Not Syncedand it is just a list and usually Chinese
fonts are listed first. -
Not SyncedSo that is the reason why in the Japanese
language you get Chinese characters -
Not Syncedinstead of Japanese characters.
-
Not SyncedSo I also think there's room to improve
the software stack, yes. -
Not Synced[audience] Thank you.
-
Not Synced[Max] Okay, done. Thank you.
-
Not Synced[applause]
- Title:
- Linux Font Rendering Stack
- Description:
-
Displaying text is the most common interface to convey information from computer systems to humans. On a Linux system there is a variety of techniques for rendering text some of which are used more or less on modern systems. Many of those text rendering techniques originate from different time periods of computing history and rendering text in graphical environments is more complex than often thought off.
We find two approaches in Linux systems for displaying text: - using bitmap fonts designed for fixed resolution displays - rendering text based on scalable glyph shapes using a stack of software components for rasterisation, text shaping and text layout.
This talk will give an overview on the different techniques, software and standards for font rendering on Linux systems in the context of their historical origins.
Speaker: Max Harmathy
At: DebConf18 - Video Language:
- English
- Team:
- Debconf
- Project:
- 2018_debconf18
- Duration:
- 43:31
scribblemaniac edited English subtitles for Linux Font Rendering Stack | ||
scribblemaniac edited English subtitles for Linux Font Rendering Stack | ||
scribblemaniac edited English subtitles for Linux Font Rendering Stack | ||
scribblemaniac edited English subtitles for Linux Font Rendering Stack |