ector: add mul_col feature in Cairo backend and fixed color handling issue.
authorSubhransu Mohanty <sub.mohanty@samsung.com>
Fri, 3 Apr 2015 14:34:10 +0000 (16:34 +0200)
committerCedric BAIL <cedric@osg.samsung.com>
Fri, 3 Apr 2015 14:34:10 +0000 (16:34 +0200)
Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
src/lib/ector/cairo/ector_renderer_cairo_base.c
src/lib/ector/cairo/ector_renderer_cairo_gradient_linear.c
src/lib/ector/cairo/ector_renderer_cairo_gradient_radial.c
src/lib/ector/cairo/ector_renderer_cairo_shape.c

index 4396817..fad9016 100644 (file)
@@ -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);
index 0764062..ce4097b 100644 (file)
@@ -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);
index cb84c53..4e07754 100644 (file)
@@ -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);
index 54f6962..b064a5a 100644 (file)
@@ -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
      {