1 /**
2  * @file lv_draw_vg_lite_triangle.c
3  *
4  */
5 
6 /*********************
7  *      INCLUDES
8  *********************/
9 
10 #include "../../misc/lv_area_private.h"
11 #include "lv_draw_vg_lite.h"
12 
13 #if LV_USE_DRAW_VG_LITE
14 
15 #include "lv_vg_lite_utils.h"
16 #include "lv_vg_lite_path.h"
17 #include "lv_draw_vg_lite_type.h"
18 #include "lv_vg_lite_grad.h"
19 
20 /*********************
21  *      DEFINES
22  *********************/
23 
24 /**********************
25  *      TYPEDEFS
26  **********************/
27 
28 /**********************
29  *  STATIC PROTOTYPES
30  **********************/
31 
32 /**********************
33  *  STATIC VARIABLES
34  **********************/
35 
36 /**********************
37  *      MACROS
38  **********************/
39 
40 /**********************
41  *   GLOBAL FUNCTIONS
42  **********************/
43 
lv_draw_vg_lite_triangle(lv_draw_unit_t * draw_unit,const lv_draw_triangle_dsc_t * dsc)44 void lv_draw_vg_lite_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc)
45 {
46     lv_area_t tri_area;
47     tri_area.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x);
48     tri_area.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y);
49     tri_area.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x);
50     tri_area.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y);
51 
52     bool is_common;
53     lv_area_t clip_area;
54     is_common = lv_area_intersect(&clip_area, &tri_area, draw_unit->clip_area);
55     if(!is_common) return;
56 
57     LV_PROFILER_DRAW_BEGIN;
58 
59     lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit;
60 
61     lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32);
62     lv_vg_lite_path_set_bounding_box_area(path, &clip_area);
63     lv_vg_lite_path_move_to(path, dsc->p[0].x, dsc->p[0].y);
64     lv_vg_lite_path_line_to(path, dsc->p[1].x, dsc->p[1].y);
65     lv_vg_lite_path_line_to(path, dsc->p[2].x, dsc->p[2].y);
66     lv_vg_lite_path_close(path);
67     lv_vg_lite_path_end(path);
68 
69     vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path);
70 
71     LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer);
72     LV_VG_LITE_ASSERT_PATH(vg_lite_path);
73 
74     vg_lite_matrix_t matrix = u->global_matrix;
75     LV_VG_LITE_ASSERT_MATRIX(&matrix);
76 
77     if(dsc->bg_grad.dir != LV_GRAD_DIR_NONE) {
78 #if LV_USE_VECTOR_GRAPHIC
79         lv_vg_lite_draw_grad_helper(
80             u,
81             &u->target_buffer,
82             vg_lite_path,
83             &tri_area,
84             &dsc->bg_grad,
85             &matrix,
86             VG_LITE_FILL_EVEN_ODD,
87             VG_LITE_BLEND_SRC_OVER);
88 #else
89         LV_LOG_WARN("Gradient fill is not supported without VECTOR_GRAPHIC");
90 #endif
91     }
92     else { /* normal fill */
93         vg_lite_color_t color = lv_vg_lite_color(dsc->bg_color, dsc->bg_opa, true);
94         LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_draw");
95         LV_VG_LITE_CHECK_ERROR(vg_lite_draw(
96                                    &u->target_buffer,
97                                    vg_lite_path,
98                                    VG_LITE_FILL_EVEN_ODD,
99                                    &matrix,
100                                    VG_LITE_BLEND_SRC_OVER,
101                                    color));
102         LV_PROFILER_DRAW_END_TAG("vg_lite_draw");
103     }
104 
105     lv_vg_lite_path_drop(u, path);
106 
107     LV_PROFILER_DRAW_END;
108 }
109 
110 /**********************
111  *   STATIC FUNCTIONS
112  **********************/
113 
114 #endif
115