ector: add mul_col feature in Cairo backend and fixed color handling issue.

Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
This commit is contained in:
Subhransu Mohanty 2015-04-03 16:34:10 +02:00 committed by Cedric BAIL
parent c9aaa12c07
commit 1f62465916
4 changed files with 43 additions and 28 deletions

View 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);

View 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);

View 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);

View 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
{