bsnes/hiro/gtk/font.cpp

69 lines
2.2 KiB
C++

#if defined(Hiro_Font)
namespace hiro {
auto pFont::size(const Font& font, const string& text) -> Size {
PangoFontDescription* description = create(font);
Size size = pFont::size(description, text);
free(description);
return size;
}
auto pFont::size(PangoFontDescription* font, const string& text) -> Size {
PangoContext* context = gdk_pango_context_get_for_screen(gdk_screen_get_default());
PangoLayout* layout = pango_layout_new(context);
pango_layout_set_font_description(layout, font);
pango_layout_set_text(layout, text, -1);
signed width = 0, height = 0;
pango_layout_get_pixel_size(layout, &width, &height);
g_object_unref((gpointer)layout);
return {width, height};
}
auto pFont::family(const string& family) -> string {
#if defined(DISPLAY_WINDOWS)
if(family == Font::Sans ) return "Tahoma";
if(family == Font::Serif) return "Georgia";
if(family == Font::Mono ) return "Lucida Console";
return family ? family : "Tahoma";
#elif defined(DISPLAY_XORG)
if(family == Font::Sans ) return "Sans";
if(family == Font::Serif) return "Serif";
if(family == Font::Mono ) return "Liberation Mono";
return family ? family : "Sans";
#else
return family;
#endif
}
auto pFont::create(const Font& font) -> PangoFontDescription* {
auto p = pango_font_description_new();
pango_font_description_set_family(p, family(font.family()));
pango_font_description_set_size(p, (font.size() ? font.size() : 8) * PANGO_SCALE);
pango_font_description_set_weight(p, font.bold() ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL);
pango_font_description_set_style(p, font.italic() ? PANGO_STYLE_OBLIQUE : PANGO_STYLE_NORMAL);
return p;
}
auto pFont::free(PangoFontDescription* font) -> void {
pango_font_description_free(font);
}
auto pFont::setFont(GtkWidget* widget, const Font& font) -> void {
auto gtkFont = pFont::create(font);
pFont::setFont(widget, (gpointer)gtkFont);
pFont::free(gtkFont);
}
auto pFont::setFont(GtkWidget* widget, gpointer font) -> void {
if(font == nullptr) return;
gtk_widget_modify_font(widget, (PangoFontDescription*)font);
if(GTK_IS_CONTAINER(widget)) {
gtk_container_foreach(GTK_CONTAINER(widget), (GtkCallback)pFont::setFont, font);
}
}
}
#endif