static VALUE rg_draw_glyphs(VALUE self, VALUE gc, VALUE font, VALUE x, VALUE y, VALUE glyphs) { gdk_draw_glyphs(_SELF(self), GDK_GC(RVAL2GOBJ(gc)), PANGO_FONT(RVAL2GOBJ(font)), NUM2INT(x), NUM2INT(y), (PangoGlyphString*)(RVAL2BOXED(glyphs, PANGO_TYPE_GLYPH_STRING))); return self; }
void ZLGtkPaintContext::drawString(int x, int y, const char *str, int len, bool rtl) { if (!g_utf8_validate(str, len, 0)) { return; } myAnalysis.level = rtl ? 1 : 0; pango_shape(str, len, &myAnalysis, myString); gdk_draw_glyphs(myPixmap, myTextGC, myAnalysis.font, x, y, myString); }
void GtkPaintContext::drawString(int x, int y, const char *str, int len) { if (!g_utf8_validate(str, len, 0)) { return; } x += leftMargin(); y += topMargin(); pango_shape(str, len, &myAnalysis, myString); gdk_draw_glyphs(myPixmap, myTextGC, myAnalysis.font, x, y, myString); }
//__________________________________________________________________ void _HYPlatformGraphicPane::_DisplayChar (char c,int t, int l) { if (c>=40 && c<=100) { if (charCachePangoItems == NULL) { _BuildCharGlyphs(); } PangoItem * pitem = (PangoItem*) g_list_first (charCachePangoItems)->data; if (!cachedCharacterGlyphs[c-40]) { PangoGlyphString * newString = pango_glyph_string_new (); pango_shape (&c, 1, &pitem->analysis, newString); cachedCharacterGlyphs[c-40] = newString; } gdk_draw_glyphs (thePane, theContext, pitem->analysis.font,l,t,(PangoGlyphString* )cachedCharacterGlyphs[c-40]); } else { _DisplayText (c, t, l, false); } }
static void render_layout_line (GdkDrawable *drawable, GtkTextRenderState *render_state, PangoLayoutLine *line, GSList **shaped_pointer, int x, int y, gboolean selected, GList **widgets) { GSList *tmp_list = line->runs; PangoRectangle overall_rect; PangoRectangle logical_rect; PangoRectangle ink_rect; gint x_off = 0; GdkGC *fg_gc; pango_layout_line_get_extents (line, NULL, &overall_rect); while (tmp_list) { PangoLayoutRun *run = tmp_list->data; GtkTextAppearance *appearance; gint risen_y; gint shaped_width_pixels = 0; gboolean need_ink = FALSE; tmp_list = tmp_list->next; get_item_properties (run->item, &appearance); g_assert (appearance != NULL); risen_y = y - PANGO_PIXELS (appearance->rise); if (selected) { if (GTK_WIDGET_HAS_FOCUS (render_state->widget)) fg_gc = render_state->widget->style->text_gc[GTK_STATE_SELECTED]; else fg_gc = render_state->widget->style->text_gc [GTK_STATE_ACTIVE]; } else { gtk_text_render_state_update (render_state, appearance); fg_gc = render_state->fg_gc; } if (appearance->underline != PANGO_UNDERLINE_NONE || appearance->strikethrough) need_ink = TRUE; if (appearance->is_text) { if (need_ink) pango_glyph_string_extents (run->glyphs, run->item->analysis.font, &ink_rect, &logical_rect); else pango_glyph_string_extents (run->glyphs, run->item->analysis.font, NULL, &logical_rect); } else { if (need_ink) get_shape_extents (run, &ink_rect, &logical_rect); else get_shape_extents (run, NULL, &logical_rect); } if (appearance->draw_bg && !selected) gdk_draw_rectangle (drawable, render_state->bg_gc, TRUE, x + PANGO_PIXELS (x_off) + PANGO_PIXELS (logical_rect.x), risen_y + PANGO_PIXELS (logical_rect.y), PANGO_PIXELS (logical_rect.width), PANGO_PIXELS (logical_rect.height)); if (appearance->is_text) gdk_draw_glyphs (drawable, fg_gc, run->item->analysis.font, x + PANGO_PIXELS (x_off), risen_y, run->glyphs); else { GObject *shaped = (*shaped_pointer)->data; *shaped_pointer = (*shaped_pointer)->next; if (shaped == NULL) { /* This happens if we have an empty widget anchor. Draw * something empty-looking. */ GdkRectangle shape_rect, draw_rect; shape_rect.x = x + x_off / PANGO_SCALE; shape_rect.y = risen_y - PANGO_PIXELS (logical_rect.height); shape_rect.width = PANGO_PIXELS (logical_rect.width); shape_rect.height = PANGO_PIXELS (logical_rect.height); if (gdk_rectangle_intersect (&shape_rect, &render_state->clip_rect, &draw_rect)) { gdk_draw_rectangle (drawable, render_state->fg_gc, FALSE, shape_rect.x, shape_rect.y, shape_rect.width, shape_rect.height); gdk_draw_line (drawable, render_state->fg_gc, shape_rect.x, shape_rect.y, shape_rect.x + shape_rect.width, shape_rect.y + shape_rect.height); gdk_draw_line (drawable, render_state->fg_gc, shape_rect.x + shape_rect.width, shape_rect.y, shape_rect.x, shape_rect.y + shape_rect.height); } shaped_width_pixels = shape_rect.width; } else if (GDK_IS_PIXBUF (shaped)) { gint width, height; GdkRectangle pixbuf_rect, draw_rect; GdkPixbuf *pixbuf; pixbuf = GDK_PIXBUF (shaped); width = gdk_pixbuf_get_width (pixbuf); height = gdk_pixbuf_get_height (pixbuf); pixbuf_rect.x = x + x_off / PANGO_SCALE; pixbuf_rect.y = risen_y - height; pixbuf_rect.width = width; pixbuf_rect.height = height; if (gdk_rectangle_intersect (&pixbuf_rect, &render_state->clip_rect, &draw_rect)) { gdk_draw_pixbuf (drawable, render_state->fg_gc, pixbuf, draw_rect.x - pixbuf_rect.x, draw_rect.y - pixbuf_rect.y, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height, GDK_RGB_DITHER_NORMAL, 0, 0); } shaped_width_pixels = width; } else if (GTK_IS_WIDGET (shaped)) { GtkWidget *widget; widget = GTK_WIDGET (shaped); shaped_width_pixels = widget->allocation.width; if (widgets) { g_object_ref (widget); *widgets = g_list_prepend (*widgets, widget); } } else g_assert_not_reached (); /* not a pixbuf or widget */ } switch (appearance->underline) { case PANGO_UNDERLINE_NONE: break; case PANGO_UNDERLINE_DOUBLE: g_assert (need_ink); gdk_draw_line (drawable, fg_gc, x + (x_off + ink_rect.x) / PANGO_SCALE - 1, risen_y + 3, x + (x_off + ink_rect.x + ink_rect.width) / PANGO_SCALE, risen_y + 3); /* Fall through */ case PANGO_UNDERLINE_SINGLE: g_assert (need_ink); gdk_draw_line (drawable, fg_gc, x + (x_off + ink_rect.x) / PANGO_SCALE - 1, risen_y + 1, x + (x_off + ink_rect.x + ink_rect.width) / PANGO_SCALE, risen_y + 1); break; case PANGO_UNDERLINE_LOW: g_assert (need_ink); gdk_draw_line (drawable, fg_gc, x + (x_off + ink_rect.x) / PANGO_SCALE - 1, risen_y + (ink_rect.y + ink_rect.height) / PANGO_SCALE + 1, x + (x_off + ink_rect.x + ink_rect.width) / PANGO_SCALE, risen_y + (ink_rect.y + ink_rect.height) / PANGO_SCALE + 1); break; } if (appearance->strikethrough) { gint strikethrough_y = risen_y + (0.3 * logical_rect.y) / PANGO_SCALE; g_assert (need_ink); gdk_draw_line (drawable, fg_gc, x + (x_off + ink_rect.x) / PANGO_SCALE - 1, strikethrough_y, x + (x_off + ink_rect.x + ink_rect.width) / PANGO_SCALE, strikethrough_y); } if (appearance->is_text) x_off += logical_rect.width; else x_off += shaped_width_pixels * PANGO_SCALE; } }