1 // This program was used to encode the data for stb_simple_font.h
5 #define STB_IMAGE_IMPLEMENTATION
11 int last_x
[2], last_y
[2];
12 int num_seg
[2], non_empty
;
16 unsigned short first_segment
;
17 unsigned char advance
;
30 void add_seg(int x
, int y
, int len
, int horizontal
)
40 stb_arr_push(segments
, s
);
45 unsigned char first_segment
:8;
46 unsigned char first_v_segment
:8;
47 unsigned char advance
:5;
64 void add_seg(int x
, int y
, int len
, int horizontal
)
68 while (x
- last_x
[horizontal
] > X_LIMIT
) {
69 add_seg(last_x
[horizontal
] + X_LIMIT
, 0, 0, horizontal
);
71 while (len
> LEN_LIMIT
) {
72 add_seg(x
, y
, LEN_LIMIT
, horizontal
);
74 x
+= LEN_LIMIT
*horizontal
;
75 y
+= LEN_LIMIT
*!horizontal
;
78 s
.dx
= x
- last_x
[horizontal
];
81 non_empty
+= len
!= 0;
85 ++num_seg
[horizontal
];
87 stb_arr_push(segments
, s
);
89 stb_arr_push(vsegments
, s
);
90 last_x
[horizontal
] = x
;
93 void print_segments(segment
*s
)
98 for (i
=0; i
< stb_arr_len(s
); ++i
) {
99 // repack for portability
100 unsigned char seg
= s
[i
].len
+ s
[i
].dx
*8 + s
[i
].y
*16;
101 hpos
+= printf("%d,", seg
);
102 if (hpos
> 72 && i
+1 < stb_arr_len(s
)) {
112 chardata charinfo
[128];
114 int parse_char(int x
, chardata
*c
, int offset
)
116 int start_x
= x
, end_x
, top_y
= 0, y
;
118 c
->first_segment
= stb_arr_len(segments
);
119 c
->first_v_segment
= stb_arr_len(vsegments
) - offset
;
120 assert(c
->first_segment
== stb_arr_len(segments
));
121 assert(c
->first_v_segment
+ offset
== stb_arr_len(vsegments
));
123 // find advance distance
125 while (data
[end_x
*3] == 255)
127 c
->advance
= end_x
- start_x
+ 1;
129 last_x
[0] = last_x
[1] = 0;
130 last_y
[0] = last_y
[1] = 0;
132 for (y
=2; y
< h
; ++y
) {
133 for (x
=start_x
; x
< end_x
; ++x
) {
134 if (data
[y
*3*w
+x
*3+1] < 255) {
146 for (x
=start_x
; x
< end_x
; ++x
) {
148 for (y
=2; y
< h
; ++y
) {
149 if (data
[y
*3*w
+x
*3+1] < 255) {
150 if (data
[y
*3*w
+x
*3+0] == 255) { // red
152 while (y
+len
< h
&& data
[(y
+len
)*3*w
+x
*3+0] == 255 && data
[(y
+len
)*3*w
+x
*3+1] == 0) {
153 data
[(y
+len
)*3*w
+x
*3+0] = 0;
156 add_seg(x
-start_x
,y
-top_y
,len
,0);
158 if (data
[y
*3*w
+x
*3+2] == 255) { // blue
160 while (x
+len
< end_x
&& data
[y
*3*w
+(x
+len
)*3+2] == 255 && data
[y
*3*w
+(x
+len
)*3+1] == 0) {
161 data
[y
*3*w
+(x
+len
)*3+2] = 0;
164 add_seg(x
-start_x
,y
-top_y
,len
,1);
173 int main(int argc
, char **argv
)
176 data
= stbi_load("easy_font_raw.png", &w
, &h
, 0, 3);
177 for (c
=32; c
< 127; ++c
) {
178 x
= parse_char(x
, &charinfo
[c
], 0);
179 printf("%3d -- %3d %3d\n", c
, charinfo
[c
].first_segment
, charinfo
[c
].first_v_segment
);
182 printf("%d %d %d\n", num_seg
[0], num_seg
[1], non_empty
);
183 printf("%d\n", sizeof(segments
[0]) * stb_arr_len(segments
));
184 printf("%d\n", sizeof(segments
[0]) * stb_arr_len(segments
) + sizeof(segments
[0]) * stb_arr_len(vsegments
) + sizeof(charinfo
[32])*95);
187 " unsigned char advance;\n"
188 " unsigned char h_seg;\n"
189 " unsigned char v_seg;\n"
190 "} stb_easy_font_charinfo[96] = {\n");
191 charinfo
[c
].first_segment
= stb_arr_len(segments
);
192 charinfo
[c
].first_v_segment
= stb_arr_len(vsegments
);
193 for (c
=32; c
< 128; ++c
) {
194 if ((c
& 3) == 0) printf(" ");
195 printf("{ %2d,%3d,%3d },",
196 charinfo
[c
].advance
+ 16*charinfo
[c
].voff
,
197 charinfo
[c
].first_segment
,
198 charinfo
[c
].first_v_segment
);
199 if ((c
& 3) == 3) printf("\n"); else printf(" ");
203 printf("unsigned char stb_easy_font_hseg[%d] = {\n", stb_arr_len(segments
));
204 print_segments(segments
);
207 printf("unsigned char stb_easy_font_vseg[%d] = {\n", stb_arr_len(vsegments
));
208 print_segments(vsegments
);