evas json: Implemenent missing linear gradient and stroke cap. 67/192867/3
authorHermet Park <hermetpark@gmail.com>
Fri, 9 Nov 2018 13:02:30 +0000 (22:02 +0900)
committerHermet Park <hermetpark@gmail.com>
Mon, 12 Nov 2018 07:49:29 +0000 (16:49 +0900)
Change-Id: Id5daed129bd0e2173cdac5d2deff0b4af71cfa2f

src/static_libs/vg_common/vg_common_json.c

index 4bfd65c..4f56be2 100644 (file)
@@ -23,8 +23,6 @@ vg_common_json_create_vg_node(Vg_File_Data *vfd)
    lottie_animation_prepare_frame(lot_anim, frame_num, vfd->view_box.w, vfd->view_box.h);
    int size = lottie_animation_get_node_count(lot_anim);
 
-   //ERR("data json vfd = %p, lot_anim = %p, size = %d, root(%p) viewbox(%d %d %d %d) progress(%f)", vfd, lot_anim, size, root, vfd->view_box.x, vfd->view_box.y, vfd->view_box.w, vfd->view_box.h, progress);
-
    //Construct vg tree
    for (int i = 0; i < size; i++)
      {
@@ -32,20 +30,21 @@ vg_common_json_create_vg_node(Vg_File_Data *vfd)
         if (!p) continue;
 
 #ifdef PRINT_LOTTIE_INFO
-        ERR("%f[%d] node(%p)", progress, i, p);
+        ERR("%d[%d] node(%p)", frame_num, i, p);
         ERR("\t Flag - None(%d), Path(%d), Paint(%d), All(%d)", p->mFlag&ChangeFlagNone, p->mFlag&ChangeFlagPath, p->mFlag&ChangeFlagPaint, p->mFlag&ChangeFlagAll);
-        ERR("\t BrushType - mType(%d)", p->mType);
+        ERR("\t BrushType - mType(%d)", p->mBrushType);
         ERR("\t FillRule - mFillRule(%d)", p->mFillRule);
         ERR("\t PathData - ptPtr(%p), ptCount(%d), elmPtr(%p), elmCount(%d)", p->mPath.ptPtr, p->mPath.ptCount, p->mPath.elmPtr, p->mPath.elmCount);
         ERR("\t Color - r(%d) g(%d) b(%d) a(%d)", p->mColor.r, p->mColor.g, p->mColor.b, p->mColor.a);
         ERR("\t Stroke - enable(%d), width(%d), cap(%d), join(%d), meterLimit(%d), dashArray(%p), dashArraySize(%d)", p->mStroke.enable, p->mStroke.width, p->mStroke.cap, p->mStroke.join, p->mStroke.meterLimit, p->mStroke.dashArray, p->mStroke.dashArraySize);
-        ERR("\t Gradient - type(%d), start(%f %f), end(%f %f), center(%f %f), focal(%f %f), center_radius(%f) focal_radius(%f)", p->mGradient.type, p->mGradient.start.x, p->mGradient.start.y, p->mGradient.end.x, p->mGradient.end.y, p->mGradient.center.x, p->mGradient.center.y, p->mGradient.focal.x, p->mGradient.focal.y, p->mGradient.cradius, p->mGradient.fradius);
+        ERR("\t Gradient - type(%d), stopCnt(%d) start(%f %f), end(%f %f), center(%f %f), focal(%f %f), center_radius(%f) focal_radius(%f)", p->mGradient.type, p->mGradient.stopCount, p->mGradient.start.x, p->mGradient.start.y, p->mGradient.end.x, p->mGradient.end.y, p->mGradient.center.x, p->mGradient.center.y, p->mGradient.focal.x, p->mGradient.focal.y, p->mGradient.cradius, p->mGradient.fradius);
         ERR("\n");
 #endif
 
         Efl_VG* shape = evas_vg_shape_add(root);
         if (!shape) continue;
 
+        //0: Path
         const float *data = p->mPath.ptPtr;
         if (!data) continue;
 
@@ -53,7 +52,7 @@ vg_common_json_create_vg_node(Vg_File_Data *vfd)
           {
              switch (p->mPath.elmPtr[i])
                {
-                case 0: //moveTo
+                case 0:
                    evas_vg_shape_append_move_to(shape, data[0], data[1]);
                    data += 2;
                    break;
@@ -69,23 +68,87 @@ vg_common_json_create_vg_node(Vg_File_Data *vfd)
                    evas_vg_shape_append_close(shape);
                    break;
                 default:
-                   ERR("What Path Type? = %d", p->mPath.elmPtr[i]);
+                   ERR("No reserved path type = %d", p->mPath.elmPtr[i]);
                }
           }
 
+        //1: Stroke
         if (p->mStroke.enable)
-          evas_vg_shape_stroke_width_set(shape, p->mStroke.width);
+          {
+             //Stroke Width
+             evas_vg_shape_stroke_width_set(shape, p->mStroke.width);
+
+             //Stroke Cap
+             Efl_Gfx_Cap cap;
+             switch (p->mStroke.cap)
+               {
+                case CapFlat: cap = EFL_GFX_CAP_BUTT; break;
+                case CapSquare: cap = EFL_GFX_CAP_SQUARE; break;
+                case CapRound: cap = EFL_GFX_CAP_ROUND; break;
+                default: cap = EFL_GFX_CAP_BUTT; break;
+               }
+             evas_vg_shape_stroke_cap_set(shape, cap);
 
-        if (p->mType == BrushSolid)
+             //Fill
+
+          }
+
+        //2: fill
+        switch (p->mBrushType)
           {
-             int r = p->mColor.r * (p->mColor.a/255);
-             int g = p->mColor.g * (p->mColor.a/255);
-             int b = p->mColor.g * (p->mColor.a/255);
-             int a = p->mColor.a;
-             if (p->mStroke.enable)
-               evas_vg_shape_stroke_color_set(shape, r, g, b, a);
-             else
-               evas_vg_node_color_set(shape, r, g, b, a);
+           case BrushSolid:
+             {
+                float pa = ((float)p->mColor.a) / 255;
+                int r = (int)(((float) p->mColor.r) * pa);
+                int g = (int)(((float) p->mColor.g) * pa);
+                int b = (int)(((float) p->mColor.g) * pa);
+                int a = p->mColor.a;
+                if (p->mStroke.enable)
+                  evas_vg_shape_stroke_color_set(shape, r, g, b, a);
+                else
+                  evas_vg_node_color_set(shape, r, g, b, a);
+             }
+             break;
+           case BrushGradient:
+             {
+                if (p->mGradient.type == GradientLinear)
+                  {
+                     Efl_VG* grad = evas_vg_gradient_linear_add(root);
+                     evas_vg_gradient_linear_start_set(grad, p->mGradient.start.x, p->mGradient.start.y);
+                     evas_vg_gradient_linear_end_set(grad, p->mGradient.end.x, p->mGradient.end.y);
+
+                     //Gradient Stop
+                     Efl_Gfx_Gradient_Stop* stops = malloc(sizeof(Efl_Gfx_Gradient_Stop) * p->mGradient.stopCount);
+                     if (stops)
+                       {
+                          for (unsigned int i = 0; i < p->mGradient.stopCount; i++)
+                            {
+                               stops[i].offset = p->mGradient.stopPtr[i].pos;
+                               float pa = ((float)p->mGradient.stopPtr[i].a) / 255;
+                               stops[i].r = (int)(((float)p->mGradient.stopPtr[i].r) * pa);
+                               stops[i].g = (int)(((float)p->mGradient.stopPtr[i].g) * pa);
+                               stops[i].b = (int)(((float)p->mGradient.stopPtr[i].b) * pa);
+                               stops[i].a = p->mGradient.stopPtr[i].a;
+                            }
+                          evas_vg_gradient_stop_set(grad, stops, p->mGradient.stopCount);
+                          free(stops);
+                       }
+                     if (p->mStroke.enable)
+                       evas_vg_shape_stroke_fill_set(shape, grad);
+                     else
+                       evas_vg_shape_fill_set(shape, grad);
+                  }
+                else if (p->mGradient.type == GradientRadial)
+                  {
+                     //TODO:
+                     ERR("Radial Gradient Type isn't implemented yet.");
+                  }
+                else
+                  ERR("No reserved gradient type = %d", p->mGradient.type);
+             }
+             break;
+           default:
+              ERR("No reserved brush type = %d", p->mBrushType);
           }
      }
 #else