pango.c - wmenu - [fork] efficient dynamic menu for wayland
 (HTM) git clone https://git.drkhsh.at/wmenu.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       pango.c (2499B)
       ---
            1 #include <cairo/cairo.h>
            2 #include <pango/pangocairo.h>
            3 #include <stdbool.h>
            4 #include <stdio.h>
            5 #include <stdlib.h>
            6 #include <string.h>
            7 
            8 #include "pango.h"
            9 
           10 int get_font_height(const char *fontstr) {
           11         PangoFontMap *fontmap = pango_cairo_font_map_get_default();
           12         PangoContext *context = pango_font_map_create_context(fontmap);
           13         PangoFontDescription *desc = pango_font_description_from_string(fontstr);
           14         PangoFont *font = pango_font_map_load_font(fontmap, context, desc);
           15         if (font == NULL) {
           16                 pango_font_description_free(desc);
           17                 g_object_unref(context);
           18                 return -1;
           19         }
           20         PangoFontMetrics *metrics = pango_font_get_metrics(font, NULL);
           21         int height = pango_font_metrics_get_height(metrics) / PANGO_SCALE;
           22         pango_font_metrics_unref(metrics);
           23         g_object_unref(font);
           24         pango_font_description_free(desc);
           25         g_object_unref(context);
           26         return height;
           27 }
           28 
           29 PangoLayout *get_pango_layout(cairo_t *cairo, const char *font,
           30                 const char *text, double scale) {
           31         PangoLayout *layout = pango_cairo_create_layout(cairo);
           32         PangoAttrList *attrs = pango_attr_list_new();
           33         pango_layout_set_text(layout, text, -1);
           34         pango_attr_list_insert(attrs, pango_attr_scale_new(scale));
           35         PangoFontDescription *desc = pango_font_description_from_string(font);
           36         pango_layout_set_font_description(layout, desc);
           37         pango_layout_set_single_paragraph_mode(layout, 1);
           38         pango_layout_set_attributes(layout, attrs);
           39         pango_font_description_free(desc);
           40         pango_attr_list_unref(attrs);
           41         return layout;
           42 }
           43 
           44 void get_text_size(cairo_t *cairo, const char *font, int *width, int *height,
           45                 int *baseline, double scale, const char *text) {
           46         PangoLayout *layout = get_pango_layout(cairo, font, text, scale);
           47         pango_cairo_update_layout(cairo, layout);
           48         pango_layout_get_pixel_size(layout, width, height);
           49         if (baseline) {
           50                 *baseline = pango_layout_get_baseline(layout) / PANGO_SCALE;
           51         }
           52         g_object_unref(layout);
           53 }
           54 
           55 int text_width(cairo_t *cairo, const char *font, const char *text) {
           56         int text_width;
           57         get_text_size(cairo, font, &text_width, NULL, NULL, 1, text);
           58         return text_width;
           59 }
           60 
           61 void pango_printf(cairo_t *cairo, const char *font, double scale,
           62                 const char *text) {
           63         PangoLayout *layout = get_pango_layout(cairo, font, text, scale);
           64         cairo_font_options_t *fo = cairo_font_options_create();
           65         cairo_get_font_options(cairo, fo);
           66         pango_cairo_context_set_font_options(pango_layout_get_context(layout), fo);
           67         cairo_font_options_destroy(fo);
           68         pango_cairo_update_layout(cairo, layout);
           69         pango_cairo_show_layout(cairo, layout);
           70         g_object_unref(layout);
           71 }