97 printf(
"TGLSdfFontMaker::MakeFont entering.\n");
99 const std::string base =
"31:126";
100 const std::string accented =
",0x00e0:0x00fc,0x010c:0x010d,0x0160:0x0161,0x017d:0x017e";
101 const std::string greek =
",0x0391:0x03a9,0x03b1:0x03c9";
102 const std::string range_end =
",0xffff";
104 root_sdf_fonts::SdfCreator sc;
107 std::unique_ptr<TGLWidget> glw(
111 glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &sc.max_tex_size);
113 std::string filename = ttf_font;
114 std::string res_filename = output_prefix;
116 if (filename.empty()) {
117 std::cerr <<
"Input file not specified" << std::endl;
121 if (res_filename.empty()) {
122 size_t ext_dot = filename.find_last_of(
".");
123 if (ext_dot == std::string::npos) {
124 res_filename = filename;
126 res_filename = filename.substr(0, ext_dot);
130 if (!sc.font.load_ttf_file(filename.c_str())) {
131 std::cerr <<
"Error reading TTF file '" << filename <<
"' " << std::endl;
137 sc.sdf_atlas.init(&sc.font, sc.width, sc.row_height, sc.border_size);
139 sc.parse_unicode_ranges(base + accented + greek + range_end);
140 sc.apply_unicode_ranges();
142 sc.sdf_atlas.draw_glyphs(sc.gp);
145 std::cout <<
"Allocated " << sc.sdf_atlas.glyph_count <<
" glyphs\n";
146 std::cout <<
"Atlas maximum height is " << sc.sdf_atlas.max_height <<
"\n";
149 if (sc.height == 0) {
150 sc.height = sc.sdf_atlas.max_height;
158 glGenRenderbuffers(1, &rbcolor);
159 glBindRenderbuffer(GL_RENDERBUFFER, rbcolor);
160 glRenderbufferStorage(GL_RENDERBUFFER, GL_RED, sc.width, sc.height);
161 glBindRenderbuffer(GL_RENDERBUFFER, 0);
164 glGenRenderbuffers(1, &rbds);
165 glBindRenderbuffer(GL_RENDERBUFFER, rbds);
166 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, sc.width, sc.height);
167 glBindRenderbuffer(GL_RENDERBUFFER, 0);
170 glGenFramebuffers(1, &fbo);
171 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
172 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbcolor);
173 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbds);
175 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
176 std::cerr <<
"Error creating framebuffer!" << std::endl;
182 uint8_t *picbuf = (uint8_t *)
malloc(sc.width * sc.height);
184 glViewport(0, 0, sc.width, sc.height);
185 glClearColor(0.0, 0.0, 0.0, 0.0);
186 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
188 sc.sdf_gl.render_sdf({float(sc.width), float(sc.height)}, sc.gp.fp.vertices, sc.gp.lp.vertices);
190 glReadPixels(0, 0, sc.width, sc.height, GL_RED, GL_UNSIGNED_BYTE, picbuf);
192 glBindFramebuffer(GL_FRAMEBUFFER, 0);
196 printf(
"Resulting GL buffer: w=%d, h=%d\n", sc.width, sc.height);
200 for (
int iy = 0; iy < sc.height; ++iy) {
210 std::string
json = sc.sdf_atlas.json(sc.height);
211 std::vector<char> json_gz;
212 gzip_compress_buffer(
json.data(),
json.size(), json_gz);
214 std::string json_filename = res_filename +
".js.gz";
215 FILE *json_file = fopen(json_filename.c_str(),
"wb");
217 perror(
"Error writing json file.");
220 fwrite(json_gz.data(), json_gz.size(), 1, json_file);