void drawtext(DC *dc, const char *text, Color col[ColLast], int x_offs, int force_width, int breaklines) { XSetForeground(dc->dpy, dc->gc, BG(dc, col)); XFillRectangle(dc->dpy, dc->canvas, dc->gc, dc->x, dc->y, dc->w, dc->h); if(!text) return; set_text(dc, text, force_width, breaklines); pango_xft_render_layout(dc->xftdrawable, &col[ColFG].xft, dc->plo, (dc->x + x_offs) * PANGO_SCALE, dc->y * PANGO_SCALE); }
void drawtextn(DC *dc, const char *text, size_t n, ColorSet *col) { int x = dc->x + dc->font.height/2; int y = dc->y + (dc->h / 2) - (dc->font.height / 2); XSetForeground(dc->dpy, dc->gc, col->FG); if (!dc->xftdraw) eprintf("error, xft drawable does not exist"); pango_layout_set_text(dc->plo, text, n); pango_xft_render_layout(dc->xftdraw, &col->FG_xft, dc->plo, x * PANGO_SCALE, y * PANGO_SCALE); }
static void render_callback (PangoLayout *layout, int x, int y, gpointer context, gpointer state G_GNUC_UNUSED) { MyXftContext *xft_context = (MyXftContext *) context; pango_xft_render_layout (xft_context->draw, &xft_context->color, layout, x * PANGO_SCALE, y * PANGO_SCALE); }
static void _pango_xft_TextDraw(TextState * ts, int x, int y, const char *text, int len __UNUSED__) { FontCtxPangoXft *fdc = (FontCtxPangoXft *) ts->fdc; PangoLayout *layout; layout = pango_layout_new(_pango_ctx); pango_layout_set_text(layout, text, -1); pango_layout_set_font_description(layout, fdc->font); pango_xft_render_layout(fdc->xftd, &(fdc->xftc), layout, x * PANGO_SCALE, y * PANGO_SCALE); g_object_unref(layout); }
void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area) { gint x,y,w; XftColor c; gint mw; PangoRectangle rect; PangoAttrList *attrlist; PangoEllipsizeMode ell; g_assert(!t->flow || t->maxwidth > 0); y = area->y; if (!t->flow) /* center the text vertically We do this centering based on the 'baseline' since different fonts have different top edges. It looks bad when the whole string is moved when 1 character from a non-default language is included in the string */ y += font_calculate_baseline(t->font, area->height); /* the +2 and -4 leave a small blank edge on the sides */ x = area->x + 2; w = area->width; if (t->flow) w = MAX(w, t->maxwidth); w -= 4; /* h = area->height; */ if (t->flow) ell = PANGO_ELLIPSIZE_NONE; else { switch (t->ellipsize) { case RR_ELLIPSIZE_NONE: ell = PANGO_ELLIPSIZE_NONE; break; case RR_ELLIPSIZE_START: ell = PANGO_ELLIPSIZE_START; break; case RR_ELLIPSIZE_MIDDLE: ell = PANGO_ELLIPSIZE_MIDDLE; break; case RR_ELLIPSIZE_END: ell = PANGO_ELLIPSIZE_END; break; default: g_assert_not_reached(); } } pango_layout_set_text(t->font->layout, t->string, -1); pango_layout_set_width(t->font->layout, w * PANGO_SCALE); pango_layout_set_ellipsize(t->font->layout, ell); pango_layout_set_single_paragraph_mode(t->font->layout, !t->flow); /* * * end of setting up the layout * * */ pango_layout_get_pixel_extents(t->font->layout, NULL, &rect); mw = rect.width; /* pango_layout_set_alignment doesn't work with pango_xft_render_layout_line */ switch (t->justify) { case RR_JUSTIFY_LEFT: break; case RR_JUSTIFY_RIGHT: x += (w - mw); break; case RR_JUSTIFY_CENTER: x += (w - mw) / 2; break; case RR_JUSTIFY_NUM_TYPES: g_assert_not_reached(); } if (t->shadow_offset_x || t->shadow_offset_y) { /* From nvidia's readme (chapter 23): When rendering to a 32-bit window, keep in mind that the X RENDER extension, used by most composite managers, expects "premultiplied alpha" colors. This means that if your color has components (r,g,b) and alpha value a, then you must render (a*r, a*g, a*b, a) into the target window. */ c.color.red = (t->shadow_color->r | t->shadow_color->r << 8) * t->shadow_alpha / 255; c.color.green = (t->shadow_color->g | t->shadow_color->g << 8) * t->shadow_alpha / 255; c.color.blue = (t->shadow_color->b | t->shadow_color->b << 8) * t->shadow_alpha / 255; c.color.alpha = 0xffff * t->shadow_alpha / 255; c.pixel = t->shadow_color->pixel; /* see below... */ if (!t->flow) { pango_xft_render_layout_line (d, &c, #if PANGO_VERSION_MAJOR > 1 || \ (PANGO_VERSION_MAJOR == 1 && PANGO_VERSION_MINOR >= 16) pango_layout_get_line_readonly(t->font->layout, 0), #else pango_layout_get_line(t->font->layout, 0), #endif (x + t->shadow_offset_x) * PANGO_SCALE, (y + t->shadow_offset_y) * PANGO_SCALE); } else { pango_xft_render_layout(d, &c, t->font->layout, (x + t->shadow_offset_x) * PANGO_SCALE, (y + t->shadow_offset_y) * PANGO_SCALE); } } c.color.red = t->color->r | t->color->r << 8; c.color.green = t->color->g | t->color->g << 8; c.color.blue = t->color->b | t->color->b << 8; c.color.alpha = 0xff | 0xff << 8; /* fully opaque text */ c.pixel = t->color->pixel; if (t->shortcut) { const gchar *s = t->string + t->shortcut_pos; t->font->shortcut_underline->start_index = t->shortcut_pos; t->font->shortcut_underline->end_index = t->shortcut_pos + (g_utf8_next_char(s) - s); /* the attributes are owned by the layout. re-add the attributes to the layout after changing the start and end index */ attrlist = pango_layout_get_attributes(t->font->layout); pango_attr_list_ref(attrlist); pango_layout_set_attributes(t->font->layout, attrlist); pango_attr_list_unref(attrlist); } /* layout_line() uses y to specify the baseline The line doesn't need to be freed, it's a part of the layout */ if (!t->flow) { pango_xft_render_layout_line (d, &c, #if PANGO_VERSION_MAJOR > 1 || \ (PANGO_VERSION_MAJOR == 1 && PANGO_VERSION_MINOR >= 16) pango_layout_get_line_readonly(t->font->layout, 0), #else pango_layout_get_line(t->font->layout, 0), #endif x * PANGO_SCALE, y * PANGO_SCALE); } else { pango_xft_render_layout(d, &c, t->font->layout, x * PANGO_SCALE, y * PANGO_SCALE); } if (t->shortcut) { t->font->shortcut_underline->start_index = 0; t->font->shortcut_underline->end_index = 0; /* the attributes are owned by the layout. re-add the attributes to the layout after changing the start and end index */ attrlist = pango_layout_get_attributes(t->font->layout); pango_attr_list_ref(attrlist); pango_layout_set_attributes(t->font->layout, attrlist); pango_attr_list_unref(attrlist); } }