libi3/font: Set DPI for the pango context

The pango font specification accepts a font size in points, but pango
defaults to a DPI of 96. Create a default PangoContext (which
internally creates a default PangoCairoFontMap as usual) and set the
DPI to the value of the root Screen manually.

Fixes #1115
This commit is contained in:
Bas Pape 2013-11-13 20:23:35 +01:00 committed by Michael Stapelberg
parent 3dba51500e
commit 1d6450f0e8
1 changed files with 15 additions and 3 deletions

View File

@ -56,7 +56,10 @@ static bool load_pango_font(i3Font *font, const char *desc) {
/* Create a dummy Pango layout to compute the font height */ /* Create a dummy Pango layout to compute the font height */
cairo_surface_t *surface = cairo_xcb_surface_create(conn, root_screen->root, root_visual_type, 1, 1); cairo_surface_t *surface = cairo_xcb_surface_create(conn, root_screen->root, root_visual_type, 1, 1);
cairo_t *cr = cairo_create(surface); cairo_t *cr = cairo_create(surface);
PangoLayout *layout = pango_cairo_create_layout(cr); double ydpi = (double)root_screen->height_in_pixels * 25.4 / (double)root_screen->height_in_millimeters;
PangoContext *pc = pango_cairo_create_context(cr);
pango_cairo_context_set_resolution(pc, ydpi);
PangoLayout *layout = pango_layout_new(pc);
pango_layout_set_font_description(layout, font->specific.pango_desc); pango_layout_set_font_description(layout, font->specific.pango_desc);
/* Get the font height */ /* Get the font height */
@ -66,6 +69,7 @@ static bool load_pango_font(i3Font *font, const char *desc) {
/* Free resources */ /* Free resources */
g_object_unref(layout); g_object_unref(layout);
g_object_unref(pc);
cairo_destroy(cr); cairo_destroy(cr);
cairo_surface_destroy(surface); cairo_surface_destroy(surface);
@ -85,7 +89,10 @@ static void draw_text_pango(const char *text, size_t text_len,
cairo_surface_t *surface = cairo_xcb_surface_create(conn, drawable, cairo_surface_t *surface = cairo_xcb_surface_create(conn, drawable,
root_visual_type, x + max_width, y + savedFont->height); root_visual_type, x + max_width, y + savedFont->height);
cairo_t *cr = cairo_create(surface); cairo_t *cr = cairo_create(surface);
PangoLayout *layout = pango_cairo_create_layout(cr); double ydpi = (double)root_screen->height_in_pixels * 25.4 / (double)root_screen->height_in_millimeters;
PangoContext *pc = pango_cairo_create_context(cr);
pango_cairo_context_set_resolution(pc, ydpi);
PangoLayout *layout = pango_layout_new(pc);
gint height; gint height;
pango_layout_set_font_description(layout, savedFont->specific.pango_desc); pango_layout_set_font_description(layout, savedFont->specific.pango_desc);
@ -104,6 +111,7 @@ static void draw_text_pango(const char *text, size_t text_len,
/* Free resources */ /* Free resources */
g_object_unref(layout); g_object_unref(layout);
g_object_unref(pc);
cairo_destroy(cr); cairo_destroy(cr);
cairo_surface_destroy(surface); cairo_surface_destroy(surface);
} }
@ -117,7 +125,10 @@ static int predict_text_width_pango(const char *text, size_t text_len) {
/* root_visual_type is cached in load_pango_font */ /* root_visual_type is cached in load_pango_font */
cairo_surface_t *surface = cairo_xcb_surface_create(conn, root_screen->root, root_visual_type, 1, 1); cairo_surface_t *surface = cairo_xcb_surface_create(conn, root_screen->root, root_visual_type, 1, 1);
cairo_t *cr = cairo_create(surface); cairo_t *cr = cairo_create(surface);
PangoLayout *layout = pango_cairo_create_layout(cr); double ydpi = (double)root_screen->height_in_pixels * 25.4 / (double)root_screen->height_in_millimeters;
PangoContext *pc = pango_cairo_create_context(cr);
pango_cairo_context_set_resolution(pc, ydpi);
PangoLayout *layout = pango_layout_new(pc);
/* Get the font width */ /* Get the font width */
gint width; gint width;
@ -128,6 +139,7 @@ static int predict_text_width_pango(const char *text, size_t text_len) {
/* Free resources */ /* Free resources */
g_object_unref(layout); g_object_unref(layout);
g_object_unref(pc);
cairo_destroy(cr); cairo_destroy(cr);
cairo_surface_destroy(surface); cairo_surface_destroy(surface);