summaryrefslogtreecommitdiff
path: root/doc/context/sources/general/manuals/evenmore/evenmore-fonts.tex
blob: fea3f7ac5ac57b5d35deb6d8bd78127302e925bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
% language=us

\environment evenmore-style

\disabledirectives[fonts.svg.cached]

% \usemodule[scite]
% \usemodule[article-basic]
% \usemodule[abbreviations-logos]

\startcomponent evenmore-fonts

\startchapter[title=Modern Type 3 fonts]

Support for \TYPETHREE\ fonts has been on my agenda for a couple of years now.
Here I will take a look at them from the perspective of \LUAMETATEX. \footnote
{This chapter appeared in \TUGBOAT\ 40:3. Thanks to Karl Berry for corrections.}
The reason is that they might be useful for embedding (for instance) runtime
graphics (such as symbols) in an efficient way. In \TEX\ systems \TYPETHREE\
fonts are normally used for bitmap fonts, the \PK\ output that comes via
\METAFONT. Where for instance \TYPEONE\ fonts are defined using a set of font
specific rendering operators, a \TYPETHREE\ font can contain arbitrary code, in
\PDF\ files these are \PDF\ (graphic and text) operators.

A program like \LUATEX\ supports embedding of several font formats natively. A
quick summary of relevant formats is the following: \footnote {Technically one
can embed anything in the \PDF\ file.}

\startitemize[headintext][headstyle=bold]
\starthead {\TYPEONE:}
    these are outline fonts using \type {cff} descriptions, a compact format for
    storing outlines. Normally up to 256 characters are accessible but a font can
    have many more (as Latin Modern and \TEX\ Gyre demonstrate).
\stophead
\starthead {\OPENTYPE:}
    these also use the \type {cff} format. As with \TYPEONE\ the outlines are
    mostly cubic Bezier curves. Because there is no bounding box data stored in
    the format the engine has to pseudo|-|render the glyphs to get that
    information. When embedding a subset the backend code has to flatten the
    subroutine calls, which is another reason the \type {cff} blob has to be
    disassembled.
\stophead
\starthead {\TRUETYPE:}
    these use the \type {ttf} format which uses quadratic B|-|splines. The font
    can have a separate kerning table and stores information about the bounding
    box (which is then used by \TEX\ to get the right heights and depths of
    glyphs). Of course those details never make it into the \PDF\ file as such.
\stophead
\starthead {\TYPETHREE:}
    as mentioned this format is (traditionally) used to store bitmap fonts but as
    we will see it can do more. It is actually the easiest format to deal with.
\stophead
\stopitemize

In \LUATEX\ any font can be a \quotation {wide} font, therefore in \CONTEXT\ a
\TYPEONE\ font is not treated differently than an \OPENTYPE\ font. The \LUATEX\
backend can even disguise a \TYPEONE\ font as an \OPENTYPE\ font. In the end, as
not that much information ends up in the \PDF\ file, the differences are not that
large for the first three types. The content of a \TYPETHREE\ font is less
predictable but even then it can have for instance a \type {ToUnicode} vector so
it has no real disadvantages in, say, accessibility. In \CONTEXT\ \LMTX, which
uses \LUAMETATEX\ without any backend, all is dealt with in \LUA: loading,
tweaking, applying and embedding.

