bad char
[vg.git] / vg_build_font.h
1 #include "vg_font.h"
2
3 #define STB_IMAGE_IMPLEMENTATION
4 #include "submodules/stb/stb_image.h"
5
6 void vg_build_font_face_run( vg_font_face *face,
7 char first, char last, i16 x, i16 y )
8 {
9 u32 uf = *((u8 *)&first),
10 ul = *((u8 *)&last);
11
12 u32 count = ul - uf;
13 for( u32 i=0; i<=count; i ++ )
14 {
15 u32 index = uf + i;
16 face->map[index].x = x+(i*face->cw);
17 face->map[index].y = y;
18 }
19 }
20
21 void vg_build_write_font_face( FILE *fp, vg_font_face *face )
22 {
23 fprintf( fp, "vg_font_face %s = {\n", face->name );
24 fprintf( fp, " .name=\"%s\",\n", face->name );
25 fprintf( fp, " .cw=%hd,.ch=%hd,\n", face->cw,face->ch );
26 fprintf( fp, " .sx=%hd,.sy=%hd,\n", face->sx,face->sy );
27 fprintf( fp, " .baseline=%hd,\n", face->baseline );
28 fprintf( fp, " .map={\n" );
29
30 u32 chars = 0;
31
32 for( u32 i=0; i<256; i ++ )
33 {
34 if( face->map[i].x || face->map[i].y )
35 {
36 chars += fprintf( fp, "[%u]={%hd,%hd},",
37 i, face->map[i].x, face->map[i].y );
38
39 if( chars > 80 )
40 {
41 fprintf( fp, "\n" );
42 chars = 0;
43 }
44 }
45 }
46
47 fprintf( fp, "\n}};\n\n" );
48 }
49
50 void vg_build_font_sheet( FILE *fp, char *name, const char *source )
51 {
52 int x,y,n;
53 unsigned char *data = stbi_load( source, &x, &y, &n, 4 );
54
55 if( !data )
56 {
57 vg_error( "Couldn't open source file\n" );
58 return;
59 }
60
61 fprintf( fp, "vg_font_sheet %s = {\n", name );
62 fprintf( fp, " .w=%d, .h=%d,\n", x,y );
63 fprintf( fp, " .bitmap={\n" );
64
65 u32 pixel_max = x*y;
66 u32 pixel = 0, chars = 0;
67 while( pixel_max )
68 {
69 u32 buff = 0;
70 for( int b = 31; b >= 0; b-- )
71 {
72 buff |= data[pixel*4]>128?0x1<<b:0;
73 pixel++;
74
75 if( pixel >= pixel_max )
76 {
77 pixel_max = 0;
78 break;
79 }
80 }
81
82 chars += fprintf( fp, "%#x,", buff );
83 if( chars > 80 )
84 {
85 fprintf( fp, "\n" );
86 chars = 0;
87 }
88 }
89
90 fprintf( fp, "\n}};\n" );
91 free( data );
92 }
93
94 void vg_build_default_font(void)
95 {
96 FILE *fp = fopen( "vg/vg_default_font.gc", "w" );
97 vg_build_font_sheet( fp, "vg_default_font_sheet",
98 "vg/src/fonts/vg_font_thin_3.png" );
99 vg_font_face small =
100 {
101 .name = "vgf_default_small",
102 .cw=8, .ch=14,
103 .sx=8, .sy=14,
104 .baseline = 4
105 };
106 vg_build_font_face_run( &small, '!', '/', 8, 0 );
107 vg_build_font_face_run( &small, '[', '`', 128,0 );
108 vg_build_font_face_run( &small, '{', '~', 176,0 );
109 vg_build_font_face_run( &small, ':', '@', 208,0 );
110 vg_build_font_face_run( &small, 'A', 'Z', 0, 14 );
111 vg_build_font_face_run( &small, 'a', 'z', 0, 28 );
112 vg_build_font_face_run( &small, '0', '9', 208,14 );
113 vg_build_font_face_run( &small, 0x7f, 0xa4, 0,42 );
114 vg_build_font_face_run( &small, 0xb0, 0xb3, 208,28 );
115 vg_build_write_font_face( fp, &small );
116
117 vg_font_face large =
118 {
119 .name = "vgf_default_large",
120 .cw=12, .ch=21,
121 .sx=12, .sy=21,
122 .baseline=6,
123 };
124 vg_build_font_face_run( &large, '!', '/', 12, 56 );
125 vg_build_font_face_run( &large, '[', '`', 192,56 );
126 vg_build_font_face_run( &large, '{', '~', 264,56 );
127 vg_build_font_face_run( &large, ':', '@', 324,56 );
128 vg_build_font_face_run( &large, 'A', 'Z', 0, 77 );
129 vg_build_font_face_run( &large, 'a', 'z', 0, 98 );
130 vg_build_font_face_run( &large, '0', '9', 312,77 );
131 vg_build_font_face_run( &large, 0x7f, 0xa4, 0,119 );
132 vg_build_font_face_run( &large, 0xb0, 0xb3, 312,98 );
133 vg_build_write_font_face( fp, &large );
134
135 vg_font_face title =
136 {
137 .name = "vgf_default_title",
138 .cw=24, .ch=42,
139 .sx=20, .sy=42,
140 .baseline=12,
141 };
142 vg_build_font_face_run( &title, '!', '/', 24, 140 );
143 vg_build_font_face_run( &title, '[', '_', 384,140 );
144 vg_build_font_face_run( &title, '`', '`', 0, 182 );
145 vg_build_font_face_run( &title, '{', '~', 24, 182 );
146 vg_build_font_face_run( &title, ':', '@', 120,182 );
147 vg_build_font_face_run( &title, 'A', 'U', 0, 224 );
148 vg_build_font_face_run( &title, 'V', 'Z', 0, 308 );
149 vg_build_font_face_run( &title, 'a', 'u', 0, 266 );
150 vg_build_font_face_run( &title, 'v', 'z', 0, 350 );
151 vg_build_font_face_run( &title, '0', '9', 120,308 );
152 vg_build_font_face_run( &title, 0x89, 0x8c, 409,182 );
153 vg_build_font_face_run( &title, 0x8d, 0x92, 360,308 );
154 vg_build_font_face_run( &title, 0x7f, 0x88, 120,350 );
155 vg_build_font_face_run( &title, 0x93, 0x98, 360,350 );
156 vg_build_font_face_run( &title, 0x99, 0xa4, 0,392 );
157 vg_build_font_face_run( &title, 0xb0, 0xb2, 288,392 );
158 vg_build_write_font_face( fp, &title );
159
160 fclose( fp );
161 }