From 1f624659162e79c6a70a53866180edc5e7f400a5 Mon Sep 17 00:00:00 2001 From: Subhransu Mohanty Date: Fri, 3 Apr 2015 16:34:10 +0200 Subject: [PATCH] ector: add mul_col feature in Cairo backend and fixed color handling issue. Signed-off-by: Cedric BAIL --- .../ector/cairo/ector_renderer_cairo_base.c | 16 +++++----- .../ector_renderer_cairo_gradient_linear.c | 12 ++++++-- .../ector_renderer_cairo_gradient_radial.c | 13 ++++++-- .../ector/cairo/ector_renderer_cairo_shape.c | 30 +++++++++++-------- 4 files changed, 43 insertions(+), 28 deletions(-) diff --git a/src/lib/ector/cairo/ector_renderer_cairo_base.c b/src/lib/ector/cairo/ector_renderer_cairo_base.c index 4396817cd7..fad9016244 100644 --- a/src/lib/ector/cairo/ector_renderer_cairo_base.c +++ b/src/lib/ector/cairo/ector_renderer_cairo_base.c @@ -88,7 +88,6 @@ _ector_renderer_cairo_base_ector_renderer_generic_base_color_set(Eo *obj EINA_UN Ector_Renderer_Cairo_Base_Data *pd, int r, int g, int b, int a) { - ector_color_argb_unpremul(a, &r ,&g, &b); pd->generic->color.r = r; pd->generic->color.g = g; pd->generic->color.b = b; @@ -104,8 +103,6 @@ _ector_renderer_cairo_base_ector_renderer_generic_base_color_get(Eo *obj EINA_UN if (g) *g = pd->generic->color.g; if (b) *b = pd->generic->color.b; if (a) *a = pd->generic->color.a; - - ector_color_argb_premul(pd->generic->color.a, r, g, b); } static Eina_Bool @@ -145,7 +142,7 @@ _ector_renderer_cairo_base_ector_renderer_generic_base_draw(Eo *obj, Eina_Array *clips EINA_UNUSED, unsigned int mul_col) { - double r, g, b, a; + int r, g, b, a; cairo_operator_t cop; double cx, cy; @@ -165,10 +162,11 @@ _ector_renderer_cairo_base_ector_renderer_generic_base_draw(Eo *obj, break; } - r = ((double)((pd->generic->color.r * R_VAL(&mul_col)) >> 8)) / 255; - g = ((double)((pd->generic->color.g * G_VAL(&mul_col)) >> 8)) / 255; - b = ((double)((pd->generic->color.b * B_VAL(&mul_col)) >> 8)) / 255; - a = ((double)((pd->generic->color.a * A_VAL(&mul_col)) >> 8)) / 255; + r = ((pd->generic->color.r * R_VAL(&mul_col)) >> 8); + g = ((pd->generic->color.g * G_VAL(&mul_col)) >> 8); + b = ((pd->generic->color.b * B_VAL(&mul_col)) >> 8); + a = ((pd->generic->color.a * A_VAL(&mul_col)) >> 8); + ector_color_argb_unpremul(a, &r, &g, &b); cairo_set_operator(pd->parent->cairo, cop); cairo_transform(pd->parent->cairo, &identity); @@ -179,7 +177,7 @@ _ector_renderer_cairo_base_ector_renderer_generic_base_draw(Eo *obj, pd->parent->current.x = pd->generic->origin.x; pd->parent->current.y = pd->generic->origin.y; - cairo_set_source_rgba(pd->parent->cairo, r, g, b, a); + cairo_set_source_rgba(pd->parent->cairo, r/255.0, g/255.0, b/255.0, a/255.0); USE(obj, cairo_new_path, EINA_FALSE); USE(obj, cairo_rectangle, EINA_FALSE); diff --git a/src/lib/ector/cairo/ector_renderer_cairo_gradient_linear.c b/src/lib/ector/cairo/ector_renderer_cairo_gradient_linear.c index 0764062082..ce4097bb7f 100644 --- a/src/lib/ector/cairo/ector_renderer_cairo_gradient_linear.c +++ b/src/lib/ector/cairo/ector_renderer_cairo_gradient_linear.c @@ -51,10 +51,16 @@ _ector_renderer_cairo_gradient_linear_ector_renderer_generic_base_prepare(Eo *ob pd->pat = cairo_pattern_create_linear(gld->start.x, gld->start.y, gld->end.x, gld->end.y); + int r,g,b,a; for (i = 0; i < gd->colors_count; i++) - cairo_pattern_add_color_stop_rgba(pd->pat, gd->colors[i].offset, - gd->colors[i].r, gd->colors[i].g, - gd->colors[i].b, gd->colors[i].a); + { + r = gd->colors[i].r; + g = gd->colors[i].g; + b = gd->colors[i].b; + a = gd->colors[i].a; + ector_color_argb_unpremul(a, &r, &g, &b); + cairo_pattern_add_color_stop_rgba(pd->pat, gd->colors[i].offset, r/255.0, g/255.0, b/255.0, a/255.0); + } USE(obj, cairo_pattern_set_extend, EINA_FALSE); cairo_pattern_set_extend(pd->pat, gd->s); diff --git a/src/lib/ector/cairo/ector_renderer_cairo_gradient_radial.c b/src/lib/ector/cairo/ector_renderer_cairo_gradient_radial.c index cb84c53e38..4e07754f40 100644 --- a/src/lib/ector/cairo/ector_renderer_cairo_gradient_radial.c +++ b/src/lib/ector/cairo/ector_renderer_cairo_gradient_radial.c @@ -55,10 +55,17 @@ _ector_renderer_cairo_gradient_radial_ector_renderer_generic_base_prepare(Eo *ob pd->pat = cairo_pattern_create_radial(grd->focal.x, grd->focal.y, 0, grd->radial.x, grd->radial.y, grd->radius); + + int r,g,b,a; for (i = 0; i < gd->colors_count; i++) - cairo_pattern_add_color_stop_rgba(pd->pat, gd->colors[i].offset, - gd->colors[i].r, gd->colors[i].g, - gd->colors[i].b, gd->colors[i].a); + { + r = gd->colors[i].r; + g = gd->colors[i].g; + b = gd->colors[i].b; + a = gd->colors[i].a; + ector_color_argb_unpremul(a, &r, &g, &b); + cairo_pattern_add_color_stop_rgba(pd->pat, gd->colors[i].offset, r/255.0, g/255.0, b/255.0, a/255.0); + } USE(obj, cairo_pattern_set_extend, EINA_FALSE); cairo_pattern_set_extend(pd->pat, gd->s); diff --git a/src/lib/ector/cairo/ector_renderer_cairo_shape.c b/src/lib/ector/cairo/ector_renderer_cairo_shape.c index 54f6962a63..b064a5a18c 100644 --- a/src/lib/ector/cairo/ector_renderer_cairo_shape.c +++ b/src/lib/ector/cairo/ector_renderer_cairo_shape.c @@ -149,9 +149,9 @@ _ector_renderer_cairo_shape_ector_renderer_generic_base_prepare(Eo *obj, Ector_R static Eina_Bool _ector_renderer_cairo_shape_ector_renderer_generic_base_draw(Eo *obj, Ector_Renderer_Cairo_Shape_Data *pd, Ector_Rop op, Eina_Array *clips, unsigned int mul_col) { + int r, g, b, a; if (pd->path == NULL) return EINA_FALSE; - // FIXME: find a way to set multiple clips eo_do_super(obj, ECTOR_RENDERER_CAIRO_SHAPE_CLASS, ector_renderer_draw(op, clips, mul_col)); USE(obj, cairo_new_path, EINA_FALSE); @@ -163,7 +163,7 @@ _ector_renderer_cairo_shape_ector_renderer_generic_base_draw(Eo *obj, Ector_Rend if (pd->shape->fill) eo_do(pd->shape->fill, ector_renderer_cairo_base_fill()); - if (pd->shape->stroke.color.a > 0) + if (pd->shape->stroke.fill || pd->shape->stroke.color.a > 0) { USE(obj, cairo_fill_preserve, EINA_FALSE); USE(obj, cairo_set_source_rgba, EINA_FALSE); @@ -174,19 +174,23 @@ _ector_renderer_cairo_shape_ector_renderer_generic_base_draw(Eo *obj, Ector_Rend cairo_fill_preserve(pd->parent->cairo); - cairo_set_source_rgba(pd->parent->cairo, - pd->shape->stroke.color.r / 255.0, - pd->shape->stroke.color.g / 255.0, - pd->shape->stroke.color.b / 255.0, - pd->shape->stroke.color.a / 255.0); - if (pd->shape->stroke.fill) eo_do(pd->shape->stroke.fill, ector_renderer_cairo_base_fill()); - // Set dash, cap and join - cairo_set_line_width(pd->parent->cairo, (pd->shape->stroke.width * pd->shape->stroke.scale)); - cairo_set_line_cap(pd->parent->cairo, pd->shape->stroke.cap); - cairo_set_line_join(pd->parent->cairo, pd->shape->stroke.join); - cairo_stroke(pd->parent->cairo); + else + { + r = (((pd->shape->stroke.color.r * R_VAL(&mul_col)) + 0xff) >> 8); + g = (((pd->shape->stroke.color.g * G_VAL(&mul_col)) + 0xff) >> 8); + b = (((pd->shape->stroke.color.b * B_VAL(&mul_col)) + 0xff) >> 8); + a = (((pd->shape->stroke.color.a * A_VAL(&mul_col)) + 0xff) >> 8); + ector_color_argb_unpremul(a, &r, &g, &b); + cairo_set_source_rgba(pd->parent->cairo, r/255.0, g/255.0, b/255.0, a/255.0); + } + + // Set dash, cap and join + cairo_set_line_width(pd->parent->cairo, (pd->shape->stroke.width * pd->shape->stroke.scale * 2)); + cairo_set_line_cap(pd->parent->cairo, pd->shape->stroke.cap); + cairo_set_line_join(pd->parent->cairo, pd->shape->stroke.join); + cairo_stroke(pd->parent->cairo); } else {