The difference between \OPENTYPE\ and \TRUETYPE\ is mostly in the kind of curves
and specific data tables. Both formats are nowadays covered by the \OPENTYPE\
specification. If you Google for the difference between these formats you can
easily end up with rather bad (or even nonsense) descriptions. The best
references are \typ {https://en.wikipedia.org/wiki/Bézier_curve} and the
ever|-|improving \typ {https://docs.microsoft.com/en-us/typography} website.

Support for so|-|called variable fonts is mostly demanding of the front|-|end
because in the backend it is just an instance of an \OPENTYPE\ or \TRUETYPE\ font
being embedded. In this case the instance is generated by the \CONTEXT\ font
machinery which interprets the \type {cff} and \type {ttf} binary formats in
doing~so. This feature is not widely used but has been present from the moment
these fonts showed up.

\TYPETHREE\ fonts don't have a particularly good reputation, which is mainly due
to the fact that viewers pay less attention in displaying them, at least that was
the case in the past. If they describe outlines, then all is okay, apart from the
fact that there is no anti|-|aliasing or hinting but on modern computers that is
hardly an issue. For bitmaps the quality depends on the resolution and
traditionally \TEX\ bitmap fonts are generated for a specific device, but if you
use a decent resolution (say 1200 dpi) then all should be okay. The main drawback
is that viewers will render such a font and cache the (then available) bitmap
which in some cases can have a speed penalty.

Using \TYPETHREE\ fonts in a \PDF\ backend is not something new. Already in the
\PDFTEX\ era we were playing with so|-|called \PDF\ glyph containers. In practice
that worked okay but not so much for \METAPOST\ output from \METAFONT\ fonts. As
a side note: it might actually work better now that in \METAFUN\ we have some
extensions for rendering the kind of paths used in fonts. But glyph containers
were dropped long ago already and \TYPETHREE\ was limited to traditional \TEX\
bitmap inclusion. However, in \LUAMETATEX\ it is easier to mess around with fonts
because we no longer need to worry about side effects of patching font related
inclusion (embedding) for other macro packages. All is now under \LUA\ control:
there is no backend included and therefore no awareness of something built|-|in
as \TYPETHREE.

So, as a prelude to the 2019 \CONTEXT\ meeting, I picked up this thread and
turned some earlier experiments into production code. Originally I meant to
provide support for \METAPOST\ graphics but that is still locked in experiments.
I do have an idea for its interface, now that we have more control over user
interfaces in \METAFUN.

In addition to \quote {just graphics} there is another candidate for \TYPETHREE\
fonts \emdash\ extensions to \OPENTYPE\ fonts:

\startitemize[packed,n]
\startitem Color fonts where stacked glyphs are used (a nice method). \stopitem
\startitem Fonts where \SVG\ images are used. \stopitem
\startitem Fonts that come with bitmap representations in \PNG\ format. \stopitem
\stopitemize

It will be no surprise that we're talking of emoji fonts here although the second
category is now also used for regular text fonts. When these fonts showed up
support for them was not that hard to implement and (as often) we could make
\TEX\ be among the first to support them in print (often such fonts are meant for
the web).

For category one, the stacked shapes, the approach was to define a virtual font
where glyphs are flushed while backtracking over the width in order to get the
overlay. Of course color directives have to be injected too. The whole lot is
wrapped in a container that tells a \PDF\ handler what character actually is
represented. Due to the way virtual fonts work, every reference to a character
results in the same sequence of glyph references, (negative) kern operations and
color directives plus the wrapper in the page stream. This is not really an issue
for emoji because these are seldom used and even then in small quantities. But it
can explode a \PDF\ page stream for a color text font. All happens at runtime and
because we use virtual fonts, the commands are assembled beforehand for each
glyph.

For the second category, \SVG\ images, we used a different approach. Each symbol
was converted to \PDF\ using Inkscape and cached for later use. Instead of
injecting a glyph reference, a reference to a so|-|called \type {XForm} is
injected, again with a wrapper to indicate what character we deal with. Here the
overhead is not that large but still present as we need the so|-|called \quote
{actual text} wrapper.

The third category is done in a similar way but this time we use GraphicsMagick
to convert the images beforehand. The drawbacks are the same.

In \CONTEXT\ \LMTX\ a different approach is followed. The \PDF\ stream that
stacks the glyphs of category one makes a perfect stream for a \TYPETHREE\
character. Apart from some juggling to relate a \TYPETHREE\ font to an \OPENTYPE\
font, the page stream just contains references to glyphs (with the proper related
\UNICODE\ slot). The overhead is minimal.

For the second category \CONTEXT\ \LMTX\ uses its built|-|in \SVG\ converter. The
\XML\ code of the shape is converted to (surprise): \METAPOST. We could go
directly to \PDF\ but the \METAPOST\ route is cheap and we can then get support
for color spaces, transformations, efficient paths and high quality all for free.
It also opens up the possibility for future manipulations. The \TYPETHREE\ font
eventually has a sequence of drawing operations, mixed with transformations and
color switches, but only once. Most of the embedded code is shared with the other
categories (a plug|-|in model is used).

The third category follows a similar route but this time we use the built|-|in
\PNG\ inclusion code. Just like the other categories, the page stream only
contains references to glyphs.

It was interesting to find that most of the time related to the inclusion went
into figuring out why viewers don't like these fonts. For instance, in Acrobat
there needs to be a glyph at index zero and all viewers seem to be able to handle
at most 255 additional characters in a font. But once that, and a few more
tricks, had become clear, it worked out quite well. It also helps to set the font
bounding box to all zero values so that no rendering optimizations kick in. Also,
some dimensions can are best used consistently. With \SVG\ there were some issues
with reference points and bounding boxes but these could be dealt with. A later
implementation followed a slightly different route anyway.

The implementation is reasonably efficient because most work is delayed till a
glyph (shape) is actually injected (and most shapes in these fonts aren't used at
all). The viewers that I have installed, Acrobat Reader, Acrobat X, and the
mupdf|-|based Sumatra\PDF\ viewer can all handle the current implementation.

An example of a category one font is \MICROSOFT's \type {seguiemj}. I have no
clue about the result in the future because some of these emoji fonts change
every now and then, depending also on social developments. This is a category one
font which not only has emoji symbols but also normal glyphs:

\startbuffer[1a]
\definefontfeature[colored][default][colr=yes]
\definefont[TestA][file:seguiemj.ttf*colored]
\definesymbol[bug1][\getglyphdirect{file:seguiemj.ttf*colored} {\char"1F41C}]
\definesymbol[bug2][\getglyphdirect{file:seguiemj.ttf*colored} {\char"1F41B}]
\stopbuffer

\typebuffer[1a][option=TEX] \getbuffer[1a]

The example below demonstrates this by showing the graphic glyph surrounded by
the \type {x} from the emoji font, and from a regular text font.

\startbuffer[1b]
{\TestA x\char"1F41C x\char"1F41B x}%
\quad
{x\symbol[bug1]x\symbol[bug2]x}%
\quad
{\showglyphs x\symbol[bug1]x\symbol[bug2]x}%
\stopbuffer

\typebuffer[1b][option=TEX]

\startlinecorrection
\scale[width=\textwidth]{\getbuffer[1b]}
\stoplinecorrection

In this mix we don't use a \TYPETHREE\ font for the characters that don't need
stacked (colorful) glyphs, which is more efficient. So the \type {x} characters
are references to a regular (embedded) \OPENTYPE\ font.

The next example comes from a manual and demonstrates that we can (still)
manipulate colors as we wish.

\startbuffer[1c]
\definecolor[emoji-red]   [r=.4]
\definecolor[emoji-blue]  [b=.4]
\definecolor[emoji-green] [g=.4]
\definecolor[emoji-yellow][r=.4,g=.5]
\definecolor[emoji-gray]  [s=1,t=.5,a=1]

\definefontcolorpalette
  [emoji-red]
  [emoji-red,emoji-gray]

\definefontcolorpalette
  [emoji-green]
  [emoji-green,emoji-gray]

\definefontcolorpalette
  [emoji-blue]
  [emoji-blue,emoji-gray]

\definefontcolorpalette
  [emoji-yellow]
  [emoji-yellow,emoji-gray]

\definefontfeature[seguiemj-r][default][ccmp=yes,dist=yes,colr=emoji-red]
\definefontfeature[seguiemj-g][default][ccmp=yes,dist=yes,colr=emoji-green]
\definefontfeature[seguiemj-b][default][ccmp=yes,dist=yes,colr=emoji-blue]
\definefontfeature[seguiemj-y][default][ccmp=yes,dist=yes,colr=emoji-yellow]

\definefont[MyColoredEmojiR][seguiemj*seguiemj-r]
\definefont[MyColoredEmojiG][seguiemj*seguiemj-g]
\definefont[MyColoredEmojiB][seguiemj*seguiemj-b]
\definefont[MyColoredEmojiY][seguiemj*seguiemj-y]
\stopbuffer

\typebuffer[1c][option=TEX] \getbuffer[1c]

\startbuffer[1d]
\MyColoredEmojiR\resolvedemoji{man}\resolvedemoji{woman}%
\MyColoredEmojiG\resolvedemoji{man}\resolvedemoji{woman}%
\MyColoredEmojiB\resolvedemoji{man}\resolvedemoji{woman}%
\MyColoredEmojiY\resolvedemoji{man}\resolvedemoji{woman}%
\stopbuffer

\startlinecorrection
    \scale[width=\textwidth]{\getbuffer[1d]}
\stoplinecorrection

Let's look in more detail at the woman emoji. On the left we see the default
colors, and on the right we see our own:

\definefontfeature[seguiemj][default][ccmp=yes,dist=yes,colr=yes]
\definefont[MyColoredEmojiD][seguiemj*seguiemj]

\startlinecorrection
\scale[height=2cm]
  {\MyColoredEmojiD\resolvedemoji{woman}%
   \MyColoredEmojiR\resolvedemoji{woman}}
\stoplinecorrection

The multi|-|color variant in \CONTEXT\ \MKIV\ ends up as follows in the page
stream:

\starttyping
/Span << /ActualText <feffD83DDC69> >> BDC
q
0.000 g
BT
/F8 11.955168 Tf
1 0 0 1 0 2.51596 Tm [<045B>]TJ
0.557 0.337 0.180 rg
1 0 0 1 0 2.51596 Tm [<045C>]TJ
1.000 0.784 0.239 rg
1 0 0 1 0 2.51596 Tm [<045D>]TJ
0.000 g
1 0 0 1 0 2.51596 Tm [<045E>]TJ
0.969 0.537 0.290 rg
1 0 0 1 0 2.51596 Tm [<045F>]TJ
0.941 0.227 0.090 rg
1 0 0 1 0 2.51596 Tm [<0460>]TJ
ET
Q
EMC
\stoptyping

and the reddish one becomes:

\starttyping[option=PDF]
/Span << /ActualText <feffD83DDC69> >> BDC
q
0.400 0 0 rg 0.400 0 0 RG
BT
/F8 11.955168 Tf
1 0 0 1 0 2.51596 Tm [<045B>]TJ
1 g 1 G /Tr1 gs
1 0 0 1 0 2.51596 Tm [<045C>1373<045D>1373<045E>1373<045F>1373<0460>]TJ
ET
Q
EMC
\stoptyping

Each time this shape is typeset these sequences are injected. In \CONTEXT\ \LMTX\
we get this in the page stream:

\starttyping[option=PDF]
BT
/F2 11.955168 Tf
1 0 0 1 0 2.515956 Tm [<C8>] TJ
ET
\stoptyping

This time the composed shape ends up in the \TYPETHREE\ character procedure. In
the colorful case (reformatted because it actually is a one|-|liner):

\starttyping[option=PDF]
2812 0 d0
0.000 g              BT /V8 1 Tf [<045B>] TJ ET
0.557 0.337 0.180 rg BT /V8 1 Tf [<045C>] TJ ET
1.000 0.784 0.239 rg BT /V8 1 Tf [<045D>] TJ ET
0.000 g              BT /V8 1 Tf [<045E>] TJ ET
0.969 0.537 0.290 rg BT /V8 1 Tf [<045F>] TJ ET
0.941 0.227 0.090 rg BT /V8 1 Tf [<0460>] TJ ET
\stoptyping

and in the reddish case (where we have a gray transparent color):

\starttyping[option=PDF]
2812 0 d0
0.400 0 0 rg 0.400 0 0 RG
BT /V8 1 Tf [<045B>] TJ ET
1 g 1 G /Tr1 gs
BT /V8 1 Tf [<045C>] TJ ET
BT /V8 1 Tf [<045D>] TJ ET
BT /V8 1 Tf [<045E>] TJ ET
BT /V8 1 Tf [<045F>] TJ ET
BT /V8 1 Tf [<0460>] TJ ET
\stoptyping

but this time we only get these verbose compositions once in the \PDF\ file. We
could optimize the last variant by a sequence of indices and negative kerns but
it hardly pays off. There is no need for \type {ActualText} here because we have
an entry in the \type {ToUnicode} vector:

\starttyping[option=PDF]
<C8> <D83DDC69>
\stoptyping

To be clear, the \type {/V8} is a sort of local reference to a font which can
have an \type {/F8} counterpart elsewhere. These \TYPETHREE\ fonts have their own
resource references and I found it more clear to use a different prefix in that
case. If we only use a few characters of this kind, of course the overhead of
extra fonts has a penalty but as soon we refer to more characters we gain a lot.

When we have \SVG\ fonts, the gain is a bit less. The \PDF\ resulting from the
\METAPOST\ run can of course be large but they are included only once. In \MKIV\
these would be (shared) so|-|called \type {XForm}s. In the page stream we then
see a simple reference to such an \type {XForm} but again wrapped into an \type
{ActualText}. In \LMTX\ we get just a reference to a \TYPETHREE\ character plus
of course an extra font.

The \typ {emojionecolor-svginot} font is somewhat problematic (although maybe in
the meantime it has become obsolete). As usual with new functionality,
specifications are not always available or complete (especially when they are
application specs turned into standards). This is also true with for instance
\SVG\ fonts. The current documentation on the \MICROSOFT\ website is reasonable
and explains how to deal with the viewport but when I first implemented support
for \SVG\ it was more trial and error. The original implementation in \CONTEXT\
used Inkscape to generate \PDF\ files with a tight bounding box and mix that with
information from the font (in \MKIV\ and the generic loader we still use this
method). This results in a reasonable placement for emoji (that often sit on top
of the baseline) but not for characters. More accurate treatment, using the
origin and bounding box, fail for graphics with bad viewports and strange
transform attributes. Now one can of course argue that I read the specs wrong,
but inconsistencies are hard to deal with. Even worse is that successive versions
of a font can demand different hacks. (I would not be surprised if some programs
have built|-|in heuristics for some fonts that apply fixes.) Here is an example:

\starttyping
<svg transform="translate(0 -1788) scale(2.048)" viewBox="0 0 64 64" ...>
    <path d="... all within the viewBox ..." ... />
</svg>
\stoptyping

It is no problem to scale up the image to normal dimensions, often 1000, or 2048
but I've also seen 512. The 2.048 suggests a 2048 unit approach, as does the 1788
shift. Now, we could scale up all dimensions by 1000/64 and then multiply by
2.048 and eventually shift over 1788, but why not scale the 1788 by 2.048 or
scale 64 by 2.048? Even if we can read the standard to suit this specification
it's just a bit too messy for my taste. In fact I tried all reasonable
combinations and didn't (yet) get the right result. In that case it's easier to
just discard the font. If a user complains that it (kind of) worked in the past,
a counter|-|argument can be that other (more recent) fonts don't work otherwise.
In the end we ended up with an option: when the \type {svg} feature value is
\type {fixdepth} the vertical position will be fixed.

\startbuffer[2a]
\definefontfeature[whatever][default][color=yes,svg=fixdepth]
\definefont[TestB][file:emojionecolor-svginot.ttf*whatever]
\stopbuffer

\typebuffer[2a][option=TEX] \getbuffer[2a]

\startbuffer[2b]
x{\TestB \char"1F41C \char"1F41B}x
\stopbuffer

\startlinecorrection
    \scale[height=1cm]{\getbuffer[2b]}
\stoplinecorrection

The newer \type {emojionecolor} font doesn't need this because it has a \type
{viewBox} of \type {0 54.4 64 64} which fixes the baseline.

\startbuffer[2c]
\definefontfeature[whatever][default][color=yes,svg=yes]
\definefont[TestB][file:emojionecolor.otf*whatever]
\stopbuffer

\typebuffer[2c][option=TEX] \getbuffer[2c]

\startlinecorrection
    \scale[height=1cm]{\getbuffer[2b]}
\stoplinecorrection

Another example of a pitfall is running into category one glyphs made from
several pieces that all have the same color. If that color is black, one starts
to wonder what is wrong. In the end the \CONTEXT\ code was doing the right thing
after all, and I would not be surprised if that glyph gets colors in an update of
the font. For that reason it makes no sense to include them as examples here.
After all, we can hardly complain about free fonts (and I'm also guilty of
imposing bugs on users). By the way, for the font referred to here (\type
{twemojimozilla}), another pitfall was that all shapes in my copy had a zero
bounding box which means that although a width is specified, rendering in
documents can give weird side effects. This can be corrected by the \type
{dimensions} feature that forces the ascender and descender values to be used.

\startbuffer[3a]
\definefontfeature[colored:x][default][colr=yes]
\definefontfeature[colored:y][default][colr=yes,dimensions={1,max,max}]
\definefont[TestC][file:twemojimozilla.ttf*colored:x]
\definefont[TestD][file:twemojimozilla.ttf*colored:y]
\stopbuffer

\typebuffer[3a][option=TEX] \getbuffer[3a]

\startbuffer[3b]
{\TestC\char 128028}\quad{\showglyphs\TestC\char 128028}\quad
{\TestD\char 128028}\quad{\showglyphs\TestD\char 128028}
\stopbuffer

\startlinecorrection
    \scale[height=2cm]{\getbuffer[3b]}
\stoplinecorrection

An example of a \PNG|-|enhanced font is the \type {applecoloremoji} font. The
bitmaps are relatively large for the quality they provide and some look like
scans.

\startbuffer[4a]
\definefontfeature[sbix][default][sbix=yes]
\definefont[TestE][file:applecoloremoji.ttc*sbix at 10bp]
\stopbuffer

\typebuffer[4a][option=TEX] \getbuffer[4a]

\startbuffer[4b]
\red \TestE \char 35 \char 9203 \char 9202
\stopbuffer

\startlinecorrection
    \scale[height=1cm]{\getbuffer[4b]}
\stoplinecorrection

As mentioned above, there are fonts that color characters other than emoji. We
give two examples (sometimes fonts are mentioned on the \CONTEXT\ mailing list).

\startbuffer[5a]
\definefontfeature
  [whatever]
  [default,color:svg]
  [script=latn,
   language=dflt]

\definefont[TestF][file:Abelone-FREE.otf*whatever          @ 13bp]
\definefont[TestG][file:Gilbert-ColorBoldPreview5*whatever @ 13bp]
\definefont[TestH][file:ColorTube-Regular*whatever         @ 13bp]
\stopbuffer

\typebuffer[5a][option=TEX] \getbuffer[5a]

Of course one can wonder about the readability of these fonts and unless one used
random colors (which bloats the file immensely) it might become boring, but
typically such fonts are only meant for special purposes.

\startbuffer[5b]
    {\TestF\setupinterlinespace[0.7]\input zapf \par}
\stopbuffer

\startbuffer[5c]
    {\TestG\setupinterlinespace     \input zapf \par}
\stopbuffer

\startbuffer[5d]
    {\TestH\setupinterlinespace[0.7]\input zapf \par}
\stopbuffer

\start \setupalign[tolerant] \getbuffer[5b] \stop

The previous font is the largest and as a consequence also puts some strain on
the viewer, especially when zooming in. But, because viewers cache \TYPETHREE\
shapes it's a one|-|time penalty.

\start \setupalign[tolerant] \getbuffer[5c] \stop

This font is rather lightweight. Contrary to what one might expect, there is no
transparency used (but of course we do support that when needed).

\start \setupalign[tolerant] \getbuffer[5d] \stop

This third example is again rather lightweight. Such fonts normally have a rather
limited repertoire although there are some accented characters included. But they
are not really meant for novels anyway. If you look closely you will also notice
that some characters are missing and kerning is suboptimal.

I considered testing some more fonts but when trying to download some interesting
looking ones I got a popup asking me for my email address in order to subscribe
me to something: a definite no|-|go.

%\section{\SVG\ to MetaPost}

I already mentioned that we have a built|-|in converter that goes from \SVG\ to
\METAPOST. Although this article deals with fonts, the following code
demonstrates that we can also access such graphics in \METAFUN\ itself. The nice
thing is that because we get pictures, they can be manipulated.

\startbuffer
\startMPcode{doublefun}
    picture p ; p := lmt_svg [ filename = "mozilla-svg-001.svg" ] ;
    numeric w ; w := bbwidth(p) ;
    draw p ;
    draw p xscaled -1 shifted (2.5*w,0);
    draw p rotatedaround(center p,45) shifted (3.0*w,0) ;
    draw image (
        for i within p : if filled i :
            draw pathpart i withcolor green ;
        fi endfor ;
    ) shifted (4.5*w,0);
    draw image (
        for i within p : if filled i :
            fill pathpart i withcolor red withtransparency (1,.25) ;
        fi endfor ;
    ) shifted (6*w,0);
\stopMPcode
\stopbuffer

\typebuffer[option=TEX]

This graphic is a copy from a glyph from an emoji font, so we have plenty of such
images to play with. The above manipulations result in:

\startlinecorrection
    \getbuffer
\stoplinecorrection

Now that we're working with \METAPOST\ we may as well see if we can also load a
specific glyph, and indeed this is possible.

\startbuffer[1]
\startMPcode{doublefun}
    picture lb, rb ;
    lb := lmt_svg [ fontname = "Gilbert-ColorBoldPreview5", unicode = 123 ] ;
    rb := lmt_svg [ fontname = "Gilbert-ColorBoldPreview5", unicode = 125 ] ;
    numeric dx ; dx := 1.25 * bbwidth(lb) ;
    draw lb ;
    draw rb shifted (dx,0) ;
    pickup pencircle scaled 2mm ;
    for i within lb :
        draw lmt_arrow [
            path        = pathpart i,
            pen         = "auto",
            alternative = "curved",
            penscale    = 8
        ]
            shifted (3dx,0)
            withcolor "darkblue"
            withtransparency (1,.5)
        ;
    endfor ;
    for i within rb :
        draw lmt_arrow [
            path        = pathpart i,
            pen         = "auto",
            alternative = "curved",
            penscale    = 8
        ]
            shifted (4dx,0)
            withcolor "darkred"
            withtransparency (1,.5)
        ;
    endfor ;
\stopMPcode
\stopbuffer

% Ok, I should make a macro ...

\startbuffer[2]
\startMPcode{doublefun}
    picture lb, rb ;
    lb := lmt_svg [ fontname = "Gilbert-ColorBoldPreview5", unicode = 42 ] ;
    rb := lmt_svg [ fontname = "Gilbert-ColorBoldPreview5", unicode = 64 ] ;
    numeric dx ; dx := 1.25 * bbwidth(lb) ;
    draw lb ;
    draw rb shifted (dx,0) ;
    pickup pencircle scaled 2mm ;
    for i within lb :
        draw lmt_arrow [
            path        = pathpart i,
            pen         = "auto",
            alternative = "curved",
            penscale    = 6
        ]
            shifted (3.5dx,0)
            withcolor "darkgreen"
            withtransparency (1,.5)
        ;
    endfor ;
    for i within rb :
        draw lmt_arrow [
            path        = pathpart i,
            pen         = "auto",
            alternative = "curved",
            penscale    = 6
        ]
            shifted (4.5dx,0)
            withcolor "darkyellow"
            withtransparency (1,.5)
        ;
    endfor ;
\stopMPcode
\stopbuffer

\typebuffer[1][option=TEX]

Here we first load two character shapes from a font. The \UNICODE\ slots (which
here are the same as the \ASCII\ slots) might look familiar: they indicate the
curly brace characters. We get two pictures and use the \type {within} loop to
run over the paths within these shapes. Each shape is made from three curves. As
a bonus a few more characters are shown.

\startlinecorrection
    \dontleavehmode
    \scale[height=3cm]{\getbuffer[1]}%
    \quad\quad\quad\quad
    \scale[height=3cm]{\getbuffer[2]}
\stoplinecorrection

It is not hard to imagine that a collection of such graphics could be made into a
font (at runtime). One only needs to find the motivation. Of course one can
always use a font editor (or Inkscape) and tweak there, which probably makes more
sense, but sometimes a bit of \METAPOST\ hackery is a nice distraction. Editing
the \SVG\ code directly is not that much fun. The overall structure often doesn't
look that bad (apart from often rather redundant grouping):

\starttyping[option=XML]
<svg xmlns="http://www.w3.org/2000/svg">
    <path fill="#d87512" d="..."/>
    <g fill="#bc600d">
        <path d="..."/>
    </g>
    <g fill="#d87512">
        <path d="..."/>
        <path d="..."/>
    </g>
    <g fill="#bc600d">
        <path d="..."/>
    </g>
    ...
</svg>
\stoptyping

In addition to \type {path}s there can be \type {line}, \type {circle} and
similar elements but often fonts just use the \type {path} element. This element
has a \type {d} attribute that holds a sequence of one character commands that
each can be followed by numbers. Here are the start characters of four such
attributes:

\starttyping
M11.585 43.742s.387 1.248.104 3.05c0 0 2.045-.466 1.898-2.27 ...
M53.33 39.37c0-4.484-35.622-4.484-35.622 0 0 10.16.05 ...
M42.645 56.04c1.688 2.02 9.275.043 10.504-2.28 5.01-9.482-.006 ...
M54.2 41.496s-.336 4.246-4.657 9.573c0 0 4.38-1.7 5.808-4.3 ...
\stoptyping

Indeed, numbers can be pasted together, also with the operators, which doesn't
help with seeing at a glance what happens. Probably the best reference can be
found at \typ {https://developer.mozilla.org/en-US/docs/Web/SVG} where it is
explained that a path can have move, line, curve, arc and other operators, as
well use absolute and relative coordinates. How that works is for another
article.

How would the \TEX\ world look like today if Don Knuth had made \METAFONT\
support colors? Of course one can argue that it is a bitmap font generator, but
in our case using high resolution bitmaps might even work out better. In the
example above the first text fragment uses a font that is very inefficient: it
overlays many circles in different colors with slight displacements. Here a
bitmap font would not only give similar effects but probably also be more
efficient in terms of storage as well as rendering. The \METAPOST\ successor does
support color and with \MPLIB\ in \LUATEX\ we can keep up quite well \unknown\ as
hopefully has been demonstrated here.


% It's no fun messing with these things that survive only for short time before
% being replaced by the next hyped fashion. Typical work than one needs to be paid
% for but never is.

\stopchapter

\stopcomponent