void GtkPaintContext::updatePixmap(GtkWidget *area, int w, int h) { if ((myPixmap != 0) && ((myWidth != w) || (myHeight != h))) { gdk_pixmap_unref(myPixmap); myPixmap = 0; if (myTextGC != 0) { gdk_gc_unref(myTextGC); gdk_gc_unref(myFillGC); gdk_gc_unref(myBackGC); myTextGC = 0; myFillGC = 0; myBackGC = 0; } } if (myPixmap == 0) { myWidth = w; myHeight = h; myPixmap = gdk_pixmap_new(area->window, myWidth, myHeight, gdk_drawable_get_depth(area->window)); } if (myTextGC == 0) { myTextGC = gdk_gc_new(myPixmap); myFillGC = gdk_gc_new(myPixmap); myBackGC = gdk_gc_new(myPixmap); } if (myContext == 0) { myContext = gtk_widget_get_pango_context(area); if (myFontDescription != 0) { myAnalysis.font = pango_context_load_font(myContext, myFontDescription); myAnalysis.shape_engine = pango_font_find_shaper(myAnalysis.font, 0, 0); } } }
static VALUE rg_find_shaper(VALUE self, VALUE language, VALUE ch) { return GOBJ2RVAL(pango_font_find_shaper(_SELF(self), RVAL2PANGOLANGUAGE(language), NUM2UINT(ch))); }
void ZLGtkPaintContext::setFont(const std::string &family, int size, bool bold, bool italic) { bool fontChanged = false; if (myFontDescription == 0) { myFontDescription = pango_font_description_new(); fontChanged = true; } const char *oldFamily = pango_font_description_get_family(myFontDescription); if ((oldFamily == 0) || (family != oldFamily)) { pango_font_description_set_family(myFontDescription, family.c_str()); fontChanged = true; } int newSize = size * PANGO_SCALE; if (pango_font_description_get_size(myFontDescription) != newSize) { pango_font_description_set_size(myFontDescription, newSize); fontChanged = true; } PangoWeight newWeight = bold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL; if (pango_font_description_get_weight(myFontDescription) != newWeight) { pango_font_description_set_weight(myFontDescription, newWeight); fontChanged = true; } PangoStyle newStyle = italic ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL; if (pango_font_description_get_style(myFontDescription) != newStyle) { pango_font_description_set_style(myFontDescription, newStyle); fontChanged = true; } if (fontChanged) { if (myContext != 0) { myAnalysis.font = pango_context_load_font(myContext, myFontDescription); myAnalysis.shape_engine = pango_font_find_shaper(myAnalysis.font, 0, 0); PangoFontMetrics *metrics = pango_font_get_metrics(myAnalysis.font, myAnalysis.language); myDescent = pango_font_metrics_get_descent(metrics) / PANGO_SCALE; } myStringHeight = -1; mySpaceWidth = -1; } }