1 /**
2  * @file lv_style.c
3  *
4  */
5 
6 /*********************
7  *      INCLUDES
8  *********************/
9 #include "lv_style_private.h"
10 #include "../core/lv_global.h"
11 #include "../stdlib/lv_mem.h"
12 #include "../stdlib/lv_string.h"
13 #include "lv_assert.h"
14 #include "lv_types.h"
15 
16 /*********************
17  *      DEFINES
18  *********************/
19 #define lv_style_custom_prop_flag_lookup_table_size LV_GLOBAL_DEFAULT()->style_custom_table_size
20 #define lv_style_custom_prop_flag_lookup_table LV_GLOBAL_DEFAULT()->style_custom_prop_flag_lookup_table
21 #define last_custom_prop_id LV_GLOBAL_DEFAULT()->style_last_custom_prop_id
22 
23 /**********************
24  *      TYPEDEFS
25  **********************/
26 
27 /**********************
28  *  STATIC PROTOTYPES
29  **********************/
30 
31 /**********************
32  *  GLOBAL VARIABLES
33  **********************/
34 
35 const lv_style_prop_t lv_style_const_prop_id_inv = LV_STYLE_PROP_INV;
36 
37 const uint8_t lv_style_builtin_prop_flag_lookup_table[LV_STYLE_NUM_BUILT_IN_PROPS] = {
38     [LV_STYLE_WIDTH] =                    LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
39     [LV_STYLE_MIN_WIDTH] =                LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
40     [LV_STYLE_MAX_WIDTH] =                LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
41     [LV_STYLE_HEIGHT] =                   LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
42     [LV_STYLE_MIN_HEIGHT] =               LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
43     [LV_STYLE_MAX_HEIGHT] =               LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
44     [LV_STYLE_LENGTH] =                   LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE,
45     [LV_STYLE_X] =                        LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
46     [LV_STYLE_Y] =                        LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
47     [LV_STYLE_ALIGN] =                    LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
48     [LV_STYLE_TRANSFORM_WIDTH] =           LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM,
49     [LV_STYLE_TRANSFORM_HEIGHT] =          LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM,
50     [LV_STYLE_TRANSLATE_X] =               LV_STYLE_PROP_FLAG_LAYOUT_UPDATE | LV_STYLE_PROP_FLAG_PARENT_LAYOUT_UPDATE,
51     [LV_STYLE_TRANSLATE_Y] =               LV_STYLE_PROP_FLAG_LAYOUT_UPDATE | LV_STYLE_PROP_FLAG_PARENT_LAYOUT_UPDATE,
52     [LV_STYLE_TRANSFORM_SCALE_X] =           LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM,
53     [LV_STYLE_TRANSFORM_SCALE_Y] =           LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM,
54     [LV_STYLE_TRANSFORM_SKEW_X] =          LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM,
55     [LV_STYLE_TRANSFORM_SKEW_Y] =          LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM,
56     [LV_STYLE_TRANSFORM_ROTATION] =        LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM,
57 
58     [LV_STYLE_PAD_TOP] =                   LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
59     [LV_STYLE_PAD_BOTTOM] =                LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
60     [LV_STYLE_PAD_LEFT] =                  LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
61     [LV_STYLE_PAD_RIGHT] =                 LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
62     [LV_STYLE_PAD_ROW] =                   LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
63     [LV_STYLE_PAD_COLUMN] =                LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
64     [LV_STYLE_MARGIN_TOP] =                LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
65     [LV_STYLE_MARGIN_BOTTOM] =             LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
66     [LV_STYLE_MARGIN_LEFT] =               LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
67     [LV_STYLE_MARGIN_RIGHT] =              LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
68 
69     [LV_STYLE_BG_COLOR] = 0,
70     [LV_STYLE_BG_OPA] = 0,
71     [LV_STYLE_BG_GRAD_COLOR] = 0,
72     [LV_STYLE_BG_GRAD_DIR] = 0,
73     [LV_STYLE_BG_MAIN_STOP] = 0,
74     [LV_STYLE_BG_GRAD_STOP] = 0,
75     [LV_STYLE_BG_MAIN_OPA] = 0,
76     [LV_STYLE_BG_GRAD_OPA] = 0,
77     [LV_STYLE_BG_GRAD] = 0,
78 
79     [LV_STYLE_BG_IMAGE_SRC] =                LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE,
80     [LV_STYLE_BG_IMAGE_OPA] = 0,
81     [LV_STYLE_BG_IMAGE_RECOLOR] = 0,
82     [LV_STYLE_BG_IMAGE_RECOLOR_OPA] = 0,
83     [LV_STYLE_BG_IMAGE_TILED] = 0,
84 
85     [LV_STYLE_BORDER_COLOR] = 0,
86     [LV_STYLE_BORDER_OPA] = 0,
87     [LV_STYLE_BORDER_WIDTH] =              LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
88     [LV_STYLE_BORDER_SIDE] = 0,
89     [LV_STYLE_BORDER_POST] = 0,
90 
91     [LV_STYLE_OUTLINE_WIDTH] =             LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE,
92     [LV_STYLE_OUTLINE_COLOR] = 0,
93     [LV_STYLE_OUTLINE_OPA] =               LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE,
94     [LV_STYLE_OUTLINE_PAD] =               LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE,
95 
96     [LV_STYLE_SHADOW_WIDTH] =              LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE,
97     [LV_STYLE_SHADOW_OFFSET_X] =           LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE,
98     [LV_STYLE_SHADOW_OFFSET_Y] =           LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE,
99     [LV_STYLE_SHADOW_SPREAD] =             LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE,
100     [LV_STYLE_SHADOW_COLOR] = 0,
101     [LV_STYLE_SHADOW_OPA] =                LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE,
102 
103     [LV_STYLE_IMAGE_OPA] = 0,
104     [LV_STYLE_IMAGE_RECOLOR] = 0,
105     [LV_STYLE_IMAGE_RECOLOR_OPA] = 0,
106 
107     [LV_STYLE_LINE_WIDTH] =                LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE,
108     [LV_STYLE_LINE_DASH_WIDTH] = 0,
109     [LV_STYLE_LINE_DASH_GAP] = 0,
110     [LV_STYLE_LINE_ROUNDED] = 0,
111     [LV_STYLE_LINE_COLOR] = 0,
112     [LV_STYLE_LINE_OPA] = 0,
113 
114     [LV_STYLE_ARC_WIDTH] =                 LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE,
115     [LV_STYLE_ARC_ROUNDED] = 0,
116     [LV_STYLE_ARC_COLOR] = 0,
117     [LV_STYLE_ARC_OPA] = 0,
118     [LV_STYLE_ARC_IMAGE_SRC] = 0,
119 
120     [LV_STYLE_TEXT_COLOR] =                LV_STYLE_PROP_FLAG_INHERITABLE,
121     [LV_STYLE_TEXT_OPA] =                  LV_STYLE_PROP_FLAG_INHERITABLE,
122     [LV_STYLE_TEXT_FONT] =                 LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
123     [LV_STYLE_TEXT_LETTER_SPACE] =         LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
124     [LV_STYLE_TEXT_LINE_SPACE] =           LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
125     [LV_STYLE_TEXT_DECOR] =                LV_STYLE_PROP_FLAG_INHERITABLE,
126     [LV_STYLE_TEXT_ALIGN] =                LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
127 
128     [LV_STYLE_RADIUS] = 0,
129     [LV_STYLE_CLIP_CORNER] = 0,
130     [LV_STYLE_OPA] = 0,
131     [LV_STYLE_OPA_LAYERED] =               LV_STYLE_PROP_FLAG_LAYER_UPDATE,
132     [LV_STYLE_COLOR_FILTER_DSC] =          LV_STYLE_PROP_FLAG_INHERITABLE,
133     [LV_STYLE_COLOR_FILTER_OPA] =          LV_STYLE_PROP_FLAG_INHERITABLE,
134     [LV_STYLE_ANIM_DURATION] = 0,
135     [LV_STYLE_TRANSITION] = 0,
136     [LV_STYLE_BLEND_MODE] =                LV_STYLE_PROP_FLAG_LAYER_UPDATE,
137     [LV_STYLE_LAYOUT] =                    LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
138     [LV_STYLE_BASE_DIR] =                  LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
139     [LV_STYLE_BITMAP_MASK_SRC] =           LV_STYLE_PROP_FLAG_LAYER_UPDATE,
140 
141 #if LV_USE_FLEX
142     [LV_STYLE_FLEX_FLOW] =                    LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
143     [LV_STYLE_FLEX_MAIN_PLACE] =              LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
144     [LV_STYLE_FLEX_CROSS_PLACE] =             LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
145     [LV_STYLE_FLEX_TRACK_PLACE] =             LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
146     [LV_STYLE_FLEX_GROW] =                    LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
147 #endif
148 
149 #if LV_USE_GRID
150     [LV_STYLE_GRID_COLUMN_DSC_ARRAY] =      LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
151     [LV_STYLE_GRID_ROW_DSC_ARRAY] =         LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
152     [LV_STYLE_GRID_COLUMN_ALIGN] =          LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
153     [LV_STYLE_GRID_ROW_ALIGN] =             LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
154     [LV_STYLE_GRID_CELL_ROW_SPAN] =         LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
155     [LV_STYLE_GRID_CELL_ROW_POS] =          LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
156     [LV_STYLE_GRID_CELL_COLUMN_SPAN] =      LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
157     [LV_STYLE_GRID_CELL_COLUMN_POS] =       LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
158     [LV_STYLE_GRID_CELL_X_ALIGN] =          LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
159     [LV_STYLE_GRID_CELL_Y_ALIGN] =          LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
160 #endif
161 
162 };
163 
164 /**********************
165  *  STATIC VARIABLES
166  **********************/
167 
168 /**********************
169  *      MACROS
170  **********************/
171 
172 /**********************
173  *   GLOBAL FUNCTIONS
174  **********************/
175 
lv_style_init(lv_style_t * style)176 void lv_style_init(lv_style_t * style)
177 {
178 #if LV_USE_ASSERT_STYLE
179     if(style->sentinel == LV_STYLE_SENTINEL_VALUE && style->prop_cnt > 1) {
180         LV_LOG_WARN("Style might be already inited. (Potential memory leak)");
181     }
182 #endif
183 
184     lv_memzero(style, sizeof(lv_style_t));
185 #if LV_USE_ASSERT_STYLE
186     style->sentinel = LV_STYLE_SENTINEL_VALUE;
187 #endif
188 }
189 
lv_style_reset(lv_style_t * style)190 void lv_style_reset(lv_style_t * style)
191 {
192     LV_ASSERT_STYLE(style);
193 
194     if(style->prop_cnt != 255) lv_free(style->values_and_props);
195     lv_memzero(style, sizeof(lv_style_t));
196 #if LV_USE_ASSERT_STYLE
197     style->sentinel = LV_STYLE_SENTINEL_VALUE;
198 #endif
199 }
200 
lv_style_register_prop(uint8_t flag)201 lv_style_prop_t lv_style_register_prop(uint8_t flag)
202 {
203     if(lv_style_custom_prop_flag_lookup_table == NULL) {
204         lv_style_custom_prop_flag_lookup_table_size = 0;
205         last_custom_prop_id = (uint16_t)LV_STYLE_LAST_BUILT_IN_PROP;
206     }
207 
208     //    if((last_custom_prop_id + 1) != 0) {
209     //        LV_LOG_ERROR("No more custom property IDs available");
210     //        return LV_STYLE_PROP_INV;
211     //    }
212 
213     /*
214      * Allocate the lookup table if it's not yet available.
215      */
216     size_t required_size = (last_custom_prop_id + 1 - LV_STYLE_LAST_BUILT_IN_PROP);
217     if(lv_style_custom_prop_flag_lookup_table_size < required_size) {
218         /* Round required_size up to the nearest 32-byte value */
219         required_size = (required_size + 31) & ~31;
220         LV_ASSERT_MSG(required_size > 0, "required size has become 0?");
221         uint8_t * old_p = lv_style_custom_prop_flag_lookup_table;
222         uint8_t * new_p = lv_realloc(old_p, required_size * sizeof(uint8_t));
223         if(new_p == NULL) {
224             LV_LOG_ERROR("Unable to allocate space for custom property lookup table");
225             return LV_STYLE_PROP_INV;
226         }
227         lv_style_custom_prop_flag_lookup_table = new_p;
228         lv_style_custom_prop_flag_lookup_table_size = required_size;
229     }
230     last_custom_prop_id++;
231     /* This should never happen - we should bail out above */
232     LV_ASSERT_NULL(lv_style_custom_prop_flag_lookup_table);
233     lv_style_custom_prop_flag_lookup_table[last_custom_prop_id - LV_STYLE_NUM_BUILT_IN_PROPS] = flag;
234     return last_custom_prop_id;
235 }
236 
lv_style_get_num_custom_props(void)237 lv_style_prop_t lv_style_get_num_custom_props(void)
238 {
239     return last_custom_prop_id - LV_STYLE_LAST_BUILT_IN_PROP;
240 }
241 
lv_style_remove_prop(lv_style_t * style,lv_style_prop_t prop)242 bool lv_style_remove_prop(lv_style_t * style, lv_style_prop_t prop)
243 {
244     LV_ASSERT_STYLE(style);
245 
246     if(lv_style_is_const(style)) {
247         LV_LOG_ERROR("Cannot remove prop from const style");
248         return false;
249     }
250 
251     if(style->prop_cnt == 0)  return false;
252 
253     LV_PROFILER_STYLE_BEGIN;
254 
255     uint8_t * tmp = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t);
256     uint8_t * old_props = (uint8_t *)tmp;
257     uint32_t i;
258     for(i = 0; i < style->prop_cnt; i++) {
259         if(old_props[i] == prop) {
260             lv_style_value_t * old_values = (lv_style_value_t *)style->values_and_props;
261 
262             size_t size = (style->prop_cnt - 1) * (sizeof(lv_style_value_t) + sizeof(lv_style_prop_t));
263             uint8_t * new_values_and_props = lv_malloc(size);
264             if(new_values_and_props == NULL) {
265                 LV_PROFILER_STYLE_END;
266                 return false;
267             }
268 
269             style->values_and_props = new_values_and_props;
270             style->prop_cnt--;
271 
272             tmp = new_values_and_props + style->prop_cnt * sizeof(lv_style_value_t);
273             uint8_t * new_props = (uint8_t *)tmp;
274             lv_style_value_t * new_values = (lv_style_value_t *)new_values_and_props;
275 
276             uint32_t j;
277             for(i = j = 0; j <= style->prop_cnt;
278                 j++) { /*<=: because prop_cnt already reduced but all the old props. needs to be checked.*/
279                 if(old_props[j] != prop) {
280                     new_values[i] = old_values[j];
281                     new_props[i++] = old_props[j];
282                 }
283             }
284 
285             lv_free(old_values);
286             LV_PROFILER_STYLE_END;
287             return true;
288         }
289     }
290 
291     LV_PROFILER_STYLE_END;
292     return false;
293 }
294 
lv_style_set_prop(lv_style_t * style,lv_style_prop_t prop,lv_style_value_t value)295 void lv_style_set_prop(lv_style_t * style, lv_style_prop_t prop, lv_style_value_t value)
296 {
297     LV_ASSERT_STYLE(style);
298 
299     if(lv_style_is_const(style)) {
300         LV_LOG_ERROR("Cannot set property of constant style");
301         return;
302     }
303 
304     LV_ASSERT(prop != LV_STYLE_PROP_INV);
305     LV_PROFILER_STYLE_BEGIN;
306     lv_style_prop_t * props;
307     int32_t i;
308 
309     if(style->values_and_props) {
310         props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t);
311         for(i = style->prop_cnt - 1; i >= 0; i--) {
312             if(props[i] == prop) {
313                 lv_style_value_t * values = (lv_style_value_t *)style->values_and_props;
314                 values[i] = value;
315                 LV_PROFILER_STYLE_END;
316                 return;
317             }
318         }
319     }
320 
321     size_t size = (style->prop_cnt + 1) * (sizeof(lv_style_value_t) + sizeof(lv_style_prop_t));
322     uint8_t * values_and_props = lv_realloc(style->values_and_props, size);
323     if(values_and_props == NULL) {
324         LV_PROFILER_STYLE_END;
325         return;
326     }
327 
328     style->values_and_props = values_and_props;
329 
330     props = values_and_props + style->prop_cnt * sizeof(lv_style_value_t);
331     /*Shift all props to make place for the value before them*/
332     for(i = style->prop_cnt - 1; i >= 0; i--) {
333         props[i + sizeof(lv_style_value_t) / sizeof(lv_style_prop_t)] = props[i];
334     }
335     style->prop_cnt++;
336 
337     /*Go to the new position with the props*/
338     props = values_and_props + style->prop_cnt * sizeof(lv_style_value_t);
339     lv_style_value_t * values = (lv_style_value_t *)values_and_props;
340 
341     /*Set the new property and value*/
342     props[style->prop_cnt - 1] = prop;
343     values[style->prop_cnt - 1] = value;
344 
345     uint32_t group = lv_style_get_prop_group(prop);
346     style->has_group |= (uint32_t)1 << group;
347     LV_PROFILER_STYLE_END;
348 }
349 
lv_style_get_prop(const lv_style_t * style,lv_style_prop_t prop,lv_style_value_t * value)350 lv_style_res_t lv_style_get_prop(const lv_style_t * style, lv_style_prop_t prop, lv_style_value_t * value)
351 {
352     return lv_style_get_prop_inlined(style, prop, value);
353 }
354 
lv_style_transition_dsc_init(lv_style_transition_dsc_t * tr,const lv_style_prop_t props[],lv_anim_path_cb_t path_cb,uint32_t time,uint32_t delay,void * user_data)355 void lv_style_transition_dsc_init(lv_style_transition_dsc_t * tr, const lv_style_prop_t props[],
356                                   lv_anim_path_cb_t path_cb, uint32_t time, uint32_t delay, void * user_data)
357 {
358     lv_memzero(tr, sizeof(lv_style_transition_dsc_t));
359     tr->props = props;
360     tr->path_xcb = path_cb == NULL ? lv_anim_path_linear : path_cb;
361     tr->time = time;
362     tr->delay = delay;
363     tr->user_data = user_data;
364 }
365 
lv_style_prop_get_default(lv_style_prop_t prop)366 lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop)
367 {
368     const lv_color_t black = LV_COLOR_MAKE(0x00, 0x00, 0x00);
369     const lv_color_t white = LV_COLOR_MAKE(0xff, 0xff, 0xff);
370     switch(prop) {
371         case LV_STYLE_TRANSFORM_SCALE_X:
372         case LV_STYLE_TRANSFORM_SCALE_Y:
373             return (lv_style_value_t) {
374                 .num = LV_SCALE_NONE
375             };
376         case LV_STYLE_BG_COLOR:
377             return (lv_style_value_t) {
378                 .color = white
379             };
380         case LV_STYLE_BG_GRAD_COLOR:
381         case LV_STYLE_BORDER_COLOR:
382         case LV_STYLE_SHADOW_COLOR:
383         case LV_STYLE_OUTLINE_COLOR:
384         case LV_STYLE_ARC_COLOR:
385         case LV_STYLE_LINE_COLOR:
386         case LV_STYLE_TEXT_COLOR:
387         case LV_STYLE_IMAGE_RECOLOR:
388             return (lv_style_value_t) {
389                 .color = black
390             };
391         case LV_STYLE_OPA:
392         case LV_STYLE_OPA_LAYERED:
393         case LV_STYLE_BORDER_OPA:
394         case LV_STYLE_TEXT_OPA:
395         case LV_STYLE_IMAGE_OPA:
396         case LV_STYLE_BG_GRAD_OPA:
397         case LV_STYLE_BG_MAIN_OPA:
398         case LV_STYLE_BG_IMAGE_OPA:
399         case LV_STYLE_OUTLINE_OPA:
400         case LV_STYLE_SHADOW_OPA:
401         case LV_STYLE_LINE_OPA:
402         case LV_STYLE_ARC_OPA:
403             return (lv_style_value_t) {
404                 .num = LV_OPA_COVER
405             };
406         case LV_STYLE_BG_GRAD_STOP:
407             return (lv_style_value_t) {
408                 .num = 255
409             };
410         case LV_STYLE_BORDER_SIDE:
411             return (lv_style_value_t) {
412                 .num = LV_BORDER_SIDE_FULL
413             };
414         case LV_STYLE_TEXT_FONT:
415             return (lv_style_value_t) {
416                 .ptr = LV_FONT_DEFAULT
417             };
418         case LV_STYLE_MAX_WIDTH:
419         case LV_STYLE_MAX_HEIGHT:
420             return (lv_style_value_t) {
421                 .num = LV_COORD_MAX
422             };
423         case LV_STYLE_ROTARY_SENSITIVITY:
424             return (lv_style_value_t) {
425                 .num = 256
426             };
427         default:
428             return (lv_style_value_t) {
429                 .ptr = NULL
430             };
431     }
432 }
433 
lv_style_is_empty(const lv_style_t * style)434 bool lv_style_is_empty(const lv_style_t * style)
435 {
436     LV_ASSERT_STYLE(style);
437 
438     return style->prop_cnt == 0;
439 }
440 
lv_style_prop_lookup_flags(lv_style_prop_t prop)441 uint8_t lv_style_prop_lookup_flags(lv_style_prop_t prop)
442 {
443     if(prop == LV_STYLE_PROP_ANY) return LV_STYLE_PROP_FLAG_ALL; /*Any prop can have any flags*/
444     if(prop == LV_STYLE_PROP_INV) return 0;
445 
446     if(prop < LV_STYLE_NUM_BUILT_IN_PROPS)
447         return lv_style_builtin_prop_flag_lookup_table[prop];
448     prop -= LV_STYLE_NUM_BUILT_IN_PROPS;
449     if(lv_style_custom_prop_flag_lookup_table != NULL && prop < lv_style_custom_prop_flag_lookup_table_size)
450         return lv_style_custom_prop_flag_lookup_table[prop];
451     return 0;
452 }
453 
454 /**********************
455  *   STATIC FUNCTIONS
456  **********************/
457