summaryrefslogtreecommitdiff
path: root/tex/context/base/mkxl/meta-imp-threesix.mkxl
blob: 56a400b45c013bda8f9182cd1547efee873595b4 (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
%D \module
%D   [       file=meta-imp-threesix,
%D        version=2019.00.00,
%D          title=\METAPOST\ Graphics,
%D       subtitle=Don Knuths ThreeSix font,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

%D The design of the font is if course by Don Knuth and can be found in facs9b.ps. I
%D wish I was clever enough to understand all the good stuff in there.

\startluacode
    local unpack = unpack
    local concat = table.concat
    local gsub, gmatch, utfbyte = string.gsub, string.gmatch, utf.byte

    local font36 = {
        ["0"] = [[00111100 01111110 11000011 11000011 11000011 11000011 01111110 00111100]],
        ["1"] = [[00011100 11111100 11101100 00001100 00001100 00001100 11111111 11111111]],
        ["2"] = [[00111110 01110011 01110011 00000011 00001110 00111000 11110001 11111111]],
        ["3"] = [[01111110 01100110 00000110 00111100 00000110 11100111 11100111 01111110]],
        ["4"] = [[00001110 00011110 00110110 01100110 11111111 11111111 00000110 00001110]],
        ["5"] = [[01111110 01111110 01000000 01111100 01000111 00000011 11000111 11111110]],
        ["6"] = [[01111110 01100110 11000000 11011100 11100110 11000011 01100011 01111110]],
        ["7"] = [[11111111 11111111 10000111 10001110 00011100 00011100 00011100 00011100]],
        ["8"] = [[01111110 01100110 01100110 00111100 11000011 11000011 11000011 01111110]],
        ["9"] = [[01111110 11000110 11000011 01100111 00111011 00000011 01100110 01111110]],
        ["A"] = [[000110000 000111000 001111100 001101100 011001110 011111110 010000110 111100111]],
        ["B"] = [[1111100 1110110 0110110 0111100 0110011 0110011 1110011 1111100]],
        ["C"] = [[01111101 11110011 11100001 11100001 11100000 11100000 11100001 01111110]],
        ["D"] = [[11111100 11100010 01100011 01100011 01100011 01100011 11100010 11111100]],
        ["E"] = [[1111111 1110001 0110101 0111100 0110100 0110001 1110001 1111111]],
        ["F"] = [[11111111 11100001 01100101 01111100 01100100 01100000 11111000 11111000]],
        ["G"] = [[01111010 11100110 11100010 11100000 11100111 11100010 11100010 01111100]],
        ["H"] = [[11100111 11100111 01000010 01111110 01000010 01000010 11100111 11100111]],
        ["I"] = [[1111111 1111111 0011000 0011000 0011000 0011000 1111111 1111111]],
        ["J"] = [[01111111 01111111 00000110 00000110 11110110 01100110 01100110 00111100]],
        ["K"] = [[11101110 11100100 01101000 01110000 01111000 01101100 11100110 11101111]],
        ["L"] = [[111111000 111111000 011000000 011000000 011000000 011000011 111000011 111111111]],
        ["M"] = [[1100000011 1110000111 0111111110 0100110010 0100110010 0100000010 1100000011 1100000011]],
        ["N"] = [[11000011 11100011 01110010 01111010 01011110 01001110 11100110 11100010]],
        ["O"] = [[01111110 11000011 11000011 11000011 11000011 11000011 11000011 01111110]],
        ["P"] = [[11111110 11100011 01100011 01111110 01100000 01100000 11111000 11111000]],
        ["Q"] = [[01111100 11000110 11000110 11000110 11000110 11001110 11000110 01111101]],
        ["R"] = [[11111100 11100110 01100110 01111100 01101000 01100100 11100010 11100111]],
        ["S"] = [[01111110 11100001 11100001 01111000 00011110 10000111 11000011 10111110]],
        ["T"] = [[1111111111 1100110011 1100110011 0000110000 0000110000 0000110000 0001111000 0001111000]],
        ["U"] = [[111101111 111101111 011000010 011000010 011000010 011000010 011000010 001111100]],
        ["V"] = [[11111000111 11111000111 01110000010 00110000100 00111000100 00011001000 00001101000 00001110000]],
        ["W"] = [[111000000111 111000000111 110000000010 011000000100 011001000100 001101101000 001101101000 000110110000]],
        ["X"] = [[1111001110 1111000110 0001101000 0000110000 0000110000 0001011000 0110001111 0111001111]],
        ["Y"] = [[111100011 111100011 011000010 001110100 000111000 000011000 001111110 001111110]],
        ["Z"] = [[11111111 10000111 00001110 00011100 00111000 01110000 11100001 11111111]],
    }

    local f_code  = string.formatters["ThreeSix(%s);"]
    local replace = { ["0"] = "N;", ["1"] = "Y;", [" "] = "L;" }

    local function remap(str)
        -- permit abundant spacing (bonus)
        str = gsub(str,"%s+", " ")
        -- remap what we got to macro calls
        str = gsub(str,".",replace)
        -- return the result
        return str
    end

    function MP.registerthreesix(name)
        fonts.dropins.registerglyphs {
            name     = name,
            units    = 12,
            usecolor = true,
            preamble = "InitializeThreeSix;",
        }
        for u, v in table.sortedhash(font36) do
            local data   = remap(v)
            local ny     = 8
            local nx     = ((#v + 1) // ny) - 1
            local height = ny * 1.1 - 0.1
            local width  = nx * 1.1 - 0.1
            fonts.dropins.registerglyph {
                category = name,
                unicode  = utfbyte(u),
                width    = width,
                height   = height,
                code     = f_code(data),
            }
        end
    end
    MP.registerthreesix("fontthreesix")
\stopluacode

\startMPcalculation{simplefun}
    def InitializeThreeSix =
        save Y, N, L, S ;
        save shape, fillcolor, mypen, random, threesixpen, spread, hoffset ;
        string shape, fillcolor, mypen ; boolean random ; pen threesixpen ;
        shape       := getparameterdefault "mpsfont" "shape"  "circle" ;
        random      := hasoption           "mpsfont" "random" "true" ;
        fillcolor   := getparameterdefault "mpsfont" "color"  "" ;
        mypen       := getparameterdefault "mpsfont" "pen"    "" ;
        spread      := getparameterdefault "mpsfont" "spread" 0 ;
        hoffset     := 12 * spread / 2 ;
        threesixpen := pencircle
            if mypen = "fancy" :
                xscaled 1/20 yscaled 2/20 rotated 45
            else :
                scaled 1/20
            fi ;
        if shape == "square" :
            def S =
                unitsquare if random : randomized 1/10 fi
                shifted (nx,ny)
            enddef ;
        elseif shape = "diamond" :
            def S =
                unitdiamond if random : randomized 1/10 fi
                shifted (nx,ny)
            enddef ;
        else :
            def S =
                unitcircle if random : randomizedcontrols 1/20 fi
                shifted (nx,ny)
            enddef ;
        fi ;
        if fillcolor = "" :
            def N =
                nx := nx + dx ;
                draw S ;
            enddef ;
        else :
            def N =
                nx := nx + dx ;
                draw S withcolor "lightgray" ;
            enddef ;
        fi ;
        if fillcolor = "random" :
            def Y =
                nx := nx + dx ;
                fillup S withcolor white randomized (2/3,2/3,2/3) ;
            enddef ;
        elseif fillcolor = "" :
            def Y =
                nx := nx + dx ;
                fillup S ;
            enddef ;
        else :
            def Y =
                nx := nx + dx ;
                fillup S withcolor fillcolor ;
            enddef ;
        fi ;
        def L =
            nx := - dx ;
            ny := ny + dy ;
        enddef ;
    enddef ;

    vardef ThreeSix (text code) =
        save dx, dy, nx, ny ;
        dx :=   11/10 ;
        dy := - 11/10 ;
        nx := - dx ;
        ny :=   0 ;
        pickup threesixpen ;
        draw image (code) shifted (hoffset,-ny) ;
    enddef ;
\stopMPcalculation

\definefontfeature % black and white, with some spread
  [fontthreesix]
  [default]
  [metapost=fontthreesix]

\definefontfeature % color, with some spread
  [fontthreesix-tweak]
  [default]
  [metapost={category=fontthreesix,spread=.1}]

\definefontfeature % color, with some spread
  [fontthreesix-color]
  [default]
  [metapost={category=fontthreesix,shape=diamond,color=random,pen=fancy,spread=.1}]

\definefontfeature % color, tight
  [fontthreesix-initial]
  [metapost={category=fontthreesix,color=random,shape=circle}] % units?

\definefont[DEKFontA][Serif*fontthreesix]
\definefont[DEKFontB][Serif*fontthreesix-color]
\definefont[DEKFontC][Serif*fontthreesix-initial]
\definefont[DEKFontD][Serif*fontthreesix-tweak]

\continueifinputfile{meta-imp-threesix.mkxl}

\starttext

\definefontfeature % color, with some spread
  [fontthreesix-color]
  [default]
  [metapost={category=fontthreesix,shape=diamond,color=random,pen=fancy,spread=.1,random=yes}]

\definefont[DEKFontA][Serif*fontthreesix-color @ 200pt]
\definefont[DEKFontB][Serif*fontthreesix-color @  60pt]

% Or course:

\startTEXpage
    \DEKFontA TEX
\stopTEXpage

\startTEXpage
    \DEKFontA T\kern-0.05em\lower.75\exheight\hbox{E}\kern-.05emX
\stopTEXpage

% One of the \CONTEXT\ 2020 posters (inspired by NewYork State AC's press
% conferences as these keywords apply quite well to the audience of the
% meeting):

% \startTEXpage[align={lohi,middle,nothyphenated},offset=20pt]
%     \offinterlineskip                                             \vskip10pt
%     \DEKFontA T\kern-0.05em\lower.75\exheight\hbox{E}\kern-.05emX \vskip60pt
%     \DEKFontB TOUGH                                               \vskip20pt
%               SMART                                               \vskip20pt
%               UNITED                                              \vskip20pt
%               DISCIPLINED                                         \vskip20pt
%               LOVING                                              \vskip10pt
% \stopTEXpage

\startpagemakeup
    \setupalign[middle,nothyphenated]
    \offinterlineskip                                             \vfil\vfil
    \DEKFontA T\kern-0.05em\lower.75\exheight\hbox{E}\kern-.05emX \vfil\vfil\vfil
    \DEKFontB TOUGH                                               \vfil
              SMART                                               \vfil
              UNITED                                              \vfil
              DISCIPLINED                                         \vfil
              LOVING                                              \vfil
\stoppagemakeup

\stoptext