Render correctly codepoints in agg font render test and fix bounding box

This commit is contained in:
Francesco Abbate 2020-06-01 11:26:25 +02:00
parent edb103716a
commit ca6b7bc902
1 changed files with 30 additions and 17 deletions

View File

@ -101,36 +101,49 @@ retry:
memset(set->image->pixels, 0x00, width * height * pixel_size); memset(set->image->pixels, 0x00, width * height * pixel_size);
fprintf(stderr, "Using height: %g in BakeFontBitmap\n", font->height_bitmap); // NOTE here that render.c with stb_truetype is really using font->height_bitmap.
fprintf(stderr, "Using height: %d in BakeFontBitmap\n", font->height);
const int pad_y = font->height * 2 / 10;
const int ascender_px = int(font->ascender + 0.5), descender_px = int(font->descender + 0.5);
const int y_step = font->height + 2 * pad_y;
agg::rendering_buffer ren_buf((agg::int8u *) set->image->pixels, width, height, -width * pixel_size); agg::rendering_buffer ren_buf((agg::int8u *) set->image->pixels, width, height, -width * pixel_size);
// FIXME: figure out how to precisely layout each glyph. int x = 0, y = height;
double x = 0, y = height;
int res = 0; int res = 0;
const agg::alpha8 text_color(0xff); const agg::alpha8 text_color(0xff);
for (int i = 0; i < 256; i++) { for (int i = 0; i < 256; i++) {
int codepoint = (idx << 8) | i;
if (x + font->height > width) { if (x + font->height > width) {
x = 0; x = 0;
y -= font->height; y -= y_step;
} }
if (y - font->height < 0) { if (y - font->height - 2 * pad_y < 0) {
res = -1; res = -1;
break; break;
} }
// FIXME: we are ignoring idx and with a char we cannot pass codepoint > 255. const int y_baseline = y - pad_y - font->height;
char text[2] = {char(i % 256), 0};
// FIXME: using font->height_bitmap below seems logically correct but // FIXME: using font->height_bitmap below seems logically correct but
// the font size is bigger than what printed by BakeFontBitmap. // the font size is bigger than what printed by BakeFontBitmap.
double x_next = x, y_next = y - font->height; double x_next = x, y_next = y_baseline;
font->renderer->render_text(ren_buf, font->height_bitmap, text_color, x_next, y_next, text); font->renderer->render_codepoint(ren_buf, font->height, text_color, x_next, y_next, codepoint);
set->glyphs[i].x0 = x - 1; int x_next_i = int(x_next + 0.5);
set->glyphs[i].y0 = y - font->descender; GlyphBitmapInfo& glyph_info = set->glyphs[i];
set->glyphs[i].x1 = x_next - 1; glyph_info.x0 = x;
set->glyphs[i].y1 = y + font->ascender; glyph_info.y0 = height - (y_baseline + ascender_px + pad_y);
set->glyphs[i].xoff = -1; glyph_info.x1 = x_next_i;
set->glyphs[i].yoff = -font->ascender; glyph_info.y1 = height - (y_baseline + descender_px - pad_y);
set->glyphs[i].xadvance = x_next - x; glyph_info.xoff = 0;
x = x_next; glyph_info.yoff = -font->ascender;
glyph_info.xadvance = x_next - x;
fprintf(stderr,
"glyph codepoint %3d (ascii: %1c), BOX (%3d, %3d) (%3d, %3d), "
"OFFSET (%.5g, %.5g), X ADVANCE %.5g\n",
codepoint, i,
glyph_info.x0, glyph_info.y0, glyph_info.x1, glyph_info.y1,
glyph_info.xoff, glyph_info.yoff, glyph_info.xadvance);
x = x_next_i;
} }
/* retry with a larger image buffer if the buffer wasn't large enough */ /* retry with a larger image buffer if the buffer wasn't large enough */