1 /**
2  * @file lv_vg_lite_utils.h
3  *
4  */
5 
6 #ifndef LV_VG_LITE_UTILS_H
7 #define LV_VG_LITE_UTILS_H
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 /*********************
14  *      INCLUDES
15  *********************/
16 
17 #include "../../lvgl.h"
18 
19 #if LV_USE_DRAW_VG_LITE
20 
21 #include "../../misc/lv_profiler.h"
22 
23 #include <stdbool.h>
24 #if LV_USE_VG_LITE_THORVG
25 #include "../../others/vg_lite_tvg/vg_lite.h"
26 #else
27 #include <vg_lite.h>
28 #endif
29 
30 /*********************
31  *      DEFINES
32  *********************/
33 
34 #define LV_VG_LITE_IS_ERROR(err) (err > 0)
35 
36 #if LV_VG_LITE_USE_ASSERT
37 #define LV_VG_LITE_ASSERT(expr) LV_ASSERT(expr)
38 #else
39 #define LV_VG_LITE_ASSERT(expr)
40 #endif
41 
42 #define LV_VG_LITE_CHECK_ERROR(expr)                          \
43     do {                                                      \
44         vg_lite_error_t error = expr;                         \
45         if (LV_VG_LITE_IS_ERROR(error)) {                     \
46             LV_LOG_ERROR("Execute '" #expr "' error: %d", (int)error);  \
47             lv_vg_lite_error_dump_info(error);                \
48             LV_VG_LITE_ASSERT(false);                         \
49         }                                                     \
50     } while (0)
51 
52 #define LV_VG_LITE_ASSERT_PATH(path) LV_VG_LITE_ASSERT(lv_vg_lite_path_check(path))
53 #define LV_VG_LITE_ASSERT_SRC_BUFFER(buffer) LV_VG_LITE_ASSERT(lv_vg_lite_buffer_check(buffer, true))
54 #define LV_VG_LITE_ASSERT_DEST_BUFFER(buffer) LV_VG_LITE_ASSERT(lv_vg_lite_buffer_check(buffer, false))
55 #define LV_VG_LITE_ASSERT_MATRIX(matrix) LV_VG_LITE_ASSERT(lv_vg_lite_matrix_check(matrix))
56 
57 #define LV_VG_LITE_ALIGN(number, align_bytes) \
58     (((number) + ((align_bytes)-1)) & ~((align_bytes)-1))
59 
60 #define LV_VG_LITE_IS_ALIGNED(num, align) (((uintptr_t)(num) & ((align)-1)) == 0)
61 
62 #define LV_VG_LITE_IS_INDEX_FMT(fmt) \
63     ((fmt) == VG_LITE_INDEX_1        \
64      || (fmt) == VG_LITE_INDEX_2  \
65      || (fmt) == VG_LITE_INDEX_4  \
66      || (fmt) == VG_LITE_INDEX_8)
67 
68 /**********************
69  *      TYPEDEFS
70  **********************/
71 
72 struct _lv_draw_vg_lite_unit_t;
73 
74 /**********************
75  * GLOBAL PROTOTYPES
76  **********************/
77 
78 /* Print info */
79 
80 void lv_vg_lite_dump_info(void);
81 
82 void lv_vg_lite_error_dump_info(vg_lite_error_t error);
83 
84 const char * lv_vg_lite_error_string(vg_lite_error_t error);
85 
86 const char * lv_vg_lite_feature_string(vg_lite_feature_t feature);
87 
88 const char * lv_vg_lite_buffer_format_string(vg_lite_buffer_format_t format);
89 
90 const char * lv_vg_lite_vlc_op_string(uint8_t vlc_op);
91 
92 void lv_vg_lite_path_dump_info(const vg_lite_path_t * path);
93 
94 void lv_vg_lite_stroke_dump_info(const vg_lite_stroke_t * stroke);
95 
96 void lv_vg_lite_buffer_dump_info(const vg_lite_buffer_t * buffer);
97 
98 void lv_vg_lite_matrix_dump_info(const vg_lite_matrix_t * matrix);
99 
100 bool lv_vg_lite_is_dest_cf_supported(lv_color_format_t cf);
101 
102 bool lv_vg_lite_is_src_cf_supported(lv_color_format_t cf);
103 
104 /* Converter */
105 
106 vg_lite_buffer_format_t lv_vg_lite_vg_fmt(lv_color_format_t cf);
107 
108 void lv_vg_lite_buffer_format_bytes(
109     vg_lite_buffer_format_t format,
110     uint32_t * mul,
111     uint32_t * div,
112     uint32_t * bytes_align);
113 
114 uint32_t lv_vg_lite_width_to_stride(uint32_t w, vg_lite_buffer_format_t color_format);
115 
116 uint32_t lv_vg_lite_width_align(uint32_t w);
117 
118 void lv_vg_lite_buffer_init(
119     vg_lite_buffer_t * buffer,
120     const void * ptr,
121     int32_t width,
122     int32_t height,
123     uint32_t stride,
124     vg_lite_buffer_format_t format,
125     bool tiled);
126 
127 void lv_vg_lite_buffer_from_draw_buf(vg_lite_buffer_t * buffer, const lv_draw_buf_t * draw_buf);
128 
129 void lv_vg_lite_image_matrix(vg_lite_matrix_t * matrix, int32_t x, int32_t y, const lv_draw_image_dsc_t * dsc);
130 
131 vg_lite_color_t lv_vg_lite_image_recolor(vg_lite_buffer_t * buffer, const lv_draw_image_dsc_t * dsc);
132 
133 bool lv_vg_lite_buffer_open_image(vg_lite_buffer_t * buffer, lv_image_decoder_dsc_t * decoder_dsc, const void * src,
134                                   bool no_cache, bool premultiply);
135 
136 void lv_vg_lite_image_dsc_init(struct _lv_draw_vg_lite_unit_t * unit);
137 
138 void lv_vg_lite_image_dsc_deinit(struct _lv_draw_vg_lite_unit_t * unit);
139 
140 vg_lite_blend_t lv_vg_lite_blend_mode(lv_blend_mode_t blend_mode, bool has_pre_mul);
141 
142 uint32_t lv_vg_lite_get_palette_size(vg_lite_buffer_format_t format);
143 
144 vg_lite_color_t lv_vg_lite_color(lv_color_t color, lv_opa_t opa, bool pre_mul);
145 
146 void lv_vg_lite_rect(vg_lite_rectangle_t * rect, const lv_area_t * area);
147 
lv_vg_lite_matrix(vg_lite_matrix_t * dest,const lv_matrix_t * src)148 static inline void lv_vg_lite_matrix(vg_lite_matrix_t * dest, const lv_matrix_t * src)
149 {
150     *(lv_matrix_t *)dest = *src;
151 }
152 
153 /* Param checker */
154 
155 bool lv_vg_lite_buffer_check(const vg_lite_buffer_t * buffer, bool is_src);
156 
157 bool lv_vg_lite_path_check(const vg_lite_path_t * path);
158 
159 bool lv_vg_lite_matrix_check(const vg_lite_matrix_t * matrix);
160 
161 /* Wrapper */
162 
163 bool lv_vg_lite_support_blend_normal(void);
164 
165 bool lv_vg_lite_16px_align(void);
166 
167 void lv_vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult);
168 
169 bool lv_vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t * matrix);
170 
171 lv_point_precise_t lv_vg_lite_matrix_transform_point(const vg_lite_matrix_t * matrix, const lv_point_precise_t * point);
172 
173 void lv_vg_lite_set_scissor_area(const lv_area_t * area);
174 
175 void lv_vg_lite_disable_scissor(void);
176 
177 void lv_vg_lite_flush(struct _lv_draw_vg_lite_unit_t * u);
178 
179 void lv_vg_lite_finish(struct _lv_draw_vg_lite_unit_t * u);
180 
181 /**********************
182  *      MACROS
183  **********************/
184 
185 #endif /*LV_USE_DRAW_VG_LITE*/
186 
187 #ifdef __cplusplus
188 } /*extern "C"*/
189 #endif
190 
191 #endif /*VG_LITE_UTILS_H*/
192