diff --git a/clutter/pango/cogl-pango-display-list.c b/clutter/pango/cogl-pango-display-list.c index 70f640517..1e16a76f3 100644 --- a/clutter/pango/cogl-pango-display-list.c +++ b/clutter/pango/cogl-pango-display-list.c @@ -43,6 +43,7 @@ typedef struct _CoglPangoDisplayListVertex CoglPangoDisplayListVertex; struct _CoglPangoDisplayList { + gboolean color_override; CoglColor color; GSList *nodes; GSList *last_node; @@ -52,6 +53,7 @@ struct _CoglPangoDisplayListNode { CoglPangoDisplayListNodeType type; + gboolean color_override; CoglColor color; union @@ -106,12 +108,19 @@ _cogl_pango_display_list_append_node (CoglPangoDisplayList *dl, } void -_cogl_pango_display_list_set_color (CoglPangoDisplayList *dl, - const CoglColor *color) +_cogl_pango_display_list_set_color_override (CoglPangoDisplayList *dl, + const CoglColor *color) { + dl->color_override = TRUE; dl->color = *color; } +void +_cogl_pango_display_list_remove_color_override (CoglPangoDisplayList *dl) +{ + dl->color_override = FALSE; +} + void _cogl_pango_display_list_add_texture (CoglPangoDisplayList *dl, CoglHandle texture, @@ -128,7 +137,10 @@ _cogl_pango_display_list_add_texture (CoglPangoDisplayList *dl, if (dl->last_node && (node = dl->last_node->data)->type == COGL_PANGO_DISPLAY_LIST_TEXTURE && node->d.texture.texture == texture - && !memcmp (&dl->color, &node->color, sizeof (CoglColor))) + && (dl->color_override + ? (node->color_override && !memcmp (&dl->color, &node->color, + sizeof (CoglColor))) + : !node->color_override)) { /* Get rid of the vertex buffer so that it will be recreated */ if (node->d.texture.vertex_buffer != COGL_INVALID_HANDLE) @@ -143,6 +155,7 @@ _cogl_pango_display_list_add_texture (CoglPangoDisplayList *dl, node = g_slice_new (CoglPangoDisplayListNode); node->type = COGL_PANGO_DISPLAY_LIST_TEXTURE; + node->color_override = dl->color_override; node->color = dl->color; node->d.texture.texture = cogl_texture_ref (texture); node->d.texture.verts @@ -187,6 +200,7 @@ _cogl_pango_display_list_add_rectangle (CoglPangoDisplayList *dl, CoglPangoDisplayListNode *node = g_slice_new (CoglPangoDisplayListNode); node->type = COGL_PANGO_DISPLAY_LIST_RECTANGLE; + node->color_override = dl->color_override; node->color = dl->color; node->d.rectangle.x_1 = x_1; node->d.rectangle.y_1 = y_1; @@ -208,6 +222,7 @@ _cogl_pango_display_list_add_trapezoid (CoglPangoDisplayList *dl, CoglPangoDisplayListNode *node = g_slice_new (CoglPangoDisplayListNode); node->type = COGL_PANGO_DISPLAY_LIST_TRAPEZOID; + node->color_override = dl->color_override; node->color = dl->color; node->d.trapezoid.y_1 = y_1; node->d.trapezoid.x_11 = x_11; @@ -221,10 +236,11 @@ _cogl_pango_display_list_add_trapezoid (CoglPangoDisplayList *dl, static void _cogl_pango_display_list_render_texture (CoglHandle material, + const CoglColor *color, CoglPangoDisplayListNode *node) { cogl_material_set_layer (material, 0, node->d.texture.texture); - cogl_material_set_color (material, &node->color); + cogl_material_set_color (material, color); cogl_set_source (material); if (node->d.texture.vertex_buffer == COGL_INVALID_HANDLE) @@ -274,6 +290,7 @@ _cogl_pango_display_list_render_texture (CoglHandle material, void _cogl_pango_display_list_render (CoglPangoDisplayList *dl, + const CoglColor *color, CoglHandle glyph_material, CoglHandle solid_material) { @@ -282,15 +299,28 @@ _cogl_pango_display_list_render (CoglPangoDisplayList *dl, for (l = dl->nodes; l; l = l->next) { CoglPangoDisplayListNode *node = l->data; + CoglColor draw_color; + + if (node->color_override) + /* Use the override color but preserve the alpha from the + draw color */ + cogl_color_set_from_4ub (&draw_color, + cogl_color_get_red_byte (&node->color), + cogl_color_get_green_byte (&node->color), + cogl_color_get_blue_byte (&node->color), + cogl_color_get_alpha_byte (color)); + else + draw_color = *color; switch (node->type) { case COGL_PANGO_DISPLAY_LIST_TEXTURE: - _cogl_pango_display_list_render_texture (glyph_material, node); + _cogl_pango_display_list_render_texture (glyph_material, + &draw_color, node); break; case COGL_PANGO_DISPLAY_LIST_RECTANGLE: - cogl_material_set_color (solid_material, &node->color); + cogl_material_set_color (solid_material, &draw_color); cogl_set_source (solid_material); cogl_rectangle (node->d.rectangle.x_1, node->d.rectangle.y_1, @@ -311,7 +341,7 @@ _cogl_pango_display_list_render (CoglPangoDisplayList *dl, points[6] = node->d.trapezoid.x_21; points[7] = node->d.trapezoid.y_1; - cogl_material_set_color (solid_material, &node->color); + cogl_material_set_color (solid_material, &draw_color); cogl_set_source (solid_material); cogl_path_polygon (points, 4); cogl_path_fill (); diff --git a/clutter/pango/cogl-pango-display-list.h b/clutter/pango/cogl-pango-display-list.h index a2b123208..6971b7e40 100644 --- a/clutter/pango/cogl-pango-display-list.h +++ b/clutter/pango/cogl-pango-display-list.h @@ -33,8 +33,9 @@ typedef struct _CoglPangoDisplayList CoglPangoDisplayList; CoglPangoDisplayList *_cogl_pango_display_list_new (void); -void _cogl_pango_display_list_set_color (CoglPangoDisplayList *dl, - const CoglColor *color); +void _cogl_pango_display_list_set_color_override (CoglPangoDisplayList *dl, + const CoglColor *color); +void _cogl_pango_display_list_remove_color_override (CoglPangoDisplayList *dl); void _cogl_pango_display_list_add_texture (CoglPangoDisplayList *dl, CoglHandle texture, @@ -56,6 +57,7 @@ void _cogl_pango_display_list_add_trapezoid (CoglPangoDisplayList *dl, float x_22); void _cogl_pango_display_list_render (CoglPangoDisplayList *dl, + const CoglColor *color, CoglHandle glyph_material, CoglHandle solid_material); diff --git a/clutter/pango/cogl-pango-render.c b/clutter/pango/cogl-pango-render.c index 89c89c481..ffa224e65 100644 --- a/clutter/pango/cogl-pango-render.c +++ b/clutter/pango/cogl-pango-render.c @@ -42,8 +42,6 @@ struct _CoglPangoRenderer { PangoRenderer parent_instance; - /* The color to draw the glyphs with */ - CoglColor color; /* The material used to texture from the glyph cache with */ CoglHandle glyph_material; /* The material used for solid fills. (boxes, rectangles + trapezoids) */ @@ -261,7 +259,6 @@ cogl_pango_render_layout_subpixel (PangoLayout *layout, { qdata->display_list = _cogl_pango_display_list_new (); - priv->color = *color; priv->display_list = qdata->display_list; pango_renderer_draw_layout (PANGO_RENDERER (priv), layout, 0, 0); priv->display_list = NULL; @@ -270,6 +267,7 @@ cogl_pango_render_layout_subpixel (PangoLayout *layout, cogl_push_matrix (); cogl_translate (x / (gfloat) PANGO_SCALE, y / (gfloat) PANGO_SCALE, 0); _cogl_pango_display_list_render (qdata->display_list, + color, priv->glyph_material, priv->solid_material); cogl_pop_matrix (); @@ -340,13 +338,11 @@ cogl_pango_render_layout_line (PangoLayoutLine *line, return; priv->display_list = _cogl_pango_display_list_new (); - priv->color = *color; pango_renderer_draw_layout_line (PANGO_RENDERER (priv), line, x, y); - cogl_material_set_color (priv->glyph_material, color); - cogl_material_set_color (priv->solid_material, color); _cogl_pango_display_list_render (priv->display_list, + color, priv->glyph_material, priv->solid_material); @@ -492,19 +488,21 @@ cogl_pango_renderer_set_color_for_part (PangoRenderer *renderer, { PangoColor *pango_color = pango_renderer_get_color (renderer, part); CoglPangoRenderer *priv = COGL_PANGO_RENDERER (renderer); - CoglColor color; if (pango_color) { - color.red = pango_color->red >> 8; - color.green = pango_color->green >> 8; - color.blue = pango_color->blue >> 8; - color.alpha = priv->color.alpha; + CoglColor color; + + cogl_color_set_from_4ub (&color, + pango_color->red >> 8, + pango_color->green >> 8, + pango_color->blue >> 8, + 0xff); + + _cogl_pango_display_list_set_color_override (priv->display_list, &color); } else - color = priv->color; - - _cogl_pango_display_list_set_color (priv->display_list, &color); + _cogl_pango_display_list_remove_color_override (priv->display_list); } static void