Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

in-progress work

  • Loading branch information...
commit c14e25ea8d668085a27788ebb3dd0602af321edd 1 parent ca9a50d
authored December 24, 2010
5  Font-BuiltIn/BuiltIn.xs
@@ -28,7 +28,7 @@ i_bif_new(face)
28 28
 	const char *face
29 29
 
30 30
 int
31  
-i_bif_text(font, im, tx, ty, size, cl, text_sv, align, utf8)
  31
+i_bif_text(font, im, tx, ty, size, cl, text_sv, align, utf8=0, dir=0)
32 32
 	Imager::Font::BI font
33 33
 	Imager::ImgRaw im
34 34
 	int tx
@@ -38,6 +38,7 @@ i_bif_text(font, im, tx, ty, size, cl, text_sv, align, utf8)
38 38
 	SV *text_sv
39 39
 	int align
40 40
 	int utf8
  41
+	int dir
41 42
       PREINIT:
42 43
 	char *text;
43 44
 	STRLEN len;
@@ -48,7 +49,7 @@ i_bif_text(font, im, tx, ty, size, cl, text_sv, align, utf8)
48 49
         }
49 50
 #endif
50 51
 	text = SvPV(text_sv, len);
51  
-	RETVAL = i_bif_text(font, im, tx, ty, size, cl, text, len, align, utf8);
  52
+	RETVAL = i_bif_text(font, im, tx, ty, size, cl, text, len, align, utf8, dir);
52 53
       OUTPUT:
53 54
 	RETVAL
54 55
 
9  Font-BuiltIn/Makefile.PL
@@ -6,7 +6,7 @@ my %opts =
6 6
   (
7 7
    NAME => 'Imager::Font::BuiltIn',
8 8
    VERSION_FROM => 'BuiltIn.pm',
9  
-   OBJECT => 'BuiltIn.o imbif.o',
  9
+   OBJECT => 'BuiltIn.o imbif.o tiny.o',
10 10
    INC => '-I..',
11 11
   );
12 12
 my $MM_ver = eval $ExtUtils::MakeMaker::VERSION;
