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