hermet pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=29892a26f8eb6b7620d78651a4aabc0dcea15f7e

commit 29892a26f8eb6b7620d78651a4aabc0dcea15f7e
Author: Hermet Park <hermetp...@gmail.com>
Date:   Tue Nov 19 13:18:42 2019 +0900

    vector svg: apply fill-opacity to graidents fill objects.
    
    If node has a fill-opacity attirbute it must propagtes it to
    its fill objects.
    
    Previous our implementation missed this behavior.
    
    @fix
---
 src/static_libs/vg_common/vg_common_svg.c | 24 ++++++++++++++----------
 1 file changed, 14 insertions(+), 10 deletions(-)

diff --git a/src/static_libs/vg_common/vg_common_svg.c 
b/src/static_libs/vg_common/vg_common_svg.c
index 1d01f9f243..526787df0d 100644
--- a/src/static_libs/vg_common/vg_common_svg.c
+++ b/src/static_libs/vg_common/vg_common_svg.c
@@ -544,7 +544,7 @@ vg_common_svg_node_free(Svg_Node *node)
 }
 
 static Efl_VG *
-_apply_gradient_property(Svg_Style_Gradient *g, Efl_VG *vg, Efl_VG *parent, 
Vg_File_Data *vg_data)
+_apply_gradient_property(Svg_Style_Gradient *g, Efl_VG *vg, Efl_VG *parent, 
Vg_File_Data *vg_data, int fill_opacity)
 {
    Efl_VG *grad_obj = NULL;
    Efl_Gfx_Gradient_Stop *stops, *stop;
@@ -678,23 +678,26 @@ _apply_gradient_property(Svg_Style_Gradient *g, Efl_VG 
*vg, Efl_VG *parent, Vg_F
         // not a known gradient
         return NULL;
      }
+
    // apply common prperty
    efl_gfx_gradient_spread_set(grad_obj, g->spread);
+
    // update the stops
    stop_count = eina_list_count(g->stops);
    if (stop_count)
      {
         double opacity;
+        double fopacity = ((double) fill_opacity) / 255;   //fill opacity if 
any exists.
         stops = calloc(stop_count, sizeof(Efl_Gfx_Gradient_Stop));
         i = 0;
         EINA_LIST_FOREACH(g->stops, l, stop)
           {
              // Use premultiplied color
-             opacity = (double)stop->a / 255;
-             stops[i].r = stop->r * opacity;
-             stops[i].g = stop->g * opacity;
-             stops[i].b = stop->b * opacity;
-             stops[i].a = stop->a;
+             opacity = ((double) stop->a / 255) * fopacity;
+             stops[i].r = (stop->r * opacity);
+             stops[i].g = (stop->g * opacity);
+             stops[i].b = (stop->b * opacity);
+             stops[i].a = (stop->a * fopacity);
              stops[i].offset = stop->offset;
              i++;
           }
@@ -727,8 +730,8 @@ _apply_vg_property(Svg_Node *node, Efl_VG *vg, Efl_VG 
*parent, Vg_File_Data *vg_
      }
    else if (style->fill.paint.gradient)
      {
-        // if the fill has gradient then apply.
-        efl_canvas_vg_shape_fill_set(vg, 
_apply_gradient_property(style->fill.paint.gradient, vg, parent, vg_data));
+        Efl_VG *gradient = 
_apply_gradient_property(style->fill.paint.gradient, vg, parent, vg_data, 
style->fill.opacity);
+        efl_canvas_vg_shape_fill_set(vg, gradient);
      }
    else if (style->fill.paint.cur_color)
      {
@@ -758,11 +761,11 @@ _apply_vg_property(Svg_Node *node, Efl_VG *vg, Efl_VG 
*parent, Vg_File_Data *vg_
 
    // apply the fill style property
    efl_gfx_shape_fill_rule_set(vg, style->fill.fill_rule);
-
    efl_gfx_shape_stroke_width_set(vg, style->stroke.width);
    efl_gfx_shape_stroke_cap_set(vg, style->stroke.cap);
    efl_gfx_shape_stroke_join_set(vg, style->stroke.join);
    efl_gfx_shape_stroke_scale_set(vg, style->stroke.scale);
+
    // if stroke property is NULL then do nothing
    if (style->stroke.paint.none)
      {
@@ -771,7 +774,8 @@ _apply_vg_property(Svg_Node *node, Efl_VG *vg, Efl_VG 
*parent, Vg_File_Data *vg_
    else if (style->stroke.paint.gradient)
      {
         // if the fill has gradient then apply.
-        efl_canvas_vg_shape_stroke_fill_set(vg, 
_apply_gradient_property(style->stroke.paint.gradient, vg, parent, vg_data));
+        Efl_VG *gradient = 
_apply_gradient_property(style->stroke.paint.gradient, vg, parent, vg_data, 
255);
+        efl_canvas_vg_shape_stroke_fill_set(vg, gradient);
      }
    else if (style->stroke.paint.url)
      {

-- 


Reply via email to