diff --git a/src/Font.cc b/src/Font.cc index 88b57c0..961552d 100644 --- a/src/Font.cc +++ b/src/Font.cc @@ -95,10 +95,13 @@ static VALUE Font_new(VALUE klass, VALUE fname, VALUE size) FT_Set_Pixel_Sizes(font->face, 0, NUM2INT(size)); static const char preload_glyphs[] = "HMgjqxy_|^"; + int max_top = -9999; + int min_bottom = 9999; for (unsigned int i = 0; i < sizeof(preload_glyphs) - 1u; i++) { - if (get_glyph(font, preload_glyphs[i]) == NULL) + GlyphRef g = get_glyph(font, preload_glyphs[i]); + if (g == NULL) { delete font; rb_raise(rb_eRuntimeError, @@ -106,18 +109,20 @@ static VALUE Font_new(VALUE klass, VALUE fname, VALUE size) preload_glyphs[i], fname_cstr); } + if (font->face->glyph->bitmap_top > max_top) + max_top = font->face->glyph->bitmap_top; + int bitmap_bottom = font->face->glyph->bitmap_top - font->face->glyph->bitmap.rows; + if (bitmap_bottom < min_bottom) + min_bottom = bitmap_bottom; } -#if 0 - m_baseline_offset = round_up_26_6((m_face->size->metrics.height - (m_face->size->metrics.ascender - m_face->size->metrics.descender)) / 2 - m_face->size->metrics.descender); -#endif -#if 0 - m_baseline_offset = 1 - m_face->glyph->bitmap_top + m_face->glyph->bitmap.rows; -#endif + int line_height = round_up_26_6(font->face->size->metrics.height); + int baseline_offset = (line_height - (max_top - min_bottom)) / 2; VALUE rv = Data_Wrap_Struct(klass, NULL, Font_free, font); rb_iv_set(rv, "@advance", INT2FIX(get_glyph(font, 'x')->get_advance())); - rb_iv_set(rv, "@line_height", INT2FIX(round_up_26_6(font->face->size->metrics.height))); + rb_iv_set(rv, "@line_height", INT2FIX(line_height)); + rb_iv_set(rv, "@baseline_offset", INT2FIX(baseline_offset)); return rv; }