From 46e151e3d054729dc1911c03bae70b758e13fcef Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 9 Nov 2018 22:02:30 +0900 Subject: [PATCH] evas json: Implemenent missing linear gradient and stroke cap. Change-Id: Id5daed129bd0e2173cdac5d2deff0b4af71cfa2f --- src/static_libs/vg_common/vg_common_json.c | 97 ++++++++++++++++++++++++------ 1 file changed, 80 insertions(+), 17 deletions(-) diff --git a/src/static_libs/vg_common/vg_common_json.c b/src/static_libs/vg_common/vg_common_json.c index 4bfd65c..4f56be2 100644 --- a/src/static_libs/vg_common/vg_common_json.c +++ b/src/static_libs/vg_common/vg_common_json.c @@ -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 -- 2.7.4