diff options
author | Matthias Clasen <mclasen@redhat.com> | 2017-09-01 01:21:33 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2017-09-01 12:06:05 -0400 |
commit | 7ac5d5c11b8063188c2bd785fc73ee39d11b4ab5 (patch) | |
tree | 275c4fdbcd96cdeef431b1fec525a06b9be84277 | |
parent | acf7819b7647342fc40b7ccc27ef521ded193354 (diff) | |
download | gtk+-wip/matthiasc/gskpango.tar.gz |
Simplifywip/matthiasc/gskpango
Make color handling a bit simpler, and stop doing hex boxes
in the pango renderer. They should just end up in the texture
atlas eventually, like any other glyph.
-rw-r--r-- | gtk/gskpango.c | 120 |
1 files changed, 22 insertions, 98 deletions
diff --git a/gtk/gskpango.c b/gtk/gskpango.c index 83376e4e66..09dbe5a95f 100644 --- a/gtk/gskpango.c +++ b/gtk/gskpango.c @@ -51,7 +51,7 @@ struct _GskPangoRendererClass G_DEFINE_TYPE (GskPangoRenderer, gsk_pango_renderer, PANGO_TYPE_RENDERER) -static gboolean +static void get_color (GskPangoRenderer *crenderer, PangoRenderPart part, GdkRGBA *rgba) @@ -60,8 +60,10 @@ get_color (GskPangoRenderer *crenderer, guint16 a = pango_renderer_get_alpha ((PangoRenderer *) (crenderer), part); gdouble red, green, blue, alpha; - if (!a && !color) - return FALSE; + red = crenderer->fg_color->red; + green = crenderer->fg_color->green; + blue = crenderer->fg_color->blue; + alpha = crenderer->fg_color->alpha; if (color) { @@ -70,8 +72,6 @@ get_color (GskPangoRenderer *crenderer, blue = color->blue / 65535.; alpha = 1.; } - else - return FALSE; if (a) alpha = a / 65535.; @@ -80,8 +80,6 @@ get_color (GskPangoRenderer *crenderer, rgba->green = green; rgba->blue = blue; rgba->alpha = alpha; - - return TRUE; } static void @@ -91,35 +89,8 @@ set_color (GskPangoRenderer *crenderer, { GdkRGBA rgba = { 0, 0, 0, 1 }; - if (get_color (crenderer, part, &rgba)) - gdk_cairo_set_source_rgba (cr, &rgba); - else - gdk_cairo_set_source_rgba (cr, crenderer->fg_color); -} - -static void -gsk_pango_renderer_draw_unknown_glyph (GskPangoRenderer *crenderer, - PangoFont *font, - PangoGlyphInfo *gi, - double cx, - double cy) -{ - cairo_t *cr; - PangoGlyphString *glyphs; - - cr = gtk_snapshot_append_cairo (crenderer->snapshot, &crenderer->bounds, "DrawUnknownGlyph<%u>", gi->glyph); - - gdk_cairo_set_source_rgba (cr, crenderer->fg_color); - - cairo_move_to (cr, cx, cy); - - glyphs = pango_glyph_string_new (); - pango_glyph_string_set_size (glyphs, 1); - glyphs->glyphs[0] = *gi; - - pango_cairo_show_glyph_string (cr, font, glyphs); - - cairo_destroy (cr); + get_color (crenderer, part, &rgba); + gdk_cairo_set_source_rgba (cr, &rgba); } static void @@ -135,68 +106,26 @@ gsk_pango_renderer_show_text_glyphs (PangoRenderer *renderer, int y) { GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer); - double base_x = crenderer->x_offset + (double)x / PANGO_SCALE; - double base_y = crenderer->y_offset + (double)y / PANGO_SCALE; + double base_x = (double)x / PANGO_SCALE; + double base_y = (double)y / PANGO_SCALE; int x_offset, y_offset; - cairo_scaled_font_t *scaled_font; - gboolean font_failed = FALSE; - int x_position; - int num_glyphs; - int i; + GdkRGBA color; + GskRenderNode *node; + char name[64]; gtk_snapshot_get_offset (crenderer->snapshot, &x_offset, &y_offset); - scaled_font = pango_cairo_font_get_scaled_font ((PangoCairoFont *)font); - if (scaled_font == NULL || cairo_scaled_font_status (scaled_font) != CAIRO_STATUS_SUCCESS) - font_failed = TRUE; + gtk_snapshot_offset (crenderer->snapshot, base_x, base_y); - x_position = 0; - num_glyphs = 0; - for (i = 0; i < glyphs->num_glyphs; i++) - { - PangoGlyphInfo *gi = &glyphs->glyphs[i]; - - if (gi->glyph != PANGO_GLYPH_EMPTY && - (font_failed || gi->glyph & PANGO_GLYPH_UNKNOWN_FLAG)) - { - double cx = base_x + (double)(x_position + gi->geometry.x_offset) / PANGO_SCALE; - double cy = gi->geometry.y_offset == 0 - ? base_y - : base_y + (double)(gi->geometry.y_offset) / PANGO_SCALE; - - gsk_pango_renderer_draw_unknown_glyph (crenderer, font, gi, cx, cy); - - if (num_glyphs == 0) - base_x += (gi->geometry.x_offset + gi->geometry.width) / PANGO_SCALE; - else - glyphs->glyphs[num_glyphs - 1].geometry.width += gi->geometry.x_offset + gi->geometry.width; - } - else - { - if (i != num_glyphs) - glyphs->glyphs[num_glyphs] = glyphs->glyphs[i]; - num_glyphs++; - } - x_position += gi->geometry.width; - } - - glyphs->num_glyphs = num_glyphs; - - if (glyphs->num_glyphs > 0) - { - GskRenderNode *node; - char name[64]; + get_color (crenderer, PANGO_RENDER_PART_FOREGROUND, &color); - gtk_snapshot_offset (crenderer->snapshot, base_x, base_y); + node = gsk_text_node_new (font, glyphs, &color, x_offset, y_offset, base_x, base_y); + snprintf (name, sizeof (name), "Glyphs<%d>", glyphs->num_glyphs); + gsk_render_node_set_name (node, name); + gtk_snapshot_append_node (crenderer->snapshot, node); + gsk_render_node_unref (node); - node = gsk_text_node_new (font, glyphs, crenderer->fg_color, x_offset, y_offset, base_x, base_y); - snprintf (name, sizeof (name), "Glyphs<%d>", glyphs->num_glyphs); - gsk_render_node_set_name (node, name); - gtk_snapshot_append_node (crenderer->snapshot, node); - gsk_render_node_unref (node); - - gtk_snapshot_offset (crenderer->snapshot, -base_x, -base_y); - } + gtk_snapshot_offset (crenderer->snapshot, -base_x, -base_y); } static void @@ -234,8 +163,7 @@ gsk_pango_renderer_draw_rectangle (PangoRenderer *renderer, GdkRGBA rgba; graphene_rect_t bounds; - if (!get_color (crenderer, part, &rgba)) - rgba = *crenderer->fg_color; + get_color (crenderer, part, &rgba); graphene_rect_init (&bounds, crenderer->x_offset + (double)x / PANGO_SCALE, @@ -362,14 +290,10 @@ gsk_pango_renderer_draw_error_underline (PangoRenderer *renderer, { GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer); cairo_t *cr; - GdkRGBA rgba = { 0, 0, 0, 1 }; cr = gtk_snapshot_append_cairo (crenderer->snapshot, &crenderer->bounds, "DrawTrapezoid"); - if (get_color (crenderer, PANGO_RENDER_PART_UNDERLINE, &rgba)) - gdk_cairo_set_source_rgba (cr, &rgba); - else - gdk_cairo_set_source_rgba (cr, crenderer->fg_color); + set_color (crenderer, PANGO_RENDER_PART_UNDERLINE, cr); cairo_new_path (cr); |