@@ -17,4 +17,11 @@ if ($MM_ver > 6.06) {
17 17
 
18 18
 WriteMakefile(%opts);
19 19
 
  20
+sub MY::postamble {
  21
+  return <<'MAKE'
20 22
 
  23
+tiny.c : tiny8.imf immkfont.pl
  24
+	perl immkfont.pl tiny
  25
+
  26
+MAKE
  27
+}
201  Font-BuiltIn/imbif.c
... ...
@@ -1,21 +1,48 @@
1 1
 #include "imbif.h"
2 2
 #include <string.h>
3 3
 #include "imext.h"
  4
+#include "tiny.h"
  5
+#include <math.h>
4 6
 
5 7
 struct i_bif_handle_tag {
6  
-  int dummy;
  8
+  i_bif_face const *face;
7 9
 };
8 10
 
  11
+static i_bif_face const *faces[] = {
  12
+  &i_face_tiny
  13
+};
  14
+
  15
+static int face_count = sizeof(faces) / sizeof(*faces);
  16
+
9 17
 i_bif_handle *
10 18
 i_bif_new(const char *name) {
11 19
   i_bif_handle *font;
  20
+  const i_bif_face *found_face = NULL;
  21
+  int i;
  22
+
12 23
   i_clear_error();
13  
-  if (!name || strcmp(name, "bitmap")) {
14  
-    i_push_error(0, "Unknown face");
  24
+  if (!name) {
  25
+    i_push_error(0, "No face specified");
  26
+    return NULL;
  27
+  }
  28
+
  29
+  for (i = 0; i < face_count; ++i) {
  30
+    i_bif_face const * face = faces[i];
  31
+    if (stricmp(face->name, name) == 0) {
  32
+      found_face = face;
  33
+      break;
  34
+    }
  35
+  }
  36
+
  37
+  if (!found_face) {
  38
+    i_push_errorf(0, "Face %s not found", name);
15 39
     return NULL;
16 40
   }
17 41
 
18  
-  return mymalloc(sizeof(i_bif_handle));
  42
+  font = mymalloc(sizeof(i_bif_handle));
  43
+  font->face = found_face;
  44
+
  45
+  return font;
19 46
 }
20 47
 
21 48
 void
@@ -23,8 +50,170 @@ i_bif_destroy(i_bif_handle *font) {
23 50
   myfree(font);
24 51
 }
25 52
 
26  
-extern int i_bif_bbox(i_bif_handle *handle, double size, char const *text, int len, int utf8, int *bbox);
27  
-extern int i_bif_text(i_bif_handle *handle, i_img *im, int tx, int ty, double size, i_color *cl, const char *text, int len, int align, int utf8);
  53
+static
  54
+const i_bif_font *
  55
+_find_font(i_bif_handle *handle, int size) {
  56
+  i_bif_face const *face = handle->face;
  57
+  int i;
  58
+  for (i = 0; i < face->font_count; ++i) {
  59
+    if (face->fonts[i]->size >= size) {
  60
+      return face->fonts[i];
  61
+    }
  62
+  }
  63
+
  64
+  return NULL;
  65
+}
  66
+
  67
+static
  68
+const i_bif_glyph *
  69
+_find_glyph(i_bif_font const *font, int code) {
  70
+  /* linear for now */
  71
+  int i = 0;
  72
+  while (i < font->char_count) {
  73
+    if (font->chars[i].ch == code)
  74
+      return font->chars[i].glyph;
  75
+    ++i;
  76
+  }
  77
+
  78
+  return font->default_glyph;
  79
+}
  80
+
  81
+int 
  82
+i_bif_bbox(i_bif_handle *handle, double size, char const *text, int len, int utf8, int *bbox) {
  83
+  int isize = ceil(size);
  84
+  i_bif_font const * font = _find_font(handle, isize);
  85
+  int width = 0;
  86
+  int advance = 0;
  87
+  int ascent = 0;
  88
+  int descent = 0;
  89
+  int neg_width = 0;
  90
+  int rightb = 0;
  91
+  int i;
  92
+
  93
+  if (!font) {
  94
+    i_push_errorf(0, "No size %d font found", isize);
  95
+    return 0;
  96
+  }
  97
+
  98
+  if (len) {
  99
+    const char *p = text;
  100
+    const i_bif_glyph *glyph;
  101
+    
  102
+    while (len) {
  103
+      unsigned long c;
  104
+      if (utf8) {
  105
+	c = i_utf8_advance(&p, &len);
  106
+	if (c == ~0UL) {
  107
+	  i_push_error(0, "invalid UTF8 character");
  108
+	  return 0;
  109
+	}
  110
+      }
  111
+      else {
  112
+	c = (unsigned char)*text++;
  113
+	--len;
  114
+      }
  115
+
  116
+      glyph = _find_glyph(font, c);
  117
+      advance += glyph->advance;
  118
+      if (glyph->baseline > ascent)
  119
+	ascent = glyph->baseline;
  120
+      if (glyph->baseline - glyph->height > descent)
  121
+	descent = glyph->baseline - glyph->height;
  122
+      neg_width = glyph->offset;
  123
+    }
  124
+    
  125
+    /* get rightb from the last char processed */
  126
+    rightb = glyph->advance - glyph->width - glyph->offset;
  127
+  }
  128
+
  129
+  bbox[BBOX_GLOBAL_DESCENT] = font->descent;
  130
+  bbox[BBOX_GLOBAL_ASCENT] = font->ascent;
  131
+  bbox[BBOX_ADVANCE_WIDTH] = advance;
  132
+  bbox[BBOX_NEG_WIDTH] = neg_width;
  133
+  bbox[BBOX_POS_WIDTH] = width - (rightb < 0 ? rightb : 0);
  134
+  bbox[BBOX_DESCENT] = descent;
  135
+  bbox[BBOX_ASCENT] = ascent;
  136
+  bbox[BBOX_RIGHT_BEARING] = rightb;
  137
+
  138
+  return BBOX_RIGHT_BEARING + 1;
  139
+}
  140
+
  141
+const int dir_cos[4] = { 1, 0, -1, 0 };
  142
+const int dir_sin[4] = { 0, 1, 0, -1 };
  143
+
  144
+int 
  145
+i_bif_text(i_bif_handle *handle, i_img *im, int tx, int ty, double size, i_color *cl, const char *text, int len, int align, int utf8, int dir) {
  146
+  int isize = ceil(size);
  147
+  i_bif_font const * font = _find_font(handle, isize);
  148
+  int dcos, dsin;
  149
+
  150
+  if (!font) {
  151
+    i_push_errorf(0, "No size %d font found", isize);
  152
+    return 0;
  153
+  }
  154
+
  155
+  dir = dir & 3;
  156
+  dcos = dir_cos[dir];
  157
+  dsin = dir_sin[dir];
  158
+
  159
+  if (len) {
  160
+    const char *p = text;
  161
+    while (len) {
  162
+      const i_bif_glyph *glyph;
  163
+      unsigned long c;
  164
+      int px, py;
  165
+      int outx, outy;
  166
+      int width_bytes;
  167
+      unsigned char *gbyte;
  168
+
  169
+      if (utf8) {
  170
+	c = i_utf8_advance(&p, &len);
  171
+	if (c == ~0UL) {
  172
+	  i_push_error(0, "invalid UTF8 character");
  173
+	  return 0;
  174
+	}
  175
+      }
  176
+      else {
  177
+	c = (unsigned char)*text++;
  178
+	--len;
  179
+      }
  180
+
  181
+      glyph = _find_glyph(font, c);
  182
+      width_bytes = (glyph->width + 7) / 8;
  183
+      
  184
+      outy = ty - glyph->baseline;
  185
+      gbyte = glyph->data;
  186
+      for (py = 0; py < glyph->height; ++py) {
  187
+	if (outy >= 0 && outy < im->ysize) {
  188
+	  outx = tx;
  189
+	  for (px = 0; px < width_bytes; ++px) {
  190
+	    unsigned char b = *gbyte++;
  191
+	    if (b) {
  192
+	      unsigned char mask = 0x80;
  193
+	      while (mask) {
  194
+		if (b & mask)
  195
+		  i_ppix(im, outx, outy, cl);
  196
+		++outx;
  197
+		mask >>= 1;
  198
+	      }
  199
+	    }
  200
+	    else {
  201
+	      outx += 8;
  202
+	    }
  203
+	  }
  204
+	}
  205
+	else
  206
+	  gbyte += width_bytes;
  207
+	++outy;
  208
+      }
  209
+
  210
+      tx += glyph->advance;
  211
+    }
  212
+  }
  213
+
  214
+  return 1;
  215
+}
  216
+
28 217
 extern int i_bif_has_chars(i_bif_handle *handle, char const *test, int len, int utf8, char *out);
29 218
 extern int i_bif_face_name(i_bif_handle *handle, char *name_buf, size_t name_buf_size);
30 219
 
2  Font-BuiltIn/imbif.h
@@ -10,7 +10,7 @@ extern i_bif_handle *i_bif_new(const char *name);
10 10
 extern void i_bif_destroy(i_bif_handle *handle);
11 11
 
12 12
 extern int i_bif_bbox(i_bif_handle *handle, double size, char const *text, int len, int utf8, int *bbox);
13  
-extern int i_bif_text(i_bif_handle *handle, i_img *im, int tx, int ty, double size, i_color *cl, const char *text, int len, int align, int utf8);
  13
+extern int i_bif_text(i_bif_handle *handle, i_img *im, int tx, int ty, double size, i_color *cl, const char *text, int len, int align, int utf8, int dir);
14 14
 extern int i_bif_has_chars(i_bif_handle *handle, char const *test, int len, int utf8, char *out);
15 15
 extern int i_bif_face_name(i_bif_handle *handle, char *name_buf, size_t name_buf_size);
16 16
 
14  Font-BuiltIn/imbiff.h
... ...
@@ -1,6 +1,8 @@
1 1
 #ifndef IMBIFF_H_
2 2
 #define IMBIFF_H_
3 3
 
  4
+#include <stddef.h>
  5
+
4 6
 typedef struct {
5 7
   /* width and height of the  glyph */
6 8
   int width;
@@ -10,16 +12,16 @@ typedef struct {
10 12
      char is below the baseline */
11 13
   int baseline;
12 14
 
13  
-  /* distance from the draw point 
  15
+  /* distance from the draw point */
14 16
   int offset;
15 17
   int advance;
16  
-  unsigned char *data;
  18
+  const unsigned char *data;
17 19
   size_t data_size;
18 20
 } i_bif_glyph;
19 21
 
20 22
 typedef struct {
21 23
   int ch;
22  
-  i_bif_glyph *glyph;
  24
+  const i_bif_glyph *glyph;
23 25
 } i_bif_mapping;
24 26
 
25 27
 typedef struct {
@@ -32,14 +34,16 @@ typedef struct {
32 34
 
33 35
   int xwidth;
34 36
 
35  
-  i_bif_mapping *chars;
  37
+  const i_bif_glyph *default_glyph;
  38
+
  39
+  const i_bif_mapping *chars;
36 40
   size_t char_count;
37 41
 } i_bif_font;
38 42
 
39 43
 typedef struct {
40 44
   const char *name;
41 45
 
42  
-  i_bif_font *fonts;
  46
+  const i_bif_font * const *fonts;
43 47
   size_t font_count;
44 48
 } i_bif_face;
45 49
 
70  Font-BuiltIn/immkfont.pl
@@ -17,7 +17,7 @@
17 17
 #define \U$in\E_H_
18 18
 #include "imbiff.h"
19 19
 
20  
-extern i_bif_face i_face_$in;
  20
+extern const i_bif_face i_face_$in;
21 21
 
22 22
 #endif
23 23
 EOS
@@ -29,13 +29,13 @@
29 29
 
30 30
 my @fonts;
31 31
 
32  
-for my $file (glob "$in*.img") {
  32
+for my $file (glob "$in*.imf") {
33 33
   my %font;
34 34
   
35 35
   my %glyphs;
36 36
   my %chars;
37 37
   
38  
-  open IN, "< $in"
  38
+  open IN, "< $file"
39 39
     or die "Could not open $in: $!\n";
40 40
   
41 41
   # load in the global font info
@@ -43,7 +43,7 @@
43 43
     /\S/ or last;
44 44
 
45 45
     chomp;
46  
-    my ($key, $value) = split /:/, $_, 2;
  46
+    my ($key, $value) = split /: */, $_, 2;
47 47
     $font{$key} = $value;
48 48
   }
49 49
   
@@ -52,7 +52,7 @@
52 52
   }
53 53
   my $size = $font{size};
54 54
   unless ($font{name} eq $in) {
55  
-    print STDERR "Skipping $file, $font{name} != $in\n";
  55
+    print STDERR "Skipping $file, '$font{name}' != '$in'\n";
56 56
     next;
57 57
   }
58 58
   
@@ -60,6 +60,7 @@
60 60
   $font{descender} = 0;
61 61
   $font{advance} = 0;
62 62
   $font{height} = 0;
  63
+  my $defname;
63 64
   
64 65
   # work through the glyphs
65 66
   while (1) {
@@ -155,17 +156,25 @@
155 156
     $glyph{descender} = @design - $baseline;
156 157
     $glyph{height} = @design;
157 158
     $glyph{design} = \@design;
158  
-    for my $key (qw/descender ascender advance height/) {
  159
+    for my $key (qw/descender advance height/) {
  160
+      defined $glyph{$key} or die "Bad $key in $char\n";
159 161
       $glyph{$key} > $font{$key}
160 162
 	and $font{$key} = $glyph{$key};
161 163
     }
  164
+    $glyph{baseline} > $font{ascender}
  165
+      and $font{ascender} = $glyph{baseline};
  166
+
  167
+    if (exists $glyph{default}) {
  168
+      $defname = $name;
  169
+    }
  170
+
162 171
     $glyphs{$name} = \%glyph;
163 172
   }
164 173
   
165 174
   for my $glyph (@glyphs{sort keys %glyphs}) {
166 175
     my $line_bytes = ($glyph->{width} + 7) / 8;
167 176
     my @bytes;
168  
-    print CSRC "static unsigned char\ndesign_$glyph->{name}\[\] = \n{\n";
  177
+    print CSRC "static unsigned char\ndesign_$glyph->{name}_$size\[\] = \n{\n";
169 178
     for my $row (@{$glyph->{design}}) {
170 179
       print CSRC "  ";
171 180
       my $byte = 0;
@@ -190,49 +199,54 @@
190 199
     print CSRC <<EOS;
191 200
 static i_bif_glyph
192 201
 glyph_$glyph->{name}_$size = {
193  
-  $glyph->{width},
194  
-  $glyph->{height},
195  
-  $glyph->{baseline},
196  
-  $glyph->{offset},
197  
-  $glyph->{advance},
198  
-  design_$glyph->{name}_$size,
  202
+  $glyph->{width}, /* width */
  203
+  $glyph->{height}, /* height */
  204
+  $glyph->{baseline}, /* ascent */
  205
+  $glyph->{offset}, /* offset */
  206
+  $glyph->{advance}, /* advance */
  207
+  design_$glyph->{name}_$size, /* bits */
199 208
   sizeof(design_$glyph->{name}_$size),
200 209
 };
201 210
 
202 211
 EOS
203 212
   }
204 213
 
205  
-  print CSRC "static i_bif_mapping\nmapping_$size[] =\n{\n";
  214
+  print CSRC "static i_bif_mapping\nmapping_${size}[] =\n{\n";
206 215
   for my $glyph (@glyphs{sort { ord($glyphs{$a}{char}) <=> ord($glyphs{$b}{char}) } keys %glyphs}) {
207  
-    printf CSRC "  { %#x, glyph_%s_%s },\n", ord($glyph->{char}), $glyph->{name}, $size;
  216
+    printf CSRC "  { %#x, &glyph_%s_%s },\n", ord($glyph->{char}), $glyph->{name}, $size;
208 217
   }
  218
+  my $x_width = $glyphs{x}{width};
209 219
   print CSRC "};\n\n";
210 220
   print CSRC <<EOS;
211 221
 static i_bif_font
212 222
 font_$size = {
213  
-  $size,
214  
-  $font{ascender},
215  
-  $font{descender},
216  
-  $x_width,
217  
-  mapping_$size,
218  
-  sizeof(mapping_$size) / sizeof(*mapping_$size);
  223
+  $size, /* size */
  224
+  $font{ascender}, /* global ascent */
  225
+  $font{descender}, /* global descent */
  226
+  $x_width, /* x width */
  227
+  &glyph_${defname}_$size, /* default glyph */
  228
+  mapping_$size, /* code mapping */
  229
+  sizeof(mapping_$size) / sizeof(*mapping_$size)
219 230
 };
220 231
 
221 232
 EOS
222 233
   push @fonts, $size;
223 234
 }
224 235
 
225  
-print CSRC "static i_bif_font*\nface_fonts[] =\n {\n";
226  
-for my $size (sort { $a <=> $b } @fonts) {
227  
-  print CSRC "  font_$size,\n";
  236
+print CSRC "static i_bif_font*\nface_fonts[] = {\n";
  237
+@fonts = sort { $a <=> $b } @fonts;
  238
+my $index = 0;
  239
+for my $size (@fonts) {
  240
+  my $comma = $index++ == $#fonts ? "" : ",";
  241
+  print CSRC "  &font_$size$comma\n";
228 242
 }
229 243
 print CSRC "};\n";
230 244
 
231 245
 print CSRC <<EOS;
232  
-i_bif_face i_face_$in = {
233  
-  "$in",
234  
-  face_fonts,
235  
-  sizeof(face_fonts) / sizeof(*face_conts)
  246
+const i_bif_face i_face_$in = {
  247
+  "$in", /* face name */
  248
+  face_fonts, /* fonts */
  249
+  sizeof(face_fonts) / sizeof(*face_fonts)
236 250
 };
237 251
 EOS
238 252
 
957  Font-BuiltIn/tiny8.imf
... ...
@@ -0,0 +1,957 @@
  1
+size: 8
  2
+name: tiny
  3
+
  4
+name: A
  5
+design:
  6
+ xxx
  7
+x   x
  8
+xxxxx
  9
+x   x
  10
+x   x
  11
+----- .
  12
+.
  13
+
  14
+name: B
  15
+design:
  16
+xxx
  17
+x  x
  18
+xxx
  19
+x  xx
  20
+xxxx
  21
+----- .
  22
+.
  23
+
  24
+name: C
  25
+design:
  26
+ xxx
  27
+x   x
  28
+x
  29
+x   x
  30
+ xxx
  31
+----- .
  32
+.
  33
+
  34
+name: D
  35
+design:
  36
+xxx
  37
+x  x
  38
+x   x
  39
+x  x
  40
+xxx
  41
+----- .
  42
+.
  43
+
  44
+name: E
  45
+design:
  46
+xxxxx
  47
+x
  48
+xxx
  49
+x
  50
+xxxxx
  51
+----- .
  52
+.
  53
+
  54
+name: F
  55
+design:
  56
+xxxxx
  57
+x
  58
+xxx
  59
+x
  60
+x
  61
+----- .
  62
+.
  63
+
  64
+name: G
  65
+design:
  66
+ xxx
  67
+x
  68
+x  xx
  69
+x   x
  70
+ xxx
  71
+----- .
  72
+.
  73
+
  74
+name: H
  75
+design:
  76
+x   x
  77
+x   x
  78
+xxxxx
  79
+x   x
  80
+x   x
  81
+----- .
  82
+.
  83
+
  84
+name: I
  85
+design:
  86
+xxx
  87
+ x
  88
+ x
  89
+ x
  90
+xxx
  91
+--- .
  92
+.
  93
+
  94
+name: J
  95
+design:
  96
+  xxx
  97
+   x
  98
+   x
  99
+x  x
  100
+ xx
  101
+----- .
  102
+.
  103
+
  104
+name: K
  105
+design:
  106
+x  x
  107
+x x
  108
+xxx
  109
+x  x
  110
+x   x
  111
+------ .
  112
+.
  113
+
  114
+name: L
  115
+design:
  116
+x
  117
+x
  118
+x
  119
+x
  120
+xxxx
  121
+---- .
  122
+.
  123
+
  124
+name: M
  125
+design:
  126
+x     x
  127
+xx   xx
  128
+x x x x
  129
+x  x  x
  130
+x     x
  131
+------- .
  132
+.
  133
+
  134
+name: N
  135
+design:
  136
+x   x
  137
+xx  x
  138
+x x x
  139
+x  xx
  140
+x   x
  141
+----- .
  142
+.
  143
+
  144
+name: O
  145
+design:
  146
+ xxx
  147
+x   x
  148
+x   x
  149
+x   x
  150
+ xxx
  151
+----- .
  152
+.
  153
+
  154
+name: P
  155
+design:
  156
+xxxx
  157
+x   x
  158
+xxxx
  159
+x
  160
+x
  161
+----- .
  162
+.
  163
+
  164
+name: Q
  165
+design:
  166
+ xxx
  167
+x   x
  168
+x   x
  169
+x x x
  170
+ xxx
  171
+----- .
  172
+    x
  173
+.
  174
+
  175
+name: R
  176
+design:
  177
+xxxx
  178
+x   x
  179
+xxxx
  180
+x   x
  181
+x   x
  182
+----- .
  183
+.
  184
+
  185
+name: S
  186
+design:
  187
+ xxx
  188
+x
  189
+ xxx
  190
+    x
  191
+ xxx
  192
+----- .
  193
+.
  194
+
  195
+name: T
  196
+design:
  197
+xxxxx
  198
+  x
  199
+  x
  200
+  x
  201
+  x
  202
+----- .
  203
+.
  204
+
  205
+name: U
  206
+design:
  207
+x   x
  208
+x   x
  209
+x   x
  210
+x   x
  211
+ xxx
  212
+----- .
  213
+.
  214
+
  215
+name: V
  216
+design:
  217
+x   x
  218
+x   x
  219
+ x x
  220
+ x x
  221
+  x
  222
+----- .
  223
+.
  224
+
  225
+name: W
  226
+design:
  227
+x     x
  228
+x     x
  229
+ x x x
  230
+ x x x
  231
+  x x
  232
+------- .
  233
+.
  234
+
  235
+name: X
  236
+design:
  237
+x   x
  238
+ x x
  239
+  x
  240
+ x x
  241
+x   x
  242
+----- .
  243
+.
  244
+
  245
+name: Y
  246
+design:
  247
+x   x
  248
+ x x
  249
+  x
  250
+  x
  251
+  x
  252
+----- .
  253
+.
  254
+
  255
+name: Z
  256
+design:
  257
+xxxxx
  258
+   x
  259
+  x
  260
+ x
  261
+xxxxx
  262
+----- .
  263
+.
  264
+
  265
+name: a
  266
+design:
  267
+ xxx
  268
+x  x
  269
+ xxx
  270
+---- .
  271
+.
  272
+
  273
+name: b
  274
+design:
  275
+x
  276
+x
  277
+xxx
  278
+x  x
  279
+xxx
  280
+---- .
  281
+.
  282
+
  283
+name: c
  284
+design:
  285
+ xxx
  286
+x
  287
+ xxx
  288
+---- .
  289
+.
  290
+
  291
+name: d
  292
+design:
  293
+   x
  294
+   x
  295
+ xxx
  296
+x  x
  297
+ xxx
  298
+---- .
  299
+.
  300
+
  301
+name: e
  302
+design:
  303
+ xx
  304
+xxxx
  305
+x
  306
+ xxx
  307
+---- .
  308
+.
  309
+
  310
+name: f
  311
+design:
  312
+  x
  313
+ x
  314
+xxx
  315
+ x
  316
+ x
  317
+--- .
  318
+.
  319
+
  320
+name: g
  321
+design:
  322
+ xxx
  323
+x  x
  324
+ xxx
  325
+---- .
  326
+   x
  327
+ xx
  328
+.
  329
+
  330
+name: h
  331
+design:
  332
+x
  333
+x
  334
+xxx
  335
+x  x
  336
+x  x
  337
+---- .
  338
+.
  339
+
  340
+name: i
  341
+design:
  342
+x
  343
+
  344
+x
  345
+x
  346
+x
  347
+- .
  348
+.
  349
+
  350
+name: j
  351
+design:
  352
+  x
  353
+
  354
+  x
  355
+  x
  356
+  x
  357
+--- .
  358
+  x
  359
+xx
  360
+.
  361
+
  362
+name: k
  363
+design:
  364
+x
  365
+x
  366
+x  x
  367
+xxx
  368
+x  x
  369
+---- .
  370
+.
  371
+
  372
+name: l
  373
+design:
  374
+x
  375
+x
  376
+x
  377
+x
  378
+x
  379
+- .
  380
+.
  381
+
  382
+name: m
  383
+design:
  384
+xx x
  385
+x x x
  386
+x x x
  387
+----- .
  388
+.
  389
+
  390
+name: n
  391
+design:
  392
+xxx
  393
+x  x
  394
+x  x
  395
+---- .
  396
+.
  397
+
  398
+name: o
  399
+design:
  400
+ xx
  401
+x  x
  402
+ xx
  403
+---- .
  404
+.
  405
+
  406
+name: p
  407
+design:
  408
+xxx
  409
+x  x
  410
+xxx
  411
+---- .
  412
+x
  413
+x
  414
+.
  415
+
  416
+name: q
  417
+design:
  418
+ xxx
  419
+x  x
  420
+ xxx
  421
+---- .
  422
+   x
  423
+   x
  424
+.
  425
+
  426
+name: r
  427
+design:
  428
+xxx
  429
+x
  430
+x
  431
+--- .
  432
+.
  433
+
  434
+name: s
  435
+design:
  436
+ xx
  437
+x
  438
+ xx
  439
+   x
  440
+---- .
  441
+ xx
  442
+.
  443
+
  444
+name: t
  445
+design:
  446
+ x
  447
+xxx
  448
+ x
  449
+ x
  450
+ x
  451
+--- .
  452
+.
  453
+
  454
+name: u
  455
+design:
  456
+x x
  457
+x x
  458
+ xx
  459
+--- .
  460
+.
  461
+
  462
+name: v
  463
+design:
  464
+x x
  465
+x x
  466
+ x
  467
+--- .
  468
+.
  469
+
  470
+name: w
  471
+design:
  472
+x   x
  473
+x x x
  474
+ x x
  475
+----- .
  476
+.
  477
+
  478
+name: x
  479
+design:
  480
+x x
  481
+ x
  482
+x x
  483
+--- .
  484
+.
  485
+
  486
+name: y
  487
+design:
  488
+x   x
  489
+ x x
  490
+  x
  491
+----- .
  492
+ x
  493
+x
  494
+.
  495
+
  496
+name: z
  497
+design:
  498
+xxxx
  499
+  x
  500
+ x
  501
+xxxx
  502
+---- .
  503
+.
  504
+
  505
+name: exclam
  506
+char: !
  507
+design:
  508
+x
  509
+x
  510
+x
  511
+
  512
+x
  513
+- .
  514
+.
  515
+
  516
+name: space
  517
+charcode: 32
  518
+design:
  519
+---.
  520
+.
  521
+
  522
+name: dquot
  523
+char: "
  524
+design:
  525
+x x
  526
+x x
  527
+
  528
+
  529
+
  530
+--- .
  531
+.
  532
+
  533
+name: number
  534
+char: #
  535
+design:
  536
+ x x
  537
+xxxxx
  538
+ x x
  539
+xxxxx
  540
+----- .
  541
+ x x
  542
+.
  543
+
  544
+name: percent
  545
+char: %
  546
+design:
  547
+x  x
  548
+   x
  549
+  x
  550
+ x
  551
+x  x
  552
+---- .
  553
+.
  554
+
  555
+name: amp
  556
+char: &
  557
+design:
  558
+ x
  559
+x x
  560
+ x
  561
+x xx
  562
+ xx
  563
+---- .
  564
+.
  565
+
  566
+name: apos
  567
+char: '
  568
+design:
  569
+x
  570
+x
  571
+
  572
+
  573
+
  574
+- .
  575
+.
  576
+
  577
+name: lparen
  578
+char: (
  579
+design:
  580
+   x
  581
+  x
  582
+  x
  583
+  x
  584
+   x
  585
+----.
  586
+.
  587
+
  588
+name: rparen
  589
+char: )
  590
+design:
  591
+x
  592
+ x
  593
+ x
  594
+ x
  595
+x
  596
+----.
  597
+.
  598
+
  599
+name: asterisk
  600
+char: *
  601
+design:
  602
+x x
  603
+ x
  604
+x x
  605
+
  606
+
  607
+----.
  608
+.
  609
+
  610
+name: plus
  611
+char: +
  612
+design:
  613
+  x
  614
+ xxx
  615
+  x
  616
+-----.
  617
+.
  618
+
  619
+name: comma
  620
+char: ,
  621
+design:
  622
+ x
  623
+--.
  624
+x
  625
+.
  626
+
  627
+name: hyphen
  628
+char: -
  629
+design:
  630
+xxx
  631
+
  632
+---.
  633
+.
  634
+
  635
+name: period
  636
+char: .
  637
+default:
  638
+design:
  639
+x
  640
+- .
  641
+.
  642
+
  643
+name: slash
  644
+char: /
  645
+design:
  646
+    x
  647
+   x
  648
+  x
  649
+ x
  650
+x
  651
+-----.
  652
+.
  653
+
  654
+name: colon
  655
+char: :
  656
+design:
  657
+x
  658
+
  659
+x
  660
+--.
  661
+.
  662
+
  663
+name: semicolon
  664
+char: ;
  665
+design:
  666
+ x
  667
+
  668
+ x
  669
+-- .
  670
+x
  671
+.
  672
+
  673
+name: lt
  674
+char: <
  675
+design:
  676
+   xx
  677
+ xx
  678
+x
  679
+ xx
  680
+----- .
  681
+   xx
  682
+.
  683
+
  684
+name: equals
  685
+char: =
  686
+design:
  687
+xxxx
  688
+
  689
+xxxx
  690
+
  691
+---- .
  692
+.
  693
+
  694
+name: gt
  695
+char: >
  696
+design:
  697
+xx
  698
+  xx
  699
+    x
  700
+  xx
  701
+----- .
  702
+xx
  703
+.
  704
+
  705
+name: question
  706
+char: ?
  707
+design:
  708
+ xxx
  709
+x   x
  710
+   x
  711
+  x
  712
+
  713
+----- .
  714
+  x
  715
+.
  716