From 1d14386b99cdff731cc3367d1d8b5e96ffb8fcea Mon Sep 17 00:00:00 2001 From: Liam <30486941+liamHowatt@users.noreply.github.com> Date: Fri, 2 Aug 2024 01:46:42 -0400 Subject: [PATCH] refactor(API): don't expose private symbols in lvgl.h. phase-out "_lv*" names (#6068) Co-authored-by: Gabor Kiss-Vamosi --- Kconfig | 2 +- demos/benchmark/lv_demo_benchmark.c | 5 +- demos/music/lv_demo_music.c | 26 +- demos/music/lv_demo_music.h | 8 +- demos/music/lv_demo_music_list.c | 16 +- demos/music/lv_demo_music_list.h | 4 +- demos/music/lv_demo_music_main.c | 52 +-- demos/music/lv_demo_music_main.h | 10 +- demos/render/lv_demo_render.c | 17 +- demos/render/lv_demo_render.h | 2 +- demos/stress/lv_demo_stress.c | 2 +- demos/widgets/lv_demo_widgets.c | 56 +-- examples/event/lv_example_event_4.c | 8 +- .../libs/tiny_ttf/lv_example_tiny_ttf_3.c | 2 +- .../others/snapshot/lv_example_snapshot_1.c | 2 +- examples/styles/lv_example_style_14.c | 1 + examples/widgets/bar/lv_example_bar_6.c | 15 +- .../buttonmatrix/lv_example_buttonmatrix_2.c | 8 +- examples/widgets/canvas/lv_example_canvas_5.c | 2 +- examples/widgets/canvas/lv_example_canvas_6.c | 2 +- examples/widgets/chart/lv_example_chart_1.c | 3 +- examples/widgets/chart/lv_example_chart_3.c | 10 +- examples/widgets/chart/lv_example_chart_4.c | 2 +- examples/widgets/chart/lv_example_chart_5.c | 31 +- examples/widgets/chart/lv_example_chart_7.c | 7 +- examples/widgets/chart/lv_example_chart_8.c | 2 +- examples/widgets/menu/lv_example_menu_5.c | 5 +- examples/widgets/slider/lv_example_slider_3.c | 13 +- examples/widgets/span/lv_example_span_1.c | 20 +- examples/widgets/table/lv_example_table_1.c | 2 +- examples/widgets/table/lv_example_table_2.c | 8 +- lvgl.h | 2 +- scripts/lv_conf_internal_gen.py | 6 +- scripts/style_api_gen.py | 8 +- src/core/lv_global.h | 29 +- src/core/lv_group.c | 50 +-- src/core/lv_group.h | 39 +-- src/core/lv_group_private.h | 75 ++++ src/core/lv_obj.c | 44 ++- src/core/lv_obj.h | 64 +--- src/core/lv_obj_class.c | 7 +- src/core/lv_obj_class.h | 38 -- src/core/lv_obj_class_private.h | 78 +++++ src/core/lv_obj_draw.c | 11 +- src/core/lv_obj_draw.h | 9 - src/core/lv_obj_draw_private.h | 48 +++ src/core/lv_obj_event.c | 9 +- src/core/lv_obj_event.h | 22 -- src/core/lv_obj_event_private.h | 62 ++++ src/core/lv_obj_id_builtin.c | 5 +- src/core/lv_obj_pos.c | 60 ++-- src/core/lv_obj_pos.h | 5 +- src/core/lv_obj_private.h | 88 +++++ src/core/lv_obj_property.c | 2 + src/core/lv_obj_property.h | 5 +- src/core/lv_obj_scroll.c | 20 +- src/core/lv_obj_scroll.h | 31 +- src/core/lv_obj_scroll_private.h | 50 +++ src/core/lv_obj_style.c | 129 +++---- src/core/lv_obj_style.h | 79 +---- src/core/lv_obj_style_gen.h | 27 +- src/core/lv_obj_style_private.h | 95 +++++ src/core/lv_obj_tree.c | 9 +- src/core/lv_refr.c | 92 ++--- src/core/lv_refr.h | 36 -- src/core/lv_refr_private.h | 75 ++++ src/display/lv_display.c | 54 ++- src/display/lv_display.h | 36 +- src/display/lv_display_private.h | 4 +- src/draw/lv_draw.c | 30 +- src/draw/lv_draw.h | 131 ++----- src/draw/lv_draw_arc.c | 1 + src/draw/lv_draw_buf.c | 54 ++- src/draw/lv_draw_buf.h | 69 +--- src/draw/lv_draw_buf_private.h | 53 +++ src/draw/lv_draw_image.c | 35 +- src/draw/lv_draw_image.h | 47 +-- src/draw/lv_draw_image_private.h | 85 +++++ src/draw/lv_draw_label.c | 18 +- src/draw/lv_draw_label.h | 28 -- src/draw/lv_draw_label_private.h | 68 ++++ src/draw/lv_draw_line.c | 1 + src/draw/lv_draw_mask.c | 3 +- src/draw/lv_draw_mask.h | 10 - src/draw/lv_draw_mask_private.h | 50 +++ src/draw/lv_draw_private.h | 146 ++++++++ src/draw/lv_draw_rect.c | 3 +- src/draw/lv_draw_rect_private.h | 39 +++ src/draw/lv_draw_triangle.c | 3 +- src/draw/lv_draw_triangle_private.h | 43 +++ src/draw/lv_draw_vector.c | 56 +-- src/draw/lv_draw_vector.h | 114 ++---- src/draw/lv_draw_vector_private.h | 109 ++++++ src/draw/lv_image_decoder.c | 20 +- src/draw/lv_image_decoder.h | 116 +----- src/draw/lv_image_decoder_private.h | 142 ++++++++ src/draw/lv_image_dsc.h | 2 +- src/draw/nxp/pxp/lv_draw_buf_pxp.c | 1 + src/draw/nxp/pxp/lv_draw_pxp.c | 6 +- src/draw/nxp/pxp/lv_draw_pxp_fill.c | 2 +- src/draw/nxp/pxp/lv_draw_pxp_img.c | 2 +- src/draw/nxp/pxp/lv_draw_pxp_layer.c | 10 +- src/draw/nxp/vglite/lv_draw_buf_vglite.c | 1 + src/draw/nxp/vglite/lv_draw_vglite.c | 6 +- src/draw/nxp/vglite/lv_draw_vglite_border.c | 2 +- src/draw/nxp/vglite/lv_draw_vglite_fill.c | 2 +- src/draw/nxp/vglite/lv_draw_vglite_img.c | 2 +- src/draw/nxp/vglite/lv_draw_vglite_label.c | 2 +- src/draw/nxp/vglite/lv_draw_vglite_layer.c | 10 +- src/draw/nxp/vglite/lv_draw_vglite_line.c | 2 +- src/draw/nxp/vglite/lv_draw_vglite_triangle.c | 2 +- src/draw/renesas/dave2d/lv_draw_dave2d.c | 15 +- src/draw/renesas/dave2d/lv_draw_dave2d_arc.c | 4 +- .../renesas/dave2d/lv_draw_dave2d_border.c | 12 +- src/draw/renesas/dave2d/lv_draw_dave2d_fill.c | 10 +- .../renesas/dave2d/lv_draw_dave2d_image.c | 4 +- .../renesas/dave2d/lv_draw_dave2d_label.c | 2 +- src/draw/renesas/dave2d/lv_draw_dave2d_line.c | 2 +- .../dave2d/lv_draw_dave2d_mask_rectangle.c | 2 +- .../renesas/dave2d/lv_draw_dave2d_triangle.c | 2 +- src/draw/sdl/lv_draw_sdl.c | 12 +- src/draw/sw/arm2d/lv_draw_sw_arm2d.h | 28 +- src/draw/sw/blend/arm2d/lv_blend_arm2d.h | 168 ++++----- src/draw/sw/blend/helium/lv_blend_helium.h | 240 ++++++------- src/draw/sw/blend/lv_draw_sw_blend.c | 13 +- src/draw/sw/blend/lv_draw_sw_blend.h | 44 --- src/draw/sw/blend/lv_draw_sw_blend_private.h | 92 +++++ src/draw/sw/blend/lv_draw_sw_blend_to_al88.c | 30 +- src/draw/sw/blend/lv_draw_sw_blend_to_al88.h | 4 +- .../sw/blend/lv_draw_sw_blend_to_argb8888.c | 30 +- .../sw/blend/lv_draw_sw_blend_to_argb8888.h | 4 +- src/draw/sw/blend/lv_draw_sw_blend_to_i1.c | 30 +- src/draw/sw/blend/lv_draw_sw_blend_to_i1.h | 4 +- src/draw/sw/blend/lv_draw_sw_blend_to_l8.c | 30 +- src/draw/sw/blend/lv_draw_sw_blend_to_l8.h | 4 +- .../sw/blend/lv_draw_sw_blend_to_rgb565.c | 30 +- .../sw/blend/lv_draw_sw_blend_to_rgb565.h | 4 +- .../sw/blend/lv_draw_sw_blend_to_rgb888.c | 30 +- .../sw/blend/lv_draw_sw_blend_to_rgb888.h | 4 +- src/draw/sw/blend/neon/lv_blend_neon.h | 240 ++++++------- src/draw/sw/lv_draw_sw.c | 8 +- src/draw/sw/lv_draw_sw.h | 24 -- src/draw/sw/lv_draw_sw_arc.c | 10 +- src/draw/sw/lv_draw_sw_border.c | 8 +- src/draw/sw/lv_draw_sw_box_shadow.c | 61 ++-- src/draw/sw/lv_draw_sw_fill.c | 19 +- src/draw/sw/lv_draw_sw_gradient.c | 2 +- src/draw/sw/lv_draw_sw_gradient.h | 6 - src/draw/sw/lv_draw_sw_gradient_private.h | 50 +++ src/draw/sw/lv_draw_sw_img.c | 25 +- src/draw/sw/lv_draw_sw_letter.c | 4 +- src/draw/sw/lv_draw_sw_line.c | 16 +- src/draw/sw/lv_draw_sw_mask.c | 21 +- src/draw/sw/lv_draw_sw_mask.h | 136 +------- src/draw/sw/lv_draw_sw_mask_private.h | 152 ++++++++ src/draw/sw/lv_draw_sw_mask_rect.c | 8 +- src/draw/sw/lv_draw_sw_private.h | 67 ++++ src/draw/sw/lv_draw_sw_triangle.c | 11 +- src/draw/sw/lv_draw_sw_vector.c | 47 +-- src/draw/vg_lite/lv_draw_buf_vg_lite.c | 1 + src/draw/vg_lite/lv_draw_vg_lite.c | 2 +- src/draw/vg_lite/lv_draw_vg_lite_arc.c | 5 +- src/draw/vg_lite/lv_draw_vg_lite_border.c | 4 +- src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c | 3 +- src/draw/vg_lite/lv_draw_vg_lite_fill.c | 3 +- src/draw/vg_lite/lv_draw_vg_lite_img.c | 10 +- src/draw/vg_lite/lv_draw_vg_lite_label.c | 9 +- src/draw/vg_lite/lv_draw_vg_lite_layer.c | 2 +- src/draw/vg_lite/lv_draw_vg_lite_line.c | 3 +- src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c | 5 +- src/draw/vg_lite/lv_draw_vg_lite_triangle.c | 3 +- src/draw/vg_lite/lv_draw_vg_lite_type.h | 12 +- src/draw/vg_lite/lv_draw_vg_lite_vector.c | 6 +- src/draw/vg_lite/lv_vg_lite_decoder.c | 2 + src/draw/vg_lite/lv_vg_lite_grad.c | 13 +- src/draw/vg_lite/lv_vg_lite_grad.h | 8 +- src/draw/vg_lite/lv_vg_lite_path.c | 10 +- src/draw/vg_lite/lv_vg_lite_path.h | 4 +- src/draw/vg_lite/lv_vg_lite_pending.c | 2 +- src/draw/vg_lite/lv_vg_lite_pending.h | 2 +- src/draw/vg_lite/lv_vg_lite_stroke.c | 13 +- src/draw/vg_lite/lv_vg_lite_stroke.h | 16 +- src/draw/vg_lite/lv_vg_lite_utils.c | 9 +- src/draw/vg_lite/lv_vg_lite_utils.h | 10 +- src/drivers/libinput/lv_libinput.c | 5 +- src/drivers/libinput/lv_libinput.h | 35 +- src/drivers/libinput/lv_libinput_private.h | 79 +++++ src/drivers/libinput/lv_xkb.c | 2 +- src/drivers/libinput/lv_xkb.h | 9 - src/drivers/libinput/lv_xkb_private.h | 53 +++ src/drivers/nuttx/lv_nuttx_cache.c | 1 + src/drivers/nuttx/lv_nuttx_entry.c | 2 +- src/drivers/nuttx/lv_nuttx_entry.h | 2 +- src/drivers/nuttx/lv_nuttx_fbdev.c | 8 +- src/drivers/nuttx/lv_nuttx_image_cache.c | 1 + src/drivers/nuttx/lv_nuttx_libuv.c | 2 +- src/drivers/sdl/lv_sdl_keyboard.c | 1 - src/drivers/sdl/lv_sdl_mousewheel.c | 1 - src/drivers/windows/lv_windows_context.h | 12 +- src/drivers/windows/lv_windows_input.c | 13 +- src/font/lv_binfont_loader.c | 3 +- src/font/lv_font.c | 10 + src/font/lv_font.h | 42 +-- src/font/lv_font_fmt_txt.c | 2 +- src/font/lv_font_fmt_txt.h | 42 +-- src/font/lv_font_fmt_txt_private.h | 71 ++++ src/font/lv_symbol_def.h | 126 +++---- src/indev/lv_indev.c | 28 +- src/indev/lv_indev.h | 2 +- src/indev/lv_indev_private.h | 6 +- src/indev/lv_indev_scroll.c | 12 +- src/indev/lv_indev_scroll.h | 4 +- src/layouts/flex/lv_flex.c | 8 +- src/layouts/flex/lv_flex.h | 20 +- src/layouts/grid/lv_grid.c | 35 +- src/layouts/grid/lv_grid.h | 5 +- src/layouts/lv_layout.c | 8 +- src/layouts/lv_layout.h | 20 +- src/layouts/lv_layout_private.h | 58 +++ src/libs/barcode/lv_barcode.c | 3 +- src/libs/barcode/lv_barcode.h | 10 - src/libs/barcode/lv_barcode_private.h | 55 +++ src/libs/bin_decoder/lv_bin_decoder.c | 35 +- src/libs/bmp/lv_bmp.c | 4 +- src/libs/ffmpeg/lv_ffmpeg.c | 6 +- src/libs/ffmpeg/lv_ffmpeg.h | 12 +- src/libs/ffmpeg/lv_ffmpeg_private.h | 51 +++ src/libs/freetype/lv_freetype.c | 13 +- src/libs/freetype/lv_freetype.h | 26 +- src/libs/freetype/lv_freetype_glyph.c | 2 +- src/libs/freetype/lv_freetype_image.c | 2 +- src/libs/freetype/lv_freetype_outline.c | 3 +- src/libs/freetype/lv_freetype_private.h | 27 +- src/libs/fsdrv/lv_fs_memfs.c | 1 + src/libs/fsdrv/lv_fs_posix.c | 1 + src/libs/gif/lv_gif.c | 6 +- src/libs/gif/lv_gif.h | 16 +- src/libs/gif/lv_gif_private.h | 57 +++ src/libs/libjpeg_turbo/lv_libjpeg_turbo.c | 2 + src/libs/libpng/lv_libpng.c | 2 + src/libs/lodepng/lodepng.c | 5 +- src/libs/lodepng/lv_lodepng.c | 2 + src/libs/qrcode/lv_qrcode.c | 3 +- src/libs/qrcode/lv_qrcode.h | 12 +- src/libs/qrcode/lv_qrcode_private.h | 52 +++ src/libs/rlottie/lv_rlottie.c | 4 +- src/libs/rlottie/lv_rlottie.h | 17 - src/libs/rlottie/lv_rlottie_private.h | 61 ++++ src/libs/tiny_ttf/lv_tiny_ttf.c | 3 +- src/libs/tjpgd/lv_tjpgd.c | 13 +- src/lv_api_map_v8.h | 4 +- src/lv_conf_internal.h | 180 +++++----- src/lv_init.c | 72 ++-- src/lvgl_private.h | 84 +++++ src/misc/cache/lv_cache.h | 2 +- src/misc/cache/lv_cache_entry.c | 2 +- .../{_lv_cache_lru_rb.c => lv_cache_lru_rb.c} | 32 +- .../{_lv_cache_lru_rb.h => lv_cache_lru_rb.h} | 2 +- src/misc/cache/lv_cache_private.h | 28 +- src/misc/cache/lv_image_cache.c | 1 + src/misc/cache/lv_image_header_cache.c | 1 + src/misc/lv_anim.c | 177 ++++++++-- src/misc/lv_anim.h | 162 ++------- src/misc/lv_anim_private.h | 56 +++ src/misc/lv_anim_timeline.c | 3 +- src/misc/lv_anim_timeline.h | 2 +- src/misc/lv_area.c | 134 +++++-- src/misc/lv_area.h | 200 ++--------- src/misc/lv_area_private.h | 115 ++++++ src/misc/lv_array.c | 39 +++ src/misc/lv_array.h | 35 +- src/misc/lv_async.c | 4 +- src/misc/lv_bidi.c | 30 +- src/misc/lv_bidi.h | 69 +--- src/misc/lv_bidi_private.h | 98 ++++++ src/misc/lv_color.c | 138 +++++++- src/misc/lv_color.h | 163 ++------- src/misc/lv_color_op.c | 43 ++- src/misc/lv_color_op.h | 44 +-- src/misc/lv_color_op_private.h | 39 +++ src/misc/lv_event.c | 8 +- src/misc/lv_event.h | 35 +- src/misc/lv_event_private.h | 73 ++++ src/misc/lv_fs.c | 16 +- src/misc/lv_fs.h | 55 +-- src/misc/lv_fs_private.h | 69 ++++ src/misc/lv_ll.c | 67 ++-- src/misc/lv_ll.h | 37 +- src/misc/lv_log.c | 4 +- src/misc/lv_log.h | 18 +- src/misc/lv_lru.c | 4 +- src/misc/lv_lru.h | 2 +- src/misc/lv_math.c | 12 + src/misc/lv_math.h | 12 +- src/misc/lv_matrix.h | 4 +- src/misc/lv_palette.c | 6 +- src/misc/lv_palette.h | 2 +- src/misc/lv_profiler_builtin.c | 4 +- src/misc/lv_profiler_builtin.h | 12 - src/misc/lv_profiler_builtin_private.h | 56 +++ src/misc/lv_rb.c | 2 +- src/misc/lv_rb.h | 14 - src/misc/lv_rb_private.h | 54 +++ src/misc/lv_style.c | 44 +-- src/misc/lv_style.h | 86 ++--- src/misc/lv_style_gen.c | 220 ------------ src/misc/lv_style_gen.h | 330 ++++++------------ src/misc/lv_style_private.h | 39 +++ src/misc/lv_text.c | 4 +- src/misc/lv_text.h | 20 +- src/misc/lv_text_ap.c | 4 +- src/misc/lv_text_ap.h | 4 +- src/misc/lv_timer.c | 47 ++- src/misc/lv_timer.h | 63 +--- src/misc/lv_timer_private.h | 81 +++++ src/misc/lv_types.h | 284 ++++++++++++--- src/others/file_explorer/lv_file_explorer.c | 4 +- src/others/file_explorer/lv_file_explorer.h | 24 -- .../file_explorer/lv_file_explorer_private.h | 69 ++++ src/others/fragment/lv_fragment.c | 2 +- src/others/fragment/lv_fragment.h | 44 +-- src/others/fragment/lv_fragment_manager.c | 46 +-- src/others/fragment/lv_fragment_private.h | 77 ++++ src/others/gridnav/lv_gridnav.c | 1 + src/others/ime/lv_ime_pinyin.c | 30 +- src/others/ime/lv_ime_pinyin.h | 29 -- src/others/ime/lv_ime_pinyin_private.h | 74 ++++ src/others/monkey/lv_monkey.c | 8 +- src/others/monkey/lv_monkey.h | 8 +- src/others/monkey/lv_monkey_private.h | 43 +++ src/others/observer/lv_observer.c | 42 ++- src/others/observer/lv_observer.h | 28 +- src/others/observer/lv_observer_private.h | 57 +++ src/others/snapshot/lv_snapshot.c | 36 +- src/others/snapshot/lv_snapshot.h | 22 +- src/others/sysmon/lv_sysmon.c | 7 +- src/others/sysmon/lv_sysmon.h | 48 --- src/others/sysmon/lv_sysmon_private.h | 91 +++++ src/stdlib/builtin/lv_mem_core_builtin.c | 16 +- src/stdlib/builtin/lv_sprintf_builtin.c | 8 +- src/stdlib/builtin/lv_tlsf.c | 10 +- src/stdlib/builtin/lv_tlsf.h | 10 - src/stdlib/builtin/lv_tlsf_private.h | 53 +++ src/stdlib/lv_mem.c | 2 +- src/stdlib/lv_mem_private.h | 39 +++ src/stdlib/lv_sprintf.h | 6 +- src/themes/default/lv_theme_default.c | 74 ++-- src/themes/lv_theme.c | 3 + src/themes/lv_theme.h | 13 - src/themes/lv_theme_private.h | 53 +++ src/themes/mono/lv_theme_mono.c | 1 + src/themes/simple/lv_theme_simple.c | 1 + src/tick/lv_tick.c | 2 +- src/tick/lv_tick.h | 7 - src/tick/lv_tick_private.h | 46 +++ src/widgets/animimage/lv_animimage.c | 3 +- src/widgets/animimage/lv_animimage.h | 19 +- src/widgets/animimage/lv_animimage_private.h | 55 +++ src/widgets/arc/lv_arc.c | 10 +- src/widgets/arc/lv_arc.h | 30 +- src/widgets/arc/lv_arc_private.h | 64 ++++ src/widgets/bar/lv_bar.c | 22 +- src/widgets/bar/lv_bar.h | 39 +-- src/widgets/bar/lv_bar_private.h | 66 ++++ src/widgets/button/lv_button.c | 3 +- src/widgets/button/lv_button.h | 8 - src/widgets/button/lv_button_private.h | 53 +++ src/widgets/buttonmatrix/lv_buttonmatrix.c | 11 +- src/widgets/buttonmatrix/lv_buttonmatrix.h | 29 +- .../buttonmatrix/lv_buttonmatrix_private.h | 57 +++ src/widgets/calendar/lv_calendar.c | 4 +- src/widgets/calendar/lv_calendar.h | 25 -- src/widgets/calendar/lv_calendar_chinese.c | 3 +- src/widgets/calendar/lv_calendar_chinese.h | 10 +- .../calendar/lv_calendar_chinese_private.h | 53 +++ .../calendar/lv_calendar_header_arrow.c | 1 + .../calendar/lv_calendar_header_dropdown.c | 1 + src/widgets/calendar/lv_calendar_private.h | 70 ++++ src/widgets/canvas/lv_canvas.c | 10 +- src/widgets/canvas/lv_canvas.h | 12 +- src/widgets/canvas/lv_canvas_private.h | 52 +++ src/widgets/chart/lv_chart.c | 83 +++-- src/widgets/chart/lv_chart.h | 80 +---- src/widgets/chart/lv_chart_private.h | 85 +++++ src/widgets/checkbox/lv_checkbox.c | 8 +- src/widgets/checkbox/lv_checkbox.h | 10 - src/widgets/checkbox/lv_checkbox_private.h | 54 +++ src/widgets/dropdown/lv_dropdown.c | 18 +- src/widgets/dropdown/lv_dropdown.h | 24 -- src/widgets/dropdown/lv_dropdown_private.h | 69 ++++ src/widgets/image/lv_image.c | 72 ++-- src/widgets/image/lv_image.h | 53 +-- src/widgets/image/lv_image_private.h | 66 ++++ src/widgets/imagebutton/lv_imagebutton.c | 9 +- src/widgets/imagebutton/lv_imagebutton.h | 15 +- .../imagebutton/lv_imagebutton_private.h | 57 +++ src/widgets/keyboard/lv_keyboard.c | 20 +- src/widgets/keyboard/lv_keyboard.h | 33 +- src/widgets/keyboard/lv_keyboard_private.h | 53 +++ src/widgets/label/lv_label.c | 36 +- src/widgets/label/lv_label.h | 37 +- src/widgets/label/lv_label_private.h | 73 ++++ src/widgets/led/lv_led.c | 4 +- src/widgets/led/lv_led.h | 7 - src/widgets/led/lv_led_private.h | 51 +++ src/widgets/line/lv_line.c | 3 +- src/widgets/line/lv_line.h | 12 - src/widgets/line/lv_line_private.h | 57 +++ src/widgets/list/lv_list.c | 1 + src/widgets/lottie/lv_lottie.c | 3 +- src/widgets/lottie/lv_lottie.h | 17 +- src/widgets/lottie/lv_lottie_private.h | 59 ++++ src/widgets/menu/lv_menu.c | 25 +- src/widgets/menu/lv_menu.h | 65 +--- src/widgets/menu/lv_menu_private.h | 84 +++++ src/widgets/msgbox/lv_msgbox.c | 4 +- src/widgets/msgbox/lv_msgbox.h | 12 - src/widgets/msgbox/lv_msgbox_private.h | 56 +++ src/widgets/property/lv_obj_property_names.h | 2 +- src/widgets/property/lv_style_properties.c | 3 +- src/widgets/property/lv_style_properties.h | 1 + src/widgets/roller/lv_roller.c | 17 +- src/widgets/roller/lv_roller.h | 20 +- src/widgets/roller/lv_roller_private.h | 54 +++ src/widgets/scale/lv_scale.c | 52 +-- src/widgets/scale/lv_scale.h | 44 +-- src/widgets/scale/lv_scale_private.h | 81 +++++ src/widgets/slider/lv_slider.c | 63 +++- src/widgets/slider/lv_slider.h | 73 +--- src/widgets/slider/lv_slider_private.h | 55 +++ src/widgets/span/lv_span.c | 86 ++--- src/widgets/span/lv_span.h | 51 +-- src/widgets/span/lv_span_private.h | 65 ++++ src/widgets/spinbox/lv_spinbox.c | 3 +- src/widgets/spinbox/lv_spinbox.h | 14 - src/widgets/spinbox/lv_spinbox_private.h | 59 ++++ src/widgets/spinner/lv_spinner.c | 2 + src/widgets/switch/lv_switch.c | 8 +- src/widgets/switch/lv_switch.h | 11 +- src/widgets/switch/lv_switch_private.h | 53 +++ src/widgets/table/lv_table.c | 19 +- src/widgets/table/lv_table.h | 29 +- src/widgets/table/lv_table_private.h | 63 ++++ src/widgets/tabview/lv_tabview.c | 12 + src/widgets/tabview/lv_tabview.h | 10 - src/widgets/tabview/lv_tabview_private.h | 55 +++ src/widgets/textarea/lv_textarea.c | 6 +- src/widgets/textarea/lv_textarea.h | 30 -- src/widgets/textarea/lv_textarea_private.h | 75 ++++ src/widgets/tileview/lv_tileview.c | 3 +- src/widgets/tileview/lv_tileview.h | 13 - src/widgets/tileview/lv_tileview_private.h | 58 +++ src/widgets/win/lv_win.c | 2 + src/widgets/win/lv_win.h | 8 +- src/widgets/win/lv_win_private.h | 52 +++ .../al88/demo_render_arc_image_opa_128.png | Bin 0 -> 19112 bytes .../al88/demo_render_arc_image_opa_255.png | Bin 0 -> 21817 bytes .../al88/demo_render_arc_normal_opa_128.png | Bin 0 -> 17401 bytes .../al88/demo_render_arc_normal_opa_255.png | Bin 0 -> 18795 bytes .../al88/demo_render_blend_mode_opa_128.png | Bin 0 -> 50855 bytes .../al88/demo_render_blend_mode_opa_255.png | Bin 0 -> 60624 bytes .../al88/demo_render_border_opa_128.png | Bin 0 -> 12494 bytes .../al88/demo_render_border_opa_255.png | Bin 0 -> 12366 bytes .../al88/demo_render_box_shadow_opa_128.png | Bin 0 -> 16776 bytes .../al88/demo_render_box_shadow_opa_255.png | Bin 0 -> 18771 bytes .../demo_render_conical_gradient_opa_128.png | Bin 0 -> 23392 bytes .../demo_render_conical_gradient_opa_255.png | Bin 0 -> 28336 bytes .../render/al88/demo_render_fill_opa_128.png | Bin 0 -> 17436 bytes .../render/al88/demo_render_fill_opa_255.png | Bin 0 -> 18118 bytes .../demo_render_image_normal_1_opa_128.png | Bin 0 -> 46537 bytes .../demo_render_image_normal_1_opa_255.png | Bin 0 -> 53552 bytes .../demo_render_image_normal_2_opa_128.png | Bin 0 -> 16131 bytes .../demo_render_image_normal_2_opa_255.png | Bin 0 -> 18416 bytes .../demo_render_image_recolor_1_opa_128.png | Bin 0 -> 40095 bytes .../demo_render_image_recolor_1_opa_255.png | Bin 0 -> 45866 bytes .../demo_render_image_recolor_2_opa_128.png | Bin 0 -> 13530 bytes .../demo_render_image_recolor_2_opa_255.png | Bin 0 -> 15925 bytes .../al88/demo_render_layer_normal_opa_128.png | Bin 0 -> 59240 bytes .../al88/demo_render_layer_normal_opa_255.png | Bin 0 -> 65190 bytes .../render/al88/demo_render_line_opa_128.png | Bin 0 -> 13304 bytes .../render/al88/demo_render_line_opa_255.png | Bin 0 -> 13305 bytes .../demo_render_linear_gradient_opa_128.png | Bin 0 -> 20420 bytes .../demo_render_linear_gradient_opa_255.png | Bin 0 -> 22287 bytes .../demo_render_radial_gradient_opa_128.png | Bin 0 -> 27688 bytes .../demo_render_radial_gradient_opa_255.png | Bin 0 -> 34876 bytes .../render/al88/demo_render_text_opa_128.png | Bin 0 -> 19202 bytes .../render/al88/demo_render_text_opa_255.png | Bin 0 -> 19202 bytes .../al88/demo_render_triangle_opa_128.png | Bin 0 -> 16610 bytes .../al88/demo_render_triangle_opa_255.png | Bin 0 -> 21903 bytes .../l8/demo_render_image_normal_1_opa_128.png | Bin 0 -> 42107 bytes .../l8/demo_render_image_normal_1_opa_255.png | Bin 0 -> 50632 bytes .../l8/demo_render_image_normal_2_opa_128.png | Bin 0 -> 13466 bytes .../l8/demo_render_image_normal_2_opa_255.png | Bin 0 -> 15216 bytes .../demo_render_image_recolor_1_opa_128.png | Bin 0 -> 35443 bytes .../demo_render_image_recolor_1_opa_255.png | Bin 0 -> 42385 bytes .../demo_render_image_recolor_2_opa_128.png | Bin 0 -> 11603 bytes .../demo_render_image_recolor_2_opa_255.png | Bin 0 -> 13455 bytes tests/src/lv_test_indev.c | 1 + tests/src/test_cases/cache/test_cache.c | 1 + tests/src/test_cases/draw/test_clip_corner.c | 1 + tests/src/test_cases/draw/test_draw_blend.c | 1 + tests/src/test_cases/draw/test_draw_label.c | 1 + tests/src/test_cases/draw/test_draw_layer.c | 1 + .../draw/test_draw_sw_post_process.c | 1 + tests/src/test_cases/draw/test_draw_vector.c | 1 + .../src/test_cases/draw/test_image_formats.c | 1 + .../test_cases/draw/test_layer_transform.c | 1 + .../src/test_cases/draw/test_render_to_al88.c | 3 +- .../test_cases/draw/test_render_to_argb8888.c | 3 +- tests/src/test_cases/draw/test_render_to_i1.c | 2 +- tests/src/test_cases/draw/test_render_to_l8.c | 3 +- .../test_cases/draw/test_render_to_rgb565.c | 3 +- .../test_cases/draw/test_render_to_rgb888.c | 3 +- .../test_cases/draw/test_render_to_xrgb8888.c | 3 +- tests/src/test_cases/libs/test_barcode.c | 1 + tests/src/test_cases/libs/test_bin_decoder.c | 1 + tests/src/test_cases/libs/test_bmp.c | 1 + tests/src/test_cases/libs/test_font_stress.c | 1 + tests/src/test_cases/libs/test_freetype.c | 9 +- .../src/test_cases/libs/test_libjpeg_turbo.c | 1 + tests/src/test_cases/libs/test_libpng.c | 1 + tests/src/test_cases/libs/test_lodepng.c | 1 + tests/src/test_cases/libs/test_memmove.c | 1 + tests/src/test_cases/libs/test_qrcode.c | 1 + tests/src/test_cases/libs/test_tiny_ttf.c | 1 + tests/src/test_cases/libs/test_tjpgd.c | 1 + tests/src/test_cases/test_align_flex.c | 1 + tests/src/test_cases/test_anim.c | 1 + tests/src/test_cases/test_anim_timeline.c | 1 + tests/src/test_cases/test_area.c | 1 + tests/src/test_cases/test_array.c | 1 + tests/src/test_cases/test_bindings.c | 1 + tests/src/test_cases/test_config.c | 1 + tests/src/test_cases/test_demo_stress.c | 1 + tests/src/test_cases/test_demo_widgets.c | 1 + tests/src/test_cases/test_draw_buf_stride.c | 1 + tests/src/test_cases/test_event.c | 1 + tests/src/test_cases/test_font_loader.c | 1 + tests/src/test_cases/test_fs.c | 1 + tests/src/test_cases/test_grid.c | 1 + tests/src/test_cases/test_group.c | 1 + tests/src/test_cases/test_hover.c | 10 +- tests/src/test_cases/test_margin_align.c | 1 + tests/src/test_cases/test_margin_flex.c | 1 + tests/src/test_cases/test_margin_grid.c | 1 + tests/src/test_cases/test_math.c | 1 + tests/src/test_cases/test_mem.c | 1 + tests/src/test_cases/test_observer.c | 3 +- tests/src/test_cases/test_profiler.c | 1 + tests/src/test_cases/test_screen_load.c | 1 + tests/src/test_cases/test_snapshot.c | 1 + tests/src/test_cases/test_style.c | 7 +- tests/src/test_cases/test_txt.c | 1 + tests/src/test_cases/widgets/test_animimg.c | 1 + tests/src/test_cases/widgets/test_arc.c | 1 + tests/src/test_cases/widgets/test_bar.c | 1 + tests/src/test_cases/widgets/test_btn.c | 1 + tests/src/test_cases/widgets/test_btnmatrix.c | 1 + tests/src/test_cases/widgets/test_calendar.c | 1 + tests/src/test_cases/widgets/test_canvas.c | 1 + tests/src/test_cases/widgets/test_chart.c | 1 + tests/src/test_cases/widgets/test_checkbox.c | 1 + tests/src/test_cases/widgets/test_dropdown.c | 1 + tests/src/test_cases/widgets/test_image.c | 1 + .../test_cases/widgets/test_image_property.c | 1 + tests/src/test_cases/widgets/test_imgfont.c | 1 + tests/src/test_cases/widgets/test_keyboard.c | 1 + tests/src/test_cases/widgets/test_label.c | 37 +- tests/src/test_cases/widgets/test_led.c | 1 + tests/src/test_cases/widgets/test_line.c | 5 +- tests/src/test_cases/widgets/test_list.c | 1 + tests/src/test_cases/widgets/test_msgbox.c | 1 + tests/src/test_cases/widgets/test_obj_flags.c | 1 + .../test_cases/widgets/test_obj_property.c | 1 + tests/src/test_cases/widgets/test_obj_tree.c | 1 + tests/src/test_cases/widgets/test_objid.c | 1 + tests/src/test_cases/widgets/test_roller.c | 3 +- tests/src/test_cases/widgets/test_scale.c | 1 + tests/src/test_cases/widgets/test_slider.c | 1 + tests/src/test_cases/widgets/test_span.c | 5 +- tests/src/test_cases/widgets/test_spinbox.c | 1 + tests/src/test_cases/widgets/test_spinner.c | 1 + tests/src/test_cases/widgets/test_switch.c | 7 +- tests/src/test_cases/widgets/test_table.c | 1 + tests/src/test_cases/widgets/test_tabview.c | 1 + tests/src/test_cases/widgets/test_textarea.c | 1 + tests/src/test_cases/widgets/test_win.c | 1 + 587 files changed, 9411 insertions(+), 5563 deletions(-) create mode 100644 src/core/lv_group_private.h create mode 100644 src/core/lv_obj_class_private.h create mode 100644 src/core/lv_obj_draw_private.h create mode 100644 src/core/lv_obj_event_private.h create mode 100644 src/core/lv_obj_private.h create mode 100644 src/core/lv_obj_scroll_private.h create mode 100644 src/core/lv_obj_style_private.h create mode 100644 src/core/lv_refr_private.h create mode 100644 src/draw/lv_draw_buf_private.h create mode 100644 src/draw/lv_draw_image_private.h create mode 100644 src/draw/lv_draw_label_private.h create mode 100644 src/draw/lv_draw_mask_private.h create mode 100644 src/draw/lv_draw_private.h create mode 100644 src/draw/lv_draw_rect_private.h create mode 100644 src/draw/lv_draw_triangle_private.h create mode 100644 src/draw/lv_draw_vector_private.h create mode 100644 src/draw/lv_image_decoder_private.h create mode 100644 src/draw/sw/blend/lv_draw_sw_blend_private.h create mode 100644 src/draw/sw/lv_draw_sw_gradient_private.h create mode 100644 src/draw/sw/lv_draw_sw_mask_private.h create mode 100644 src/draw/sw/lv_draw_sw_private.h create mode 100644 src/drivers/libinput/lv_libinput_private.h create mode 100644 src/drivers/libinput/lv_xkb_private.h create mode 100644 src/font/lv_font_fmt_txt_private.h create mode 100644 src/layouts/lv_layout_private.h create mode 100644 src/libs/barcode/lv_barcode_private.h create mode 100644 src/libs/ffmpeg/lv_ffmpeg_private.h create mode 100644 src/libs/gif/lv_gif_private.h create mode 100644 src/libs/qrcode/lv_qrcode_private.h create mode 100644 src/libs/rlottie/lv_rlottie_private.h rename src/misc/cache/{_lv_cache_lru_rb.c => lv_cache_lru_rb.c} (96%) rename src/misc/cache/{_lv_cache_lru_rb.h => lv_cache_lru_rb.h} (96%) create mode 100644 src/misc/lv_anim_private.h create mode 100644 src/misc/lv_area_private.h create mode 100644 src/misc/lv_bidi_private.h create mode 100644 src/misc/lv_color_op_private.h create mode 100644 src/misc/lv_event_private.h create mode 100644 src/misc/lv_fs_private.h create mode 100644 src/misc/lv_profiler_builtin_private.h create mode 100644 src/misc/lv_rb_private.h create mode 100644 src/misc/lv_style_private.h create mode 100644 src/misc/lv_timer_private.h create mode 100644 src/others/file_explorer/lv_file_explorer_private.h create mode 100644 src/others/fragment/lv_fragment_private.h create mode 100644 src/others/ime/lv_ime_pinyin_private.h create mode 100644 src/others/monkey/lv_monkey_private.h create mode 100644 src/others/observer/lv_observer_private.h create mode 100644 src/others/sysmon/lv_sysmon_private.h create mode 100644 src/stdlib/builtin/lv_tlsf_private.h create mode 100644 src/stdlib/lv_mem_private.h create mode 100644 src/themes/lv_theme_private.h create mode 100644 src/tick/lv_tick_private.h create mode 100644 src/widgets/animimage/lv_animimage_private.h create mode 100644 src/widgets/arc/lv_arc_private.h create mode 100644 src/widgets/bar/lv_bar_private.h create mode 100644 src/widgets/button/lv_button_private.h create mode 100644 src/widgets/buttonmatrix/lv_buttonmatrix_private.h create mode 100644 src/widgets/calendar/lv_calendar_chinese_private.h create mode 100644 src/widgets/calendar/lv_calendar_private.h create mode 100644 src/widgets/canvas/lv_canvas_private.h create mode 100644 src/widgets/chart/lv_chart_private.h create mode 100644 src/widgets/checkbox/lv_checkbox_private.h create mode 100644 src/widgets/dropdown/lv_dropdown_private.h create mode 100644 src/widgets/image/lv_image_private.h create mode 100644 src/widgets/imagebutton/lv_imagebutton_private.h create mode 100644 src/widgets/keyboard/lv_keyboard_private.h create mode 100644 src/widgets/label/lv_label_private.h create mode 100644 src/widgets/led/lv_led_private.h create mode 100644 src/widgets/line/lv_line_private.h create mode 100644 src/widgets/lottie/lv_lottie_private.h create mode 100644 src/widgets/menu/lv_menu_private.h create mode 100644 src/widgets/msgbox/lv_msgbox_private.h create mode 100644 src/widgets/roller/lv_roller_private.h create mode 100644 src/widgets/scale/lv_scale_private.h create mode 100644 src/widgets/slider/lv_slider_private.h create mode 100644 src/widgets/span/lv_span_private.h create mode 100644 src/widgets/spinbox/lv_spinbox_private.h create mode 100644 src/widgets/switch/lv_switch_private.h create mode 100644 src/widgets/table/lv_table_private.h create mode 100644 src/widgets/tabview/lv_tabview_private.h create mode 100644 src/widgets/textarea/lv_textarea_private.h create mode 100644 src/widgets/tileview/lv_tileview_private.h create mode 100644 src/widgets/win/lv_win_private.h create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_image_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_image_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_normal_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_normal_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_blend_mode_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_blend_mode_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_border_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_border_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_box_shadow_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_box_shadow_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_conical_gradient_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_conical_gradient_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_fill_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_fill_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_1_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_1_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_2_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_2_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_1_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_1_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_2_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_2_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_layer_normal_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_layer_normal_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_line_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_line_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_linear_gradient_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_linear_gradient_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_radial_gradient_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_radial_gradient_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_text_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_text_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_triangle_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/al88/demo_render_triangle_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_1_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_1_opa_255.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_128.png create mode 100644 tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_255.png diff --git a/Kconfig b/Kconfig index 954b1cb51..2cf707a10 100644 --- a/Kconfig +++ b/Kconfig @@ -250,7 +250,7 @@ menu "LVGL configuration" bool "Enable support for I1 color format" default y depends on LV_USE_DRAW_SW - + config LV_DRAW_SW_DRAW_UNIT_CNT int "Number of draw units" default 1 diff --git a/demos/benchmark/lv_demo_benchmark.c b/demos/benchmark/lv_demo_benchmark.c index cd5b4bb12..6939df175 100644 --- a/demos/benchmark/lv_demo_benchmark.c +++ b/demos/benchmark/lv_demo_benchmark.c @@ -26,9 +26,12 @@ #warning "It's recommended to have at least 128kB RAM for the benchmark" #endif -#include "../../src/display/lv_display_private.h" #include "../../src/core/lv_global.h" +#if LV_USE_PERF_MONITOR + #include "../../src/display/lv_display_private.h" +#endif + /********************** * TYPEDEFS **********************/ diff --git a/demos/music/lv_demo_music.c b/demos/music/lv_demo_music.c index 2c1a38621..00e9213dc 100644 --- a/demos/music/lv_demo_music.c +++ b/demos/music/lv_demo_music.c @@ -118,33 +118,33 @@ void lv_demo_music(void) { lv_obj_set_style_bg_color(lv_screen_active(), lv_color_hex(0x343247), 0); - list = _lv_demo_music_list_create(lv_screen_active()); - ctrl = _lv_demo_music_main_create(lv_screen_active()); + list = lv_demo_music_list_create(lv_screen_active()); + ctrl = lv_demo_music_main_create(lv_screen_active()); #if LV_DEMO_MUSIC_AUTO_PLAY lv_timer_create(auto_step_cb, 1000, NULL); #endif } -const char * _lv_demo_music_get_title(uint32_t track_id) +const char * lv_demo_music_get_title(uint32_t track_id) { if(track_id >= sizeof(title_list) / sizeof(title_list[0])) return NULL; return title_list[track_id]; } -const char * _lv_demo_music_get_artist(uint32_t track_id) +const char * lv_demo_music_get_artist(uint32_t track_id) { if(track_id >= sizeof(artist_list) / sizeof(artist_list[0])) return NULL; return artist_list[track_id]; } -const char * _lv_demo_music_get_genre(uint32_t track_id) +const char * lv_demo_music_get_genre(uint32_t track_id) { if(track_id >= sizeof(genre_list) / sizeof(genre_list[0])) return NULL; return genre_list[track_id]; } -uint32_t _lv_demo_music_get_track_length(uint32_t track_id) +uint32_t lv_demo_music_get_track_length(uint32_t track_id) { if(track_id >= sizeof(time_list) / sizeof(time_list[0])) return 0; return time_list[track_id]; @@ -170,17 +170,17 @@ static void auto_step_cb(lv_timer_t * t) switch(state) { case 5: - _lv_demo_music_album_next(true); + lv_demo_music_album_next(true); break; case 6: - _lv_demo_music_album_next(true); + lv_demo_music_album_next(true); break; case 7: - _lv_demo_music_album_next(true); + lv_demo_music_album_next(true); break; case 8: - _lv_demo_music_play(0); + lv_demo_music_play(0); break; #if LV_DEMO_MUSIC_SQUARE || LV_DEMO_MUSIC_ROUND case 11: @@ -201,7 +201,7 @@ static void auto_step_cb(lv_timer_t * t) lv_obj_scroll_by(list, 0, 300, LV_ANIM_ON); break; case 18: - _lv_demo_music_play(1); + lv_demo_music_play(1); break; case 19: lv_obj_scroll_by(ctrl, 0, LV_VER_RES, LV_ANIM_ON); @@ -212,7 +212,7 @@ static void auto_step_cb(lv_timer_t * t) break; #endif case 30: - _lv_demo_music_play(2); + lv_demo_music_play(2); break; case 40: { lv_obj_t * bg = lv_layer_top(); @@ -247,7 +247,7 @@ static void auto_step_cb(lv_timer_t * t) } case 41: lv_screen_load(lv_obj_create(NULL)); - _lv_demo_music_pause(); + lv_demo_music_pause(); break; } state++; diff --git a/demos/music/lv_demo_music.h b/demos/music/lv_demo_music.h index 82917fb52..88169c8d3 100644 --- a/demos/music/lv_demo_music.h +++ b/demos/music/lv_demo_music.h @@ -36,10 +36,10 @@ extern "C" { **********************/ void lv_demo_music(void); -const char * _lv_demo_music_get_title(uint32_t track_id); -const char * _lv_demo_music_get_artist(uint32_t track_id); -const char * _lv_demo_music_get_genre(uint32_t track_id); -uint32_t _lv_demo_music_get_track_length(uint32_t track_id); +const char * lv_demo_music_get_title(uint32_t track_id); +const char * lv_demo_music_get_artist(uint32_t track_id); +const char * lv_demo_music_get_genre(uint32_t track_id); +uint32_t lv_demo_music_get_track_length(uint32_t track_id); /********************** * MACROS diff --git a/demos/music/lv_demo_music_list.c b/demos/music/lv_demo_music_list.c index d5bcf8d0b..4af075a74 100644 --- a/demos/music/lv_demo_music_list.c +++ b/demos/music/lv_demo_music_list.c @@ -51,7 +51,7 @@ LV_IMAGE_DECLARE(img_lv_demo_music_btn_list_pause); * GLOBAL FUNCTIONS **********************/ -lv_obj_t * _lv_demo_music_list_create(lv_obj_t * parent) +lv_obj_t * lv_demo_music_list_create(lv_obj_t * parent) { font_small = LV_FONT_DEFAULT; font_medium = LV_FONT_DEFAULT; @@ -138,7 +138,7 @@ lv_obj_t * _lv_demo_music_list_create(lv_obj_t * parent) lv_obj_set_flex_flow(list, LV_FLEX_FLOW_COLUMN); uint32_t track_id; - for(track_id = 0; _lv_demo_music_get_title(track_id); track_id++) { + for(track_id = 0; lv_demo_music_get_title(track_id); track_id++) { add_list_button(list, track_id); } @@ -146,12 +146,12 @@ lv_obj_t * _lv_demo_music_list_create(lv_obj_t * parent) lv_obj_set_scroll_snap_y(list, LV_SCROLL_SNAP_CENTER); #endif - _lv_demo_music_list_button_check(0, true); + lv_demo_music_list_button_check(0, true); return list; } -void _lv_demo_music_list_button_check(uint32_t track_id, bool state) +void lv_demo_music_list_button_check(uint32_t track_id, bool state) { lv_obj_t * btn = lv_obj_get_child(list, track_id); lv_obj_t * icon = lv_obj_get_child(btn, 0); @@ -173,11 +173,11 @@ void _lv_demo_music_list_button_check(uint32_t track_id, bool state) static lv_obj_t * add_list_button(lv_obj_t * parent, uint32_t track_id) { - uint32_t t = _lv_demo_music_get_track_length(track_id); + uint32_t t = lv_demo_music_get_track_length(track_id); char time[32]; lv_snprintf(time, sizeof(time), "%"LV_PRIu32":%02"LV_PRIu32, t / 60, t % 60); - const char * title = _lv_demo_music_get_title(track_id); - const char * artist = _lv_demo_music_get_artist(track_id); + const char * title = lv_demo_music_get_title(track_id); + const char * artist = lv_demo_music_get_artist(track_id); lv_obj_t * btn = lv_obj_create(parent); lv_obj_remove_style_all(btn); @@ -233,7 +233,7 @@ static void btn_click_event_cb(lv_event_t * e) uint32_t idx = lv_obj_get_index(btn); - _lv_demo_music_play(idx); + lv_demo_music_play(idx); } static void list_delete_event_cb(lv_event_t * e) diff --git a/demos/music/lv_demo_music_list.h b/demos/music/lv_demo_music_list.h index 874f1c2a5..ffab6142b 100644 --- a/demos/music/lv_demo_music_list.h +++ b/demos/music/lv_demo_music_list.h @@ -27,8 +27,8 @@ extern "C" { /********************** * GLOBAL PROTOTYPES **********************/ -lv_obj_t * _lv_demo_music_list_create(lv_obj_t * parent); -void _lv_demo_music_list_button_check(uint32_t track_id, bool state); +lv_obj_t * lv_demo_music_list_create(lv_obj_t * parent); +void lv_demo_music_list_button_check(uint32_t track_id, bool state); /********************** * MACROS diff --git a/demos/music/lv_demo_music_main.c b/demos/music/lv_demo_music_main.c index 5cf8e9b89..f699b4511 100644 --- a/demos/music/lv_demo_music_main.c +++ b/demos/music/lv_demo_music_main.c @@ -124,7 +124,7 @@ static void _obj_set_x_anim_cb(void * obj, int32_t x) lv_obj_set_x((lv_obj_t *)obj, (int32_t)x); } -lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent) +lv_obj_t * lv_demo_music_main_create(lv_obj_t * parent) { font_small = LV_FONT_DEFAULT; font_large = LV_FONT_DEFAULT; @@ -318,7 +318,7 @@ lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent) return main_cont; } -void _lv_demo_music_album_next(bool next) +void lv_demo_music_album_next(bool next) { uint32_t id = track_id; if(next) { @@ -335,21 +335,21 @@ void _lv_demo_music_album_next(bool next) } if(playing) { - _lv_demo_music_play(id); + lv_demo_music_play(id); } else { track_load(id); } } -void _lv_demo_music_play(uint32_t id) +void lv_demo_music_play(uint32_t id) { track_load(id); - _lv_demo_music_resume(); + lv_demo_music_resume(); } -void _lv_demo_music_resume(void) +void lv_demo_music_resume(void) { playing = true; spectrum_i = spectrum_i_pause; @@ -364,13 +364,13 @@ void _lv_demo_music_resume(void) lv_anim_start(&a); if(sec_counter_timer) lv_timer_resume(sec_counter_timer); - lv_slider_set_range(slider_obj, 0, _lv_demo_music_get_track_length(track_id)); + lv_slider_set_range(slider_obj, 0, lv_demo_music_get_track_length(track_id)); lv_obj_add_state(play_obj, LV_STATE_CHECKED); } -void _lv_demo_music_pause(void) +void lv_demo_music_pause(void) { playing = false; spectrum_i_pause = spectrum_i; @@ -499,18 +499,18 @@ static lv_obj_t * create_title_box(lv_obj_t * parent) title_label = lv_label_create(cont); lv_obj_set_style_text_font(title_label, font_large, 0); lv_obj_set_style_text_color(title_label, lv_color_hex(0x504d6d), 0); - lv_label_set_text(title_label, _lv_demo_music_get_title(track_id)); + lv_label_set_text(title_label, lv_demo_music_get_title(track_id)); lv_obj_set_height(title_label, lv_font_get_line_height(font_large) * 3 / 2); artist_label = lv_label_create(cont); lv_obj_set_style_text_font(artist_label, font_small, 0); lv_obj_set_style_text_color(artist_label, lv_color_hex(0x504d6d), 0); - lv_label_set_text(artist_label, _lv_demo_music_get_artist(track_id)); + lv_label_set_text(artist_label, lv_demo_music_get_artist(track_id)); genre_label = lv_label_create(cont); lv_obj_set_style_text_font(genre_label, font_small, 0); lv_obj_set_style_text_color(genre_label, lv_color_hex(0x8a86b8), 0); - lv_label_set_text(genre_label, _lv_demo_music_get_genre(track_id)); + lv_label_set_text(genre_label, lv_demo_music_get_genre(track_id)); return cont; } @@ -685,15 +685,15 @@ static void track_load(uint32_t id) bool next = false; if((track_id + 1) % ACTIVE_TRACK_CNT == id) next = true; - _lv_demo_music_list_button_check(track_id, false); + lv_demo_music_list_button_check(track_id, false); track_id = id; - _lv_demo_music_list_button_check(id, true); + lv_demo_music_list_button_check(id, true); - lv_label_set_text(title_label, _lv_demo_music_get_title(track_id)); - lv_label_set_text(artist_label, _lv_demo_music_get_artist(track_id)); - lv_label_set_text(genre_label, _lv_demo_music_get_genre(track_id)); + lv_label_set_text(title_label, lv_demo_music_get_title(track_id)); + lv_label_set_text(artist_label, lv_demo_music_get_artist(track_id)); + lv_label_set_text(genre_label, lv_demo_music_get_genre(track_id)); lv_anim_t a; lv_anim_init(&a); @@ -801,8 +801,10 @@ static void spectrum_draw_event_cb(lv_event_t * e) if(opa < LV_OPA_MIN) return; lv_point_t center; - center.x = obj->coords.x1 + lv_obj_get_width(obj) / 2; - center.y = obj->coords.y1 + lv_obj_get_height(obj) / 2; + lv_area_t obj_coords; + lv_obj_get_coords(obj, &obj_coords); + center.x = obj_coords.x1 + lv_obj_get_width(obj) / 2; + center.y = obj_coords.y1 + lv_obj_get_height(obj) / 2; lv_draw_triangle_dsc_t draw_dsc; lv_draw_triangle_dsc_init(&draw_dsc); @@ -975,32 +977,32 @@ static void album_gesture_event_cb(lv_event_t * e) { LV_UNUSED(e); lv_dir_t dir = lv_indev_get_gesture_dir(lv_indev_active()); - if(dir == LV_DIR_LEFT) _lv_demo_music_album_next(true); - if(dir == LV_DIR_RIGHT) _lv_demo_music_album_next(false); + if(dir == LV_DIR_LEFT) lv_demo_music_album_next(true); + if(dir == LV_DIR_RIGHT) lv_demo_music_album_next(false); } static void play_event_click_cb(lv_event_t * e) { lv_obj_t * obj = lv_event_get_target(e); if(lv_obj_has_state(obj, LV_STATE_CHECKED)) { - _lv_demo_music_resume(); + lv_demo_music_resume(); } else { - _lv_demo_music_pause(); + lv_demo_music_pause(); } } static void prev_click_event_cb(lv_event_t * e) { LV_UNUSED(e); - _lv_demo_music_album_next(false); + lv_demo_music_album_next(false); } static void next_click_event_cb(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); if(code == LV_EVENT_CLICKED) { - _lv_demo_music_album_next(true); + lv_demo_music_album_next(true); } } @@ -1015,7 +1017,7 @@ static void timer_cb(lv_timer_t * t) static void spectrum_end_cb(lv_anim_t * a) { LV_UNUSED(a); - _lv_demo_music_album_next(true); + lv_demo_music_album_next(true); } static void stop_start_anim(lv_timer_t * t) diff --git a/demos/music/lv_demo_music_main.h b/demos/music/lv_demo_music_main.h index 8a2fe9ffc..5ef963864 100644 --- a/demos/music/lv_demo_music_main.h +++ b/demos/music/lv_demo_music_main.h @@ -32,11 +32,11 @@ extern "C" { /********************** * GLOBAL PROTOTYPES **********************/ -lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent); -void _lv_demo_music_play(uint32_t id); -void _lv_demo_music_resume(void); -void _lv_demo_music_pause(void); -void _lv_demo_music_album_next(bool next); +lv_obj_t * lv_demo_music_main_create(lv_obj_t * parent); +void lv_demo_music_play(uint32_t id); +void lv_demo_music_resume(void); +void lv_demo_music_pause(void); +void lv_demo_music_album_next(bool next); /********************** * MACROS diff --git a/demos/render/lv_demo_render.c b/demos/render/lv_demo_render.c index d42ec9cf0..bccb1b508 100644 --- a/demos/render/lv_demo_render.c +++ b/demos/render/lv_demo_render.c @@ -10,7 +10,6 @@ #if LV_USE_DEMO_RENDER -#include "../../src/display/lv_display_private.h" #include "../../src/core/lv_global.h" /********************* @@ -531,12 +530,14 @@ static void triangle_draw_event_cb(lv_event_t * e) lv_point_t * p_rel = lv_event_get_user_data(e); - dsc.p[0].x = p_rel[0].x + obj->coords.x1 + 8; - dsc.p[0].y = p_rel[0].y + obj->coords.y1 + 2; - dsc.p[1].x = p_rel[1].x + obj->coords.x1 + 8; - dsc.p[1].y = p_rel[1].y + obj->coords.y1 + 2; - dsc.p[2].x = p_rel[2].x + obj->coords.x1 + 8; - dsc.p[2].y = p_rel[2].y + obj->coords.y1 + 2; + lv_area_t coords; + lv_obj_get_coords(obj, &coords); + dsc.p[0].x = p_rel[0].x + coords.x1 + 8; + dsc.p[0].y = p_rel[0].y + coords.y1 + 2; + dsc.p[1].x = p_rel[1].x + coords.x1 + 8; + dsc.p[1].y = p_rel[1].y + coords.y1 + 2; + dsc.p[2].x = p_rel[2].x + coords.x1 + 8; + dsc.p[2].y = p_rel[2].y + coords.y1 + 2; lv_opa_t opa = lv_obj_get_style_opa(obj, 0); dsc.bg_grad.dir = lv_obj_get_style_bg_grad_dir(obj, 0); @@ -1132,7 +1133,7 @@ void lv_demo_render(lv_demo_render_scene_t id, lv_opa_t opa) const char * lv_demo_render_get_scene_name(lv_demo_render_scene_t id) { - if(id > _LV_DEMO_RENDER_SCENE_NUM) return NULL; + if(id > LV_DEMO_RENDER_SCENE_NUM) return NULL; return scenes[id].name; } diff --git a/demos/render/lv_demo_render.h b/demos/render/lv_demo_render.h index 5a1fc6729..a5af7fcfe 100644 --- a/demos/render/lv_demo_render.h +++ b/demos/render/lv_demo_render.h @@ -48,7 +48,7 @@ typedef enum { LV_DEMO_RENDER_SCENE_RADIAL_GRADIENT, LV_DEMO_RENDER_SCENE_CONICAL_GRADIENT, #endif - _LV_DEMO_RENDER_SCENE_NUM, + LV_DEMO_RENDER_SCENE_NUM, } lv_demo_render_scene_t; /********************** diff --git a/demos/stress/lv_demo_stress.c b/demos/stress/lv_demo_stress.c index b76c1f655..0b01fec79 100644 --- a/demos/stress/lv_demo_stress.c +++ b/demos/stress/lv_demo_stress.c @@ -438,7 +438,7 @@ static void auto_delete(lv_obj_t * obj, uint32_t delay) static void msgbox_delete(lv_timer_t * tmr) { - lv_msgbox_close(tmr->user_data); + lv_msgbox_close(lv_timer_get_user_data(tmr)); } static void set_y_anim(void * obj, int32_t v) diff --git a/demos/widgets/lv_demo_widgets.c b/demos/widgets/lv_demo_widgets.c index be4ebf75f..a8ee61764 100644 --- a/demos/widgets/lv_demo_widgets.c +++ b/demos/widgets/lv_demo_widgets.c @@ -1049,7 +1049,7 @@ static void color_changer_create(lv_obj_t * parent) { static lv_palette_t palette[] = { LV_PALETTE_BLUE, LV_PALETTE_GREEN, LV_PALETTE_BLUE_GREY, LV_PALETTE_ORANGE, - LV_PALETTE_RED, LV_PALETTE_PURPLE, LV_PALETTE_TEAL, _LV_PALETTE_LAST + LV_PALETTE_RED, LV_PALETTE_PURPLE, LV_PALETTE_TEAL, LV_PALETTE_LAST }; lv_obj_t * color_cont = lv_obj_create(parent); @@ -1069,7 +1069,7 @@ static void color_changer_create(lv_obj_t * parent) lv_obj_align(color_cont, LV_ALIGN_BOTTOM_RIGHT, - LV_DPX(10), - LV_DPX(10)); uint32_t i; - for(i = 0; palette[i] != _LV_PALETTE_LAST; i++) { + for(i = 0; palette[i] != LV_PALETTE_LAST; i++) { lv_obj_t * c = lv_button_create(color_cont); lv_obj_set_style_bg_color(c, lv_palette_main(palette[i]), 0); lv_obj_set_style_radius(c, LV_RADIUS_CIRCLE, 0); @@ -1168,7 +1168,7 @@ static void color_event_cb(lv_event_t * e) else if(code == LV_EVENT_CLICKED) { lv_palette_t * palette_primary = lv_event_get_user_data(e); lv_palette_t palette_secondary = (*palette_primary) + 3; /*Use another palette as secondary*/ - if(palette_secondary >= _LV_PALETTE_LAST) palette_secondary = 0; + if(palette_secondary >= LV_PALETTE_LAST) palette_secondary = 0; #if LV_USE_THEME_DEFAULT lv_theme_default_init(NULL, lv_palette_main(*palette_primary), lv_palette_main(palette_secondary), LV_THEME_DEFAULT_DARK, font_normal); @@ -1367,8 +1367,8 @@ static void slider_event_cb(lv_event_t * e) } else if(code == LV_EVENT_DRAW_TASK_ADDED) { lv_draw_task_t * draw_task = lv_event_get_param(e); - if(draw_task == NULL || draw_task->type != LV_DRAW_TASK_TYPE_FILL) return; - lv_draw_rect_dsc_t * draw_rect_dsc = draw_task->draw_dsc; + if(draw_task == NULL || lv_draw_task_get_type(draw_task) != LV_DRAW_TASK_TYPE_FILL) return; + lv_draw_rect_dsc_t * draw_rect_dsc = lv_draw_task_get_draw_dsc(draw_task); if(draw_rect_dsc->base.part == LV_PART_KNOB && lv_obj_has_state(obj, LV_STATE_PRESSED)) { char buf[8]; @@ -1378,9 +1378,11 @@ static void slider_event_cb(lv_event_t * e) lv_text_get_size(&text_size, buf, font_normal, 0, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE); lv_area_t txt_area; - txt_area.x1 = draw_task->area.x1 + lv_area_get_width(&draw_task->area) / 2 - text_size.x / 2; + lv_area_t draw_task_area; + lv_draw_task_get_area(draw_task, &draw_task_area); + txt_area.x1 = draw_task_area.x1 + lv_area_get_width(&draw_task_area) / 2 - text_size.x / 2; txt_area.x2 = txt_area.x1 + text_size.x; - txt_area.y2 = draw_task->area.y1 - 10; + txt_area.y2 = draw_task_area.y1 - 10; txt_area.y1 = txt_area.y2 - text_size.y; lv_area_t bg_area; @@ -1416,10 +1418,12 @@ static void chart_event_cb(lv_event_t * e) } else if(code == LV_EVENT_DRAW_TASK_ADDED) { lv_draw_task_t * draw_task = lv_event_get_param(e); - lv_draw_dsc_base_t * base_dsc = draw_task->draw_dsc; + lv_draw_dsc_base_t * base_dsc = lv_draw_task_get_draw_dsc(draw_task); lv_draw_line_dsc_t * draw_line_dsc = lv_draw_task_get_line_dsc(draw_task); if(base_dsc->part == LV_PART_ITEMS && draw_line_dsc) { + lv_area_t obj_coords; + lv_obj_get_coords(obj, &obj_coords); const lv_chart_series_t * ser = lv_chart_get_series_next(obj, NULL); if(base_dsc->id1 == 1) ser = lv_chart_get_series_next(obj, ser); @@ -1434,12 +1438,12 @@ static void chart_event_cb(lv_event_t * e) tri_dsc.bg_grad.dir = LV_GRAD_DIR_VER; int32_t full_h = lv_obj_get_height(obj); - int32_t fract_uppter = (int32_t)(LV_MIN(draw_line_dsc->p1.y, draw_line_dsc->p2.y) - obj->coords.y1) * 255 / full_h; - int32_t fract_lower = (int32_t)(LV_MAX(draw_line_dsc->p1.y, draw_line_dsc->p2.y) - obj->coords.y1) * 255 / full_h; - tri_dsc.bg_grad.stops[0].color = ser->color; + int32_t fract_uppter = (int32_t)(LV_MIN(draw_line_dsc->p1.y, draw_line_dsc->p2.y) - obj_coords.y1) * 255 / full_h; + int32_t fract_lower = (int32_t)(LV_MAX(draw_line_dsc->p1.y, draw_line_dsc->p2.y) - obj_coords.y1) * 255 / full_h; + tri_dsc.bg_grad.stops[0].color = lv_chart_get_series_color(obj, ser); tri_dsc.bg_grad.stops[0].opa = 255 - fract_uppter; tri_dsc.bg_grad.stops[0].frac = 0; - tri_dsc.bg_grad.stops[1].color = ser->color; + tri_dsc.bg_grad.stops[1].color = lv_chart_get_series_color(obj, ser); tri_dsc.bg_grad.stops[1].opa = 255 - fract_lower; tri_dsc.bg_grad.stops[1].frac = 255; @@ -1448,10 +1452,10 @@ static void chart_event_cb(lv_event_t * e) lv_draw_rect_dsc_t rect_dsc; lv_draw_rect_dsc_init(&rect_dsc); rect_dsc.bg_grad.dir = LV_GRAD_DIR_VER; - rect_dsc.bg_grad.stops[0].color = ser->color; + rect_dsc.bg_grad.stops[0].color = lv_chart_get_series_color(obj, ser); rect_dsc.bg_grad.stops[0].frac = 0; rect_dsc.bg_grad.stops[0].opa = 255 - fract_lower; - rect_dsc.bg_grad.stops[1].color = ser->color; + rect_dsc.bg_grad.stops[1].color = lv_chart_get_series_color(obj, ser); rect_dsc.bg_grad.stops[1].frac = 255; rect_dsc.bg_grad.stops[1].opa = 0; @@ -1459,7 +1463,7 @@ static void chart_event_cb(lv_event_t * e) rect_area.x1 = (int32_t)draw_line_dsc->p1.x; rect_area.x2 = (int32_t)draw_line_dsc->p2.x; rect_area.y1 = (int32_t)LV_MAX(draw_line_dsc->p1.y, draw_line_dsc->p2.y); - rect_area.y2 = (int32_t)obj->coords.y2; + rect_area.y2 = (int32_t)obj_coords.y2; lv_draw_rect(base_dsc->layer, &rect_dsc, &rect_area); } @@ -1472,7 +1476,9 @@ static void chart_event_cb(lv_event_t * e) outline_dsc.outline_color = lv_color_white(); outline_dsc.outline_width = 2; outline_dsc.radius = LV_RADIUS_CIRCLE; - lv_draw_rect(base_dsc->layer, &outline_dsc, &draw_task->area); + lv_area_t draw_task_area; + lv_draw_task_get_area(draw_task, &draw_task_area); + lv_draw_rect(base_dsc->layer, &outline_dsc, &draw_task_area); add_value = true; } } @@ -1481,14 +1487,16 @@ static void chart_event_cb(lv_event_t * e) if(base_dsc->id1 == 1) ser = lv_chart_get_series_next(obj, ser); if(lv_chart_get_type(obj) == LV_CHART_TYPE_BAR) { - lv_draw_fill_dsc_t * fill_dsc = draw_task->draw_dsc; + lv_draw_fill_dsc_t * fill_dsc = lv_draw_task_get_draw_dsc(draw_task); lv_draw_rect_dsc_t shadow_dsc; lv_draw_rect_dsc_init(&shadow_dsc); shadow_dsc.radius = fill_dsc->radius; shadow_dsc.bg_opa = LV_OPA_TRANSP; - shadow_dsc.shadow_color = ser->color; + shadow_dsc.shadow_color = lv_chart_get_series_color(obj, ser); shadow_dsc.shadow_width = 15; - lv_draw_rect(base_dsc->layer, &shadow_dsc, &draw_task->area); + lv_area_t draw_task_area; + lv_draw_task_get_area(draw_task, &draw_task_area); + lv_draw_rect(base_dsc->layer, &shadow_dsc, &draw_task_area); add_value = true; } } @@ -1500,15 +1508,17 @@ static void chart_event_cb(lv_event_t * e) } char buf[8]; - lv_snprintf(buf, sizeof(buf), "%"LV_PRIu32, ser->y_points[base_dsc->id2]); + lv_snprintf(buf, sizeof(buf), "%"LV_PRId32, lv_chart_get_y_array(obj, (lv_chart_series_t *)ser)[base_dsc->id2]); lv_point_t text_size; lv_text_get_size(&text_size, buf, font_normal, 0, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE); lv_area_t txt_area; - txt_area.y2 = draw_task->area.y1 - LV_DPX(15); + lv_area_t draw_task_area; + lv_draw_task_get_area(draw_task, &draw_task_area); + txt_area.y2 = draw_task_area.y1 - LV_DPX(15); txt_area.y1 = txt_area.y2 - text_size.y; - txt_area.x1 = draw_task->area.x1 + (lv_area_get_width(&draw_task->area) - text_size.x) / 2; + txt_area.x1 = draw_task_area.x1 + (lv_area_get_width(&draw_task_area) - text_size.x) / 2; txt_area.x2 = txt_area.x1 + text_size.x; lv_area_t bg_area; @@ -1519,7 +1529,7 @@ static void chart_event_cb(lv_event_t * e) lv_draw_rect_dsc_t rect_dsc; lv_draw_rect_dsc_init(&rect_dsc); - rect_dsc.bg_color = ser->color; + rect_dsc.bg_color = lv_chart_get_series_color(obj, ser); rect_dsc.radius = LV_DPX(5); lv_draw_rect(base_dsc->layer, &rect_dsc, &bg_area); diff --git a/examples/event/lv_example_event_4.c b/examples/event/lv_example_event_4.c index fac535a89..1d38587d7 100644 --- a/examples/event/lv_example_event_4.c +++ b/examples/event/lv_example_event_4.c @@ -7,7 +7,7 @@ static bool size_dec = false; static void timer_cb(lv_timer_t * timer) { - lv_obj_invalidate(timer->user_data); + lv_obj_invalidate(lv_timer_get_user_data(timer)); if(size_dec) size--; else size++; @@ -19,7 +19,7 @@ static void event_cb(lv_event_t * e) { lv_obj_t * obj = lv_event_get_target(e); lv_draw_task_t * draw_task = lv_event_get_draw_task(e); - lv_draw_dsc_base_t * base_dsc = draw_task->draw_dsc; + lv_draw_dsc_base_t * base_dsc = lv_draw_task_get_draw_dsc(draw_task); if(base_dsc->part == LV_PART_MAIN) { lv_draw_rect_dsc_t draw_dsc; lv_draw_rect_dsc_init(&draw_dsc); @@ -36,7 +36,9 @@ static void event_cb(lv_event_t * e) a.y1 = 0; a.x2 = size; a.y2 = size; - lv_area_align(&obj->coords, &a, LV_ALIGN_CENTER, 0, 0); + lv_area_t obj_coords; + lv_obj_get_coords(obj, &obj_coords); + lv_area_align(&obj_coords, &a, LV_ALIGN_CENTER, 0, 0); lv_draw_rect(base_dsc->layer, &draw_dsc, &a); } diff --git a/examples/libs/tiny_ttf/lv_example_tiny_ttf_3.c b/examples/libs/tiny_ttf/lv_example_tiny_ttf_3.c index 8b237e17a..af52a09e9 100644 --- a/examples/libs/tiny_ttf/lv_example_tiny_ttf_3.c +++ b/examples/libs/tiny_ttf/lv_example_tiny_ttf_3.c @@ -44,7 +44,7 @@ void lv_example_tiny_ttf_3(void) static void font_size_observer_cb(lv_observer_t * observer, lv_subject_t * subject) { - lv_style_t * style = observer->user_data; + lv_style_t * style = lv_observer_get_user_data(observer); lv_style_value_t v; lv_style_get_prop(style, LV_STYLE_TEXT_FONT, &v); lv_font_t * font = (lv_font_t *) v.ptr; diff --git a/examples/others/snapshot/lv_example_snapshot_1.c b/examples/others/snapshot/lv_example_snapshot_1.c index a91afc7c6..f659cae4f 100644 --- a/examples/others/snapshot/lv_example_snapshot_1.c +++ b/examples/others/snapshot/lv_example_snapshot_1.c @@ -13,7 +13,7 @@ static void event_cb(lv_event_t * e) } /*Update the snapshot, we know parent of object is the container.*/ - snapshot = lv_snapshot_take(img->parent, LV_COLOR_FORMAT_ARGB8888); + snapshot = lv_snapshot_take(lv_obj_get_parent(img), LV_COLOR_FORMAT_ARGB8888); if(snapshot == NULL) return; lv_image_set_src(snapshot_obj, snapshot); diff --git a/examples/styles/lv_example_style_14.c b/examples/styles/lv_example_style_14.c index f6038bcd1..1b14c01c4 100644 --- a/examples/styles/lv_example_style_14.c +++ b/examples/styles/lv_example_style_14.c @@ -1,3 +1,4 @@ +#include "../../src/themes/lv_theme_private.h" #include "../lv_examples.h" #if LV_BUILD_EXAMPLES && LV_USE_IMAGE diff --git a/examples/widgets/bar/lv_example_bar_6.c b/examples/widgets/bar/lv_example_bar_6.c index 8d9d07809..ad2e37105 100644 --- a/examples/widgets/bar/lv_example_bar_6.c +++ b/examples/widgets/bar/lv_example_bar_6.c @@ -1,6 +1,9 @@ #include "../../lv_examples.h" #if LV_USE_BAR && LV_BUILD_EXAMPLES +#define MAX_VALUE 100 +#define MIN_VALUE 0 + static void set_value(void * bar, int32_t v) { lv_bar_set_value(bar, v, LV_ANIM_OFF); @@ -27,17 +30,18 @@ static void event_cb(lv_event_t * e) txt_area.y1 = 0; txt_area.y2 = txt_size.y - 1; - lv_bar_t * bar = (lv_bar_t *) obj; - const lv_area_t * indic_area = &bar->indic_area; + lv_area_t indic_area; + lv_obj_get_coords(obj, &indic_area); + lv_area_set_width(&indic_area, lv_area_get_width(&indic_area) * lv_bar_get_value(obj) / MAX_VALUE); /*If the indicator is long enough put the text inside on the right*/ - if(lv_area_get_width(indic_area) > txt_size.x + 20) { - lv_area_align(indic_area, &txt_area, LV_ALIGN_RIGHT_MID, -10, 0); + if(lv_area_get_width(&indic_area) > txt_size.x + 20) { + lv_area_align(&indic_area, &txt_area, LV_ALIGN_RIGHT_MID, -10, 0); label_dsc.color = lv_color_white(); } /*If the indicator is still short put the text out of it on the right*/ else { - lv_area_align(indic_area, &txt_area, LV_ALIGN_OUT_RIGHT_MID, 10, 0); + lv_area_align(&indic_area, &txt_area, LV_ALIGN_OUT_RIGHT_MID, 10, 0); label_dsc.color = lv_color_black(); } label_dsc.text = buf; @@ -52,6 +56,7 @@ static void event_cb(lv_event_t * e) void lv_example_bar_6(void) { lv_obj_t * bar = lv_bar_create(lv_screen_active()); + lv_bar_set_range(bar, MIN_VALUE, MAX_VALUE); lv_obj_set_size(bar, 200, 20); lv_obj_center(bar); lv_obj_add_event_cb(bar, event_cb, LV_EVENT_DRAW_MAIN_END, NULL); diff --git a/examples/widgets/buttonmatrix/lv_example_buttonmatrix_2.c b/examples/widgets/buttonmatrix/lv_example_buttonmatrix_2.c index f355e37d5..f3c3aacb2 100644 --- a/examples/widgets/buttonmatrix/lv_example_buttonmatrix_2.c +++ b/examples/widgets/buttonmatrix/lv_example_buttonmatrix_2.c @@ -5,7 +5,7 @@ static void event_cb(lv_event_t * e) { lv_obj_t * obj = lv_event_get_target(e); lv_draw_task_t * draw_task = lv_event_get_draw_task(e); - lv_draw_dsc_base_t * base_dsc = draw_task->draw_dsc; + lv_draw_dsc_base_t * base_dsc = lv_draw_task_get_draw_dsc(draw_task); /*When the button matrix draws the buttons...*/ if(base_dsc->part == LV_PART_ITEMS) { bool pressed = false; @@ -47,7 +47,7 @@ static void event_cb(lv_event_t * e) if(label_draw_dsc) { label_draw_dsc->opa = 0; } - if(draw_task->type == LV_DRAW_TASK_TYPE_FILL) { + if(lv_draw_task_get_type(draw_task) == LV_DRAW_TASK_TYPE_FILL) { LV_IMAGE_DECLARE(img_star); lv_image_header_t header; lv_result_t res = lv_image_decoder_get_info(&img_star, &header); @@ -58,7 +58,9 @@ static void event_cb(lv_event_t * e) a.x2 = header.w - 1; a.y1 = 0; a.y2 = header.h - 1; - lv_area_align(&draw_task->area, &a, LV_ALIGN_CENTER, 0, 0); + lv_area_t draw_task_area; + lv_draw_task_get_area(draw_task, &draw_task_area); + lv_area_align(&draw_task_area, &a, LV_ALIGN_CENTER, 0, 0); lv_draw_image_dsc_t img_draw_dsc; lv_draw_image_dsc_init(&img_draw_dsc); diff --git a/examples/widgets/canvas/lv_example_canvas_5.c b/examples/widgets/canvas/lv_example_canvas_5.c index c01585760..02fa431ac 100644 --- a/examples/widgets/canvas/lv_example_canvas_5.c +++ b/examples/widgets/canvas/lv_example_canvas_5.c @@ -1,4 +1,4 @@ -#include "../../lv_examples.h" +#include "../../lv_examples.h" #if LV_USE_CANVAS && LV_BUILD_EXAMPLES #define CANVAS_WIDTH 50 diff --git a/examples/widgets/canvas/lv_example_canvas_6.c b/examples/widgets/canvas/lv_example_canvas_6.c index e4c0dbd82..d0136f1e1 100644 --- a/examples/widgets/canvas/lv_example_canvas_6.c +++ b/examples/widgets/canvas/lv_example_canvas_6.c @@ -1,4 +1,4 @@ -#include "../../lv_examples.h" +#include "../../lv_examples.h" #if LV_USE_CANVAS && LV_BUILD_EXAMPLES #define CANVAS_WIDTH 50 diff --git a/examples/widgets/chart/lv_example_chart_1.c b/examples/widgets/chart/lv_example_chart_1.c index a0d0d1b5c..145b7aea5 100644 --- a/examples/widgets/chart/lv_example_chart_1.c +++ b/examples/widgets/chart/lv_example_chart_1.c @@ -16,6 +16,7 @@ void lv_example_chart_1(void) /*Add two data series*/ lv_chart_series_t * ser1 = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_GREEN), LV_CHART_AXIS_PRIMARY_Y); lv_chart_series_t * ser2 = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_RED), LV_CHART_AXIS_SECONDARY_Y); + int32_t * ser2_y_points = lv_chart_get_y_array(chart, ser2); uint32_t i; for(i = 0; i < 10; i++) { @@ -23,7 +24,7 @@ void lv_example_chart_1(void) lv_chart_set_next_value(chart, ser1, lv_rand(10, 50)); /*Directly set points on 'ser2'*/ - ser2->y_points[i] = lv_rand(50, 90); + ser2_y_points[i] = lv_rand(50, 90); } lv_chart_refresh(chart); /*Required after direct set*/ diff --git a/examples/widgets/chart/lv_example_chart_3.c b/examples/widgets/chart/lv_example_chart_3.c index 9dfcd9df9..dd882e07b 100644 --- a/examples/widgets/chart/lv_example_chart_3.c +++ b/examples/widgets/chart/lv_example_chart_3.c @@ -38,11 +38,13 @@ static void event_cb(lv_event_t * e) draw_rect_dsc.bg_image_src = buf; draw_rect_dsc.bg_image_recolor = lv_color_white(); + lv_area_t chart_obj_coords; + lv_obj_get_coords(chart, &chart_obj_coords); lv_area_t a; - a.x1 = chart->coords.x1 + p.x - 20; - a.x2 = chart->coords.x1 + p.x + 20; - a.y1 = chart->coords.y1 + p.y - 30; - a.y2 = chart->coords.y1 + p.y - 10; + a.x1 = chart_obj_coords.x1 + p.x - 20; + a.x2 = chart_obj_coords.x1 + p.x + 20; + a.y1 = chart_obj_coords.y1 + p.y - 30; + a.y2 = chart_obj_coords.y1 + p.y - 10; lv_layer_t * layer = lv_event_get_layer(e); lv_draw_rect(layer, &draw_rect_dsc, &a); diff --git a/examples/widgets/chart/lv_example_chart_4.c b/examples/widgets/chart/lv_example_chart_4.c index c1004f1d1..b6591b14f 100644 --- a/examples/widgets/chart/lv_example_chart_4.c +++ b/examples/widgets/chart/lv_example_chart_4.c @@ -5,7 +5,7 @@ static void draw_event_cb(lv_event_t * e) { lv_draw_task_t * draw_task = lv_event_get_draw_task(e); - lv_draw_dsc_base_t * base_dsc = draw_task->draw_dsc; + lv_draw_dsc_base_t * base_dsc = lv_draw_task_get_draw_dsc(draw_task); if(base_dsc->part != LV_PART_ITEMS) { return; diff --git a/examples/widgets/chart/lv_example_chart_5.c b/examples/widgets/chart/lv_example_chart_5.c index a652e48e6..723b3f110 100644 --- a/examples/widgets/chart/lv_example_chart_5.c +++ b/examples/widgets/chart/lv_example_chart_5.c @@ -35,14 +35,14 @@ void lv_example_chart_5(void) static void draw_event_cb(lv_event_t * e) { lv_draw_task_t * draw_task = lv_event_get_draw_task(e); - lv_draw_dsc_base_t * base_dsc = draw_task->draw_dsc; + lv_draw_dsc_base_t * base_dsc = lv_draw_task_get_draw_dsc(draw_task); - if(base_dsc->part == LV_PART_ITEMS && draw_task->type == LV_DRAW_TASK_TYPE_LINE) { + if(base_dsc->part == LV_PART_ITEMS && lv_draw_task_get_type(draw_task) == LV_DRAW_TASK_TYPE_LINE) { add_faded_area(e); } /*Hook the division lines too*/ - if(base_dsc->part == LV_PART_MAIN && draw_task->type == LV_DRAW_TASK_TYPE_LINE) { + if(base_dsc->part == LV_PART_MAIN && lv_draw_task_get_type(draw_task) == LV_DRAW_TASK_TYPE_LINE) { hook_division_lines(e); } } @@ -50,14 +50,17 @@ static void draw_event_cb(lv_event_t * e) static void add_faded_area(lv_event_t * e) { lv_obj_t * obj = lv_event_get_target(e); + lv_area_t coords; + lv_obj_get_coords(obj, &coords); lv_draw_task_t * draw_task = lv_event_get_draw_task(e); - lv_draw_dsc_base_t * base_dsc = draw_task->draw_dsc; + lv_draw_dsc_base_t * base_dsc = lv_draw_task_get_draw_dsc(draw_task); const lv_chart_series_t * ser = lv_chart_get_series_next(obj, NULL); + lv_color_t ser_color = lv_chart_get_series_color(obj, ser); /*Draw a triangle below the line witch some opacity gradient*/ - lv_draw_line_dsc_t * draw_line_dsc = draw_task->draw_dsc; + lv_draw_line_dsc_t * draw_line_dsc = lv_draw_task_get_draw_dsc(draw_task); lv_draw_triangle_dsc_t tri_dsc; lv_draw_triangle_dsc_init(&tri_dsc); @@ -70,12 +73,12 @@ static void add_faded_area(lv_event_t * e) tri_dsc.bg_grad.dir = LV_GRAD_DIR_VER; int32_t full_h = lv_obj_get_height(obj); - int32_t fract_uppter = (int32_t)(LV_MIN(draw_line_dsc->p1.y, draw_line_dsc->p2.y) - obj->coords.y1) * 255 / full_h; - int32_t fract_lower = (int32_t)(LV_MAX(draw_line_dsc->p1.y, draw_line_dsc->p2.y) - obj->coords.y1) * 255 / full_h; - tri_dsc.bg_grad.stops[0].color = ser->color; + int32_t fract_uppter = (int32_t)(LV_MIN(draw_line_dsc->p1.y, draw_line_dsc->p2.y) - coords.y1) * 255 / full_h; + int32_t fract_lower = (int32_t)(LV_MAX(draw_line_dsc->p1.y, draw_line_dsc->p2.y) - coords.y1) * 255 / full_h; + tri_dsc.bg_grad.stops[0].color = ser_color; tri_dsc.bg_grad.stops[0].opa = 255 - fract_uppter; tri_dsc.bg_grad.stops[0].frac = 0; - tri_dsc.bg_grad.stops[1].color = ser->color; + tri_dsc.bg_grad.stops[1].color = ser_color; tri_dsc.bg_grad.stops[1].opa = 255 - fract_lower; tri_dsc.bg_grad.stops[1].frac = 255; @@ -85,10 +88,10 @@ static void add_faded_area(lv_event_t * e) lv_draw_rect_dsc_t rect_dsc; lv_draw_rect_dsc_init(&rect_dsc); rect_dsc.bg_grad.dir = LV_GRAD_DIR_VER; - rect_dsc.bg_grad.stops[0].color = ser->color; + rect_dsc.bg_grad.stops[0].color = ser_color; rect_dsc.bg_grad.stops[0].frac = 0; rect_dsc.bg_grad.stops[0].opa = 255 - fract_lower; - rect_dsc.bg_grad.stops[1].color = ser->color; + rect_dsc.bg_grad.stops[1].color = ser_color; rect_dsc.bg_grad.stops[1].frac = 255; rect_dsc.bg_grad.stops[1].opa = 0; @@ -96,15 +99,15 @@ static void add_faded_area(lv_event_t * e) rect_area.x1 = (int32_t)draw_line_dsc->p1.x; rect_area.x2 = (int32_t)draw_line_dsc->p2.x - 1; rect_area.y1 = (int32_t)LV_MAX(draw_line_dsc->p1.y, draw_line_dsc->p2.y) - 1; - rect_area.y2 = (int32_t)obj->coords.y2; + rect_area.y2 = (int32_t)coords.y2; lv_draw_rect(base_dsc->layer, &rect_dsc, &rect_area); } static void hook_division_lines(lv_event_t * e) { lv_draw_task_t * draw_task = lv_event_get_draw_task(e); - lv_draw_dsc_base_t * base_dsc = draw_task->draw_dsc; - lv_draw_line_dsc_t * line_dsc = draw_task->draw_dsc; + lv_draw_dsc_base_t * base_dsc = lv_draw_task_get_draw_dsc(draw_task); + lv_draw_line_dsc_t * line_dsc = lv_draw_task_get_draw_dsc(draw_task); /*Vertical line*/ if(line_dsc->p1.x == line_dsc->p2.x) { diff --git a/examples/widgets/chart/lv_example_chart_7.c b/examples/widgets/chart/lv_example_chart_7.c index 2da8ac7c3..da5a3dad1 100644 --- a/examples/widgets/chart/lv_example_chart_7.c +++ b/examples/widgets/chart/lv_example_chart_7.c @@ -4,11 +4,11 @@ static void draw_event_cb(lv_event_t * e) { lv_draw_task_t * draw_task = lv_event_get_draw_task(e); - lv_draw_dsc_base_t * base_dsc = draw_task->draw_dsc; + lv_draw_dsc_base_t * base_dsc = lv_draw_task_get_draw_dsc(draw_task); if(base_dsc->part == LV_PART_INDICATOR) { lv_obj_t * obj = lv_event_get_target(e); lv_chart_series_t * ser = lv_chart_get_series_next(obj, NULL); - lv_draw_rect_dsc_t * rect_draw_dsc = draw_task->draw_dsc; + lv_draw_rect_dsc_t * rect_draw_dsc = lv_draw_task_get_draw_dsc(draw_task); uint32_t cnt = lv_chart_get_point_count(obj); /*Make older value more transparent*/ @@ -31,8 +31,7 @@ static void draw_event_cb(lv_event_t * e) static void add_data(lv_timer_t * timer) { - LV_UNUSED(timer); - lv_obj_t * chart = timer->user_data; + lv_obj_t * chart = lv_timer_get_user_data(timer); lv_chart_set_next_value2(chart, lv_chart_get_series_next(chart, NULL), lv_rand(0, 200), lv_rand(0, 1000)); } diff --git a/examples/widgets/chart/lv_example_chart_8.c b/examples/widgets/chart/lv_example_chart_8.c index 9ae1745c5..21da47697 100644 --- a/examples/widgets/chart/lv_example_chart_8.c +++ b/examples/widgets/chart/lv_example_chart_8.c @@ -3,7 +3,7 @@ static void add_data(lv_timer_t * t) { - lv_obj_t * chart = t->user_data; + lv_obj_t * chart = lv_timer_get_user_data(t); lv_chart_series_t * ser = lv_chart_get_series_next(chart, NULL); lv_chart_set_next_value(chart, ser, lv_rand(10, 90)); diff --git a/examples/widgets/menu/lv_example_menu_5.c b/examples/widgets/menu/lv_example_menu_5.c index 86ffc9b99..781e630e5 100644 --- a/examples/widgets/menu/lv_example_menu_5.c +++ b/examples/widgets/menu/lv_example_menu_5.c @@ -1,11 +1,10 @@ #include "../../lv_examples.h" #if LV_USE_MENU && LV_USE_MSGBOX && LV_BUILD_EXAMPLES -enum { +typedef enum { LV_MENU_ITEM_BUILDER_VARIANT_1, LV_MENU_ITEM_BUILDER_VARIANT_2 -}; -typedef uint8_t lv_menu_builder_variant_t; +} lv_menu_builder_variant_t; static void back_event_handler(lv_event_t * e); static void switch_handler(lv_event_t * e); diff --git a/examples/widgets/slider/lv_example_slider_3.c b/examples/widgets/slider/lv_example_slider_3.c index fcfd65c2d..9a190c555 100644 --- a/examples/widgets/slider/lv_example_slider_3.c +++ b/examples/widgets/slider/lv_example_slider_3.c @@ -1,6 +1,9 @@ #include "../../lv_examples.h" #if LV_USE_SLIDER && LV_BUILD_EXAMPLES +#define MAX_VALUE 100 +#define MIN_VALUE 0 + static void slider_event_cb(lv_event_t * e); /** @@ -15,6 +18,7 @@ void lv_example_slider_3(void) lv_obj_center(slider); lv_slider_set_mode(slider, LV_SLIDER_MODE_RANGE); + lv_slider_set_range(slider, MIN_VALUE, MAX_VALUE); lv_slider_set_value(slider, 70, LV_ANIM_OFF); lv_slider_set_left_value(slider, 20, LV_ANIM_OFF); @@ -34,8 +38,11 @@ static void slider_event_cb(lv_event_t * e) else if(code == LV_EVENT_DRAW_MAIN_END) { if(!lv_obj_has_state(obj, LV_STATE_PRESSED)) return; - lv_slider_t * slider = (lv_slider_t *) obj; - const lv_area_t * indic_area = &slider->bar.indic_area; + lv_area_t slider_area; + lv_obj_get_coords(obj, &slider_area); + lv_area_t indic_area = slider_area; + lv_area_set_width(&indic_area, lv_area_get_width(&slider_area) * lv_slider_get_value(obj) / MAX_VALUE); + indic_area.x1 += lv_area_get_width(&slider_area) * lv_slider_get_left_value(obj) / MAX_VALUE; char buf[16]; lv_snprintf(buf, sizeof(buf), "%d - %d", (int)lv_slider_get_left_value(obj), (int)lv_slider_get_value(obj)); @@ -47,7 +54,7 @@ static void slider_event_cb(lv_event_t * e) label_area.y1 = 0; label_area.y2 = label_size.y - 1; - lv_area_align(indic_area, &label_area, LV_ALIGN_OUT_TOP_MID, 0, -10); + lv_area_align(&indic_area, &label_area, LV_ALIGN_OUT_TOP_MID, 0, -10); lv_draw_label_dsc_t label_draw_dsc; lv_draw_label_dsc_init(&label_draw_dsc); diff --git a/examples/widgets/span/lv_example_span_1.c b/examples/widgets/span/lv_example_span_1.c index 884fed6ce..f74e0a3f8 100644 --- a/examples/widgets/span/lv_example_span_1.c +++ b/examples/widgets/span/lv_example_span_1.c @@ -25,32 +25,32 @@ void lv_example_span_1(void) lv_span_t * span = lv_spangroup_new_span(spans); lv_span_set_text(span, "China is a beautiful country."); - lv_style_set_text_color(&span->style, lv_palette_main(LV_PALETTE_RED)); - lv_style_set_text_decor(&span->style, LV_TEXT_DECOR_UNDERLINE); - lv_style_set_text_opa(&span->style, LV_OPA_50); + lv_style_set_text_color(lv_span_get_style(span), lv_palette_main(LV_PALETTE_RED)); + lv_style_set_text_decor(lv_span_get_style(span), LV_TEXT_DECOR_UNDERLINE); + lv_style_set_text_opa(lv_span_get_style(span), LV_OPA_50); span = lv_spangroup_new_span(spans); lv_span_set_text_static(span, "good good study, day day up."); #if LV_FONT_MONTSERRAT_24 - lv_style_set_text_font(&span->style, &lv_font_montserrat_24); + lv_style_set_text_font(lv_span_get_style(span), &lv_font_montserrat_24); #endif - lv_style_set_text_color(&span->style, lv_palette_main(LV_PALETTE_GREEN)); + lv_style_set_text_color(lv_span_get_style(span), lv_palette_main(LV_PALETTE_GREEN)); span = lv_spangroup_new_span(spans); lv_span_set_text_static(span, "LVGL is an open-source graphics library."); - lv_style_set_text_color(&span->style, lv_palette_main(LV_PALETTE_BLUE)); + lv_style_set_text_color(lv_span_get_style(span), lv_palette_main(LV_PALETTE_BLUE)); span = lv_spangroup_new_span(spans); lv_span_set_text_static(span, "the boy no name."); - lv_style_set_text_color(&span->style, lv_palette_main(LV_PALETTE_GREEN)); + lv_style_set_text_color(lv_span_get_style(span), lv_palette_main(LV_PALETTE_GREEN)); #if LV_FONT_MONTSERRAT_20 - lv_style_set_text_font(&span->style, &lv_font_montserrat_20); + lv_style_set_text_font(lv_span_get_style(span), &lv_font_montserrat_20); #endif - lv_style_set_text_decor(&span->style, LV_TEXT_DECOR_UNDERLINE); + lv_style_set_text_decor(lv_span_get_style(span), LV_TEXT_DECOR_UNDERLINE); span = lv_spangroup_new_span(spans); lv_span_set_text(span, "I have a dream that hope to come true."); - lv_style_set_text_decor(&span->style, LV_TEXT_DECOR_STRIKETHROUGH); + lv_style_set_text_decor(lv_span_get_style(span), LV_TEXT_DECOR_STRIKETHROUGH); lv_spangroup_refr_mode(spans); } diff --git a/examples/widgets/table/lv_example_table_1.c b/examples/widgets/table/lv_example_table_1.c index e9d663a5f..9dcd3dfa5 100644 --- a/examples/widgets/table/lv_example_table_1.c +++ b/examples/widgets/table/lv_example_table_1.c @@ -4,7 +4,7 @@ static void draw_event_cb(lv_event_t * e) { lv_draw_task_t * draw_task = lv_event_get_draw_task(e); - lv_draw_dsc_base_t * base_dsc = draw_task->draw_dsc; + lv_draw_dsc_base_t * base_dsc = lv_draw_task_get_draw_dsc(draw_task); /*If the cells are drawn...*/ if(base_dsc->part == LV_PART_ITEMS) { uint32_t row = base_dsc->id1; diff --git a/examples/widgets/table/lv_example_table_2.c b/examples/widgets/table/lv_example_table_2.c index 972d4dac8..d0d5ae192 100644 --- a/examples/widgets/table/lv_example_table_2.c +++ b/examples/widgets/table/lv_example_table_2.c @@ -8,9 +8,9 @@ static void draw_event_cb(lv_event_t * e) lv_obj_t * obj = lv_event_get_target(e); lv_draw_task_t * draw_task = lv_event_get_draw_task(e); - lv_draw_dsc_base_t * base_dsc = draw_task->draw_dsc; + lv_draw_dsc_base_t * base_dsc = lv_draw_task_get_draw_dsc(draw_task); /*If the cells are drawn...*/ - if(base_dsc->part == LV_PART_ITEMS && draw_task->type == LV_DRAW_TASK_TYPE_FILL) { + if(base_dsc->part == LV_PART_ITEMS && lv_draw_task_get_type(draw_task) == LV_DRAW_TASK_TYPE_FILL) { /*Draw the background*/ bool chk = lv_table_has_cell_ctrl(obj, base_dsc->id1, 0, LV_TABLE_CELL_CTRL_CUSTOM_1); lv_draw_rect_dsc_t rect_dsc; @@ -23,7 +23,9 @@ static void draw_event_cb(lv_event_t * e) sw_area.x2 = 40; sw_area.y1 = 0; sw_area.y2 = 24; - lv_area_align(&draw_task->area, &sw_area, LV_ALIGN_RIGHT_MID, -15, 0); + lv_area_t draw_task_area; + lv_draw_task_get_area(draw_task, &draw_task_area); + lv_area_align(&draw_task_area, &sw_area, LV_ALIGN_RIGHT_MID, -15, 0); lv_draw_rect(base_dsc->layer, &rect_dsc, &sw_area); /*Draw the knob*/ diff --git a/lvgl.h b/lvgl.h index 26f499b88..23107385f 100644 --- a/lvgl.h +++ b/lvgl.h @@ -110,6 +110,7 @@ extern "C" { #include "src/draw/lv_draw.h" #include "src/draw/lv_draw_buf.h" #include "src/draw/lv_draw_vector.h" +#include "src/draw/sw/lv_draw_sw.h" #include "src/themes/lv_theme.h" @@ -118,7 +119,6 @@ extern "C" { #include "src/lv_api_map_v8.h" #include "src/lv_api_map_v9_0.h" -#include "src/core/lv_global.h" /********************* * DEFINES *********************/ diff --git a/scripts/lv_conf_internal_gen.py b/scripts/lv_conf_internal_gen.py index 9c47a58d1..105f63ca8 100755 --- a/scripts/lv_conf_internal_gen.py +++ b/scripts/lv_conf_internal_gen.py @@ -89,7 +89,7 @@ fout.write( #endif #ifdef CONFIG_LV_COLOR_DEPTH - #define _LV_KCONFIG_PRESENT + #define LV_KCONFIG_PRESENT #endif /*---------------------------------- @@ -131,7 +131,7 @@ for line in fin.read().splitlines(): fout.write( f'{indent}#ifndef {name}\n' - f'{indent} #ifdef _LV_KCONFIG_PRESENT\n' + f'{indent} #ifdef LV_KCONFIG_PRESENT\n' f'{indent} #ifdef CONFIG_{name.upper()}\n' f'{indent} #define {name} CONFIG_{name.upper()}\n' f'{indent} #else\n' @@ -175,7 +175,7 @@ LV_EXPORT_CONST_INT(LV_DRAW_BUF_STRIDE_ALIGN); LV_EXPORT_CONST_INT(LV_DRAW_BUF_ALIGN); #endif -#undef _LV_KCONFIG_PRESENT +#undef LV_KCONFIG_PRESENT /*Set some defines if a dependency is disabled*/ #if LV_USE_LOG == 0 diff --git a/scripts/style_api_gen.py b/scripts/style_api_gen.py index ad665f209..784763218 100755 --- a/scripts/style_api_gen.py +++ b/scripts/style_api_gen.py @@ -492,7 +492,7 @@ def obj_style_get(p): if 'filtered' in p and p['filtered']: print("static inline " + p['var_type'] + " lv_obj_get_style_" + p['name'].lower() +"_filtered(const lv_obj_t * obj, lv_part_t part)") print("{") - print(" lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_" + p['name'] + "));") + print(" lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_" + p['name'] + "));") print(" return " + cast + "v." + p['style_type'] + ";") print("}") print("") @@ -518,15 +518,12 @@ def style_set_c(p): print(" };") print(" lv_style_set_prop(style, LV_STYLE_" + p['name'] +", v);") print("}") - print("") - print("const lv_style_prop_t _lv_style_const_prop_id_" + p['name'] + " = LV_STYLE_" + p['name'] + ";") def style_set_h(p): if 'section' in p: return print("void lv_style_set_" + p['name'].lower() +"(lv_style_t * style, "+ p['var_type'] +" value);") - print("LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_" + p['name'] + ";") def local_style_set_c(p): @@ -555,7 +552,7 @@ def style_const_set(p): print("") print("#define LV_STYLE_CONST_" + p['name'] + "(val) \\") print(" { \\") - print(" .prop_ptr = &_lv_style_const_prop_id_" + p['name'] + ", .value = { ." + p['style_type'] +" = " + cast + "val } \\") + print(" .prop = LV_STYLE_" + p['name'] + ", .value = { ." + p['style_type'] +" = " + cast + "val } \\") print(" }") @@ -643,6 +640,7 @@ extern "C" { print("#include \"../misc/lv_area.h\"") print("#include \"../misc/lv_style.h\"") print("#include \"../core/lv_obj_style.h\"") +print("#include \"../misc/lv_types.h\"") print() guard = "" diff --git a/src/core/lv_global.h b/src/core/lv_global.h index b720e70d9..424e19129 100644 --- a/src/core/lv_global.h +++ b/src/core/lv_global.h @@ -32,7 +32,7 @@ extern "C" { #include "../stdlib/builtin/lv_tlsf.h" #if LV_USE_FONT_COMPRESSED -#include "../font/lv_font_fmt_txt.h" +#include "../font/lv_font_fmt_txt_private.h" #endif #include "../tick/lv_tick.h" @@ -40,6 +40,17 @@ extern "C" { #include "../misc/lv_types.h" +#include "../misc/lv_timer_private.h" +#include "../misc/lv_anim_private.h" +#include "../tick/lv_tick_private.h" +#include "../draw/lv_draw_buf_private.h" +#include "../draw/lv_draw_private.h" +#include "../draw/sw/lv_draw_sw_private.h" +#include "../draw/sw/lv_draw_sw_mask_private.h" +#include "../stdlib/builtin/lv_tlsf_private.h" +#include "../others/sysmon/lv_sysmon_private.h" +#include "../layouts/lv_layout_private.h" + /********************* * DEFINES *********************/ @@ -54,18 +65,18 @@ struct _snippet_stack; #endif #if LV_USE_FREETYPE -struct _lv_freetype_context_t; +struct lv_freetype_context_t; #endif #if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN -struct _lv_profiler_builtin_ctx_t; +struct lv_profiler_builtin_ctx_t; #endif #if LV_USE_NUTTX -struct _lv_nuttx_ctx_t; +struct lv_nuttx_ctx_t; #endif -typedef struct _lv_global_t { +typedef struct lv_global_t { bool inited; bool deinit_in_progress; /**< Can be used e.g. in the LV_EVENT_DELETE to deinit the drivers too */ @@ -115,7 +126,7 @@ typedef struct _lv_global_t { lv_draw_sw_shadow_cache_t sw_shadow_cache; #endif #if LV_DRAW_SW_COMPLEX - _lv_draw_sw_mask_radius_circle_dsc_arr_t sw_circle_cache; + lv_draw_sw_mask_radius_circle_dsc_arr_t sw_circle_cache; #endif #if LV_USE_LOG @@ -171,7 +182,7 @@ typedef struct _lv_global_t { #endif #if LV_USE_FREETYPE - struct _lv_freetype_context_t * ft_context; + struct lv_freetype_context_t * ft_context; #endif #if LV_USE_FONT_COMPRESSED @@ -183,7 +194,7 @@ typedef struct _lv_global_t { #endif #if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN - struct _lv_profiler_builtin_ctx_t * profiler_context; + struct lv_profiler_builtin_ctx_t * profiler_context; #endif #if LV_USE_FILE_EXPLORER != 0 @@ -204,7 +215,7 @@ typedef struct _lv_global_t { #endif #if LV_USE_NUTTX - struct _lv_nuttx_ctx_t * nuttx_ctx; + struct lv_nuttx_ctx_t * nuttx_ctx; #endif #if LV_USE_OS != LV_OS_NONE diff --git a/src/core/lv_group.c b/src/core/lv_group.c index b2c8209da..15ab1ce9b 100644 --- a/src/core/lv_group.c +++ b/src/core/lv_group.c @@ -6,8 +6,8 @@ /********************* * INCLUDES *********************/ -#include "lv_group.h" -#include "../core/lv_obj.h" +#include "lv_group_private.h" +#include "../core/lv_obj_private.h" #include "../core/lv_global.h" #include "../indev/lv_indev.h" #include "../misc/lv_types.h" @@ -42,22 +42,22 @@ static lv_indev_t * get_indev(const lv_group_t * g); * GLOBAL FUNCTIONS **********************/ -void _lv_group_init(void) +void lv_group_init(void) { - _lv_ll_init(group_ll_p, sizeof(lv_group_t)); + lv_ll_init(group_ll_p, sizeof(lv_group_t)); } -void _lv_group_deinit(void) +void lv_group_deinit(void) { - _lv_ll_clear(group_ll_p); + lv_ll_clear(group_ll_p); } lv_group_t * lv_group_create(void) { - lv_group_t * group = _lv_ll_ins_head(group_ll_p); + lv_group_t * group = lv_ll_ins_head(group_ll_p); LV_ASSERT_MALLOC(group); if(group == NULL) return NULL; - _lv_ll_init(&group->obj_ll, sizeof(lv_obj_t *)); + lv_ll_init(&group->obj_ll, sizeof(lv_obj_t *)); group->obj_focus = NULL; group->frozen = 0; @@ -82,7 +82,7 @@ void lv_group_delete(lv_group_t * group) /*Remove the objects from the group*/ lv_obj_t ** obj; - _LV_LL_READ(&group->obj_ll, obj) { + LV_LL_READ(&group->obj_ll, obj) { if((*obj)->spec_attr)(*obj)->spec_attr->group_p = NULL; } @@ -98,8 +98,8 @@ void lv_group_delete(lv_group_t * group) /*If the group is the default group, set the default group as NULL*/ if(group == lv_group_get_default()) lv_group_set_default(NULL); - _lv_ll_clear(&(group->obj_ll)); - _lv_ll_remove(group_ll_p, group); + lv_ll_clear(&(group->obj_ll)); + lv_ll_remove(group_ll_p, group); lv_free(group); } @@ -125,14 +125,14 @@ void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj) if(obj->spec_attr == NULL) lv_obj_allocate_spec_attr(obj); obj->spec_attr->group_p = group; - lv_obj_t ** next = _lv_ll_ins_tail(&group->obj_ll); + lv_obj_t ** next = lv_ll_ins_tail(&group->obj_ll); LV_ASSERT_MALLOC(next); if(next == NULL) return; *next = obj; /*If the head and the tail is equal then there is only one object in the linked list. *In this case automatically activate it*/ - if(_lv_ll_get_head(&group->obj_ll) == next) { + if(lv_ll_get_head(&group->obj_ll) == next) { lv_group_refocus(group); } @@ -148,7 +148,7 @@ void lv_group_swap_obj(lv_obj_t * obj1, lv_obj_t * obj2) /*Do not add the object twice*/ lv_obj_t ** obj_i; - _LV_LL_READ(&g1->obj_ll, obj_i) { + LV_LL_READ(&g1->obj_ll, obj_i) { if((*obj_i) == obj1)(*obj_i) = obj2; else if((*obj_i) == obj2)(*obj_i) = obj1; } @@ -171,7 +171,7 @@ void lv_group_remove_obj(lv_obj_t * obj) if(g->frozen) g->frozen = 0; /*If this is the only object in the group then focus to nothing.*/ - if(_lv_ll_get_head(&g->obj_ll) == g->obj_focus && _lv_ll_get_tail(&g->obj_ll) == g->obj_focus) { + if(lv_ll_get_head(&g->obj_ll) == g->obj_focus && lv_ll_get_tail(&g->obj_ll) == g->obj_focus) { lv_obj_send_event(*g->obj_focus, LV_EVENT_DEFOCUSED, get_indev(g)); } /*If there more objects in the group then focus to the next/prev object*/ @@ -189,9 +189,9 @@ void lv_group_remove_obj(lv_obj_t * obj) /*Search the object and remove it from its group*/ lv_obj_t ** i; - _LV_LL_READ(&g->obj_ll, i) { + LV_LL_READ(&g->obj_ll, i) { if(*i == obj) { - _lv_ll_remove(&g->obj_ll, i); + lv_ll_remove(&g->obj_ll, i); lv_free(i); if(obj->spec_attr) obj->spec_attr->group_p = NULL; break; @@ -213,11 +213,11 @@ void lv_group_remove_all_objs(lv_group_t * group) /*Remove the objects from the group*/ lv_obj_t ** obj; - _LV_LL_READ(&group->obj_ll, obj) { + LV_LL_READ(&group->obj_ll, obj) { if((*obj)->spec_attr)(*obj)->spec_attr->group_p = NULL; } - _lv_ll_clear(&(group->obj_ll)); + lv_ll_clear(&(group->obj_ll)); } void lv_group_focus_obj(lv_obj_t * obj) @@ -232,7 +232,7 @@ void lv_group_focus_obj(lv_obj_t * obj) lv_group_set_editing(g, false); lv_obj_t ** i; - _LV_LL_READ(&g->obj_ll, i) { + LV_LL_READ(&g->obj_ll, i) { if(*i == obj) { if(g->obj_focus != NULL && obj != *g->obj_focus) { /*Do not defocus if the same object needs to be focused again*/ lv_result_t res = lv_obj_send_event(*g->obj_focus, LV_EVENT_DEFOCUSED, get_indev(g)); @@ -257,7 +257,7 @@ void lv_group_focus_next(lv_group_t * group) { LV_ASSERT_NULL(group); - bool focus_changed = focus_next_core(group, _lv_ll_get_head, _lv_ll_get_next); + bool focus_changed = focus_next_core(group, lv_ll_get_head, lv_ll_get_next); if(group->edge_cb) { if(!focus_changed) group->edge_cb(group, true); @@ -268,7 +268,7 @@ void lv_group_focus_prev(lv_group_t * group) { LV_ASSERT_NULL(group); - bool focus_changed = focus_next_core(group, _lv_ll_get_tail, _lv_ll_get_prev); + bool focus_changed = focus_next_core(group, lv_ll_get_tail, lv_ll_get_prev); if(group->edge_cb) { if(!focus_changed) group->edge_cb(group, false); @@ -374,12 +374,12 @@ bool lv_group_get_wrap(lv_group_t * group) uint32_t lv_group_get_obj_count(lv_group_t * group) { LV_ASSERT_NULL(group); - return _lv_ll_get_len(&group->obj_ll); + return lv_ll_get_len(&group->obj_ll); } uint32_t lv_group_get_count(void) { - return _lv_ll_get_len(group_ll_p); + return lv_ll_get_len(group_ll_p); } lv_group_t * lv_group_by_index(uint32_t index) @@ -387,7 +387,7 @@ lv_group_t * lv_group_by_index(uint32_t index) uint32_t len = 0; void * node; - for(node = _lv_ll_get_tail(group_ll_p); node != NULL; node = _lv_ll_get_prev(group_ll_p, node)) { + for(node = lv_ll_get_tail(group_ll_p); node != NULL; node = lv_ll_get_prev(group_ll_p, node)) { if(len == index) { return (lv_group_t *) node; } diff --git a/src/core/lv_group.h b/src/core/lv_group.h index feab5acb2..2163c995c 100644 --- a/src/core/lv_group.h +++ b/src/core/lv_group.h @@ -22,7 +22,7 @@ extern "C" { * DEFINES *********************/ /*Predefined keys to control the focused object via lv_group_send(group, c)*/ -enum _lv_key_t { +typedef enum { LV_KEY_UP = 17, /*0x11*/ LV_KEY_DOWN = 18, /*0x12*/ LV_KEY_RIGHT = 19, /*0x13*/ @@ -35,7 +35,7 @@ enum _lv_key_t { LV_KEY_PREV = 11, /*0x0B, '*/ LV_KEY_HOME = 2, /*0x02, STX*/ LV_KEY_END = 3, /*0x03, ETX*/ -}; +} lv_key_t; /********************** * TYPEDEFS @@ -44,29 +44,6 @@ enum _lv_key_t { typedef void (*lv_group_focus_cb_t)(lv_group_t *); typedef void (*lv_group_edge_cb_t)(lv_group_t *, bool); -/** - * Groups can be used to logically hold objects so that they can be individually focused. - * They are NOT for laying out objects on a screen (try layouts for that). - */ -struct _lv_group_t { - lv_ll_t obj_ll; /**< Linked list to store the objects in the group*/ - lv_obj_t ** obj_focus; /**< The object in focus*/ - - lv_group_focus_cb_t focus_cb; /**< A function to call when a new object is focused (optional)*/ - lv_group_edge_cb_t edge_cb; /**< A function to call when an edge is reached, no more focus - targets are available in this direction (to allow edge feedback - like a sound or a scroll bounce) */ - - void * user_data; - - uint8_t frozen : 1; /**< 1: can't focus to new object*/ - uint8_t editing : 1; /**< 1: Edit mode, 0: Navigate mode*/ - uint8_t refocus_policy : 1; /**< 1: Focus prev if focused on deletion. 0: Focus next if focused on - deletion.*/ - uint8_t wrap : 1; /**< 1: Focus next/prev can wrap at end of list. 0: Focus next/prev stops at end - of list.*/ -}; - typedef enum { LV_GROUP_REFOCUS_POLICY_NEXT = 0, LV_GROUP_REFOCUS_POLICY_PREV = 1 @@ -76,18 +53,6 @@ typedef enum { * GLOBAL PROTOTYPES **********************/ -/** - * Init the group module - * @remarks Internal function, do not call directly. - */ -void _lv_group_init(void); - -/** - * Deinit the group module - * @remarks Internal function, do not call directly. - */ -void _lv_group_deinit(void); - /** * Create a new object group * @return pointer to the new object group diff --git a/src/core/lv_group_private.h b/src/core/lv_group_private.h new file mode 100644 index 000000000..33b7640c7 --- /dev/null +++ b/src/core/lv_group_private.h @@ -0,0 +1,75 @@ +/** + * @file lv_group_private.h + * + */ + +#ifndef LV_GROUP_PRIVATE_H +#define LV_GROUP_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_group.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Groups can be used to logically hold objects so that they can be individually focused. + * They are NOT for laying out objects on a screen (try layouts for that). + */ +struct lv_group_t { + lv_ll_t obj_ll; /**< Linked list to store the objects in the group*/ + lv_obj_t ** obj_focus; /**< The object in focus*/ + + lv_group_focus_cb_t focus_cb; /**< A function to call when a new object is focused (optional)*/ + lv_group_edge_cb_t edge_cb; /**< A function to call when an edge is reached, no more focus + targets are available in this direction (to allow edge feedback + like a sound or a scroll bounce) */ + + void * user_data; + + uint8_t frozen : 1; /**< 1: can't focus to new object*/ + uint8_t editing : 1; /**< 1: Edit mode, 0: Navigate mode*/ + uint8_t refocus_policy : 1; /**< 1: Focus prev if focused on deletion. 0: Focus next if focused on + deletion.*/ + uint8_t wrap : 1; /**< 1: Focus next/prev can wrap at end of list. 0: Focus next/prev stops at end + of list.*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Init the group module + * @remarks Internal function, do not call directly. + */ +void lv_group_init(void); + +/** + * Deinit the group module + * @remarks Internal function, do not call directly. + */ +void lv_group_deinit(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GROUP_PRIVATE_H*/ diff --git a/src/core/lv_obj.c b/src/core/lv_obj.c index bcc152523..ff4e087d1 100644 --- a/src/core/lv_obj.c +++ b/src/core/lv_obj.c @@ -6,7 +6,12 @@ /********************* * INCLUDES *********************/ -#include "lv_obj.h" +#include "../misc/lv_event_private.h" +#include "../misc/lv_area_private.h" +#include "lv_obj_style_private.h" +#include "lv_obj_event_private.h" +#include "lv_obj_class_private.h" +#include "lv_obj_private.h" #include "../indev/lv_indev.h" #include "../indev/lv_indev_private.h" #include "lv_refr.h" @@ -20,6 +25,7 @@ #include "../misc/lv_types.h" #include "../tick/lv_tick.h" #include "../stdlib/lv_string.h" +#include "lv_obj_draw_private.h" /********************* * DEFINES @@ -140,7 +146,7 @@ static const lv_property_ops_t properties[] = { }, { .id = LV_PROPERTY_OBJ_EXT_DRAW_SIZE, - .getter = _lv_obj_get_ext_draw_size, + .getter = lv_obj_get_ext_draw_size, }, { .id = LV_PROPERTY_OBJ_EVENT_COUNT, @@ -372,7 +378,7 @@ void lv_obj_allocate_spec_attr(lv_obj_t * obj) LV_ASSERT_OBJ(obj, MY_CLASS); if(obj->spec_attr == NULL) { - obj->spec_attr = lv_malloc_zeroed(sizeof(_lv_obj_spec_attr_t)); + obj->spec_attr = lv_malloc_zeroed(sizeof(lv_obj_spec_attr_t)); LV_ASSERT_MALLOC(obj->spec_attr); if(obj->spec_attr == NULL) return; @@ -456,6 +462,16 @@ lv_obj_t * lv_obj_get_child_by_id(const lv_obj_t * obj, void * id) } #endif +void lv_obj_set_user_data(lv_obj_t * obj, void * user_data) +{ + obj->user_data = user_data; +} + +void * lv_obj_get_user_data(lv_obj_t * obj) +{ + return obj->user_data; +} + /********************** * STATIC FUNCTIONS **********************/ @@ -499,7 +515,7 @@ static void lv_obj_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) { LV_UNUSED(class_p); - _lv_event_mark_deleted(obj); + lv_event_mark_deleted(obj); /*Remove all style*/ lv_obj_enable_style_refresh(false); /*No need to refresh the style because the object will be deleted*/ @@ -550,7 +566,7 @@ static void lv_obj_draw(lv_event_t * e) lv_area_copy(&coords, &obj->coords); lv_area_increase(&coords, w, h); - if(_lv_area_is_in(info->area, &coords, r) == false) { + if(lv_area_is_in(info->area, &coords, r) == false) { info->res = LV_COVER_RES_NOT_COVER; return; } @@ -881,9 +897,9 @@ static void update_obj_state(lv_obj_t * obj, lv_state_t new_state) lv_state_t prev_state = obj->state; - _lv_style_state_cmp_t cmp_res = _lv_obj_style_state_compare(obj, prev_state, new_state); + lv_style_state_cmp_t cmp_res = lv_obj_style_state_compare(obj, prev_state, new_state); /*If there is no difference in styles there is nothing else to do*/ - if(cmp_res == _LV_STYLE_STATE_CMP_SAME) { + if(cmp_res == LV_STYLE_STATE_CMP_SAME) { obj->state = new_state; return; } @@ -892,12 +908,12 @@ static void update_obj_state(lv_obj_t * obj, lv_state_t new_state) lv_obj_invalidate(obj); obj->state = new_state; - _lv_obj_update_layer_type(obj); - _lv_obj_style_transition_dsc_t * ts = lv_malloc_zeroed(sizeof(_lv_obj_style_transition_dsc_t) * STYLE_TRANSITION_MAX); + lv_obj_update_layer_type(obj); + lv_obj_style_transition_dsc_t * ts = lv_malloc_zeroed(sizeof(lv_obj_style_transition_dsc_t) * STYLE_TRANSITION_MAX); uint32_t tsi = 0; uint32_t i; for(i = 0; i < obj->style_cnt && tsi < STYLE_TRANSITION_MAX; i++) { - _lv_obj_style_t * obj_style = &obj->styles[i]; + lv_obj_style_t * obj_style = &obj->styles[i]; lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); if(state_act & (~new_state)) continue; /*Skip unrelated styles*/ @@ -933,19 +949,19 @@ static void update_obj_state(lv_obj_t * obj, lv_state_t new_state) for(i = 0; i < tsi; i++) { lv_part_t part_act = lv_obj_style_get_selector_part(ts[i].selector); - _lv_obj_style_create_transition(obj, part_act, prev_state, new_state, &ts[i]); + lv_obj_style_create_transition(obj, part_act, prev_state, new_state, &ts[i]); } lv_free(ts); - if(cmp_res == _LV_STYLE_STATE_CMP_DIFF_REDRAW) { + if(cmp_res == LV_STYLE_STATE_CMP_DIFF_REDRAW) { /*Invalidation is not enough, e.g. layer type needs to be updated too*/ lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); } - else if(cmp_res == _LV_STYLE_STATE_CMP_DIFF_LAYOUT) { + else if(cmp_res == LV_STYLE_STATE_CMP_DIFF_LAYOUT) { lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); } - else if(cmp_res == _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD) { + else if(cmp_res == LV_STYLE_STATE_CMP_DIFF_DRAW_PAD) { lv_obj_invalidate(obj); lv_obj_refresh_ext_draw_size(obj); } diff --git a/src/core/lv_obj.h b/src/core/lv_obj.h index b7a2e234d..9d9eac9a0 100644 --- a/src/core/lv_obj.h +++ b/src/core/lv_obj.h @@ -43,7 +43,7 @@ extern "C" { * Possible states of a widget. * OR-ed values are possible */ -enum _lv_state_t { +enum { LV_STATE_DEFAULT = 0x0000, LV_STATE_CHECKED = 0x0001, LV_STATE_FOCUSED = 0x0002, @@ -68,7 +68,7 @@ enum _lv_state_t { * Not all parts are used by every widget */ -enum _lv_part_t { +enum { LV_PART_MAIN = 0x000000, /**< A background like rectangle*/ LV_PART_SCROLLBAR = 0x010000, /**< The scrollbar(s)*/ LV_PART_INDICATOR = 0x020000, /**< Indicator, e.g. for slider, bar, switch, or the tick box of the checkbox*/ @@ -125,7 +125,7 @@ typedef enum { LV_OBJ_FLAG_USER_2 = (1L << 28), /**< Custom flag, free to use by user*/ LV_OBJ_FLAG_USER_3 = (1L << 29), /**< Custom flag, free to use by user*/ LV_OBJ_FLAG_USER_4 = (1L << 30), /**< Custom flag, free to use by user*/ -} _lv_obj_flag_t; +} lv_obj_flag_t; #if LV_USE_OBJ_PROPERTY enum { @@ -217,54 +217,6 @@ enum { */ LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_obj_class; -/** - * Special, rarely used attributes. - * They are allocated automatically if any elements is set. - */ -typedef struct { - lv_obj_t ** children; /**< Store the pointer of the children in an array.*/ - lv_group_t * group_p; - lv_event_list_t event_list; - - lv_point_t scroll; /**< The current X/Y scroll offset*/ - - int32_t ext_click_pad; /**< Extra click padding in all direction*/ - int32_t ext_draw_size; /**< EXTend the size in every direction for drawing.*/ - - uint16_t child_cnt; /**< Number of children*/ - uint16_t scrollbar_mode : 2; /**< How to display scrollbars, see `lv_scrollbar_mode_t`*/ - uint16_t scroll_snap_x : 2; /**< Where to align the snappable children horizontally, see `lv_scroll_snap_t`*/ - uint16_t scroll_snap_y : 2; /**< Where to align the snappable children vertically*/ - uint16_t scroll_dir : 4; /**< The allowed scroll direction(s), see `lv_dir_t`*/ - uint16_t layer_type : 2; /**< Cache the layer type here. Element of @lv_intermediate_layer_type_t */ -} _lv_obj_spec_attr_t; - -struct _lv_obj_t { - const lv_obj_class_t * class_p; - lv_obj_t * parent; - _lv_obj_spec_attr_t * spec_attr; - _lv_obj_style_t * styles; -#if LV_OBJ_STYLE_CACHE - uint32_t style_main_prop_is_set; - uint32_t style_other_prop_is_set; -#endif - void * user_data; -#if LV_USE_OBJ_ID - void * id; -#endif - lv_area_t coords; - lv_obj_flag_t flags; - lv_state_t state; - uint16_t layout_inv : 1; - uint16_t readjust_scroll_after_layout : 1; - uint16_t scr_layout_inv : 1; - uint16_t skip_trans : 1; - uint16_t style_cnt : 6; - uint16_t h_layout : 1; - uint16_t w_layout : 1; - uint16_t is_deleting : 1; -}; - /********************** * GLOBAL PROTOTYPES **********************/ @@ -331,10 +283,7 @@ void lv_obj_set_state(lv_obj_t * obj, lv_state_t state, bool v); * @param obj pointer to an object * @param user_data pointer to the new user_data. */ -static inline void lv_obj_set_user_data(lv_obj_t * obj, void * user_data) -{ - obj->user_data = user_data; -} +void lv_obj_set_user_data(lv_obj_t * obj, void * user_data); /*======================= * Getter functions @@ -383,10 +332,7 @@ lv_group_t * lv_obj_get_group(const lv_obj_t * obj); * @param obj pointer to an object * @return the pointer to the user_data of the object */ -static inline void * lv_obj_get_user_data(lv_obj_t * obj) -{ - return obj->user_data; -} +void * lv_obj_get_user_data(lv_obj_t * obj); /*======================= * Other functions diff --git a/src/core/lv_obj_class.c b/src/core/lv_obj_class.c index a3e9b2bd2..cb5a396b0 100644 --- a/src/core/lv_obj_class.c +++ b/src/core/lv_obj_class.c @@ -6,7 +6,8 @@ /********************* * INCLUDES *********************/ -#include "lv_obj.h" +#include "lv_obj_class_private.h" +#include "lv_obj_private.h" #include "../themes/lv_theme.h" #include "../display/lv_display.h" #include "../display/lv_display_private.h" @@ -132,7 +133,7 @@ void lv_obj_class_init_obj(lv_obj_t * obj) } } -void _lv_obj_destruct(lv_obj_t * obj) +void lv_obj_destruct(lv_obj_t * obj) { if(obj->class_p->destructor_cb) obj->class_p->destructor_cb(obj->class_p, obj); @@ -141,7 +142,7 @@ void _lv_obj_destruct(lv_obj_t * obj) obj->class_p = obj->class_p->base_class; /*Call the base class's destructor too*/ - _lv_obj_destruct(obj); + lv_obj_destruct(obj); } } diff --git a/src/core/lv_obj_class.h b/src/core/lv_obj_class.h index 09f157f94..4c3bdcb24 100644 --- a/src/core/lv_obj_class.h +++ b/src/core/lv_obj_class.h @@ -43,42 +43,6 @@ typedef enum { } lv_obj_class_theme_inheritable_t; typedef void (*lv_obj_class_event_cb_t)(lv_obj_class_t * class_p, lv_event_t * e); -/** - * Describe the common methods of every object. - * Similar to a C++ class. - */ -struct _lv_obj_class_t { - const lv_obj_class_t * base_class; - /*class_p is the final class while obj->class_p is the class currently being [de]constructed.*/ - void (*constructor_cb)(const lv_obj_class_t * class_p, lv_obj_t * obj); - void (*destructor_cb)(const lv_obj_class_t * class_p, lv_obj_t * obj); - - /*class_p is the class in which event is being processed.*/ - void (*event_cb)(const lv_obj_class_t * class_p, lv_event_t * e); /**< Widget type specific event function*/ - -#if LV_USE_OBJ_PROPERTY - uint32_t prop_index_start; - uint32_t prop_index_end; - const lv_property_ops_t * properties; - uint32_t properties_count; - -#if LV_USE_OBJ_PROPERTY_NAME - /* An array of property ID and name */ - const lv_property_name_t * property_names; - uint32_t names_count; -#endif -#endif - - void * user_data; - const char * name; - int32_t width_def; - int32_t height_def; - uint32_t editable : 2; /**< Value from ::lv_obj_class_editable_t*/ - uint32_t group_def : 2; /**< Value from ::lv_obj_class_group_def_t*/ - uint32_t instance_size : 16; - uint32_t theme_inheritable : 1; /**< Value from ::lv_obj_class_theme_inheritable_t*/ -}; - /********************** * GLOBAL PROTOTYPES **********************/ @@ -93,8 +57,6 @@ lv_obj_t * lv_obj_class_create_obj(const lv_obj_class_t * class_p, lv_obj_t * pa void lv_obj_class_init_obj(lv_obj_t * obj); -void _lv_obj_destruct(lv_obj_t * obj); - bool lv_obj_is_editable(lv_obj_t * obj); bool lv_obj_is_group_def(lv_obj_t * obj); diff --git a/src/core/lv_obj_class_private.h b/src/core/lv_obj_class_private.h new file mode 100644 index 000000000..464813fb6 --- /dev/null +++ b/src/core/lv_obj_class_private.h @@ -0,0 +1,78 @@ +/** + * @file lv_obj_class_private.h + * + */ + +#ifndef LV_OBJ_CLASS_PRIVATE_H +#define LV_OBJ_CLASS_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_obj_class.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Describe the common methods of every object. + * Similar to a C++ class. + */ +struct lv_obj_class_t { + const lv_obj_class_t * base_class; + /*class_p is the final class while obj->class_p is the class currently being [de]constructed.*/ + void (*constructor_cb)(const lv_obj_class_t * class_p, lv_obj_t * obj); + void (*destructor_cb)(const lv_obj_class_t * class_p, lv_obj_t * obj); + + /*class_p is the class in which event is being processed.*/ + void (*event_cb)(const lv_obj_class_t * class_p, lv_event_t * e); /**< Widget type specific event function*/ + +#if LV_USE_OBJ_PROPERTY + uint32_t prop_index_start; + uint32_t prop_index_end; + const lv_property_ops_t * properties; + uint32_t properties_count; + +#if LV_USE_OBJ_PROPERTY_NAME + /* An array of property ID and name */ + const lv_property_name_t * property_names; + uint32_t names_count; +#endif +#endif + + void * user_data; + const char * name; + int32_t width_def; + int32_t height_def; + uint32_t editable : 2; /**< Value from ::lv_obj_class_editable_t*/ + uint32_t group_def : 2; /**< Value from ::lv_obj_class_group_def_t*/ + uint32_t instance_size : 16; + uint32_t theme_inheritable : 1; /**< Value from ::lv_obj_class_theme_inheritable_t*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_obj_destruct(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_CLASS_PRIVATE_H*/ diff --git a/src/core/lv_obj_draw.c b/src/core/lv_obj_draw.c index 91be29380..4a11ddaac 100644 --- a/src/core/lv_obj_draw.c +++ b/src/core/lv_obj_draw.c @@ -6,8 +6,9 @@ /********************* * INCLUDES *********************/ -#include "lv_obj_draw.h" -#include "lv_obj.h" +#include "lv_obj_draw_private.h" +#include "lv_obj_private.h" +#include "lv_obj_style.h" #include "../display/lv_display.h" #include "../indev/lv_indev.h" #include "../stdlib/lv_string.h" @@ -288,7 +289,7 @@ void lv_obj_refresh_ext_draw_size(lv_obj_t * obj) { LV_ASSERT_OBJ(obj, MY_CLASS); - int32_t s_old = _lv_obj_get_ext_draw_size(obj); + int32_t s_old = lv_obj_get_ext_draw_size(obj); int32_t s_new = 0; lv_obj_send_event(obj, LV_EVENT_REFR_EXT_DRAW_SIZE, &s_new); @@ -306,13 +307,13 @@ void lv_obj_refresh_ext_draw_size(lv_obj_t * obj) if(s_new != s_old) lv_obj_invalidate(obj); } -int32_t _lv_obj_get_ext_draw_size(const lv_obj_t * obj) +int32_t lv_obj_get_ext_draw_size(const lv_obj_t * obj) { if(obj->spec_attr) return obj->spec_attr->ext_draw_size; else return 0; } -lv_layer_type_t _lv_obj_get_layer_type(const lv_obj_t * obj) +lv_layer_type_t lv_obj_get_layer_type(const lv_obj_t * obj) { if(obj->spec_attr) return (lv_layer_type_t)obj->spec_attr->layer_type; diff --git a/src/core/lv_obj_draw.h b/src/core/lv_obj_draw.h index 73b76c18a..7e0c26363 100644 --- a/src/core/lv_obj_draw.h +++ b/src/core/lv_obj_draw.h @@ -98,15 +98,6 @@ int32_t lv_obj_calculate_ext_draw_size(lv_obj_t * obj, lv_part_t part); */ void lv_obj_refresh_ext_draw_size(lv_obj_t * obj); -/** - * Get the extended draw area of an object. - * @param obj pointer to an object - * @return the size extended draw area around the real coordinates - */ -int32_t _lv_obj_get_ext_draw_size(const lv_obj_t * obj); - -lv_layer_type_t _lv_obj_get_layer_type(const lv_obj_t * obj); - /********************** * MACROS **********************/ diff --git a/src/core/lv_obj_draw_private.h b/src/core/lv_obj_draw_private.h new file mode 100644 index 000000000..36c8bff96 --- /dev/null +++ b/src/core/lv_obj_draw_private.h @@ -0,0 +1,48 @@ +/** + * @file lv_obj_draw_private.h + * + */ + +#ifndef LV_OBJ_DRAW_PRIVATE_H +#define LV_OBJ_DRAW_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_obj_draw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get the extended draw area of an object. + * @param obj pointer to an object + * @return the size extended draw area around the real coordinates + */ +int32_t lv_obj_get_ext_draw_size(const lv_obj_t * obj); + +lv_layer_type_t lv_obj_get_layer_type(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_DRAW_PRIVATE_H*/ diff --git a/src/core/lv_obj_event.c b/src/core/lv_obj_event.c index 82b83883d..3831feeb5 100644 --- a/src/core/lv_obj_event.c +++ b/src/core/lv_obj_event.c @@ -6,7 +6,10 @@ /********************* * INCLUDES *********************/ -#include "lv_obj.h" +#include "../misc/lv_event_private.h" +#include "lv_obj_event_private.h" +#include "lv_obj_class_private.h" +#include "lv_obj_private.h" #include "../indev/lv_indev.h" #include "../indev/lv_indev_private.h" @@ -58,13 +61,13 @@ lv_result_t lv_obj_send_event(lv_obj_t * obj, lv_event_code_t event_code, void * e.stop_bubbling = 0; e.stop_processing = 0; - _lv_event_push(&e); + lv_event_push(&e); /*Send the event*/ lv_result_t res = event_send_core(&e); /*Remove this element from the list*/ - _lv_event_pop(&e); + lv_event_pop(&e); return res; } diff --git a/src/core/lv_obj_event.h b/src/core/lv_obj_event.h index f5b406be1..2035f1765 100644 --- a/src/core/lv_obj_event.h +++ b/src/core/lv_obj_event.h @@ -25,18 +25,6 @@ extern "C" { * TYPEDEFS **********************/ -/** - * Used as the event parameter of ::LV_EVENT_HIT_TEST to check if an `point` can click the object or not. - * `res` should be set like this: - * - If already set to `false` another event wants that point non clickable. If you want to respect it leave it as `false` or set `true` to overwrite it. - * - If already set `true` and `point` shouldn't be clickable set to `false` - * - If already set to `true` you agree that `point` can click the object leave it as `true` - */ -typedef struct { - const lv_point_t * point; /**< A point relative to screen to check if it can click the object or not*/ - bool res; /**< true: `point` can click the object; false: it cannot*/ -} lv_hit_test_info_t; - /** Cover check results.*/ typedef enum { LV_COVER_RES_COVER = 0, @@ -44,16 +32,6 @@ typedef enum { LV_COVER_RES_MASKED = 2, } lv_cover_res_t; -/** - * Used as the event parameter of ::LV_EVENT_COVER_CHECK to check if an area is covered by the object or not. - * In the event use `const lv_area_t * area = lv_event_get_cover_area(e)` to get the area to check - * and `lv_event_set_cover_res(e, res)` to set the result. - */ -typedef struct { - lv_cover_res_t res; - const lv_area_t * area; -} lv_cover_check_info_t; - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/core/lv_obj_event_private.h b/src/core/lv_obj_event_private.h new file mode 100644 index 000000000..731d33248 --- /dev/null +++ b/src/core/lv_obj_event_private.h @@ -0,0 +1,62 @@ +/** + * @file lv_obj_event_private.h + * + */ + +#ifndef LV_OBJ_EVENT_PRIVATE_H +#define LV_OBJ_EVENT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_obj_event.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Used as the event parameter of ::LV_EVENT_HIT_TEST to check if an `point` can click the object or not. + * `res` should be set like this: + * - If already set to `false` another event wants that point non clickable. If you want to respect it leave it as `false` or set `true` to overwrite it. + * - If already set `true` and `point` shouldn't be clickable set to `false` + * - If already set to `true` you agree that `point` can click the object leave it as `true` + */ +struct lv_hit_test_info_t { + const lv_point_t * point; /**< A point relative to screen to check if it can click the object or not*/ + bool res; /**< true: `point` can click the object; false: it cannot*/ +}; + +/** + * Used as the event parameter of ::LV_EVENT_COVER_CHECK to check if an area is covered by the object or not. + * In the event use `const lv_area_t * area = lv_event_get_cover_area(e)` to get the area to check + * and `lv_event_set_cover_res(e, res)` to set the result. + */ +struct lv_cover_check_info_t { + lv_cover_res_t res; + const lv_area_t * area; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_EVENT_PRIVATE_H*/ diff --git a/src/core/lv_obj_id_builtin.c b/src/core/lv_obj_id_builtin.c index 5512cf74c..7a0494a72 100644 --- a/src/core/lv_obj_id_builtin.c +++ b/src/core/lv_obj_id_builtin.c @@ -6,7 +6,8 @@ /********************* * INCLUDES *********************/ -#include "lv_obj.h" +#include "lv_obj_class_private.h" +#include "lv_obj_private.h" #include "lv_global.h" #include "../osal/lv_os.h" #include "../stdlib/lv_sprintf.h" @@ -92,7 +93,7 @@ const char * lv_obj_stringify_id(lv_obj_t * obj, char * buf, uint32_t len) name = obj->class_p->name; if(name == NULL) name = "nameless"; - lv_snprintf(buf, len, "%s%" LV_PRId32 "", name, (uint32_t)(lv_uintptr_t)obj->id); + lv_snprintf(buf, len, "%s%" LV_PRIu32 "", name, (uint32_t)(lv_uintptr_t)obj->id); return buf; } diff --git a/src/core/lv_obj_pos.c b/src/core/lv_obj_pos.c index 0e8ecaa52..0a3b00041 100644 --- a/src/core/lv_obj_pos.c +++ b/src/core/lv_obj_pos.c @@ -6,10 +6,14 @@ /********************* * INCLUDES *********************/ -#include "lv_obj.h" +#include "../misc/lv_area_private.h" +#include "../layouts/lv_layout_private.h" +#include "lv_obj_event_private.h" +#include "lv_obj_draw_private.h" +#include "lv_obj_private.h" #include "../display/lv_display.h" #include "../display/lv_display_private.h" -#include "lv_refr.h" +#include "lv_refr_private.h" #include "../core/lv_global.h" /********************* @@ -54,12 +58,12 @@ void lv_obj_set_x(lv_obj_t * obj, int32_t x) { LV_ASSERT_OBJ(obj, MY_CLASS); - lv_result_t res_x; + lv_style_res_t res_x; lv_style_value_t v_x; res_x = lv_obj_get_local_style_prop(obj, LV_STYLE_X, &v_x, 0); - if((res_x == LV_RESULT_OK && v_x.num != x) || res_x == LV_RESULT_INVALID) { + if((res_x == LV_STYLE_RES_FOUND && v_x.num != x) || res_x == LV_STYLE_RES_NOT_FOUND) { lv_obj_set_style_x(obj, x, 0); } } @@ -68,12 +72,12 @@ void lv_obj_set_y(lv_obj_t * obj, int32_t y) { LV_ASSERT_OBJ(obj, MY_CLASS); - lv_result_t res_y; + lv_style_res_t res_y; lv_style_value_t v_y; res_y = lv_obj_get_local_style_prop(obj, LV_STYLE_Y, &v_y, 0); - if((res_y == LV_RESULT_OK && v_y.num != y) || res_y == LV_RESULT_INVALID) { + if((res_y == LV_STYLE_RES_FOUND && v_y.num != y) || res_y == LV_STYLE_RES_NOT_FOUND) { lv_obj_set_style_y(obj, y, 0); } } @@ -170,7 +174,7 @@ bool lv_obj_refr_size(lv_obj_t * obj) /*If the object is already out of the parent and its position is changes *surely the scrollbars also changes so invalidate them*/ - bool on1 = _lv_area_is_in(&ori, &parent_fit_area, 0); + bool on1 = lv_area_is_in(&ori, &parent_fit_area, 0); if(!on1) lv_obj_scrollbar_invalidate(parent); /*Set the length and height @@ -196,7 +200,7 @@ bool lv_obj_refr_size(lv_obj_t * obj) /*If the object was out of the parent invalidate the new scrollbar area too. *If it wasn't out of the parent but out now, also invalidate the scrollbars*/ - bool on2 = _lv_area_is_in(&obj->coords, &parent_fit_area, 0); + bool on2 = lv_area_is_in(&obj->coords, &parent_fit_area, 0); if(on1 || (!on1 && on2)) lv_obj_scrollbar_invalidate(parent); lv_obj_refresh_ext_draw_size(obj); @@ -215,12 +219,12 @@ void lv_obj_set_size(lv_obj_t * obj, int32_t w, int32_t h) void lv_obj_set_width(lv_obj_t * obj, int32_t w) { LV_ASSERT_OBJ(obj, MY_CLASS); - lv_result_t res_w; + lv_style_res_t res_w; lv_style_value_t v_w; res_w = lv_obj_get_local_style_prop(obj, LV_STYLE_WIDTH, &v_w, 0); - if((res_w == LV_RESULT_OK && v_w.num != w) || res_w == LV_RESULT_INVALID) { + if((res_w == LV_STYLE_RES_FOUND && v_w.num != w) || res_w == LV_STYLE_RES_NOT_FOUND) { lv_obj_set_style_width(obj, w, 0); } } @@ -228,12 +232,12 @@ void lv_obj_set_width(lv_obj_t * obj, int32_t w) void lv_obj_set_height(lv_obj_t * obj, int32_t h) { LV_ASSERT_OBJ(obj, MY_CLASS); - lv_result_t res_h; + lv_style_res_t res_h; lv_style_value_t v_h; res_h = lv_obj_get_local_style_prop(obj, LV_STYLE_HEIGHT, &v_h, 0); - if((res_h == LV_RESULT_OK && v_h.num != h) || res_h == LV_RESULT_INVALID) { + if((res_h == LV_STYLE_RES_FOUND && v_h.num != h) || res_h == LV_STYLE_RES_NOT_FOUND) { lv_obj_set_style_height(obj, h, 0); } } @@ -450,6 +454,9 @@ void lv_obj_align_to(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, in x = lv_obj_get_width(base); y = lv_obj_get_height(base) - lv_obj_get_height(obj); break; + + case LV_ALIGN_DEFAULT: + break; } if(LV_COORD_IS_PCT(x_ofs)) x_ofs = (lv_obj_get_width(base) * LV_COORD_GET_PCT(x_ofs)) / 100; @@ -721,7 +728,7 @@ void lv_obj_move_to(lv_obj_t * obj, int32_t x, int32_t y) /*If the object is already out of the parent and its position is changes *surely the scrollbars also changes so invalidate them*/ - on1 = _lv_area_is_in(&ori, &parent_fit_area, 0); + on1 = lv_area_is_in(&ori, &parent_fit_area, 0); if(!on1) lv_obj_scrollbar_invalidate(parent); } @@ -741,7 +748,7 @@ void lv_obj_move_to(lv_obj_t * obj, int32_t x, int32_t y) /*If the object was out of the parent invalidate the new scrollbar area too. *If it wasn't out of the parent but out now, also invalidate the scrollbars*/ if(parent) { - bool on2 = _lv_area_is_in(&obj->coords, &parent_fit_area, 0); + bool on2 = lv_area_is_in(&obj->coords, &parent_fit_area, 0); if(on1 || (!on1 && on2)) lv_obj_scrollbar_invalidate(parent); } } @@ -771,7 +778,7 @@ void lv_obj_transform_point_array(const lv_obj_t * obj, lv_point_t points[], siz lv_obj_point_transform_flag_t flags) { if(obj) { - lv_layer_type_t layer_type = _lv_obj_get_layer_type(obj); + lv_layer_type_t layer_type = lv_obj_get_layer_type(obj); bool do_tranf = layer_type == LV_LAYER_TYPE_TRANSFORM; bool recursive = flags & LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE; bool inverse = flags & LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE; @@ -820,7 +827,7 @@ void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area) lv_area_increase(&area_tmp, 5, 5); } - _lv_inv_area(lv_obj_get_display(obj), &area_tmp); + lv_inv_area(lv_obj_get_display(obj), &area_tmp); } void lv_obj_invalidate(const lv_obj_t * obj) @@ -829,7 +836,7 @@ void lv_obj_invalidate(const lv_obj_t * obj) /*Truncate the area to the object*/ lv_area_t obj_coords; - int32_t ext_size = _lv_obj_get_ext_draw_size(obj); + int32_t ext_size = lv_obj_get_ext_draw_size(obj); lv_area_copy(&obj_coords, &obj->coords); obj_coords.x1 -= ext_size; obj_coords.y1 -= ext_size; @@ -856,12 +863,12 @@ bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area) /*Truncate the area to the object*/ lv_area_t obj_coords; - int32_t ext_size = _lv_obj_get_ext_draw_size(obj); + int32_t ext_size = lv_obj_get_ext_draw_size(obj); lv_area_copy(&obj_coords, &obj->coords); lv_area_increase(&obj_coords, ext_size, ext_size); /*The area is not on the object*/ - if(!_lv_area_intersect(area, area, &obj_coords)) return false; + if(!lv_area_intersect(area, area, &obj_coords)) return false; lv_obj_get_transformed_area(obj, area, LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE); @@ -874,12 +881,12 @@ bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area) /*Truncate to the parent and if no common parts break*/ lv_area_t parent_coords = parent->coords; if(lv_obj_has_flag(parent, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) { - int32_t parent_ext_size = _lv_obj_get_ext_draw_size(parent); + int32_t parent_ext_size = lv_obj_get_ext_draw_size(parent); lv_area_increase(&parent_coords, parent_ext_size, parent_ext_size); } lv_obj_get_transformed_area(parent, &parent_coords, LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE); - if(!_lv_area_intersect(area, area, &parent_coords)) return false; + if(!lv_area_intersect(area, area, &parent_coords)) return false; parent = lv_obj_get_parent(parent); } @@ -892,7 +899,7 @@ bool lv_obj_is_visible(const lv_obj_t * obj) LV_ASSERT_OBJ(obj, MY_CLASS); lv_area_t obj_coords; - int32_t ext_size = _lv_obj_get_ext_draw_size(obj); + int32_t ext_size = lv_obj_get_ext_draw_size(obj); lv_area_copy(&obj_coords, &obj->coords); obj_coords.x1 -= ext_size; obj_coords.y1 -= ext_size; @@ -924,7 +931,7 @@ bool lv_obj_hit_test(lv_obj_t * obj, const lv_point_t * point) lv_area_t a; lv_obj_get_click_area(obj, &a); - bool res = _lv_area_is_point_on(&a, point, 0); + bool res = lv_area_is_point_on(&a, point, 0); if(res == false) return false; if(lv_obj_has_flag(obj, LV_OBJ_FLAG_ADV_HITTEST)) { @@ -952,6 +959,11 @@ int32_t lv_clamp_height(int32_t height, int32_t min_height, int32_t max_height, return LV_CLAMP(min_height, height, max_height); } +void lv_obj_center(lv_obj_t * obj) +{ + lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0); +} + /********************** * STATIC FUNCTIONS **********************/ @@ -1118,7 +1130,7 @@ static void layout_update_core(lv_obj_t * obj) lv_obj_refr_pos(obj); if(child_cnt > 0) { - _lv_layout_apply(obj); + lv_layout_apply(obj); } } diff --git a/src/core/lv_obj_pos.h b/src/core/lv_obj_pos.h index 3c7234fec..584f0b7e8 100644 --- a/src/core/lv_obj_pos.h +++ b/src/core/lv_obj_pos.h @@ -195,10 +195,7 @@ void lv_obj_align_to(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, in * @param obj pointer to an object to align * @note if the parent size changes `obj` needs to be aligned manually again */ -static inline void lv_obj_center(lv_obj_t * obj) -{ - lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0); -} +void lv_obj_center(lv_obj_t * obj); /** * Copy the coordinates of an object to an area diff --git a/src/core/lv_obj_private.h b/src/core/lv_obj_private.h new file mode 100644 index 000000000..931454e78 --- /dev/null +++ b/src/core/lv_obj_private.h @@ -0,0 +1,88 @@ +/** + * @file lv_obj_private.h + * + */ + +#ifndef LV_OBJ_PRIVATE_H +#define LV_OBJ_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Special, rarely used attributes. + * They are allocated automatically if any elements is set. + */ +struct lv_obj_spec_attr_t { + lv_obj_t ** children; /**< Store the pointer of the children in an array.*/ + lv_group_t * group_p; + lv_event_list_t event_list; + + lv_point_t scroll; /**< The current X/Y scroll offset*/ + + int32_t ext_click_pad; /**< Extra click padding in all direction*/ + int32_t ext_draw_size; /**< EXTend the size in every direction for drawing.*/ + + uint16_t child_cnt; /**< Number of children*/ + uint16_t scrollbar_mode : 2; /**< How to display scrollbars, see `lv_scrollbar_mode_t`*/ + uint16_t scroll_snap_x : 2; /**< Where to align the snappable children horizontally, see `lv_scroll_snap_t`*/ + uint16_t scroll_snap_y : 2; /**< Where to align the snappable children vertically*/ + uint16_t scroll_dir : 4; /**< The allowed scroll direction(s), see `lv_dir_t`*/ + uint16_t layer_type : 2; /**< Cache the layer type here. Element of @lv_intermediate_layer_type_t */ +}; + +struct lv_obj_t { + const lv_obj_class_t * class_p; + lv_obj_t * parent; + lv_obj_spec_attr_t * spec_attr; + lv_obj_style_t * styles; +#if LV_OBJ_STYLE_CACHE + uint32_t style_main_prop_is_set; + uint32_t style_other_prop_is_set; +#endif + void * user_data; +#if LV_USE_OBJ_ID + void * id; +#endif + lv_area_t coords; + lv_obj_flag_t flags; + lv_state_t state; + uint16_t layout_inv : 1; + uint16_t readjust_scroll_after_layout : 1; + uint16_t scr_layout_inv : 1; + uint16_t skip_trans : 1; + uint16_t style_cnt : 6; + uint16_t h_layout : 1; + uint16_t w_layout : 1; + uint16_t is_deleting : 1; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_PRIVATE_H*/ diff --git a/src/core/lv_obj_property.c b/src/core/lv_obj_property.c index 4c24de997..54088e685 100644 --- a/src/core/lv_obj_property.c +++ b/src/core/lv_obj_property.c @@ -10,6 +10,8 @@ #include "../stdlib/lv_string.h" #include "../misc/lv_utils.h" #include "lv_obj_property.h" +#include "lv_obj_private.h" +#include "lv_obj_class_private.h" #if LV_USE_OBJ_PROPERTY diff --git a/src/core/lv_obj_property.h b/src/core/lv_obj_property.h index 92dc88724..0d3a7eadb 100644 --- a/src/core/lv_obj_property.h +++ b/src/core/lv_obj_property.h @@ -67,11 +67,10 @@ enum { /*Special ID, use it to extend ID and make sure it's unique and compile time determinant*/ LV_PROPERTY_ID_BUILTIN_LAST = 0xffff, /*ID of 0x10000 ~ 0xfffffff is reserved for user*/ - /*Special ID used by lvgl to intercept all setter/getter call.*/ - LV_PROPERTY_ID_ANY = 0x7ffffffe, + LV_PROPERTY_ID_ANY = 0x7ffffffe, /*Special ID used by lvgl to intercept all setter/getter call.*/ }; -struct _lv_property_name_t { +struct lv_property_name_t { const char * name; lv_prop_id_t id; }; diff --git a/src/core/lv_obj_scroll.c b/src/core/lv_obj_scroll.c index b031a7573..727264b4b 100644 --- a/src/core/lv_obj_scroll.c +++ b/src/core/lv_obj_scroll.c @@ -6,11 +6,13 @@ /********************* * INCLUDES *********************/ -#include "lv_obj_scroll.h" -#include "lv_obj.h" +#include "../misc/lv_anim_private.h" +#include "lv_obj_scroll_private.h" +#include "lv_obj_private.h" #include "../indev/lv_indev.h" #include "../indev/lv_indev_scroll.h" #include "../display/lv_display.h" +#include "../misc/lv_area.h" /********************* * DEFINES @@ -350,7 +352,7 @@ void lv_obj_scroll_by(lv_obj_t * obj, int32_t dx, int32_t dy, lv_anim_enable_t a res = lv_obj_send_event(obj, LV_EVENT_SCROLL_BEGIN, NULL); if(res != LV_RESULT_OK) return; - res = _lv_obj_scroll_by_raw(obj, dx, dy); + res = lv_obj_scroll_by_raw(obj, dx, dy); if(res != LV_RESULT_OK) return; res = lv_obj_send_event(obj, LV_EVENT_SCROLL_END, NULL); @@ -408,7 +410,7 @@ void lv_obj_scroll_to_view_recursive(lv_obj_t * obj, lv_anim_enable_t anim_en) } } -lv_result_t _lv_obj_scroll_by_raw(lv_obj_t * obj, int32_t x, int32_t y) +lv_result_t lv_obj_scroll_by_raw(lv_obj_t * obj, int32_t x, int32_t y) { if(x == 0 && y == 0) return LV_RESULT_OK; @@ -452,7 +454,7 @@ void lv_obj_get_scrollbar_area(lv_obj_t * obj, lv_area_t * hor_area, lv_area_t * if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLLABLE) == false) return; - lv_dir_t sm = lv_obj_get_scrollbar_mode(obj); + lv_scrollbar_mode_t sm = lv_obj_get_scrollbar_mode(obj); if(sm == LV_SCROLLBAR_MODE_OFF) return; /*If there is no indev scrolling this object but `mode==active` return*/ @@ -669,12 +671,12 @@ void lv_obj_readjust_scroll(lv_obj_t * obj, lv_anim_enable_t anim_en) static void scroll_x_anim(void * obj, int32_t v) { - _lv_obj_scroll_by_raw(obj, v + lv_obj_get_scroll_x(obj), 0); + lv_obj_scroll_by_raw(obj, v + lv_obj_get_scroll_x(obj), 0); } static void scroll_y_anim(void * obj, int32_t v) { - _lv_obj_scroll_by_raw(obj, 0, v + lv_obj_get_scroll_y(obj)); + lv_obj_scroll_by_raw(obj, 0, v + lv_obj_get_scroll_y(obj)); } static void scroll_end_cb(lv_anim_t * a) @@ -734,6 +736,8 @@ static void scroll_area_into_view(const lv_area_t * area, lv_obj_t * child, lv_p act = lv_area_get_height(area_tmp) / 2 + area_tmp->y1 + y_scroll; y_scroll += snap_goal - act; break; + case LV_SCROLL_SNAP_NONE: + break; } int32_t x_scroll = 0; @@ -776,6 +780,8 @@ static void scroll_area_into_view(const lv_area_t * area, lv_obj_t * child, lv_p act = lv_area_get_width(area_tmp) / 2 + area_tmp->x1 + x_scroll; x_scroll += snap_goal - act; break; + case LV_SCROLL_SNAP_NONE: + break; } /*Remove any pending scroll animations.*/ diff --git a/src/core/lv_obj_scroll.h b/src/core/lv_obj_scroll.h index 0114a3b65..e0984aedc 100644 --- a/src/core/lv_obj_scroll.h +++ b/src/core/lv_obj_scroll.h @@ -28,32 +28,20 @@ extern "C" { /*Can't include lv_obj.h because it includes this header file*/ /** Scrollbar modes: shows when should the scrollbars be visible*/ -enum _lv_scrollbar_mode_t { +typedef enum { LV_SCROLLBAR_MODE_OFF, /**< Never show scrollbars*/ LV_SCROLLBAR_MODE_ON, /**< Always show scrollbars*/ LV_SCROLLBAR_MODE_ACTIVE, /**< Show scroll bars when object is being scrolled*/ LV_SCROLLBAR_MODE_AUTO, /**< Show scroll bars when the content is large enough to be scrolled*/ -}; - -#ifdef DOXYGEN -typedef _lv_scrollbar_mode_t lv_scrollbar_mode_t; -#else -typedef uint8_t lv_scrollbar_mode_t; -#endif /*DOXYGEN*/ +} lv_scrollbar_mode_t; /** Scroll span align options. Tells where to align the snappable children when scroll stops.*/ -enum _lv_scroll_snap_t { +typedef enum { LV_SCROLL_SNAP_NONE, /**< Do not align, leave where it is*/ LV_SCROLL_SNAP_START, /**< Align to the left/top*/ LV_SCROLL_SNAP_END, /**< Align to the right/bottom*/ LV_SCROLL_SNAP_CENTER /**< Align to the center*/ -}; - -#ifdef DOXYGEN -typedef _lv_scroll_snap_t lv_scroll_snap_t; -#else -typedef uint8_t lv_scroll_snap_t; -#endif /*DOXYGEN*/ +} lv_scroll_snap_t; /********************** * GLOBAL PROTOTYPES @@ -257,17 +245,6 @@ void lv_obj_scroll_to_view(lv_obj_t * obj, lv_anim_enable_t anim_en); */ void lv_obj_scroll_to_view_recursive(lv_obj_t * obj, lv_anim_enable_t anim_en); -/** - * Low level function to scroll by given x and y coordinates. - * `LV_EVENT_SCROLL` is sent. - * @param obj pointer to an object to scroll - * @param x pixels to scroll horizontally - * @param y pixels to scroll vertically - * @return `LV_RESULT_INVALID`: to object was deleted in `LV_EVENT_SCROLL`; - * `LV_RESULT_OK`: if the object is still valid - */ -lv_result_t _lv_obj_scroll_by_raw(lv_obj_t * obj, int32_t x, int32_t y); - /** * Tell whether an object is being scrolled or not at this moment * @param obj pointer to an object diff --git a/src/core/lv_obj_scroll_private.h b/src/core/lv_obj_scroll_private.h new file mode 100644 index 000000000..9ae6332d4 --- /dev/null +++ b/src/core/lv_obj_scroll_private.h @@ -0,0 +1,50 @@ +/** + * @file lv_obj_scroll_private.h + * + */ + +#ifndef LV_OBJ_SCROLL_PRIVATE_H +#define LV_OBJ_SCROLL_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_obj_scroll.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Low level function to scroll by given x and y coordinates. + * `LV_EVENT_SCROLL` is sent. + * @param obj pointer to an object to scroll + * @param x pixels to scroll horizontally + * @param y pixels to scroll vertically + * @return `LV_RESULT_INVALID`: to object was deleted in `LV_EVENT_SCROLL`; + * `LV_RESULT_OK`: if the object is still valid + */ +lv_result_t lv_obj_scroll_by_raw(lv_obj_t * obj, int32_t x, int32_t y); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_SCROLL_PRIVATE_H*/ diff --git a/src/core/lv_obj_style.c b/src/core/lv_obj_style.c index 8c944cec0..ee1d5bd17 100644 --- a/src/core/lv_obj_style.c +++ b/src/core/lv_obj_style.c @@ -6,7 +6,10 @@ /********************* * INCLUDES *********************/ -#include "lv_obj.h" +#include "../misc/lv_anim_private.h" +#include "lv_obj_style_private.h" +#include "lv_obj_class_private.h" +#include "lv_obj_private.h" #include "../display/lv_display.h" #include "../display/lv_display_private.h" #include "../misc/lv_color.h" @@ -49,7 +52,7 @@ typedef enum { * STATIC PROTOTYPES **********************/ static lv_style_t * get_local_style(lv_obj_t * obj, lv_style_selector_t selector); -static _lv_obj_style_t * get_trans_style(lv_obj_t * obj, lv_part_t part); +static lv_obj_style_t * get_trans_style(lv_obj_t * obj, lv_part_t part); static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop, lv_style_value_t * v); static void report_style_change_core(void * style, lv_obj_t * obj); @@ -78,14 +81,14 @@ static lv_style_res_t get_selector_style_prop(const lv_obj_t * obj, lv_style_sel * GLOBAL FUNCTIONS **********************/ -void _lv_obj_style_init(void) +void lv_obj_style_init(void) { - _lv_ll_init(style_trans_ll_p, sizeof(trans_t)); + lv_ll_init(style_trans_ll_p, sizeof(trans_t)); } -void _lv_obj_style_deinit(void) +void lv_obj_style_deinit(void) { - _lv_ll_clear(style_trans_ll_p); + lv_ll_clear(style_trans_ll_p); if(_style_custom_prop_flag_lookup_table != NULL) { lv_free(_style_custom_prop_flag_lookup_table); _style_custom_prop_flag_lookup_table = NULL; @@ -120,7 +123,7 @@ void lv_obj_add_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selecto /*Allocate space for the new style and shift the rest of the style to the end*/ obj->style_cnt++; LV_ASSERT(obj->style_cnt != 0); - obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(_lv_obj_style_t)); + obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(lv_obj_style_t)); LV_ASSERT_MALLOC(obj->styles); uint32_t j; @@ -128,7 +131,7 @@ void lv_obj_add_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selecto obj->styles[j] = obj->styles[j - 1]; } - lv_memzero(&obj->styles[i], sizeof(_lv_obj_style_t)); + lv_memzero(&obj->styles[i], sizeof(lv_obj_style_t)); obj->styles[i].style = style; obj->styles[i].selector = selector; @@ -136,8 +139,8 @@ void lv_obj_add_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selecto uint32_t * prop_is_set = part == LV_PART_MAIN ? &obj->style_main_prop_is_set : &obj->style_other_prop_is_set; if(lv_style_is_const(style)) { lv_style_const_prop_t * props = style->values_and_props; - for(i = 0; props[i].prop_ptr; i++) { - (*prop_is_set) |= STYLE_PROP_SHIFTED(*props[i].prop_ptr); + for(i = 0; props[i].prop != LV_STYLE_PROP_INV; i++) { + (*prop_is_set) |= STYLE_PROP_SHIFTED(props[i].prop); } } else { @@ -183,7 +186,7 @@ bool lv_obj_replace_style(lv_obj_t * obj, const lv_style_t * old_style, const lv continue; } - lv_memzero(&obj->styles[i], sizeof(_lv_obj_style_t)); + lv_memzero(&obj->styles[i], sizeof(lv_obj_style_t)); obj->styles[i].style = new_style; obj->styles[i].selector = selector; @@ -237,7 +240,7 @@ void lv_obj_remove_style(lv_obj_t * obj, const lv_style_t * style, lv_style_sele } obj->style_cnt--; - obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(_lv_obj_style_t)); + obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(lv_obj_style_t)); deleted = true; /*The style from the current `i` index is removed, so `i` points to the next style. @@ -300,7 +303,7 @@ void lv_obj_refresh_style(lv_obj_t * obj, lv_style_selector_t selector, lv_style /*Cache the layer type*/ if((part == LV_PART_ANY || part == LV_PART_MAIN) && is_layer_refr) { - _lv_obj_update_layer_type(obj); + lv_obj_update_layer_type(obj); } if(prop == LV_STYLE_PROP_ANY || is_ext_draw) { @@ -409,8 +412,8 @@ bool lv_obj_remove_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_sty return res; } -void _lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t prev_state, lv_state_t new_state, - const _lv_obj_style_transition_dsc_t * tr_dsc) +void lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t prev_state, lv_state_t new_state, + const lv_obj_style_transition_dsc_t * tr_dsc) { trans_t * tr; @@ -427,7 +430,7 @@ void _lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t v1 = lv_obj_get_style_prop(obj, part, tr_dsc->prop); obj->state = new_state; - _lv_obj_style_t * style_trans = get_trans_style(obj, part); + lv_obj_style_t * style_trans = get_trans_style(obj, part); lv_style_set_prop((lv_style_t *)style_trans->style, tr_dsc->prop, v1); /*Be sure `trans_style` has a valid value*/ lv_obj_refresh_style(obj, tr_dsc->selector, tr_dsc->prop); @@ -440,7 +443,7 @@ void _lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t } } - tr = _lv_ll_ins_head(style_trans_ll_p); + tr = lv_ll_ins_head(style_trans_ll_p); LV_ASSERT_MALLOC(tr); if(tr == NULL) return; tr->start_value = v1; @@ -464,7 +467,7 @@ void _lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t lv_anim_start(&a); } -lv_style_value_t _lv_obj_style_apply_color_filter(const lv_obj_t * obj, lv_part_t part, lv_style_value_t v) +lv_style_value_t lv_obj_style_apply_color_filter(const lv_obj_t * obj, lv_part_t part, lv_style_value_t v) { if(obj == NULL) return v; const lv_color_filter_dsc_t * f = lv_obj_get_style_color_filter_dsc(obj, part); @@ -475,9 +478,9 @@ lv_style_value_t _lv_obj_style_apply_color_filter(const lv_obj_t * obj, lv_part_ return v; } -_lv_style_state_cmp_t _lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t state1, lv_state_t state2) +lv_style_state_cmp_t lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t state1, lv_state_t state2) { - _lv_style_state_cmp_t res = _LV_STYLE_STATE_CMP_SAME; + lv_style_state_cmp_t res = LV_STYLE_STATE_CMP_SAME; /*Are there any new styles for the new state?*/ uint32_t i; @@ -511,25 +514,25 @@ _lv_style_state_cmp_t _lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t sta else if(lv_style_get_prop(style, LV_STYLE_BORDER_WIDTH, &v)) layout_diff = true; if(layout_diff) { - return _LV_STYLE_STATE_CMP_DIFF_LAYOUT; + return LV_STYLE_STATE_CMP_DIFF_LAYOUT; } /*Check for draw pad changes*/ - if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_WIDTH, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_HEIGHT, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_ROTATION, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_SCALE_X, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_SCALE_Y, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_OPA, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_PAD, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_WIDTH, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_SHADOW_WIDTH, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OPA, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OFFSET_X, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OFFSET_Y, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_SHADOW_SPREAD, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(lv_style_get_prop(style, LV_STYLE_LINE_WIDTH, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; - else if(res == _LV_STYLE_STATE_CMP_SAME) res = _LV_STYLE_STATE_CMP_DIFF_REDRAW; + if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_WIDTH, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_HEIGHT, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_ROTATION, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_SCALE_X, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_SCALE_Y, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_OPA, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_PAD, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_WIDTH, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_WIDTH, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OPA, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OFFSET_X, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OFFSET_Y, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_SPREAD, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_LINE_WIDTH, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(res == LV_STYLE_STATE_CMP_SAME) res = LV_STYLE_STATE_CMP_DIFF_REDRAW; } } @@ -602,7 +605,7 @@ lv_opa_t lv_obj_get_style_opa_recursive(const lv_obj_t * obj, lv_part_t part) return opa_final; } -void _lv_obj_update_layer_type(lv_obj_t * obj) +void lv_obj_update_layer_type(lv_obj_t * obj) { lv_layer_type_t layer_type = calculate_layer_type(obj); if(obj->spec_attr) obj->spec_attr->layer_type = layer_type; @@ -635,7 +638,7 @@ static lv_style_t * get_local_style(lv_obj_t * obj, lv_style_selector_t selector obj->style_cnt++; LV_ASSERT(obj->style_cnt != 0); - obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(_lv_obj_style_t)); + obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(lv_obj_style_t)); LV_ASSERT_MALLOC(obj->styles); for(i = obj->style_cnt - 1; i > 0 ; i--) { @@ -645,7 +648,7 @@ static lv_style_t * get_local_style(lv_obj_t * obj, lv_style_selector_t selector obj->styles[i] = obj->styles[i - 1]; } - lv_memzero(&obj->styles[i], sizeof(_lv_obj_style_t)); + lv_memzero(&obj->styles[i], sizeof(lv_obj_style_t)); obj->styles[i].style = lv_malloc(sizeof(lv_style_t)); lv_style_init((lv_style_t *)obj->styles[i].style); @@ -661,7 +664,7 @@ static lv_style_t * get_local_style(lv_obj_t * obj, lv_style_selector_t selector * @param selector OR-ed value of parts and state for which the style should be get * @return pointer to the transition style */ -static _lv_obj_style_t * get_trans_style(lv_obj_t * obj, lv_style_selector_t selector) +static lv_obj_style_t * get_trans_style(lv_obj_t * obj, lv_style_selector_t selector) { uint32_t i; for(i = 0; i < obj->style_cnt; i++) { @@ -673,13 +676,13 @@ static _lv_obj_style_t * get_trans_style(lv_obj_t * obj, lv_style_selector_t se obj->style_cnt++; LV_ASSERT(obj->style_cnt != 0); - obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(_lv_obj_style_t)); + obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(lv_obj_style_t)); for(i = obj->style_cnt - 1; i > 0 ; i--) { obj->styles[i] = obj->styles[i - 1]; } - lv_memzero(&obj->styles[0], sizeof(_lv_obj_style_t)); + lv_memzero(&obj->styles[0], sizeof(lv_obj_style_t)); obj->styles[0].style = lv_malloc(sizeof(lv_style_t)); lv_style_init((lv_style_t *)obj->styles[0].style); @@ -692,7 +695,7 @@ static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_style_selector_t se lv_style_value_t * v) { - const uint32_t group = (uint32_t)1 << _lv_style_get_prop_group(prop); + const uint32_t group = (uint32_t)1 << lv_style_get_prop_group(prop); const lv_part_t part = lv_obj_style_get_selector_part(selector); const lv_state_t state = lv_obj_style_get_selector_state(selector); const lv_state_t state_inv = ~state; @@ -701,7 +704,7 @@ static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_style_selector_t se lv_style_res_t found; uint32_t i; for(i = 0; i < obj->style_cnt; i++) { - _lv_obj_style_t * obj_style = &obj->styles[i]; + lv_obj_style_t * obj_style = &obj->styles[i]; if(obj_style->is_trans == false) break; if(skip_trans) continue; @@ -717,7 +720,7 @@ static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_style_selector_t se for(; i < obj->style_cnt; i++) { if((obj->styles[i].style->has_group & group) == 0) continue; - _lv_obj_style_t * obj_style = &obj->styles[i]; + lv_obj_style_t * obj_style = &obj->styles[i]; lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); if(part_act != part) continue; @@ -785,7 +788,7 @@ static void refresh_children_style(lv_obj_t * obj) /** * Remove the transition from object's part's property. - * - Remove the transition from `_lv_obj_style_trans_ll` and free it + * - Remove the transition from `lv_obj_style_trans_ll` and free it * - Delete pending transitions * @param obj pointer to an object which transition(s) should be removed * @param part a part of object or 0xFF to remove from all parts @@ -797,12 +800,12 @@ static bool trans_delete(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, t trans_t * tr; trans_t * tr_prev; bool removed = false; - tr = _lv_ll_get_tail(style_trans_ll_p); + tr = lv_ll_get_tail(style_trans_ll_p); while(tr != NULL) { if(tr == tr_limit) break; /*'tr' might be deleted, so get the next object while 'tr' is valid*/ - tr_prev = _lv_ll_get_prev(style_trans_ll_p, tr); + tr_prev = lv_ll_get_prev(style_trans_ll_p, tr); if(tr->obj == obj && (part == tr->selector || part == LV_PART_ANY) && (prop == tr->prop || prop == LV_STYLE_PROP_ANY)) { /*Remove any transitioned properties from the trans. style @@ -816,7 +819,7 @@ static bool trans_delete(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, t /*Free the transition descriptor too*/ lv_anim_delete(tr, NULL); - _lv_ll_remove(style_trans_ll_p, tr); + lv_ll_remove(style_trans_ll_p, tr); lv_free(tr); removed = true; @@ -906,7 +909,7 @@ static void trans_anim_start_cb(lv_anim_t * a) tr->prop = prop_tmp; - _lv_obj_style_t * style_trans = get_trans_style(tr->obj, tr->selector); + lv_obj_style_t * style_trans = get_trans_style(tr->obj, tr->selector); /*Be sure `trans_style` has a valid value*/ lv_style_set_prop((lv_style_t *)style_trans->style, tr->prop, tr->start_value); lv_obj_refresh_style(tr->obj, tr->selector, tr->prop); @@ -924,7 +927,7 @@ static void trans_anim_completed_cb(lv_anim_t * a) *It allows changing it by normal styles*/ bool running = false; trans_t * tr_i; - _LV_LL_READ(style_trans_ll_p, tr_i) { + LV_LL_READ(style_trans_ll_p, tr_i) { if(tr_i != tr && tr_i->obj == tr->obj && tr_i->selector == tr->selector && tr_i->prop == tr->prop) { running = true; break; @@ -935,10 +938,10 @@ static void trans_anim_completed_cb(lv_anim_t * a) uint32_t i; for(i = 0; i < obj->style_cnt; i++) { if(obj->styles[i].is_trans && obj->styles[i].selector == tr->selector) { - _lv_ll_remove(style_trans_ll_p, tr); + lv_ll_remove(style_trans_ll_p, tr); lv_free(tr); - _lv_obj_style_t * obj_style = &obj->styles[i]; + lv_obj_style_t * obj_style = &obj->styles[i]; lv_style_remove_prop((lv_style_t *)obj_style->style, prop); if(lv_style_is_empty(obj->styles[i].style)) { @@ -976,8 +979,8 @@ static void full_cache_refresh(lv_obj_t * obj, lv_part_t part) uint32_t j; if(lv_style_is_const(style)) { lv_style_const_prop_t * props = style->values_and_props; - for(j = 0; props[j].prop_ptr; j++) { - obj->style_main_prop_is_set |= STYLE_PROP_SHIFTED(*props[j].prop_ptr); + for(j = 0; props[j].prop != LV_STYLE_PROP_INV; j++) { + obj->style_main_prop_is_set |= STYLE_PROP_SHIFTED(props[j].prop); } } else { @@ -996,8 +999,8 @@ static void full_cache_refresh(lv_obj_t * obj, lv_part_t part) uint32_t j; if(lv_style_is_const(style)) { lv_style_const_prop_t * props = style->values_and_props; - for(j = 0; props[j].prop_ptr; j++) { - obj->style_other_prop_is_set |= STYLE_PROP_SHIFTED(*props[j].prop_ptr); + for(j = 0; props[j].prop != LV_STYLE_PROP_INV; j++) { + obj->style_other_prop_is_set |= STYLE_PROP_SHIFTED(props[j].prop); } } else { @@ -1029,8 +1032,8 @@ static bool style_has_flag(const lv_style_t * style, uint32_t flag) if(lv_style_is_const(style)) { lv_style_const_prop_t * props = style->values_and_props; uint32_t i; - for(i = 0; props[i].prop_ptr; i++) { - if(lv_style_prop_has_flag(*props[i].prop_ptr, flag)) { + for(i = 0; props[i].prop != LV_STYLE_PROP_INV; i++) { + if(lv_style_prop_has_flag(props[i].prop, flag)) { return true; } } @@ -1063,14 +1066,14 @@ static lv_style_res_t get_selector_style_prop(const lv_obj_t * obj, lv_style_sel if(found == LV_STYLE_RES_FOUND) return LV_STYLE_RES_FOUND; } - extern const uint8_t _lv_style_builtin_prop_flag_lookup_table[]; + extern const uint8_t lv_style_builtin_prop_flag_lookup_table[]; bool inheritable = false; - if(prop < _LV_STYLE_NUM_BUILT_IN_PROPS) { - inheritable = _lv_style_builtin_prop_flag_lookup_table[prop] & LV_STYLE_PROP_FLAG_INHERITABLE; + if(prop < LV_STYLE_NUM_BUILT_IN_PROPS) { + inheritable = lv_style_builtin_prop_flag_lookup_table[prop] & LV_STYLE_PROP_FLAG_INHERITABLE; } else { if(_style_custom_prop_flag_lookup_table != NULL) { - inheritable = _style_custom_prop_flag_lookup_table[prop - _LV_STYLE_NUM_BUILT_IN_PROPS] & + inheritable = _style_custom_prop_flag_lookup_table[prop - LV_STYLE_NUM_BUILT_IN_PROPS] & LV_STYLE_PROP_FLAG_INHERITABLE; } } diff --git a/src/core/lv_obj_style.h b/src/core/lv_obj_style.h index c4ac4b141..6e43355b2 100644 --- a/src/core/lv_obj_style.h +++ b/src/core/lv_obj_style.h @@ -24,60 +24,20 @@ extern "C" { /********************** * TYPEDEFS **********************/ -/*Can't include lv_obj.h because it includes this header file*/ - -#ifndef LV_OBJ_H -/// @cond -/** - * Tells Doxygen to ignore a duplicate declaration - */ -typedef uint32_t lv_part_t; -typedef uint16_t lv_state_t; -/// @endcond - -#endif typedef enum { - _LV_STYLE_STATE_CMP_SAME, /*The style properties in the 2 states are identical*/ - _LV_STYLE_STATE_CMP_DIFF_REDRAW, /*The differences can be shown with a simple redraw*/ - _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD, /*The differences can be shown with a simple redraw*/ - _LV_STYLE_STATE_CMP_DIFF_LAYOUT, /*The differences can be shown with a simple redraw*/ -} _lv_style_state_cmp_t; + LV_STYLE_STATE_CMP_SAME, /*The style properties in the 2 states are identical*/ + LV_STYLE_STATE_CMP_DIFF_REDRAW, /*The differences can be shown with a simple redraw*/ + LV_STYLE_STATE_CMP_DIFF_DRAW_PAD, /*The differences can be shown with a simple redraw*/ + LV_STYLE_STATE_CMP_DIFF_LAYOUT, /*The differences can be shown with a simple redraw*/ +} lv_style_state_cmp_t; typedef uint32_t lv_style_selector_t; -typedef struct { - const lv_style_t * style; - uint32_t selector : 24; - uint32_t is_local : 1; - uint32_t is_trans : 1; -} _lv_obj_style_t; - -typedef struct { - uint16_t time; - uint16_t delay; - lv_style_selector_t selector; - lv_style_prop_t prop; - lv_anim_path_cb_t path_cb; - void * user_data; -} _lv_obj_style_transition_dsc_t; - /********************** * GLOBAL PROTOTYPES **********************/ -/** - * Initialize the object related style manager module. - * Called by LVGL in `lv_init()` - */ -void _lv_obj_style_init(void); - -/** - * Deinitialize the object related style manager module. - * Called by LVGL in `lv_deinit()` - */ -void _lv_obj_style_deinit(void); - /** * Add a style to an object. * @param obj pointer to an object @@ -187,27 +147,7 @@ bool lv_obj_remove_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_sty /** * Used internally for color filtering */ -lv_style_value_t _lv_obj_style_apply_color_filter(const lv_obj_t * obj, lv_part_t part, lv_style_value_t v); - -/** - * Used internally to create a style transition - * @param obj - * @param part - * @param prev_state - * @param new_state - * @param tr - */ -void _lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t prev_state, - lv_state_t new_state, const _lv_obj_style_transition_dsc_t * tr); - -/** - * Used internally to compare the appearance of an object in 2 states - * @param obj - * @param state1 - * @param state2 - * @return - */ -_lv_style_state_cmp_t _lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t state1, lv_state_t state2); +lv_style_value_t lv_obj_style_apply_color_filter(const lv_obj_t * obj, lv_part_t part, lv_style_value_t v); /** * Fade in an an object and all its children. @@ -351,13 +291,6 @@ static inline int32_t lv_obj_get_style_transform_scale_y_safe(const lv_obj_t * o */ lv_opa_t lv_obj_get_style_opa_recursive(const lv_obj_t * obj, lv_part_t part); -/** - * Update the layer type of a widget bayed on its current styles. - * The result will be stored in `obj->spec_attr->layer_type` - * @param obj the object whose layer should be updated - */ -void _lv_obj_update_layer_type(lv_obj_t * obj); - /********************** * MACROS **********************/ diff --git a/src/core/lv_obj_style_gen.h b/src/core/lv_obj_style_gen.h index aa9615fc4..77cf53785 100644 --- a/src/core/lv_obj_style_gen.h +++ b/src/core/lv_obj_style_gen.h @@ -17,6 +17,7 @@ extern "C" { #include "../misc/lv_area.h" #include "../misc/lv_style.h" #include "../core/lv_obj_style.h" +#include "../misc/lv_types.h" static inline int32_t lv_obj_get_style_width(const lv_obj_t * obj, lv_part_t part) { @@ -212,7 +213,7 @@ static inline lv_color_t lv_obj_get_style_bg_color(const lv_obj_t * obj, lv_part static inline lv_color_t lv_obj_get_style_bg_color_filtered(const lv_obj_t * obj, lv_part_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_COLOR)); + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_COLOR)); return v.color; } @@ -230,7 +231,8 @@ static inline lv_color_t lv_obj_get_style_bg_grad_color(const lv_obj_t * obj, lv static inline lv_color_t lv_obj_get_style_bg_grad_color_filtered(const lv_obj_t * obj, lv_part_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_COLOR)); + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, + LV_STYLE_BG_GRAD_COLOR)); return v.color; } @@ -290,7 +292,8 @@ static inline lv_color_t lv_obj_get_style_bg_image_recolor(const lv_obj_t * obj, static inline lv_color_t lv_obj_get_style_bg_image_recolor_filtered(const lv_obj_t * obj, lv_part_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_RECOLOR)); + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, + LV_STYLE_BG_IMAGE_RECOLOR)); return v.color; } @@ -314,7 +317,8 @@ static inline lv_color_t lv_obj_get_style_border_color(const lv_obj_t * obj, lv_ static inline lv_color_t lv_obj_get_style_border_color_filtered(const lv_obj_t * obj, lv_part_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_COLOR)); + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, + LV_STYLE_BORDER_COLOR)); return v.color; } @@ -356,7 +360,8 @@ static inline lv_color_t lv_obj_get_style_outline_color(const lv_obj_t * obj, lv static inline lv_color_t lv_obj_get_style_outline_color_filtered(const lv_obj_t * obj, lv_part_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_COLOR)); + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, + LV_STYLE_OUTLINE_COLOR)); return v.color; } @@ -404,7 +409,8 @@ static inline lv_color_t lv_obj_get_style_shadow_color(const lv_obj_t * obj, lv_ static inline lv_color_t lv_obj_get_style_shadow_color_filtered(const lv_obj_t * obj, lv_part_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_COLOR)); + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, + LV_STYLE_SHADOW_COLOR)); return v.color; } @@ -428,7 +434,8 @@ static inline lv_color_t lv_obj_get_style_image_recolor(const lv_obj_t * obj, lv static inline lv_color_t lv_obj_get_style_image_recolor_filtered(const lv_obj_t * obj, lv_part_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_IMAGE_RECOLOR)); + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, + LV_STYLE_IMAGE_RECOLOR)); return v.color; } @@ -470,7 +477,7 @@ static inline lv_color_t lv_obj_get_style_line_color(const lv_obj_t * obj, lv_pa static inline lv_color_t lv_obj_get_style_line_color_filtered(const lv_obj_t * obj, lv_part_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_COLOR)); + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_COLOR)); return v.color; } @@ -500,7 +507,7 @@ static inline lv_color_t lv_obj_get_style_arc_color(const lv_obj_t * obj, lv_par static inline lv_color_t lv_obj_get_style_arc_color_filtered(const lv_obj_t * obj, lv_part_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_COLOR)); + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_COLOR)); return v.color; } @@ -524,7 +531,7 @@ static inline lv_color_t lv_obj_get_style_text_color(const lv_obj_t * obj, lv_pa static inline lv_color_t lv_obj_get_style_text_color_filtered(const lv_obj_t * obj, lv_part_t part) { - lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_COLOR)); + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_COLOR)); return v.color; } diff --git a/src/core/lv_obj_style_private.h b/src/core/lv_obj_style_private.h new file mode 100644 index 000000000..7fafc58b1 --- /dev/null +++ b/src/core/lv_obj_style_private.h @@ -0,0 +1,95 @@ +/** + * @file lv_obj_style_private.h + * + */ + +#ifndef LV_OBJ_STYLE_PRIVATE_H +#define LV_OBJ_STYLE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_obj_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_obj_style_t { + const lv_style_t * style; + uint32_t selector : 24; + uint32_t is_local : 1; + uint32_t is_trans : 1; +}; + +struct lv_obj_style_transition_dsc_t { + uint16_t time; + uint16_t delay; + lv_style_selector_t selector; + lv_style_prop_t prop; + lv_anim_path_cb_t path_cb; + void * user_data; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the object related style manager module. + * Called by LVGL in `lv_init()` + */ +void lv_obj_style_init(void); + +/** + * Deinitialize the object related style manager module. + * Called by LVGL in `lv_deinit()` + */ +void lv_obj_style_deinit(void); + +/** + * Used internally to create a style transition + * @param obj + * @param part + * @param prev_state + * @param new_state + * @param tr + */ +void lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t prev_state, + lv_state_t new_state, const lv_obj_style_transition_dsc_t * tr); + +/** + * Used internally to compare the appearance of an object in 2 states + * @param obj + * @param state1 + * @param state2 + * @return + */ +lv_style_state_cmp_t lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t state1, lv_state_t state2); + +/** + * Update the layer type of a widget bayed on its current styles. + * The result will be stored in `obj->spec_attr->layer_type` + * @param obj the object whose layer should be updated + */ +void lv_obj_update_layer_type(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_STYLE_PRIVATE_H*/ diff --git a/src/core/lv_obj_tree.c b/src/core/lv_obj_tree.c index 7c9de956a..90bf44623 100644 --- a/src/core/lv_obj_tree.c +++ b/src/core/lv_obj_tree.c @@ -6,12 +6,13 @@ /********************* * INCLUDES *********************/ -#include "lv_obj.h" +#include "lv_obj_class_private.h" +#include "lv_obj_private.h" #include "../indev/lv_indev.h" #include "../indev/lv_indev_private.h" #include "../display/lv_display.h" #include "../display/lv_display_private.h" -#include "../misc/lv_anim.h" +#include "../misc/lv_anim_private.h" #include "../misc/lv_async.h" #include "../core/lv_global.h" @@ -308,7 +309,7 @@ lv_display_t * lv_obj_get_display(const lv_obj_t * obj) lv_display_t * d; lv_ll_t * disp_head = disp_ll_p; - _LV_LL_READ(disp_head, d) { + LV_LL_READ(disp_head, d) { uint32_t i; for(i = 0; i < d->screen_cnt; i++) { if(d->screens[i] == scr) return d; @@ -555,7 +556,7 @@ static void obj_delete_core(lv_obj_t * obj) } /*All children deleted. Now clean up the object specific data*/ - _lv_obj_destruct(obj); + lv_obj_destruct(obj); /*Remove the screen for the screen list*/ if(obj->parent == NULL) { diff --git a/src/core/lv_refr.c b/src/core/lv_refr.c index a5cafe4e6..d4962002c 100644 --- a/src/core/lv_refr.c +++ b/src/core/lv_refr.c @@ -6,15 +6,21 @@ /********************* * INCLUDES *********************/ -#include "lv_refr.h" +#include "../misc/lv_area_private.h" +#include "../draw/sw/lv_draw_sw_mask_private.h" +#include "../draw/lv_draw_mask_private.h" +#include "lv_obj_private.h" +#include "lv_obj_event_private.h" +#include "lv_obj_draw_private.h" +#include "lv_refr_private.h" #include "../display/lv_display.h" #include "../display/lv_display_private.h" #include "../tick/lv_tick.h" -#include "../misc/lv_timer.h" +#include "../misc/lv_timer_private.h" #include "../misc/lv_math.h" #include "../misc/lv_profiler.h" #include "../misc/lv_types.h" -#include "../draw/lv_draw.h" +#include "../draw/lv_draw_private.h" #include "../font/lv_font_fmt_txt.h" #include "../stdlib/lv_string.h" #include "lv_global.h" @@ -66,11 +72,11 @@ static void wait_for_flushing(lv_display_t * disp); /** * Initialize the screen refresh subsystem */ -void _lv_refr_init(void) +void lv_refr_init(void) { } -void _lv_refr_deinit(void) +void lv_refr_deinit(void) { } @@ -79,13 +85,13 @@ void lv_refr_now(lv_display_t * disp) lv_anim_refr_now(); if(disp) { - if(disp->refr_timer) _lv_display_refr_timer(disp->refr_timer); + if(disp->refr_timer) lv_display_refr_timer(disp->refr_timer); } else { lv_display_t * d; d = lv_display_get_next(NULL); while(d) { - if(d->refr_timer) _lv_display_refr_timer(d->refr_timer); + if(d->refr_timer) lv_display_refr_timer(d->refr_timer); d = lv_display_get_next(d); } } @@ -99,10 +105,10 @@ void lv_obj_redraw(lv_layer_t * layer, lv_obj_t * obj) /*Truncate the clip area to `obj size + ext size` area*/ lv_area_t obj_coords_ext; lv_obj_get_coords(obj, &obj_coords_ext); - int32_t ext_draw_size = _lv_obj_get_ext_draw_size(obj); + int32_t ext_draw_size = lv_obj_get_ext_draw_size(obj); lv_area_increase(&obj_coords_ext, ext_draw_size, ext_draw_size); - if(!_lv_area_intersect(&clip_coords_for_obj, &clip_area_ori, &obj_coords_ext)) return; + if(!lv_area_intersect(&clip_coords_for_obj, &clip_area_ori, &obj_coords_ext)) return; /*If the object is visible on the current clip area*/ layer->_clip_area = clip_coords_for_obj; @@ -130,7 +136,7 @@ void lv_obj_redraw(lv_layer_t * layer, lv_obj_t * obj) } lv_area_t clip_coords_for_children; bool refr_children = true; - if(!_lv_area_intersect(&clip_coords_for_children, &clip_area_ori, obj_coords)) { + if(!lv_area_intersect(&clip_coords_for_children, &clip_area_ori, obj_coords)) { refr_children = false; } @@ -183,7 +189,7 @@ void lv_obj_redraw(lv_layer_t * layer, lv_obj_t * obj) lv_area_t bottom = obj->coords; bottom.y1 = bottom.y2 - rout + 1; - if(_lv_area_intersect(&bottom, &bottom, &clip_area_ori)) { + if(lv_area_intersect(&bottom, &bottom, &clip_area_ori)) { layer_children = lv_draw_layer_create(layer, LV_COLOR_FORMAT_ARGB8888, &bottom); for(i = 0; i < child_cnt; i++) { @@ -204,7 +210,7 @@ void lv_obj_redraw(lv_layer_t * layer, lv_obj_t * obj) lv_area_t top = obj->coords; top.y2 = top.y1 + rout - 1; - if(_lv_area_intersect(&top, &top, &clip_area_ori)) { + if(lv_area_intersect(&top, &top, &clip_area_ori)) { layer_children = lv_draw_layer_create(layer, LV_COLOR_FORMAT_ARGB8888, &top); for(i = 0; i < child_cnt; i++) { @@ -227,7 +233,7 @@ void lv_obj_redraw(lv_layer_t * layer, lv_obj_t * obj) lv_area_t mid = obj->coords; mid.y1 += rout; mid.y2 -= rout; - if(_lv_area_intersect(&mid, &mid, &clip_area_ori)) { + if(lv_area_intersect(&mid, &mid, &clip_area_ori)) { layer->_clip_area = mid; for(i = 0; i < child_cnt; i++) { lv_obj_t * child = obj->spec_attr->children[i]; @@ -248,7 +254,7 @@ void lv_obj_redraw(lv_layer_t * layer, lv_obj_t * obj) layer->_clip_area = clip_area_ori; } -void _lv_inv_area(lv_display_t * disp, const lv_area_t * area_p) +void lv_inv_area(lv_display_t * disp, const lv_area_t * area_p) { if(!disp) disp = lv_display_get_default(); if(!disp) return; @@ -282,7 +288,7 @@ void _lv_inv_area(lv_display_t * disp, const lv_area_t * area_p) lv_area_t com_area; bool suc; - suc = _lv_area_intersect(&com_area, area_p, &scr_area); + suc = lv_area_intersect(&com_area, area_p, &scr_area); if(suc == false) return; /*Out of the screen*/ /*If there were at least 1 invalid area in full refresh mode, redraw the whole screen*/ @@ -299,7 +305,7 @@ void _lv_inv_area(lv_display_t * disp, const lv_area_t * area_p) /*Save only if this area is not in one of the saved areas*/ uint16_t i; for(i = 0; i < disp->inv_p; i++) { - if(_lv_area_is_in(&com_area, &disp->inv_areas[i], 0) != false) return; + if(lv_area_is_in(&com_area, &disp->inv_areas[i], 0) != false) return; } /*Save the area*/ @@ -318,7 +324,7 @@ void _lv_inv_area(lv_display_t * disp, const lv_area_t * area_p) * Get the display which is being refreshed * @return the display being refreshed */ -lv_display_t * _lv_refr_get_disp_refreshing(void) +lv_display_t * lv_refr_get_disp_refreshing(void) { return disp_refr; } @@ -327,12 +333,12 @@ lv_display_t * _lv_refr_get_disp_refreshing(void) * Get the display which is being refreshed * @return the display being refreshed */ -void _lv_refr_set_disp_refreshing(lv_display_t * disp) +void lv_refr_set_disp_refreshing(lv_display_t * disp) { disp_refr = disp; } -void _lv_display_refr_timer(lv_timer_t * tmr) +void lv_display_refr_timer(lv_timer_t * tmr) { LV_PROFILER_BEGIN; LV_TRACE_REFR("begin"); @@ -397,7 +403,7 @@ void _lv_display_refr_timer(lv_timer_t * tmr) if(disp_refr->inv_area_joined[i]) continue; - lv_area_t * sync_area = _lv_ll_ins_tail(&disp_refr->sync_areas); + lv_area_t * sync_area = lv_ll_ins_tail(&disp_refr->sync_areas); *sync_area = disp_refr->inv_areas[i]; } } @@ -409,7 +415,7 @@ void _lv_display_refr_timer(lv_timer_t * tmr) refr_finish: #if LV_DRAW_SW_COMPLEX == 1 - _lv_draw_sw_mask_cleanup(); + lv_draw_sw_mask_cleanup(); #endif lv_display_send_event(disp_refr, LV_EVENT_REFR_READY, NULL); @@ -442,11 +448,11 @@ static void lv_refr_join_area(void) } /*Check if the areas are on each other*/ - if(_lv_area_is_on(&disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]) == false) { + if(lv_area_is_on(&disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]) == false) { continue; } - _lv_area_join(&joined_area, &disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]); + lv_area_join(&joined_area, &disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]); /*Join two area only if the joined area size is smaller*/ if(lv_area_get_size(&joined_area) < (lv_area_get_size(&disp_refr->inv_areas[join_in]) + @@ -473,7 +479,7 @@ static void refr_sync_areas(void) if(!lv_display_is_double_buffered(disp_refr)) return; /*Do not sync if no sync areas*/ - if(_lv_ll_is_empty(&disp_refr->sync_areas)) return; + if(lv_ll_is_empty(&disp_refr->sync_areas)) return; LV_PROFILER_BEGIN; /*With double buffered direct mode synchronize the rendered areas to the other buffer*/ @@ -499,22 +505,22 @@ static void refr_sync_areas(void) if(disp_refr->inv_area_joined[i]) continue; /*Iterate over sync areas*/ - sync_area = _lv_ll_get_head(&disp_refr->sync_areas); + sync_area = lv_ll_get_head(&disp_refr->sync_areas); while(sync_area != NULL) { /*Get next sync area*/ - next_area = _lv_ll_get_next(&disp_refr->sync_areas, sync_area); + next_area = lv_ll_get_next(&disp_refr->sync_areas, sync_area); /*Remove intersect of redraw area from sync area and get remaining areas*/ - res_c = _lv_area_diff(res, sync_area, &disp_refr->inv_areas[i]); + res_c = lv_area_diff(res, sync_area, &disp_refr->inv_areas[i]); /*New sub areas created after removing intersect*/ if(res_c != -1) { /*Replace old sync area with new areas*/ for(j = 0; j < res_c; j++) { - new_area = _lv_ll_ins_prev(&disp_refr->sync_areas, sync_area); + new_area = lv_ll_ins_prev(&disp_refr->sync_areas, sync_area); *new_area = res[j]; } - _lv_ll_remove(&disp_refr->sync_areas, sync_area); + lv_ll_remove(&disp_refr->sync_areas, sync_area); lv_free(sync_area); } @@ -525,17 +531,17 @@ static void refr_sync_areas(void) lv_area_t disp_area = {0, 0, (int32_t)hor_res - 1, (int32_t)ver_res - 1}; /*Copy sync areas (if any remaining)*/ - for(sync_area = _lv_ll_get_head(&disp_refr->sync_areas); sync_area != NULL; - sync_area = _lv_ll_get_next(&disp_refr->sync_areas, sync_area)) { + for(sync_area = lv_ll_get_head(&disp_refr->sync_areas); sync_area != NULL; + sync_area = lv_ll_get_next(&disp_refr->sync_areas, sync_area)) { /** * @todo Resize SDL window will trigger crash because of sync_area is larger than disp_area */ - _lv_area_intersect(sync_area, sync_area, &disp_area); + lv_area_intersect(sync_area, sync_area, &disp_area); lv_draw_buf_copy(off_screen, sync_area, on_screen, sync_area); } /*Clear sync areas*/ - _lv_ll_clear(&disp_refr->sync_areas); + lv_ll_clear(&disp_refr->sync_areas); LV_PROFILER_END; } @@ -753,9 +759,9 @@ static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj) { lv_obj_t * found_p = NULL; - if(_lv_area_is_in(area_p, &obj->coords, 0) == false) return NULL; + if(lv_area_is_in(area_p, &obj->coords, 0) == false) return NULL; if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return NULL; - if(_lv_obj_get_layer_type(obj) != LV_LAYER_TYPE_NONE) return NULL; + if(lv_obj_get_layer_type(obj) != LV_LAYER_TYPE_NONE) return NULL; /*If this object is fully cover the draw area then check the children too*/ lv_cover_check_info_t info; @@ -840,7 +846,7 @@ static void refr_obj_and_children(lv_layer_t * layer, lv_obj_t * top_obj) static lv_result_t layer_get_area(lv_layer_t * layer, lv_obj_t * obj, lv_layer_type_t layer_type, lv_area_t * layer_area_out, lv_area_t * obj_draw_size_out) { - int32_t ext_draw_size = _lv_obj_get_ext_draw_size(obj); + int32_t ext_draw_size = lv_obj_get_ext_draw_size(obj); lv_obj_get_coords(obj, obj_draw_size_out); lv_area_increase(obj_draw_size_out, ext_draw_size, ext_draw_size); @@ -850,7 +856,7 @@ static lv_result_t layer_get_area(lv_layer_t * layer, lv_obj_t * obj, lv_layer_t lv_area_t clip_coords_for_obj; lv_area_t tranf_coords = *obj_draw_size_out; lv_obj_get_transformed_area(obj, &tranf_coords, LV_OBJ_POINT_TRANSFORM_FLAG_NONE); - if(!_lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, &tranf_coords)) { + if(!lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, &tranf_coords)) { return LV_RESULT_INVALID; } @@ -859,7 +865,7 @@ static lv_result_t layer_get_area(lv_layer_t * layer, lv_obj_t * obj, lv_layer_t *in order to cover transformed area after transformation.*/ lv_area_t inverse_clip_coords_for_obj = clip_coords_for_obj; lv_obj_get_transformed_area(obj, &inverse_clip_coords_for_obj, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE); - if(!_lv_area_intersect(&inverse_clip_coords_for_obj, &inverse_clip_coords_for_obj, obj_draw_size_out)) { + if(!lv_area_intersect(&inverse_clip_coords_for_obj, &inverse_clip_coords_for_obj, obj_draw_size_out)) { return LV_RESULT_INVALID; } @@ -868,7 +874,7 @@ static lv_result_t layer_get_area(lv_layer_t * layer, lv_obj_t * obj, lv_layer_t } else if(layer_type == LV_LAYER_TYPE_SIMPLE) { lv_area_t clip_coords_for_obj; - if(!_lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, obj_draw_size_out)) { + if(!lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, obj_draw_size_out)) { return LV_RESULT_INVALID; } *layer_area_out = clip_coords_for_obj; @@ -885,7 +891,7 @@ static bool alpha_test_area_on_obj(lv_obj_t * obj, const lv_area_t * area) { /*Test for alpha by assuming there is no alpha. If it fails, fall back to rendering with alpha*/ /*If the layer area is not fully on the object, it can't fully cover it*/ - if(!_lv_area_is_on(area, &obj->coords)) return true; + if(!lv_area_is_on(area, &obj->coords)) return true; lv_cover_check_info_t info; info.res = LV_COVER_RES_COVER; @@ -972,14 +978,14 @@ static bool refr_check_obj_clip_overflow(lv_layer_t * layer, lv_obj_t * obj) /*Truncate the area to the object*/ lv_area_t obj_coords; - int32_t ext_size = _lv_obj_get_ext_draw_size(obj); + int32_t ext_size = lv_obj_get_ext_draw_size(obj); lv_area_copy(&obj_coords, &obj->coords); lv_area_increase(&obj_coords, ext_size, ext_size); lv_obj_get_transformed_area(obj, &obj_coords, LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE); lv_area_t clip_coords_for_obj; - if(!_lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, &obj_coords)) { + if(!lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, &obj_coords)) { return false; } @@ -1004,7 +1010,7 @@ static void refr_obj(lv_layer_t * layer, lv_obj_t * obj) } #endif /* LV_DRAW_TRANSFORM_USE_MATRIX */ - lv_layer_type_t layer_type = _lv_obj_get_layer_type(obj); + lv_layer_type_t layer_type = lv_obj_get_layer_type(obj); if(layer_type == LV_LAYER_TYPE_NONE) { lv_obj_redraw(layer, obj); } diff --git a/src/core/lv_refr.h b/src/core/lv_refr.h index ddfa61c17..6b756edb5 100644 --- a/src/core/lv_refr.h +++ b/src/core/lv_refr.h @@ -41,16 +41,6 @@ extern "C" { * GLOBAL FUNCTIONS **********************/ -/** - * Initialize the screen refresh subsystem - */ -void _lv_refr_init(void); - -/** - * Deinitialize the screen refresh subsystem - */ -void _lv_refr_deinit(void); - /** * Redraw the invalidated areas now. * Normally the redrawing is periodically executed in `lv_timer_handler` but a long blocking process @@ -67,32 +57,6 @@ void lv_refr_now(lv_display_t * disp); */ void lv_obj_redraw(lv_layer_t * layer, lv_obj_t * obj); -/** - * Invalidate an area on display to redraw it - * @param area_p pointer to area which should be invalidated (NULL: delete the invalidated areas) - * @param disp pointer to display where the area should be invalidated (NULL can be used if there is - * only one display) - */ -void _lv_inv_area(lv_display_t * disp, const lv_area_t * area_p); - -/** - * Get the display which is being refreshed - * @return the display being refreshed - */ -lv_display_t * _lv_refr_get_disp_refreshing(void); - -/** - * Set the display which is being refreshed - * @param disp the display being refreshed - */ -void _lv_refr_set_disp_refreshing(lv_display_t * disp); - -/** - * Called periodically to handle the refreshing - * @param timer pointer to the timer itself - */ -void _lv_display_refr_timer(lv_timer_t * timer); - /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/core/lv_refr_private.h b/src/core/lv_refr_private.h new file mode 100644 index 000000000..8f840780b --- /dev/null +++ b/src/core/lv_refr_private.h @@ -0,0 +1,75 @@ +/** + * @file lv_refr_private.h + * + */ + +#ifndef LV_REFR_PRIVATE_H +#define LV_REFR_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_refr.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the screen refresh subsystem + */ +void lv_refr_init(void); + +/** + * Deinitialize the screen refresh subsystem + */ +void lv_refr_deinit(void); + +/** + * Invalidate an area on display to redraw it + * @param area_p pointer to area which should be invalidated (NULL: delete the invalidated areas) + * @param disp pointer to display where the area should be invalidated (NULL can be used if there is + * only one display) + */ +void lv_inv_area(lv_display_t * disp, const lv_area_t * area_p); + +/** + * Get the display which is being refreshed + * @return the display being refreshed + */ +lv_display_t * lv_refr_get_disp_refreshing(void); + +/** + * Set the display which is being refreshed + * @param disp the display being refreshed + */ +void lv_refr_set_disp_refreshing(lv_display_t * disp); + +/** + * Called periodically to handle the refreshing + * @param timer pointer to the timer itself + */ +void lv_display_refr_timer(lv_timer_t * timer); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_REFR_PRIVATE_H*/ diff --git a/src/display/lv_display.c b/src/display/lv_display.c index 3ec8cc7d1..9f264e818 100644 --- a/src/display/lv_display.c +++ b/src/display/lv_display.c @@ -6,9 +6,13 @@ /********************* * INCLUDES *********************/ +#include "../misc/lv_event_private.h" +#include "../misc/lv_anim_private.h" +#include "../draw/lv_draw_private.h" +#include "../core/lv_obj_private.h" #include "lv_display.h" #include "../misc/lv_math.h" -#include "../core/lv_refr.h" +#include "../core/lv_refr_private.h" #include "../display/lv_display_private.h" #include "../stdlib/lv_string.h" #include "../themes/lv_theme.h" @@ -57,7 +61,7 @@ static void disp_event_cb(lv_event_t * e); lv_display_t * lv_display_create(int32_t hor_res, int32_t ver_res) { - lv_display_t * disp = _lv_ll_ins_head(disp_ll_p); + lv_display_t * disp = lv_ll_ins_head(disp_ll_p); LV_ASSERT_MALLOC(disp); if(!disp) return NULL; @@ -87,13 +91,13 @@ lv_display_t * lv_display_create(int32_t hor_res, int32_t ver_res) disp->inv_en_cnt = 1; disp->last_activity_time = lv_tick_get(); - _lv_ll_init(&disp->sync_areas, sizeof(lv_area_t)); + lv_ll_init(&disp->sync_areas, sizeof(lv_area_t)); lv_display_t * disp_def_tmp = disp_def; disp_def = disp; /*Temporarily change the default screen to create the default screens on the new display*/ /*Create a refresh timer*/ - disp->refr_timer = lv_timer_create(_lv_display_refr_timer, LV_DEF_REFR_PERIOD, disp); + disp->refr_timer = lv_timer_create(lv_display_refr_timer, LV_DEF_REFR_PERIOD, disp); LV_ASSERT_MALLOC(disp->refr_timer); if(disp->refr_timer == NULL) { lv_free(disp); @@ -191,8 +195,8 @@ void lv_display_delete(lv_display_t * disp) lv_obj_delete(disp->screens[0]); } - _lv_ll_clear(&disp->sync_areas); - _lv_ll_remove(disp_ll_p, disp); + lv_ll_clear(&disp->sync_areas); + lv_ll_remove(disp_ll_p, disp); if(disp->refr_timer) lv_timer_delete(disp->refr_timer); if(disp->layer_deinit) disp->layer_deinit(disp, disp->layer_head); @@ -200,7 +204,7 @@ void lv_display_delete(lv_display_t * disp) lv_free(disp); - if(was_default) lv_display_set_default(_lv_ll_get_head(disp_ll_p)); + if(was_default) lv_display_set_default(lv_ll_get_head(disp_ll_p)); } void lv_display_set_default(lv_display_t * disp) @@ -216,9 +220,9 @@ lv_display_t * lv_display_get_default(void) lv_display_t * lv_display_get_next(lv_display_t * disp) { if(disp == NULL) - return _lv_ll_get_head(disp_ll_p); + return lv_ll_get_head(disp_ll_p); else - return _lv_ll_get_next(disp_ll_p, disp); + return lv_ll_get_next(disp_ll_p, disp); } /*--------------------- @@ -570,7 +574,7 @@ lv_obj_t * lv_display_get_layer_bottom(lv_display_t * disp) return disp->bottom_layer; } -void lv_screen_load(struct _lv_obj_t * scr) +void lv_screen_load(struct lv_obj_t * scr) { lv_screen_load_anim(scr, LV_SCR_LOAD_ANIM_NONE, 0, 0, false); } @@ -962,6 +966,36 @@ void lv_display_rotate_area(lv_display_t * disp, lv_area_t * area) } } +lv_obj_t * lv_screen_active(void) +{ + return lv_display_get_screen_active(lv_display_get_default()); +} + +lv_obj_t * lv_layer_top(void) +{ + return lv_display_get_layer_top(lv_display_get_default()); +} + +lv_obj_t * lv_layer_sys(void) +{ + return lv_display_get_layer_sys(lv_display_get_default()); +} + +lv_obj_t * lv_layer_bottom(void) +{ + return lv_display_get_layer_bottom(lv_display_get_default()); +} + +int32_t lv_dpx(int32_t n) +{ + return LV_DPX(n); +} + +int32_t lv_display_dpx(const lv_display_t * disp, int32_t n) +{ + return LV_DPX_CALC(lv_display_get_dpi(disp), n); +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/display/lv_display.h b/src/display/lv_display.h index 9ce81552b..e3e7c49f2 100644 --- a/src/display/lv_display.h +++ b/src/display/lv_display.h @@ -374,7 +374,7 @@ lv_obj_t * lv_display_get_layer_bottom(lv_display_t * disp); * Load a screen on the default display * @param scr pointer to a screen */ -void lv_screen_load(struct _lv_obj_t * scr); +void lv_screen_load(struct lv_obj_t * scr); /** * Switch screen with animation @@ -391,37 +391,25 @@ void lv_screen_load_anim(lv_obj_t * scr, lv_screen_load_anim_t anim_type, uint32 * Get the active screen of the default display * @return pointer to the active screen */ -static inline lv_obj_t * lv_screen_active(void) -{ - return lv_display_get_screen_active(lv_display_get_default()); -} +lv_obj_t * lv_screen_active(void); /** * Get the top layer of the default display * @return pointer to the top layer */ -static inline lv_obj_t * lv_layer_top(void) -{ - return lv_display_get_layer_top(lv_display_get_default()); -} +lv_obj_t * lv_layer_top(void); /** * Get the system layer of the default display * @return pointer to the sys layer */ -static inline lv_obj_t * lv_layer_sys(void) -{ - return lv_display_get_layer_sys(lv_display_get_default()); -} +lv_obj_t * lv_layer_sys(void); /** * Get the bottom layer of the default display * @return pointer to the bottom layer */ -static inline lv_obj_t * lv_layer_bottom(void) -{ - return lv_display_get_layer_bottom(lv_display_get_default()); -} +lv_obj_t * lv_layer_bottom(void); /*--------------------- * OTHERS @@ -574,8 +562,8 @@ void lv_display_rotate_area(lv_display_t * disp, lv_area_t * area); * 1 dip is 2 px on a 320 DPI screen * https://stackoverflow.com/questions/2025282/what-is-the-difference-between-px-dip-dp-and-sp */ -#define _LV_DPX_CALC(dpi, n) ((n) == 0 ? 0 :LV_MAX((( (dpi) * (n) + 80) / 160), 1)) /*+80 for rounding*/ -#define LV_DPX(n) _LV_DPX_CALC(lv_display_get_dpi(NULL), n) +#define LV_DPX_CALC(dpi, n) ((n) == 0 ? 0 :LV_MAX((( (dpi) * (n) + 80) / 160), 1)) /*+80 for rounding*/ +#define LV_DPX(n) LV_DPX_CALC(lv_display_get_dpi(NULL), n) /** * Scale the given number of pixels (a distance or size) relative to a 160 DPI display @@ -585,10 +573,7 @@ void lv_display_rotate_area(lv_display_t * disp, lv_area_t * area); * @param n the number of pixels to scale * @return `n x current_dpi/160` */ -static inline int32_t lv_dpx(int32_t n) -{ - return LV_DPX(n); -} +int32_t lv_dpx(int32_t n); /** * Scale the given number of pixels (a distance or size) relative to a 160 DPI display @@ -599,10 +584,7 @@ static inline int32_t lv_dpx(int32_t n) * @param n the number of pixels to scale * @return `n x current_dpi/160` */ -static inline int32_t lv_display_dpx(const lv_display_t * disp, int32_t n) -{ - return _LV_DPX_CALC(lv_display_get_dpi(disp), n); -} +int32_t lv_display_dpx(const lv_display_t * disp, int32_t n); #ifdef __cplusplus } /*extern "C"*/ diff --git a/src/display/lv_display_private.h b/src/display/lv_display_private.h index b9ea9c50c..1fb7f409c 100644 --- a/src/display/lv_display_private.h +++ b/src/display/lv_display_private.h @@ -19,7 +19,7 @@ extern "C" { #include "lv_display.h" #if LV_USE_SYSMON -#include "../others/sysmon/lv_sysmon.h" +#include "../others/sysmon/lv_sysmon_private.h" #endif /********************* @@ -33,7 +33,7 @@ extern "C" { * TYPEDEFS **********************/ -struct _lv_display_t { +struct lv_display_t { /*--------------------- * Resolution diff --git a/src/draw/lv_draw.c b/src/draw/lv_draw.c index 1a72f04dd..777863a8f 100644 --- a/src/draw/lv_draw.c +++ b/src/draw/lv_draw.c @@ -6,11 +6,12 @@ /********************* * INCLUDES *********************/ -#include "lv_draw.h" +#include "../misc/lv_area_private.h" +#include "lv_draw_private.h" #include "sw/lv_draw_sw.h" #include "../display/lv_display_private.h" #include "../core/lv_global.h" -#include "../core/lv_refr.h" +#include "../core/lv_refr_private.h" #include "../stdlib/lv_string.h" /********************* @@ -289,8 +290,8 @@ lv_draw_task_t * lv_draw_get_next_available_task(lv_layer_t * layer, lv_draw_tas LV_PROFILER_BEGIN; /*If the first task is screen sized, there cannot be independent areas*/ if(layer->draw_task_head) { - int32_t hor_res = lv_display_get_horizontal_resolution(_lv_refr_get_disp_refreshing()); - int32_t ver_res = lv_display_get_vertical_resolution(_lv_refr_get_disp_refreshing()); + int32_t hor_res = lv_display_get_horizontal_resolution(lv_refr_get_disp_refreshing()); + int32_t ver_res = lv_display_get_vertical_resolution(lv_refr_get_disp_refreshing()); lv_draw_task_t * t = layer->draw_task_head; if(t->state != LV_DRAW_TASK_STATE_QUEUED && t->area.x1 <= 0 && t->area.x2 >= hor_res - 1 && @@ -327,7 +328,7 @@ uint32_t lv_draw_get_dependent_count(lv_draw_task_t * t_check) lv_draw_task_t * t = t_check->next; while(t) { if((t->state == LV_DRAW_TASK_STATE_QUEUED || t->state == LV_DRAW_TASK_STATE_WAITING) && - _lv_area_is_on(&t_check->area, &t->area)) { + lv_area_is_on(&t_check->area, &t->area)) { cnt++; } @@ -339,7 +340,7 @@ uint32_t lv_draw_get_dependent_count(lv_draw_task_t * t_check) lv_layer_t * lv_draw_layer_create(lv_layer_t * parent_layer, lv_color_format_t color_format, const lv_area_t * area) { - lv_display_t * disp = _lv_refr_get_disp_refreshing(); + lv_display_t * disp = lv_refr_get_disp_refreshing(); lv_layer_t * new_layer = lv_malloc_zeroed(sizeof(lv_layer_t)); LV_ASSERT_MALLOC(new_layer); if(new_layer == NULL) return NULL; @@ -399,6 +400,21 @@ void * lv_draw_layer_go_to_xy(lv_layer_t * layer, int32_t x, int32_t y) return lv_draw_buf_goto_xy(layer->draw_buf, x, y); } +lv_draw_task_type_t lv_draw_task_get_type(const lv_draw_task_t * t) +{ + return t->type; +} + +void * lv_draw_task_get_draw_dsc(const lv_draw_task_t * t) +{ + return t->draw_dsc; +} + +void lv_draw_task_get_area(const lv_draw_task_t * t, lv_area_t * area) +{ + *area = t->area; +} + /********************** * STATIC FUNCTIONS **********************/ @@ -418,7 +434,7 @@ static bool is_independent(lv_layer_t * layer, lv_draw_task_t * t_check) while(t && t != t_check) { if(t->state != LV_DRAW_TASK_STATE_READY) { lv_area_t a; - if(_lv_area_intersect(&a, &t->_real_area, &t_check->_real_area)) { + if(lv_area_intersect(&a, &t->_real_area, &t_check->_real_area)) { LV_PROFILER_END; return false; } diff --git a/src/draw/lv_draw.h b/src/draw/lv_draw.h index 6056058d6..b0060ea86 100644 --- a/src/draw/lv_draw.h +++ b/src/draw/lv_draw.h @@ -41,6 +41,7 @@ extern "C" { **********************/ typedef enum { + LV_DRAW_TASK_TYPE_NONE = 0, LV_DRAW_TASK_TYPE_FILL, LV_DRAW_TASK_TYPE_BORDER, LV_DRAW_TASK_TYPE_BOX_SHADOW, @@ -62,102 +63,7 @@ typedef enum { LV_DRAW_TASK_STATE_READY, } lv_draw_task_state_t; -struct _lv_draw_task_t { - lv_draw_task_t * next; - - lv_draw_task_type_t type; - - /** - * The area where to draw - */ - lv_area_t area; - - /** - * The real draw area. E.g. for shadow, outline, or transformed images it's different from `area` - */ - lv_area_t _real_area; - - /** The original area which is updated*/ - lv_area_t clip_area_original; - - /** - * The clip area of the layer is saved here when the draw task is created. - * As the clip area of the layer can be changed as new draw tasks are added its current value needs to be saved. - * Therefore during drawing the layer's clip area shouldn't be used as it might be already changed for other draw tasks. - */ - lv_area_t clip_area; - -#if LV_DRAW_TRANSFORM_USE_MATRIX - /** Transform matrix to be applied when rendering the layer */ - lv_matrix_t matrix; -#endif - - volatile int state; /*int instead of lv_draw_task_state_t to be sure its atomic*/ - - void * draw_dsc; - - /** - * The ID of the draw_unit which should take this task - */ - uint8_t preferred_draw_unit_id; - - /** - * Set to which extent `preferred_draw_unit_id` is good at this task. - * 80: means 20% better (faster) than software rendering - * 100: the default value - * 110: means 10% worse (slower) than software rendering - */ - uint8_t preference_score; - -}; - -typedef struct { - void * user_data; -} lv_draw_mask_t; - -struct _lv_draw_unit_t { - lv_draw_unit_t * next; - - /** - * The target_layer on which drawing should happen - */ - lv_layer_t * target_layer; - - const lv_area_t * clip_area; - - /** - * Called to try to assign a draw task to itself. - * `lv_draw_get_next_available_task` can be used to get an independent draw task. - * A draw task should be assign only if the draw unit can draw it too - * @param draw_unit pointer to the draw unit - * @param layer pointer to a layer on which the draw task should be drawn - * @return >=0: The number of taken draw task: - * 0 means the task has not yet been completed. - * 1 means a new task has been accepted. - * -1: The draw unit wanted to work on a task but couldn't do that - * due to some errors (e.g. out of memory). - * It signals that LVGL should call the dispatcher later again - * to let draw unit try to start the rendering again. - */ - int32_t (*dispatch_cb)(lv_draw_unit_t * draw_unit, lv_layer_t * layer); - - /** - * - * @param draw_unit - * @param task - * @return - */ - int32_t (*evaluate_cb)(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); - - /** - * Called to delete draw unit. - * @param draw_unit - * @return - */ - int32_t (*delete_cb)(lv_draw_unit_t * draw_unit); -}; - -struct _lv_layer_t { +struct lv_layer_t { /** Target draw buffer of the layer*/ lv_draw_buf_t * draw_buf; @@ -202,18 +108,6 @@ typedef struct { void * user_data; } lv_draw_dsc_base_t; -typedef struct { - lv_draw_unit_t * unit_head; - uint32_t used_memory_for_layers_kb; -#if LV_USE_OS - lv_thread_sync_t sync; -#else - int dispatch_req; -#endif - lv_mutex_t circle_cache_mutex; - bool task_running; -} lv_draw_global_info_t; - /********************** * GLOBAL PROTOTYPES **********************/ @@ -322,6 +216,27 @@ void * lv_draw_layer_alloc_buf(lv_layer_t * layer); */ void * lv_draw_layer_go_to_xy(lv_layer_t * layer, int32_t x, int32_t y); +/** + * Get the type of a draw task + * @param t the draw task to get the type of + * @return the draw task type +*/ +lv_draw_task_type_t lv_draw_task_get_type(const lv_draw_task_t * t); + +/** + * Get the draw descriptor of a draw task + * @param t the draw task to get the draw descriptor of + * @return a void pointer to the draw descriptor +*/ +void * lv_draw_task_get_draw_dsc(const lv_draw_task_t * t); + +/** + * Get the draw area of a draw task + * @param t the draw task to get the draw area of + * @param area the destination where the draw area will be stored +*/ +void lv_draw_task_get_area(const lv_draw_task_t * t, lv_area_t * area); + /********************** * GLOBAL VARIABLES **********************/ diff --git a/src/draw/lv_draw_arc.c b/src/draw/lv_draw_arc.c index 634c0429e..670aedec4 100644 --- a/src/draw/lv_draw_arc.c +++ b/src/draw/lv_draw_arc.c @@ -6,6 +6,7 @@ /********************* * INCLUDES *********************/ +#include "lv_draw_private.h" #include "../core/lv_obj.h" #include "lv_draw_arc.h" #include "../core/lv_obj_event.h" diff --git a/src/draw/lv_draw_buf.c b/src/draw/lv_draw_buf.c index ff080a0bc..d265b0217 100644 --- a/src/draw/lv_draw_buf.c +++ b/src/draw/lv_draw_buf.c @@ -7,10 +7,11 @@ * INCLUDES *********************/ #include "../misc/lv_types.h" -#include "lv_draw_buf.h" +#include "lv_draw_buf_private.h" #include "../stdlib/lv_string.h" #include "../core/lv_global.h" #include "../misc/lv_math.h" +#include "../misc/lv_area_private.h" /********************* * DEFINES @@ -48,7 +49,7 @@ static void draw_buf_get_full_area(const lv_draw_buf_t * draw_buf, lv_area_t * f * GLOBAL FUNCTIONS **********************/ -void _lv_draw_buf_init_handlers(void) +void lv_draw_buf_init_handlers(void) { lv_draw_buf_init_with_default_handlers(&default_handlers); lv_draw_buf_init_with_default_handlers(&font_draw_buf_handlers); @@ -57,10 +58,10 @@ void _lv_draw_buf_init_handlers(void) void lv_draw_buf_init_with_default_handlers(lv_draw_buf_handlers_t * handlers) { - lv_draw_buf_init_handlers(handlers, buf_malloc, buf_free, buf_align, NULL, NULL, width_to_stride); + lv_draw_buf_handlers_init(handlers, buf_malloc, buf_free, buf_align, NULL, NULL, width_to_stride); } -void lv_draw_buf_init_handlers(lv_draw_buf_handlers_t * handlers, +void lv_draw_buf_handlers_init(lv_draw_buf_handlers_t * handlers, lv_draw_buf_malloc_cb buf_malloc_cb, lv_draw_buf_free_cb buf_free_cb, lv_draw_buf_align_cb align_pointer_cb, @@ -171,7 +172,7 @@ void lv_draw_buf_clear(lv_draw_buf_t * draw_buf, const lv_area_t * a) a_draw_buf.y2 = draw_buf->header.h - 1; lv_area_t a_clipped; - if(!_lv_area_intersect(&a_clipped, a, &a_draw_buf)) return; + if(!lv_area_intersect(&a_clipped, a, &a_draw_buf)) return; if(lv_area_get_width(&a_clipped) <= 0) return; if(lv_area_get_height(&a_clipped) <= 0) return; @@ -543,6 +544,49 @@ void lv_draw_buf_set_palette(lv_draw_buf_t * draw_buf, uint8_t index, lv_color32 palette[index] = color; } +bool lv_draw_buf_has_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag) +{ + return draw_buf->header.flags & flag; +} + +void lv_draw_buf_set_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag) +{ + draw_buf->header.flags |= flag; +} + +void lv_draw_buf_clear_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag) +{ + draw_buf->header.flags &= ~flag; +} + +void lv_draw_buf_from_image(lv_draw_buf_t * buf, const lv_image_dsc_t * img) +{ + lv_memcpy(buf, img, sizeof(lv_image_dsc_t)); + buf->unaligned_data = buf->data; +} + +void lv_draw_buf_to_image(const lv_draw_buf_t * buf, lv_image_dsc_t * img) +{ + lv_memcpy((void *)img, buf, sizeof(lv_image_dsc_t)); +} + +void lv_image_buf_set_palette(lv_image_dsc_t * dsc, uint8_t id, lv_color32_t c) +{ + LV_LOG_WARN("Deprecated API, use lv_draw_buf_set_palette instead."); + lv_draw_buf_set_palette((lv_draw_buf_t *)dsc, id, c); +} + +void lv_image_buf_free(lv_image_dsc_t * dsc) +{ + LV_LOG_WARN("Deprecated API, use lv_draw_buf_destroy instead."); + if(dsc != NULL) { + if(dsc->data != NULL) + lv_free((void *)dsc->data); + + lv_free((void *)dsc); + } +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/draw/lv_draw_buf.h b/src/draw/lv_draw_buf.h index e120ae26a..8c6e98dbe 100644 --- a/src/draw/lv_draw_buf.h +++ b/src/draw/lv_draw_buf.h @@ -43,12 +43,12 @@ typedef struct { * Refine it to suit your needs. */ -#define _LV_DRAW_BUF_STRIDE(w, cf) \ +#define LV_DRAW_BUF_STRIDE(w, cf) \ LV_ROUND_UP(((w) * LV_COLOR_FORMAT_GET_BPP(cf) + 7) / 8, LV_DRAW_BUF_STRIDE_ALIGN) /* Allocate a slightly larger buffer, so we can adjust the start address to meet alignment */ -#define _LV_DRAW_BUF_SIZE(w, h, cf) \ - (_LV_DRAW_BUF_STRIDE(w, cf) * (h) + LV_DRAW_BUF_ALIGN + \ +#define LV_DRAW_BUF_SIZE(w, h, cf) \ + (LV_DRAW_BUF_STRIDE(w, cf) * (h) + LV_DRAW_BUF_ALIGN + \ LV_COLOR_INDEXED_PALETTE_SIZE(cf) * sizeof(lv_color32_t)) /** @@ -58,7 +58,7 @@ typedef struct { * For platform that needs special buffer alignment, call LV_DRAW_BUF_INIT_STATIC. */ #define LV_DRAW_BUF_DEFINE_STATIC(name, _w, _h, _cf) \ - static uint8_t buf_##name[_LV_DRAW_BUF_SIZE(_w, _h, _cf)]; \ + static uint8_t buf_##name[LV_DRAW_BUF_SIZE(_w, _h, _cf)]; \ static lv_draw_buf_t name = { \ .header = { \ .magic = LV_IMAGE_HEADER_MAGIC, \ @@ -66,7 +66,7 @@ typedef struct { .flags = LV_IMAGE_FLAGS_MODIFIABLE, \ .w = (_w), \ .h = (_h), \ - .stride = _LV_DRAW_BUF_STRIDE(_w, _cf), \ + .stride = LV_DRAW_BUF_STRIDE(_w, _cf), \ .reserved_2 = 0, \ }, \ .data_size = sizeof(buf_##name), \ @@ -91,24 +91,10 @@ typedef void (*lv_draw_buf_cache_operation_cb)(const lv_draw_buf_t * draw_buf, c typedef uint32_t (*lv_draw_buf_width_to_stride_cb)(uint32_t w, lv_color_format_t color_format); -typedef struct { - lv_draw_buf_malloc_cb buf_malloc_cb; - lv_draw_buf_free_cb buf_free_cb; - lv_draw_buf_align_cb align_pointer_cb; - lv_draw_buf_cache_operation_cb invalidate_cache_cb; - lv_draw_buf_cache_operation_cb flush_cache_cb; - lv_draw_buf_width_to_stride_cb width_to_stride_cb; -} lv_draw_buf_handlers_t; - /********************** * GLOBAL PROTOTYPES **********************/ -/** - * Called internally to initialize the draw_buf_handlers in lv_global - */ -void _lv_draw_buf_init_handlers(void); - /** * Initialize the draw buffer with the default handlers. * @@ -126,7 +112,7 @@ void lv_draw_buf_init_with_default_handlers(lv_draw_buf_handlers_t * handlers); * @param invalidate_cache_cb the callback to invalidate the cache of the buffer * @param width_to_stride_cb the callback to calculate the stride based on the width and color format */ -void lv_draw_buf_init_handlers(lv_draw_buf_handlers_t * handlers, +void lv_draw_buf_handlers_init(lv_draw_buf_handlers_t * handlers, lv_draw_buf_malloc_cb buf_malloc_cb, lv_draw_buf_free_cb buf_free_cb, lv_draw_buf_align_cb align_pointer_cb, @@ -341,36 +327,20 @@ lv_result_t lv_draw_buf_adjust_stride(lv_draw_buf_t * src, uint32_t stride); */ lv_result_t lv_draw_buf_premultiply(lv_draw_buf_t * draw_buf); -static inline bool lv_draw_buf_has_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag) -{ - return draw_buf->header.flags & flag; -} +bool lv_draw_buf_has_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag); -static inline void lv_draw_buf_set_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag) -{ - draw_buf->header.flags |= flag; -} +void lv_draw_buf_set_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag); -static inline void lv_draw_buf_clear_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag) -{ - draw_buf->header.flags &= ~flag; -} +void lv_draw_buf_clear_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag); /** * As of now, draw buf share same definition as `lv_image_dsc_t`. * And is interchangeable with `lv_image_dsc_t`. */ -static inline void lv_draw_buf_from_image(lv_draw_buf_t * buf, const lv_image_dsc_t * img) -{ - lv_memcpy(buf, img, sizeof(lv_image_dsc_t)); - buf->unaligned_data = buf->data; -} +void lv_draw_buf_from_image(lv_draw_buf_t * buf, const lv_image_dsc_t * img); -static inline void lv_draw_buf_to_image(const lv_draw_buf_t * buf, lv_image_dsc_t * img) -{ - lv_memcpy((void *)img, buf, sizeof(lv_image_dsc_t)); -} +void lv_draw_buf_to_image(const lv_draw_buf_t * buf, lv_image_dsc_t * img); /** * Set the palette color of an indexed image. Valid only for `LV_COLOR_FORMAT_I1/2/4/8` @@ -387,26 +357,13 @@ void lv_draw_buf_set_palette(lv_draw_buf_t * draw_buf, uint8_t index, lv_color32 /** * @deprecated Use lv_draw_buf_set_palette instead. */ -static inline void lv_image_buf_set_palette(lv_image_dsc_t * dsc, uint8_t id, lv_color32_t c) -{ - LV_LOG_WARN("Deprecated API, use lv_draw_buf_set_palette instead."); - lv_draw_buf_set_palette((lv_draw_buf_t *)dsc, id, c); -} +void lv_image_buf_set_palette(lv_image_dsc_t * dsc, uint8_t id, lv_color32_t c); /** * @deprecated Use lv_draw_buffer_create/destroy instead. * Free the data pointer and dsc struct of an image. */ -static inline void lv_image_buf_free(lv_image_dsc_t * dsc) -{ - LV_LOG_WARN("Deprecated API, use lv_draw_buf_destroy instead."); - if(dsc != NULL) { - if(dsc->data != NULL) - lv_free((void *)dsc->data); - - lv_free((void *)dsc); - } -} +void lv_image_buf_free(lv_image_dsc_t * dsc); /********************** * MACROS diff --git a/src/draw/lv_draw_buf_private.h b/src/draw/lv_draw_buf_private.h new file mode 100644 index 000000000..051f9ba7c --- /dev/null +++ b/src/draw/lv_draw_buf_private.h @@ -0,0 +1,53 @@ +/** + * @file lv_draw_buf_private.h + * + */ + +#ifndef LV_DRAW_BUF_PRIVATE_H +#define LV_DRAW_BUF_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_buf.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_draw_buf_handlers_t { + lv_draw_buf_malloc_cb buf_malloc_cb; + lv_draw_buf_free_cb buf_free_cb; + lv_draw_buf_align_cb align_pointer_cb; + lv_draw_buf_cache_operation_cb invalidate_cache_cb; + lv_draw_buf_cache_operation_cb flush_cache_cb; + lv_draw_buf_width_to_stride_cb width_to_stride_cb; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Called internally to initialize the draw_buf_handlers in lv_global + */ +void lv_draw_buf_init_handlers(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_BUF_PRIVATE_H*/ diff --git a/src/draw/lv_draw_image.c b/src/draw/lv_draw_image.c index b4ffb9ad5..f051831e2 100644 --- a/src/draw/lv_draw_image.c +++ b/src/draw/lv_draw_image.c @@ -6,7 +6,10 @@ /********************* * INCLUDES *********************/ -#include "lv_draw_image.h" +#include "../misc/lv_area_private.h" +#include "lv_image_decoder_private.h" +#include "lv_draw_private.h" +#include "lv_draw_image_private.h" #include "../display/lv_display.h" #include "../misc/lv_log.h" #include "../misc/lv_math.h" @@ -69,8 +72,8 @@ void lv_draw_layer(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv t->type = LV_DRAW_TASK_TYPE_LAYER; t->state = LV_DRAW_TASK_STATE_WAITING; - _lv_image_buf_get_transformed_area(&t->_real_area, lv_area_get_width(coords), lv_area_get_height(coords), - dsc->rotation, dsc->scale_x, dsc->scale_y, &dsc->pivot); + lv_image_buf_get_transformed_area(&t->_real_area, lv_area_get_width(coords), lv_area_get_height(coords), + dsc->rotation, dsc->scale_x, dsc->scale_y, &dsc->pivot); lv_area_move(&t->_real_area, coords->x1, coords->y1); lv_layer_t * layer_to_draw = (lv_layer_t *)dsc->src; @@ -102,8 +105,8 @@ void lv_draw_image(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv t->draw_dsc = new_image_dsc; t->type = LV_DRAW_TASK_TYPE_IMAGE; - _lv_image_buf_get_transformed_area(&t->_real_area, lv_area_get_width(coords), lv_area_get_height(coords), - dsc->rotation, dsc->scale_x, dsc->scale_y, &dsc->pivot); + lv_image_buf_get_transformed_area(&t->_real_area, lv_area_get_width(coords), lv_area_get_height(coords), + dsc->rotation, dsc->scale_x, dsc->scale_y, &dsc->pivot); lv_area_move(&t->_real_area, coords->x1, coords->y1); lv_draw_finalize_task_creation(layer, t); @@ -127,8 +130,8 @@ lv_image_src_t lv_image_src_get_type(const void * src) } } -void _lv_draw_image_normal_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb) +void lv_draw_image_normal_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb) { if(draw_core_cb == NULL) { LV_LOG_WARN("draw_core_cb is NULL"); @@ -141,8 +144,8 @@ void _lv_draw_image_normal_helper(lv_draw_unit_t * draw_unit, const lv_draw_imag int32_t w = lv_area_get_width(coords); int32_t h = lv_area_get_height(coords); - _lv_image_buf_get_transformed_area(&draw_area, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, - &draw_dsc->pivot); + lv_image_buf_get_transformed_area(&draw_area, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, + &draw_dsc->pivot); draw_area.x1 += coords->x1; draw_area.y1 += coords->y1; @@ -151,7 +154,7 @@ void _lv_draw_image_normal_helper(lv_draw_unit_t * draw_unit, const lv_draw_imag } lv_area_t clipped_img_area; - if(!_lv_area_intersect(&clipped_img_area, &draw_area, draw_unit->clip_area)) { + if(!lv_area_intersect(&clipped_img_area, &draw_area, draw_unit->clip_area)) { return; } @@ -167,8 +170,8 @@ void _lv_draw_image_normal_helper(lv_draw_unit_t * draw_unit, const lv_draw_imag lv_image_decoder_close(&decoder_dsc); } -void _lv_draw_image_tiled_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb) +void lv_draw_image_tiled_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb) { if(draw_core_cb == NULL) { LV_LOG_WARN("draw_core_cb is NULL"); @@ -208,7 +211,7 @@ void _lv_draw_image_tiled_helper(lv_draw_unit_t * draw_unit, const lv_draw_image while(tile_area.x1 <= coords->x2) { lv_area_t clipped_img_area; - if(_lv_area_intersect(&clipped_img_area, &tile_area, coords)) { + if(lv_area_intersect(&clipped_img_area, &tile_area, coords)) { img_decode_and_draw(draw_unit, draw_dsc, &decoder_dsc, &relative_decoded_area, &tile_area, &clipped_img_area, draw_core_cb); } @@ -226,8 +229,8 @@ void _lv_draw_image_tiled_helper(lv_draw_unit_t * draw_unit, const lv_draw_image lv_image_decoder_close(&decoder_dsc); } -void _lv_image_buf_get_transformed_area(lv_area_t * res, int32_t w, int32_t h, int32_t angle, - uint16_t scale_x, uint16_t scale_y, const lv_point_t * pivot) +void lv_image_buf_get_transformed_area(lv_area_t * res, int32_t w, int32_t h, int32_t angle, + uint16_t scale_x, uint16_t scale_y, const lv_point_t * pivot) { if(angle == 0 && scale_x == LV_SCALE_NONE && scale_y == LV_SCALE_NONE) { res->x1 = 0; @@ -291,7 +294,7 @@ static void img_decode_and_draw(lv_draw_unit_t * draw_unit, const lv_draw_image_ if(res == LV_RESULT_OK) { /*Limit draw area to the current decoded area and draw the image*/ lv_area_t clipped_img_area_sub; - if(_lv_area_intersect(&clipped_img_area_sub, clipped_img_area, &absolute_decoded_area)) { + if(lv_area_intersect(&clipped_img_area_sub, clipped_img_area, &absolute_decoded_area)) { draw_core_cb(draw_unit, draw_dsc, decoder_dsc, &sup, &absolute_decoded_area, &clipped_img_area_sub); } diff --git a/src/draw/lv_draw_image.h b/src/draw/lv_draw_image.h index fef361aa6..a16f6d055 100644 --- a/src/draw/lv_draw_image.h +++ b/src/draw/lv_draw_image.h @@ -26,17 +26,7 @@ extern "C" { * MACROS **********************/ -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_color_t alpha_color; - const lv_color32_t * palette; - uint32_t palette_size : 9; -} lv_draw_image_sup_t; - -typedef struct _lv_draw_image_dsc_t { +typedef struct lv_draw_image_dsc_t { lv_draw_dsc_base_t base; const void * src; @@ -132,41 +122,6 @@ void lv_draw_layer(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv */ lv_image_src_t lv_image_src_get_type(const void * src); -/** - * Can be used by draw units to handle the decoding and - * prepare everything for the actual image rendering - * @param draw_unit pointer to a draw unit - * @param draw_dsc the draw descriptor of the image - * @param coords the absolute coordinates of the image - * @param draw_core_cb a callback to perform the actual rendering - */ -void _lv_draw_image_normal_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb); - -/** - * Can be used by draw units for TILED images to handle the decoding and - * prepare everything for the actual image rendering - * @param draw_unit pointer to a draw unit - * @param draw_dsc the draw descriptor of the image - * @param coords the absolute coordinates of the image - * @param draw_core_cb a callback to perform the actual rendering - */ -void _lv_draw_image_tiled_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, - const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb); - -/** - * Get the area of a rectangle if its rotated and scaled - * @param res store the coordinates here - * @param w width of the rectangle to transform - * @param h height of the rectangle to transform - * @param angle angle of rotation - * @param scale_x zoom in x direction, (256 no zoom) - * @param scale_y zoom in y direction, (256 no zoom) - * @param pivot x,y pivot coordinates of rotation - */ -void _lv_image_buf_get_transformed_area(lv_area_t * res, int32_t w, int32_t h, int32_t angle, - uint16_t scale_x, uint16_t scale_y, const lv_point_t * pivot); - #ifdef __cplusplus } /*extern "C"*/ #endif diff --git a/src/draw/lv_draw_image_private.h b/src/draw/lv_draw_image_private.h new file mode 100644 index 000000000..a39ee6164 --- /dev/null +++ b/src/draw/lv_draw_image_private.h @@ -0,0 +1,85 @@ +/** + * @file lv_draw_image_private.h + * + */ + +#ifndef LV_DRAW_IMAGE_PRIVATE_H +#define LV_DRAW_IMAGE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_image.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_draw_image_sup_t { + lv_color_t alpha_color; + const lv_color32_t * palette; + uint32_t palette_size : 9; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Can be used by draw units to handle the decoding and + * prepare everything for the actual image rendering + * @param draw_unit pointer to a draw unit + * @param draw_dsc the draw descriptor of the image + * @param coords the absolute coordinates of the image + * @param draw_core_cb a callback to perform the actual rendering + */ +void lv_draw_image_normal_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb); + +/** + * Can be used by draw units for TILED images to handle the decoding and + * prepare everything for the actual image rendering + * @param draw_unit pointer to a draw unit + * @param draw_dsc the draw descriptor of the image + * @param coords the absolute coordinates of the image + * @param draw_core_cb a callback to perform the actual rendering + */ +void lv_draw_image_tiled_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb); + +/** + * Get the area of a rectangle if its rotated and scaled + * @param res store the coordinates here + * @param w width of the rectangle to transform + * @param h height of the rectangle to transform + * @param angle angle of rotation + * @param scale_x zoom in x direction, (256 no zoom) + * @param scale_y zoom in y direction, (256 no zoom) + * @param pivot x,y pivot coordinates of rotation + */ +void lv_image_buf_get_transformed_area(lv_area_t * res, int32_t w, int32_t h, int32_t angle, + uint16_t scale_x, uint16_t scale_y, const lv_point_t * pivot); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_IMAGE_PRIVATE_H*/ diff --git a/src/draw/lv_draw_label.c b/src/draw/lv_draw_label.c index b6e9aca01..d0162b824 100644 --- a/src/draw/lv_draw_label.c +++ b/src/draw/lv_draw_label.c @@ -6,11 +6,15 @@ /********************* * INCLUDES *********************/ +#include "../misc/lv_area_private.h" +#include "lv_draw_vector_private.h" +#include "lv_draw_rect_private.h" +#include "lv_draw_private.h" #include "../core/lv_obj.h" -#include "lv_draw_label.h" +#include "lv_draw_label_private.h" #include "../misc/lv_math.h" #include "../core/lv_obj_event.h" -#include "../misc/lv_bidi.h" +#include "../misc/lv_bidi_private.h" #include "../misc/lv_text_private.h" #include "../misc/lv_assert.h" #include "../stdlib/lv_mem.h" @@ -150,7 +154,7 @@ void lv_draw_label_iterate_characters(lv_draw_unit_t * draw_unit, const lv_draw_ int32_t w; lv_area_t clipped_area; - bool clip_ok = _lv_area_intersect(&clipped_area, coords, draw_unit->clip_area); + bool clip_ok = lv_area_intersect(&clipped_area, coords, draw_unit->clip_area); if(!clip_ok) return; lv_text_align_t align = dsc->align; @@ -268,7 +272,7 @@ void lv_draw_label_iterate_characters(lv_draw_unit_t * draw_unit, const lv_draw_ #if LV_USE_BIDI char * bidi_txt = lv_malloc(line_end - line_start + 1); LV_ASSERT_MALLOC(bidi_txt); - _lv_bidi_process_paragraph(dsc->text + line_start, bidi_txt, line_end - line_start, base_dir, NULL, 0); + lv_bidi_process_paragraph(dsc->text + line_start, bidi_txt, line_end - line_start, base_dir, NULL, 0); #else const char * bidi_txt = dsc->text + line_start; #endif @@ -279,7 +283,7 @@ void lv_draw_label_iterate_characters(lv_draw_unit_t * draw_unit, const lv_draw_ #if LV_USE_BIDI logical_char_pos = lv_text_encoded_get_char_id(dsc->text, line_start); uint32_t t = lv_text_encoded_get_char_id(bidi_txt, i); - logical_char_pos += _lv_bidi_get_logical_pos(bidi_txt, NULL, line_end - line_start, base_dir, t, NULL); + logical_char_pos += lv_bidi_get_logical_pos(bidi_txt, NULL, line_end - line_start, base_dir, t, NULL); #else logical_char_pos = lv_text_encoded_get_char_id(dsc->text, line_start + i); #endif @@ -402,8 +406,8 @@ static void draw_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * dsc, letter_coords.y2 = letter_coords.y1 + g.box_h - 1; /*If the letter is completely out of mask don't draw it*/ - if(_lv_area_is_out(&letter_coords, draw_unit->clip_area, 0) && - _lv_area_is_out(dsc->bg_coords, draw_unit->clip_area, 0)) { + if(lv_area_is_out(&letter_coords, draw_unit->clip_area, 0) && + lv_area_is_out(dsc->bg_coords, draw_unit->clip_area, 0)) { LV_PROFILER_END; return; } diff --git a/src/draw/lv_draw_label.h b/src/draw/lv_draw_label.h index f0b962802..bc36bbf5b 100644 --- a/src/draw/lv_draw_label.h +++ b/src/draw/lv_draw_label.h @@ -28,23 +28,6 @@ extern "C" { * TYPEDEFS **********************/ -/** Store some info to speed up drawing of very large texts - * It takes a lot of time to get the first visible character because - * all the previous characters needs to be checked to calculate the positions. - * This structure stores an earlier (e.g. at -1000 px) coordinate and the index of that line. - * Therefore the calculations can start from here.*/ -typedef struct _lv_draw_label_hint_t { - /** Index of the line at `y` coordinate*/ - int32_t line_start; - - /** Give the `y` coordinate of the first letter at `line start` index. Relative to the label's coordinates*/ - int32_t y; - - /** The 'y1' coordinate of the label when the hint was saved. - * Used to invalidate the hint if the label has moved too much.*/ - int32_t coord_y; -} lv_draw_label_hint_t; - typedef struct { lv_draw_dsc_base_t base; @@ -72,17 +55,6 @@ typedef struct { lv_draw_label_hint_t * hint; } lv_draw_label_dsc_t; -typedef struct { - void * glyph_data; /*Depends on `format` field, it could be image source or draw buf of bitmap or vector data.*/ - lv_font_glyph_format_t format; - const lv_area_t * letter_coords; - const lv_area_t * bg_coords; - const lv_font_glyph_dsc_t * g; - lv_color_t color; - lv_opa_t opa; - lv_draw_buf_t * _draw_buf; /*a shared draw buf for get_bitmap, do not use it directly, use glyph_data instead*/ -} lv_draw_glyph_dsc_t; - /** * Passed as a parameter to `lv_draw_label_iterate_characters` to * draw the characters one by one diff --git a/src/draw/lv_draw_label_private.h b/src/draw/lv_draw_label_private.h new file mode 100644 index 000000000..03b68d774 --- /dev/null +++ b/src/draw/lv_draw_label_private.h @@ -0,0 +1,68 @@ +/** + * @file lv_draw_label_private.h + * + */ + +#ifndef LV_DRAW_LABEL_PRIVATE_H +#define LV_DRAW_LABEL_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_label.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Store some info to speed up drawing of very large texts + * It takes a lot of time to get the first visible character because + * all the previous characters needs to be checked to calculate the positions. + * This structure stores an earlier (e.g. at -1000 px) coordinate and the index of that line. + * Therefore the calculations can start from here.*/ +struct lv_draw_label_hint_t { + /** Index of the line at `y` coordinate*/ + int32_t line_start; + + /** Give the `y` coordinate of the first letter at `line start` index. Relative to the label's coordinates*/ + int32_t y; + + /** The 'y1' coordinate of the label when the hint was saved. + * Used to invalidate the hint if the label has moved too much.*/ + int32_t coord_y; +}; + +struct lv_draw_glyph_dsc_t { + void * glyph_data; /*Depends on `format` field, it could be image source or draw buf of bitmap or vector data.*/ + lv_font_glyph_format_t format; + const lv_area_t * letter_coords; + const lv_area_t * bg_coords; + const lv_font_glyph_dsc_t * g; + lv_color_t color; + lv_opa_t opa; + lv_draw_buf_t * _draw_buf; /*a shared draw buf for get_bitmap, do not use it directly, use glyph_data instead*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_LABEL_PRIVATE_H*/ diff --git a/src/draw/lv_draw_line.c b/src/draw/lv_draw_line.c index 694cb2198..51d3040b2 100644 --- a/src/draw/lv_draw_line.c +++ b/src/draw/lv_draw_line.c @@ -6,6 +6,7 @@ /********************* * INCLUDES *********************/ +#include "lv_draw_private.h" #include "../core/lv_refr.h" #include "../misc/lv_math.h" #include "../misc/lv_types.h" diff --git a/src/draw/lv_draw_mask.c b/src/draw/lv_draw_mask.c index 11cdaf287..e9140da51 100644 --- a/src/draw/lv_draw_mask.c +++ b/src/draw/lv_draw_mask.c @@ -6,7 +6,8 @@ /********************* * INCLUDES *********************/ -#include "lv_draw_mask.h" +#include "lv_draw_private.h" +#include "lv_draw_mask_private.h" #include "../core/lv_refr.h" #include "../misc/lv_math.h" #include "../misc/lv_types.h" diff --git a/src/draw/lv_draw_mask.h b/src/draw/lv_draw_mask.h index e471b4c37..410c0dbd3 100644 --- a/src/draw/lv_draw_mask.h +++ b/src/draw/lv_draw_mask.h @@ -22,16 +22,6 @@ extern "C" { * DEFINES *********************/ -/********************** - * TYPEDEFS - **********************/ -typedef struct { - lv_draw_dsc_base_t base; - - lv_area_t area; - int32_t radius; -} lv_draw_mask_rect_dsc_t; - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/draw/lv_draw_mask_private.h b/src/draw/lv_draw_mask_private.h new file mode 100644 index 000000000..efb282b08 --- /dev/null +++ b/src/draw/lv_draw_mask_private.h @@ -0,0 +1,50 @@ +/** + * @file lv_draw_mask_private.h + * + */ + +#ifndef LV_DRAW_MASK_PRIVATE_H +#define LV_DRAW_MASK_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_mask.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ +struct lv_draw_mask_rect_dsc_t { + lv_draw_dsc_base_t base; + + lv_area_t area; + int32_t radius; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_MASK_PRIVATE_H*/ diff --git a/src/draw/lv_draw_private.h b/src/draw/lv_draw_private.h new file mode 100644 index 000000000..efebd66e1 --- /dev/null +++ b/src/draw/lv_draw_private.h @@ -0,0 +1,146 @@ +/** + * @file lv_draw_private.h + * + */ + +#ifndef LV_DRAW_PRIVATE_H +#define LV_DRAW_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_draw_task_t { + lv_draw_task_t * next; + + lv_draw_task_type_t type; + + /** + * The area where to draw + */ + lv_area_t area; + + /** + * The real draw area. E.g. for shadow, outline, or transformed images it's different from `area` + */ + lv_area_t _real_area; + + /** The original area which is updated*/ + lv_area_t clip_area_original; + + /** + * The clip area of the layer is saved here when the draw task is created. + * As the clip area of the layer can be changed as new draw tasks are added its current value needs to be saved. + * Therefore during drawing the layer's clip area shouldn't be used as it might be already changed for other draw tasks. + */ + lv_area_t clip_area; + +#if LV_DRAW_TRANSFORM_USE_MATRIX + /** Transform matrix to be applied when rendering the layer */ + lv_matrix_t matrix; +#endif + + volatile int state; /*int instead of lv_draw_task_state_t to be sure its atomic*/ + + void * draw_dsc; + + /** + * The ID of the draw_unit which should take this task + */ + uint8_t preferred_draw_unit_id; + + /** + * Set to which extent `preferred_draw_unit_id` is good at this task. + * 80: means 20% better (faster) than software rendering + * 100: the default value + * 110: means 10% worse (slower) than software rendering + */ + uint8_t preference_score; + +}; + +struct lv_draw_mask_t { + void * user_data; +}; + +struct lv_draw_unit_t { + lv_draw_unit_t * next; + + /** + * The target_layer on which drawing should happen + */ + lv_layer_t * target_layer; + + const lv_area_t * clip_area; + + /** + * Called to try to assign a draw task to itself. + * `lv_draw_get_next_available_task` can be used to get an independent draw task. + * A draw task should be assign only if the draw unit can draw it too + * @param draw_unit pointer to the draw unit + * @param layer pointer to a layer on which the draw task should be drawn + * @return >=0: The number of taken draw task: + * 0 means the task has not yet been completed. + * 1 means a new task has been accepted. + * -1: The draw unit wanted to work on a task but couldn't do that + * due to some errors (e.g. out of memory). + * It signals that LVGL should call the dispatcher later again + * to let draw unit try to start the rendering again. + */ + int32_t (*dispatch_cb)(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + + /** + * + * @param draw_unit + * @param task + * @return + */ + int32_t (*evaluate_cb)(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); + + /** + * Called to delete draw unit. + * @param draw_unit + * @return + */ + int32_t (*delete_cb)(lv_draw_unit_t * draw_unit); +}; + +typedef struct { + lv_draw_unit_t * unit_head; + uint32_t used_memory_for_layers_kb; +#if LV_USE_OS + lv_thread_sync_t sync; +#else + int dispatch_req; +#endif + lv_mutex_t circle_cache_mutex; + bool task_running; +} lv_draw_global_info_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_PRIVATE_H*/ diff --git a/src/draw/lv_draw_rect.c b/src/draw/lv_draw_rect.c index 1fe7f8313..96439e320 100644 --- a/src/draw/lv_draw_rect.c +++ b/src/draw/lv_draw_rect.c @@ -6,8 +6,9 @@ /********************* * INCLUDES *********************/ +#include "lv_draw_private.h" #include "../core/lv_obj.h" -#include "lv_draw_rect.h" +#include "lv_draw_rect_private.h" #include "../misc/lv_assert.h" #include "../core/lv_obj_event.h" #include "../stdlib/lv_string.h" diff --git a/src/draw/lv_draw_rect_private.h b/src/draw/lv_draw_rect_private.h new file mode 100644 index 000000000..ad75b5355 --- /dev/null +++ b/src/draw/lv_draw_rect_private.h @@ -0,0 +1,39 @@ +/** + * @file lv_draw_rect_private.h + * + */ + +#ifndef LV_DRAW_RECT_PRIVATE_H +#define LV_DRAW_RECT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_rect.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_RECT_PRIVATE_H*/ diff --git a/src/draw/lv_draw_triangle.c b/src/draw/lv_draw_triangle.c index fba369abc..8022d966a 100644 --- a/src/draw/lv_draw_triangle.c +++ b/src/draw/lv_draw_triangle.c @@ -6,8 +6,9 @@ /********************* * INCLUDES *********************/ +#include "lv_draw_private.h" #include "../core/lv_obj.h" -#include "lv_draw_triangle.h" +#include "lv_draw_triangle_private.h" #include "../misc/lv_math.h" #include "../stdlib/lv_mem.h" #include "../stdlib/lv_string.h" diff --git a/src/draw/lv_draw_triangle_private.h b/src/draw/lv_draw_triangle_private.h new file mode 100644 index 000000000..7fc8ed5a2 --- /dev/null +++ b/src/draw/lv_draw_triangle_private.h @@ -0,0 +1,43 @@ +/** + * @file lv_draw_triangle_private.h + * + */ + +#ifndef LV_DRAW_TRIANGLE_PRIVATE_H +#define LV_DRAW_TRIANGLE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_triangle.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_TRIANGLE_PRIVATE_H*/ diff --git a/src/draw/lv_draw_vector.c b/src/draw/lv_draw_vector.c index bcf3ced7e..d6d3cdfa7 100644 --- a/src/draw/lv_draw_vector.c +++ b/src/draw/lv_draw_vector.c @@ -4,9 +4,11 @@ */ /********************* -* INCLUDES + * INCLUDES *********************/ -#include "lv_draw_vector.h" +#include "../misc/lv_area_private.h" +#include "lv_draw_private.h" +#include "lv_draw_vector_private.h" #if LV_USE_VECTOR_GRAPHIC @@ -26,7 +28,7 @@ #define MATH_DEGREES(rad) ((rad) * RAD_TO_DEG) /********************* -* DEFINES + * DEFINES *********************/ #ifndef M_PI @@ -44,16 +46,16 @@ } while(0) /********************** -* TYPEDEFS + * TYPEDEFS **********************/ typedef struct { lv_vector_path_t * path; lv_vector_draw_dsc_t dsc; -} _lv_vector_draw_task; +} lv_vector_draw_task; /********************** -* STATIC PROTOTYPES + * STATIC PROTOTYPES **********************/ static void _copy_draw_dsc(lv_vector_draw_dsc_t * dst, const lv_vector_draw_dsc_t * src) @@ -81,7 +83,7 @@ static void _copy_draw_dsc(lv_vector_draw_dsc_t * dst, const lv_vector_draw_dsc_ lv_area_copy(&(dst->scissor_area), &(src->scissor_area)); } /********************** -* GLOBAL FUNCTIONS + * GLOBAL FUNCTIONS **********************/ void lv_matrix_transform_point(const lv_matrix_t * matrix, lv_fpoint_t * point) @@ -109,7 +111,7 @@ lv_vector_path_t * lv_vector_path_create(lv_vector_path_quality_t quality) LV_ASSERT_MALLOC(path); lv_memzero(path, sizeof(lv_vector_path_t)); path->quality = quality; - lv_array_init(&path->ops, 8, sizeof(uint8_t)); + lv_array_init(&path->ops, 8, sizeof(lv_vector_path_op_t)); lv_array_init(&path->points, 8, sizeof(lv_fpoint_t)); return path; } @@ -138,7 +140,7 @@ void lv_vector_path_move_to(lv_vector_path_t * path, const lv_fpoint_t * p) { CHECK_AND_RESIZE_PATH_CONTAINER(path, 1); - uint8_t op = LV_VECTOR_PATH_OP_MOVE_TO; + lv_vector_path_op_t op = LV_VECTOR_PATH_OP_MOVE_TO; lv_array_push_back(&path->ops, &op); lv_array_push_back(&path->points, p); } @@ -152,7 +154,7 @@ void lv_vector_path_line_to(lv_vector_path_t * path, const lv_fpoint_t * p) CHECK_AND_RESIZE_PATH_CONTAINER(path, 1); - uint8_t op = LV_VECTOR_PATH_OP_LINE_TO; + lv_vector_path_op_t op = LV_VECTOR_PATH_OP_LINE_TO; lv_array_push_back(&path->ops, &op); lv_array_push_back(&path->points, p); } @@ -166,7 +168,7 @@ void lv_vector_path_quad_to(lv_vector_path_t * path, const lv_fpoint_t * p1, con CHECK_AND_RESIZE_PATH_CONTAINER(path, 2); - uint8_t op = LV_VECTOR_PATH_OP_QUAD_TO; + lv_vector_path_op_t op = LV_VECTOR_PATH_OP_QUAD_TO; lv_array_push_back(&path->ops, &op); lv_array_push_back(&path->points, p1); lv_array_push_back(&path->points, p2); @@ -182,7 +184,7 @@ void lv_vector_path_cubic_to(lv_vector_path_t * path, const lv_fpoint_t * p1, co CHECK_AND_RESIZE_PATH_CONTAINER(path, 3); - uint8_t op = LV_VECTOR_PATH_OP_CUBIC_TO; + lv_vector_path_op_t op = LV_VECTOR_PATH_OP_CUBIC_TO; lv_array_push_back(&path->ops, &op); lv_array_push_back(&path->points, p1); lv_array_push_back(&path->points, p2); @@ -198,7 +200,7 @@ void lv_vector_path_close(lv_vector_path_t * path) CHECK_AND_RESIZE_PATH_CONTAINER(path, 1); - uint8_t op = LV_VECTOR_PATH_OP_CLOSE; + lv_vector_path_op_t op = LV_VECTOR_PATH_OP_CLOSE; lv_array_push_back(&path->ops, &op); } @@ -500,7 +502,7 @@ void lv_vector_dsc_delete(lv_vector_dsc_t * dsc) { if(dsc->tasks.task_list) { lv_ll_t * task_list = dsc->tasks.task_list; - _lv_vector_for_each_destroy_tasks(task_list, NULL, NULL); + lv_vector_for_each_destroy_tasks(task_list, NULL, NULL); dsc->tasks.task_list = NULL; } lv_array_deinit(&(dsc->current_dsc.stroke_dsc.dash_pattern)); @@ -688,7 +690,7 @@ void lv_vector_dsc_set_stroke_gradient_color_stops(lv_vector_dsc_t * dsc, const void lv_vector_dsc_add_path(lv_vector_dsc_t * dsc, const lv_vector_path_t * path) { lv_area_t rect; - if(!_lv_area_intersect(&rect, &(dsc->layer->_clip_area), &(dsc->current_dsc.scissor_area))) { + if(!lv_area_intersect(&rect, &(dsc->layer->_clip_area), &(dsc->current_dsc.scissor_area))) { return; } @@ -700,11 +702,11 @@ void lv_vector_dsc_add_path(lv_vector_dsc_t * dsc, const lv_vector_path_t * path if(!dsc->tasks.task_list) { dsc->tasks.task_list = lv_malloc(sizeof(lv_ll_t)); LV_ASSERT_MALLOC(dsc->tasks.task_list); - _lv_ll_init(dsc->tasks.task_list, sizeof(_lv_vector_draw_task)); + lv_ll_init(dsc->tasks.task_list, sizeof(lv_vector_draw_task)); } - _lv_vector_draw_task * new_task = (_lv_vector_draw_task *)_lv_ll_ins_tail(dsc->tasks.task_list); - lv_memset(new_task, 0, sizeof(_lv_vector_draw_task)); + lv_vector_draw_task * new_task = (lv_vector_draw_task *)lv_ll_ins_tail(dsc->tasks.task_list); + lv_memset(new_task, 0, sizeof(lv_vector_draw_task)); new_task->path = lv_vector_path_create(0); @@ -716,18 +718,18 @@ void lv_vector_dsc_add_path(lv_vector_dsc_t * dsc, const lv_vector_path_t * path void lv_vector_clear_area(lv_vector_dsc_t * dsc, const lv_area_t * rect) { lv_area_t r; - if(!_lv_area_intersect(&r, &(dsc->layer->_clip_area), &(dsc->current_dsc.scissor_area))) { + if(!lv_area_intersect(&r, &(dsc->layer->_clip_area), &(dsc->current_dsc.scissor_area))) { return; } if(!dsc->tasks.task_list) { dsc->tasks.task_list = lv_malloc(sizeof(lv_ll_t)); LV_ASSERT_MALLOC(dsc->tasks.task_list); - _lv_ll_init(dsc->tasks.task_list, sizeof(_lv_vector_draw_task)); + lv_ll_init(dsc->tasks.task_list, sizeof(lv_vector_draw_task)); } - _lv_vector_draw_task * new_task = (_lv_vector_draw_task *)_lv_ll_ins_tail(dsc->tasks.task_list); - lv_memset(new_task, 0, sizeof(_lv_vector_draw_task)); + lv_vector_draw_task * new_task = (lv_vector_draw_task *)lv_ll_ins_tail(dsc->tasks.task_list); + lv_memset(new_task, 0, sizeof(lv_vector_draw_task)); new_task->dsc.fill_dsc.color = dsc->current_dsc.fill_dsc.color; new_task->dsc.fill_dsc.opa = dsc->current_dsc.fill_dsc.opa; @@ -776,14 +778,14 @@ void lv_vector_dsc_skew(lv_vector_dsc_t * dsc, float skew_x, float skew_y) lv_matrix_skew(&(dsc->current_dsc.matrix), skew_x, skew_y); } -void _lv_vector_for_each_destroy_tasks(lv_ll_t * task_list, vector_draw_task_cb cb, void * data) +void lv_vector_for_each_destroy_tasks(lv_ll_t * task_list, vector_draw_task_cb cb, void * data) { - _lv_vector_draw_task * task = _lv_ll_get_head(task_list); - _lv_vector_draw_task * next_task = NULL; + lv_vector_draw_task * task = lv_ll_get_head(task_list); + lv_vector_draw_task * next_task = NULL; while(task != NULL) { - next_task = _lv_ll_get_next(task_list, task); - _lv_ll_remove(task_list, task); + next_task = lv_ll_get_next(task_list, task); + lv_ll_remove(task_list, task); if(cb) { cb(data, task->path, &(task->dsc)); diff --git a/src/draw/lv_draw_vector.h b/src/draw/lv_draw_vector.h index 83c66b4f7..06ce53ac5 100644 --- a/src/draw/lv_draw_vector.h +++ b/src/draw/lv_draw_vector.h @@ -26,34 +26,30 @@ extern "C" { /********************** * TYPEDEFS **********************/ -enum { +typedef enum { LV_VECTOR_FILL_NONZERO = 0, LV_VECTOR_FILL_EVENODD, -}; -typedef uint8_t lv_vector_fill_t; +} lv_vector_fill_t; -enum { +typedef enum { LV_VECTOR_STROKE_CAP_BUTT = 0, LV_VECTOR_STROKE_CAP_SQUARE, LV_VECTOR_STROKE_CAP_ROUND, -}; -typedef uint8_t lv_vector_stroke_cap_t; +} lv_vector_stroke_cap_t; -enum { +typedef enum { LV_VECTOR_STROKE_JOIN_MITER = 0, LV_VECTOR_STROKE_JOIN_BEVEL, LV_VECTOR_STROKE_JOIN_ROUND, -}; -typedef uint8_t lv_vector_stroke_join_t; +} lv_vector_stroke_join_t; -enum { +typedef enum { LV_VECTOR_PATH_QUALITY_MEDIUM = 0, /* default*/ LV_VECTOR_PATH_QUALITY_HIGH, LV_VECTOR_PATH_QUALITY_LOW, -}; -typedef uint8_t lv_vector_path_quality_t; +} lv_vector_path_quality_t; -enum { +typedef enum { LV_VECTOR_BLEND_SRC_OVER = 0, LV_VECTOR_BLEND_SRC_IN, LV_VECTOR_BLEND_DST_OVER, @@ -63,105 +59,37 @@ enum { LV_VECTOR_BLEND_NONE, LV_VECTOR_BLEND_ADDITIVE, LV_VECTOR_BLEND_SUBTRACTIVE, -}; -typedef uint8_t lv_vector_blend_t; +} lv_vector_blend_t; -enum { +typedef enum { LV_VECTOR_PATH_OP_MOVE_TO = 0, LV_VECTOR_PATH_OP_LINE_TO, LV_VECTOR_PATH_OP_QUAD_TO, LV_VECTOR_PATH_OP_CUBIC_TO, LV_VECTOR_PATH_OP_CLOSE, -}; -typedef uint8_t lv_vector_path_op_t; +} lv_vector_path_op_t; -enum { +typedef enum { LV_VECTOR_DRAW_STYLE_SOLID = 0, LV_VECTOR_DRAW_STYLE_PATTERN, LV_VECTOR_DRAW_STYLE_GRADIENT, -}; -typedef uint8_t lv_vector_draw_style_t; +} lv_vector_draw_style_t; -enum { +typedef enum { LV_VECTOR_GRADIENT_SPREAD_PAD = 0, LV_VECTOR_GRADIENT_SPREAD_REPEAT, LV_VECTOR_GRADIENT_SPREAD_REFLECT, -}; -typedef uint8_t lv_vector_gradient_spread_t; +} lv_vector_gradient_spread_t; -enum { +typedef enum { LV_VECTOR_GRADIENT_STYLE_LINEAR = 0, LV_VECTOR_GRADIENT_STYLE_RADIAL, -}; -typedef uint8_t lv_vector_gradient_style_t; +} lv_vector_gradient_style_t; -typedef struct { +struct lv_fpoint_t { float x; float y; -} lv_fpoint_t; - -typedef struct { - lv_vector_path_quality_t quality; - lv_array_t ops; - lv_array_t points; -} lv_vector_path_t; - -typedef struct { - lv_vector_gradient_style_t style; - lv_gradient_stop_t stops[LV_GRADIENT_MAX_STOPS]; /**< A gradient stop array */ - uint16_t stops_count; /**< The number of used stops in the array */ - float x1; - float y1; - float x2; - float y2; - float cx; - float cy; - float cr; - lv_vector_gradient_spread_t spread; -} lv_vector_gradient_t; - -typedef struct { - lv_vector_draw_style_t style; - lv_color32_t color; - lv_opa_t opa; - lv_vector_fill_t fill_rule; - lv_draw_image_dsc_t img_dsc; - lv_vector_gradient_t gradient; - lv_matrix_t matrix; -} lv_vector_fill_dsc_t; - -typedef struct { - lv_vector_draw_style_t style; - lv_color32_t color; - lv_opa_t opa; - float width; - lv_array_t dash_pattern; - lv_vector_stroke_cap_t cap; - lv_vector_stroke_join_t join; - uint16_t miter_limit; - lv_vector_gradient_t gradient; - lv_matrix_t matrix; -} lv_vector_stroke_dsc_t; - -typedef struct { - lv_vector_fill_dsc_t fill_dsc; - lv_vector_stroke_dsc_t stroke_dsc; - lv_matrix_t matrix; - lv_vector_blend_t blend_mode; - lv_area_t scissor_area; -} lv_vector_draw_dsc_t; - -typedef struct { - lv_draw_dsc_base_t base; - lv_ll_t * task_list; /*draw task list.*/ -} lv_draw_vector_task_dsc_t; - -typedef struct { - lv_layer_t * layer; - lv_vector_draw_dsc_t current_dsc; - /* private data */ - lv_draw_vector_task_dsc_t tasks; -} lv_vector_dsc_t; +}; /********************** * GLOBAL PROTOTYPES @@ -552,8 +480,6 @@ void lv_draw_vector(lv_vector_dsc_t * dsc); /* Traverser for task list */ typedef void (*vector_draw_task_cb)(void * ctx, const lv_vector_path_t * path, const lv_vector_draw_dsc_t * dsc); -void _lv_vector_for_each_destroy_tasks(lv_ll_t * task_list, vector_draw_task_cb cb, void * data); - #endif /* LV_USE_VECTOR_GRAPHIC */ #ifdef __cplusplus diff --git a/src/draw/lv_draw_vector_private.h b/src/draw/lv_draw_vector_private.h new file mode 100644 index 000000000..5257a301e --- /dev/null +++ b/src/draw/lv_draw_vector_private.h @@ -0,0 +1,109 @@ +/** + * @file lv_draw_vector_private.h + * + */ + +#ifndef LV_DRAW_VECTOR_PRIVATE_H +#define LV_DRAW_VECTOR_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vector.h" + +#if LV_USE_VECTOR_GRAPHIC + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_vector_path_t { + lv_vector_path_quality_t quality; + lv_array_t ops; + lv_array_t points; +}; + +struct lv_vector_gradient_t { + lv_vector_gradient_style_t style; + lv_gradient_stop_t stops[LV_GRADIENT_MAX_STOPS]; /**< A gradient stop array */ + uint16_t stops_count; /**< The number of used stops in the array */ + float x1; + float y1; + float x2; + float y2; + float cx; + float cy; + float cr; + lv_vector_gradient_spread_t spread; +}; + +struct lv_vector_fill_dsc_t { + lv_vector_draw_style_t style; + lv_color32_t color; + lv_opa_t opa; + lv_vector_fill_t fill_rule; + lv_draw_image_dsc_t img_dsc; + lv_vector_gradient_t gradient; + lv_matrix_t matrix; +}; + +struct lv_vector_stroke_dsc_t { + lv_vector_draw_style_t style; + lv_color32_t color; + lv_opa_t opa; + float width; + lv_array_t dash_pattern; + lv_vector_stroke_cap_t cap; + lv_vector_stroke_join_t join; + uint16_t miter_limit; + lv_vector_gradient_t gradient; + lv_matrix_t matrix; +}; + +struct lv_vector_draw_dsc_t { + lv_vector_fill_dsc_t fill_dsc; + lv_vector_stroke_dsc_t stroke_dsc; + lv_matrix_t matrix; + lv_vector_blend_t blend_mode; + lv_area_t scissor_area; +}; + +struct lv_draw_vector_task_dsc_t { + lv_draw_dsc_base_t base; + lv_ll_t * task_list; /*draw task list.*/ +}; + +struct lv_vector_dsc_t { + lv_layer_t * layer; + lv_vector_draw_dsc_t current_dsc; + /* private data */ + lv_draw_vector_task_dsc_t tasks; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_vector_for_each_destroy_tasks(lv_ll_t * task_list, vector_draw_task_cb cb, void * data); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_VECTOR_GRAPHIC */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_VECTOR_PRIVATE_H*/ diff --git a/src/draw/lv_image_decoder.c b/src/draw/lv_image_decoder.c index 3682ce427..308939dde 100644 --- a/src/draw/lv_image_decoder.c +++ b/src/draw/lv_image_decoder.c @@ -6,7 +6,7 @@ /********************* * INCLUDES *********************/ -#include "lv_image_decoder.h" +#include "lv_image_decoder_private.h" #include "../misc/lv_assert.h" #include "../draw/lv_draw_image.h" #include "../misc/lv_ll.h" @@ -56,9 +56,9 @@ static lv_result_t try_cache(lv_image_decoder_dsc_t * dsc); /** * Initialize the image decoder module */ -void _lv_image_decoder_init(uint32_t image_cache_size, uint32_t image_header_count) +void lv_image_decoder_init(uint32_t image_cache_size, uint32_t image_header_count) { - _lv_ll_init(img_decoder_ll_p, sizeof(lv_image_decoder_t)); + lv_ll_init(img_decoder_ll_p, sizeof(lv_image_decoder_t)); /*Initialize the cache*/ lv_image_cache_init(image_cache_size); @@ -68,12 +68,12 @@ void _lv_image_decoder_init(uint32_t image_cache_size, uint32_t image_header_cou /** * Deinitialize the image decoder module */ -void _lv_image_decoder_deinit(void) +void lv_image_decoder_deinit(void) { lv_cache_destroy(img_cache_p, NULL); lv_cache_destroy(img_header_cache_p, NULL); - _lv_ll_clear(img_decoder_ll_p); + lv_ll_clear(img_decoder_ll_p); } lv_result_t lv_image_decoder_get_info(const void * src, lv_image_header_t * header) @@ -171,7 +171,7 @@ void lv_image_decoder_close(lv_image_decoder_dsc_t * dsc) lv_image_decoder_t * lv_image_decoder_create(void) { lv_image_decoder_t * decoder; - decoder = _lv_ll_ins_head(img_decoder_ll_p); + decoder = lv_ll_ins_head(img_decoder_ll_p); LV_ASSERT_MALLOC(decoder); if(decoder == NULL) return NULL; @@ -182,16 +182,16 @@ lv_image_decoder_t * lv_image_decoder_create(void) void lv_image_decoder_delete(lv_image_decoder_t * decoder) { - _lv_ll_remove(img_decoder_ll_p, decoder); + lv_ll_remove(img_decoder_ll_p, decoder); lv_free(decoder); } lv_image_decoder_t * lv_image_decoder_get_next(lv_image_decoder_t * decoder) { if(decoder == NULL) - return _lv_ll_get_head(img_decoder_ll_p); + return lv_ll_get_head(img_decoder_ll_p); else - return _lv_ll_get_next(img_decoder_ll_p, decoder); + return lv_ll_get_next(img_decoder_ll_p, decoder); } void lv_image_decoder_set_info_cb(lv_image_decoder_t * decoder, lv_image_decoder_info_f_t info_cb) @@ -336,7 +336,7 @@ static lv_image_decoder_t * image_decoder_get_info(lv_image_decoder_dsc_t * dsc, /*Search the decoders*/ lv_image_decoder_t * decoder_prev = NULL; - _LV_LL_READ(img_decoder_ll_p, decoder) { + LV_LL_READ(img_decoder_ll_p, decoder) { /*Info and Open callbacks are required*/ if(decoder->info_cb && decoder->open_cb) { lv_fs_seek(&dsc->file, 0, LV_FS_SEEK_SET); diff --git a/src/draw/lv_image_decoder.h b/src/draw/lv_image_decoder.h index 411bd2cb1..ad2ffd152 100644 --- a/src/draw/lv_image_decoder.h +++ b/src/draw/lv_image_decoder.h @@ -31,39 +31,12 @@ extern "C" { /** * Source of image.*/ -enum _lv_image_src_t { +typedef enum { LV_IMAGE_SRC_VARIABLE, /** Binary/C variable*/ LV_IMAGE_SRC_FILE, /** File in filesystem*/ LV_IMAGE_SRC_SYMBOL, /** Symbol (@ref lv_symbol_def.h)*/ LV_IMAGE_SRC_UNKNOWN, /** Unknown source*/ -}; - -#ifdef DOXYGEN -typedef _lv_image_src_t lv_image_src_t; -#else -typedef uint8_t lv_image_src_t; -#endif /*DOXYGEN*/ - -/*Decoder function definitions*/ -struct _lv_image_decoder_dsc_t; -typedef struct _lv_image_decoder_dsc_t lv_image_decoder_dsc_t; - -/** - * Image decoder args. - * It determines how to decoder an image, e.g. whether to premultiply the alpha or not. - * It should be passed to lv_img_decoder_open() function. If NULL is provided, default - * args are used. - * - * Default args: - * all field are zero or false. - */ -typedef struct _lv_image_decoder_args_t { - bool stride_align; /*Whether stride should be aligned*/ - bool premultiply; /*Whether image should be premultiplied or not after decoding*/ - bool no_cache; /*When set, decoded image won't be put to cache, and decoder open will also ignore cache.*/ - bool use_indexed; /*Decoded indexed image as is. Convert to ARGB8888 if false.*/ - bool flush_cache; /*Whether to flush the data cache after decoding*/ -} lv_image_decoder_args_t; +} lv_image_src_t; /** * Get info from an image and store in the `header` @@ -103,95 +76,10 @@ typedef lv_result_t (*lv_image_decoder_get_area_cb_t)(lv_image_decoder_t * decod */ typedef void (*lv_image_decoder_close_f_t)(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); -struct _lv_image_decoder_t { - lv_image_decoder_info_f_t info_cb; - lv_image_decoder_open_f_t open_cb; - lv_image_decoder_get_area_cb_t get_area_cb; - lv_image_decoder_close_f_t close_cb; - - const char * name; - - void * user_data; -}; - -typedef struct _lv_image_decoder_cache_data_t { - lv_cache_slot_size_t slot; - - const void * src; - lv_image_src_t src_type; - - const lv_draw_buf_t * decoded; - const lv_image_decoder_t * decoder; - void * user_data; -} lv_image_cache_data_t; - -typedef struct _lv_image_decoder_header_cache_data_t { - const void * src; - lv_image_src_t src_type; - - lv_image_header_t header; - lv_image_decoder_t * decoder; -} lv_image_header_cache_data_t; - -/**Describe an image decoding session. Stores data about the decoding*/ -struct _lv_image_decoder_dsc_t { - /**The decoder which was able to open the image source*/ - lv_image_decoder_t * decoder; - - /**A copy of parameters of how this image is decoded*/ - lv_image_decoder_args_t args; - - /**The image source. A file path like "S:my_img.png" or pointer to an `lv_image_dsc_t` variable*/ - const void * src; - - /**Type of the source: file or variable. Can be set in `open` function if required*/ - lv_image_src_t src_type; - - lv_fs_file_t file; - - /**Info about the opened image: color format, size, etc. MUST be set in `open` function*/ - lv_image_header_t header; - - /** Pointer to a draw buffer where the image's data (pixels) are stored in a decoded, plain format. - * MUST be set in `open` or `get_area_cb`function*/ - const lv_draw_buf_t * decoded; - - const lv_color32_t * palette; - uint32_t palette_size; - - /** How much time did it take to open the image. [ms] - * If not set `lv_image_cache` will measure and set the time to open*/ - uint32_t time_to_open; - - /**A text to display instead of the image when the image can't be opened. - * Can be set in `open` function or set NULL.*/ - const char * error_msg; - - lv_cache_t * cache; - - /**Point to cache entry information*/ - lv_cache_entry_t * cache_entry; - - /**Store any custom data here is required*/ - void * user_data; -}; - /********************** * GLOBAL PROTOTYPES **********************/ -/** - * Initialize the image decoder module - * @param image_cache_size Image cache size in bytes. 0 to disable cache. - * @param image_header_count Number of header cache entries. 0 to disable header cache. - */ -void _lv_image_decoder_init(uint32_t image_cache_size, uint32_t image_header_count); - -/** - * Deinitialize the image decoder module - */ -void _lv_image_decoder_deinit(void); - /** * Get information about an image. * Try the created image decoder one by one. Once one is able to get info that info will be used. diff --git a/src/draw/lv_image_decoder_private.h b/src/draw/lv_image_decoder_private.h new file mode 100644 index 000000000..1005176a6 --- /dev/null +++ b/src/draw/lv_image_decoder_private.h @@ -0,0 +1,142 @@ +/** + * @file lv_image_decoder_private.h + * + */ + +#ifndef LV_IMAGE_DECODER_PRIVATE_H +#define LV_IMAGE_DECODER_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_image_decoder.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Image decoder args. + * It determines how to decoder an image, e.g. whether to premultiply the alpha or not. + * It should be passed to lv_img_decoder_open() function. If NULL is provided, default + * args are used. + * + * Default args: + * all field are zero or false. + */ +struct lv_image_decoder_args_t { + bool stride_align; /*Whether stride should be aligned*/ + bool premultiply; /*Whether image should be premultiplied or not after decoding*/ + bool no_cache; /*When set, decoded image won't be put to cache, and decoder open will also ignore cache.*/ + bool use_indexed; /*Decoded indexed image as is. Convert to ARGB8888 if false.*/ + bool flush_cache; /*Whether to flush the data cache after decoding*/ +}; + +struct lv_image_decoder_t { + lv_image_decoder_info_f_t info_cb; + lv_image_decoder_open_f_t open_cb; + lv_image_decoder_get_area_cb_t get_area_cb; + lv_image_decoder_close_f_t close_cb; + + const char * name; + + void * user_data; +}; + +struct lv_image_cache_data_t { + lv_cache_slot_size_t slot; + + const void * src; + lv_image_src_t src_type; + + const lv_draw_buf_t * decoded; + const lv_image_decoder_t * decoder; + void * user_data; +}; + +struct lv_image_header_cache_data_t { + const void * src; + lv_image_src_t src_type; + + lv_image_header_t header; + lv_image_decoder_t * decoder; +}; + +/**Describe an image decoding session. Stores data about the decoding*/ +struct lv_image_decoder_dsc_t { + /**The decoder which was able to open the image source*/ + lv_image_decoder_t * decoder; + + /**A copy of parameters of how this image is decoded*/ + lv_image_decoder_args_t args; + + /**The image source. A file path like "S:my_img.png" or pointer to an `lv_image_dsc_t` variable*/ + const void * src; + + /**Type of the source: file or variable. Can be set in `open` function if required*/ + lv_image_src_t src_type; + + lv_fs_file_t file; + + /**Info about the opened image: color format, size, etc. MUST be set in `open` function*/ + lv_image_header_t header; + + /** Pointer to a draw buffer where the image's data (pixels) are stored in a decoded, plain format. + * MUST be set in `open` or `get_area_cb`function*/ + const lv_draw_buf_t * decoded; + + const lv_color32_t * palette; + uint32_t palette_size; + + /** How much time did it take to open the image. [ms] + * If not set `lv_image_cache` will measure and set the time to open*/ + uint32_t time_to_open; + + /**A text to display instead of the image when the image can't be opened. + * Can be set in `open` function or set NULL.*/ + const char * error_msg; + + lv_cache_t * cache; + + /**Point to cache entry information*/ + lv_cache_entry_t * cache_entry; + + /**Store any custom data here is required*/ + void * user_data; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the image decoder module + * @param image_cache_size Image cache size in bytes. 0 to disable cache. + * @param image_header_count Number of header cache entries. 0 to disable header cache. + */ +void lv_image_decoder_init(uint32_t image_cache_size, uint32_t image_header_count); + +/** + * Deinitialize the image decoder module + */ +void lv_image_decoder_deinit(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGE_DECODER_PRIVATE_H*/ diff --git a/src/draw/lv_image_dsc.h b/src/draw/lv_image_dsc.h index 7b2d9b951..567666a8d 100644 --- a/src/draw/lv_image_dsc.h +++ b/src/draw/lv_image_dsc.h @@ -29,7 +29,7 @@ LV_EXPORT_CONST_INT(LV_IMAGE_HEADER_MAGIC); * TYPEDEFS **********************/ -typedef enum _lv_image_flags_t { +typedef enum lv_image_flags_t { /** * For RGB map of the image data, mark if it's pre-multiplied with alpha. * For indexed image, this bit indicated palette data is pre-multiplied with alpha. diff --git a/src/draw/nxp/pxp/lv_draw_buf_pxp.c b/src/draw/nxp/pxp/lv_draw_buf_pxp.c index d3f99f8b0..e83da1ca3 100644 --- a/src/draw/nxp/pxp/lv_draw_buf_pxp.c +++ b/src/draw/nxp/pxp/lv_draw_buf_pxp.c @@ -16,6 +16,7 @@ #include "lv_draw_pxp.h" #if LV_USE_DRAW_PXP +#include "../../lv_draw_buf_private.h" #include "lv_pxp_cfg.h" #include "lv_pxp_utils.h" diff --git a/src/draw/nxp/pxp/lv_draw_pxp.c b/src/draw/nxp/pxp/lv_draw_pxp.c index 6a4250e00..f5b390f8a 100644 --- a/src/draw/nxp/pxp/lv_draw_pxp.c +++ b/src/draw/nxp/pxp/lv_draw_pxp.c @@ -376,7 +376,7 @@ static void _pxp_execute_drawing(lv_draw_pxp_unit_t * u) lv_draw_buf_t * draw_buf = layer->draw_buf; lv_area_t draw_area; - if(!_lv_area_intersect(&draw_area, &t->area, draw_unit->clip_area)) + if(!lv_area_intersect(&draw_area, &t->area, draw_unit->clip_area)) return; /*Fully clipped, nothing to do*/ /* Make area relative to the buffer */ @@ -403,7 +403,7 @@ static void _pxp_execute_drawing(lv_draw_pxp_unit_t * u) /*Layers manage it for themselves*/ if(t->type != LV_DRAW_TASK_TYPE_LAYER) { lv_area_t draw_area; - if(!_lv_area_intersect(&draw_area, &t->area, u->base_unit.clip_area)) + if(!lv_area_intersect(&draw_area, &t->area, u->base_unit.clip_area)) return; int32_t idx = 0; @@ -414,7 +414,7 @@ static void _pxp_execute_drawing(lv_draw_pxp_unit_t * u) } lv_draw_rect_dsc_t rect_dsc; lv_draw_rect_dsc_init(&rect_dsc); - rect_dsc.bg_color = lv_palette_main(idx % _LV_PALETTE_LAST); + rect_dsc.bg_color = lv_palette_main(idx % LV_PALETTE_LAST); rect_dsc.border_color = rect_dsc.bg_color; rect_dsc.bg_opa = LV_OPA_10; rect_dsc.border_opa = LV_OPA_80; diff --git a/src/draw/nxp/pxp/lv_draw_pxp_fill.c b/src/draw/nxp/pxp/lv_draw_pxp_fill.c index 60873ede0..c75de3480 100644 --- a/src/draw/nxp/pxp/lv_draw_pxp_fill.c +++ b/src/draw/nxp/pxp/lv_draw_pxp_fill.c @@ -64,7 +64,7 @@ void lv_draw_pxp_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc lv_area_move(&rel_clip_area, -layer->buf_area.x1, -layer->buf_area.y1); lv_area_t blend_area; - if(!_lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) + if(!lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) return; /*Fully clipped, nothing to do*/ _pxp_fill(draw_buf->data, &blend_area, draw_buf->header.stride, draw_buf->header.cf, dsc); diff --git a/src/draw/nxp/pxp/lv_draw_pxp_img.c b/src/draw/nxp/pxp/lv_draw_pxp_img.c index 6a4e997e1..08c0a8ad6 100644 --- a/src/draw/nxp/pxp/lv_draw_pxp_img.c +++ b/src/draw/nxp/pxp/lv_draw_pxp_img.c @@ -82,7 +82,7 @@ void lv_draw_pxp_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc bool has_transform = (dsc->rotation != 0 || dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); if(has_transform) lv_area_copy(&blend_area, &rel_coords); - else if(!_lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) + else if(!lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) return; /*Fully clipped, nothing to do*/ const uint8_t * src_buf = img_dsc->data; diff --git a/src/draw/nxp/pxp/lv_draw_pxp_layer.c b/src/draw/nxp/pxp/lv_draw_pxp_layer.c index 28245f964..4ee33010d 100644 --- a/src/draw/nxp/pxp/lv_draw_pxp_layer.c +++ b/src/draw/nxp/pxp/lv_draw_pxp_layer.c @@ -81,8 +81,8 @@ void lv_draw_pxp_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * d int32_t w = lv_area_get_width(coords); int32_t h = lv_area_get_height(coords); - _lv_image_buf_get_transformed_area(&area_rot, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, - &draw_dsc->pivot); + lv_image_buf_get_transformed_area(&area_rot, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, + &draw_dsc->pivot); area_rot.x1 += coords->x1; area_rot.y1 += coords->y1; @@ -90,7 +90,7 @@ void lv_draw_pxp_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * d area_rot.y2 += coords->y1; } lv_area_t draw_area; - if(!_lv_area_intersect(&draw_area, &area_rot, draw_unit->clip_area)) return; + if(!lv_area_intersect(&draw_area, &area_rot, draw_unit->clip_area)) return; #endif #if LV_USE_LAYER_DEBUG @@ -119,13 +119,13 @@ void lv_draw_pxp_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * d lv_draw_fill_dsc_t fill_dsc; lv_draw_rect_dsc_init(&fill_dsc); - fill_dsc.color = lv_palette_main(idx % _LV_PALETTE_LAST); + fill_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); fill_dsc.opa = LV_OPA_10; lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot); lv_draw_border_dsc_t border_dsc; lv_draw_border_dsc_init(&border_dsc); - border_dsc.color = lv_palette_main(idx % _LV_PALETTE_LAST); + border_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); border_dsc.opa = LV_OPA_100; border_dsc.width = 2; lv_draw_sw_border(draw_unit, &border_dsc, &area_rot); diff --git a/src/draw/nxp/vglite/lv_draw_buf_vglite.c b/src/draw/nxp/vglite/lv_draw_buf_vglite.c index e97ef7781..ae9b59a5e 100644 --- a/src/draw/nxp/vglite/lv_draw_buf_vglite.c +++ b/src/draw/nxp/vglite/lv_draw_buf_vglite.c @@ -16,6 +16,7 @@ #include "lv_draw_vglite.h" #if LV_USE_DRAW_VGLITE +#include "../../lv_draw_buf_private.h" #include "lv_vglite_buf.h" #include "lv_vglite_utils.h" diff --git a/src/draw/nxp/vglite/lv_draw_vglite.c b/src/draw/nxp/vglite/lv_draw_vglite.c index ba73c2f66..e9d4114b5 100644 --- a/src/draw/nxp/vglite/lv_draw_vglite.c +++ b/src/draw/nxp/vglite/lv_draw_vglite.c @@ -351,7 +351,7 @@ static void _vglite_execute_drawing(lv_draw_vglite_unit_t * u) lv_area_copy(&draw_area, &t->area); lv_area_move(&draw_area, -layer->buf_area.x1, -layer->buf_area.y1); - if(!_lv_area_intersect(&draw_area, &draw_area, &clip_area)) + if(!lv_area_intersect(&draw_area, &draw_area, &clip_area)) return; /*Fully clipped, nothing to do*/ /* Invalidate the drawing area */ @@ -399,7 +399,7 @@ static void _vglite_execute_drawing(lv_draw_vglite_unit_t * u) /*Layers manage it for themselves*/ if(t->type != LV_DRAW_TASK_TYPE_LAYER) { lv_area_t draw_area; - if(!_lv_area_intersect(&draw_area, &t->area, u->base_unit.clip_area)) + if(!lv_area_intersect(&draw_area, &t->area, u->base_unit.clip_area)) return; int32_t idx = 0; @@ -410,7 +410,7 @@ static void _vglite_execute_drawing(lv_draw_vglite_unit_t * u) } lv_draw_rect_dsc_t rect_dsc; lv_draw_rect_dsc_init(&rect_dsc); - rect_dsc.bg_color = lv_palette_main(idx % _LV_PALETTE_LAST); + rect_dsc.bg_color = lv_palette_main(idx % LV_PALETTE_LAST); rect_dsc.border_color = rect_dsc.bg_color; rect_dsc.bg_opa = LV_OPA_10; rect_dsc.border_opa = LV_OPA_80; diff --git a/src/draw/nxp/vglite/lv_draw_vglite_border.c b/src/draw/nxp/vglite/lv_draw_vglite_border.c index b156223df..db762fb61 100644 --- a/src/draw/nxp/vglite/lv_draw_vglite_border.c +++ b/src/draw/nxp/vglite/lv_draw_vglite_border.c @@ -91,7 +91,7 @@ void lv_draw_vglite_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_ lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); lv_area_t clipped_coords; - if(!_lv_area_intersect(&clipped_coords, &inward_coords, &clip_area)) + if(!lv_area_intersect(&clipped_coords, &inward_coords, &clip_area)) return; /*Fully clipped, nothing to do*/ _vglite_draw_border(&inward_coords, &clip_area, dsc); diff --git a/src/draw/nxp/vglite/lv_draw_vglite_fill.c b/src/draw/nxp/vglite/lv_draw_vglite_fill.c index bf066859e..97089ce55 100644 --- a/src/draw/nxp/vglite/lv_draw_vglite_fill.c +++ b/src/draw/nxp/vglite/lv_draw_vglite_fill.c @@ -82,7 +82,7 @@ void lv_draw_vglite_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); lv_area_t clipped_coords; - if(!_lv_area_intersect(&clipped_coords, &relative_coords, &clip_area)) + if(!lv_area_intersect(&clipped_coords, &relative_coords, &clip_area)) return; /*Fully clipped, nothing to do*/ /* diff --git a/src/draw/nxp/vglite/lv_draw_vglite_img.c b/src/draw/nxp/vglite/lv_draw_vglite_img.c index 8b2acba76..49fdffaff 100644 --- a/src/draw/nxp/vglite/lv_draw_vglite_img.c +++ b/src/draw/nxp/vglite/lv_draw_vglite_img.c @@ -146,7 +146,7 @@ void lv_draw_vglite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * bool has_transform = (dsc->rotation != 0 || dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); if(has_transform) lv_area_copy(&blend_area, &relative_coords); - else if(!_lv_area_intersect(&blend_area, &relative_coords, &clip_area)) + else if(!lv_area_intersect(&blend_area, &relative_coords, &clip_area)) return; /*Fully clipped, nothing to do*/ const void * src_buf = img_dsc->data; diff --git a/src/draw/nxp/vglite/lv_draw_vglite_label.c b/src/draw/nxp/vglite/lv_draw_vglite_label.c index d80ca25b6..102077fe7 100644 --- a/src/draw/nxp/vglite/lv_draw_vglite_label.c +++ b/src/draw/nxp/vglite/lv_draw_vglite_label.c @@ -101,7 +101,7 @@ static void _draw_vglite_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t lv_layer_t * layer = draw_unit->target_layer; lv_area_t blend_area; - if(!_lv_area_intersect(&blend_area, glyph_draw_dsc->letter_coords, draw_unit->clip_area)) + if(!lv_area_intersect(&blend_area, glyph_draw_dsc->letter_coords, draw_unit->clip_area)) return; lv_area_move(&blend_area, -layer->buf_area.x1, -layer->buf_area.y1); diff --git a/src/draw/nxp/vglite/lv_draw_vglite_layer.c b/src/draw/nxp/vglite/lv_draw_vglite_layer.c index 65283d0e2..42e85ee26 100644 --- a/src/draw/nxp/vglite/lv_draw_vglite_layer.c +++ b/src/draw/nxp/vglite/lv_draw_vglite_layer.c @@ -84,8 +84,8 @@ void lv_draw_vglite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t int32_t w = lv_area_get_width(coords); int32_t h = lv_area_get_height(coords); - _lv_image_buf_get_transformed_area(&area_rot, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, - &draw_dsc->pivot); + lv_image_buf_get_transformed_area(&area_rot, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, + &draw_dsc->pivot); area_rot.x1 += coords->x1; area_rot.y1 += coords->y1; @@ -93,7 +93,7 @@ void lv_draw_vglite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t area_rot.y2 += coords->y1; } lv_area_t draw_area; - if(!_lv_area_intersect(&draw_area, &area_rot, draw_unit->clip_area)) return; + if(!lv_area_intersect(&draw_area, &area_rot, draw_unit->clip_area)) return; #endif #if LV_USE_LAYER_DEBUG @@ -122,13 +122,13 @@ void lv_draw_vglite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t lv_draw_fill_dsc_t fill_dsc; lv_draw_rect_dsc_init(&fill_dsc); - fill_dsc.color = lv_palette_main(idx % _LV_PALETTE_LAST); + fill_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); fill_dsc.opa = LV_OPA_10; lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot); lv_draw_border_dsc_t border_dsc; lv_draw_border_dsc_init(&border_dsc); - border_dsc.color = lv_palette_main(idx % _LV_PALETTE_LAST); + border_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); border_dsc.opa = LV_OPA_100; border_dsc.width = 2; lv_draw_sw_border(draw_unit, &border_dsc, &area_rot); diff --git a/src/draw/nxp/vglite/lv_draw_vglite_line.c b/src/draw/nxp/vglite/lv_draw_vglite_line.c index d458375c5..f70c02b20 100644 --- a/src/draw/nxp/vglite/lv_draw_vglite_line.c +++ b/src/draw/nxp/vglite/lv_draw_vglite_line.c @@ -71,7 +71,7 @@ void lv_draw_vglite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * clip_area.y1 = LV_MIN(dsc->p1.y, dsc->p2.y) - dsc->width / 2; clip_area.y2 = LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width / 2; - if(!_lv_area_intersect(&clip_area, &clip_area, draw_unit->clip_area)) + if(!lv_area_intersect(&clip_area, &clip_area, draw_unit->clip_area)) return; /*Fully clipped, nothing to do*/ lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); diff --git a/src/draw/nxp/vglite/lv_draw_vglite_triangle.c b/src/draw/nxp/vglite/lv_draw_vglite_triangle.c index 33265a735..4f72f3aff 100644 --- a/src/draw/nxp/vglite/lv_draw_vglite_triangle.c +++ b/src/draw/nxp/vglite/lv_draw_vglite_triangle.c @@ -76,7 +76,7 @@ void lv_draw_vglite_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_ lv_area_move(&coords, -layer->buf_area.x1, -layer->buf_area.y1); lv_area_t clipped_coords; - if(!_lv_area_intersect(&clipped_coords, &coords, &clip_area)) + if(!lv_area_intersect(&clipped_coords, &coords, &clip_area)) return; /* Fully clipped, nothing to do */ _vglite_draw_triangle(&coords, &clip_area, dsc); diff --git a/src/draw/renesas/dave2d/lv_draw_dave2d.c b/src/draw/renesas/dave2d/lv_draw_dave2d.c index 79e590912..039b147a7 100644 --- a/src/draw/renesas/dave2d/lv_draw_dave2d.c +++ b/src/draw/renesas/dave2d/lv_draw_dave2d.c @@ -8,6 +8,7 @@ *********************/ #include "lv_draw_dave2d.h" #if LV_USE_DRAW_DAVE2D +#include "../../lv_draw_buf_private.h" /********************* * DEFINES @@ -93,7 +94,7 @@ void lv_draw_dave2d_init(void) draw_dave2d_unit->d2_handle = _d2_handle; draw_dave2d_unit->renderbuffer = _renderbuffer; - _lv_ll_init(&_ll_Dave2D_Tasks, 4); + lv_ll_init(&_ll_Dave2D_Tasks, 4); #if LV_USE_OS lv_thread_init(&draw_dave2d_unit->thread, LV_THREAD_PRIO_HIGH, _dave2d_render_thread_cb, 8 * 1024, draw_dave2d_unit); @@ -351,7 +352,7 @@ static int32_t lv_draw_dave2d_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * if(t == NULL) { #if (0 == D2_RENDER_EACH_OPERATION) - if(false == _lv_ll_is_empty(&_ll_Dave2D_Tasks)) { + if(false == lv_ll_is_empty(&_ll_Dave2D_Tasks)) { ref_count = 0; dave2d_execute_dlist_and_flush(); } @@ -373,7 +374,7 @@ static int32_t lv_draw_dave2d_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * } lv_draw_task_t ** p_new_list_entry; - p_new_list_entry = _lv_ll_ins_tail(&_ll_Dave2D_Tasks); + p_new_list_entry = lv_ll_ins_tail(&_ll_Dave2D_Tasks); *p_new_list_entry = t; #endif @@ -437,7 +438,7 @@ static void execute_drawing(lv_draw_dave2d_unit_t * u) int32_t x; int32_t y; - _lv_area_intersect(&clipped_area, &t->area, u->base_unit.clip_area); + lv_area_intersect(&clipped_area, &t->area, u->base_unit.clip_area); x = 0 - u->base_unit.target_layer->buf_area.x1; y = 0 - u->base_unit.target_layer->buf_area.y1; @@ -578,11 +579,11 @@ void dave2d_execute_dlist_and_flush(void) result = d2_selectrenderbuffer(_d2_handle, _renderbuffer); LV_ASSERT(D2_OK == result); - while(false == _lv_ll_is_empty(&_ll_Dave2D_Tasks)) { - p_list_entry = _lv_ll_get_tail(&_ll_Dave2D_Tasks); + while(false == lv_ll_is_empty(&_ll_Dave2D_Tasks)) { + p_list_entry = lv_ll_get_tail(&_ll_Dave2D_Tasks); p_list_entry1 = *p_list_entry; p_list_entry1->state = LV_DRAW_TASK_STATE_READY; - _lv_ll_remove(&_ll_Dave2D_Tasks, p_list_entry); + lv_ll_remove(&_ll_Dave2D_Tasks, p_list_entry); lv_free(p_list_entry); } diff --git a/src/draw/renesas/dave2d/lv_draw_dave2d_arc.c b/src/draw/renesas/dave2d/lv_draw_dave2d_arc.c index 18c56c1c8..03775387a 100644 --- a/src/draw/renesas/dave2d/lv_draw_dave2d_arc.c +++ b/src/draw/renesas/dave2d/lv_draw_dave2d_arc.c @@ -16,7 +16,7 @@ void lv_draw_dave2d_arc(lv_draw_dave2d_unit_t * u, const lv_draw_arc_dsc_t * dsc int32_t x; int32_t y; - if(!_lv_area_intersect(&clipped_area, coords, u->base_unit.clip_area)) return; + if(!lv_area_intersect(&clipped_area, coords, u->base_unit.clip_area)) return; x = 0 - u->base_unit.target_layer->buf_area.x1; y = 0 - u->base_unit.target_layer->buf_area.y1; @@ -127,7 +127,7 @@ void lv_draw_dave2d_arc(lv_draw_dave2d_unit_t * u, const lv_draw_arc_dsc_t * dsc arc_area.y1 = arc_centre.y - dsc->radius; } - draw_arc = _lv_area_intersect(&clip_arc, &arc_area, &clipped_area); + draw_arc = lv_area_intersect(&clip_arc, &arc_area, &clipped_area); if(draw_arc) { diff --git a/src/draw/renesas/dave2d/lv_draw_dave2d_border.c b/src/draw/renesas/dave2d/lv_draw_dave2d_border.c index 17137e09e..6033251df 100644 --- a/src/draw/renesas/dave2d/lv_draw_dave2d_border.c +++ b/src/draw/renesas/dave2d/lv_draw_dave2d_border.c @@ -55,7 +55,7 @@ static void dave2d_draw_border_simple(lv_draw_dave2d_unit_t * u, const lv_area_t int32_t y; bool is_common; - is_common = _lv_area_intersect(&clip_area, outer_area, u->base_unit.clip_area); + is_common = lv_area_intersect(&clip_area, outer_area, u->base_unit.clip_area); if(!is_common) return; #if LV_USE_OS @@ -170,7 +170,7 @@ static void dave2d_draw_border_complex(lv_draw_dave2d_unit_t * u, const lv_area_ outer_area = *orig_outer_area; inner_area = *orig_inner_area; - if(!_lv_area_intersect(&draw_area, &outer_area, u->base_unit.clip_area)) return; + if(!lv_area_intersect(&draw_area, &outer_area, u->base_unit.clip_area)) return; #if LV_USE_OS lv_result_t status; @@ -285,7 +285,7 @@ static void dave2d_draw_border_complex(lv_draw_dave2d_unit_t * u, const lv_area_ arc_area.x2 = core_area.x1; arc_area.y2 = core_area.y1; - if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, (d2_border)clip_arc.y2); result = d2_renderwedge(u->d2_handle, @@ -312,7 +312,7 @@ static void dave2d_draw_border_complex(lv_draw_dave2d_unit_t * u, const lv_area_ arc_area.x2 = core_area.x1; arc_area.y2 = core_area.y2 + rout; - if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, (d2_border)clip_arc.y2); @@ -348,7 +348,7 @@ static void dave2d_draw_border_complex(lv_draw_dave2d_unit_t * u, const lv_area_ arc_area.x2 = core_area.x2 + rout; arc_area.y2 = core_area.y1; - if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, (d2_border)clip_arc.y2); @@ -376,7 +376,7 @@ static void dave2d_draw_border_complex(lv_draw_dave2d_unit_t * u, const lv_area_ arc_area.x2 = core_area.x2 + rout; arc_area.y2 = core_area.y2 + rout; - if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, (d2_border)clip_arc.y2); diff --git a/src/draw/renesas/dave2d/lv_draw_dave2d_fill.c b/src/draw/renesas/dave2d/lv_draw_dave2d_fill.c index 4a29052d7..e2ffcd9fe 100644 --- a/src/draw/renesas/dave2d/lv_draw_dave2d_fill.c +++ b/src/draw/renesas/dave2d/lv_draw_dave2d_fill.c @@ -14,7 +14,7 @@ void lv_draw_dave2d_fill(lv_draw_dave2d_unit_t * u, const lv_draw_fill_dsc_t * d lv_point_t arc_centre; - is_common = _lv_area_intersect(&draw_area, coords, u->base_unit.clip_area); + is_common = lv_area_intersect(&draw_area, coords, u->base_unit.clip_area); if(!is_common) return; #if LV_USE_OS @@ -165,7 +165,7 @@ void lv_draw_dave2d_fill(lv_draw_dave2d_unit_t * u, const lv_draw_fill_dsc_t * d arc_area.x2 = coordinates.x1 + radius; arc_area.y2 = coordinates.y1 + radius; - if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, (d2_border)clip_arc.y2); @@ -192,7 +192,7 @@ void lv_draw_dave2d_fill(lv_draw_dave2d_unit_t * u, const lv_draw_fill_dsc_t * d arc_area.x2 = coordinates.x2; arc_area.y2 = coordinates.y1 + radius; - if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, (d2_border)clip_arc.y2); @@ -217,7 +217,7 @@ void lv_draw_dave2d_fill(lv_draw_dave2d_unit_t * u, const lv_draw_fill_dsc_t * d arc_area.x2 = coordinates.x2; arc_area.y2 = coordinates.y2; - if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, (d2_border)clip_arc.y2); @@ -242,7 +242,7 @@ void lv_draw_dave2d_fill(lv_draw_dave2d_unit_t * u, const lv_draw_fill_dsc_t * d arc_area.x2 = coordinates.x1 + radius; arc_area.y2 = coordinates.y2; - if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, (d2_border)clip_arc.y2); diff --git a/src/draw/renesas/dave2d/lv_draw_dave2d_image.c b/src/draw/renesas/dave2d/lv_draw_dave2d_image.c index fe5ea459f..dc001151a 100644 --- a/src/draw/renesas/dave2d/lv_draw_dave2d_image.c +++ b/src/draw/renesas/dave2d/lv_draw_dave2d_image.c @@ -40,10 +40,10 @@ void lv_draw_dave2d_image(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_image const lv_area_t * coords) { if(!draw_dsc->tile) { - _lv_draw_image_normal_helper((lv_draw_unit_t *)draw_unit, draw_dsc, coords, img_draw_core); + lv_draw_image_normal_helper((lv_draw_unit_t *)draw_unit, draw_dsc, coords, img_draw_core); } else { - _lv_draw_image_tiled_helper((lv_draw_unit_t *)draw_unit, draw_dsc, coords, img_draw_core); + lv_draw_image_tiled_helper((lv_draw_unit_t *)draw_unit, draw_dsc, coords, img_draw_core); } } diff --git a/src/draw/renesas/dave2d/lv_draw_dave2d_label.c b/src/draw/renesas/dave2d/lv_draw_dave2d_label.c index f2b93b47a..f5760e623 100644 --- a/src/draw/renesas/dave2d/lv_draw_dave2d_label.c +++ b/src/draw/renesas/dave2d/lv_draw_dave2d_label.c @@ -30,7 +30,7 @@ static void lv_draw_dave2d_draw_letter_cb(lv_draw_unit_t * u, lv_draw_glyph_dsc_ letter_coords = *glyph_draw_dsc->letter_coords; bool is_common; - is_common = _lv_area_intersect(&clip_area, glyph_draw_dsc->letter_coords, u->clip_area); + is_common = lv_area_intersect(&clip_area, glyph_draw_dsc->letter_coords, u->clip_area); if(!is_common) return; x = 0 - unit->base_unit.target_layer->buf_area.x1; diff --git a/src/draw/renesas/dave2d/lv_draw_dave2d_line.c b/src/draw/renesas/dave2d/lv_draw_dave2d_line.c index 5bf6811e5..ef188eb4a 100644 --- a/src/draw/renesas/dave2d/lv_draw_dave2d_line.c +++ b/src/draw/renesas/dave2d/lv_draw_dave2d_line.c @@ -20,7 +20,7 @@ void lv_draw_dave2d_line(lv_draw_dave2d_unit_t * u, const lv_draw_line_dsc_t * d clip_line.y2 = LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width / 2; bool is_common; - is_common = _lv_area_intersect(&clip_line, &clip_line, u->base_unit.clip_area); + is_common = lv_area_intersect(&clip_line, &clip_line, u->base_unit.clip_area); if(!is_common) return; #if LV_USE_OS diff --git a/src/draw/renesas/dave2d/lv_draw_dave2d_mask_rectangle.c b/src/draw/renesas/dave2d/lv_draw_dave2d_mask_rectangle.c index 4010f5010..fe94a9a40 100644 --- a/src/draw/renesas/dave2d/lv_draw_dave2d_mask_rectangle.c +++ b/src/draw/renesas/dave2d/lv_draw_dave2d_mask_rectangle.c @@ -8,7 +8,7 @@ void lv_draw_dave2d_mask_rect(lv_draw_dave2d_unit_t * u, const lv_draw_mask_rect int32_t x; int32_t y; - if(!_lv_area_intersect(&clipped_area, coords, u->base_unit.clip_area)) return; + if(!lv_area_intersect(&clipped_area, coords, u->base_unit.clip_area)) return; x = 0 - u->base_unit.target_layer->buf_area.x1; y = 0 - u->base_unit.target_layer->buf_area.y1; diff --git a/src/draw/renesas/dave2d/lv_draw_dave2d_triangle.c b/src/draw/renesas/dave2d/lv_draw_dave2d_triangle.c index adb652052..502200797 100644 --- a/src/draw/renesas/dave2d/lv_draw_dave2d_triangle.c +++ b/src/draw/renesas/dave2d/lv_draw_dave2d_triangle.c @@ -15,7 +15,7 @@ void lv_draw_dave2d_triangle(lv_draw_dave2d_unit_t * u, const lv_draw_triangle_d tri_area.x2 = LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); tri_area.y2 = LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); - if(!_lv_area_intersect(&clipped_area, &tri_area, u->base_unit.clip_area)) return; + if(!lv_area_intersect(&clipped_area, &tri_area, u->base_unit.clip_area)) return; #if LV_USE_OS lv_result_t status; diff --git a/src/draw/sdl/lv_draw_sdl.c b/src/draw/sdl/lv_draw_sdl.c index 44826d7be..d72ab67ab 100644 --- a/src/draw/sdl/lv_draw_sdl.c +++ b/src/draw/sdl/lv_draw_sdl.c @@ -6,13 +6,13 @@ /********************* * INCLUDES *********************/ -#include "../lv_draw.h" +#include "../lv_draw_private.h" #if LV_USE_DRAW_SDL #include LV_SDL_INCLUDE_PATH #include #include "lv_draw_sdl.h" -#include "../../core/lv_refr.h" +#include "../../core/lv_refr_private.h" #include "../../display/lv_display_private.h" #include "../../stdlib/lv_string.h" #include "../../drivers/sdl/lv_sdl_window.h" @@ -130,7 +130,7 @@ static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_SDL); if(t == NULL) return -1; - lv_display_t * disp = _lv_refr_get_disp_refreshing(); + lv_display_t * disp = lv_refr_get_disp_refreshing(); SDL_Texture * texture = layer_get_texture(layer); if(layer != disp->layer_head && texture == NULL) { void * buf = lv_draw_layer_alloc_buf(layer); @@ -184,7 +184,7 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * data) dest_layer._clip_area = task->area; lv_memzero(sdl_render_buf, lv_area_get_size(&dest_layer.buf_area) * 4 + 100); - lv_display_t * disp = _lv_refr_get_disp_refreshing(); + lv_display_t * disp = lv_refr_get_disp_refreshing(); SDL_Texture * texture = NULL; switch(task->type) { @@ -307,7 +307,7 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * data) static void blend_texture_layer(lv_draw_sdl_unit_t * u) { - lv_display_t * disp = _lv_refr_get_disp_refreshing(); + lv_display_t * disp = lv_refr_get_disp_refreshing(); SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); SDL_Rect clip_rect; @@ -362,7 +362,7 @@ static void draw_from_cached_texture(lv_draw_sdl_unit_t * u) cache_data_t * data_cached = lv_cache_entry_get_data(entry_cached); SDL_Texture * texture = data_cached->texture; - lv_display_t * disp = _lv_refr_get_disp_refreshing(); + lv_display_t * disp = lv_refr_get_disp_refreshing(); SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); lv_layer_t * dest_layer = u->base_unit.target_layer; diff --git a/src/draw/sw/arm2d/lv_draw_sw_arm2d.h b/src/draw/sw/arm2d/lv_draw_sw_arm2d.h index 3f16382f7..9c09480d4 100644 --- a/src/draw/sw/arm2d/lv_draw_sw_arm2d.h +++ b/src/draw/sw/arm2d/lv_draw_sw_arm2d.h @@ -37,7 +37,7 @@ extern "C" { *********************/ #ifndef LV_DRAW_SW_RGB565_SWAP #define LV_DRAW_SW_RGB565_SWAP(__buf_ptr, __buf_size_px) \ - _lv_draw_sw_rgb565_swap_helium((__buf_ptr), (__buf_size_px)) + lv_draw_sw_rgb565_swap_helium((__buf_ptr), (__buf_size_px)) #endif #ifndef LV_DRAW_SW_IMAGE @@ -49,7 +49,7 @@ extern "C" { __blend_area, \ __draw_unit, \ __draw_dsc) \ - _lv_draw_sw_image_helium( (__transformed), \ + lv_draw_sw_image_helium( (__transformed), \ (__cf), \ (uint8_t *)(__src_buf), \ (__img_coords), \ @@ -61,7 +61,7 @@ extern "C" { #ifndef LV_DRAW_SW_RGB565_RECOLOR #define LV_DRAW_SW_RGB565_RECOLOR(__src_buf, __blend_area, __color, __opa) \ - _lv_draw_sw_image_recolor_rgb565( (__src_buf), \ + lv_draw_sw_image_recolor_rgb565( (__src_buf), \ &(__blend_area), \ (__color), \ (__opa)) @@ -73,7 +73,7 @@ extern "C" { __color, \ __opa, \ __cf) \ - _lv_draw_sw_image_recolor_rgb888( (__src_buf), \ + lv_draw_sw_image_recolor_rgb888( (__src_buf), \ &(__blend_area), \ (__color), \ (__opa), \ @@ -161,14 +161,14 @@ extern void arm_2d_helper_swap_rgb16(uint16_t * phwBuffer, uint32_t wCount); } \ } while(0); -static inline lv_result_t _lv_draw_sw_rgb565_swap_helium(void * buf, uint32_t buf_size_px) +static inline lv_result_t lv_draw_sw_rgb565_swap_helium(void * buf, uint32_t buf_size_px) { arm_2d_helper_swap_rgb16((uint16_t *)buf, buf_size_px); return LV_RESULT_OK; } -static inline lv_result_t _lv_draw_sw_image_helium( - bool is_transform, +static inline lv_result_t lv_draw_sw_image_helium( + bool is_transform, lv_color_format_t src_cf, const uint8_t *src_buf, const lv_area_t * coords, @@ -217,7 +217,7 @@ static inline lv_result_t _lv_draw_sw_image_helium( /* ------------- prepare parameters for arm-2d APIs - BEGIN --------- */ lv_area_t blend_area; - if(!_lv_area_intersect(&blend_area, des_area, draw_unit->clip_area)) { + if(!lv_area_intersect(&blend_area, des_area, draw_unit->clip_area)) { break; } @@ -241,17 +241,17 @@ static inline lv_result_t _lv_draw_sw_image_helium( // des_size.iWidth = (int16_t)des_w; // des_size.iHeight = (int16_t)des_h; // } while(0); -// +// // arm_2d_size_t copy_size = { // .iWidth = MIN(des_size.iWidth, src_size.iWidth), // .iHeight = MIN(des_size.iHeight, src_size.iHeight), // }; -// +// // int32_t des_stride = lv_draw_buf_width_to_stride( -// lv_area_get_width(&layer->buf_area), +// lv_area_get_width(&layer->buf_area), // des_cf); // uint8_t *des_buf_moved = (uint8_t *)lv_draw_layer_go_to_xy( -// layer, +// layer, // blend_area.x1 - layer->buf_area.x1, // blend_area.y1 - layer->buf_area.y1); uint8_t *des_buf = (uint8_t *)lv_draw_layer_go_to_xy(layer, 0, 0); @@ -524,7 +524,7 @@ static inline lv_result_t _lv_draw_sw_image_helium( return result; } -static inline lv_result_t _lv_draw_sw_image_recolor_rgb565( +static inline lv_result_t lv_draw_sw_image_recolor_rgb565( const uint8_t *src_buf, const lv_area_t * blend_area, lv_color_t color, @@ -548,7 +548,7 @@ static inline lv_result_t _lv_draw_sw_image_recolor_rgb565( return LV_RESULT_OK; } -static inline lv_result_t _lv_draw_sw_image_recolor_rgb888( +static inline lv_result_t lv_draw_sw_image_recolor_rgb888( const uint8_t *src_buf, const lv_area_t * blend_area, lv_color_t color, diff --git a/src/draw/sw/blend/arm2d/lv_blend_arm2d.h b/src/draw/sw/blend/arm2d/lv_blend_arm2d.h index 3cd42260b..77b4e2bc1 100644 --- a/src/draw/sw/blend/arm2d/lv_blend_arm2d.h +++ b/src/draw/sw/blend/arm2d/lv_blend_arm2d.h @@ -35,162 +35,162 @@ extern "C" { #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565 #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc) \ - _lv_color_blend_to_rgb565_arm2d(dsc) + lv_color_blend_to_rgb565_arm2d(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc) \ - _lv_color_blend_to_rgb565_with_opa_arm2d(dsc) + lv_color_blend_to_rgb565_with_opa_arm2d(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc) \ - _lv_color_blend_to_rgb565_with_mask_arm2d(dsc) + lv_color_blend_to_rgb565_with_mask_arm2d(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc) \ - _lv_color_blend_to_rgb565_mix_mask_opa_arm2d(dsc) + lv_color_blend_to_rgb565_mix_mask_opa_arm2d(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565 #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc) \ - _lv_rgb565_blend_normal_to_rgb565_arm2d(dsc) + lv_rgb565_blend_normal_to_rgb565_arm2d(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ - _lv_rgb565_blend_normal_to_rgb565_with_opa_arm2d(dsc) + lv_rgb565_blend_normal_to_rgb565_with_opa_arm2d(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ - _lv_rgb565_blend_normal_to_rgb565_with_mask_arm2d(dsc) + lv_rgb565_blend_normal_to_rgb565_with_mask_arm2d(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ - _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc) + lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565 #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb565_arm2d(dsc, src_px_size) + lv_rgb888_blend_normal_to_rgb565_arm2d(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb565_with_opa_arm2d(dsc, src_px_size) + lv_rgb888_blend_normal_to_rgb565_with_opa_arm2d(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb565_with_mask_arm2d(dsc, src_px_size) + lv_rgb888_blend_normal_to_rgb565_with_mask_arm2d(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc, src_px_size) + lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565 #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc) \ - _lv_argb8888_blend_normal_to_rgb565_arm2d(dsc) + lv_argb8888_blend_normal_to_rgb565_arm2d(dsc) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ - _lv_argb8888_blend_normal_to_rgb565_with_opa_arm2d(dsc) + lv_argb8888_blend_normal_to_rgb565_with_opa_arm2d(dsc) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ - _lv_argb8888_blend_normal_to_rgb565_with_mask_arm2d(dsc) + lv_argb8888_blend_normal_to_rgb565_with_mask_arm2d(dsc) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ - _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc) + lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dst_px_size) \ - _lv_color_blend_to_rgb888_arm2d(dsc, dst_px_size) + lv_color_blend_to_rgb888_arm2d(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - _lv_color_blend_to_rgb888_with_opa_arm2d(dsc, dst_px_size) + lv_color_blend_to_rgb888_with_opa_arm2d(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - _lv_color_blend_to_rgb888_with_mask_arm2d(dsc, dst_px_size) + lv_color_blend_to_rgb888_with_mask_arm2d(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - _lv_color_blend_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size) + lv_color_blend_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ - _lv_rgb565_blend_normal_to_rgb888_arm2d(dsc, dst_px_size) + lv_rgb565_blend_normal_to_rgb888_arm2d(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - _lv_rgb565_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size) + lv_rgb565_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - _lv_rgb565_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size) + lv_rgb565_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size) + lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb888_arm2d(dsc, dst_px_size, src_px_size) + lv_rgb888_blend_normal_to_rgb888_arm2d(dsc, dst_px_size, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size, src_px_size) + lv_rgb888_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size, src_px_size) + lv_rgb888_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size, src_px_size) + lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size, src_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ - _lv_argb8888_blend_normal_to_rgb888_arm2d(dsc, dst_px_size) + lv_argb8888_blend_normal_to_rgb888_arm2d(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - _lv_argb8888_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size) + lv_argb8888_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - _lv_argb8888_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size) + lv_argb8888_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size) + lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size) #endif /********************** @@ -201,7 +201,7 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -static inline lv_result_t _lv_color_blend_to_rgb565_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_rgb565_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc) { arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); @@ -212,7 +212,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_arm2d(_lv_draw_sw_blend_fill return LV_RESULT_OK; } -static inline lv_result_t _lv_color_blend_to_rgb565_with_opa_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_rgb565_with_opa_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc) { arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); @@ -224,7 +224,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_with_opa_arm2d(_lv_draw_sw_b return LV_RESULT_OK; } -static inline lv_result_t _lv_color_blend_to_rgb565_with_mask_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_rgb565_with_mask_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc) { arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); @@ -237,7 +237,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_with_mask_arm2d(_lv_draw_sw_ return LV_RESULT_OK; } -static inline lv_result_t _lv_color_blend_to_rgb565_mix_mask_opa_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_rgb565_mix_mask_opa_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc) { arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); @@ -251,7 +251,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_mix_mask_opa_arm2d(_lv_draw_ return LV_RESULT_OK; } -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) { arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; @@ -265,7 +265,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_arm2d(_lv_draw_sw_bl return LV_RESULT_OK; } -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) { arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); @@ -279,7 +279,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_opa_arm2d(_lv_d return LV_RESULT_OK; } -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) { arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); @@ -295,7 +295,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_mask_arm2d(_lv_ return LV_RESULT_OK; } -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) { arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); @@ -318,8 +318,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_arm2d(_ return LV_RESULT_OK; } -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { if(src_px_size == 3) { return LV_RESULT_INVALID; @@ -338,8 +338,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_arm2d(_lv_draw_sw_bl return LV_RESULT_OK; } -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { if(src_px_size == 3) { return LV_RESULT_INVALID; @@ -371,8 +371,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_opa_arm2d(_lv_d return LV_RESULT_OK; } -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { if(src_px_size == 3) { return LV_RESULT_INVALID; @@ -406,8 +406,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_mask_arm2d(_lv_ return LV_RESULT_OK; } -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { if(src_px_size == 3) { return LV_RESULT_INVALID; @@ -447,7 +447,7 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_arm2d(_ return LV_RESULT_OK; } -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) { arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); @@ -487,7 +487,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_arm2d(_lv_draw_sw_ return LV_RESULT_OK; } -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) { arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); @@ -548,7 +548,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_opa_arm2d(_lv return LV_RESULT_OK; } -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) { arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); @@ -611,7 +611,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_mask_arm2d(_l return LV_RESULT_OK; } -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) { arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); @@ -674,7 +674,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_arm2d return LV_RESULT_OK; } -static inline lv_result_t _lv_color_blend_to_rgb888_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size) +static inline lv_result_t lv_color_blend_to_rgb888_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size) { if(dst_px_size == 3) { return LV_RESULT_INVALID; @@ -689,8 +689,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_arm2d(_lv_draw_sw_blend_fill } -static inline lv_result_t _lv_color_blend_to_rgb888_with_opa_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_color_blend_to_rgb888_with_opa_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) { if(dst_px_size == 3) { return LV_RESULT_INVALID; @@ -706,8 +706,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_with_opa_arm2d(_lv_draw_sw_b return LV_RESULT_OK; } -static inline lv_result_t _lv_color_blend_to_rgb888_with_mask_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_color_blend_to_rgb888_with_mask_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) { if(dst_px_size == 3) { @@ -725,8 +725,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_with_mask_arm2d(_lv_draw_sw_ return LV_RESULT_OK; } -static inline lv_result_t _lv_color_blend_to_rgb888_mix_mask_opa_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_color_blend_to_rgb888_mix_mask_opa_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) { if(dst_px_size == 3) { @@ -745,8 +745,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_mix_mask_opa_arm2d(_lv_draw_ return LV_RESULT_OK; } -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { if(dst_px_size == 3) { @@ -767,8 +767,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_arm2d(_lv_draw_sw_bl } -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { if(dst_px_size == 3) { @@ -802,8 +802,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_opa_arm2d(_lv_d return LV_RESULT_OK; } -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { if(dst_px_size == 3) { @@ -838,8 +838,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_mask_arm2d(_lv_ return LV_RESULT_OK; } -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { if(dst_px_size == 3) { @@ -880,9 +880,9 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_arm2d(_ return LV_RESULT_OK; } -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, + uint32_t src_px_size) { if((dst_px_size == 3) || (src_px_size == 3)) { return LV_RESULT_INVALID; @@ -901,8 +901,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_arm2d(_lv_draw_sw_bl return LV_RESULT_OK; } -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) { if((dst_px_size == 3) || (src_px_size == 3)) { return LV_RESULT_INVALID; @@ -922,8 +922,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_opa_arm2d(_lv_d return LV_RESULT_OK; } -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) { if((dst_px_size == 3) || (src_px_size == 3)) { return LV_RESULT_INVALID; @@ -944,8 +944,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_mask_arm2d(_lv_ return LV_RESULT_OK; } -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) { if((dst_px_size == 3) || (src_px_size == 3)) { return LV_RESULT_INVALID; @@ -972,8 +972,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_arm2d(_ return LV_RESULT_OK; } -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { if(dst_px_size == 3) { @@ -1003,8 +1003,8 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_arm2d(_lv_draw_sw_ return LV_RESULT_OK; } -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { if(dst_px_size == 3) { return LV_RESULT_INVALID; @@ -1053,8 +1053,8 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_opa_arm2d(_lv return LV_RESULT_OK; } -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { if(dst_px_size == 3) { @@ -1092,8 +1092,8 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_mask_arm2d(_l return LV_RESULT_OK; } -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { if(dst_px_size == 3) { return LV_RESULT_INVALID; diff --git a/src/draw/sw/blend/helium/lv_blend_helium.h b/src/draw/sw/blend/helium/lv_blend_helium.h index f8964e9d9..69b999efc 100644 --- a/src/draw/sw/blend/helium/lv_blend_helium.h +++ b/src/draw/sw/blend/helium/lv_blend_helium.h @@ -41,242 +41,242 @@ extern "C" { #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565 #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc) \ - _lv_color_blend_to_rgb565_helium(dsc) + lv_color_blend_to_rgb565_helium(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc) \ - _lv_color_blend_to_rgb565_with_opa_helium(dsc) + lv_color_blend_to_rgb565_with_opa_helium(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc) \ - _lv_color_blend_to_rgb565_with_mask_helium(dsc) + lv_color_blend_to_rgb565_with_mask_helium(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc) \ - _lv_color_blend_to_rgb565_mix_mask_opa_helium(dsc) + lv_color_blend_to_rgb565_mix_mask_opa_helium(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565 #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc) \ - _lv_rgb565_blend_normal_to_rgb565_helium(dsc) + lv_rgb565_blend_normal_to_rgb565_helium(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ - _lv_rgb565_blend_normal_to_rgb565_with_opa_helium(dsc) + lv_rgb565_blend_normal_to_rgb565_with_opa_helium(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ - _lv_rgb565_blend_normal_to_rgb565_with_mask_helium(dsc) + lv_rgb565_blend_normal_to_rgb565_with_mask_helium(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ - _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(dsc) + lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(dsc) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565 #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb565_helium(dsc, src_px_size) + lv_rgb888_blend_normal_to_rgb565_helium(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb565_with_opa_helium(dsc, src_px_size) + lv_rgb888_blend_normal_to_rgb565_with_opa_helium(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb565_with_mask_helium(dsc, src_px_size) + lv_rgb888_blend_normal_to_rgb565_with_mask_helium(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(dsc, src_px_size) + lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565 #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc) \ - _lv_argb8888_blend_normal_to_rgb565_helium(dsc) + lv_argb8888_blend_normal_to_rgb565_helium(dsc) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ - _lv_argb8888_blend_normal_to_rgb565_with_opa_helium(dsc) + lv_argb8888_blend_normal_to_rgb565_with_opa_helium(dsc) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ - _lv_argb8888_blend_normal_to_rgb565_with_mask_helium(dsc) + lv_argb8888_blend_normal_to_rgb565_with_mask_helium(dsc) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ - _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(dsc) + lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dst_px_size) \ - _lv_color_blend_to_rgb888_helium(dsc, dst_px_size) + lv_color_blend_to_rgb888_helium(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - _lv_color_blend_to_rgb888_with_opa_helium(dsc, dst_px_size) + lv_color_blend_to_rgb888_with_opa_helium(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - _lv_color_blend_to_rgb888_with_mask_helium(dsc, dst_px_size) + lv_color_blend_to_rgb888_with_mask_helium(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - _lv_color_blend_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size) + lv_color_blend_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ - _lv_rgb565_blend_normal_to_rgb888_helium(dsc, dst_px_size) + lv_rgb565_blend_normal_to_rgb888_helium(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - _lv_rgb565_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size) + lv_rgb565_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - _lv_rgb565_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size) + lv_rgb565_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size) + lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb888_helium(dsc, dst_px_size, src_px_size) + lv_rgb888_blend_normal_to_rgb888_helium(dsc, dst_px_size, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size, src_px_size) + lv_rgb888_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size, src_px_size) + lv_rgb888_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size, src_px_size) + lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size, src_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ - _lv_argb8888_blend_normal_to_rgb888_helium(dsc, dst_px_size) + lv_argb8888_blend_normal_to_rgb888_helium(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - _lv_argb8888_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size) + lv_argb8888_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - _lv_argb8888_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size) + lv_argb8888_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size) + lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888 #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888(dsc) \ - _lv_color_blend_to_argb8888_helium(dsc) + lv_color_blend_to_argb8888_helium(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA(dsc) \ - _lv_color_blend_to_argb8888_with_opa_helium(dsc) + lv_color_blend_to_argb8888_with_opa_helium(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK(dsc) \ - _lv_color_blend_to_argb8888_with_mask_helium(dsc) + lv_color_blend_to_argb8888_with_mask_helium(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA(dsc) \ - _lv_color_blend_to_argb8888_mix_mask_opa_helium(dsc) + lv_color_blend_to_argb8888_mix_mask_opa_helium(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888 #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(dsc) \ - _lv_rgb565_blend_normal_to_argb8888_helium(dsc) + lv_rgb565_blend_normal_to_argb8888_helium(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \ - _lv_rgb565_blend_normal_to_argb8888_with_opa_helium(dsc) + lv_rgb565_blend_normal_to_argb8888_with_opa_helium(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \ - _lv_rgb565_blend_normal_to_argb8888_with_mask_helium(dsc) + lv_rgb565_blend_normal_to_argb8888_with_mask_helium(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \ - _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(dsc) + lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(dsc) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888 #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_argb8888_helium(dsc, src_px_size) + lv_rgb888_blend_normal_to_argb8888_helium(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_argb8888_with_opa_helium(dsc, src_px_size) + lv_rgb888_blend_normal_to_argb8888_with_opa_helium(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_argb8888_with_mask_helium(dsc, src_px_size) + lv_rgb888_blend_normal_to_argb8888_with_mask_helium(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(dsc, src_px_size) + lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888 #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(dsc) \ - _lv_argb8888_blend_normal_to_argb8888_helium(dsc) + lv_argb8888_blend_normal_to_argb8888_helium(dsc) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \ - _lv_argb8888_blend_normal_to_argb8888_with_opa_helium(dsc) + lv_argb8888_blend_normal_to_argb8888_with_opa_helium(dsc) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \ - _lv_argb8888_blend_normal_to_argb8888_with_mask_helium(dsc) + lv_argb8888_blend_normal_to_argb8888_with_mask_helium(dsc) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \ - _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(dsc) + lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(dsc) #endif /********************** @@ -299,7 +299,7 @@ typedef struct { **********************/ extern void lv_color_blend_to_rgb565_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb565_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_rgb565_helium(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -314,7 +314,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_helium(_lv_draw_sw_blend_fil } extern void lv_color_blend_to_rgb565_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb565_with_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_rgb565_with_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -329,7 +329,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_with_opa_helium(_lv_draw_sw_ } extern void lv_color_blend_to_rgb565_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb565_with_mask_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_rgb565_with_mask_helium(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -345,7 +345,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_with_mask_helium(_lv_draw_sw } extern void lv_color_blend_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_rgb565_mix_mask_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -362,7 +362,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_mix_mask_opa_helium(_lv_draw } extern void lv_rgb565_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -377,7 +377,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_helium(_lv_draw_sw_b } extern void lv_rgb565_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -393,7 +393,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_opa_helium(_lv_ } extern void lv_rgb565_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -410,7 +410,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_mask_helium(_lv } extern void lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -429,8 +429,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium( extern void lv_rgb888_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -451,8 +451,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_helium(_lv_draw_sw_b extern void lv_rgb888_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -474,8 +474,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_opa_helium(_lv_ extern void lv_rgb888_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -498,8 +498,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_mask_helium(_lv extern void lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -522,7 +522,7 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium( } extern void lv_argb8888_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -537,7 +537,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_helium(_lv_draw_sw } extern void lv_argb8888_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -553,7 +553,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_opa_helium(_l } extern void lv_argb8888_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -570,7 +570,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_mask_helium(_ } extern void lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -589,7 +589,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_heliu extern void lv_color_blend_to_rgb888_helium(asm_dsc_t * dsc); extern void lv_color_blend_to_xrgb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb888_helium(_lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size) +static inline lv_result_t lv_color_blend_to_rgb888_helium(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -609,8 +609,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_helium(_lv_draw_sw_blend_fil extern void lv_color_blend_to_rgb888_with_opa_helium(asm_dsc_t * dsc); extern void lv_color_blend_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb888_with_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_color_blend_to_rgb888_with_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -631,8 +631,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_with_opa_helium(_lv_draw_sw_ extern void lv_color_blend_to_rgb888_with_mask_helium(asm_dsc_t * dsc); extern void lv_color_blend_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb888_with_mask_helium(_lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_color_blend_to_rgb888_with_mask_helium(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -654,8 +654,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_with_mask_helium(_lv_draw_sw extern void lv_color_blend_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); extern void lv_color_blend_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_color_blend_to_rgb888_mix_mask_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -678,8 +678,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_mix_mask_opa_helium(_lv_draw extern void lv_rgb565_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); extern void lv_rgb565_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -700,8 +700,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_helium(_lv_draw_sw_b extern void lv_rgb565_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); extern void lv_rgb565_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -723,8 +723,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_opa_helium(_lv_ extern void lv_rgb565_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); extern void lv_rgb565_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -747,8 +747,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_mask_helium(_lv extern void lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); extern void lv_rgb565_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -774,9 +774,9 @@ extern void lv_rgb888_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); extern void lv_rgb888_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -809,8 +809,8 @@ extern void lv_rgb888_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); extern void lv_rgb888_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -844,8 +844,8 @@ extern void lv_rgb888_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); extern void lv_rgb888_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -880,8 +880,8 @@ extern void lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc extern void lv_rgb888_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -915,8 +915,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium( extern void lv_argb8888_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); extern void lv_argb8888_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -937,8 +937,8 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_helium(_lv_draw_sw extern void lv_argb8888_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); extern void lv_argb8888_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -960,8 +960,8 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_opa_helium(_l extern void lv_argb8888_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); extern void lv_argb8888_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -984,8 +984,8 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_mask_helium(_ extern void lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); extern void lv_argb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -1008,7 +1008,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_heliu } extern void lv_color_blend_to_argb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_argb8888_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_argb8888_helium(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1023,7 +1023,7 @@ static inline lv_result_t _lv_color_blend_to_argb8888_helium(_lv_draw_sw_blend_f } extern void lv_color_blend_to_argb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_argb8888_with_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_argb8888_with_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -1038,7 +1038,7 @@ static inline lv_result_t _lv_color_blend_to_argb8888_with_opa_helium(_lv_draw_s } extern void lv_color_blend_to_argb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_argb8888_with_mask_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_argb8888_with_mask_helium(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1054,7 +1054,7 @@ static inline lv_result_t _lv_color_blend_to_argb8888_with_mask_helium(_lv_draw_ } extern void lv_color_blend_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_argb8888_mix_mask_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -1071,7 +1071,7 @@ static inline lv_result_t _lv_color_blend_to_argb8888_mix_mask_opa_helium(_lv_dr } extern void lv_rgb565_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1086,7 +1086,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_helium(_lv_draw_sw } extern void lv_rgb565_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -1102,7 +1102,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_opa_helium(_l } extern void lv_rgb565_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1119,7 +1119,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_mask_helium(_ } extern void lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -1138,8 +1138,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_heliu extern void lv_rgb888_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1160,8 +1160,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_helium(_lv_draw_sw extern void lv_rgb888_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -1183,8 +1183,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_opa_helium(_l extern void lv_rgb888_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1207,8 +1207,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_mask_helium(_ extern void lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -1231,7 +1231,7 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_heliu } extern void lv_argb8888_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1246,7 +1246,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_helium(_lv_draw_ } extern void lv_argb8888_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -1262,7 +1262,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_opa_helium( } extern void lv_argb8888_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1279,7 +1279,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_mask_helium } extern void lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, diff --git a/src/draw/sw/blend/lv_draw_sw_blend.c b/src/draw/sw/blend/lv_draw_sw_blend.c index c6151cc10..6f48eba64 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend.c +++ b/src/draw/sw/blend/lv_draw_sw_blend.c @@ -6,6 +6,9 @@ /********************* * INCLUDES *********************/ +#include "../../../misc/lv_area_private.h" +#include "lv_draw_sw_blend_private.h" +#include "../../lv_draw_private.h" #include "../lv_draw_sw.h" #if LV_DRAW_SW_SUPPORT_L8 #include "lv_draw_sw_blend_to_l8.h" @@ -57,14 +60,14 @@ void lv_draw_sw_blend(lv_draw_unit_t * draw_unit, const lv_draw_sw_blend_dsc_t * if(blend_dsc->mask_buf && blend_dsc->mask_res == LV_DRAW_SW_MASK_RES_TRANSP) return; lv_area_t blend_area; - if(!_lv_area_intersect(&blend_area, blend_dsc->blend_area, draw_unit->clip_area)) return; + if(!lv_area_intersect(&blend_area, blend_dsc->blend_area, draw_unit->clip_area)) return; LV_PROFILER_BEGIN; lv_layer_t * layer = draw_unit->target_layer; uint32_t layer_stride_byte = layer->draw_buf->header.stride; if(blend_dsc->src_buf == NULL) { - _lv_draw_sw_blend_fill_dsc_t fill_dsc; + lv_draw_sw_blend_fill_dsc_t fill_dsc; fill_dsc.dest_w = lv_area_get_width(&blend_area); fill_dsc.dest_h = lv_area_get_height(&blend_area); fill_dsc.dest_stride = layer_stride_byte; @@ -127,17 +130,17 @@ void lv_draw_sw_blend(lv_draw_unit_t * draw_unit, const lv_draw_sw_blend_dsc_t * } } else { - if(!_lv_area_intersect(&blend_area, &blend_area, blend_dsc->src_area)) { + if(!lv_area_intersect(&blend_area, &blend_area, blend_dsc->src_area)) { LV_PROFILER_END; return; } - if(blend_dsc->mask_area && !_lv_area_intersect(&blend_area, &blend_area, blend_dsc->mask_area)) { + if(blend_dsc->mask_area && !lv_area_intersect(&blend_area, &blend_area, blend_dsc->mask_area)) { LV_PROFILER_END; return; } - _lv_draw_sw_blend_image_dsc_t image_dsc; + lv_draw_sw_blend_image_dsc_t image_dsc; image_dsc.dest_w = lv_area_get_width(&blend_area); image_dsc.dest_h = lv_area_get_height(&blend_area); image_dsc.dest_stride = layer_stride_byte; diff --git a/src/draw/sw/blend/lv_draw_sw_blend.h b/src/draw/sw/blend/lv_draw_sw_blend.h index eada7ba48..1528cacc3 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend.h +++ b/src/draw/sw/blend/lv_draw_sw_blend.h @@ -28,50 +28,6 @@ extern "C" { * TYPEDEFS **********************/ -typedef struct { - const lv_area_t * blend_area; /**< The area with absolute coordinates to draw on `layer->buf` - * will be clipped to `layer->clip_area` */ - const void * src_buf; /**< Pointer to an image to blend. If set `fill_color` is ignored */ - uint32_t src_stride; - lv_color_format_t src_color_format; - const lv_area_t * src_area; - lv_opa_t opa; /**< The overall opacity*/ - lv_color_t color; /**< Fill color*/ - const lv_opa_t * mask_buf; /**< NULL if ignored, or an alpha mask to apply on `blend_area`*/ - lv_draw_sw_mask_res_t mask_res; /**< The result of the previous mask operation */ - const lv_area_t * mask_area; /**< The area of `mask_buf` with absolute coordinates*/ - int32_t mask_stride; - lv_blend_mode_t blend_mode; /**< E.g. LV_BLEND_MODE_ADDITIVE*/ -} lv_draw_sw_blend_dsc_t; - -typedef struct { - void * dest_buf; - int32_t dest_w; - int32_t dest_h; - int32_t dest_stride; - const lv_opa_t * mask_buf; - int32_t mask_stride; - lv_color_t color; - lv_opa_t opa; - lv_area_t relative_area; -} _lv_draw_sw_blend_fill_dsc_t; - -typedef struct { - void * dest_buf; - int32_t dest_w; - int32_t dest_h; - int32_t dest_stride; - const lv_opa_t * mask_buf; - int32_t mask_stride; - const void * src_buf; - int32_t src_stride; - lv_color_format_t src_color_format; - lv_opa_t opa; - lv_blend_mode_t blend_mode; - lv_area_t relative_area; /**< The blend area relative to the layer's buffer area. */ - lv_area_t src_area; /**< The original src area. */ -} _lv_draw_sw_blend_image_dsc_t; - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/draw/sw/blend/lv_draw_sw_blend_private.h b/src/draw/sw/blend/lv_draw_sw_blend_private.h new file mode 100644 index 000000000..9582049e6 --- /dev/null +++ b/src/draw/sw/blend/lv_draw_sw_blend_private.h @@ -0,0 +1,92 @@ +/** + * @file lv_draw_sw_blend_private.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_PRIVATE_H +#define LV_DRAW_SW_BLEND_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_sw_blend.h" + +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_draw_sw_blend_dsc_t { + const lv_area_t * blend_area; /**< The area with absolute coordinates to draw on `layer->buf` + * will be clipped to `layer->clip_area` */ + const void * src_buf; /**< Pointer to an image to blend. If set `fill_color` is ignored */ + uint32_t src_stride; + lv_color_format_t src_color_format; + const lv_area_t * src_area; + lv_opa_t opa; /**< The overall opacity*/ + lv_color_t color; /**< Fill color*/ + const lv_opa_t * mask_buf; /**< NULL if ignored, or an alpha mask to apply on `blend_area`*/ + lv_draw_sw_mask_res_t mask_res; /**< The result of the previous mask operation */ + const lv_area_t * mask_area; /**< The area of `mask_buf` with absolute coordinates*/ + int32_t mask_stride; + lv_blend_mode_t blend_mode; /**< E.g. LV_BLEND_MODE_ADDITIVE*/ +}; + +struct lv_draw_sw_blend_fill_dsc_t { + void * dest_buf; + int32_t dest_w; + int32_t dest_h; + int32_t dest_stride; + const lv_opa_t * mask_buf; + int32_t mask_stride; + lv_color_t color; + lv_opa_t opa; + lv_area_t relative_area; +}; + +struct lv_draw_sw_blend_image_dsc_t { + void * dest_buf; + int32_t dest_w; + int32_t dest_h; + int32_t dest_stride; + const lv_opa_t * mask_buf; + int32_t mask_stride; + const void * src_buf; + int32_t src_stride; + lv_color_format_t src_color_format; + lv_opa_t opa; + lv_blend_mode_t blend_mode; + lv_area_t relative_area; /**< The blend area relative to the layer's buffer area. */ + lv_area_t src_area; /**< The original src area. */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_DRAW_SW */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_PRIVATE_H*/ diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_al88.c b/src/draw/sw/blend/lv_draw_sw_blend_to_al88.c index 81d39de01..9c3194c20 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_al88.c +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_al88.c @@ -11,7 +11,7 @@ #if LV_DRAW_SW_SUPPORT_AL88 -#include "lv_draw_sw_blend.h" +#include "lv_draw_sw_blend_private.h" #include "../../../misc/lv_math.h" #include "../../../display/lv_display.h" #include "../../../core/lv_refr.h" @@ -47,28 +47,28 @@ typedef struct { **********************/ #if LV_DRAW_SW_SUPPORT_L8 - static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif #if LV_DRAW_SW_SUPPORT_I1 - static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); #endif -static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); +static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #if LV_DRAW_SW_SUPPORT_RGB565 - static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif #if LV_DRAW_SW_SUPPORT_RGB888 -static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size); #endif #if LV_DRAW_SW_SUPPORT_ARGB8888 - static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif static void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache); @@ -194,7 +194,7 @@ static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_16a_16a_mix(lv_color16a_ * GLOBAL FUNCTIONS **********************/ -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_al88(_lv_draw_sw_blend_fill_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_al88(lv_draw_sw_blend_fill_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -306,7 +306,7 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_al88(_lv_draw_sw_blend_fill } } -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_al88(_lv_draw_sw_blend_image_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_al88(lv_draw_sw_blend_image_dsc_t * dsc) { switch(dsc->src_color_format) { #if LV_DRAW_SW_SUPPORT_RGB565 @@ -352,7 +352,7 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_al88(_lv_draw_sw_blend_imag * STATIC FUNCTIONS **********************/ #if LV_DRAW_SW_SUPPORT_I1 -static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -445,7 +445,7 @@ static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(_lv_draw_sw_blend_image_dsc_t * #endif #if LV_DRAW_SW_SUPPORT_L8 -static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -538,7 +538,7 @@ static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(_lv_draw_sw_blend_image_dsc_t * #endif -static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -626,7 +626,7 @@ static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(_lv_draw_sw_blend_image_dsc_t #if LV_DRAW_SW_SUPPORT_RGB565 -static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -721,7 +721,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc #if LV_DRAW_SW_SUPPORT_RGB888 -static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) { int32_t w = dsc->dest_w; @@ -823,7 +823,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc #if LV_DRAW_SW_SUPPORT_ARGB8888 -static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_al88.h b/src/draw/sw/blend/lv_draw_sw_blend_to_al88.h index 90edb1dba..b83523b92 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_al88.h +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_al88.h @@ -28,9 +28,9 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_al88(_lv_draw_sw_blend_fill_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_al88(lv_draw_sw_blend_fill_dsc_t * dsc); -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_al88(_lv_draw_sw_blend_image_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_al88(lv_draw_sw_blend_image_dsc_t * dsc); /********************** * MACROS diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c b/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c index 76d308f85..4bf3ef491 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c @@ -11,7 +11,7 @@ #if LV_DRAW_SW_SUPPORT_ARGB8888 -#include "lv_draw_sw_blend.h" +#include "lv_draw_sw_blend_private.h" #include "../../../misc/lv_math.h" #include "../../../display/lv_display.h" #include "../../../core/lv_refr.h" @@ -47,29 +47,29 @@ typedef struct { **********************/ #if LV_DRAW_SW_SUPPORT_AL88 - static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif #if LV_DRAW_SW_SUPPORT_I1 - static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); #endif #if LV_DRAW_SW_SUPPORT_L8 - static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif #if LV_DRAW_SW_SUPPORT_RGB565 - static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif #if LV_DRAW_SW_SUPPORT_RGB888 -static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size); #endif -static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); +static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_32_mix(const uint8_t src, lv_color32_t * dest, uint8_t mix); @@ -206,7 +206,7 @@ static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * b * GLOBAL FUNCTIONS **********************/ -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_argb8888(_lv_draw_sw_blend_fill_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_argb8888(lv_draw_sw_blend_fill_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -315,7 +315,7 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_argb8888(_lv_draw_sw_blend_ } } -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_argb8888(_lv_draw_sw_blend_image_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_argb8888(lv_draw_sw_blend_image_dsc_t * dsc) { switch(dsc->src_color_format) { #if LV_DRAW_SW_SUPPORT_RGB565 @@ -362,7 +362,7 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_argb8888(_lv_draw_sw_blend_ **********************/ #if LV_DRAW_SW_SUPPORT_I1 -static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -455,7 +455,7 @@ static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(_lv_draw_sw_blend_image_dsc_t * #endif #if LV_DRAW_SW_SUPPORT_AL88 -static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -551,7 +551,7 @@ static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(_lv_draw_sw_blend_image_dsc_t #if LV_DRAW_SW_SUPPORT_L8 -static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -642,7 +642,7 @@ static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(_lv_draw_sw_blend_image_dsc_t * #if LV_DRAW_SW_SUPPORT_RGB565 -static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -741,7 +741,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc #if LV_DRAW_SW_SUPPORT_RGB888 -static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) { int32_t w = dsc->dest_w; @@ -861,7 +861,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc #endif -static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h b/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h index 964991be6..2046c23f3 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h @@ -28,9 +28,9 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_argb8888(_lv_draw_sw_blend_fill_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_argb8888(lv_draw_sw_blend_fill_dsc_t * dsc); -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_argb8888(_lv_draw_sw_blend_image_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_argb8888(lv_draw_sw_blend_image_dsc_t * dsc); /********************** * MACROS diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_i1.c b/src/draw/sw/blend/lv_draw_sw_blend_to_i1.c index a50048521..1e056ee66 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_i1.c +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_i1.c @@ -9,7 +9,7 @@ #include "lv_draw_sw_blend_to_i1.h" #if LV_USE_DRAW_SW -#include "lv_draw_sw_blend.h" +#include "lv_draw_sw_blend_private.h" #include "../../../misc/lv_math.h" #include "../../../display/lv_display.h" #include "../../../core/lv_refr.h" @@ -36,27 +36,27 @@ * STATIC PROTOTYPES **********************/ -static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); +static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #if LV_DRAW_SW_SUPPORT_L8 - static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif #if LV_DRAW_SW_SUPPORT_AL88 - static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif #if LV_DRAW_SW_SUPPORT_RGB565 - static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif #if LV_DRAW_SW_SUPPORT_RGB888 -static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size); #endif #if LV_DRAW_SW_SUPPORT_ARGB8888 - static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_8_mix(const uint8_t src, uint8_t * dest, uint8_t mix); @@ -200,7 +200,7 @@ static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * b * GLOBAL FUNCTIONS **********************/ -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_i1(_lv_draw_sw_blend_fill_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_i1(lv_draw_sw_blend_fill_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -306,7 +306,7 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_i1(_lv_draw_sw_blend_fill_d } } -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_i1(_lv_draw_sw_blend_image_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_i1(lv_draw_sw_blend_image_dsc_t * dsc) { switch(dsc->src_color_format) { #if LV_DRAW_SW_SUPPORT_RGB565 @@ -352,7 +352,7 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_i1(_lv_draw_sw_blend_image_ * STATIC FUNCTIONS **********************/ -static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -470,7 +470,7 @@ static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(_lv_draw_sw_blend_image_dsc_t * } #if LV_DRAW_SW_SUPPORT_L8 -static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -583,7 +583,7 @@ static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(_lv_draw_sw_blend_image_dsc_t * #endif #if LV_DRAW_SW_SUPPORT_AL88 -static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -697,7 +697,7 @@ static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(_lv_draw_sw_blend_image_dsc_t #endif #if LV_DRAW_SW_SUPPORT_ARGB8888 -static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -811,7 +811,7 @@ static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(_lv_draw_sw_blend_image_d #endif #if LV_DRAW_SW_SUPPORT_RGB888 -static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) { int32_t w = dsc->dest_w; @@ -933,7 +933,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc #endif #if LV_DRAW_SW_SUPPORT_RGB565 -static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_i1.h b/src/draw/sw/blend/lv_draw_sw_blend_to_i1.h index efb852e06..ef63bc2f3 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_i1.h +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_i1.h @@ -28,9 +28,9 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_i1(_lv_draw_sw_blend_fill_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_i1(lv_draw_sw_blend_fill_dsc_t * dsc); -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_i1(_lv_draw_sw_blend_image_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_i1(lv_draw_sw_blend_image_dsc_t * dsc); /********************** * MACROS diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_l8.c b/src/draw/sw/blend/lv_draw_sw_blend_to_l8.c index 403299e5f..fa9c0251f 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_l8.c +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_l8.c @@ -11,7 +11,7 @@ #if LV_DRAW_SW_SUPPORT_L8 -#include "lv_draw_sw_blend.h" +#include "lv_draw_sw_blend_private.h" #include "../../../misc/lv_math.h" #include "../../../display/lv_display.h" #include "../../../core/lv_refr.h" @@ -39,28 +39,28 @@ **********************/ #if LV_DRAW_SW_SUPPORT_I1 - static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); #endif -static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); +static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #if LV_DRAW_SW_SUPPORT_AL88 - static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif #if LV_DRAW_SW_SUPPORT_RGB565 - static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif #if LV_DRAW_SW_SUPPORT_RGB888 -static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size); #endif #if LV_DRAW_SW_SUPPORT_ARGB8888 - static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_8_mix(const uint8_t src, uint8_t * dest, uint8_t mix); @@ -178,7 +178,7 @@ static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * b * GLOBAL FUNCTIONS **********************/ -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_l8(_lv_draw_sw_blend_fill_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_l8(lv_draw_sw_blend_fill_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -280,7 +280,7 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_l8(_lv_draw_sw_blend_fill_d } } -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_l8(_lv_draw_sw_blend_image_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_l8(lv_draw_sw_blend_image_dsc_t * dsc) { switch(dsc->src_color_format) { #if LV_DRAW_SW_SUPPORT_RGB565 @@ -327,7 +327,7 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_l8(_lv_draw_sw_blend_image_ **********************/ #if LV_DRAW_SW_SUPPORT_I1 -static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -414,7 +414,7 @@ static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(_lv_draw_sw_blend_image_dsc_t * } #endif -static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -496,7 +496,7 @@ static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(_lv_draw_sw_blend_image_dsc_t * #if LV_DRAW_SW_SUPPORT_AL88 -static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -584,7 +584,7 @@ static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(_lv_draw_sw_blend_image_dsc_t #if LV_DRAW_SW_SUPPORT_RGB565 -static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -670,7 +670,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc #if LV_DRAW_SW_SUPPORT_RGB888 -static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) { int32_t w = dsc->dest_w; @@ -761,7 +761,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc #if LV_DRAW_SW_SUPPORT_ARGB8888 -static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_l8.h b/src/draw/sw/blend/lv_draw_sw_blend_to_l8.h index 71ef1cd12..079218e5a 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_l8.h +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_l8.h @@ -28,9 +28,9 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_l8(_lv_draw_sw_blend_fill_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_l8(lv_draw_sw_blend_fill_dsc_t * dsc); -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_l8(_lv_draw_sw_blend_image_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_l8(lv_draw_sw_blend_image_dsc_t * dsc); /********************** * MACROS diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c index cf1ff8ea0..1fa8c06b2 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c @@ -11,7 +11,7 @@ #if LV_DRAW_SW_SUPPORT_RGB565 -#include "lv_draw_sw_blend.h" +#include "lv_draw_sw_blend_private.h" #include "../../../misc/lv_math.h" #include "../../../display/lv_display.h" #include "../../../core/lv_refr.h" @@ -39,28 +39,28 @@ **********************/ #if LV_DRAW_SW_SUPPORT_AL88 - static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif #if LV_DRAW_SW_SUPPORT_I1 - static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); #endif #if LV_DRAW_SW_SUPPORT_L8 - static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif -static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #if LV_DRAW_SW_SUPPORT_RGB888 -static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size); #endif #if LV_DRAW_SW_SUPPORT_ARGB8888 - static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ l8_to_rgb565(const uint8_t c1); @@ -208,7 +208,7 @@ static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * b * @param mask * @param mask_stride */ -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb565(_lv_draw_sw_blend_fill_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb565(lv_draw_sw_blend_fill_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -359,7 +359,7 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb565(_lv_draw_sw_blend_fi } } -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb565(_lv_draw_sw_blend_image_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc) { switch(dsc->src_color_format) { case LV_COLOR_FORMAT_RGB565: @@ -406,7 +406,7 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb565(_lv_draw_sw_blend_im **********************/ #if LV_DRAW_SW_SUPPORT_I1 -static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -523,7 +523,7 @@ static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(_lv_draw_sw_blend_image_dsc_t * #endif #if LV_DRAW_SW_SUPPORT_AL88 -static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -641,7 +641,7 @@ static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(_lv_draw_sw_blend_image_dsc_t #if LV_DRAW_SW_SUPPORT_L8 -static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -754,7 +754,7 @@ static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(_lv_draw_sw_blend_image_dsc_t * #endif -static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -864,7 +864,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc #if LV_DRAW_SW_SUPPORT_RGB888 -static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -976,7 +976,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc #if LV_DRAW_SW_SUPPORT_ARGB8888 -static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h index 156428877..d14bfd94d 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h @@ -28,9 +28,9 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_rgb565(_lv_draw_sw_blend_fill_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_rgb565(lv_draw_sw_blend_fill_dsc_t * dsc); -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_rgb565(_lv_draw_sw_blend_image_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc); /********************** * MACROS diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c index 245730bde..e29e934c1 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c @@ -11,7 +11,7 @@ #if LV_DRAW_SW_SUPPORT_RGB888 -#include "lv_draw_sw_blend.h" +#include "lv_draw_sw_blend_private.h" #include "../../../misc/lv_math.h" #include "../../../display/lv_display.h" #include "../../../core/lv_refr.h" @@ -39,29 +39,29 @@ **********************/ #if LV_DRAW_SW_SUPPORT_AL88 - static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); + static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); #endif #if LV_DRAW_SW_SUPPORT_I1 - static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); #endif #if LV_DRAW_SW_SUPPORT_L8 - static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); + static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); #endif #if LV_DRAW_SW_SUPPORT_RGB565 - static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); #endif -static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t dest_px_size, uint32_t src_px_size); #if LV_DRAW_SW_SUPPORT_ARGB8888 -static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, +static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); #endif @@ -181,7 +181,7 @@ static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * b * GLOBAL FUNCTIONS **********************/ -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb888(_lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb888(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -308,7 +308,7 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb888(_lv_draw_sw_blend_fi } } -void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb888(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) { switch(dsc->src_color_format) { @@ -356,7 +356,7 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb888(_lv_draw_sw_blend_im **********************/ #if LV_DRAW_SW_SUPPORT_I1 -static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -446,7 +446,7 @@ static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(_lv_draw_sw_blend_image_dsc_t * #endif #if LV_DRAW_SW_SUPPORT_AL88 -static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -532,7 +532,7 @@ static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(_lv_draw_sw_blend_image_dsc_t #if LV_DRAW_SW_SUPPORT_L8 -static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -620,7 +620,7 @@ static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(_lv_draw_sw_blend_image_dsc_t * #if LV_DRAW_SW_SUPPORT_RGB565 -static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; @@ -718,7 +718,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc #endif -static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t dest_px_size, +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t dest_px_size, uint32_t src_px_size) { int32_t w = dsc->dest_w * dest_px_size; @@ -818,7 +818,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc #if LV_DRAW_SW_SUPPORT_ARGB8888 -static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) { int32_t w = dsc->dest_w; int32_t h = dsc->dest_h; diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h index 66dc477a6..441c0d3e8 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h @@ -28,10 +28,10 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_rgb888(_lv_draw_sw_blend_fill_dsc_t * dsc, +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_rgb888(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size); -void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_rgb888(_lv_draw_sw_blend_image_dsc_t * dsc, +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); /********************** diff --git a/src/draw/sw/blend/neon/lv_blend_neon.h b/src/draw/sw/blend/neon/lv_blend_neon.h index fbe7ea9b4..e94810bfb 100644 --- a/src/draw/sw/blend/neon/lv_blend_neon.h +++ b/src/draw/sw/blend/neon/lv_blend_neon.h @@ -27,242 +27,242 @@ extern "C" { #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565 #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc) \ - _lv_color_blend_to_rgb565_neon(dsc) + lv_color_blend_to_rgb565_neon(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc) \ - _lv_color_blend_to_rgb565_with_opa_neon(dsc) + lv_color_blend_to_rgb565_with_opa_neon(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc) \ - _lv_color_blend_to_rgb565_with_mask_neon(dsc) + lv_color_blend_to_rgb565_with_mask_neon(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc) \ - _lv_color_blend_to_rgb565_mix_mask_opa_neon(dsc) + lv_color_blend_to_rgb565_mix_mask_opa_neon(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565 #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc) \ - _lv_rgb565_blend_normal_to_rgb565_neon(dsc) + lv_rgb565_blend_normal_to_rgb565_neon(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ - _lv_rgb565_blend_normal_to_rgb565_with_opa_neon(dsc) + lv_rgb565_blend_normal_to_rgb565_with_opa_neon(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ - _lv_rgb565_blend_normal_to_rgb565_with_mask_neon(dsc) + lv_rgb565_blend_normal_to_rgb565_with_mask_neon(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ - _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_neon(dsc) + lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_neon(dsc) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565 #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb565_neon(dsc, src_px_size) + lv_rgb888_blend_normal_to_rgb565_neon(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb565_with_opa_neon(dsc, src_px_size) + lv_rgb888_blend_normal_to_rgb565_with_opa_neon(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb565_with_mask_neon(dsc, src_px_size) + lv_rgb888_blend_normal_to_rgb565_with_mask_neon(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_neon(dsc, src_px_size) + lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_neon(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565 #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc) \ - _lv_argb8888_blend_normal_to_rgb565_neon(dsc) + lv_argb8888_blend_normal_to_rgb565_neon(dsc) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ - _lv_argb8888_blend_normal_to_rgb565_with_opa_neon(dsc) + lv_argb8888_blend_normal_to_rgb565_with_opa_neon(dsc) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ - _lv_argb8888_blend_normal_to_rgb565_with_mask_neon(dsc) + lv_argb8888_blend_normal_to_rgb565_with_mask_neon(dsc) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ - _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_neon(dsc) + lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_neon(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dst_px_size) \ - _lv_color_blend_to_rgb888_neon(dsc, dst_px_size) + lv_color_blend_to_rgb888_neon(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - _lv_color_blend_to_rgb888_with_opa_neon(dsc, dst_px_size) + lv_color_blend_to_rgb888_with_opa_neon(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - _lv_color_blend_to_rgb888_with_mask_neon(dsc, dst_px_size) + lv_color_blend_to_rgb888_with_mask_neon(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - _lv_color_blend_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size) + lv_color_blend_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ - _lv_rgb565_blend_normal_to_rgb888_neon(dsc, dst_px_size) + lv_rgb565_blend_normal_to_rgb888_neon(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - _lv_rgb565_blend_normal_to_rgb888_with_opa_neon(dsc, dst_px_size) + lv_rgb565_blend_normal_to_rgb888_with_opa_neon(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - _lv_rgb565_blend_normal_to_rgb888_with_mask_neon(dsc, dst_px_size) + lv_rgb565_blend_normal_to_rgb888_with_mask_neon(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size) + lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb888_neon(dsc, dst_px_size, src_px_size) + lv_rgb888_blend_normal_to_rgb888_neon(dsc, dst_px_size, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb888_with_opa_neon(dsc, dst_px_size, src_px_size) + lv_rgb888_blend_normal_to_rgb888_with_opa_neon(dsc, dst_px_size, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb888_with_mask_neon(dsc, dst_px_size, src_px_size) + lv_rgb888_blend_normal_to_rgb888_with_mask_neon(dsc, dst_px_size, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size, src_px_size) \ - _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size, src_px_size) + lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size, src_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ - _lv_argb8888_blend_normal_to_rgb888_neon(dsc, dst_px_size) + lv_argb8888_blend_normal_to_rgb888_neon(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ - _lv_argb8888_blend_normal_to_rgb888_with_opa_neon(dsc, dst_px_size) + lv_argb8888_blend_normal_to_rgb888_with_opa_neon(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ - _lv_argb8888_blend_normal_to_rgb888_with_mask_neon(dsc, dst_px_size) + lv_argb8888_blend_normal_to_rgb888_with_mask_neon(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ - _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size) + lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888 #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888(dsc) \ - _lv_color_blend_to_argb8888_neon(dsc) + lv_color_blend_to_argb8888_neon(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA(dsc) \ - _lv_color_blend_to_argb8888_with_opa_neon(dsc) + lv_color_blend_to_argb8888_with_opa_neon(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK(dsc) \ - _lv_color_blend_to_argb8888_with_mask_neon(dsc) + lv_color_blend_to_argb8888_with_mask_neon(dsc) #endif #ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA(dsc) \ - _lv_color_blend_to_argb8888_mix_mask_opa_neon(dsc) + lv_color_blend_to_argb8888_mix_mask_opa_neon(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888 #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(dsc) \ - _lv_rgb565_blend_normal_to_argb8888_neon(dsc) + lv_rgb565_blend_normal_to_argb8888_neon(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \ - _lv_rgb565_blend_normal_to_argb8888_with_opa_neon(dsc) + lv_rgb565_blend_normal_to_argb8888_with_opa_neon(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \ - _lv_rgb565_blend_normal_to_argb8888_with_mask_neon(dsc) + lv_rgb565_blend_normal_to_argb8888_with_mask_neon(dsc) #endif #ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \ - _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_neon(dsc) + lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_neon(dsc) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888 #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_argb8888_neon(dsc, src_px_size) + lv_rgb888_blend_normal_to_argb8888_neon(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_argb8888_with_opa_neon(dsc, src_px_size) + lv_rgb888_blend_normal_to_argb8888_with_opa_neon(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_argb8888_with_mask_neon(dsc, src_px_size) + lv_rgb888_blend_normal_to_argb8888_with_mask_neon(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc, src_px_size) \ - _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_neon(dsc, src_px_size) + lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_neon(dsc, src_px_size) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888 #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(dsc) \ - _lv_argb8888_blend_normal_to_argb8888_neon(dsc) + lv_argb8888_blend_normal_to_argb8888_neon(dsc) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \ - _lv_argb8888_blend_normal_to_argb8888_with_opa_neon(dsc) + lv_argb8888_blend_normal_to_argb8888_with_opa_neon(dsc) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \ - _lv_argb8888_blend_normal_to_argb8888_with_mask_neon(dsc) + lv_argb8888_blend_normal_to_argb8888_with_mask_neon(dsc) #endif #ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \ - _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_neon(dsc) + lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_neon(dsc) #endif /********************** @@ -285,7 +285,7 @@ typedef struct { **********************/ extern void lv_color_blend_to_rgb565_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb565_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_rgb565_neon(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -300,7 +300,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_neon(_lv_draw_sw_blend_fill_ } extern void lv_color_blend_to_rgb565_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb565_with_opa_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_rgb565_with_opa_neon(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -315,7 +315,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_with_opa_neon(_lv_draw_sw_bl } extern void lv_color_blend_to_rgb565_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb565_with_mask_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_rgb565_with_mask_neon(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -331,7 +331,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_with_mask_neon(_lv_draw_sw_b } extern void lv_color_blend_to_rgb565_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb565_mix_mask_opa_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_rgb565_mix_mask_opa_neon(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -348,7 +348,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_mix_mask_opa_neon(_lv_draw_s } extern void lv_rgb565_blend_normal_to_rgb565_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -363,7 +363,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_neon(_lv_draw_sw_ble } extern void lv_rgb565_blend_normal_to_rgb565_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -379,7 +379,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_opa_neon(_lv_dr } extern void lv_rgb565_blend_normal_to_rgb565_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -396,7 +396,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_mask_neon(_lv_d } extern void lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -415,8 +415,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_neon(_l extern void lv_rgb888_blend_normal_to_rgb565_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb565_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -437,8 +437,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_neon(_lv_draw_sw_ble extern void lv_rgb888_blend_normal_to_rgb565_with_opa_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb565_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -460,8 +460,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_opa_neon(_lv_dr extern void lv_rgb888_blend_normal_to_rgb565_with_mask_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb565_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -484,8 +484,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_mask_neon(_lv_d extern void lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb565_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -508,7 +508,7 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_neon(_l } extern void lv_argb8888_blend_normal_to_rgb565_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -523,7 +523,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_neon(_lv_draw_sw_b } extern void lv_argb8888_blend_normal_to_rgb565_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -539,7 +539,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_opa_neon(_lv_ } extern void lv_argb8888_blend_normal_to_rgb565_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -556,7 +556,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_mask_neon(_lv } extern void lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -575,7 +575,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_neon( extern void lv_color_blend_to_rgb888_neon(asm_dsc_t * dsc); extern void lv_color_blend_to_xrgb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb888_neon(_lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size) +static inline lv_result_t lv_color_blend_to_rgb888_neon(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -595,8 +595,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_neon(_lv_draw_sw_blend_fill_ extern void lv_color_blend_to_rgb888_with_opa_neon(asm_dsc_t * dsc); extern void lv_color_blend_to_xrgb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb888_with_opa_neon(_lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_color_blend_to_rgb888_with_opa_neon(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -617,8 +617,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_with_opa_neon(_lv_draw_sw_bl extern void lv_color_blend_to_rgb888_with_mask_neon(asm_dsc_t * dsc); extern void lv_color_blend_to_xrgb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb888_with_mask_neon(_lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_color_blend_to_rgb888_with_mask_neon(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -640,8 +640,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_with_mask_neon(_lv_draw_sw_b extern void lv_color_blend_to_rgb888_mix_mask_opa_neon(asm_dsc_t * dsc); extern void lv_color_blend_to_xrgb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_rgb888_mix_mask_opa_neon(_lv_draw_sw_blend_fill_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_color_blend_to_rgb888_mix_mask_opa_neon(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -664,8 +664,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_mix_mask_opa_neon(_lv_draw_s extern void lv_rgb565_blend_normal_to_rgb888_neon(asm_dsc_t * dsc); extern void lv_rgb565_blend_normal_to_xrgb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -686,8 +686,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_neon(_lv_draw_sw_ble extern void lv_rgb565_blend_normal_to_rgb888_with_opa_neon(asm_dsc_t * dsc); extern void lv_rgb565_blend_normal_to_xrgb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -709,8 +709,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_opa_neon(_lv_dr extern void lv_rgb565_blend_normal_to_rgb888_with_mask_neon(asm_dsc_t * dsc); extern void lv_rgb565_blend_normal_to_xrgb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -733,8 +733,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_mask_neon(_lv_d extern void lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_neon(asm_dsc_t * dsc); extern void lv_rgb565_blend_normal_to_xrgb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -760,9 +760,9 @@ extern void lv_rgb888_blend_normal_to_rgb888_neon(asm_dsc_t * dsc); extern void lv_rgb888_blend_normal_to_xrgb8888_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb888_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_xrgb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -795,8 +795,8 @@ extern void lv_rgb888_blend_normal_to_rgb888_with_opa_neon(asm_dsc_t * dsc); extern void lv_rgb888_blend_normal_to_xrgb8888_with_opa_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb888_with_opa_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_xrgb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -830,8 +830,8 @@ extern void lv_rgb888_blend_normal_to_rgb888_with_mask_neon(asm_dsc_t * dsc); extern void lv_rgb888_blend_normal_to_xrgb8888_with_mask_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb888_with_mask_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_xrgb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -866,8 +866,8 @@ extern void lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_neon(asm_dsc_t * dsc); extern void lv_rgb888_blend_normal_to_xrgb8888_mix_mask_opa_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_rgb888_mix_mask_opa_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_xrgb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size, uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -901,8 +901,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_neon(_l extern void lv_argb8888_blend_normal_to_rgb888_neon(asm_dsc_t * dsc); extern void lv_argb8888_blend_normal_to_xrgb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -923,8 +923,8 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_neon(_lv_draw_sw_b extern void lv_argb8888_blend_normal_to_rgb888_with_opa_neon(asm_dsc_t * dsc); extern void lv_argb8888_blend_normal_to_xrgb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -946,8 +946,8 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_opa_neon(_lv_ extern void lv_argb8888_blend_normal_to_rgb888_with_mask_neon(asm_dsc_t * dsc); extern void lv_argb8888_blend_normal_to_xrgb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -970,8 +970,8 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_mask_neon(_lv extern void lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_neon(asm_dsc_t * dsc); extern void lv_argb8888_blend_normal_to_xrgb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t dst_px_size) +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -994,7 +994,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_neon( } extern void lv_color_blend_to_argb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_argb8888_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_argb8888_neon(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1009,7 +1009,7 @@ static inline lv_result_t _lv_color_blend_to_argb8888_neon(_lv_draw_sw_blend_fil } extern void lv_color_blend_to_argb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_argb8888_with_opa_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_argb8888_with_opa_neon(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -1024,7 +1024,7 @@ static inline lv_result_t _lv_color_blend_to_argb8888_with_opa_neon(_lv_draw_sw_ } extern void lv_color_blend_to_argb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_argb8888_with_mask_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_argb8888_with_mask_neon(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1040,7 +1040,7 @@ static inline lv_result_t _lv_color_blend_to_argb8888_with_mask_neon(_lv_draw_sw } extern void lv_color_blend_to_argb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_color_blend_to_argb8888_mix_mask_opa_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +static inline lv_result_t lv_color_blend_to_argb8888_mix_mask_opa_neon(lv_draw_sw_blend_fill_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -1057,7 +1057,7 @@ static inline lv_result_t _lv_color_blend_to_argb8888_mix_mask_opa_neon(_lv_draw } extern void lv_rgb565_blend_normal_to_argb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1072,7 +1072,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_neon(_lv_draw_sw_b } extern void lv_rgb565_blend_normal_to_argb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -1088,7 +1088,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_opa_neon(_lv_ } extern void lv_rgb565_blend_normal_to_argb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1105,7 +1105,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_mask_neon(_lv } extern void lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -1124,8 +1124,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_neon( extern void lv_rgb888_blend_normal_to_argb8888_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_argb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1146,8 +1146,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_neon(_lv_draw_sw_b extern void lv_rgb888_blend_normal_to_argb8888_with_opa_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_argb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -1169,8 +1169,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_opa_neon(_lv_ extern void lv_rgb888_blend_normal_to_argb8888_with_mask_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_argb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1193,8 +1193,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_mask_neon(_lv extern void lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_neon(asm_dsc_t * dsc); extern void lv_xrgb8888_blend_normal_to_argb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, - uint32_t src_px_size) +static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -1217,7 +1217,7 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_neon( } extern void lv_argb8888_blend_normal_to_argb8888_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1232,7 +1232,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_neon(_lv_draw_sw } extern void lv_argb8888_blend_normal_to_argb8888_with_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_with_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, @@ -1248,7 +1248,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_opa_neon(_l } extern void lv_argb8888_blend_normal_to_argb8888_with_mask_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_with_mask_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .dst_buf = dsc->dest_buf, @@ -1265,7 +1265,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_mask_neon(_ } extern void lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_neon(asm_dsc_t * dsc); -static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_neon(lv_draw_sw_blend_image_dsc_t * dsc) { asm_dsc_t asm_dsc = { .opa = dsc->opa, diff --git a/src/draw/sw/lv_draw_sw.c b/src/draw/sw/lv_draw_sw.c index ef173efba..9c2040d0b 100644 --- a/src/draw/sw/lv_draw_sw.c +++ b/src/draw/sw/lv_draw_sw.c @@ -6,11 +6,11 @@ /********************* * INCLUDES *********************/ -#include "../lv_draw.h" +#include "../lv_draw_private.h" #if LV_USE_DRAW_SW #include "../../core/lv_refr.h" -#include "lv_draw_sw.h" +#include "lv_draw_sw_private.h" #include "../../display/lv_display_private.h" #include "../../stdlib/lv_string.h" #include "../../core/lv_global.h" @@ -506,7 +506,7 @@ static void execute_drawing(lv_draw_sw_unit_t * u) /*Layers manage it for themselves*/ if(t->type != LV_DRAW_TASK_TYPE_LAYER) { lv_area_t draw_area; - if(!_lv_area_intersect(&draw_area, &t->area, u->base_unit.clip_area)) return; + if(!lv_area_intersect(&draw_area, &t->area, u->base_unit.clip_area)) return; int32_t idx = 0; lv_draw_unit_t * draw_unit_tmp = _draw_info.unit_head; @@ -516,7 +516,7 @@ static void execute_drawing(lv_draw_sw_unit_t * u) } lv_draw_rect_dsc_t rect_dsc; lv_draw_rect_dsc_init(&rect_dsc); - rect_dsc.bg_color = lv_palette_main(idx % _LV_PALETTE_LAST); + rect_dsc.bg_color = lv_palette_main(idx % LV_PALETTE_LAST); rect_dsc.border_color = rect_dsc.bg_color; rect_dsc.bg_opa = LV_OPA_10; rect_dsc.border_opa = LV_OPA_80; diff --git a/src/draw/sw/lv_draw_sw.h b/src/draw/sw/lv_draw_sw.h index e549ec39b..9e51ea286 100644 --- a/src/draw/sw/lv_draw_sw.h +++ b/src/draw/sw/lv_draw_sw.h @@ -27,30 +27,6 @@ extern "C" { * DEFINES *********************/ -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_draw_unit_t base_unit; - lv_draw_task_t * task_act; -#if LV_USE_OS - lv_thread_sync_t sync; - lv_thread_t thread; - volatile bool inited; - volatile bool exit_status; -#endif - uint32_t idx; -} lv_draw_sw_unit_t; - -#if LV_DRAW_SW_SHADOW_CACHE_SIZE -typedef struct { - uint8_t cache[LV_DRAW_SW_SHADOW_CACHE_SIZE * LV_DRAW_SW_SHADOW_CACHE_SIZE]; - int32_t cache_size; - int32_t cache_r; -} lv_draw_sw_shadow_cache_t; -#endif - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/draw/sw/lv_draw_sw_arc.c b/src/draw/sw/lv_draw_sw_arc.c index 5db127df5..ec2fb2fd9 100644 --- a/src/draw/sw/lv_draw_sw_arc.c +++ b/src/draw/sw/lv_draw_sw_arc.c @@ -6,6 +6,10 @@ /********************* * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" +#include "lv_draw_sw_mask_private.h" +#include "blend/lv_draw_sw_blend_private.h" +#include "../lv_image_decoder_private.h" #include "lv_draw_sw.h" #if LV_USE_DRAW_SW #if LV_DRAW_SW_COMPLEX @@ -14,7 +18,7 @@ #include "../../misc/lv_log.h" #include "../../stdlib/lv_mem.h" #include "../../stdlib/lv_string.h" -#include "../lv_draw.h" +#include "../lv_draw_private.h" static void add_circle(const lv_opa_t * circle_mask, const lv_area_t * blend_area, const lv_area_t * circle_area, lv_opa_t * mask_buf, int32_t width); @@ -58,7 +62,7 @@ void lv_draw_sw_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, c lv_area_t area_out = *coords; lv_area_t clipped_area; - if(!_lv_area_intersect(&clipped_area, &area_out, draw_unit->clip_area)) return; + if(!lv_area_intersect(&clipped_area, &area_out, draw_unit->clip_area)) return; /*Draw a full ring*/ if(dsc->img_src == NULL && @@ -246,7 +250,7 @@ static void add_circle(const lv_opa_t * circle_mask, const lv_area_t * blend_are lv_opa_t * mask_buf, int32_t width) { lv_area_t circle_common_area; - if(_lv_area_intersect(&circle_common_area, circle_area, blend_area)) { + if(lv_area_intersect(&circle_common_area, circle_area, blend_area)) { const lv_opa_t * circle_mask_tmp = circle_mask + width * (circle_common_area.y1 - circle_area->y1); circle_mask_tmp += circle_common_area.x1 - circle_area->x1; diff --git a/src/draw/sw/lv_draw_sw_border.c b/src/draw/sw/lv_draw_sw_border.c index c7f11919d..07eb18c0e 100644 --- a/src/draw/sw/lv_draw_sw_border.c +++ b/src/draw/sw/lv_draw_sw_border.c @@ -6,10 +6,14 @@ /********************* * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" +#include "lv_draw_sw_mask_private.h" +#include "../lv_draw_private.h" +#include "../lv_draw_private.h" #include "lv_draw_sw.h" #if LV_USE_DRAW_SW -#include "blend/lv_draw_sw_blend.h" +#include "blend/lv_draw_sw_blend_private.h" #include "../../misc/lv_math.h" #include "../../misc/lv_text_ap.h" #include "../../core/lv_refr.h" @@ -90,7 +94,7 @@ void draw_border_complex(lv_draw_unit_t * draw_unit, const lv_area_t * outer_are /*Get clipped draw area which is the real draw area. *It is always the same or inside `coords`*/ lv_area_t draw_area; - if(!_lv_area_intersect(&draw_area, outer_area, draw_unit->clip_area)) return; + if(!lv_area_intersect(&draw_area, outer_area, draw_unit->clip_area)) return; int32_t draw_area_w = lv_area_get_width(&draw_area); lv_draw_sw_blend_dsc_t blend_dsc; diff --git a/src/draw/sw/lv_draw_sw_box_shadow.c b/src/draw/sw/lv_draw_sw_box_shadow.c index 4ccb3b837..f80287566 100644 --- a/src/draw/sw/lv_draw_sw_box_shadow.c +++ b/src/draw/sw/lv_draw_sw_box_shadow.c @@ -6,12 +6,15 @@ /********************* * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" +#include "lv_draw_sw_mask_private.h" +#include "../lv_draw_private.h" #include "lv_draw_sw.h" #if LV_USE_DRAW_SW #if LV_DRAW_SW_COMPLEX -#include "blend/lv_draw_sw_blend.h" +#include "blend/lv_draw_sw_blend_private.h" #include "../../core/lv_global.h" #include "../../misc/lv_math.h" #include "../../core/lv_refr.h" @@ -74,7 +77,7 @@ void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_ /*Get clipped draw area which is the real draw area. *It is always the same or inside `shadow_area`*/ lv_area_t draw_area; - if(!_lv_area_intersect(&draw_area, &shadow_area, draw_unit->clip_area)) return; + if(!lv_area_intersect(&draw_area, &shadow_area, draw_unit->clip_area)) return; /*Consider 1 px smaller bg to be sure the edge will be covered by the shadow*/ lv_area_t bg_area; @@ -161,15 +164,15 @@ void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_ blend_area.x1 = LV_MAX(blend_area.x1, w_half); blend_area.y2 = LV_MIN(blend_area.y2, h_half); - if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { int32_t w = lv_area_get_width(&clip_area_sub); sh_buf_tmp = sh_buf; sh_buf_tmp += (clip_area_sub.y1 - shadow_area.y1) * corner_size; sh_buf_tmp += clip_area_sub.x1 - (shadow_area.x2 - corner_size + 1); /*Do not mask if out of the bg*/ - if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; else simple_sub = simple; if(w > 0) { blend_dsc.mask_buf = mask_buf; @@ -204,14 +207,14 @@ void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_ blend_area.x1 = LV_MAX(blend_area.x1, w_half); blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); - if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { int32_t w = lv_area_get_width(&clip_area_sub); sh_buf_tmp = sh_buf; sh_buf_tmp += (blend_area.y2 - clip_area_sub.y2) * corner_size; sh_buf_tmp += clip_area_sub.x1 - (shadow_area.x2 - corner_size + 1); /*Do not mask if out of the bg*/ - if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; else simple_sub = simple; if(w > 0) { @@ -244,14 +247,14 @@ void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_ blend_area.y2 = shadow_area.y1 + corner_size - 1; blend_area.y2 = LV_MIN(blend_area.y2, h_half); - if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { int32_t w = lv_area_get_width(&clip_area_sub); sh_buf_tmp = sh_buf; sh_buf_tmp += (clip_area_sub.y1 - blend_area.y1) * corner_size; /*Do not mask if out of the bg*/ - if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; else simple_sub = simple; if(w > 0) { @@ -291,14 +294,14 @@ void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_ blend_area.y2 = shadow_area.y2; blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); - if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { int32_t w = lv_area_get_width(&clip_area_sub); sh_buf_tmp = sh_buf; sh_buf_tmp += (blend_area.y2 - clip_area_sub.y2) * corner_size; if(w > 0) { /*Do not mask if out of the bg*/ - if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; else simple_sub = simple; if(!simple_sub) { @@ -315,7 +318,7 @@ void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_ blend_area.y2 = y; /*Do not mask if out of the bg*/ - if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; else simple_sub = simple; if(!simple_sub) { @@ -346,15 +349,15 @@ void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_ blend_area.y2 = LV_MAX(blend_area.y2, h_half); blend_area.x1 = LV_MAX(blend_area.x1, w_half); - if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { int32_t w = lv_area_get_width(&clip_area_sub); sh_buf_tmp = sh_buf; sh_buf_tmp += (corner_size - 1) * corner_size; sh_buf_tmp += clip_area_sub.x1 - (shadow_area.x2 - corner_size + 1); /*Do not mask if out of the bg*/ - if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; else simple_sub = simple; blend_dsc.mask_buf = simple_sub ? sh_buf_tmp : mask_buf; @@ -403,15 +406,15 @@ void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_ blend_area.y2 = LV_MAX(blend_area.y2, h_half); blend_area.x2 = LV_MIN(blend_area.x2, w_half - 1); - if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { int32_t w = lv_area_get_width(&clip_area_sub); sh_buf_tmp = sh_buf; sh_buf_tmp += (corner_size - 1) * corner_size; sh_buf_tmp += clip_area_sub.x1 - blend_area.x1; /*Do not mask if out of the bg*/ - if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; else simple_sub = simple; blend_dsc.mask_buf = simple_sub ? sh_buf_tmp : mask_buf; if(w > 0) { @@ -442,15 +445,15 @@ void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_ blend_area.x2 = LV_MIN(blend_area.x2, w_half - 1); blend_area.y2 = LV_MIN(blend_area.y2, h_half); - if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { int32_t w = lv_area_get_width(&clip_area_sub); sh_buf_tmp = sh_buf; sh_buf_tmp += (clip_area_sub.y1 - blend_area.y1) * corner_size; sh_buf_tmp += clip_area_sub.x1 - blend_area.x1; /*Do not mask if out of the bg*/ - if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; else simple_sub = simple; blend_dsc.mask_buf = mask_buf; @@ -487,15 +490,15 @@ void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_ blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); blend_area.x2 = LV_MIN(blend_area.x2, w_half - 1); - if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { int32_t w = lv_area_get_width(&clip_area_sub); sh_buf_tmp = sh_buf; sh_buf_tmp += (blend_area.y2 - clip_area_sub.y2) * corner_size; sh_buf_tmp += clip_area_sub.x1 - blend_area.x1; /*Do not mask if out of the bg*/ - if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; else simple_sub = simple; blend_dsc.mask_buf = mask_buf; if(w > 0) { @@ -529,8 +532,8 @@ void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_ blend_area.y2 = LV_MAX(blend_area.y2, h_half); blend_dsc.mask_buf = mask_buf; - if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && - !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + if(lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { int32_t w = lv_area_get_width(&clip_area_sub); if(w > 0) { blend_area.x1 = clip_area_sub.x1; diff --git a/src/draw/sw/lv_draw_sw_fill.c b/src/draw/sw/lv_draw_sw_fill.c index af111ed62..0aeb55994 100644 --- a/src/draw/sw/lv_draw_sw_fill.c +++ b/src/draw/sw/lv_draw_sw_fill.c @@ -6,11 +6,14 @@ /********************* * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" +#include "lv_draw_sw_mask_private.h" +#include "../lv_draw_private.h" #include "lv_draw_sw.h" #if LV_USE_DRAW_SW -#include "blend/lv_draw_sw_blend.h" -#include "lv_draw_sw_gradient.h" +#include "blend/lv_draw_sw_blend_private.h" +#include "lv_draw_sw_gradient_private.h" #include "../../misc/lv_math.h" #include "../../misc/lv_text_ap.h" #include "../../core/lv_refr.h" @@ -50,7 +53,7 @@ void lv_draw_sw_fill(lv_draw_unit_t * draw_unit, lv_draw_fill_dsc_t * dsc, const lv_area_copy(&bg_coords, coords); lv_area_t clipped_coords; - if(!_lv_area_intersect(&clipped_coords, &bg_coords, draw_unit->clip_area)) return; + if(!lv_area_intersect(&clipped_coords, &bg_coords, draw_unit->clip_area)) return; lv_grad_dir_t grad_dir = dsc->grad.dir; lv_color_t bg_color = grad_dir == LV_GRAD_DIR_NONE ? dsc->color : dsc->grad.stops[0].color; @@ -187,6 +190,8 @@ void lv_draw_sw_fill(lv_draw_unit_t * draw_unit, lv_draw_fill_dsc_t * dsc, const preblend = true; break; #endif + default: + break; } /* pre-blend the mask */ if(preblend) { @@ -225,6 +230,8 @@ void lv_draw_sw_fill(lv_draw_unit_t * draw_unit, lv_draw_fill_dsc_t * dsc, const preblend = true; break; #endif + default: + break; } /* pre-blend the mask */ if(preblend) { @@ -270,6 +277,8 @@ void lv_draw_sw_fill(lv_draw_unit_t * draw_unit, lv_draw_fill_dsc_t * dsc, const case LV_GRAD_DIR_CONICAL: blend_dsc.mask_res = transp ? LV_DRAW_SW_MASK_RES_CHANGED : LV_DRAW_SW_MASK_RES_FULL_COVER; blend_dsc.mask_buf = grad_opa_map; + default: + break; } int32_t h_start = LV_MAX(bg_coords.y1 + rout, clipped_coords.y1); @@ -295,6 +304,8 @@ void lv_draw_sw_fill(lv_draw_unit_t * draw_unit, lv_draw_fill_dsc_t * dsc, const lv_gradient_conical_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, h - bg_coords.y1, coords_bg_w, grad); break; #endif + default: + break; } lv_draw_sw_blend(draw_unit, &blend_dsc); } @@ -319,6 +330,8 @@ void lv_draw_sw_fill(lv_draw_unit_t * draw_unit, lv_draw_fill_dsc_t * dsc, const case LV_GRAD_DIR_CONICAL: lv_gradient_conical_cleanup(&dsc->grad); break; + default: + break; } } #endif diff --git a/src/draw/sw/lv_draw_sw_gradient.c b/src/draw/sw/lv_draw_sw_gradient.c index 5fb94f7c8..92627108c 100644 --- a/src/draw/sw/lv_draw_sw_gradient.c +++ b/src/draw/sw/lv_draw_sw_gradient.c @@ -6,7 +6,7 @@ /********************* * INCLUDES *********************/ -#include "lv_draw_sw_gradient.h" +#include "lv_draw_sw_gradient_private.h" #if LV_USE_DRAW_SW #include "../../misc/lv_types.h" diff --git a/src/draw/sw/lv_draw_sw_gradient.h b/src/draw/sw/lv_draw_sw_gradient.h index 71a803b9d..a0bec58e1 100644 --- a/src/draw/sw/lv_draw_sw_gradient.h +++ b/src/draw/sw/lv_draw_sw_gradient.h @@ -36,12 +36,6 @@ extern "C" { **********************/ typedef lv_color_t lv_grad_color_t; -typedef struct _lv_gradient_cache_t { - lv_color_t * color_map; - lv_opa_t * opa_map; - uint32_t size; -} lv_grad_t; - /********************** * PROTOTYPES **********************/ diff --git a/src/draw/sw/lv_draw_sw_gradient_private.h b/src/draw/sw/lv_draw_sw_gradient_private.h new file mode 100644 index 000000000..7e2f2ab3d --- /dev/null +++ b/src/draw/sw/lv_draw_sw_gradient_private.h @@ -0,0 +1,50 @@ +/** + * @file lv_draw_sw_gradient_private.h + * + */ + +#ifndef LV_DRAW_SW_GRADIENT_PRIVATE_H +#define LV_DRAW_SW_GRADIENT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_sw_gradient.h" + +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_grad_t { + lv_color_t * color_map; + lv_opa_t * opa_map; + uint32_t size; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_DRAW_SW */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_GRADIENT_PRIVATE_H*/ diff --git a/src/draw/sw/lv_draw_sw_img.c b/src/draw/sw/lv_draw_sw_img.c index 612d3bf3e..42179a2a2 100644 --- a/src/draw/sw/lv_draw_sw_img.c +++ b/src/draw/sw/lv_draw_sw_img.c @@ -6,13 +6,18 @@ /********************* * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" +#include "blend/lv_draw_sw_blend_private.h" +#include "../lv_image_decoder_private.h" +#include "../lv_draw_image_private.h" +#include "../lv_draw_private.h" #include "lv_draw_sw.h" #if LV_USE_DRAW_SW #include "../../display/lv_display.h" #include "../../display/lv_display_private.h" #include "../../misc/lv_log.h" -#include "../../core/lv_refr.h" +#include "../../core/lv_refr_private.h" #include "../../stdlib/lv_mem.h" #include "../../misc/lv_math.h" #include "../../misc/lv_color.h" @@ -28,7 +33,7 @@ /********************* * DEFINES *********************/ -#define MAX_BUF_SIZE (uint32_t) (4 * lv_display_get_horizontal_resolution(_lv_refr_get_disp_refreshing()) * lv_color_format_get_size(lv_display_get_color_format(_lv_refr_get_disp_refreshing()))) +#define MAX_BUF_SIZE (uint32_t) (4 * lv_display_get_horizontal_resolution(lv_refr_get_disp_refreshing()) * lv_color_format_get_size(lv_display_get_color_format(lv_refr_get_disp_refreshing()))) #ifndef LV_DRAW_SW_IMAGE #define LV_DRAW_SW_IMAGE(...) LV_RESULT_INVALID @@ -85,8 +90,8 @@ void lv_draw_sw_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dr int32_t w = lv_area_get_width(coords); int32_t h = lv_area_get_height(coords); - _lv_image_buf_get_transformed_area(&area_rot, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, - &draw_dsc->pivot); + lv_image_buf_get_transformed_area(&area_rot, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, + &draw_dsc->pivot); area_rot.x1 += coords->x1; area_rot.y1 += coords->y1; @@ -94,7 +99,7 @@ void lv_draw_sw_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dr area_rot.y2 += coords->y1; } lv_area_t draw_area; - if(!_lv_area_intersect(&draw_area, &area_rot, draw_unit->clip_area)) return; + if(!lv_area_intersect(&draw_area, &area_rot, draw_unit->clip_area)) return; #endif #if LV_USE_LAYER_DEBUG @@ -123,13 +128,13 @@ void lv_draw_sw_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dr lv_draw_fill_dsc_t fill_dsc; lv_draw_rect_dsc_init(&fill_dsc); - fill_dsc.color = lv_palette_main(idx % _LV_PALETTE_LAST); + fill_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); fill_dsc.opa = LV_OPA_10; lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot); lv_draw_border_dsc_t border_dsc; lv_draw_border_dsc_init(&border_dsc); - border_dsc.color = lv_palette_main(idx % _LV_PALETTE_LAST); + border_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); border_dsc.opa = LV_OPA_100; border_dsc.width = 2; lv_draw_sw_border(draw_unit, &border_dsc, &area_rot); @@ -161,10 +166,10 @@ void lv_draw_sw_image(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dr const lv_area_t * coords) { if(!draw_dsc->tile) { - _lv_draw_image_normal_helper(draw_unit, draw_dsc, coords, img_draw_core); + lv_draw_image_normal_helper(draw_unit, draw_dsc, coords, img_draw_core); } else { - _lv_draw_image_tiled_helper(draw_unit, draw_dsc, coords, img_draw_core); + lv_draw_image_tiled_helper(draw_unit, draw_dsc, coords, img_draw_core); } } @@ -195,7 +200,7 @@ static void img_draw_core(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t if(!transformed && !masked && cf == LV_COLOR_FORMAT_A8) { lv_area_t clipped_coords; - if(!_lv_area_intersect(&clipped_coords, img_coords, draw_unit->clip_area)) return; + if(!lv_area_intersect(&clipped_coords, img_coords, draw_unit->clip_area)) return; blend_dsc.mask_buf = (lv_opa_t *)src_buf; blend_dsc.mask_area = img_coords; diff --git a/src/draw/sw/lv_draw_sw_letter.c b/src/draw/sw/lv_draw_sw_letter.c index 74d862e39..3dec220d9 100644 --- a/src/draw/sw/lv_draw_sw_letter.c +++ b/src/draw/sw/lv_draw_sw_letter.c @@ -6,6 +6,8 @@ /********************* * INCLUDES *********************/ +#include "blend/lv_draw_sw_blend_private.h" +#include "../lv_draw_label_private.h" #include "lv_draw_sw.h" #if LV_USE_DRAW_SW @@ -15,7 +17,7 @@ #include "../../misc/lv_area.h" #include "../../misc/lv_style.h" #include "../../font/lv_font.h" -#include "../../core/lv_refr.h" +#include "../../core/lv_refr_private.h" #include "../../stdlib/lv_string.h" /********************* diff --git a/src/draw/sw/lv_draw_sw_line.c b/src/draw/sw/lv_draw_sw_line.c index 1dca84538..be3b19103 100644 --- a/src/draw/sw/lv_draw_sw_line.c +++ b/src/draw/sw/lv_draw_sw_line.c @@ -6,13 +6,17 @@ /********************* * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" +#include "lv_draw_sw_mask_private.h" +#include "blend/lv_draw_sw_blend_private.h" +#include "../lv_draw_private.h" #include "lv_draw_sw.h" #if LV_USE_DRAW_SW #include "../../misc/lv_math.h" #include "../../misc/lv_types.h" -#include "../../core/lv_refr.h" +#include "../../core/lv_refr_private.h" #include "../../stdlib/lv_string.h" /********************* @@ -57,7 +61,7 @@ void lv_draw_sw_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc) clip_line.y2 = (int32_t)LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width / 2; bool is_common; - is_common = _lv_area_intersect(&clip_line, &clip_line, draw_unit->clip_area); + is_common = lv_area_intersect(&clip_line, &clip_line, draw_unit->clip_area); if(!is_common) return; LV_PROFILER_BEGIN; @@ -111,7 +115,7 @@ static void LV_ATTRIBUTE_FAST_MEM draw_line_hor(lv_draw_unit_t * draw_unit, cons blend_area.y2 = (int32_t)dsc->p1.y + w_half0; bool is_common; - is_common = _lv_area_intersect(&blend_area, &blend_area, draw_unit->clip_area); + is_common = lv_area_intersect(&blend_area, &blend_area, draw_unit->clip_area); if(!is_common) return; bool dashed = dsc->dash_gap && dsc->dash_width; @@ -186,7 +190,7 @@ static void LV_ATTRIBUTE_FAST_MEM draw_line_ver(lv_draw_unit_t * draw_unit, cons blend_area.y2 = (int32_t)LV_MAX(dsc->p1.y, dsc->p2.y) - 1; bool is_common; - is_common = _lv_area_intersect(&blend_area, &blend_area, draw_unit->clip_area); + is_common = lv_area_intersect(&blend_area, &blend_area, draw_unit->clip_area); if(!is_common) return; bool dashed = dsc->dash_gap && dsc->dash_width; @@ -289,7 +293,7 @@ static void LV_ATTRIBUTE_FAST_MEM draw_line_skew(lv_draw_unit_t * draw_unit, con /*Get the union of `coords` and `clip`*/ /*`clip` is already truncated to the `draw_buf` size *in 'lv_refr_area' function*/ - bool is_common = _lv_area_intersect(&blend_area, &blend_area, draw_unit->clip_area); + bool is_common = lv_area_intersect(&blend_area, &blend_area, draw_unit->clip_area); if(is_common == false) return; lv_draw_sw_mask_line_param_t mask_left_param; @@ -339,7 +343,7 @@ static void LV_ATTRIBUTE_FAST_MEM draw_line_skew(lv_draw_unit_t * draw_unit, con /*Draw the background line by line*/ int32_t h; - uint32_t hor_res = (uint32_t)lv_display_get_horizontal_resolution(_lv_refr_get_disp_refreshing()); + uint32_t hor_res = (uint32_t)lv_display_get_horizontal_resolution(lv_refr_get_disp_refreshing()); size_t mask_buf_size = LV_MIN(lv_area_get_size(&blend_area), hor_res); lv_opa_t * mask_buf = lv_malloc(mask_buf_size); diff --git a/src/draw/sw/lv_draw_sw_mask.c b/src/draw/sw/lv_draw_sw_mask.c index 7c44197a1..983413a27 100644 --- a/src/draw/sw/lv_draw_sw_mask.c +++ b/src/draw/sw/lv_draw_sw_mask.c @@ -6,10 +6,11 @@ /********************* * INCLUDES *********************/ +#include "../lv_draw_mask_private.h" #include "../lv_draw.h" #if LV_DRAW_SW_COMPLEX -#include "lv_draw_sw_mask.h" +#include "lv_draw_sw_mask_private.h" #include "../../core/lv_global.h" #include "../../misc/lv_math.h" #include "../../misc/lv_log.h" @@ -60,8 +61,8 @@ static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ line_mask_steep(lv_opa_ static void circ_init(lv_point_t * c, int32_t * tmp, int32_t radius); static bool circ_cont(lv_point_t * c); static void circ_next(lv_point_t * c, int32_t * tmp); -static void circ_calc_aa4(_lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t radius); -static lv_opa_t * get_next_line(_lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t y, int32_t * len, +static void circ_calc_aa4(lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t radius); +static lv_opa_t * get_next_line(lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t y, int32_t * len, int32_t * x_start); static inline lv_opa_t /* LV_ATTRIBUTE_FAST_MEM */ mask_mix(lv_opa_t mask_act, lv_opa_t mask_new); @@ -92,7 +93,7 @@ lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_sw_mask_apply(void * masks[] int32_t len) { bool changed = false; - _lv_draw_sw_mask_common_dsc_t * dsc; + lv_draw_sw_mask_common_dsc_t * dsc; uint32_t i; for(i = 0; masks[i]; i++) { @@ -109,7 +110,7 @@ lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_sw_mask_apply(void * masks[] void lv_draw_sw_mask_free_param(void * p) { lv_mutex_lock(&circle_cache_mutex); - _lv_draw_sw_mask_common_dsc_t * pdsc = p; + lv_draw_sw_mask_common_dsc_t * pdsc = p; if(pdsc->type == LV_DRAW_SW_MASK_TYPE_RADIUS) { lv_draw_sw_mask_radius_param_t * radius_p = (lv_draw_sw_mask_radius_param_t *) p; if(radius_p->circle) { @@ -126,7 +127,7 @@ void lv_draw_sw_mask_free_param(void * p) lv_mutex_unlock(&circle_cache_mutex); } -void _lv_draw_sw_mask_cleanup(void) +void lv_draw_sw_mask_cleanup(void) { uint8_t i; for(i = 0; i < LV_DRAW_SW_CIRCLE_CACHE_SIZE; i++) { @@ -326,7 +327,7 @@ void lv_draw_sw_mask_radius_init(lv_draw_sw_mask_radius_param_t * param, const l } /*If not cached use the free entry with lowest life*/ - _lv_draw_sw_mask_radius_circle_dsc_t * entry = NULL; + lv_draw_sw_mask_radius_circle_dsc_t * entry = NULL; for(i = 0; i < LV_DRAW_SW_CIRCLE_CACHE_SIZE; i++) { if(_circle_cache[i].used_cnt == 0) { if(!entry) entry = &(_circle_cache[i]); @@ -336,7 +337,7 @@ void lv_draw_sw_mask_radius_init(lv_draw_sw_mask_radius_param_t * param, const l /*There is no unused entry. Allocate one temporarily*/ if(!entry) { - entry = lv_malloc_zeroed(sizeof(_lv_draw_sw_mask_radius_circle_dsc_t)); + entry = lv_malloc_zeroed(sizeof(lv_draw_sw_mask_radius_circle_dsc_t)); LV_ASSERT_MALLOC(entry); entry->life = -1; } @@ -1067,7 +1068,7 @@ static void circ_next(lv_point_t * c, int32_t * tmp) c->y++; } -static void circ_calc_aa4(_lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t radius) +static void circ_calc_aa4(lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t radius) { if(radius == 0) return; c->radius = radius; @@ -1216,7 +1217,7 @@ static void circ_calc_aa4(_lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t radi lv_free(cir_x); } -static lv_opa_t * get_next_line(_lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t y, int32_t * len, +static lv_opa_t * get_next_line(lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t y, int32_t * len, int32_t * x_start) { *len = c->opa_start_on_y[y + 1] - c->opa_start_on_y[y]; diff --git a/src/draw/sw/lv_draw_sw_mask.h b/src/draw/sw/lv_draw_sw_mask.h index 17b7dedd7..22a0d6700 100644 --- a/src/draw/sw/lv_draw_sw_mask.h +++ b/src/draw/sw/lv_draw_sw_mask.h @@ -23,42 +23,38 @@ extern "C" { *********************/ #define LV_MASK_ID_INV (-1) #if LV_DRAW_SW_COMPLEX -# define _LV_MASK_MAX_NUM 16 +# define LV_MASK_MAX_NUM 16 #else -# define _LV_MASK_MAX_NUM 1 +# define LV_MASK_MAX_NUM 1 #endif /********************** * TYPEDEFS **********************/ -enum { +typedef enum { LV_DRAW_SW_MASK_RES_TRANSP, LV_DRAW_SW_MASK_RES_FULL_COVER, LV_DRAW_SW_MASK_RES_CHANGED, LV_DRAW_SW_MASK_RES_UNKNOWN -}; - -typedef uint8_t lv_draw_sw_mask_res_t; +} lv_draw_sw_mask_res_t; #if LV_DRAW_SW_COMPLEX -enum { +typedef enum { LV_DRAW_SW_MASK_TYPE_LINE, LV_DRAW_SW_MASK_TYPE_ANGLE, LV_DRAW_SW_MASK_TYPE_RADIUS, LV_DRAW_SW_MASK_TYPE_FADE, LV_DRAW_SW_MASK_TYPE_MAP, -}; +} lv_draw_sw_mask_type_t; -typedef uint8_t lv_draw_sw_mask_type_t; - -enum { +typedef enum { LV_DRAW_SW_MASK_LINE_SIDE_LEFT = 0, LV_DRAW_SW_MASK_LINE_SIDE_RIGHT, LV_DRAW_SW_MASK_LINE_SIDE_TOP, LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM, -}; +} lv_draw_sw_mask_line_side_t; /** * A common callback type for every mask type. @@ -68,116 +64,6 @@ typedef lv_draw_sw_mask_res_t (*lv_draw_sw_mask_xcb_t)(lv_opa_t * mask_buf, int3 int32_t len, void * p); -typedef uint8_t lv_draw_sw_mask_line_side_t; - -typedef struct { - lv_draw_sw_mask_xcb_t cb; - lv_draw_sw_mask_type_t type; -} _lv_draw_sw_mask_common_dsc_t; - -typedef struct { - /*The first element must be the common descriptor*/ - _lv_draw_sw_mask_common_dsc_t dsc; - - struct { - /*First point*/ - lv_point_t p1; - - /*Second point*/ - lv_point_t p2; - - /*Which side to keep?*/ - lv_draw_sw_mask_line_side_t side : 2; - } cfg; - - /*A point of the line*/ - lv_point_t origo; - - /*X / (1024*Y) steepness (X is 0..1023 range). What is the change of X in 1024 Y?*/ - int32_t xy_steep; - - /*Y / (1024*X) steepness (Y is 0..1023 range). What is the change of Y in 1024 X?*/ - int32_t yx_steep; - - /*Helper which stores yx_steep for flat lines and xy_steep for steep (non flat) lines*/ - int32_t steep; - - /*Steepness in 1 px in 0..255 range. Used only by flat lines.*/ - int32_t spx; - - /*1: It's a flat line? (Near to horizontal)*/ - uint8_t flat : 1; - - /*Invert the mask. The default is: Keep the left part. - *It is used to select left/right/top/bottom*/ - uint8_t inv: 1; -} lv_draw_sw_mask_line_param_t; - -typedef struct { - /*The first element must be the common descriptor*/ - _lv_draw_sw_mask_common_dsc_t dsc; - - struct { - lv_point_t vertex_p; - int32_t start_angle; - int32_t end_angle; - } cfg; - - lv_draw_sw_mask_line_param_t start_line; - lv_draw_sw_mask_line_param_t end_line; - uint16_t delta_deg; -} lv_draw_sw_mask_angle_param_t; - -typedef struct { - uint8_t * buf; - lv_opa_t * cir_opa; /*Opacity of values on the circumference of an 1/4 circle*/ - uint16_t * x_start_on_y; /*The x coordinate of the circle for each y value*/ - uint16_t * opa_start_on_y; /*The index of `cir_opa` for each y value*/ - int32_t life; /*How many times the entry way used*/ - uint32_t used_cnt; /*Like a semaphore to count the referencing masks*/ - int32_t radius; /*The radius of the entry*/ -} _lv_draw_sw_mask_radius_circle_dsc_t; - -typedef _lv_draw_sw_mask_radius_circle_dsc_t _lv_draw_sw_mask_radius_circle_dsc_arr_t[LV_DRAW_SW_CIRCLE_CACHE_SIZE]; - -typedef struct { - /*The first element must be the common descriptor*/ - _lv_draw_sw_mask_common_dsc_t dsc; - - struct { - lv_area_t rect; - int32_t radius; - /*Invert the mask. 0: Keep the pixels inside.*/ - uint8_t outer: 1; - } cfg; - - _lv_draw_sw_mask_radius_circle_dsc_t * circle; -} lv_draw_sw_mask_radius_param_t; - -typedef struct { - /*The first element must be the common descriptor*/ - _lv_draw_sw_mask_common_dsc_t dsc; - - struct { - lv_area_t coords; - int32_t y_top; - int32_t y_bottom; - lv_opa_t opa_top; - lv_opa_t opa_bottom; - } cfg; - -} lv_draw_sw_mask_fade_param_t; - -typedef struct _lv_draw_sw_mask_map_param_t { - /*The first element must be the common descriptor*/ - _lv_draw_sw_mask_common_dsc_t dsc; - - struct { - lv_area_t coords; - const lv_opa_t * map; - } cfg; -} lv_draw_sw_mask_map_param_t; - /********************** * GLOBAL PROTOTYPES **********************/ @@ -216,12 +102,6 @@ lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_mask_apply(void * m */ void lv_draw_sw_mask_free_param(void * p); -/** - * Called by LVGL the rendering of a screen is ready to clean up - * the temporal (cache) data of the masks - */ -void _lv_draw_sw_mask_cleanup(void); - /** *Initialize a line mask from two points. * @param param pointer to a `lv_draw_mask_param_t` to initialize diff --git a/src/draw/sw/lv_draw_sw_mask_private.h b/src/draw/sw/lv_draw_sw_mask_private.h new file mode 100644 index 000000000..a749ac745 --- /dev/null +++ b/src/draw/sw/lv_draw_sw_mask_private.h @@ -0,0 +1,152 @@ +/** + * @file lv_draw_sw_mask_private.h + * + */ + +#ifndef LV_DRAW_SW_MASK_PRIVATE_H +#define LV_DRAW_SW_MASK_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_sw_mask.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + uint8_t * buf; + lv_opa_t * cir_opa; /*Opacity of values on the circumference of an 1/4 circle*/ + uint16_t * x_start_on_y; /*The x coordinate of the circle for each y value*/ + uint16_t * opa_start_on_y; /*The index of `cir_opa` for each y value*/ + int32_t life; /*How many times the entry way used*/ + uint32_t used_cnt; /*Like a semaphore to count the referencing masks*/ + int32_t radius; /*The radius of the entry*/ +} lv_draw_sw_mask_radius_circle_dsc_t; +struct lv_draw_sw_mask_common_dsc_t { + lv_draw_sw_mask_xcb_t cb; + lv_draw_sw_mask_type_t type; +}; + +struct lv_draw_sw_mask_line_param_t { + /*The first element must be the common descriptor*/ + lv_draw_sw_mask_common_dsc_t dsc; + + struct { + /*First point*/ + lv_point_t p1; + + /*Second point*/ + lv_point_t p2; + + /*Which side to keep?*/ + lv_draw_sw_mask_line_side_t side : 2; + } cfg; + + /*A point of the line*/ + lv_point_t origo; + + /*X / (1024*Y) steepness (X is 0..1023 range). What is the change of X in 1024 Y?*/ + int32_t xy_steep; + + /*Y / (1024*X) steepness (Y is 0..1023 range). What is the change of Y in 1024 X?*/ + int32_t yx_steep; + + /*Helper which stores yx_steep for flat lines and xy_steep for steep (non flat) lines*/ + int32_t steep; + + /*Steepness in 1 px in 0..255 range. Used only by flat lines.*/ + int32_t spx; + + /*1: It's a flat line? (Near to horizontal)*/ + uint8_t flat : 1; + + /*Invert the mask. The default is: Keep the left part. + *It is used to select left/right/top/bottom*/ + uint8_t inv: 1; +}; + +struct lv_draw_sw_mask_angle_param_t { + /*The first element must be the common descriptor*/ + lv_draw_sw_mask_common_dsc_t dsc; + + struct { + lv_point_t vertex_p; + int32_t start_angle; + int32_t end_angle; + } cfg; + + lv_draw_sw_mask_line_param_t start_line; + lv_draw_sw_mask_line_param_t end_line; + uint16_t delta_deg; +}; + +struct lv_draw_sw_mask_radius_param_t { + /*The first element must be the common descriptor*/ + lv_draw_sw_mask_common_dsc_t dsc; + + struct { + lv_area_t rect; + int32_t radius; + /*Invert the mask. 0: Keep the pixels inside.*/ + uint8_t outer: 1; + } cfg; + + lv_draw_sw_mask_radius_circle_dsc_t * circle; +}; + +struct lv_draw_sw_mask_fade_param_t { + /*The first element must be the common descriptor*/ + lv_draw_sw_mask_common_dsc_t dsc; + + struct { + lv_area_t coords; + int32_t y_top; + int32_t y_bottom; + lv_opa_t opa_top; + lv_opa_t opa_bottom; + } cfg; + +}; + +struct lv_draw_sw_mask_map_param_t { + /*The first element must be the common descriptor*/ + lv_draw_sw_mask_common_dsc_t dsc; + + struct { + lv_area_t coords; + const lv_opa_t * map; + } cfg; +}; + +typedef lv_draw_sw_mask_radius_circle_dsc_t lv_draw_sw_mask_radius_circle_dsc_arr_t[LV_DRAW_SW_CIRCLE_CACHE_SIZE]; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Called by LVGL the rendering of a screen is ready to clean up + * the temporal (cache) data of the masks + */ +void lv_draw_sw_mask_cleanup(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_MASK_PRIVATE_H*/ diff --git a/src/draw/sw/lv_draw_sw_mask_rect.c b/src/draw/sw/lv_draw_sw_mask_rect.c index 919758cbf..bd28d0d0e 100644 --- a/src/draw/sw/lv_draw_sw_mask_rect.c +++ b/src/draw/sw/lv_draw_sw_mask_rect.c @@ -6,7 +6,9 @@ /********************* * INCLUDES *********************/ -#include "../lv_draw.h" +#include "../../misc/lv_area_private.h" +#include "../lv_draw_mask_private.h" +#include "../lv_draw_private.h" #if LV_USE_DRAW_SW #if LV_DRAW_SW_COMPLEX @@ -15,7 +17,7 @@ #include "../../stdlib/lv_mem.h" #include "../../stdlib/lv_string.h" #include "lv_draw_sw.h" -#include "lv_draw_sw_mask.h" +#include "lv_draw_sw_mask_private.h" /********************* * DEFINES @@ -46,7 +48,7 @@ void lv_draw_sw_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_ds LV_UNUSED(coords); lv_area_t draw_area; - if(!_lv_area_intersect(&draw_area, &dsc->area, draw_unit->clip_area)) { + if(!lv_area_intersect(&draw_area, &dsc->area, draw_unit->clip_area)) { return; } diff --git a/src/draw/sw/lv_draw_sw_private.h b/src/draw/sw/lv_draw_sw_private.h new file mode 100644 index 000000000..419218851 --- /dev/null +++ b/src/draw/sw/lv_draw_sw_private.h @@ -0,0 +1,67 @@ +/** + * @file lv_draw_sw_private.h + * + */ + +#ifndef LV_DRAW_SW_PRIVATE_H +#define LV_DRAW_SW_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_sw.h" + +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_draw_sw_unit_t { + lv_draw_unit_t base_unit; + lv_draw_task_t * task_act; +#if LV_USE_OS + lv_thread_sync_t sync; + lv_thread_t thread; + volatile bool inited; + volatile bool exit_status; +#endif + uint32_t idx; +}; + +#if LV_DRAW_SW_SHADOW_CACHE_SIZE +typedef struct { + uint8_t cache[LV_DRAW_SW_SHADOW_CACHE_SIZE * LV_DRAW_SW_SHADOW_CACHE_SIZE]; + int32_t cache_size; + int32_t cache_r; +} lv_draw_sw_shadow_cache_t; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_DRAW_SW */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_PRIVATE_H*/ diff --git a/src/draw/sw/lv_draw_sw_triangle.c b/src/draw/sw/lv_draw_sw_triangle.c index 311325b3d..4d42c4e3c 100644 --- a/src/draw/sw/lv_draw_sw_triangle.c +++ b/src/draw/sw/lv_draw_sw_triangle.c @@ -6,16 +6,19 @@ /********************* * INCLUDES *********************/ +#include "lv_draw_sw_mask_private.h" +#include "blend/lv_draw_sw_blend_private.h" +#include "../lv_draw_private.h" #include "lv_draw_sw.h" #if LV_USE_DRAW_SW #include "../../misc/lv_math.h" #include "../../stdlib/lv_mem.h" -#include "../../misc/lv_area.h" +#include "../../misc/lv_area_private.h" #include "../../misc/lv_color.h" #include "../../stdlib/lv_string.h" -#include "../lv_draw_triangle.h" -#include "lv_draw_sw_gradient.h" +#include "../lv_draw_triangle_private.h" +#include "lv_draw_sw_gradient_private.h" /********************* * DEFINES @@ -52,7 +55,7 @@ void lv_draw_sw_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_ bool is_common; lv_area_t draw_area; - is_common = _lv_area_intersect(&draw_area, &tri_area, draw_unit->clip_area); + is_common = lv_area_intersect(&draw_area, &tri_area, draw_unit->clip_area); if(!is_common) return; lv_point_t p[3]; diff --git a/src/draw/sw/lv_draw_sw_vector.c b/src/draw/sw/lv_draw_sw_vector.c index c7fa11cb0..4b99a47e9 100644 --- a/src/draw/sw/lv_draw_sw_vector.c +++ b/src/draw/sw/lv_draw_sw_vector.c @@ -6,6 +6,9 @@ /********************* * INCLUDES *********************/ +#include "../lv_image_decoder_private.h" +#include "../lv_draw_vector_private.h" +#include "../lv_draw_private.h" #include "lv_draw_sw.h" #if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG @@ -49,7 +52,7 @@ typedef struct { * MACROS **********************/ -static void _lv_area_to_tvg(_tvg_rect * rect, const lv_area_t * area) +static void lv_area_to_tvg(_tvg_rect * rect, const lv_area_t * area) { rect->x = area->x1; rect->y = area->y1; @@ -57,7 +60,7 @@ static void _lv_area_to_tvg(_tvg_rect * rect, const lv_area_t * area) rect->h = lv_area_get_height(area) - 1; } -static void _lv_color_to_tvg(_tvg_color * color, const lv_color32_t * c, lv_opa_t opa) +static void lv_color_to_tvg(_tvg_color * color, const lv_color32_t * c, lv_opa_t opa) { color->r = c->red; color->g = c->green; @@ -65,7 +68,7 @@ static void _lv_color_to_tvg(_tvg_color * color, const lv_color32_t * c, lv_opa_ color->a = LV_OPA_MIX2(c->alpha, opa); } -static void _lv_matrix_to_tvg(Tvg_Matrix * tm, const lv_matrix_t * m) +static void lv_matrix_to_tvg(Tvg_Matrix * tm, const lv_matrix_t * m) { tm->e11 = m->m[0][0]; tm->e12 = m->m[0][1]; @@ -135,7 +138,7 @@ static void _set_paint_shape(Tvg_Paint * obj, const lv_vector_path_t * p) } } -static Tvg_Stroke_Cap _lv_stroke_cap_to_tvg(lv_vector_stroke_cap_t cap) +static Tvg_Stroke_Cap lv_stroke_cap_to_tvg(lv_vector_stroke_cap_t cap) { switch(cap) { case LV_VECTOR_STROKE_CAP_SQUARE: @@ -149,7 +152,7 @@ static Tvg_Stroke_Cap _lv_stroke_cap_to_tvg(lv_vector_stroke_cap_t cap) } } -static Tvg_Stroke_Join _lv_stroke_join_to_tvg(lv_vector_stroke_join_t join) +static Tvg_Stroke_Join lv_stroke_join_to_tvg(lv_vector_stroke_join_t join) { switch(join) { case LV_VECTOR_STROKE_JOIN_BEVEL: @@ -163,7 +166,7 @@ static Tvg_Stroke_Join _lv_stroke_join_to_tvg(lv_vector_stroke_join_t join) } } -static Tvg_Stroke_Fill _lv_spread_to_tvg(lv_vector_gradient_spread_t sp) +static Tvg_Stroke_Fill lv_spread_to_tvg(lv_vector_gradient_spread_t sp) { switch(sp) { case LV_VECTOR_GRADIENT_SPREAD_PAD: @@ -193,9 +196,9 @@ static void _setup_gradient(Tvg_Gradient * gradient, const lv_vector_gradient_t } tvg_gradient_set_color_stops(gradient, stops, grad->stops_count); - tvg_gradient_set_spread(gradient, _lv_spread_to_tvg(grad->spread)); + tvg_gradient_set_spread(gradient, lv_spread_to_tvg(grad->spread)); Tvg_Matrix mtx; - _lv_matrix_to_tvg(&mtx, matrix); + lv_matrix_to_tvg(&mtx, matrix); tvg_gradient_set_transform(gradient, &mtx); lv_free(stops); } @@ -221,7 +224,7 @@ static void _set_paint_stroke(Tvg_Paint * obj, const lv_vector_stroke_dsc_t * ds { if(dsc->style == LV_VECTOR_DRAW_STYLE_SOLID) { _tvg_color c; - _lv_color_to_tvg(&c, &dsc->color, dsc->opa); + lv_color_to_tvg(&c, &dsc->color, dsc->opa); tvg_shape_set_stroke_color(obj, c.r, c.g, c.b, c.a); } else { /*gradient*/ @@ -230,8 +233,8 @@ static void _set_paint_stroke(Tvg_Paint * obj, const lv_vector_stroke_dsc_t * ds tvg_shape_set_stroke_width(obj, dsc->width); tvg_shape_set_stroke_miterlimit(obj, dsc->miter_limit); - tvg_shape_set_stroke_cap(obj, _lv_stroke_cap_to_tvg(dsc->cap)); - tvg_shape_set_stroke_join(obj, _lv_stroke_join_to_tvg(dsc->join)); + tvg_shape_set_stroke_cap(obj, lv_stroke_cap_to_tvg(dsc->cap)); + tvg_shape_set_stroke_join(obj, lv_stroke_join_to_tvg(dsc->join)); if(!lv_array_is_empty(&dsc->dash_pattern)) { float * dash_array = lv_array_front(&dsc->dash_pattern); @@ -239,7 +242,7 @@ static void _set_paint_stroke(Tvg_Paint * obj, const lv_vector_stroke_dsc_t * ds } } -static Tvg_Fill_Rule _lv_fill_rule_to_tvg(lv_vector_fill_t rule) +static Tvg_Fill_Rule lv_fill_rule_to_tvg(lv_vector_fill_t rule) { switch(rule) { case LV_VECTOR_FILL_NONZERO: @@ -303,7 +306,7 @@ static void _set_paint_fill_pattern(Tvg_Paint * obj, Tvg_Canvas * canvas, const tvg_paint_set_opacity(img, p->opa); Tvg_Matrix mtx; - _lv_matrix_to_tvg(&mtx, m); + lv_matrix_to_tvg(&mtx, m); tvg_paint_set_transform(img, &mtx); tvg_canvas_push(canvas, img); lv_image_decoder_close(&decoder_dsc); @@ -312,11 +315,11 @@ static void _set_paint_fill_pattern(Tvg_Paint * obj, Tvg_Canvas * canvas, const static void _set_paint_fill(Tvg_Paint * obj, Tvg_Canvas * canvas, const lv_vector_fill_dsc_t * dsc, const lv_matrix_t * matrix) { - tvg_shape_set_fill_rule(obj, _lv_fill_rule_to_tvg(dsc->fill_rule)); + tvg_shape_set_fill_rule(obj, lv_fill_rule_to_tvg(dsc->fill_rule)); if(dsc->style == LV_VECTOR_DRAW_STYLE_SOLID) { _tvg_color c; - _lv_color_to_tvg(&c, &dsc->color, dsc->opa); + lv_color_to_tvg(&c, &dsc->color, dsc->opa); tvg_shape_set_fill_color(obj, c.r, c.g, c.b, c.a); } else if(dsc->style == LV_VECTOR_DRAW_STYLE_PATTERN) { @@ -334,7 +337,7 @@ static void _set_paint_fill(Tvg_Paint * obj, Tvg_Canvas * canvas, const lv_vecto } } -static Tvg_Blend_Method _lv_blend_to_tvg(lv_vector_blend_t blend) +static Tvg_Blend_Method lv_blend_to_tvg(lv_vector_blend_t blend) { switch(blend) { case LV_VECTOR_BLEND_SRC_OVER: @@ -359,7 +362,7 @@ static Tvg_Blend_Method _lv_blend_to_tvg(lv_vector_blend_t blend) static void _set_paint_blend_mode(Tvg_Paint * obj, lv_vector_blend_t blend) { - tvg_paint_set_blend_method(obj, _lv_blend_to_tvg(blend)); + tvg_paint_set_blend_method(obj, lv_blend_to_tvg(blend)); } static void _task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vector_draw_dsc_t * dsc) @@ -370,10 +373,10 @@ static void _task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_ve if(!path) { /*clear*/ _tvg_rect rc; - _lv_area_to_tvg(&rc, &dsc->scissor_area); + lv_area_to_tvg(&rc, &dsc->scissor_area); _tvg_color c; - _lv_color_to_tvg(&c, &dsc->fill_dsc.color, dsc->fill_dsc.opa); + lv_color_to_tvg(&c, &dsc->fill_dsc.color, dsc->fill_dsc.opa); Tvg_Matrix mtx = { 1.0f, 0.0f, 0.0f, @@ -386,7 +389,7 @@ static void _task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_ve } else { Tvg_Matrix mtx; - _lv_matrix_to_tvg(&mtx, &dsc->matrix); + lv_matrix_to_tvg(&mtx, &dsc->matrix); _set_paint_matrix(obj, &mtx); _set_paint_shape(obj, path); @@ -430,11 +433,11 @@ void lv_draw_sw_vector(lv_draw_unit_t * draw_unit, const lv_draw_vector_task_dsc tvg_swcanvas_set_target(canvas, buf, stride / 4, width, height, TVG_COLORSPACE_ARGB8888); _tvg_rect rc; - _lv_area_to_tvg(&rc, draw_unit->clip_area); + lv_area_to_tvg(&rc, draw_unit->clip_area); tvg_canvas_set_viewport(canvas, (int32_t)rc.x, (int32_t)rc.y, (int32_t)rc.w, (int32_t)rc.h); lv_ll_t * task_list = dsc->task_list; - _lv_vector_for_each_destroy_tasks(task_list, _task_draw_cb, canvas); + lv_vector_for_each_destroy_tasks(task_list, _task_draw_cb, canvas); if(tvg_canvas_draw(canvas) == TVG_RESULT_SUCCESS) { tvg_canvas_sync(canvas); diff --git a/src/draw/vg_lite/lv_draw_buf_vg_lite.c b/src/draw/vg_lite/lv_draw_buf_vg_lite.c index 65b085ca0..de0b4b90b 100644 --- a/src/draw/vg_lite/lv_draw_buf_vg_lite.c +++ b/src/draw/vg_lite/lv_draw_buf_vg_lite.c @@ -11,6 +11,7 @@ #if LV_USE_DRAW_VG_LITE +#include "../lv_draw_buf_private.h" #include "lv_vg_lite_utils.h" /********************* diff --git a/src/draw/vg_lite/lv_draw_vg_lite.c b/src/draw/vg_lite/lv_draw_vg_lite.c index 6c39a31c7..25346ebf5 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite.c +++ b/src/draw/vg_lite/lv_draw_vg_lite.c @@ -11,7 +11,7 @@ #if LV_USE_DRAW_VG_LITE -#include "../lv_draw.h" +#include "../lv_draw_private.h" #include "lv_draw_vg_lite_type.h" #include "lv_vg_lite_path.h" #include "lv_vg_lite_utils.h" diff --git a/src/draw/vg_lite/lv_draw_vg_lite_arc.c b/src/draw/vg_lite/lv_draw_vg_lite_arc.c index 2948f5c04..68893c0e4 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_arc.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_arc.c @@ -7,6 +7,9 @@ * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" +#include "../lv_image_decoder_private.h" +#include "../lv_draw_private.h" #include "lv_draw_vg_lite.h" #if LV_USE_DRAW_VG_LITE @@ -55,7 +58,7 @@ void lv_draw_vg_lite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * d lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; lv_area_t clip_area; - if(!_lv_area_intersect(&clip_area, coords, draw_unit->clip_area)) { + if(!lv_area_intersect(&clip_area, coords, draw_unit->clip_area)) { /*Fully clipped, nothing to do*/ return; } diff --git a/src/draw/vg_lite/lv_draw_vg_lite_border.c b/src/draw/vg_lite/lv_draw_vg_lite_border.c index 924661d5d..ea1368df5 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_border.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_border.c @@ -7,6 +7,8 @@ * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" +#include "../lv_draw_private.h" #include "lv_draw_vg_lite.h" #if LV_USE_DRAW_VG_LITE @@ -45,7 +47,7 @@ void lv_draw_vg_lite_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; lv_area_t clip_area; - if(!_lv_area_intersect(&clip_area, coords, draw_unit->clip_area)) { + if(!lv_area_intersect(&clip_area, coords, draw_unit->clip_area)) { /*Fully clipped, nothing to do*/ return; } diff --git a/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c b/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c index 409b95171..cad9500f8 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c @@ -7,6 +7,7 @@ * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" #include "lv_draw_vg_lite.h" #if LV_USE_DRAW_VG_LITE @@ -57,7 +58,7 @@ void lv_draw_vg_lite_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_sh /*Get clipped draw area which is the real draw area. *It is always the same or inside `shadow_area`*/ lv_area_t draw_area; - if(!_lv_area_intersect(&draw_area, &shadow_area, draw_unit->clip_area)) return; + if(!lv_area_intersect(&draw_area, &shadow_area, draw_unit->clip_area)) return; LV_PROFILER_BEGIN; diff --git a/src/draw/vg_lite/lv_draw_vg_lite_fill.c b/src/draw/vg_lite/lv_draw_vg_lite_fill.c index 5e429f9ff..faef7b23f 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_fill.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_fill.c @@ -7,6 +7,7 @@ * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" #include "lv_draw_vg_lite.h" #if LV_USE_DRAW_VG_LITE @@ -49,7 +50,7 @@ void lv_draw_vg_lite_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; lv_area_t clip_area; - if(!_lv_area_intersect(&clip_area, coords, draw_unit->clip_area)) { + if(!lv_area_intersect(&clip_area, coords, draw_unit->clip_area)) { /*Fully clipped, nothing to do*/ return; } diff --git a/src/draw/vg_lite/lv_draw_vg_lite_img.c b/src/draw/vg_lite/lv_draw_vg_lite_img.c index 01b5152a4..454198381 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_img.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_img.c @@ -7,6 +7,10 @@ * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" +#include "../lv_image_decoder_private.h" +#include "../lv_draw_image_private.h" +#include "../lv_draw_private.h" #include "lv_draw_vg_lite.h" #if LV_USE_DRAW_VG_LITE @@ -50,7 +54,7 @@ void lv_draw_vg_lite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * * so the transformed area needs to be calculated once. */ lv_area_t image_tf_area; - _lv_image_buf_get_transformed_area( + lv_image_buf_get_transformed_area( &image_tf_area, lv_area_get_width(coords), lv_area_get_height(coords), @@ -61,7 +65,7 @@ void lv_draw_vg_lite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * lv_area_move(&image_tf_area, coords->x1, coords->y1); lv_area_t clip_area; - if(!_lv_area_intersect(&clip_area, &image_tf_area, draw_unit->clip_area)) { + if(!lv_area_intersect(&clip_area, &image_tf_area, draw_unit->clip_area)) { /*Fully clipped, nothing to do*/ return; } @@ -99,7 +103,7 @@ void lv_draw_vg_lite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); /* If clipping is not required, blit directly */ - if(_lv_area_is_in(&image_tf_area, draw_unit->clip_area, false) && dsc->clip_radius <= 0) { + if(lv_area_is_in(&image_tf_area, draw_unit->clip_area, false) && dsc->clip_radius <= 0) { /* The image area is the coordinates relative to the image itself */ lv_area_t src_area = *coords; lv_area_move(&src_area, -coords->x1, -coords->y1); diff --git a/src/draw/vg_lite/lv_draw_vg_lite_label.c b/src/draw/vg_lite/lv_draw_vg_lite_label.c index 970a2fd8c..77e2b54ff 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_label.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_label.c @@ -7,6 +7,9 @@ * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" +#include "../../libs/freetype/lv_freetype_private.h" +#include "../lv_draw_label_private.h" #include "lv_draw_vg_lite.h" #include "../../lvgl.h" @@ -139,7 +142,7 @@ static void draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * gly static void draw_letter_bitmap(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_dsc_t * dsc) { lv_area_t clip_area; - if(!_lv_area_intersect(&clip_area, u->base_unit.clip_area, dsc->letter_coords)) { + if(!lv_area_intersect(&clip_area, u->base_unit.clip_area, dsc->letter_coords)) { return; } @@ -163,7 +166,7 @@ static void draw_letter_bitmap(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_d LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); /* If clipping is not required, blit directly */ - if(_lv_area_is_in(&image_area, u->base_unit.clip_area, false)) { + if(lv_area_is_in(&image_area, u->base_unit.clip_area, false)) { /* The image area is the coordinates relative to the image itself */ lv_area_t src_area = image_area; lv_area_move(&src_area, -image_area.x1, -image_area.y1); @@ -232,7 +235,7 @@ static void draw_letter_outline(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_ { /* get clip area */ lv_area_t path_clip_area; - if(!_lv_area_intersect(&path_clip_area, u->base_unit.clip_area, dsc->letter_coords)) { + if(!lv_area_intersect(&path_clip_area, u->base_unit.clip_area, dsc->letter_coords)) { return; } diff --git a/src/draw/vg_lite/lv_draw_vg_lite_layer.c b/src/draw/vg_lite/lv_draw_vg_lite_layer.c index f79f4188f..8f2a17e80 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_layer.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_layer.c @@ -42,7 +42,7 @@ void lv_draw_vg_lite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t const lv_area_t * coords) { lv_layer_t * layer = (lv_layer_t *)draw_dsc->src; - struct _lv_draw_vg_lite_unit_t * u = (struct _lv_draw_vg_lite_unit_t *)draw_unit; + struct lv_draw_vg_lite_unit_t * u = (struct lv_draw_vg_lite_unit_t *)draw_unit; /*It can happen that nothing was draw on a layer and therefore its buffer is not allocated. *In this case just return. */ diff --git a/src/draw/vg_lite/lv_draw_vg_lite_line.c b/src/draw/vg_lite/lv_draw_vg_lite_line.c index ff9b6e9df..501e8b653 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_line.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_line.c @@ -7,6 +7,7 @@ * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" #include "lv_draw_vg_lite.h" #if LV_USE_DRAW_VG_LITE @@ -60,7 +61,7 @@ void lv_draw_vg_lite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * rel_clip_area.y1 = (int32_t)(LV_MIN(p1_y, p2_y) - half_w); rel_clip_area.y2 = (int32_t)(LV_MAX(p1_y, p2_y) + half_w); - if(!_lv_area_intersect(&rel_clip_area, &rel_clip_area, draw_unit->clip_area)) { + if(!lv_area_intersect(&rel_clip_area, &rel_clip_area, draw_unit->clip_area)) { return; /*Fully clipped, nothing to do*/ } diff --git a/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c b/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c index a7cbda0cb..227aeb4c8 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c @@ -7,6 +7,9 @@ * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" +#include "../sw/lv_draw_sw_mask_private.h" +#include "../lv_draw_mask_private.h" #include "lv_draw_vg_lite.h" #if LV_USE_DRAW_VG_LITE @@ -44,7 +47,7 @@ void lv_draw_vg_lite_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_re LV_UNUSED(coords); lv_area_t draw_area; - if(!_lv_area_intersect(&draw_area, &dsc->area, draw_unit->clip_area)) { + if(!lv_area_intersect(&draw_area, &dsc->area, draw_unit->clip_area)) { return; } diff --git a/src/draw/vg_lite/lv_draw_vg_lite_triangle.c b/src/draw/vg_lite/lv_draw_vg_lite_triangle.c index b41b1aa11..e0258984f 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_triangle.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_triangle.c @@ -7,6 +7,7 @@ * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" #include "lv_draw_vg_lite.h" #if LV_USE_DRAW_VG_LITE @@ -50,7 +51,7 @@ void lv_draw_vg_lite_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle bool is_common; lv_area_t clip_area; - is_common = _lv_area_intersect(&clip_area, &tri_area, draw_unit->clip_area); + is_common = lv_area_intersect(&clip_area, &tri_area, draw_unit->clip_area); if(!is_common) return; LV_PROFILER_BEGIN; diff --git a/src/draw/vg_lite/lv_draw_vg_lite_type.h b/src/draw/vg_lite/lv_draw_vg_lite_type.h index d1ba5d7ed..d325be51b 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_type.h +++ b/src/draw/vg_lite/lv_draw_vg_lite_type.h @@ -18,7 +18,7 @@ extern "C" { #if LV_USE_DRAW_VG_LITE -#include "../lv_draw.h" +#include "../lv_draw_private.h" #include "../../misc/lv_array.h" #if LV_USE_VG_LITE_THORVG @@ -35,23 +35,23 @@ extern "C" { * TYPEDEFS **********************/ -struct _lv_vg_lite_pending_t; +struct lv_vg_lite_pending_t; -struct _lv_draw_vg_lite_unit_t { +struct lv_draw_vg_lite_unit_t { lv_draw_unit_t base_unit; lv_draw_task_t * task_act; - struct _lv_vg_lite_pending_t * image_dsc_pending; + struct lv_vg_lite_pending_t * image_dsc_pending; lv_cache_t * grad_cache; - struct _lv_vg_lite_pending_t * grad_pending; + struct lv_vg_lite_pending_t * grad_pending; lv_cache_t * stroke_cache; uint16_t flush_count; vg_lite_buffer_t target_buffer; vg_lite_matrix_t global_matrix; - struct _lv_vg_lite_path_t * global_path; + struct lv_vg_lite_path_t * global_path; bool path_in_use; }; diff --git a/src/draw/vg_lite/lv_draw_vg_lite_vector.c b/src/draw/vg_lite/lv_draw_vg_lite_vector.c index 80d637e67..a70caf804 100644 --- a/src/draw/vg_lite/lv_draw_vg_lite_vector.c +++ b/src/draw/vg_lite/lv_draw_vg_lite_vector.c @@ -7,6 +7,8 @@ * INCLUDES *********************/ +#include "../lv_image_decoder_private.h" +#include "../lv_draw_vector_private.h" #include "lv_draw_vg_lite.h" #if LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC @@ -28,7 +30,7 @@ **********************/ typedef void * path_drop_data_t; -typedef void (*path_drop_func_t)(struct _lv_draw_vg_lite_unit_t *, path_drop_data_t); +typedef void (*path_drop_func_t)(struct lv_draw_vg_lite_unit_t *, path_drop_data_t); /********************** * STATIC PROTOTYPES @@ -62,7 +64,7 @@ void lv_draw_vg_lite_vector(lv_draw_unit_t * draw_unit, const lv_draw_vector_tas return; LV_PROFILER_BEGIN; - _lv_vector_for_each_destroy_tasks(dsc->task_list, task_draw_cb, draw_unit); + lv_vector_for_each_destroy_tasks(dsc->task_list, task_draw_cb, draw_unit); LV_PROFILER_END; } diff --git a/src/draw/vg_lite/lv_vg_lite_decoder.c b/src/draw/vg_lite/lv_vg_lite_decoder.c index 822db0dfb..a7a4ead2b 100644 --- a/src/draw/vg_lite/lv_vg_lite_decoder.c +++ b/src/draw/vg_lite/lv_vg_lite_decoder.c @@ -7,6 +7,7 @@ * INCLUDES *********************/ +#include "../lv_image_decoder_private.h" #include "lv_vg_lite_decoder.h" #if LV_USE_DRAW_VG_LITE @@ -14,6 +15,7 @@ #include "lv_vg_lite_utils.h" #include #include +#include "../../core/lv_global.h" /********************* * DEFINES diff --git a/src/draw/vg_lite/lv_vg_lite_grad.c b/src/draw/vg_lite/lv_vg_lite_grad.c index 4276aedc9..5158d057d 100644 --- a/src/draw/vg_lite/lv_vg_lite_grad.c +++ b/src/draw/vg_lite/lv_vg_lite_grad.c @@ -7,6 +7,7 @@ * INCLUDES *********************/ +#include "../lv_draw_vector_private.h" #include "lv_vg_lite_grad.h" #if LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC @@ -52,7 +53,7 @@ typedef struct { * STATIC PROTOTYPES **********************/ -static grad_item_t * grad_get(struct _lv_draw_vg_lite_unit_t * u, const lv_vector_gradient_t * grad); +static grad_item_t * grad_get(struct lv_draw_vg_lite_unit_t * u, const lv_vector_gradient_t * grad); static void grad_cache_release_cb(void * entry, void * user_data); static bool grad_create_cb(grad_item_t * item, void * user_data); static void grad_free_cb(grad_item_t * item, void * user_data); @@ -74,7 +75,7 @@ static vg_lite_gradient_spreadmode_t lv_spread_to_vg(lv_vector_gradient_spread_t * GLOBAL FUNCTIONS **********************/ -void lv_vg_lite_grad_init(struct _lv_draw_vg_lite_unit_t * u, uint32_t cache_cnt) +void lv_vg_lite_grad_init(struct lv_draw_vg_lite_unit_t * u, uint32_t cache_cnt) { LV_ASSERT_NULL(u); @@ -90,7 +91,7 @@ void lv_vg_lite_grad_init(struct _lv_draw_vg_lite_unit_t * u, uint32_t cache_cnt lv_vg_lite_pending_set_free_cb(u->grad_pending, grad_cache_release_cb, u->grad_cache); } -void lv_vg_lite_grad_deinit(struct _lv_draw_vg_lite_unit_t * u) +void lv_vg_lite_grad_deinit(struct lv_draw_vg_lite_unit_t * u) { LV_ASSERT_NULL(u); LV_ASSERT_NULL(u->grad_pending) @@ -101,7 +102,7 @@ void lv_vg_lite_grad_deinit(struct _lv_draw_vg_lite_unit_t * u) } bool lv_vg_lite_draw_grad( - struct _lv_draw_vg_lite_unit_t * u, + struct lv_draw_vg_lite_unit_t * u, vg_lite_buffer_t * buffer, vg_lite_path_t * path, const lv_vector_gradient_t * grad, @@ -224,7 +225,7 @@ bool lv_vg_lite_draw_grad( } bool lv_vg_lite_draw_grad_helper( - struct _lv_draw_vg_lite_unit_t * u, + struct lv_draw_vg_lite_unit_t * u, vg_lite_buffer_t * buffer, vg_lite_path_t * path, const lv_area_t * area, @@ -321,7 +322,7 @@ bool lv_vg_lite_draw_grad_helper( * STATIC FUNCTIONS **********************/ -static grad_item_t * grad_get(struct _lv_draw_vg_lite_unit_t * u, const lv_vector_gradient_t * grad) +static grad_item_t * grad_get(struct lv_draw_vg_lite_unit_t * u, const lv_vector_gradient_t * grad) { LV_ASSERT_NULL(u); LV_ASSERT_NULL(grad); diff --git a/src/draw/vg_lite/lv_vg_lite_grad.h b/src/draw/vg_lite/lv_vg_lite_grad.h index d9bde91e9..d8b9d1f97 100644 --- a/src/draw/vg_lite/lv_vg_lite_grad.h +++ b/src/draw/vg_lite/lv_vg_lite_grad.h @@ -32,12 +32,12 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -void lv_vg_lite_grad_init(struct _lv_draw_vg_lite_unit_t * u, uint32_t cache_cnt); +void lv_vg_lite_grad_init(struct lv_draw_vg_lite_unit_t * u, uint32_t cache_cnt); -void lv_vg_lite_grad_deinit(struct _lv_draw_vg_lite_unit_t * u); +void lv_vg_lite_grad_deinit(struct lv_draw_vg_lite_unit_t * u); bool lv_vg_lite_draw_grad( - struct _lv_draw_vg_lite_unit_t * u, + struct lv_draw_vg_lite_unit_t * u, vg_lite_buffer_t * buffer, vg_lite_path_t * path, const lv_vector_gradient_t * grad, @@ -47,7 +47,7 @@ bool lv_vg_lite_draw_grad( vg_lite_blend_t blend); bool lv_vg_lite_draw_grad_helper( - struct _lv_draw_vg_lite_unit_t * u, + struct lv_draw_vg_lite_unit_t * u, vg_lite_buffer_t * buffer, vg_lite_path_t * path, const lv_area_t * area, diff --git a/src/draw/vg_lite/lv_vg_lite_path.c b/src/draw/vg_lite/lv_vg_lite_path.c index 62f5ad969..77d002677 100644 --- a/src/draw/vg_lite/lv_vg_lite_path.c +++ b/src/draw/vg_lite/lv_vg_lite_path.c @@ -34,7 +34,7 @@ * TYPEDEFS **********************/ -struct _lv_vg_lite_path_t { +struct lv_vg_lite_path_t { vg_lite_path_t base; size_t mem_size; uint8_t format_len; @@ -63,14 +63,14 @@ typedef struct { * GLOBAL FUNCTIONS **********************/ -void lv_vg_lite_path_init(struct _lv_draw_vg_lite_unit_t * unit) +void lv_vg_lite_path_init(struct lv_draw_vg_lite_unit_t * unit) { LV_ASSERT_NULL(unit); unit->global_path = lv_vg_lite_path_create(VG_LITE_FP32); unit->path_in_use = false; } -void lv_vg_lite_path_deinit(struct _lv_draw_vg_lite_unit_t * unit) +void lv_vg_lite_path_deinit(struct lv_draw_vg_lite_unit_t * unit) { LV_ASSERT_NULL(unit); LV_ASSERT(!unit->path_in_use); @@ -111,7 +111,7 @@ void lv_vg_lite_path_destroy(lv_vg_lite_path_t * path) LV_PROFILER_END; } -lv_vg_lite_path_t * lv_vg_lite_path_get(struct _lv_draw_vg_lite_unit_t * unit, vg_lite_format_t data_format) +lv_vg_lite_path_t * lv_vg_lite_path_get(struct lv_draw_vg_lite_unit_t * unit, vg_lite_format_t data_format) { LV_ASSERT_NULL(unit); LV_ASSERT_NULL(unit->global_path); @@ -121,7 +121,7 @@ lv_vg_lite_path_t * lv_vg_lite_path_get(struct _lv_draw_vg_lite_unit_t * unit, v return unit->global_path; } -void lv_vg_lite_path_drop(struct _lv_draw_vg_lite_unit_t * unit, lv_vg_lite_path_t * path) +void lv_vg_lite_path_drop(struct lv_draw_vg_lite_unit_t * unit, lv_vg_lite_path_t * path) { LV_ASSERT_NULL(unit); LV_ASSERT_NULL(path); diff --git a/src/draw/vg_lite/lv_vg_lite_path.h b/src/draw/vg_lite/lv_vg_lite_path.h index f8c224717..914e07c92 100644 --- a/src/draw/vg_lite/lv_vg_lite_path.h +++ b/src/draw/vg_lite/lv_vg_lite_path.h @@ -22,8 +22,8 @@ extern "C" { * DEFINES *********************/ -typedef struct _lv_vg_lite_path_t lv_vg_lite_path_t; -typedef struct _lv_draw_vg_lite_unit_t lv_draw_vg_lite_unit_t; +typedef struct lv_vg_lite_path_t lv_vg_lite_path_t; +typedef struct lv_draw_vg_lite_unit_t lv_draw_vg_lite_unit_t; typedef void (*lv_vg_lite_path_iter_cb_t)(void * user_data, uint8_t op_code, const float * data, uint32_t len); diff --git a/src/draw/vg_lite/lv_vg_lite_pending.c b/src/draw/vg_lite/lv_vg_lite_pending.c index 044417207..b8429f0f5 100644 --- a/src/draw/vg_lite/lv_vg_lite_pending.c +++ b/src/draw/vg_lite/lv_vg_lite_pending.c @@ -19,7 +19,7 @@ * TYPEDEFS **********************/ -struct _lv_vg_lite_pending_t { +struct lv_vg_lite_pending_t { lv_array_t objs; lv_vg_lite_pending_free_cb_t free_cb; void * user_data; diff --git a/src/draw/vg_lite/lv_vg_lite_pending.h b/src/draw/vg_lite/lv_vg_lite_pending.h index 8def9dcf5..bf439b74d 100644 --- a/src/draw/vg_lite/lv_vg_lite_pending.h +++ b/src/draw/vg_lite/lv_vg_lite_pending.h @@ -26,7 +26,7 @@ extern "C" { * TYPEDEFS **********************/ -typedef struct _lv_vg_lite_pending_t lv_vg_lite_pending_t; +typedef struct lv_vg_lite_pending_t lv_vg_lite_pending_t; typedef void (*lv_vg_lite_pending_free_cb_t)(void * obj, void * user_data); diff --git a/src/draw/vg_lite/lv_vg_lite_stroke.c b/src/draw/vg_lite/lv_vg_lite_stroke.c index f438d6c5f..1b8a20248 100644 --- a/src/draw/vg_lite/lv_vg_lite_stroke.c +++ b/src/draw/vg_lite/lv_vg_lite_stroke.c @@ -14,6 +14,7 @@ #include "lv_vg_lite_path.h" #include "lv_draw_vg_lite_type.h" #include "lv_vg_lite_math.h" +#include "../lv_draw_vector_private.h" /********************* * DEFINES @@ -55,7 +56,7 @@ static lv_cache_compare_res_t stroke_compare_cb(const stroke_item_t * lhs, const * GLOBAL FUNCTIONS **********************/ -void lv_vg_lite_stroke_init(struct _lv_draw_vg_lite_unit_t * unit, uint32_t cache_cnt) +void lv_vg_lite_stroke_init(struct lv_draw_vg_lite_unit_t * unit, uint32_t cache_cnt) { LV_ASSERT_NULL(unit); @@ -69,7 +70,7 @@ void lv_vg_lite_stroke_init(struct _lv_draw_vg_lite_unit_t * unit, uint32_t cach lv_cache_set_name(unit->stroke_cache, "VG_STROKE"); } -void lv_vg_lite_stroke_deinit(struct _lv_draw_vg_lite_unit_t * unit) +void lv_vg_lite_stroke_deinit(struct lv_draw_vg_lite_unit_t * unit) { LV_ASSERT_NULL(unit); LV_ASSERT_NULL(unit->stroke_cache); @@ -105,8 +106,8 @@ static vg_lite_join_style_t lv_stroke_join_to_vg(lv_vector_stroke_join_t join) } } -lv_cache_entry_t * lv_vg_lite_stroke_get(struct _lv_draw_vg_lite_unit_t * unit, - struct _lv_vg_lite_path_t * path, +lv_cache_entry_t * lv_vg_lite_stroke_get(struct lv_draw_vg_lite_unit_t * unit, + struct lv_vg_lite_path_t * path, const lv_vector_stroke_dsc_t * dsc) { LV_ASSERT_NULL(unit); @@ -146,7 +147,7 @@ lv_cache_entry_t * lv_vg_lite_stroke_get(struct _lv_draw_vg_lite_unit_t * unit, return cache_node_entry; } -struct _lv_vg_lite_path_t * lv_vg_lite_stroke_get_path(lv_cache_entry_t * cache_entry) +struct lv_vg_lite_path_t * lv_vg_lite_stroke_get_path(lv_cache_entry_t * cache_entry) { LV_ASSERT_NULL(cache_entry); @@ -155,7 +156,7 @@ struct _lv_vg_lite_path_t * lv_vg_lite_stroke_get_path(lv_cache_entry_t * cache_ return stroke_item->path; } -void lv_vg_lite_stroke_drop(struct _lv_draw_vg_lite_unit_t * unit, +void lv_vg_lite_stroke_drop(struct lv_draw_vg_lite_unit_t * unit, lv_cache_entry_t * cache_entry) { LV_ASSERT_NULL(unit); diff --git a/src/draw/vg_lite/lv_vg_lite_stroke.h b/src/draw/vg_lite/lv_vg_lite_stroke.h index 81c7e510d..4a0602d62 100644 --- a/src/draw/vg_lite/lv_vg_lite_stroke.h +++ b/src/draw/vg_lite/lv_vg_lite_stroke.h @@ -26,9 +26,9 @@ extern "C" { * TYPEDEFS **********************/ -struct _lv_vg_lite_path_t; +struct lv_vg_lite_path_t; -struct _lv_draw_vg_lite_unit_t; +struct lv_draw_vg_lite_unit_t; /********************** * GLOBAL PROTOTYPES @@ -38,13 +38,13 @@ struct _lv_draw_vg_lite_unit_t; * Initialize the stroke module * @param unit pointer to the unit */ -void lv_vg_lite_stroke_init(struct _lv_draw_vg_lite_unit_t * unit, uint32_t cache_cnt); +void lv_vg_lite_stroke_init(struct lv_draw_vg_lite_unit_t * unit, uint32_t cache_cnt); /** * Deinitialize the stroke module * @param unit pointer to the unit */ -void lv_vg_lite_stroke_deinit(struct _lv_draw_vg_lite_unit_t * unit); +void lv_vg_lite_stroke_deinit(struct lv_draw_vg_lite_unit_t * unit); /** * Get the stroke cache entry @@ -53,8 +53,8 @@ void lv_vg_lite_stroke_deinit(struct _lv_draw_vg_lite_unit_t * unit); * @param dsc pointer to the stroke descriptor * @return pointer to the stroke cache entry */ -lv_cache_entry_t * lv_vg_lite_stroke_get(struct _lv_draw_vg_lite_unit_t * unit, - struct _lv_vg_lite_path_t * path, +lv_cache_entry_t * lv_vg_lite_stroke_get(struct lv_draw_vg_lite_unit_t * unit, + struct lv_vg_lite_path_t * path, const lv_vector_stroke_dsc_t * dsc); /** @@ -62,14 +62,14 @@ lv_cache_entry_t * lv_vg_lite_stroke_get(struct _lv_draw_vg_lite_unit_t * unit, * @param cache_entry pointer to the stroke cache entry * @return pointer to the path */ -struct _lv_vg_lite_path_t * lv_vg_lite_stroke_get_path(lv_cache_entry_t * cache_entry); +struct lv_vg_lite_path_t * lv_vg_lite_stroke_get_path(lv_cache_entry_t * cache_entry); /** * Drop the stroke cache entry * @param unit pointer to the unit * @param stroke pointer to the stroke */ -void lv_vg_lite_stroke_drop(struct _lv_draw_vg_lite_unit_t * unit, lv_cache_entry_t * cache_entry); +void lv_vg_lite_stroke_drop(struct lv_draw_vg_lite_unit_t * unit, lv_cache_entry_t * cache_entry); /********************** * MACROS diff --git a/src/draw/vg_lite/lv_vg_lite_utils.c b/src/draw/vg_lite/lv_vg_lite_utils.c index 8c6d23a6c..e1e921d2a 100644 --- a/src/draw/vg_lite/lv_vg_lite_utils.c +++ b/src/draw/vg_lite/lv_vg_lite_utils.c @@ -7,6 +7,7 @@ * INCLUDES *********************/ +#include "../lv_image_decoder_private.h" #include "lv_vg_lite_utils.h" #if LV_USE_DRAW_VG_LITE @@ -757,13 +758,13 @@ bool lv_vg_lite_buffer_open_image(vg_lite_buffer_t * buffer, lv_image_decoder_ds return true; } -void lv_vg_lite_image_dsc_init(struct _lv_draw_vg_lite_unit_t * unit) +void lv_vg_lite_image_dsc_init(struct lv_draw_vg_lite_unit_t * unit) { unit->image_dsc_pending = lv_vg_lite_pending_create(sizeof(lv_image_decoder_dsc_t), 4); lv_vg_lite_pending_set_free_cb(unit->image_dsc_pending, image_dsc_free_cb, NULL); } -void lv_vg_lite_image_dsc_deinit(struct _lv_draw_vg_lite_unit_t * unit) +void lv_vg_lite_image_dsc_deinit(struct lv_draw_vg_lite_unit_t * unit) { lv_vg_lite_pending_destroy(unit->image_dsc_pending); unit->image_dsc_pending = NULL; @@ -1160,7 +1161,7 @@ void lv_vg_lite_disable_scissor(void) LV_VER_RES)); } -void lv_vg_lite_flush(struct _lv_draw_vg_lite_unit_t * u) +void lv_vg_lite_flush(struct lv_draw_vg_lite_unit_t * u) { LV_ASSERT_NULL(u); LV_PROFILER_BEGIN; @@ -1188,7 +1189,7 @@ void lv_vg_lite_flush(struct _lv_draw_vg_lite_unit_t * u) LV_PROFILER_END; } -void lv_vg_lite_finish(struct _lv_draw_vg_lite_unit_t * u) +void lv_vg_lite_finish(struct lv_draw_vg_lite_unit_t * u) { LV_ASSERT_NULL(u); LV_PROFILER_BEGIN; diff --git a/src/draw/vg_lite/lv_vg_lite_utils.h b/src/draw/vg_lite/lv_vg_lite_utils.h index d107840d7..62e65620d 100644 --- a/src/draw/vg_lite/lv_vg_lite_utils.h +++ b/src/draw/vg_lite/lv_vg_lite_utils.h @@ -71,7 +71,7 @@ extern "C" { * TYPEDEFS **********************/ -struct _lv_draw_vg_lite_unit_t; +struct lv_draw_vg_lite_unit_t; /********************** * GLOBAL PROTOTYPES @@ -133,9 +133,9 @@ void lv_vg_lite_image_dec_init(vg_lite_matrix_t * matrix, int32_t x, int32_t y, bool lv_vg_lite_buffer_open_image(vg_lite_buffer_t * buffer, lv_image_decoder_dsc_t * decoder_dsc, const void * src, bool no_cache); -void lv_vg_lite_image_dsc_init(struct _lv_draw_vg_lite_unit_t * unit); +void lv_vg_lite_image_dsc_init(struct lv_draw_vg_lite_unit_t * unit); -void lv_vg_lite_image_dsc_deinit(struct _lv_draw_vg_lite_unit_t * unit); +void lv_vg_lite_image_dsc_deinit(struct lv_draw_vg_lite_unit_t * unit); vg_lite_blend_t lv_vg_lite_blend_mode(lv_blend_mode_t blend_mode); @@ -175,9 +175,9 @@ void lv_vg_lite_set_scissor_area(const lv_area_t * area); void lv_vg_lite_disable_scissor(void); -void lv_vg_lite_flush(struct _lv_draw_vg_lite_unit_t * u); +void lv_vg_lite_flush(struct lv_draw_vg_lite_unit_t * u); -void lv_vg_lite_finish(struct _lv_draw_vg_lite_unit_t * u); +void lv_vg_lite_finish(struct lv_draw_vg_lite_unit_t * u); /********************** * MACROS diff --git a/src/drivers/libinput/lv_libinput.c b/src/drivers/libinput/lv_libinput.c index ff75a2a78..7410f40fd 100644 --- a/src/drivers/libinput/lv_libinput.c +++ b/src/drivers/libinput/lv_libinput.c @@ -7,7 +7,8 @@ * INCLUDES *********************/ -#include "lv_libinput.h" +#include "../../indev/lv_indev_private.h" +#include "lv_libinput_private.h" #if LV_USE_LIBINPUT @@ -603,7 +604,7 @@ static void _read_keypad(lv_libinput_t * dsc, struct libinput_event * event) /* Only record button state when actual output is produced to prevent widgets from refreshing */ evt->pressed = (key_state == LIBINPUT_KEY_STATE_RELEASED) ? LV_INDEV_STATE_RELEASED : LV_INDEV_STATE_PRESSED; - // just release the key immediatly after it got pressed. + // just release the key immediately after it got pressed. // but don't handle special keys where holding a key makes sense if(evt->key_val != LV_KEY_BACKSPACE && evt->key_val != LV_KEY_UP && diff --git a/src/drivers/libinput/lv_libinput.h b/src/drivers/libinput/lv_libinput.h index 0441c25a7..ce19a33b5 100644 --- a/src/drivers/libinput/lv_libinput.h +++ b/src/drivers/libinput/lv_libinput.h @@ -39,43 +39,10 @@ typedef enum { LV_LIBINPUT_CAPABILITY_TOUCH = 1U << 2 } lv_libinput_capability; -typedef struct { - lv_indev_state_t pressed; - int key_val; - lv_point_t point; -} lv_libinput_event_t; +struct libinput_device; #define LV_LIBINPUT_MAX_EVENTS 32 -typedef struct { - int fd; - struct pollfd fds[1]; - - /* The points array is implemented as a circular LIFO queue */ - lv_libinput_event_t points[LV_LIBINPUT_MAX_EVENTS]; /* Event buffer */ - lv_libinput_event_t slots[2]; /* Realtime state of up to 2 fingers to handle multitouch */ - - /* Pointer devices work a bit differently in libinput which requires us to store their last known state */ - lv_point_t pointer_position; - bool pointer_button_down; - - int start; /* Index of start of event queue */ - int end; /* Index of end of queue*/ - lv_libinput_event_t last_event; /* Report when no new events - * to keep indev state consistent - */ - bool deinit; /* Tell worker thread to quit */ - pthread_mutex_t event_lock; - pthread_t worker_thread; - - struct libinput * libinput_context; - struct libinput_device * libinput_device; - -#if LV_LIBINPUT_XKB - lv_xkb_t xkb; -#endif /* LV_LIBINPUT_XKB */ -} lv_libinput_t; - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/drivers/libinput/lv_libinput_private.h b/src/drivers/libinput/lv_libinput_private.h new file mode 100644 index 000000000..6d1844c6b --- /dev/null +++ b/src/drivers/libinput/lv_libinput_private.h @@ -0,0 +1,79 @@ +/** + * @file lv_libinput_private.h + * + */ + +#ifndef LV_LIBINPUT_PRIVATE_H +#define LV_LIBINPUT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_libinput.h" + +#if LV_USE_LIBINPUT + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_libinput_event_t { + lv_indev_state_t pressed; + int key_val; + lv_point_t point; +}; + +struct lv_libinput_t { + int fd; + struct pollfd fds[1]; + + /* The points array is implemented as a circular LIFO queue */ + lv_libinput_event_t points[LV_LIBINPUT_MAX_EVENTS]; /* Event buffer */ + lv_libinput_event_t slots[2]; /* Realtime state of up to 2 fingers to handle multitouch */ + + /* Pointer devices work a bit differently in libinput which requires us to store their last known state */ + lv_point_t pointer_position; + bool pointer_button_down; + + int start; /* Index of start of event queue */ + int end; /* Index of end of queue*/ + lv_libinput_event_t last_event; /* Report when no new events + * to keep indev state consistent + */ + bool deinit; /* Tell worker thread to quit */ + pthread_mutex_t event_lock; + pthread_t worker_thread; + + struct libinput * libinput_context; + struct libinput_device * libinput_device; + +#if LV_LIBINPUT_XKB + lv_xkb_t xkb; +#endif /* LV_LIBINPUT_XKB */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_LIBINPUT */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LIBINPUT_PRIVATE_H*/ diff --git a/src/drivers/libinput/lv_xkb.c b/src/drivers/libinput/lv_xkb.c index 96aeb4c0b..1e8ddb10c 100644 --- a/src/drivers/libinput/lv_xkb.c +++ b/src/drivers/libinput/lv_xkb.c @@ -7,7 +7,7 @@ * INCLUDES *********************/ -#include "lv_xkb.h" +#include "lv_xkb_private.h" #if defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB diff --git a/src/drivers/libinput/lv_xkb.h b/src/drivers/libinput/lv_xkb.h index d048f33cb..daaa4dc1d 100644 --- a/src/drivers/libinput/lv_xkb.h +++ b/src/drivers/libinput/lv_xkb.h @@ -25,15 +25,6 @@ extern "C" { * DEFINES *********************/ -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - struct xkb_keymap * keymap; - struct xkb_state * state; -} lv_xkb_t; - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/drivers/libinput/lv_xkb_private.h b/src/drivers/libinput/lv_xkb_private.h new file mode 100644 index 000000000..315762541 --- /dev/null +++ b/src/drivers/libinput/lv_xkb_private.h @@ -0,0 +1,53 @@ +/** + * @file lv_xkb_private.h + * + */ + +#ifndef LV_XKB_PRIVATE_H +#define LV_XKB_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_xkb.h" + +#if defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_xkb_t { + struct xkb_keymap * keymap; + struct xkb_state * state; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_XKB_PRIVATE_H*/ diff --git a/src/drivers/nuttx/lv_nuttx_cache.c b/src/drivers/nuttx/lv_nuttx_cache.c index 713e987f2..273f49ef8 100644 --- a/src/drivers/nuttx/lv_nuttx_cache.c +++ b/src/drivers/nuttx/lv_nuttx_cache.c @@ -12,6 +12,7 @@ #if LV_USE_NUTTX +#include "../../draw/lv_draw_buf_private.h" #include /********************* diff --git a/src/drivers/nuttx/lv_nuttx_entry.c b/src/drivers/nuttx/lv_nuttx_entry.c index 4a9166604..4166b20c3 100644 --- a/src/drivers/nuttx/lv_nuttx_entry.c +++ b/src/drivers/nuttx/lv_nuttx_entry.c @@ -258,7 +258,7 @@ static uint32_t millis(void) #if LV_USE_LOG static void syslog_print(lv_log_level_t level, const char * buf) { - static const int priority[_LV_LOG_LEVEL_NUM] = { + static const int priority[LV_LOG_LEVEL_NUM] = { LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERR, LOG_CRIT }; diff --git a/src/drivers/nuttx/lv_nuttx_entry.h b/src/drivers/nuttx/lv_nuttx_entry.h index 049e741e5..64ece994e 100644 --- a/src/drivers/nuttx/lv_nuttx_entry.h +++ b/src/drivers/nuttx/lv_nuttx_entry.h @@ -43,7 +43,7 @@ typedef struct { lv_indev_t * utouch_indev; } lv_nuttx_result_t; -typedef struct _lv_nuttx_ctx_t { +typedef struct lv_nuttx_ctx_t { void * image_cache; } lv_nuttx_ctx_t; diff --git a/src/drivers/nuttx/lv_nuttx_fbdev.c b/src/drivers/nuttx/lv_nuttx_fbdev.c index 65caea556..5ff500e28 100644 --- a/src/drivers/nuttx/lv_nuttx_fbdev.c +++ b/src/drivers/nuttx/lv_nuttx_fbdev.c @@ -204,9 +204,9 @@ static void fbdev_join_inv_areas(lv_display_t * disp, lv_area_t * final_inv_area area_joined = true; } else { - _lv_area_join(final_inv_area, - final_inv_area, - area_p); + lv_area_join(final_inv_area, + final_inv_area, + area_p); } } } @@ -230,7 +230,7 @@ static void display_refr_timer_cb(lv_timer_t * tmr) } if(pfds[0].revents & POLLOUT) { - _lv_display_refr_timer(tmr); + lv_display_refr_timer(tmr); } } diff --git a/src/drivers/nuttx/lv_nuttx_image_cache.c b/src/drivers/nuttx/lv_nuttx_image_cache.c index 886597fe4..3c0de01ce 100644 --- a/src/drivers/nuttx/lv_nuttx_image_cache.c +++ b/src/drivers/nuttx/lv_nuttx_image_cache.c @@ -12,6 +12,7 @@ #if LV_USE_NUTTX +#include "../../lv_draw_buf_private.h" #include /********************* diff --git a/src/drivers/nuttx/lv_nuttx_libuv.c b/src/drivers/nuttx/lv_nuttx_libuv.c index 0235e5ec0..12b8c439c 100644 --- a/src/drivers/nuttx/lv_nuttx_libuv.c +++ b/src/drivers/nuttx/lv_nuttx_libuv.c @@ -202,7 +202,7 @@ static void lv_nuttx_uv_disp_poll_cb(uv_poll_t * handle, int status, int events) LV_UNUSED(status); LV_UNUSED(events); uv_poll_stop(handle); - _lv_display_refr_timer(NULL); + lv_display_refr_timer(NULL); fb_ctx->polling = false; } diff --git a/src/drivers/sdl/lv_sdl_keyboard.c b/src/drivers/sdl/lv_sdl_keyboard.c index 188e5cacb..0bb94d6e3 100644 --- a/src/drivers/sdl/lv_sdl_keyboard.c +++ b/src/drivers/sdl/lv_sdl_keyboard.c @@ -9,7 +9,6 @@ #include "lv_sdl_keyboard.h" #if LV_USE_SDL -#include "../../indev/lv_indev.h" #include "../../core/lv_group.h" #include "../../stdlib/lv_string.h" #include "lv_sdl_private.h" diff --git a/src/drivers/sdl/lv_sdl_mousewheel.c b/src/drivers/sdl/lv_sdl_mousewheel.c index 080312668..b31a72309 100644 --- a/src/drivers/sdl/lv_sdl_mousewheel.c +++ b/src/drivers/sdl/lv_sdl_mousewheel.c @@ -10,7 +10,6 @@ #if LV_USE_SDL && LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_ENCODER #include "../../core/lv_group.h" -#include "../../indev/lv_indev_private.h" #include "../../stdlib/lv_string.h" #include "lv_sdl_private.h" diff --git a/src/drivers/windows/lv_windows_context.h b/src/drivers/windows/lv_windows_context.h index 4517d9b54..c4fc9417a 100644 --- a/src/drivers/windows/lv_windows_context.h +++ b/src/drivers/windows/lv_windows_context.h @@ -41,31 +41,31 @@ extern "C" { * TYPEDEFS **********************/ -typedef struct _lv_windows_pointer_context_t { +typedef struct lv_windows_pointer_context_t { lv_indev_state_t state; lv_point_t point; lv_indev_t * indev; } lv_windows_pointer_context_t; -typedef struct _lv_windows_keypad_queue_item_t { +typedef struct lv_windows_keypad_queue_item_t { uint32_t key; lv_indev_state_t state; } lv_windows_keypad_queue_item_t; -typedef struct _lv_windows_keypad_context_t { +typedef struct lv_windows_keypad_context_t { lv_ll_t queue; uint16_t utf16_high_surrogate; uint16_t utf16_low_surrogate; lv_indev_t * indev; } lv_windows_keypad_context_t; -typedef struct _lv_windows_encoder_context_t { +typedef struct lv_windows_encoder_context_t { lv_indev_state_t state; int16_t enc_diff; lv_indev_t * indev; } lv_windows_encoder_context_t; -typedef struct _lv_windows_window_context_t { +typedef struct lv_windows_window_context_t { lv_display_t * display_device_object; lv_timer_t * display_timer_object; @@ -86,7 +86,7 @@ typedef struct _lv_windows_window_context_t { } lv_windows_window_context_t; -typedef struct _lv_windows_create_display_data_t { +typedef struct lv_windows_create_display_data_t { const wchar_t * title; int32_t hor_res; int32_t ver_res; diff --git a/src/drivers/windows/lv_windows_input.c b/src/drivers/windows/lv_windows_input.c index 5611e3fb4..d3b781646 100644 --- a/src/drivers/windows/lv_windows_input.c +++ b/src/drivers/windows/lv_windows_input.c @@ -18,10 +18,11 @@ #include "lv_windows_display.h" #include "lv_windows_input_private.h" #include "../../misc/lv_text_private.h" +#include "../../core/lv_obj_private.h" #include -#include "../../widgets/textarea/lv_textarea.h" +#include "../../widgets/textarea/lv_textarea_private.h" #include "../../widgets/keyboard/lv_keyboard.h" /********************* @@ -128,7 +129,7 @@ lv_indev_t * lv_windows_acquire_keypad_indev(lv_display_t * display) } if(!context->keypad.indev) { - _lv_ll_init( + lv_ll_init( &context->keypad.queue, sizeof(lv_windows_keypad_queue_item_t)); context->keypad.utf16_high_surrogate = 0; @@ -421,12 +422,12 @@ static void lv_windows_keypad_driver_read_callback( } lv_windows_keypad_queue_item_t * current = (lv_windows_keypad_queue_item_t *)( - _lv_ll_get_head(&context->keypad.queue)); + lv_ll_get_head(&context->keypad.queue)); if(current) { data->key = current->key; data->state = current->state; - _lv_ll_remove(&context->keypad.queue, current); + lv_ll_remove(&context->keypad.queue, current); lv_free(current); data->continue_reading = true; @@ -451,7 +452,7 @@ static void lv_windows_release_keypad_device_event_callback(lv_event_t * e) return; } - _lv_ll_clear(&context->keypad.queue); + lv_ll_clear(&context->keypad.queue); context->keypad.utf16_high_surrogate = 0; context->keypad.utf16_low_surrogate = 0; @@ -464,7 +465,7 @@ static void lv_windows_push_key_to_keyboard_queue( lv_indev_state_t state) { lv_windows_keypad_queue_item_t * current = (lv_windows_keypad_queue_item_t *)( - _lv_ll_ins_tail(&context->keypad.queue)); + lv_ll_ins_tail(&context->keypad.queue)); if(current) { current->key = key; current->state = state; diff --git a/src/font/lv_binfont_loader.c b/src/font/lv_binfont_loader.c index 4b06e6ccf..4746026f5 100644 --- a/src/font/lv_binfont_loader.c +++ b/src/font/lv_binfont_loader.c @@ -6,8 +6,9 @@ /********************* * INCLUDES *********************/ +#include "lv_font_fmt_txt_private.h" #include "../lvgl.h" -#include "../misc/lv_fs.h" +#include "../misc/lv_fs_private.h" #include "../misc/lv_types.h" #include "../stdlib/lv_string.h" #include "lv_binfont_loader.h" diff --git a/src/font/lv_font.c b/src/font/lv_font.c index 51d9a2de1..35ae352e3 100644 --- a/src/font/lv_font.c +++ b/src/font/lv_font.c @@ -134,6 +134,16 @@ void lv_font_set_kerning(lv_font_t * font, lv_font_kerning_t kerning) font->kerning = kerning; } +int32_t lv_font_get_line_height(const lv_font_t * font) +{ + return font->line_height; +} + +const lv_font_t * lv_font_default(void) +{ + return LV_FONT_DEFAULT; +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/font/lv_font.h b/src/font/lv_font.h index 2d142456e..c38d6d5cb 100644 --- a/src/font/lv_font.h +++ b/src/font/lv_font.h @@ -34,7 +34,7 @@ extern "C" { *-----------------*/ /** The font format.*/ -enum _lv_font_glyph_format_t { +typedef enum { LV_FONT_GLYPH_FORMAT_NONE = 0, /**< Maybe not visible*/ /**< Legacy simple formats*/ @@ -49,13 +49,7 @@ enum _lv_font_glyph_format_t { LV_FONT_GLYPH_FORMAT_VECTOR = 0x0A, /**< Vectorial format*/ LV_FONT_GLYPH_FORMAT_SVG = 0x0B, /**< SVG format*/ LV_FONT_GLYPH_FORMAT_CUSTOM = 0xFF, /**< Custom format*/ -}; - -#ifdef DOXYGEN -typedef _lv_font_glyph_format_t lv_font_glyph_format_t; -#else -typedef uint8_t lv_font_glyph_format_t; -#endif /*DOXYGEN*/ +} lv_font_glyph_format_t; /** Describes the properties of a glyph.*/ typedef struct { @@ -77,33 +71,21 @@ typedef struct { } lv_font_glyph_dsc_t; /** The bitmaps might be upscaled by 3 to achieve subpixel rendering.*/ -enum _lv_font_subpx_t { +typedef enum { LV_FONT_SUBPX_NONE, LV_FONT_SUBPX_HOR, LV_FONT_SUBPX_VER, LV_FONT_SUBPX_BOTH, -}; - -#ifdef DOXYGEN -typedef _lv_font_subpx_t lv_font_subpx_t; -#else -typedef uint8_t lv_font_subpx_t; -#endif /*DOXYGEN*/ +} lv_font_subpx_t; /** Adjust letter spacing for specific character pairs.*/ -enum _lv_font_kerning_t { +typedef enum { LV_FONT_KERNING_NORMAL, LV_FONT_KERNING_NONE, -}; - -#ifdef DOXYGEN -typedef _lv_font_kerning_t lv_font_kerning_t; -#else -typedef uint8_t lv_font_kerning_t; -#endif /*DOXYGEN*/ +} lv_font_kerning_t; /** Describe the properties of a font*/ -struct _lv_font_t { +struct lv_font_t { /** Get a glyph's descriptor from a font*/ bool (*get_glyph_dsc)(const lv_font_t *, lv_font_glyph_dsc_t *, uint32_t letter, uint32_t letter_next); @@ -173,10 +155,7 @@ uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32 * @param font pointer to a font * @return the height of a font */ -static inline int32_t lv_font_get_line_height(const lv_font_t * font) -{ - return font->line_height; -} +int32_t lv_font_get_line_height(const lv_font_t * font); /** * Configure the use of kerning information stored in a font @@ -308,10 +287,7 @@ LV_FONT_CUSTOM_DECLARE * Just a wrapper around LV_FONT_DEFAULT because it might be more convenient to use a function in some cases * @return pointer to LV_FONT_DEFAULT */ -static inline const lv_font_t * lv_font_default(void) -{ - return LV_FONT_DEFAULT; -} +const lv_font_t * lv_font_default(void); #ifdef __cplusplus } /*extern "C"*/ diff --git a/src/font/lv_font_fmt_txt.c b/src/font/lv_font_fmt_txt.c index 4aa3d2dee..5d0130454 100644 --- a/src/font/lv_font_fmt_txt.c +++ b/src/font/lv_font_fmt_txt.c @@ -7,7 +7,7 @@ * INCLUDES *********************/ #include "lv_font.h" -#include "lv_font_fmt_txt.h" +#include "lv_font_fmt_txt_private.h" #include "../core/lv_global.h" #include "../misc/lv_assert.h" #include "../misc/lv_types.h" diff --git a/src/font/lv_font_fmt_txt.h b/src/font/lv_font_fmt_txt.h index 4240c95b0..057a05a0e 100644 --- a/src/font/lv_font_fmt_txt.h +++ b/src/font/lv_font_fmt_txt.h @@ -44,18 +44,12 @@ typedef struct { } lv_font_fmt_txt_glyph_dsc_t; /** Format of font character map.*/ -enum _lv_font_fmt_txt_cmap_type_t { +typedef enum { LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL, LV_FONT_FMT_TXT_CMAP_SPARSE_FULL, LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY, LV_FONT_FMT_TXT_CMAP_SPARSE_TINY, -}; - -#ifdef DOXYGEN -typedef _lv_font_fmt_txt_cmap_type_t lv_font_fmt_txt_cmap_type_t; -#else -typedef uint8_t lv_font_fmt_txt_cmap_type_t; -#endif /*DOXYGEN*/ +} lv_font_fmt_txt_cmap_type_t; /** * Map codepoints to a `glyph_dsc`s @@ -114,21 +108,6 @@ typedef struct { lv_font_fmt_txt_cmap_type_t type; } lv_font_fmt_txt_cmap_t; -/** A simple mapping of kern values from pairs*/ -typedef struct { - /*To get a kern value of two code points: - 1. Get the `glyph_id_left` and `glyph_id_right` from `lv_font_fmt_txt_cmap_t - 2. for(i = 0; i < pair_cnt * 2; i += 2) - if(glyph_ids[i] == glyph_id_left && - glyph_ids[i+1] == glyph_id_right) - return values[i / 2]; - */ - const void * glyph_ids; - const int8_t * values; - uint32_t pair_cnt : 30; - uint32_t glyph_ids_size : 2; /*0: `glyph_ids` is stored as `uint8_t`; 1: as `uint16_t`*/ -} lv_font_fmt_txt_kern_pair_t; - /** More complex but more optimal class based kern value storage*/ typedef struct { /*To get a kern value of two code points: @@ -191,23 +170,6 @@ typedef struct { uint16_t bitmap_format : 2; } lv_font_fmt_txt_dsc_t; -#if LV_USE_FONT_COMPRESSED -typedef enum { - RLE_STATE_SINGLE = 0, - RLE_STATE_REPEATED, - RLE_STATE_COUNTER, -} lv_font_fmt_rle_state_t; - -typedef struct { - uint32_t rdp; - const uint8_t * in; - uint8_t bpp; - uint8_t prev_v; - uint8_t count; - lv_font_fmt_rle_state_t state; -} lv_font_fmt_rle_t; -#endif - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/font/lv_font_fmt_txt_private.h b/src/font/lv_font_fmt_txt_private.h new file mode 100644 index 000000000..21d4d94aa --- /dev/null +++ b/src/font/lv_font_fmt_txt_private.h @@ -0,0 +1,71 @@ +/** + * @file lv_font_fmt_txt_private.h + * + */ + +#ifndef LV_FONT_FMT_TXT_PRIVATE_H +#define LV_FONT_FMT_TXT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_font_fmt_txt.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** A simple mapping of kern values from pairs*/ +struct lv_font_fmt_txt_kern_pair_t { + /*To get a kern value of two code points: + 1. Get the `glyph_id_left` and `glyph_id_right` from `lv_font_fmt_txt_cmap_t + 2. for(i = 0; i < pair_cnt * 2; i += 2) + if(glyph_ids[i] == glyph_id_left && + glyph_ids[i+1] == glyph_id_right) + return values[i / 2]; + */ + const void * glyph_ids; + const int8_t * values; + uint32_t pair_cnt : 30; + uint32_t glyph_ids_size : 2; /*0: `glyph_ids` is stored as `uint8_t`; 1: as `uint16_t`*/ +}; + +#if LV_USE_FONT_COMPRESSED +typedef enum { + RLE_STATE_SINGLE = 0, + RLE_STATE_REPEATED, + RLE_STATE_COUNTER, +} lv_font_fmt_rle_state_t; + +typedef struct { + uint32_t rdp; + const uint8_t * in; + uint8_t bpp; + uint8_t prev_v; + uint8_t count; + lv_font_fmt_rle_state_t state; +} lv_font_fmt_rle_t; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FONT_FMT_TXT_PRIVATE_H*/ diff --git a/src/font/lv_symbol_def.h b/src/font/lv_symbol_def.h index 3fc2a6d71..d858bea75 100644 --- a/src/font/lv_symbol_def.h +++ b/src/font/lv_symbol_def.h @@ -278,71 +278,71 @@ extern "C" { /* * The following list is generated using - * cat src/font/lv_symbol_def.h | sed -E -n 's/^#define\s+LV_(SYMBOL_\w+).*".*$/ _LV_STR_\1,/p' + * cat src/font/lv_symbol_def.h | sed -E -n 's/^#define\s+LV_(SYMBOL_\w+).*".*$/ LV_STR_\1,/p' */ enum { - _LV_STR_SYMBOL_BULLET, - _LV_STR_SYMBOL_AUDIO, - _LV_STR_SYMBOL_VIDEO, - _LV_STR_SYMBOL_LIST, - _LV_STR_SYMBOL_OK, - _LV_STR_SYMBOL_CLOSE, - _LV_STR_SYMBOL_POWER, - _LV_STR_SYMBOL_SETTINGS, - _LV_STR_SYMBOL_HOME, - _LV_STR_SYMBOL_DOWNLOAD, - _LV_STR_SYMBOL_DRIVE, - _LV_STR_SYMBOL_REFRESH, - _LV_STR_SYMBOL_MUTE, - _LV_STR_SYMBOL_VOLUME_MID, - _LV_STR_SYMBOL_VOLUME_MAX, - _LV_STR_SYMBOL_IMAGE, - _LV_STR_SYMBOL_TINT, - _LV_STR_SYMBOL_PREV, - _LV_STR_SYMBOL_PLAY, - _LV_STR_SYMBOL_PAUSE, - _LV_STR_SYMBOL_STOP, - _LV_STR_SYMBOL_NEXT, - _LV_STR_SYMBOL_EJECT, - _LV_STR_SYMBOL_LEFT, - _LV_STR_SYMBOL_RIGHT, - _LV_STR_SYMBOL_PLUS, - _LV_STR_SYMBOL_MINUS, - _LV_STR_SYMBOL_EYE_OPEN, - _LV_STR_SYMBOL_EYE_CLOSE, - _LV_STR_SYMBOL_WARNING, - _LV_STR_SYMBOL_SHUFFLE, - _LV_STR_SYMBOL_UP, - _LV_STR_SYMBOL_DOWN, - _LV_STR_SYMBOL_LOOP, - _LV_STR_SYMBOL_DIRECTORY, - _LV_STR_SYMBOL_UPLOAD, - _LV_STR_SYMBOL_CALL, - _LV_STR_SYMBOL_CUT, - _LV_STR_SYMBOL_COPY, - _LV_STR_SYMBOL_SAVE, - _LV_STR_SYMBOL_BARS, - _LV_STR_SYMBOL_ENVELOPE, - _LV_STR_SYMBOL_CHARGE, - _LV_STR_SYMBOL_PASTE, - _LV_STR_SYMBOL_BELL, - _LV_STR_SYMBOL_KEYBOARD, - _LV_STR_SYMBOL_GPS, - _LV_STR_SYMBOL_FILE, - _LV_STR_SYMBOL_WIFI, - _LV_STR_SYMBOL_BATTERY_FULL, - _LV_STR_SYMBOL_BATTERY_3, - _LV_STR_SYMBOL_BATTERY_2, - _LV_STR_SYMBOL_BATTERY_1, - _LV_STR_SYMBOL_BATTERY_EMPTY, - _LV_STR_SYMBOL_USB, - _LV_STR_SYMBOL_BLUETOOTH, - _LV_STR_SYMBOL_TRASH, - _LV_STR_SYMBOL_EDIT, - _LV_STR_SYMBOL_BACKSPACE, - _LV_STR_SYMBOL_SD_CARD, - _LV_STR_SYMBOL_NEW_LINE, - _LV_STR_SYMBOL_DUMMY, + LV_STR_SYMBOL_BULLET, + LV_STR_SYMBOL_AUDIO, + LV_STR_SYMBOL_VIDEO, + LV_STR_SYMBOL_LIST, + LV_STR_SYMBOL_OK, + LV_STR_SYMBOL_CLOSE, + LV_STR_SYMBOL_POWER, + LV_STR_SYMBOL_SETTINGS, + LV_STR_SYMBOL_HOME, + LV_STR_SYMBOL_DOWNLOAD, + LV_STR_SYMBOL_DRIVE, + LV_STR_SYMBOL_REFRESH, + LV_STR_SYMBOL_MUTE, + LV_STR_SYMBOL_VOLUME_MID, + LV_STR_SYMBOL_VOLUME_MAX, + LV_STR_SYMBOL_IMAGE, + LV_STR_SYMBOL_TINT, + LV_STR_SYMBOL_PREV, + LV_STR_SYMBOL_PLAY, + LV_STR_SYMBOL_PAUSE, + LV_STR_SYMBOL_STOP, + LV_STR_SYMBOL_NEXT, + LV_STR_SYMBOL_EJECT, + LV_STR_SYMBOL_LEFT, + LV_STR_SYMBOL_RIGHT, + LV_STR_SYMBOL_PLUS, + LV_STR_SYMBOL_MINUS, + LV_STR_SYMBOL_EYE_OPEN, + LV_STR_SYMBOL_EYE_CLOSE, + LV_STR_SYMBOL_WARNING, + LV_STR_SYMBOL_SHUFFLE, + LV_STR_SYMBOL_UP, + LV_STR_SYMBOL_DOWN, + LV_STR_SYMBOL_LOOP, + LV_STR_SYMBOL_DIRECTORY, + LV_STR_SYMBOL_UPLOAD, + LV_STR_SYMBOL_CALL, + LV_STR_SYMBOL_CUT, + LV_STR_SYMBOL_COPY, + LV_STR_SYMBOL_SAVE, + LV_STR_SYMBOL_BARS, + LV_STR_SYMBOL_ENVELOPE, + LV_STR_SYMBOL_CHARGE, + LV_STR_SYMBOL_PASTE, + LV_STR_SYMBOL_BELL, + LV_STR_SYMBOL_KEYBOARD, + LV_STR_SYMBOL_GPS, + LV_STR_SYMBOL_FILE, + LV_STR_SYMBOL_WIFI, + LV_STR_SYMBOL_BATTERY_FULL, + LV_STR_SYMBOL_BATTERY_3, + LV_STR_SYMBOL_BATTERY_2, + LV_STR_SYMBOL_BATTERY_1, + LV_STR_SYMBOL_BATTERY_EMPTY, + LV_STR_SYMBOL_USB, + LV_STR_SYMBOL_BLUETOOTH, + LV_STR_SYMBOL_TRASH, + LV_STR_SYMBOL_EDIT, + LV_STR_SYMBOL_BACKSPACE, + LV_STR_SYMBOL_SD_CARD, + LV_STR_SYMBOL_NEW_LINE, + LV_STR_SYMBOL_DUMMY, }; #ifdef __cplusplus diff --git a/src/indev/lv_indev.c b/src/indev/lv_indev.c index 52c904e48..e2bbe40dd 100644 --- a/src/indev/lv_indev.c +++ b/src/indev/lv_indev.c @@ -1,3 +1,7 @@ +#include "../misc/lv_event_private.h" +#include "../misc/lv_area_private.h" +#include "../misc/lv_anim_private.h" +#include "../core/lv_obj_draw_private.h" /** * @file lv_indev.c * @@ -10,12 +14,12 @@ #include "lv_indev_scroll.h" #include "../display/lv_display_private.h" #include "../core/lv_global.h" -#include "../core/lv_obj.h" +#include "../core/lv_obj_private.h" #include "../core/lv_group.h" #include "../core/lv_refr.h" #include "../tick/lv_tick.h" -#include "../misc/lv_timer.h" +#include "../misc/lv_timer_private.h" #include "../misc/lv_math.h" #include "../misc/lv_profiler.h" #include "../stdlib/lv_string.h" @@ -113,7 +117,7 @@ lv_indev_t * lv_indev_create(void) LV_LOG_WARN("no display was created so far"); } - lv_indev_t * indev = _lv_ll_ins_head(indev_ll_head); + lv_indev_t * indev = lv_ll_ins_head(indev_ll_head); LV_ASSERT_MALLOC(indev); if(indev == NULL) { return NULL; @@ -149,7 +153,7 @@ void lv_indev_delete(lv_indev_t * indev) if(indev->read_timer) lv_timer_delete(indev->read_timer); /*Remove the input device from the list*/ - _lv_ll_remove(indev_ll_head, indev); + lv_ll_remove(indev_ll_head, indev); /*Free the memory of the input device*/ lv_free(indev); } @@ -157,9 +161,9 @@ void lv_indev_delete(lv_indev_t * indev) lv_indev_t * lv_indev_get_next(lv_indev_t * indev) { if(indev == NULL) - return _lv_ll_get_head(indev_ll_head); + return lv_ll_get_head(indev_ll_head); else - return _lv_ll_get_next(indev_ll_head, indev); + return lv_ll_get_next(indev_ll_head, indev); } void indev_read_core(lv_indev_t * indev, lv_indev_data_t * data) @@ -534,10 +538,10 @@ lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point) /*If the point is on this object check its children too*/ lv_area_t obj_coords = obj->coords; if(lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) { - int32_t ext_draw_size = _lv_obj_get_ext_draw_size(obj); + int32_t ext_draw_size = lv_obj_get_ext_draw_size(obj); lv_area_increase(&obj_coords, ext_draw_size, ext_draw_size); } - if(_lv_area_is_point_on(&obj_coords, &p_trans, 0)) { + if(lv_area_is_point_on(&obj_coords, &p_trans, 0)) { int32_t i; uint32_t child_cnt = lv_obj_get_child_count(obj); @@ -1138,7 +1142,7 @@ static void indev_proc_press(lv_indev_t * indev) indev->scroll_throw_anim = NULL; } - _lv_indev_scroll_throw_handler(indev); + lv_indev_scroll_throw_handler(indev); if(indev_reset_check(indev)) return; } @@ -1226,7 +1230,7 @@ static void indev_proc_press(lv_indev_t * indev) if(indev_act->wait_until_release) return; - _lv_indev_scroll_handler(indev); + lv_indev_scroll_handler(indev); if(indev_reset_check(indev)) return; indev_gesture(indev); if(indev_reset_check(indev)) return; @@ -1391,7 +1395,7 @@ static void indev_proc_pointer_diff(lv_indev_t * indev) indev->pointer.scroll_throw_vect.y = diff; indev->pointer.scroll_throw_vect_ori.y = diff; - _lv_indev_scroll_handler(indev); + lv_indev_scroll_handler(indev); } } @@ -1647,7 +1651,7 @@ static void indev_scroll_throw_anim_cb(void * var, int32_t v) LV_UNUSED(v); lv_indev_t * indev = (lv_indev_t *)var; - _lv_indev_scroll_throw_handler(indev); + lv_indev_scroll_throw_handler(indev); if(indev->pointer.scroll_dir == LV_DIR_NONE || indev->pointer.scroll_obj == NULL) { if(indev->scroll_throw_anim) { diff --git a/src/indev/lv_indev.h b/src/indev/lv_indev.h index 6a9d83cc2..c7206edb6 100644 --- a/src/indev/lv_indev.h +++ b/src/indev/lv_indev.h @@ -143,7 +143,7 @@ void lv_indev_set_driver_data(lv_indev_t * indev, void * driver_data); * @param indev pointer to an input device * @param disp pointer to an display */ -void lv_indev_set_display(lv_indev_t * indev, struct _lv_display_t * disp); +void lv_indev_set_display(lv_indev_t * indev, struct lv_display_t * disp); /** * Get the type of an input device diff --git a/src/indev/lv_indev_private.h b/src/indev/lv_indev_private.h index 04a37e801..d4aa27c97 100644 --- a/src/indev/lv_indev_private.h +++ b/src/indev/lv_indev_private.h @@ -23,7 +23,7 @@ extern "C" { * TYPEDEFS **********************/ -struct _lv_indev_t { +struct lv_indev_t { /**< Input device type*/ lv_indev_type_t type; @@ -91,8 +91,8 @@ struct _lv_indev_t { int32_t diff; /*Flags*/ - lv_dir_t scroll_dir : 4; - lv_dir_t gesture_dir : 4; + uint8_t scroll_dir : 4; + uint8_t gesture_dir : 4; uint8_t gesture_sent : 1; } pointer; struct { diff --git a/src/indev/lv_indev_scroll.c b/src/indev/lv_indev_scroll.c index 93cf9f153..f32786577 100644 --- a/src/indev/lv_indev_scroll.c +++ b/src/indev/lv_indev_scroll.c @@ -6,6 +6,8 @@ /********************* * INCLUDES *********************/ +#include "../core/lv_obj_scroll_private.h" +#include "../core/lv_obj_private.h" #include "lv_indev.h" #include "lv_indev_private.h" #include "lv_indev_scroll.h" @@ -41,7 +43,7 @@ static int32_t elastic_diff(lv_obj_t * scroll_obj, int32_t diff, int32_t scroll_ * GLOBAL FUNCTIONS **********************/ -void _lv_indev_scroll_handler(lv_indev_t * indev) +void lv_indev_scroll_handler(lv_indev_t * indev) { if(indev->pointer.vect.x == 0 && indev->pointer.vect.y == 0) { return; @@ -104,13 +106,13 @@ void _lv_indev_scroll_handler(lv_indev_t * indev) /*Respect the scroll limit area*/ scroll_limit_diff(indev, &diff_x, &diff_y); - _lv_obj_scroll_by_raw(scroll_obj, diff_x, diff_y); + lv_obj_scroll_by_raw(scroll_obj, diff_x, diff_y); if(indev->reset_query) return; indev->pointer.scroll_sum.x += diff_x; indev->pointer.scroll_sum.y += diff_y; } -void _lv_indev_scroll_throw_handler(lv_indev_t * indev) +void lv_indev_scroll_throw_handler(lv_indev_t * indev) { lv_obj_t * scroll_obj = indev->pointer.scroll_obj; if(scroll_obj == NULL) return; @@ -139,7 +141,7 @@ void _lv_indev_scroll_throw_handler(lv_indev_t * indev) indev->pointer.scroll_throw_vect.y = elastic_diff(scroll_obj, indev->pointer.scroll_throw_vect.y, st, sb, LV_DIR_VER); - _lv_obj_scroll_by_raw(scroll_obj, 0, indev->pointer.scroll_throw_vect.y); + lv_obj_scroll_by_raw(scroll_obj, 0, indev->pointer.scroll_throw_vect.y); if(indev->reset_query) return; } /*With snapping find the nearest snap point and scroll there*/ @@ -165,7 +167,7 @@ void _lv_indev_scroll_throw_handler(lv_indev_t * indev) indev->pointer.scroll_throw_vect.x = elastic_diff(scroll_obj, indev->pointer.scroll_throw_vect.x, sl, sr, LV_DIR_HOR); - _lv_obj_scroll_by_raw(scroll_obj, indev->pointer.scroll_throw_vect.x, 0); + lv_obj_scroll_by_raw(scroll_obj, indev->pointer.scroll_throw_vect.x, 0); if(indev->reset_query) return; } /*With snapping find the nearest snap point and scroll there*/ diff --git a/src/indev/lv_indev_scroll.h b/src/indev/lv_indev_scroll.h index 64d1d018b..413376f16 100644 --- a/src/indev/lv_indev_scroll.h +++ b/src/indev/lv_indev_scroll.h @@ -31,13 +31,13 @@ extern "C" { * Handle scrolling. Called by LVGL during input device processing * @param indev pointer to an input device */ -void _lv_indev_scroll_handler(lv_indev_t * indev); +void lv_indev_scroll_handler(lv_indev_t * indev); /** * Handle throwing after scrolling. Called by LVGL during input device processing * @param indev pointer to an input device */ -void _lv_indev_scroll_throw_handler(lv_indev_t * indev); +void lv_indev_scroll_throw_handler(lv_indev_t * indev); /** * Predict where would a scroll throw end diff --git a/src/layouts/flex/lv_flex.c b/src/layouts/flex/lv_flex.c index 03993b549..2af3bf35a 100644 --- a/src/layouts/flex/lv_flex.c +++ b/src/layouts/flex/lv_flex.c @@ -8,7 +8,7 @@ *********************/ #include "lv_flex.h" #include "../lv_layout.h" -#include "../../core/lv_obj.h" +#include "../../core/lv_obj_private.h" #if LV_USE_FLEX @@ -130,9 +130,9 @@ static void flex_update(lv_obj_t * cont, void * user_data) flex_t f; lv_flex_flow_t flow = lv_obj_get_style_flex_flow(cont, LV_PART_MAIN); - f.row = flow & _LV_FLEX_COLUMN ? 0 : 1; - f.wrap = flow & _LV_FLEX_WRAP ? 1 : 0; - f.rev = flow & _LV_FLEX_REVERSE ? 1 : 0; + f.row = flow & LV_FLEX_COLUMN ? 0 : 1; + f.wrap = flow & LV_FLEX_WRAP ? 1 : 0; + f.rev = flow & LV_FLEX_REVERSE ? 1 : 0; f.main_place = lv_obj_get_style_flex_main_place(cont, LV_PART_MAIN); f.cross_place = lv_obj_get_style_flex_cross_place(cont, LV_PART_MAIN); f.track_place = lv_obj_get_style_flex_track_place(cont, LV_PART_MAIN); diff --git a/src/layouts/flex/lv_flex.h b/src/layouts/flex/lv_flex.h index 17e62790e..840597d81 100644 --- a/src/layouts/flex/lv_flex.h +++ b/src/layouts/flex/lv_flex.h @@ -22,9 +22,9 @@ extern "C" { * DEFINES *********************/ -#define _LV_FLEX_COLUMN (1 << 0) -#define _LV_FLEX_WRAP (1 << 2) -#define _LV_FLEX_REVERSE (1 << 3) +#define LV_FLEX_COLUMN (1 << 0) +#define LV_FLEX_WRAP (1 << 2) +#define LV_FLEX_REVERSE (1 << 3) /********************** * TYPEDEFS @@ -43,13 +43,13 @@ typedef enum { typedef enum { LV_FLEX_FLOW_ROW = 0x00, - LV_FLEX_FLOW_COLUMN = _LV_FLEX_COLUMN, - LV_FLEX_FLOW_ROW_WRAP = LV_FLEX_FLOW_ROW | _LV_FLEX_WRAP, - LV_FLEX_FLOW_ROW_REVERSE = LV_FLEX_FLOW_ROW | _LV_FLEX_REVERSE, - LV_FLEX_FLOW_ROW_WRAP_REVERSE = LV_FLEX_FLOW_ROW | _LV_FLEX_WRAP | _LV_FLEX_REVERSE, - LV_FLEX_FLOW_COLUMN_WRAP = LV_FLEX_FLOW_COLUMN | _LV_FLEX_WRAP, - LV_FLEX_FLOW_COLUMN_REVERSE = LV_FLEX_FLOW_COLUMN | _LV_FLEX_REVERSE, - LV_FLEX_FLOW_COLUMN_WRAP_REVERSE = LV_FLEX_FLOW_COLUMN | _LV_FLEX_WRAP | _LV_FLEX_REVERSE, + LV_FLEX_FLOW_COLUMN = LV_FLEX_COLUMN, + LV_FLEX_FLOW_ROW_WRAP = LV_FLEX_FLOW_ROW | LV_FLEX_WRAP, + LV_FLEX_FLOW_ROW_REVERSE = LV_FLEX_FLOW_ROW | LV_FLEX_REVERSE, + LV_FLEX_FLOW_ROW_WRAP_REVERSE = LV_FLEX_FLOW_ROW | LV_FLEX_WRAP | LV_FLEX_REVERSE, + LV_FLEX_FLOW_COLUMN_WRAP = LV_FLEX_FLOW_COLUMN | LV_FLEX_WRAP, + LV_FLEX_FLOW_COLUMN_REVERSE = LV_FLEX_FLOW_COLUMN | LV_FLEX_REVERSE, + LV_FLEX_FLOW_COLUMN_WRAP_REVERSE = LV_FLEX_FLOW_COLUMN | LV_FLEX_WRAP | LV_FLEX_REVERSE, } lv_flex_flow_t; /********************** diff --git a/src/layouts/grid/lv_grid.c b/src/layouts/grid/lv_grid.c index 59d66c78d..70d3f7936 100644 --- a/src/layouts/grid/lv_grid.c +++ b/src/layouts/grid/lv_grid.c @@ -12,7 +12,7 @@ #include "../../stdlib/lv_string.h" #include "../lv_layout.h" -#include "../../core/lv_obj.h" +#include "../../core/lv_obj_private.h" #include "../../core/lv_global.h" /********************* * DEFINES @@ -44,7 +44,7 @@ typedef struct { uint32_t row_num; int32_t grid_w; int32_t grid_h; -} _lv_grid_calc_t; +} lv_grid_calc_t; /********************** * GLOBAL PROTOTYPES @@ -54,11 +54,11 @@ typedef struct { * STATIC PROTOTYPES **********************/ static void grid_update(lv_obj_t * cont, void * user_data); -static void calc(lv_obj_t * obj, _lv_grid_calc_t * calc); -static void calc_free(_lv_grid_calc_t * calc); -static void calc_cols(lv_obj_t * cont, _lv_grid_calc_t * c); -static void calc_rows(lv_obj_t * cont, _lv_grid_calc_t * c); -static void item_repos(lv_obj_t * item, _lv_grid_calc_t * c, item_repos_hint_t * hint); +static void calc(lv_obj_t * obj, lv_grid_calc_t * calc); +static void calc_free(lv_grid_calc_t * calc); +static void calc_cols(lv_obj_t * cont, lv_grid_calc_t * c); +static void calc_rows(lv_obj_t * cont, lv_grid_calc_t * c); +static void item_repos(lv_obj_t * item, lv_grid_calc_t * c, item_repos_hint_t * hint); static int32_t grid_align(int32_t cont_size, bool auto_size, lv_grid_align_t align, int32_t gap, uint32_t track_num, int32_t * size_array, int32_t * pos_array, bool reverse); @@ -175,6 +175,11 @@ void lv_obj_set_grid_cell(lv_obj_t * obj, lv_grid_align_t x_align, int32_t col_p lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); } +int32_t lv_grid_fr(uint8_t x) +{ + return LV_GRID_FR(x); +} + /********************** * STATIC FUNCTIONS **********************/ @@ -188,7 +193,7 @@ static void grid_update(lv_obj_t * cont, void * user_data) // const int32_t * row_templ = get_row_dsc(cont); // if(col_templ == NULL || row_templ == NULL) return; - _lv_grid_calc_t c; + lv_grid_calc_t c; calc(cont, &c); item_repos_hint_t hint; @@ -223,12 +228,12 @@ static void grid_update(lv_obj_t * cont, void * user_data) * Calculate the grid cells coordinates * @param cont an object that has a grid * @param calc store the calculated cells sizes here - * @note `_lv_grid_calc_free(calc_out)` needs to be called when `calc_out` is not needed anymore + * @note `lv_grid_calc_free(calc_out)` needs to be called when `calc_out` is not needed anymore */ -static void calc(lv_obj_t * cont, _lv_grid_calc_t * calc_out) +static void calc(lv_obj_t * cont, lv_grid_calc_t * calc_out) { if(lv_obj_get_child(cont, 0) == NULL) { - lv_memzero(calc_out, sizeof(_lv_grid_calc_t)); + lv_memzero(calc_out, sizeof(lv_grid_calc_t)); return; } @@ -259,7 +264,7 @@ static void calc(lv_obj_t * cont, _lv_grid_calc_t * calc_out) * Free the a grid calculation's data * @param calc pointer to the calculated grid cell coordinates */ -static void calc_free(_lv_grid_calc_t * calc) +static void calc_free(lv_grid_calc_t * calc) { lv_free(calc->x); lv_free(calc->y); @@ -267,7 +272,7 @@ static void calc_free(_lv_grid_calc_t * calc) lv_free(calc->h); } -static void calc_cols(lv_obj_t * cont, _lv_grid_calc_t * c) +static void calc_cols(lv_obj_t * cont, lv_grid_calc_t * c) { const int32_t * col_templ; @@ -360,7 +365,7 @@ static void calc_cols(lv_obj_t * cont, _lv_grid_calc_t * c) } } -static void calc_rows(lv_obj_t * cont, _lv_grid_calc_t * c) +static void calc_rows(lv_obj_t * cont, lv_grid_calc_t * c) { const int32_t * row_templ; row_templ = get_row_dsc(cont); @@ -456,7 +461,7 @@ static void calc_rows(lv_obj_t * cont, _lv_grid_calc_t * c) * @param child_id_ext helper value if the ID of the child is know (order from the oldest) else -1 * @param grid_abs helper value, the absolute position of the grid, NULL if unknown */ -static void item_repos(lv_obj_t * item, _lv_grid_calc_t * c, item_repos_hint_t * hint) +static void item_repos(lv_obj_t * item, lv_grid_calc_t * c, item_repos_hint_t * hint) { if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) return; uint32_t col_span = get_col_span(item); diff --git a/src/layouts/grid/lv_grid.h b/src/layouts/grid/lv_grid.h index 3c64177e4..a7bf73822 100644 --- a/src/layouts/grid/lv_grid.h +++ b/src/layouts/grid/lv_grid.h @@ -80,10 +80,7 @@ void lv_obj_set_grid_cell(lv_obj_t * obj, lv_grid_align_t column_align, int32_t /** * Just a wrapper to `LV_GRID_FR` for bindings. */ -static inline int32_t lv_grid_fr(uint8_t x) -{ - return LV_GRID_FR(x); -} +int32_t lv_grid_fr(uint8_t x); /********************** * GLOBAL VARIABLES diff --git a/src/layouts/lv_layout.c b/src/layouts/lv_layout.c index a14c1219f..ddb3b0e5a 100644 --- a/src/layouts/lv_layout.c +++ b/src/layouts/lv_layout.c @@ -6,7 +6,7 @@ /********************* * INCLUDES *********************/ -#include "lv_layout.h" +#include "lv_layout_private.h" #include "../core/lv_global.h" #include "../core/lv_obj.h" @@ -36,7 +36,7 @@ * GLOBAL FUNCTIONS **********************/ -void _lv_layout_init(void) +void lv_layout_init(void) { /*Malloc a list for the built in layouts*/ layout_list_def = lv_malloc(layout_cnt * sizeof(lv_layout_dsc_t)); @@ -50,7 +50,7 @@ void _lv_layout_init(void) #endif } -void _lv_layout_deinit(void) +void lv_layout_deinit(void) { lv_free(layout_list_def); } @@ -65,7 +65,7 @@ uint32_t lv_layout_register(lv_layout_update_cb_t cb, void * user_data) return layout_cnt++; } -void _lv_layout_apply(lv_obj_t * obj) +void lv_layout_apply(lv_obj_t * obj) { lv_layout_t layout_id = lv_obj_get_style_layout(obj, LV_PART_MAIN); if(layout_id > 0 && layout_id <= layout_cnt) { diff --git a/src/layouts/lv_layout.h b/src/layouts/lv_layout.h index 4f0c62c07..a783d2b28 100644 --- a/src/layouts/lv_layout.h +++ b/src/layouts/lv_layout.h @@ -25,10 +25,6 @@ extern "C" { **********************/ typedef void (*lv_layout_update_cb_t)(lv_obj_t *, void * user_data); -typedef struct { - lv_layout_update_cb_t cb; - void * user_data; -} lv_layout_dsc_t; typedef enum { LV_LAYOUT_NONE = 0, @@ -41,17 +37,9 @@ typedef enum { LV_LAYOUT_GRID, #endif - _LV_LAYOUT_LAST + LV_LAYOUT_LAST } lv_layout_t; -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void _lv_layout_init(void); - -void _lv_layout_deinit(void); - /** * Register a new layout * @param cb the layout update callback @@ -60,12 +48,6 @@ void _lv_layout_deinit(void); */ uint32_t lv_layout_register(lv_layout_update_cb_t cb, void * user_data); -/** - * Update the layout of a widget - * @param obj pointer to a widget - */ -void _lv_layout_apply(lv_obj_t * obj); - /********************** * MACROS **********************/ diff --git a/src/layouts/lv_layout_private.h b/src/layouts/lv_layout_private.h new file mode 100644 index 000000000..dace2fccb --- /dev/null +++ b/src/layouts/lv_layout_private.h @@ -0,0 +1,58 @@ +/** + * @file lv_layout_private.h + * + */ + +#ifndef LV_LAYOUT_PRIVATE_H +#define LV_LAYOUT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_layout.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_layout_update_cb_t cb; + void * user_data; +} lv_layout_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_layout_init(void); + +void lv_layout_deinit(void); + +/** + * Update the layout of a widget + * @param obj pointer to a widget + */ +void lv_layout_apply(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LAYOUT_PRIVATE_H*/ diff --git a/src/libs/barcode/lv_barcode.c b/src/libs/barcode/lv_barcode.c index 1003b2a47..56885330b 100644 --- a/src/libs/barcode/lv_barcode.c +++ b/src/libs/barcode/lv_barcode.c @@ -6,7 +6,8 @@ /********************* * INCLUDES *********************/ -#include "lv_barcode.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_barcode_private.h" #include "../../lvgl.h" #if LV_USE_BARCODE diff --git a/src/libs/barcode/lv_barcode.h b/src/libs/barcode/lv_barcode.h index 664f38bb9..c9c0ce657 100644 --- a/src/libs/barcode/lv_barcode.h +++ b/src/libs/barcode/lv_barcode.h @@ -28,16 +28,6 @@ extern "C" { * TYPEDEFS **********************/ -/*Data of barcode*/ -typedef struct { - lv_canvas_t canvas; - lv_color_t dark_color; - lv_color_t light_color; - uint16_t scale; - lv_dir_t direction; - bool tiled; -} lv_barcode_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_barcode_class; /********************** diff --git a/src/libs/barcode/lv_barcode_private.h b/src/libs/barcode/lv_barcode_private.h new file mode 100644 index 000000000..e6d18198f --- /dev/null +++ b/src/libs/barcode/lv_barcode_private.h @@ -0,0 +1,55 @@ +/** + * @file lv_barcode_private.h + * + */ + +#ifndef LV_BARCODE_PRIVATE_H +#define LV_BARCODE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../widgets/canvas/lv_canvas_private.h" +#include "lv_barcode.h" + +#if LV_USE_BARCODE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of barcode*/ +struct lv_barcode_t { + lv_canvas_t canvas; + lv_color_t dark_color; + lv_color_t light_color; + uint16_t scale; + lv_dir_t direction; + bool tiled; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_BARCODE */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BARCODE_PRIVATE_H*/ diff --git a/src/libs/bin_decoder/lv_bin_decoder.c b/src/libs/bin_decoder/lv_bin_decoder.c index 5e8a5dbf6..0df2f624b 100644 --- a/src/libs/bin_decoder/lv_bin_decoder.c +++ b/src/libs/bin_decoder/lv_bin_decoder.c @@ -6,6 +6,7 @@ /********************* * INCLUDES *********************/ +#include "../../draw/lv_image_decoder_private.h" #include "lv_bin_decoder.h" #include "../../draw/lv_draw_image.h" #include "../../draw/lv_draw_buf.h" @@ -38,7 +39,7 @@ * Data format for compressed image data. */ -typedef struct _lv_image_compressed_t { +typedef struct lv_image_compressed_t { uint32_t method: 4; /*Compression method, see `lv_image_compress_t`*/ uint32_t reserved : 28; /*Reserved to be used later*/ uint32_t compressed_size; /*Compressed data size in byte*/ @@ -180,7 +181,8 @@ lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_d { LV_UNUSED(decoder); - lv_fs_res_t res = LV_RESULT_INVALID; + lv_result_t res = LV_RESULT_INVALID; + lv_fs_res_t fs_res = LV_FS_RES_UNKNOWN; bool use_directly = false; /*If the image is already decoded and can be used directly*/ /*Open the file if it's a file*/ @@ -201,9 +203,9 @@ lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_d return LV_RESULT_INVALID; } - res = lv_fs_open(f, dsc->src, LV_FS_MODE_RD); - if(res != LV_FS_RES_OK) { - LV_LOG_WARN("Open file failed: %d", res); + fs_res = lv_fs_open(f, dsc->src, LV_FS_MODE_RD); + if(fs_res != LV_FS_RES_OK) { + LV_LOG_WARN("Open file failed: %d", fs_res); lv_free(f); free_decoder_data(dsc); return LV_RESULT_INVALID; @@ -386,7 +388,7 @@ lv_result_t lv_bin_decoder_get_area(lv_image_decoder_t * decoder, lv_image_decod return LV_RESULT_INVALID; } - lv_result_t res = LV_RESULT_INVALID; + lv_fs_res_t res = LV_FS_RES_UNKNOWN; decoder_data_t * decoder_data = dsc->user_data; if(decoder_data == NULL) { LV_LOG_ERROR("Unexpected null decoder data"); @@ -545,7 +547,7 @@ static void free_decoder_data(lv_image_decoder_dsc_t * dsc) static lv_result_t decode_indexed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) { LV_UNUSED(decoder); /*Unused*/ - lv_result_t res; + lv_fs_res_t res; uint32_t rn; decoder_data_t * decoder_data = dsc->user_data; lv_fs_file_t * f = decoder_data->f; @@ -675,7 +677,7 @@ static lv_result_t load_indexed(lv_image_decoder_t * decoder, lv_image_decoder_d LV_UNUSED(decoder); /*Unused*/ - lv_result_t res; + lv_fs_res_t res; uint32_t rn; decoder_data_t * decoder_data = dsc->user_data; @@ -761,7 +763,7 @@ static lv_result_t load_indexed(lv_image_decoder_t * decoder, lv_image_decoder_d static lv_result_t decode_rgb(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) { LV_UNUSED(decoder); - lv_result_t res; + lv_fs_res_t res; decoder_data_t * decoder_data = dsc->user_data; lv_fs_file_t * f = decoder_data->f; lv_color_format_t cf = dsc->header.cf; @@ -814,7 +816,7 @@ static inline uint8_t bit_extend(uint8_t value, uint8_t bpp) static lv_result_t decode_alpha_only(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) { LV_UNUSED(decoder); - lv_result_t res; + lv_fs_res_t res; uint32_t rn; decoder_data_t * decoder_data = dsc->user_data; uint8_t bpp = lv_color_format_get_bpp(dsc->header.cf); @@ -890,6 +892,7 @@ static lv_result_t decode_compressed(lv_image_decoder_t * decoder, lv_image_deco uint32_t compressed_len; decoder_data_t * decoder_data = get_decoder_data(dsc); lv_result_t res; + lv_fs_res_t fs_res; uint8_t * file_buf = NULL; lv_image_compressed_t * compressed = &decoder_data->compressed; @@ -909,9 +912,9 @@ static lv_result_t decode_compressed(lv_image_decoder_t * decoder, lv_image_deco /*Read compress header*/ len = 12; - res = fs_read_file_at(f, sizeof(lv_image_header_t), compressed, len, &rn); - if(res != LV_FS_RES_OK || rn != len) { - LV_LOG_WARN("Read compressed header failed: %d", res); + fs_res = fs_read_file_at(f, sizeof(lv_image_header_t), compressed, len, &rn); + if(fs_res != LV_FS_RES_OK || rn != len) { + LV_LOG_WARN("Read compressed header failed: %d", fs_res); return LV_RESULT_INVALID; } @@ -928,9 +931,9 @@ static lv_result_t decode_compressed(lv_image_decoder_t * decoder, lv_image_deco } /*Continue to read the compressed data following compression header*/ - res = lv_fs_read(f, file_buf, compressed_len, &rn); - if(res != LV_FS_RES_OK || rn != compressed_len) { - LV_LOG_WARN("Read compressed file failed: %d", res); + fs_res = lv_fs_read(f, file_buf, compressed_len, &rn); + if(fs_res != LV_FS_RES_OK || rn != compressed_len) { + LV_LOG_WARN("Read compressed file failed: %d", fs_res); lv_free(file_buf); return LV_RESULT_INVALID; } diff --git a/src/libs/bmp/lv_bmp.c b/src/libs/bmp/lv_bmp.c index f23ae6ceb..323a14741 100644 --- a/src/libs/bmp/lv_bmp.c +++ b/src/libs/bmp/lv_bmp.c @@ -6,10 +6,12 @@ /********************* * INCLUDES *********************/ +#include "../../draw/lv_image_decoder_private.h" #include "../../../lvgl.h" #if LV_USE_BMP #include +#include "../../core/lv_global.h" /********************* * DEFINES @@ -158,7 +160,7 @@ static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_d lv_memset(&b, 0x00, sizeof(b)); lv_fs_res_t res = lv_fs_open(&b.f, dsc->src, LV_FS_MODE_RD); - if(res == LV_RESULT_OK) return LV_RESULT_INVALID; + if(res != LV_FS_RES_OK) return LV_RESULT_INVALID; uint8_t header[54]; lv_fs_read(&b.f, header, 54, NULL); diff --git a/src/libs/ffmpeg/lv_ffmpeg.c b/src/libs/ffmpeg/lv_ffmpeg.c index a86a6627d..8290944a5 100644 --- a/src/libs/ffmpeg/lv_ffmpeg.c +++ b/src/libs/ffmpeg/lv_ffmpeg.c @@ -6,8 +6,10 @@ /********************* * INCLUDES *********************/ -#include "lv_ffmpeg.h" +#include "lv_ffmpeg_private.h" #if LV_USE_FFMPEG != 0 +#include "../../draw/lv_image_decoder_private.h" +#include "../../core/lv_obj_class_private.h" #include #include @@ -804,7 +806,7 @@ static void ffmpeg_close(struct ffmpeg_context_s * ffmpeg_ctx) static void lv_ffmpeg_player_frame_update_cb(lv_timer_t * timer) { - lv_obj_t * obj = (lv_obj_t *)timer->user_data; + lv_obj_t * obj = (lv_obj_t *)lv_timer_get_user_data(timer); lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; if(!player->ffmpeg_ctx) { diff --git a/src/libs/ffmpeg/lv_ffmpeg.h b/src/libs/ffmpeg/lv_ffmpeg.h index 51203e543..1cb86b9d4 100644 --- a/src/libs/ffmpeg/lv_ffmpeg.h +++ b/src/libs/ffmpeg/lv_ffmpeg.h @@ -13,8 +13,8 @@ extern "C" { * INCLUDES *********************/ #include "../../lv_conf_internal.h" -#include "../../widgets/image/lv_image.h" #if LV_USE_FFMPEG != 0 +#include "../../misc/lv_types.h" /********************* * DEFINES @@ -27,20 +27,12 @@ struct ffmpeg_context_s; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_ffmpeg_player_class; -typedef struct { - lv_image_t img; - lv_timer_t * timer; - lv_image_dsc_t imgdsc; - bool auto_restart; - struct ffmpeg_context_s * ffmpeg_ctx; -} lv_ffmpeg_player_t; - typedef enum { LV_FFMPEG_PLAYER_CMD_START, LV_FFMPEG_PLAYER_CMD_STOP, LV_FFMPEG_PLAYER_CMD_PAUSE, LV_FFMPEG_PLAYER_CMD_RESUME, - _LV_FFMPEG_PLAYER_CMD_LAST + LV_FFMPEG_PLAYER_CMD_LAST } lv_ffmpeg_player_cmd_t; /********************** diff --git a/src/libs/ffmpeg/lv_ffmpeg_private.h b/src/libs/ffmpeg/lv_ffmpeg_private.h new file mode 100644 index 000000000..b27b6bf02 --- /dev/null +++ b/src/libs/ffmpeg/lv_ffmpeg_private.h @@ -0,0 +1,51 @@ +/** + * @file lv_ffmpeg_private.h + * + */ + +#ifndef LV_FFMPEG_PRIVATE_H +#define LV_FFMPEG_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_ffmpeg.h" +#if LV_USE_FFMPEG != 0 +#include "../../widgets/image/lv_image_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_ffmpeg_player_t { + lv_image_t img; + lv_timer_t * timer; + lv_image_dsc_t imgdsc; + bool auto_restart; + struct ffmpeg_context_s * ffmpeg_ctx; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FFMPEG*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FFMPEG_PRIVATE_H*/ diff --git a/src/libs/freetype/lv_freetype.c b/src/libs/freetype/lv_freetype.c index 6de49b60d..b1da8f13e 100755 --- a/src/libs/freetype/lv_freetype.c +++ b/src/libs/freetype/lv_freetype.c @@ -6,7 +6,8 @@ /********************* * INCLUDES *********************/ -#include "lv_freetype.h" +#include "../../misc/lv_fs_private.h" +#include "lv_freetype_private.h" #if LV_USE_FREETYPE @@ -88,7 +89,7 @@ lv_result_t lv_freetype_init(uint32_t max_glyph_cnt) return LV_RESULT_INVALID; } - _lv_ll_init(&ctx->face_id_ll, sizeof(face_id_node_t)); + lv_ll_init(&ctx->face_id_ll, sizeof(face_id_node_t)); lv_cache_ops_t ops = { .compare_cb = (lv_cache_compare_cb_t)cache_node_cache_compare_cb, @@ -289,7 +290,7 @@ static FTC_FaceID lv_freetype_req_face_id(lv_freetype_context_t * ctx, const cha face_id_node_t * node; /* search cache */ - _LV_LL_READ(ll_p, node) { + LV_LL_READ(ll_p, node) { if(strcmp(node->pathname, pathname) == 0) { node->ref_cnt++; LV_LOG_INFO("reuse face_id: %s, ref_cnt = %d", node->pathname, node->ref_cnt); @@ -298,7 +299,7 @@ static FTC_FaceID lv_freetype_req_face_id(lv_freetype_context_t * ctx, const cha } /* insert new cache */ - node = _lv_ll_ins_tail(ll_p); + node = lv_ll_ins_tail(ll_p); LV_ASSERT_MALLOC(node); #if LV_USE_FS_MEMFS @@ -327,13 +328,13 @@ static void lv_freetype_drop_face_id(lv_freetype_context_t * ctx, FTC_FaceID fac { lv_ll_t * ll_p = &ctx->face_id_ll; face_id_node_t * node; - _LV_LL_READ(ll_p, node) { + LV_LL_READ(ll_p, node) { if(face_id == node->pathname) { LV_LOG_INFO("found face_id: %s, ref_cnt = %d", node->pathname, node->ref_cnt); node->ref_cnt--; if(node->ref_cnt == 0) { LV_LOG_INFO("drop face_id: %s", node->pathname); - _lv_ll_remove(ll_p, node); + lv_ll_remove(ll_p, node); lv_free(node->pathname); lv_free(node); } diff --git a/src/libs/freetype/lv_freetype.h b/src/libs/freetype/lv_freetype.h index 7104e2f1b..76b9f7b56 100755 --- a/src/libs/freetype/lv_freetype.h +++ b/src/libs/freetype/lv_freetype.h @@ -15,7 +15,7 @@ extern "C" { #include "../../lv_conf_internal.h" #include "../../misc/lv_types.h" #include "../../misc/lv_event.h" -#include +#include LV_STDBOOL_INCLUDE #if LV_USE_FREETYPE @@ -34,21 +34,18 @@ extern "C" { * TYPEDEFS **********************/ -enum { +typedef enum { LV_FREETYPE_FONT_STYLE_NORMAL = 0, LV_FREETYPE_FONT_STYLE_ITALIC = 1 << 0, LV_FREETYPE_FONT_STYLE_BOLD = 1 << 1, -}; +} lv_freetype_font_style_t; -typedef uint16_t lv_freetype_font_style_t; typedef lv_freetype_font_style_t LV_FT_FONT_STYLE; -enum { +typedef enum { LV_FREETYPE_FONT_RENDER_MODE_BITMAP = 0, LV_FREETYPE_FONT_RENDER_MODE_OUTLINE = 1, -}; - -typedef uint16_t lv_freetype_font_render_mode_t; +} lv_freetype_font_render_mode_t; typedef void * lv_freetype_outline_t; @@ -60,19 +57,6 @@ typedef enum { LV_FREETYPE_OUTLINE_CONIC_TO, } lv_freetype_outline_type_t; -typedef struct { - int32_t x; - int32_t y; -} lv_freetype_outline_vector_t; - -typedef struct { - lv_freetype_outline_t outline; - lv_freetype_outline_type_t type; - lv_freetype_outline_vector_t to; - lv_freetype_outline_vector_t control1; - lv_freetype_outline_vector_t control2; -} lv_freetype_outline_event_param_t; - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/libs/freetype/lv_freetype_glyph.c b/src/libs/freetype/lv_freetype_glyph.c index 04b9b21e6..733f7396b 100644 --- a/src/libs/freetype/lv_freetype_glyph.c +++ b/src/libs/freetype/lv_freetype_glyph.c @@ -21,7 +21,7 @@ /********************** * TYPEDEFS **********************/ -typedef struct _lv_freetype_glyph_cache_data_t { +typedef struct lv_freetype_glyph_cache_data_t { uint32_t unicode; uint32_t size; diff --git a/src/libs/freetype/lv_freetype_image.c b/src/libs/freetype/lv_freetype_image.c index 9765242d3..f85054e39 100755 --- a/src/libs/freetype/lv_freetype_image.c +++ b/src/libs/freetype/lv_freetype_image.c @@ -26,7 +26,7 @@ * TYPEDEFS **********************/ -typedef struct _lv_freetype_image_cache_data_t { +typedef struct lv_freetype_image_cache_data_t { FT_UInt glyph_index; uint32_t size; diff --git a/src/libs/freetype/lv_freetype_outline.c b/src/libs/freetype/lv_freetype_outline.c index 006dc4b4f..01cc2983e 100755 --- a/src/libs/freetype/lv_freetype_outline.c +++ b/src/libs/freetype/lv_freetype_outline.c @@ -7,6 +7,7 @@ * INCLUDES *********************/ +#include "../../misc/lv_event_private.h" #include "../../lvgl.h" #include "lv_freetype_private.h" @@ -22,7 +23,7 @@ * TYPEDEFS **********************/ -typedef struct _lv_freetype_outline_node_t { +typedef struct lv_freetype_outline_node_t { FT_UInt glyph_index; lv_freetype_outline_t outline; } lv_freetype_outline_node_t; diff --git a/src/libs/freetype/lv_freetype_private.h b/src/libs/freetype/lv_freetype_private.h index 9c6862339..7644101ab 100755 --- a/src/libs/freetype/lv_freetype_private.h +++ b/src/libs/freetype/lv_freetype_private.h @@ -14,7 +14,10 @@ extern "C" { * INCLUDES *********************/ -#include "../../../lvgl.h" +#include "lv_freetype.h" +#include "../../misc/cache/lv_cache.h" +#include "../../misc/lv_ll.h" +#include "../../font/lv_font.h" #if LV_USE_FREETYPE @@ -57,9 +60,23 @@ extern "C" { * TYPEDEFS **********************/ -typedef struct _lv_freetype_cache_node_t lv_freetype_cache_node_t; +struct lv_freetype_outline_vector_t { + int32_t x; + int32_t y; +}; -struct _lv_freetype_cache_node_t { +struct lv_freetype_outline_event_param_t { + lv_freetype_outline_t outline; + lv_freetype_outline_type_t type; + lv_freetype_outline_vector_t to; + lv_freetype_outline_vector_t control1; + lv_freetype_outline_vector_t control2; +}; + + +typedef struct lv_freetype_cache_node_t lv_freetype_cache_node_t; + +struct lv_freetype_cache_node_t { const char * pathname; lv_freetype_font_style_t style; lv_freetype_font_render_mode_t render_mode; @@ -76,7 +93,7 @@ struct _lv_freetype_cache_node_t { lv_cache_t * draw_data_cache; }; -typedef struct _lv_freetype_context_t { +typedef struct lv_freetype_context_t { FT_Library library; lv_ll_t face_id_ll; lv_event_cb_t event_cb; @@ -86,7 +103,7 @@ typedef struct _lv_freetype_context_t { lv_cache_t * cache_node_cache; } lv_freetype_context_t; -typedef struct _lv_freetype_font_dsc_t { +typedef struct lv_freetype_font_dsc_t { uint32_t magic_num; lv_font_t font; uint32_t size; diff --git a/src/libs/fsdrv/lv_fs_memfs.c b/src/libs/fsdrv/lv_fs_memfs.c index 52379beb7..5b678f5a9 100644 --- a/src/libs/fsdrv/lv_fs_memfs.c +++ b/src/libs/fsdrv/lv_fs_memfs.c @@ -40,6 +40,7 @@ /********************* * INCLUDES *********************/ +#include "../../misc/lv_fs_private.h" #include "../../../lvgl.h" #if LV_USE_FS_MEMFS diff --git a/src/libs/fsdrv/lv_fs_posix.c b/src/libs/fsdrv/lv_fs_posix.c index 3e17a3649..95269af24 100644 --- a/src/libs/fsdrv/lv_fs_posix.c +++ b/src/libs/fsdrv/lv_fs_posix.c @@ -16,6 +16,7 @@ #include #include #include +#include "../../core/lv_global.h" /********************* * DEFINES diff --git a/src/libs/gif/lv_gif.c b/src/libs/gif/lv_gif.c index 7bc40a64b..ca48f13fd 100644 --- a/src/libs/gif/lv_gif.c +++ b/src/libs/gif/lv_gif.c @@ -6,7 +6,9 @@ /********************* * INCLUDES *********************/ -#include "lv_gif.h" +#include "../../misc/lv_timer_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_gif_private.h" #if LV_USE_GIF #include "gifdec.h" @@ -176,7 +178,7 @@ static void next_frame_task_cb(lv_timer_t * t) /*It was the last repeat*/ lv_result_t res = lv_obj_send_event(obj, LV_EVENT_READY, NULL); lv_timer_pause(t); - if(res != LV_FS_RES_OK) return; + if(res != LV_RESULT_OK) return; } gd_render_frame(gifobj->gif, (uint8_t *)gifobj->imgdsc.data); diff --git a/src/libs/gif/lv_gif.h b/src/libs/gif/lv_gif.h index 9a7ca7a8e..fc6323fa6 100644 --- a/src/libs/gif/lv_gif.h +++ b/src/libs/gif/lv_gif.h @@ -14,7 +14,13 @@ extern "C" { * INCLUDES *********************/ -#include "../../../lvgl.h" +#include "../../lv_conf_internal.h" +#include "../../misc/lv_types.h" +#include "../../draw/lv_draw_buf.h" +#include "../../widgets/image/lv_image.h" +#include "../../core/lv_obj_class.h" +#include LV_STDBOOL_INCLUDE +#include LV_STDINT_INCLUDE #if LV_USE_GIF #include "gifdec.h" @@ -27,14 +33,6 @@ extern "C" { * TYPEDEFS **********************/ -typedef struct { - lv_image_t img; - gd_GIF * gif; - lv_timer_t * timer; - lv_image_dsc_t imgdsc; - uint32_t last_call; -} lv_gif_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_gif_class; /********************** diff --git a/src/libs/gif/lv_gif_private.h b/src/libs/gif/lv_gif_private.h new file mode 100644 index 000000000..c4ea17af7 --- /dev/null +++ b/src/libs/gif/lv_gif_private.h @@ -0,0 +1,57 @@ +/** + * @file lv_gif_private.h + * + */ + +#ifndef LV_GIF_PRIVATE_H +#define LV_GIF_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../widgets/image/lv_image_private.h" +#include "lv_gif.h" + +#if LV_USE_GIF + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_gif_t { + lv_image_t img; + gd_GIF * gif; + lv_timer_t * timer; + lv_image_dsc_t imgdsc; + uint32_t last_call; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_GIF */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GIF_PRIVATE_H*/ diff --git a/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c b/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c index c4309be7f..ac89953c8 100644 --- a/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c +++ b/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c @@ -6,6 +6,7 @@ /********************* * INCLUDES *********************/ +#include "../../draw/lv_image_decoder_private.h" #include "../../../lvgl.h" #if LV_USE_LIBJPEG_TURBO @@ -14,6 +15,7 @@ #include #include #include +#include "../../core/lv_global.h" /********************* * DEFINES diff --git a/src/libs/libpng/lv_libpng.c b/src/libs/libpng/lv_libpng.c index 85834b32f..a77103106 100644 --- a/src/libs/libpng/lv_libpng.c +++ b/src/libs/libpng/lv_libpng.c @@ -6,12 +6,14 @@ /********************* * INCLUDES *********************/ +#include "../../draw/lv_image_decoder_private.h" #include "../../../lvgl.h" #if LV_USE_LIBPNG #include "lv_libpng.h" #include #include +#include "../../core/lv_global.h" /********************* * DEFINES diff --git a/src/libs/lodepng/lodepng.c b/src/libs/lodepng/lodepng.c index 9509ec3fa..4d8cdb1cf 100644 --- a/src/libs/lodepng/lodepng.c +++ b/src/libs/lodepng/lodepng.c @@ -30,6 +30,7 @@ Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for #include "lodepng.h" #if LV_USE_LODEPNG +#include "../../core/lv_global.h" #define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) @@ -5835,9 +5836,9 @@ unsigned lodepng_decode(unsigned char ** out, unsigned * w, unsigned * h, state->error = 83; /*alloc fail*/ } else { - state->error = lodepng_convert(new_buf->data, old_buf->data, + state->error = lodepng_convert(new_buf->data, old_buf->data, &state->info_raw, &state->info_png.color, *w, *h); - + if (state->error) { lv_draw_buf_destroy_user(image_cache_draw_buf_handlers,new_buf); new_buf = NULL; diff --git a/src/libs/lodepng/lv_lodepng.c b/src/libs/lodepng/lv_lodepng.c index 4ea989fca..86765b35e 100644 --- a/src/libs/lodepng/lv_lodepng.c +++ b/src/libs/lodepng/lv_lodepng.c @@ -6,7 +6,9 @@ /********************* * INCLUDES *********************/ +#include "../../draw/lv_image_decoder_private.h" #include "../../../lvgl.h" +#include "../../core/lv_global.h" #if LV_USE_LODEPNG #include "lv_lodepng.h" diff --git a/src/libs/qrcode/lv_qrcode.c b/src/libs/qrcode/lv_qrcode.c index 39f255f3c..f4b5b5456 100644 --- a/src/libs/qrcode/lv_qrcode.c +++ b/src/libs/qrcode/lv_qrcode.c @@ -6,7 +6,8 @@ /********************* * INCLUDES *********************/ -#include "../../lvgl.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_qrcode_private.h" #if LV_USE_QRCODE diff --git a/src/libs/qrcode/lv_qrcode.h b/src/libs/qrcode/lv_qrcode.h index 6bf6d2c81..ba9b0e869 100644 --- a/src/libs/qrcode/lv_qrcode.h +++ b/src/libs/qrcode/lv_qrcode.h @@ -14,6 +14,11 @@ extern "C" { * INCLUDES *********************/ #include "../../lv_conf_internal.h" +#include "../../misc/lv_color.h" +#include "../../misc/lv_types.h" +#include "../../widgets/canvas/lv_canvas.h" +#include LV_STDBOOL_INCLUDE +#include LV_STDINT_INCLUDE #if LV_USE_QRCODE /********************* @@ -24,13 +29,6 @@ extern "C" { * TYPEDEFS **********************/ -/*Data of qrcode*/ -typedef struct { - lv_canvas_t canvas; - lv_color_t dark_color; - lv_color_t light_color; -} lv_qrcode_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_qrcode_class; /********************** diff --git a/src/libs/qrcode/lv_qrcode_private.h b/src/libs/qrcode/lv_qrcode_private.h new file mode 100644 index 000000000..b912d6575 --- /dev/null +++ b/src/libs/qrcode/lv_qrcode_private.h @@ -0,0 +1,52 @@ +/** + * @file lv_qrcode_private.h + * + */ + +#ifndef LV_QRCODE_PRIVATE_H +#define LV_QRCODE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../widgets/canvas/lv_canvas_private.h" +#include "lv_qrcode.h" + +#if LV_USE_QRCODE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of qrcode*/ +struct lv_qrcode_t { + lv_canvas_t canvas; + lv_color_t dark_color; + lv_color_t light_color; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_QRCODE */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_QRCODE_PRIVATE_H*/ diff --git a/src/libs/rlottie/lv_rlottie.c b/src/libs/rlottie/lv_rlottie.c index eed803252..3c723ec0f 100644 --- a/src/libs/rlottie/lv_rlottie.c +++ b/src/libs/rlottie/lv_rlottie.c @@ -9,6 +9,8 @@ #include "../../lvgl.h" #if LV_USE_RLOTTIE +#include "lv_rlottie_private.h" +#include "../../core/lv_obj_class_private.h" #include #include @@ -187,7 +189,7 @@ static void lv_rlottie_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj static void next_frame_task_cb(lv_timer_t * t) { - lv_obj_t * obj = t->user_data; + lv_obj_t * obj = lv_timer_get_user_data(t); lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_PAUSE) == LV_RLOTTIE_CTRL_PAUSE) { diff --git a/src/libs/rlottie/lv_rlottie.h b/src/libs/rlottie/lv_rlottie.h index f9ab93ff7..44bcf2ef4 100644 --- a/src/libs/rlottie/lv_rlottie.h +++ b/src/libs/rlottie/lv_rlottie.h @@ -31,23 +31,6 @@ typedef enum { LV_RLOTTIE_CTRL_LOOP = 8, } lv_rlottie_ctrl_t; -/** definition in lottieanimation_capi.c */ -struct Lottie_Animation_S; -typedef struct { - lv_image_t img_ext; - struct Lottie_Animation_S * animation; - lv_timer_t * task; - lv_image_dsc_t imgdsc; - size_t total_frames; - size_t current_frame; - size_t framerate; - uint32_t * allocated_buf; - size_t allocated_buffer_size; - size_t scanline_width; - lv_rlottie_ctrl_t play_ctrl; - size_t dest_frame; -} lv_rlottie_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_rlottie_class; /********************** diff --git a/src/libs/rlottie/lv_rlottie_private.h b/src/libs/rlottie/lv_rlottie_private.h new file mode 100644 index 000000000..91587bd6c --- /dev/null +++ b/src/libs/rlottie/lv_rlottie_private.h @@ -0,0 +1,61 @@ +/** + * @file lv_rlottie_private.h + * + */ + +#ifndef LV_RLOTTIE_PRIVATE_H +#define LV_RLOTTIE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_rlottie.h" +#if LV_USE_RLOTTIE +#include "../../widgets/image/lv_image_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** definition in lottieanimation_capi.c */ +struct Lottie_Animation_S; + +struct lv_rlottie_t { + lv_image_t img_ext; + struct Lottie_Animation_S * animation; + lv_timer_t * task; + lv_image_dsc_t imgdsc; + size_t total_frames; + size_t current_frame; + size_t framerate; + uint32_t * allocated_buf; + size_t allocated_buffer_size; + size_t scanline_width; + lv_rlottie_ctrl_t play_ctrl; + size_t dest_frame; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_RLOTTIE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_RLOTTIE_PRIVATE_H*/ diff --git a/src/libs/tiny_ttf/lv_tiny_ttf.c b/src/libs/tiny_ttf/lv_tiny_ttf.c index 00927e104..c7fa4e168 100644 --- a/src/libs/tiny_ttf/lv_tiny_ttf.c +++ b/src/libs/tiny_ttf/lv_tiny_ttf.c @@ -9,6 +9,7 @@ #include "../../lvgl.h" #if LV_USE_TINY_TTF != 0 +#include "../../core/lv_global.h" #define font_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->font_draw_buf_handlers) @@ -76,7 +77,7 @@ typedef struct _tiny_ttf_glyph_cache_data_t { lv_font_glyph_dsc_t glyph_dsc; } tiny_ttf_glyph_cache_data_t; -typedef struct _lv_tiny_ttf_cache_data_t { +typedef struct lv_tiny_ttf_cache_data_t { uint32_t glyph_index; uint32_t size; lv_draw_buf_t * draw_buf; diff --git a/src/libs/tjpgd/lv_tjpgd.c b/src/libs/tjpgd/lv_tjpgd.c index 551a03dac..650b36ad6 100644 --- a/src/libs/tjpgd/lv_tjpgd.c +++ b/src/libs/tjpgd/lv_tjpgd.c @@ -7,12 +7,13 @@ * INCLUDES *********************/ +#include "../../draw/lv_image_decoder_private.h" #include "../../../lvgl.h" #if LV_USE_TJPGD #include "tjpgd.h" #include "lv_tjpgd.h" -#include "../../misc/lv_fs.h" +#include "../../misc/lv_fs_private.h" #include /********************* @@ -187,7 +188,7 @@ static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_d JDEC * jd = lv_malloc(sizeof(JDEC)); dsc->user_data = jd; JRESULT rc = jd_prepare(jd, input_func, workb_temp, (size_t)TJPGD_WORKBUFF_SIZE, f); - if(rc) return rc; + if(rc) return LV_RESULT_INVALID; dsc->header.cf = LV_COLOR_FORMAT_RGB888; dsc->header.w = jd->width; @@ -231,7 +232,7 @@ static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decod else { lv_fs_seek(jd->device, 0, LV_FS_SEEK_SET); JRESULT rc = jd_prepare(jd, input_func, jd->pool_original, (size_t)TJPGD_WORKBUFF_SIZE, jd->device); - if(rc) return rc; + if(rc) return LV_RESULT_INVALID; } decoded->data = jd->workbuf; decoded->header = dsc->header; @@ -259,17 +260,17 @@ static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decod JRESULT rc; if(jd->nrst && jd->rst++ == jd->nrst) { rc = jd_restart(jd, jd->rsc++); - if(rc != JDR_OK) return rc; + if(rc != JDR_OK) return LV_RESULT_INVALID; jd->rst = 1; } /* Load an MCU (decompress huffman coded stream, dequantize and apply IDCT) */ rc = jd_mcu_load(jd); - if(rc != JDR_OK) return rc; + if(rc != JDR_OK) return LV_RESULT_INVALID; /* Output the MCU (YCbCr to RGB, scaling and output) */ rc = jd_mcu_output(jd, NULL, decoded_area->x1, decoded_area->y1); - if(rc != JDR_OK) return rc; + if(rc != JDR_OK) return LV_RESULT_INVALID; return LV_RESULT_OK; } diff --git a/src/lv_api_map_v8.h b/src/lv_api_map_v8.h index 664e53e2e..65fd22d28 100644 --- a/src/lv_api_map_v8.h +++ b/src/lv_api_map_v8.h @@ -143,8 +143,8 @@ static inline void lv_obj_move_background(lv_obj_t * obj) #define lv_disp_trig_activity lv_display_trigger_activity #define lv_disp_enable_invalidation lv_display_enable_invalidation #define lv_disp_is_invalidation_enabled lv_display_is_invalidation_enabled -#define _lv_disp_refr_timer _lv_display_refr_timer -#define _lv_disp_get_refr_timer lv_display_get_refr_timer +#define lv_disp_refr_timer lv_display_refr_timer +#define lv_disp_get_refr_timer lv_display_get_refr_timer #define lv_timer_del lv_timer_delete diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index d89bde5ba..1f950263d 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -67,7 +67,7 @@ #endif #ifdef CONFIG_LV_COLOR_DEPTH - #define _LV_KCONFIG_PRESENT + #define LV_KCONFIG_PRESENT #endif /*---------------------------------- @@ -273,7 +273,7 @@ /*Align the stride of all layers and images to this bytes*/ #ifndef LV_DRAW_BUF_STRIDE_ALIGN - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_DRAW_BUF_STRIDE_ALIGN #define LV_DRAW_BUF_STRIDE_ALIGN CONFIG_LV_DRAW_BUF_STRIDE_ALIGN #else @@ -331,7 +331,7 @@ #endif #ifndef LV_USE_DRAW_SW - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_DRAW_SW #define LV_USE_DRAW_SW CONFIG_LV_USE_DRAW_SW #else @@ -351,7 +351,7 @@ */ #ifndef LV_DRAW_SW_SUPPORT_RGB565 - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_DRAW_SW_SUPPORT_RGB565 #define LV_DRAW_SW_SUPPORT_RGB565 CONFIG_LV_DRAW_SW_SUPPORT_RGB565 #else @@ -362,7 +362,7 @@ #endif #endif #ifndef LV_DRAW_SW_SUPPORT_RGB565A8 - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_DRAW_SW_SUPPORT_RGB565A8 #define LV_DRAW_SW_SUPPORT_RGB565A8 CONFIG_LV_DRAW_SW_SUPPORT_RGB565A8 #else @@ -373,7 +373,7 @@ #endif #endif #ifndef LV_DRAW_SW_SUPPORT_RGB888 - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_DRAW_SW_SUPPORT_RGB888 #define LV_DRAW_SW_SUPPORT_RGB888 CONFIG_LV_DRAW_SW_SUPPORT_RGB888 #else @@ -384,7 +384,7 @@ #endif #endif #ifndef LV_DRAW_SW_SUPPORT_XRGB8888 - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_DRAW_SW_SUPPORT_XRGB8888 #define LV_DRAW_SW_SUPPORT_XRGB8888 CONFIG_LV_DRAW_SW_SUPPORT_XRGB8888 #else @@ -395,7 +395,7 @@ #endif #endif #ifndef LV_DRAW_SW_SUPPORT_ARGB8888 - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_DRAW_SW_SUPPORT_ARGB8888 #define LV_DRAW_SW_SUPPORT_ARGB8888 CONFIG_LV_DRAW_SW_SUPPORT_ARGB8888 #else @@ -406,7 +406,7 @@ #endif #endif #ifndef LV_DRAW_SW_SUPPORT_L8 - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_DRAW_SW_SUPPORT_L8 #define LV_DRAW_SW_SUPPORT_L8 CONFIG_LV_DRAW_SW_SUPPORT_L8 #else @@ -417,7 +417,7 @@ #endif #endif #ifndef LV_DRAW_SW_SUPPORT_AL88 - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_DRAW_SW_SUPPORT_AL88 #define LV_DRAW_SW_SUPPORT_AL88 CONFIG_LV_DRAW_SW_SUPPORT_AL88 #else @@ -428,7 +428,7 @@ #endif #endif #ifndef LV_DRAW_SW_SUPPORT_A8 - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_DRAW_SW_SUPPORT_A8 #define LV_DRAW_SW_SUPPORT_A8 CONFIG_LV_DRAW_SW_SUPPORT_A8 #else @@ -439,7 +439,7 @@ #endif #endif #ifndef LV_DRAW_SW_SUPPORT_I1 - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_DRAW_SW_SUPPORT_I1 #define LV_DRAW_SW_SUPPORT_I1 CONFIG_LV_DRAW_SW_SUPPORT_I1 #else @@ -454,7 +454,7 @@ * > 1 requires an operating system enabled in `LV_USE_OS` * > 1 means multiple threads will render the screen in parallel */ #ifndef LV_DRAW_SW_DRAW_UNIT_CNT - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_DRAW_SW_DRAW_UNIT_CNT #define LV_DRAW_SW_DRAW_UNIT_CNT CONFIG_LV_DRAW_SW_DRAW_UNIT_CNT #else @@ -486,7 +486,7 @@ /* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only * 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */ #ifndef LV_DRAW_SW_COMPLEX - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_DRAW_SW_COMPLEX #define LV_DRAW_SW_COMPLEX CONFIG_LV_DRAW_SW_COMPLEX #else @@ -572,7 +572,7 @@ #if LV_USE_OS /* Enable VGLite draw async. Queue multiple tasks and flash them once to the GPU. */ #ifndef LV_USE_VGLITE_DRAW_ASYNC - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_VGLITE_DRAW_ASYNC #define LV_USE_VGLITE_DRAW_ASYNC CONFIG_LV_USE_VGLITE_DRAW_ASYNC #else @@ -754,7 +754,7 @@ /*1: Enable print timestamp; *0: Disable print timestamp*/ #ifndef LV_LOG_USE_TIMESTAMP - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_LOG_USE_TIMESTAMP #define LV_LOG_USE_TIMESTAMP CONFIG_LV_LOG_USE_TIMESTAMP #else @@ -768,7 +768,7 @@ /*1: Print file and line number of the log; *0: Do not print file and line number of the log*/ #ifndef LV_LOG_USE_FILE_LINE - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_LOG_USE_FILE_LINE #define LV_LOG_USE_FILE_LINE CONFIG_LV_LOG_USE_FILE_LINE #else @@ -782,7 +782,7 @@ /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ #ifndef LV_LOG_TRACE_MEM - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_LOG_TRACE_MEM #define LV_LOG_TRACE_MEM CONFIG_LV_LOG_TRACE_MEM #else @@ -793,7 +793,7 @@ #endif #endif #ifndef LV_LOG_TRACE_TIMER - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_LOG_TRACE_TIMER #define LV_LOG_TRACE_TIMER CONFIG_LV_LOG_TRACE_TIMER #else @@ -804,7 +804,7 @@ #endif #endif #ifndef LV_LOG_TRACE_INDEV - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_LOG_TRACE_INDEV #define LV_LOG_TRACE_INDEV CONFIG_LV_LOG_TRACE_INDEV #else @@ -815,7 +815,7 @@ #endif #endif #ifndef LV_LOG_TRACE_DISP_REFR - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_LOG_TRACE_DISP_REFR #define LV_LOG_TRACE_DISP_REFR CONFIG_LV_LOG_TRACE_DISP_REFR #else @@ -826,7 +826,7 @@ #endif #endif #ifndef LV_LOG_TRACE_EVENT - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_LOG_TRACE_EVENT #define LV_LOG_TRACE_EVENT CONFIG_LV_LOG_TRACE_EVENT #else @@ -837,7 +837,7 @@ #endif #endif #ifndef LV_LOG_TRACE_OBJ_CREATE - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_LOG_TRACE_OBJ_CREATE #define LV_LOG_TRACE_OBJ_CREATE CONFIG_LV_LOG_TRACE_OBJ_CREATE #else @@ -848,7 +848,7 @@ #endif #endif #ifndef LV_LOG_TRACE_LAYOUT - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_LOG_TRACE_LAYOUT #define LV_LOG_TRACE_LAYOUT CONFIG_LV_LOG_TRACE_LAYOUT #else @@ -859,7 +859,7 @@ #endif #endif #ifndef LV_LOG_TRACE_ANIM - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_LOG_TRACE_ANIM #define LV_LOG_TRACE_ANIM CONFIG_LV_LOG_TRACE_ANIM #else @@ -870,7 +870,7 @@ #endif #endif #ifndef LV_LOG_TRACE_CACHE - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_LOG_TRACE_CACHE #define LV_LOG_TRACE_CACHE CONFIG_LV_LOG_TRACE_CACHE #else @@ -890,7 +890,7 @@ /*Enable asserts if an operation is failed or an invalid data is found. *If LV_USE_LOG is enabled an error message will be printed on failure*/ #ifndef LV_USE_ASSERT_NULL - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_ASSERT_NULL #define LV_USE_ASSERT_NULL CONFIG_LV_USE_ASSERT_NULL #else @@ -901,7 +901,7 @@ #endif #endif #ifndef LV_USE_ASSERT_MALLOC - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_ASSERT_MALLOC #define LV_USE_ASSERT_MALLOC CONFIG_LV_USE_ASSERT_MALLOC #else @@ -1080,7 +1080,7 @@ * - lv_obj_free_id: Does nothing, as there is no memory allocation for the ID. * When disabled these functions needs to be implemented by the user.*/ #ifndef LV_USE_OBJ_ID_BUILTIN - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_OBJ_ID_BUILTIN #define LV_USE_OBJ_ID_BUILTIN CONFIG_LV_USE_OBJ_ID_BUILTIN #else @@ -1102,7 +1102,7 @@ /*Enable property name support*/ #ifndef LV_USE_OBJ_PROPERTY_NAME - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_OBJ_PROPERTY_NAME #define LV_USE_OBJ_PROPERTY_NAME CONFIG_LV_USE_OBJ_PROPERTY_NAME #else @@ -1154,7 +1154,7 @@ /*Enable 16 pixels alignment*/ #ifndef LV_VG_LITE_THORVG_16PIXELS_ALIGN - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_VG_LITE_THORVG_16PIXELS_ALIGN #define LV_VG_LITE_THORVG_16PIXELS_ALIGN CONFIG_LV_VG_LITE_THORVG_16PIXELS_ALIGN #else @@ -1227,7 +1227,7 @@ /*Required alignment size for buffers*/ #ifndef LV_ATTRIBUTE_MEM_ALIGN_SIZE - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_ATTRIBUTE_MEM_ALIGN_SIZE #define LV_ATTRIBUTE_MEM_ALIGN_SIZE CONFIG_LV_ATTRIBUTE_MEM_ALIGN_SIZE #else @@ -1341,7 +1341,7 @@ #endif #endif #ifndef LV_FONT_MONTSERRAT_14 - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_FONT_MONTSERRAT_14 #define LV_FONT_MONTSERRAT_14 CONFIG_LV_FONT_MONTSERRAT_14 #else @@ -1559,7 +1559,7 @@ /*Enable drawing placeholders when glyph dsc is not found*/ #ifndef LV_USE_FONT_PLACEHOLDER - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_FONT_PLACEHOLDER #define LV_USE_FONT_PLACEHOLDER CONFIG_LV_USE_FONT_PLACEHOLDER #else @@ -1668,7 +1668,7 @@ /*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ #ifndef LV_WIDGETS_HAS_DEFAULT_VALUE - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_WIDGETS_HAS_DEFAULT_VALUE #define LV_WIDGETS_HAS_DEFAULT_VALUE CONFIG_LV_WIDGETS_HAS_DEFAULT_VALUE #else @@ -1680,7 +1680,7 @@ #endif #ifndef LV_USE_ANIMIMG - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_ANIMIMG #define LV_USE_ANIMIMG CONFIG_LV_USE_ANIMIMG #else @@ -1692,7 +1692,7 @@ #endif #ifndef LV_USE_ARC - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_ARC #define LV_USE_ARC CONFIG_LV_USE_ARC #else @@ -1704,7 +1704,7 @@ #endif #ifndef LV_USE_BAR - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_BAR #define LV_USE_BAR CONFIG_LV_USE_BAR #else @@ -1716,7 +1716,7 @@ #endif #ifndef LV_USE_BUTTON - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_BUTTON #define LV_USE_BUTTON CONFIG_LV_USE_BUTTON #else @@ -1728,7 +1728,7 @@ #endif #ifndef LV_USE_BUTTONMATRIX - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_BUTTONMATRIX #define LV_USE_BUTTONMATRIX CONFIG_LV_USE_BUTTONMATRIX #else @@ -1740,7 +1740,7 @@ #endif #ifndef LV_USE_CALENDAR - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_CALENDAR #define LV_USE_CALENDAR CONFIG_LV_USE_CALENDAR #else @@ -1784,7 +1784,7 @@ #endif #endif #ifndef LV_USE_CALENDAR_HEADER_ARROW - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_CALENDAR_HEADER_ARROW #define LV_USE_CALENDAR_HEADER_ARROW CONFIG_LV_USE_CALENDAR_HEADER_ARROW #else @@ -1795,7 +1795,7 @@ #endif #endif #ifndef LV_USE_CALENDAR_HEADER_DROPDOWN - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_CALENDAR_HEADER_DROPDOWN #define LV_USE_CALENDAR_HEADER_DROPDOWN CONFIG_LV_USE_CALENDAR_HEADER_DROPDOWN #else @@ -1815,7 +1815,7 @@ #endif /*LV_USE_CALENDAR*/ #ifndef LV_USE_CANVAS - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_CANVAS #define LV_USE_CANVAS CONFIG_LV_USE_CANVAS #else @@ -1827,7 +1827,7 @@ #endif #ifndef LV_USE_CHART - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_CHART #define LV_USE_CHART CONFIG_LV_USE_CHART #else @@ -1839,7 +1839,7 @@ #endif #ifndef LV_USE_CHECKBOX - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_CHECKBOX #define LV_USE_CHECKBOX CONFIG_LV_USE_CHECKBOX #else @@ -1851,7 +1851,7 @@ #endif #ifndef LV_USE_DROPDOWN - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_DROPDOWN #define LV_USE_DROPDOWN CONFIG_LV_USE_DROPDOWN #else @@ -1863,7 +1863,7 @@ #endif #ifndef LV_USE_IMAGE - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_IMAGE #define LV_USE_IMAGE CONFIG_LV_USE_IMAGE #else @@ -1875,7 +1875,7 @@ #endif #ifndef LV_USE_IMAGEBUTTON - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_IMAGEBUTTON #define LV_USE_IMAGEBUTTON CONFIG_LV_USE_IMAGEBUTTON #else @@ -1887,7 +1887,7 @@ #endif #ifndef LV_USE_KEYBOARD - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_KEYBOARD #define LV_USE_KEYBOARD CONFIG_LV_USE_KEYBOARD #else @@ -1899,7 +1899,7 @@ #endif #ifndef LV_USE_LABEL - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_LABEL #define LV_USE_LABEL CONFIG_LV_USE_LABEL #else @@ -1911,7 +1911,7 @@ #endif #if LV_USE_LABEL #ifndef LV_LABEL_TEXT_SELECTION - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_LABEL_TEXT_SELECTION #define LV_LABEL_TEXT_SELECTION CONFIG_LV_LABEL_TEXT_SELECTION #else @@ -1922,7 +1922,7 @@ #endif #endif #ifndef LV_LABEL_LONG_TXT_HINT - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_LABEL_LONG_TXT_HINT #define LV_LABEL_LONG_TXT_HINT CONFIG_LV_LABEL_LONG_TXT_HINT #else @@ -1942,7 +1942,7 @@ #endif #ifndef LV_USE_LED - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_LED #define LV_USE_LED CONFIG_LV_USE_LED #else @@ -1954,7 +1954,7 @@ #endif #ifndef LV_USE_LINE - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_LINE #define LV_USE_LINE CONFIG_LV_USE_LINE #else @@ -1966,7 +1966,7 @@ #endif #ifndef LV_USE_LIST - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_LIST #define LV_USE_LIST CONFIG_LV_USE_LIST #else @@ -1986,7 +1986,7 @@ #endif #ifndef LV_USE_MENU - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_MENU #define LV_USE_MENU CONFIG_LV_USE_MENU #else @@ -1998,7 +1998,7 @@ #endif #ifndef LV_USE_MSGBOX - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_MSGBOX #define LV_USE_MSGBOX CONFIG_LV_USE_MSGBOX #else @@ -2010,7 +2010,7 @@ #endif #ifndef LV_USE_ROLLER - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_ROLLER #define LV_USE_ROLLER CONFIG_LV_USE_ROLLER #else @@ -2022,7 +2022,7 @@ #endif #ifndef LV_USE_SCALE - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_SCALE #define LV_USE_SCALE CONFIG_LV_USE_SCALE #else @@ -2034,7 +2034,7 @@ #endif #ifndef LV_USE_SLIDER - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_SLIDER #define LV_USE_SLIDER CONFIG_LV_USE_SLIDER #else @@ -2046,7 +2046,7 @@ #endif #ifndef LV_USE_SPAN - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_SPAN #define LV_USE_SPAN CONFIG_LV_USE_SPAN #else @@ -2068,7 +2068,7 @@ #endif #ifndef LV_USE_SPINBOX - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_SPINBOX #define LV_USE_SPINBOX CONFIG_LV_USE_SPINBOX #else @@ -2080,7 +2080,7 @@ #endif #ifndef LV_USE_SPINNER - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_SPINNER #define LV_USE_SPINNER CONFIG_LV_USE_SPINNER #else @@ -2092,7 +2092,7 @@ #endif #ifndef LV_USE_SWITCH - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_SWITCH #define LV_USE_SWITCH CONFIG_LV_USE_SWITCH #else @@ -2104,7 +2104,7 @@ #endif #ifndef LV_USE_TEXTAREA - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_TEXTAREA #define LV_USE_TEXTAREA CONFIG_LV_USE_TEXTAREA #else @@ -2125,7 +2125,7 @@ #endif #ifndef LV_USE_TABLE - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_TABLE #define LV_USE_TABLE CONFIG_LV_USE_TABLE #else @@ -2137,7 +2137,7 @@ #endif #ifndef LV_USE_TABVIEW - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_TABVIEW #define LV_USE_TABVIEW CONFIG_LV_USE_TABVIEW #else @@ -2149,7 +2149,7 @@ #endif #ifndef LV_USE_TILEVIEW - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_TILEVIEW #define LV_USE_TILEVIEW CONFIG_LV_USE_TILEVIEW #else @@ -2161,7 +2161,7 @@ #endif #ifndef LV_USE_WIN - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_WIN #define LV_USE_WIN CONFIG_LV_USE_WIN #else @@ -2178,7 +2178,7 @@ /*A simple, impressive and very complete theme*/ #ifndef LV_USE_THEME_DEFAULT - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_THEME_DEFAULT #define LV_USE_THEME_DEFAULT CONFIG_LV_USE_THEME_DEFAULT #else @@ -2201,7 +2201,7 @@ /*1: Enable grow on press*/ #ifndef LV_THEME_DEFAULT_GROW - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_THEME_DEFAULT_GROW #define LV_THEME_DEFAULT_GROW CONFIG_LV_THEME_DEFAULT_GROW #else @@ -2224,7 +2224,7 @@ /*A very simple theme that is a good starting point for a custom theme*/ #ifndef LV_USE_THEME_SIMPLE - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_THEME_SIMPLE #define LV_USE_THEME_SIMPLE CONFIG_LV_USE_THEME_SIMPLE #else @@ -2237,7 +2237,7 @@ /*A theme designed for monochrome displays*/ #ifndef LV_USE_THEME_MONO - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_THEME_MONO #define LV_USE_THEME_MONO CONFIG_LV_USE_THEME_MONO #else @@ -2254,7 +2254,7 @@ /*A layout similar to Flexbox in CSS.*/ #ifndef LV_USE_FLEX - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_FLEX #define LV_USE_FLEX CONFIG_LV_USE_FLEX #else @@ -2267,7 +2267,7 @@ /*A layout similar to Grid in CSS.*/ #ifndef LV_USE_GRID - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_GRID #define LV_USE_GRID CONFIG_LV_USE_GRID #else @@ -2816,7 +2816,7 @@ #if LV_USE_PROFILER /*1: Enable the built-in profiler*/ #ifndef LV_USE_PROFILER_BUILTIN - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_PROFILER_BUILTIN #define LV_USE_PROFILER_BUILTIN CONFIG_LV_USE_PROFILER_BUILTIN #else @@ -2921,7 +2921,7 @@ /*1: Enable an observer pattern implementation*/ #ifndef LV_USE_OBSERVER - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_OBSERVER #define LV_USE_OBSERVER CONFIG_LV_USE_OBSERVER #else @@ -2945,7 +2945,7 @@ /*1: Use default thesaurus*/ /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesaurus*/ #ifndef LV_IME_PINYIN_USE_DEFAULT_DICT - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_IME_PINYIN_USE_DEFAULT_DICT #define LV_IME_PINYIN_USE_DEFAULT_DICT CONFIG_LV_IME_PINYIN_USE_DEFAULT_DICT #else @@ -2967,7 +2967,7 @@ /*Use 9 key input(k9)*/ #ifndef LV_IME_PINYIN_USE_K9_MODE - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_IME_PINYIN_USE_K9_MODE #define LV_IME_PINYIN_USE_K9_MODE CONFIG_LV_IME_PINYIN_USE_K9_MODE #else @@ -3009,7 +3009,7 @@ /*Quick access bar, 1:use, 0:not use*/ /*Requires: lv_list*/ #ifndef LV_FILE_EXPLORER_QUICK_ACCESS - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_FILE_EXPLORER_QUICK_ACCESS #define LV_FILE_EXPLORER_QUICK_ACCESS CONFIG_LV_FILE_EXPLORER_QUICK_ACCESS #else @@ -3049,7 +3049,7 @@ #endif #endif #ifndef LV_SDL_BUF_COUNT - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_SDL_BUF_COUNT #define LV_SDL_BUF_COUNT CONFIG_LV_SDL_BUF_COUNT #else @@ -3067,7 +3067,7 @@ #endif #endif #ifndef LV_SDL_DIRECT_EXIT - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_SDL_DIRECT_EXIT #define LV_SDL_DIRECT_EXIT CONFIG_LV_SDL_DIRECT_EXIT #else @@ -3096,7 +3096,7 @@ #endif #if LV_USE_X11 #ifndef LV_X11_DIRECT_EXIT - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_X11_DIRECT_EXIT #define LV_X11_DIRECT_EXIT CONFIG_LV_X11_DIRECT_EXIT #else @@ -3107,7 +3107,7 @@ #endif #endif #ifndef LV_X11_DOUBLE_BUFFER - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_X11_DOUBLE_BUFFER #define LV_X11_DOUBLE_BUFFER CONFIG_LV_X11_DOUBLE_BUFFER #else @@ -3119,7 +3119,7 @@ #endif /*select only 1 of the following render modes (LV_X11_RENDER_MODE_PARTIAL preferred!)*/ #ifndef LV_X11_RENDER_MODE_PARTIAL - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_X11_RENDER_MODE_PARTIAL #define LV_X11_RENDER_MODE_PARTIAL CONFIG_LV_X11_RENDER_MODE_PARTIAL #else @@ -3378,7 +3378,7 @@ #endif #if LV_USE_OPENGLES #ifndef LV_USE_OPENGLES_DEBUG - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_USE_OPENGLES_DEBUG #define LV_USE_OPENGLES_DEBUG CONFIG_LV_USE_OPENGLES_DEBUG #else @@ -3400,7 +3400,7 @@ #endif #if LV_USE_QNX #ifndef LV_QNX_BUF_COUNT - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_QNX_BUF_COUNT #define LV_QNX_BUF_COUNT CONFIG_LV_QNX_BUF_COUNT #else @@ -3418,7 +3418,7 @@ /*Enable the examples to be built with the library*/ #ifndef LV_BUILD_EXAMPLES - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_BUILD_EXAMPLES #define LV_BUILD_EXAMPLES CONFIG_LV_BUILD_EXAMPLES #else @@ -3581,7 +3581,7 @@ LV_EXPORT_CONST_INT(LV_DRAW_BUF_STRIDE_ALIGN); LV_EXPORT_CONST_INT(LV_DRAW_BUF_ALIGN); #endif -#undef _LV_KCONFIG_PRESENT +#undef LV_KCONFIG_PRESENT /*Set some defines if a dependency is disabled*/ #if LV_USE_LOG == 0 diff --git a/src/lv_init.c b/src/lv_init.c index 53e090245..26897a7bc 100644 --- a/src/lv_init.c +++ b/src/lv_init.c @@ -6,11 +6,21 @@ /********************* * INCLUDES *********************/ +#include "others/sysmon/lv_sysmon_private.h" +#include "misc/lv_timer_private.h" +#include "misc/lv_profiler_builtin_private.h" +#include "misc/lv_anim_private.h" +#include "draw/lv_image_decoder_private.h" +#include "draw/lv_draw_buf_private.h" +#include "core/lv_refr_private.h" +#include "core/lv_obj_style_private.h" +#include "core/lv_group_private.h" +#include "lv_init.h" #include "core/lv_global.h" #include "core/lv_obj.h" #include "display/lv_display_private.h" #include "indev/lv_indev_private.h" -#include "layouts/lv_layout.h" +#include "layouts/lv_layout_private.h" #include "libs/bin_decoder/lv_bin_decoder.h" #include "libs/bmp/lv_bmp.h" #include "libs/ffmpeg/lv_ffmpeg.h" @@ -21,8 +31,12 @@ #include "libs/libjpeg_turbo/lv_libjpeg_turbo.h" #include "libs/lodepng/lv_lodepng.h" #include "libs/libpng/lv_libpng.h" +#include "libs/tiny_ttf/lv_tiny_ttf.h" #include "draw/lv_draw.h" #include "misc/lv_async.h" +#include "misc/lv_fs_private.h" +#include "widgets/span/lv_span.h" +#include "themes/simple/lv_theme_simple.h" #include "misc/lv_fs.h" #include "osal/lv_os_private.h" @@ -88,14 +102,14 @@ static inline void lv_global_init(lv_global_t * global) lv_memzero(global, sizeof(lv_global_t)); - _lv_ll_init(&(global->disp_ll), sizeof(lv_display_t)); - _lv_ll_init(&(global->indev_ll), sizeof(lv_indev_t)); + lv_ll_init(&(global->disp_ll), sizeof(lv_display_t)); + lv_ll_init(&(global->indev_ll), sizeof(lv_indev_t)); global->memory_zero = ZERO_MEM_SENTINEL; global->style_refresh = true; - global->layout_count = _LV_LAYOUT_LAST; - global->style_last_custom_prop_id = (uint32_t)_LV_STYLE_LAST_BUILT_IN_PROP; - global->event_last_register_id = _LV_EVENT_LAST; + global->layout_count = LV_LAYOUT_LAST; + global->style_last_custom_prop_id = (uint32_t)LV_STYLE_LAST_BUILT_IN_PROP; + global->event_last_register_id = LV_EVENT_LAST; lv_rand_set_seed(0x1234ABCD); #ifdef LV_LOG_PRINT_CB @@ -109,14 +123,14 @@ static inline void lv_global_init(lv_global_t * global) #endif } -static inline void _lv_cleanup_devices(lv_global_t * global) +static inline void lv_cleanup_devices(lv_global_t * global) { LV_ASSERT_NULL(global); if(global) { /* cleanup indev and display */ - _lv_ll_clear_custom(&(global->indev_ll), (void (*)(void *)) lv_indev_delete); - _lv_ll_clear_custom(&(global->disp_ll), (void (*)(void *)) lv_display_delete); + lv_ll_clear_custom(&(global->indev_ll), (void (*)(void *)) lv_indev_delete); + lv_ll_clear_custom(&(global->disp_ll), (void (*)(void *)) lv_display_delete); } } @@ -150,7 +164,7 @@ void lv_init(void) lv_mem_init(); - _lv_draw_buf_init_handlers(); + lv_draw_buf_init_handlers(); #if LV_USE_SPAN != 0 lv_span_stack_init(); @@ -164,15 +178,15 @@ void lv_init(void) lv_os_init(); - _lv_timer_core_init(); + lv_timer_core_init(); - _lv_fs_init(); + lv_fs_init(); - _lv_layout_init(); + lv_layout_init(); - _lv_anim_core_init(); + lv_anim_core_init(); - _lv_group_init(); + lv_group_init(); lv_draw_init(); @@ -200,16 +214,16 @@ void lv_init(void) lv_windows_platform_init(); #endif - _lv_obj_style_init(); + lv_obj_style_init(); /*Initialize the screen refresh system*/ - _lv_refr_init(); + lv_refr_init(); #if LV_USE_SYSMON - _lv_sysmon_builtin_init(); + lv_sysmon_builtin_init(); #endif - _lv_image_decoder_init(LV_CACHE_DEF_SIZE, LV_IMAGE_HEADER_CACHE_DEF_CNT); + lv_image_decoder_init(LV_CACHE_DEF_SIZE, LV_IMAGE_HEADER_CACHE_DEF_CNT); lv_bin_decoder_init(); /*LVGL built-in binary image decoder*/ #if LV_USE_DRAW_VG_LITE @@ -334,12 +348,12 @@ void lv_deinit(void) lv_deinit_in_progress = true; #if LV_USE_SYSMON - _lv_sysmon_builtin_deinit(); + lv_sysmon_builtin_deinit(); #endif lv_display_set_default(NULL); - _lv_cleanup_devices(LV_GLOBAL_DEFAULT()); + lv_cleanup_devices(LV_GLOBAL_DEFAULT()); #if LV_USE_SPAN != 0 lv_span_stack_deinit(); @@ -365,11 +379,11 @@ void lv_deinit(void) lv_theme_mono_deinit(); #endif - _lv_image_decoder_deinit(); + lv_image_decoder_deinit(); - _lv_refr_deinit(); + lv_refr_deinit(); - _lv_obj_style_deinit(); + lv_obj_style_deinit(); #if LV_USE_DRAW_PXP lv_draw_pxp_deinit(); @@ -389,15 +403,15 @@ void lv_deinit(void) lv_draw_deinit(); - _lv_group_deinit(); + lv_group_deinit(); - _lv_anim_core_deinit(); + lv_anim_core_deinit(); - _lv_layout_deinit(); + lv_layout_deinit(); - _lv_fs_deinit(); + lv_fs_deinit(); - _lv_timer_core_deinit(); + lv_timer_core_deinit(); #if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN lv_profiler_builtin_uninit(); diff --git a/src/lvgl_private.h b/src/lvgl_private.h index 96c29aa34..cda92217b 100644 --- a/src/lvgl_private.h +++ b/src/lvgl_private.h @@ -13,11 +13,95 @@ extern "C" { /********************* * INCLUDES *********************/ +#include "core/lv_global.h" + #include "display/lv_display_private.h" #include "indev/lv_indev_private.h" #include "misc/lv_text_private.h" #include "misc/cache/lv_cache_entry_private.h" #include "misc/cache/lv_cache_private.h" +#include "layouts/lv_layout_private.h" +#include "stdlib/lv_mem_private.h" +#include "others/file_explorer/lv_file_explorer_private.h" +#include "others/sysmon/lv_sysmon_private.h" +#include "others/monkey/lv_monkey_private.h" +#include "others/ime/lv_ime_pinyin_private.h" +#include "others/fragment/lv_fragment_private.h" +#include "others/observer/lv_observer_private.h" +#include "libs/qrcode/lv_qrcode_private.h" +#include "libs/barcode/lv_barcode_private.h" +#include "libs/gif/lv_gif_private.h" +#include "draw/lv_draw_triangle_private.h" +#include "draw/lv_draw_private.h" +#include "draw/lv_draw_rect_private.h" +#include "draw/lv_draw_image_private.h" +#include "draw/lv_image_decoder_private.h" +#include "draw/lv_draw_label_private.h" +#include "draw/lv_draw_vector_private.h" +#include "draw/lv_draw_buf_private.h" +#include "draw/lv_draw_mask_private.h" +#include "draw/sw/lv_draw_sw_gradient_private.h" +#include "draw/sw/lv_draw_sw_private.h" +#include "draw/sw/lv_draw_sw_mask_private.h" +#include "draw/sw/blend/lv_draw_sw_blend_private.h" +#include "drivers/libinput/lv_xkb_private.h" +#include "drivers/libinput/lv_libinput_private.h" +#include "font/lv_font_fmt_txt_private.h" +#include "themes/lv_theme_private.h" +#include "core/lv_refr_private.h" +#include "core/lv_obj_style_private.h" +#include "core/lv_obj_private.h" +#include "core/lv_obj_scroll_private.h" +#include "core/lv_obj_draw_private.h" +#include "core/lv_obj_class_private.h" +#include "core/lv_group_private.h" +#include "core/lv_obj_event_private.h" +#include "misc/lv_timer_private.h" +#include "misc/lv_area_private.h" +#include "misc/lv_fs_private.h" +#include "misc/lv_profiler_builtin_private.h" +#include "misc/lv_event_private.h" +#include "misc/lv_bidi_private.h" +#include "misc/lv_rb_private.h" +#include "misc/lv_style_private.h" +#include "misc/lv_color_op_private.h" +#include "misc/lv_anim_private.h" +#include "widgets/msgbox/lv_msgbox_private.h" +#include "widgets/buttonmatrix/lv_buttonmatrix_private.h" +#include "widgets/slider/lv_slider_private.h" +#include "widgets/switch/lv_switch_private.h" +#include "widgets/calendar/lv_calendar_chinese_private.h" +#include "widgets/calendar/lv_calendar_private.h" +#include "widgets/imagebutton/lv_imagebutton_private.h" +#include "widgets/bar/lv_bar_private.h" +#include "widgets/image/lv_image_private.h" +#include "widgets/textarea/lv_textarea_private.h" +#include "widgets/table/lv_table_private.h" +#include "widgets/checkbox/lv_checkbox_private.h" +#include "widgets/roller/lv_roller_private.h" +#include "widgets/win/lv_win_private.h" +#include "widgets/keyboard/lv_keyboard_private.h" +#include "widgets/line/lv_line_private.h" +#include "widgets/animimage/lv_animimage_private.h" +#include "widgets/dropdown/lv_dropdown_private.h" +#include "widgets/menu/lv_menu_private.h" +#include "widgets/chart/lv_chart_private.h" +#include "widgets/button/lv_button_private.h" +#include "widgets/scale/lv_scale_private.h" +#include "widgets/led/lv_led_private.h" +#include "widgets/arc/lv_arc_private.h" +#include "widgets/tileview/lv_tileview_private.h" +#include "widgets/spinbox/lv_spinbox_private.h" +#include "widgets/span/lv_span_private.h" +#include "widgets/label/lv_label_private.h" +#include "widgets/canvas/lv_canvas_private.h" +#include "widgets/tabview/lv_tabview_private.h" +#include "tick/lv_tick_private.h" +#include "stdlib/builtin/lv_tlsf_private.h" +#include "libs/rlottie/lv_rlottie_private.h" +#include "libs/ffmpeg/lv_ffmpeg_private.h" +#include "widgets/lottie/lv_lottie_private.h" +#include "osal/lv_os_private.h" /********************* * DEFINES diff --git a/src/misc/cache/lv_cache.h b/src/misc/cache/lv_cache.h index 20dfb1658..a52d70a4f 100644 --- a/src/misc/cache/lv_cache.h +++ b/src/misc/cache/lv_cache.h @@ -17,7 +17,7 @@ extern "C" { #include "lv_cache_private.h" #include "../lv_types.h" -#include "_lv_cache_lru_rb.h" +#include "lv_cache_lru_rb.h" #include "lv_image_cache.h" #include "lv_image_header_cache.h" diff --git a/src/misc/cache/lv_cache_entry.c b/src/misc/cache/lv_cache_entry.c index 242e1a0f2..e0cc66434 100644 --- a/src/misc/cache/lv_cache_entry.c +++ b/src/misc/cache/lv_cache_entry.c @@ -19,7 +19,7 @@ /********************** * TYPEDEFS **********************/ -struct _lv_cache_entry_t { +struct lv_cache_entry_t { const lv_cache_t * cache; int32_t ref_cnt; uint32_t node_size; diff --git a/src/misc/cache/_lv_cache_lru_rb.c b/src/misc/cache/lv_cache_lru_rb.c similarity index 96% rename from src/misc/cache/_lv_cache_lru_rb.c rename to src/misc/cache/lv_cache_lru_rb.c index cc5bb08ff..0a73102d1 100644 --- a/src/misc/cache/_lv_cache_lru_rb.c +++ b/src/misc/cache/lv_cache_lru_rb.c @@ -1,5 +1,5 @@ /** -* @file _lv_cache_lru_rb.c +* @file lv_cache_lru_rb.c * */ @@ -43,11 +43,11 @@ /********************* * INCLUDES *********************/ -#include "_lv_cache_lru_rb.h" +#include "lv_cache_lru_rb.h" #include "../../stdlib/lv_sprintf.h" #include "../../stdlib/lv_string.h" #include "../lv_ll.h" -#include "../lv_rb.h" +#include "../lv_rb_private.h" /********************* * DEFINES @@ -58,7 +58,7 @@ **********************/ typedef uint32_t (get_data_size_cb_t)(const void * data); -struct _lv_lru_rb_t { +struct lv_lru_rb_t { lv_cache_t cache; lv_rb_t rb; @@ -66,7 +66,7 @@ struct _lv_lru_rb_t { get_data_size_cb_t * get_data_size_cb; }; -typedef struct _lv_lru_rb_t lv_lru_rb_t_; +typedef struct lv_lru_rb_t lv_lru_rb_t_; /********************** * STATIC PROTOTYPES **********************/ @@ -155,7 +155,7 @@ static void * alloc_new_node(lv_lru_rb_t_ * lru, void * key, void * user_data) lv_cache_entry_t * entry = lv_cache_entry_get_entry(data, lru->cache.node_size); lv_memcpy(data, key, lru->cache.node_size); - void * lru_node = _lv_ll_ins_head(&lru->ll); + void * lru_node = lv_ll_ins_head(&lru->ll); if(lru_node == NULL) goto FAILED_HANDLER1; @@ -206,7 +206,7 @@ static bool init_cnt_cb(lv_cache_t * cache) if(!lv_rb_init(&lru->rb, lru->cache.ops.compare_cb, lv_cache_entry_get_size(lru->cache.node_size) + sizeof(void *))) { return false; } - _lv_ll_init(&lru->ll, sizeof(void *)); + lv_ll_init(&lru->ll, sizeof(void *)); lru->get_data_size_cb = cnt_get_data_size_cb; @@ -229,7 +229,7 @@ static bool init_size_cb(lv_cache_t * cache) if(!lv_rb_init(&lru->rb, lru->cache.ops.compare_cb, lv_cache_entry_get_size(lru->cache.node_size) + sizeof(void *))) { return false; } - _lv_ll_init(&lru->ll, sizeof(void *)); + lv_ll_init(&lru->ll, sizeof(void *)); lru->get_data_size_cb = size_get_data_size_cb; @@ -265,7 +265,7 @@ static lv_cache_entry_t * get_cb(lv_cache_t * cache, const void * key, void * us } /*try the first ll node first*/ - void * head = _lv_ll_get_head(&lru->ll); + void * head = lv_ll_get_head(&lru->ll); if(head) { lv_rb_node_t * node = *(lv_rb_node_t **)head; void * data = node->data; @@ -279,8 +279,8 @@ static lv_cache_entry_t * get_cb(lv_cache_t * cache, const void * key, void * us /*cache hit*/ if(node) { void * lru_node = *get_lru_node(lru, node); - head = _lv_ll_get_head(&lru->ll); - _lv_ll_move_before(&lru->ll, lru_node, head); + head = lv_ll_get_head(&lru->ll); + lv_ll_move_before(&lru->ll, lru_node, head); lv_cache_entry_t * entry = lv_cache_entry_get_entry(node->data, cache->node_size); return entry; @@ -334,7 +334,7 @@ static void remove_cb(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_ void * lru_node = *get_lru_node(lru, node); lv_rb_remove_node(&lru->rb, node); - _lv_ll_remove(&lru->ll, lru_node); + lv_ll_remove(&lru->ll, lru_node); lv_free(lru_node); cache->size -= lru->get_data_size_cb(data); @@ -367,7 +367,7 @@ static void drop_cb(lv_cache_t * cache, const void * key, void * user_data) lv_rb_remove_node(&lru->rb, node); lv_cache_entry_delete(entry); - _lv_ll_remove(&lru->ll, lru_node); + lv_ll_remove(&lru->ll, lru_node); lv_free(lru_node); } @@ -383,7 +383,7 @@ static void drop_all_cb(lv_cache_t * cache, void * user_data) uint32_t used_cnt = 0; lv_rb_node_t ** node; - _LV_LL_READ(&lru->ll, node) { + LV_LL_READ(&lru->ll, node) { /*free user handled data and do other clean up*/ void * search_key = (*node)->data; lv_cache_entry_t * entry = lv_cache_entry_get_entry(search_key, cache->node_size); @@ -400,7 +400,7 @@ static void drop_all_cb(lv_cache_t * cache, void * user_data) } lv_rb_destroy(&lru->rb); - _lv_ll_clear(&lru->ll); + lv_ll_clear(&lru->ll); cache->size = 0; } @@ -414,7 +414,7 @@ static lv_cache_entry_t * get_victim_cb(lv_cache_t * cache, void * user_data) LV_ASSERT_NULL(lru); lv_rb_node_t ** tail; - _LV_LL_READ_BACK(&lru->ll, tail) { + LV_LL_READ_BACK(&lru->ll, tail) { lv_rb_node_t * tail_node = *tail; lv_cache_entry_t * entry = lv_cache_entry_get_entry(tail_node->data, cache->node_size); if(lv_cache_entry_get_ref(entry) == 0) { diff --git a/src/misc/cache/_lv_cache_lru_rb.h b/src/misc/cache/lv_cache_lru_rb.h similarity index 96% rename from src/misc/cache/_lv_cache_lru_rb.h rename to src/misc/cache/lv_cache_lru_rb.h index a27110b94..c0f44f396 100644 --- a/src/misc/cache/_lv_cache_lru_rb.h +++ b/src/misc/cache/lv_cache_lru_rb.h @@ -1,5 +1,5 @@ /** -* @file _lv_cache_lru_rb.h +* @file lv_cache_lru_rb.h * */ diff --git a/src/misc/cache/lv_cache_private.h b/src/misc/cache/lv_cache_private.h index 0bb8afe61..aac1a9687 100644 --- a/src/misc/cache/lv_cache_private.h +++ b/src/misc/cache/lv_cache_private.h @@ -34,15 +34,15 @@ typedef enum { LV_CACHE_RESERVE_COND_ERROR /**< An error occurred while checking the condition */ } lv_cache_reserve_cond_res_t; -struct _lv_cache_ops_t; -struct _lv_cache_t; -struct _lv_cache_class_t; -struct _lv_cache_entry_t; +struct lv_cache_ops_t; +struct lv_cache_t; +struct lv_cache_class_t; +struct lv_cache_entry_t; -typedef struct _lv_cache_ops_t lv_cache_ops_t; -typedef struct _lv_cache_t lv_cache_t; -typedef struct _lv_cache_class_t lv_cache_class_t; -typedef struct _lv_cache_entry_t lv_cache_entry_t; +typedef struct lv_cache_ops_t lv_cache_ops_t; +typedef struct lv_cache_t lv_cache_t; +typedef struct lv_cache_class_t lv_cache_class_t; +typedef struct lv_cache_entry_t lv_cache_entry_t; typedef int8_t lv_cache_compare_res_t; typedef bool (*lv_cache_create_cb_t)(void * node, void * user_data); @@ -110,7 +110,7 @@ typedef lv_cache_reserve_cond_res_t (*lv_cache_reserve_cond_cb)(lv_cache_t * cac /** * The cache operations struct */ -struct _lv_cache_ops_t { +struct lv_cache_ops_t { lv_cache_compare_cb_t compare_cb; /**< Compare function for keys */ lv_cache_create_cb_t create_cb; /**< Create function for nodes */ lv_cache_free_cb_t free_cb; /**< Free function for nodes */ @@ -119,7 +119,7 @@ struct _lv_cache_ops_t { /** * The cache entry struct */ -struct _lv_cache_t { +struct lv_cache_t { const lv_cache_class_t * clz; /**< The cache class. There are two built-in classes: * @lv_cache_class_lru_rb_count for LRU-based cache with count-based eviction policy. * @lv_cache_class_lru_rb_size for LRU-based cache with size-based eviction policy. */ @@ -141,7 +141,7 @@ struct _lv_cache_t { * @lv_cache_class_lru_rb_count for LRU-based cache with count-based eviction policy. * @lv_cache_class_lru_rb_size for LRU-based cache with size-based eviction policy. */ -struct _lv_cache_class_t { +struct lv_cache_class_t { lv_cache_alloc_cb_t alloc_cb; /**< The allocation function for cache entries */ lv_cache_init_cb_t init_cb; /**< The initialization function for cache entries */ lv_cache_destroy_cb_t destroy_cb; /**< The destruction function for cache entries */ @@ -159,16 +159,16 @@ struct _lv_cache_class_t { * Cache entry slot *----------------*/ -struct _lv_cache_slot_size_t; +struct lv_cache_slot_size_t; -typedef struct _lv_cache_slot_size_t lv_cache_slot_size_t; +typedef struct lv_cache_slot_size_t lv_cache_slot_size_t; /** * The cache entry slot struct * To add new fields to the cache entry, add them to a new struct and add it to the first field of the cache data struct. * And this one is a size slot for the cache entry. */ -struct _lv_cache_slot_size_t { +struct lv_cache_slot_size_t { size_t size; }; /********************** diff --git a/src/misc/cache/lv_image_cache.c b/src/misc/cache/lv_image_cache.c index 00697977e..91af55766 100644 --- a/src/misc/cache/lv_image_cache.c +++ b/src/misc/cache/lv_image_cache.c @@ -7,6 +7,7 @@ * INCLUDES *********************/ +#include "../../draw/lv_image_decoder_private.h" #include "../lv_assert.h" #include "../../core/lv_global.h" diff --git a/src/misc/cache/lv_image_header_cache.c b/src/misc/cache/lv_image_header_cache.c index d5e5f3aa2..ef124fb0a 100644 --- a/src/misc/cache/lv_image_header_cache.c +++ b/src/misc/cache/lv_image_header_cache.c @@ -7,6 +7,7 @@ * INCLUDES *********************/ +#include "../../draw/lv_image_decoder_private.h" #include "../lv_assert.h" #include "../../core/lv_global.h" diff --git a/src/misc/lv_anim.c b/src/misc/lv_anim.c index 9e7db92b1..0e57f2435 100644 --- a/src/misc/lv_anim.c +++ b/src/misc/lv_anim.c @@ -6,7 +6,7 @@ /********************* * INCLUDES *********************/ -#include "lv_anim.h" +#include "lv_anim_private.h" #include "../core/lv_global.h" #include "../tick/lv_tick.h" @@ -58,16 +58,16 @@ static void remove_anim(void * a); * GLOBAL FUNCTIONS **********************/ -void _lv_anim_core_init(void) +void lv_anim_core_init(void) { - _lv_ll_init(anim_ll_p, sizeof(lv_anim_t)); + lv_ll_init(anim_ll_p, sizeof(lv_anim_t)); state.timer = lv_timer_create(anim_timer, LV_DEF_REFR_PERIOD, NULL); anim_mark_list_change(); /*Turn off the animation timer*/ state.anim_list_changed = false; state.anim_run_round = false; } -void _lv_anim_core_deinit(void) +void lv_anim_core_deinit(void) { lv_anim_delete_all(); } @@ -88,7 +88,7 @@ lv_anim_t * lv_anim_start(const lv_anim_t * a) LV_TRACE_ANIM("begin"); /*Add the new animation to the animation linked list*/ - lv_anim_t * new_anim = _lv_ll_ins_head(anim_ll_p); + lv_anim_t * new_anim = lv_ll_ins_head(anim_ll_p); LV_ASSERT_MALLOC(new_anim); if(new_anim == NULL) return NULL; @@ -146,7 +146,7 @@ bool lv_anim_delete(void * var, lv_anim_exec_xcb_t exec_cb) { lv_anim_t * a; bool del_any = false; - a = _lv_ll_get_head(anim_ll_p); + a = lv_ll_get_head(anim_ll_p); while(a != NULL) { bool del = false; if((a->var == var || var == NULL) && (a->exec_cb == exec_cb || exec_cb == NULL)) { @@ -159,7 +159,7 @@ bool lv_anim_delete(void * var, lv_anim_exec_xcb_t exec_cb) /*Always start from the head on delete, because we don't know *how `anim_ll_p` was changes in `a->deleted_cb` */ - a = del ? _lv_ll_get_head(anim_ll_p) : _lv_ll_get_next(anim_ll_p, a); + a = del ? lv_ll_get_head(anim_ll_p) : lv_ll_get_next(anim_ll_p, a); } return del_any; @@ -167,14 +167,14 @@ bool lv_anim_delete(void * var, lv_anim_exec_xcb_t exec_cb) void lv_anim_delete_all(void) { - _lv_ll_clear_custom(anim_ll_p, remove_anim); + lv_ll_clear_custom(anim_ll_p, remove_anim); anim_mark_list_change(); } lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb) { lv_anim_t * a; - _LV_LL_READ(anim_ll_p, a) { + LV_LL_READ(anim_ll_p, a) { if(a->var == var && (a->exec_cb == exec_cb || exec_cb == NULL)) { return a; } @@ -192,7 +192,7 @@ uint16_t lv_anim_count_running(void) { uint16_t cnt = 0; lv_anim_t * a; - _LV_LL_READ(anim_ll_p, a) cnt++; + LV_LL_READ(anim_ll_p, a) cnt++; return cnt; } @@ -342,10 +342,147 @@ int32_t lv_anim_path_step(const lv_anim_t * a) int32_t lv_anim_path_custom_bezier3(const lv_anim_t * a) { - const struct _lv_anim_bezier3_para_t * para = &a->parameter.bezier3; + const lv_anim_bezier3_para_t * para = &a->parameter.bezier3; return lv_anim_path_cubic_bezier(a, para->x1, para->y1, para->x2, para->y2); } +void lv_anim_set_var(lv_anim_t * a, void * var) +{ + a->var = var; +} + +void lv_anim_set_exec_cb(lv_anim_t * a, lv_anim_exec_xcb_t exec_cb) +{ + a->exec_cb = exec_cb; +} + +void lv_anim_set_duration(lv_anim_t * a, uint32_t duration) +{ + a->duration = duration; +} + +void lv_anim_set_time(lv_anim_t * a, uint32_t duration) +{ + lv_anim_set_duration(a, duration); +} + +void lv_anim_set_delay(lv_anim_t * a, uint32_t delay) +{ + a->act_time = -(int32_t)(delay); +} + +void lv_anim_set_values(lv_anim_t * a, int32_t start, int32_t end) +{ + a->start_value = start; + a->current_value = INT32_MIN; + a->end_value = end; +} + +void lv_anim_set_custom_exec_cb(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) +{ + a->custom_exec_cb = exec_cb; +} + +void lv_anim_set_path_cb(lv_anim_t * a, lv_anim_path_cb_t path_cb) +{ + a->path_cb = path_cb; +} + +void lv_anim_set_start_cb(lv_anim_t * a, lv_anim_start_cb_t start_cb) +{ + a->start_cb = start_cb; +} + +void lv_anim_set_get_value_cb(lv_anim_t * a, lv_anim_get_value_cb_t get_value_cb) +{ + a->get_value_cb = get_value_cb; +} + +void lv_anim_set_completed_cb(lv_anim_t * a, lv_anim_completed_cb_t completed_cb) +{ + a->completed_cb = completed_cb; +} + +void lv_anim_set_deleted_cb(lv_anim_t * a, lv_anim_deleted_cb_t deleted_cb) +{ + a->deleted_cb = deleted_cb; +} + +void lv_anim_set_playback_duration(lv_anim_t * a, uint32_t duration) +{ + a->playback_duration = duration; +} + +void lv_anim_set_playback_time(lv_anim_t * a, uint32_t duration) +{ + lv_anim_set_playback_duration(a, duration); +} + +void lv_anim_set_playback_delay(lv_anim_t * a, uint32_t delay) +{ + a->playback_delay = delay; +} + +void lv_anim_set_repeat_count(lv_anim_t * a, uint32_t cnt) +{ + a->repeat_cnt = cnt; +} + +void lv_anim_set_repeat_delay(lv_anim_t * a, uint32_t delay) +{ + a->repeat_delay = delay; +} + +void lv_anim_set_early_apply(lv_anim_t * a, bool en) +{ + a->early_apply = en; +} + +void lv_anim_set_user_data(lv_anim_t * a, void * user_data) +{ + a->user_data = user_data; +} + +void lv_anim_set_bezier3_param(lv_anim_t * a, int16_t x1, int16_t y1, int16_t x2, int16_t y2) +{ + lv_anim_bezier3_para_t * para = &a->parameter.bezier3; + + para->x1 = x1; + para->x2 = x2; + para->y1 = y1; + para->y2 = y2; +} + +uint32_t lv_anim_get_delay(const lv_anim_t * a) +{ + return -a->act_time; +} + +uint32_t lv_anim_get_time(const lv_anim_t * a) +{ + return a->duration; +} + +uint32_t lv_anim_get_repeat_count(const lv_anim_t * a) +{ + return a->repeat_cnt; +} + +void * lv_anim_get_user_data(const lv_anim_t * a) +{ + return a->user_data; +} + +bool lv_anim_custom_delete(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) +{ + return lv_anim_delete(a ? a->var : NULL, (lv_anim_exec_xcb_t)exec_cb); +} + +lv_anim_t * lv_anim_custom_get(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) +{ + return lv_anim_get(a ? a->var : NULL, (lv_anim_exec_xcb_t)exec_cb); +} + /********************** * STATIC FUNCTIONS **********************/ @@ -360,7 +497,7 @@ static void anim_timer(lv_timer_t * param) /*Flip the run round*/ state.anim_run_round = state.anim_run_round ? false : true; - lv_anim_t * a = _lv_ll_get_head(anim_ll_p); + lv_anim_t * a = lv_ll_get_head(anim_ll_p); while(a != NULL) { uint32_t elaps = lv_tick_elaps(a->last_timer_run); @@ -418,9 +555,9 @@ static void anim_timer(lv_timer_t * param) /*If the linked list changed due to anim. delete then it's not safe to continue *the reading of the list from here -> start from the head*/ if(state.anim_list_changed) - a = _lv_ll_get_head(anim_ll_p); + a = lv_ll_get_head(anim_ll_p); else - a = _lv_ll_get_next(anim_ll_p, a); + a = lv_ll_get_next(anim_ll_p, a); } } @@ -444,7 +581,7 @@ static void anim_completed_handler(lv_anim_t * a) /*Delete the animation from the list. * This way the `completed_cb` will see the animations like it's animation is already deleted*/ - _lv_ll_remove(anim_ll_p, a); + lv_ll_remove(anim_ll_p, a); /*Flag that the list has changed*/ anim_mark_list_change(); @@ -478,7 +615,7 @@ static void anim_completed_handler(lv_anim_t * a) static void anim_mark_list_change(void) { state.anim_list_changed = true; - if(_lv_ll_get_head(anim_ll_p) == NULL) + if(lv_ll_get_head(anim_ll_p) == NULL) lv_timer_pause(state.timer); else lv_timer_resume(state.timer); @@ -532,7 +669,7 @@ static bool remove_concurrent_anims(lv_anim_t * a_current) lv_anim_t * a; bool del_any = false; - a = _lv_ll_get_head(anim_ll_p); + a = lv_ll_get_head(anim_ll_p); while(a != NULL) { bool del = false; /*We can't test for custom_exec_cb equality because in the MicroPython binding @@ -543,7 +680,7 @@ static bool remove_concurrent_anims(lv_anim_t * a_current) (a->var == a_current->var) && ((a->exec_cb && a->exec_cb == a_current->exec_cb) /*|| (a->custom_exec_cb && a->custom_exec_cb == a_current->custom_exec_cb)*/)) { - _lv_ll_remove(anim_ll_p, a); + lv_ll_remove(anim_ll_p, a); if(a->deleted_cb != NULL) a->deleted_cb(a); lv_free(a); /*Read by `anim_timer`. It need to know if a delete occurred in the linked list*/ @@ -555,7 +692,7 @@ static bool remove_concurrent_anims(lv_anim_t * a_current) /*Always start from the head on delete, because we don't know *how `anim_ll_p` was changes in `a->deleted_cb` */ - a = del ? _lv_ll_get_head(anim_ll_p) : _lv_ll_get_next(anim_ll_p, a); + a = del ? lv_ll_get_head(anim_ll_p) : lv_ll_get_next(anim_ll_p, a); } return del_any; @@ -564,7 +701,7 @@ static bool remove_concurrent_anims(lv_anim_t * a_current) static void remove_anim(void * a) { lv_anim_t * anim = a; - _lv_ll_remove(anim_ll_p, a); + lv_ll_remove(anim_ll_p, a); if(anim->deleted_cb != NULL) anim->deleted_cb(anim); lv_free(a); } diff --git a/src/misc/lv_anim.h b/src/misc/lv_anim.h index d83e800cb..bcc08b545 100644 --- a/src/misc/lv_anim.h +++ b/src/misc/lv_anim.h @@ -42,7 +42,7 @@ extern "C" { */ #define _PARA(a, x1, y1, x2, y2) ((a)->parameter.bezier3 = \ -(struct _lv_anim_bezier3_para_t) { \ +(lv_anim_bezier3_para_t) { \ LV_BEZIER_VAL_FLOAT(x1), LV_BEZIER_VAL_FLOAT(y1), \ LV_BEZIER_VAL_FLOAT(x2), LV_BEZIER_VAL_FLOAT(y2) } \ ) @@ -85,13 +85,6 @@ typedef enum { LV_ANIM_ON, } lv_anim_enable_t; -typedef struct { - bool anim_list_changed; - bool anim_run_round; - lv_timer_t * timer; - lv_ll_t anim_ll; -} lv_anim_state_t; - /** Get the current value during an animation*/ typedef int32_t (*lv_anim_path_cb_t)(const lv_anim_t *); @@ -119,7 +112,7 @@ typedef int32_t (*lv_anim_get_value_cb_t)(lv_anim_t *); /** Callback used when the animation is deleted*/ typedef void (*lv_anim_deleted_cb_t)(lv_anim_t *); -typedef struct _lv_anim_bezier3_para_t { +typedef struct { int16_t x1; int16_t y1; int16_t x2; @@ -127,7 +120,7 @@ typedef struct _lv_anim_bezier3_para_t { } lv_anim_bezier3_para_t; /**< Parameter used when path is custom_bezier*/ /** Describes an animation*/ -struct _lv_anim_t { +struct lv_anim_t { void * var; /**var = var; -} +void lv_anim_set_var(lv_anim_t * a, void * var); /** * Set a function to animate `var` @@ -201,38 +181,26 @@ static inline void lv_anim_set_var(lv_anim_t * a, void * var) * LVGL's built-in functions can be used. * E.g. lv_obj_set_x */ -static inline void lv_anim_set_exec_cb(lv_anim_t * a, lv_anim_exec_xcb_t exec_cb) -{ - a->exec_cb = exec_cb; -} +void lv_anim_set_exec_cb(lv_anim_t * a, lv_anim_exec_xcb_t exec_cb); /** * Set the duration of an animation * @param a pointer to an initialized `lv_anim_t` variable * @param duration duration of the animation in milliseconds */ -static inline void lv_anim_set_duration(lv_anim_t * a, uint32_t duration) -{ - a->duration = duration; -} +void lv_anim_set_duration(lv_anim_t * a, uint32_t duration); /** * Legacy `lv_anim_set_time` API will be removed soon, use `lv_anim_set_duration` instead. */ -static inline void lv_anim_set_time(lv_anim_t * a, uint32_t duration) -{ - lv_anim_set_duration(a, duration); -} +void lv_anim_set_time(lv_anim_t * a, uint32_t duration); /** * Set a delay before starting the animation * @param a pointer to an initialized `lv_anim_t` variable * @param delay delay before the animation in milliseconds */ -static inline void lv_anim_set_delay(lv_anim_t * a, uint32_t delay) -{ - a->act_time = -(int32_t)(delay); -} +void lv_anim_set_delay(lv_anim_t * a, uint32_t delay); /** * Set the start and end values of an animation @@ -240,12 +208,7 @@ static inline void lv_anim_set_delay(lv_anim_t * a, uint32_t delay) * @param start the start value * @param end the end value */ -static inline void lv_anim_set_values(lv_anim_t * a, int32_t start, int32_t end) -{ - a->start_value = start; - a->current_value = INT32_MIN; - a->end_value = end; -} +void lv_anim_set_values(lv_anim_t * a, int32_t start, int32_t end); /** * Similar to `lv_anim_set_exec_cb` but `lv_anim_custom_exec_cb_t` receives @@ -255,30 +218,21 @@ static inline void lv_anim_set_values(lv_anim_t * a, int32_t start, int32_t end) * @param a pointer to an initialized `lv_anim_t` variable * @param exec_cb a function to execute. */ -static inline void lv_anim_set_custom_exec_cb(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) -{ - a->custom_exec_cb = exec_cb; -} +void lv_anim_set_custom_exec_cb(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb); /** * Set the path (curve) of the animation. * @param a pointer to an initialized `lv_anim_t` variable * @param path_cb a function to set the current value of the animation. */ -static inline void lv_anim_set_path_cb(lv_anim_t * a, lv_anim_path_cb_t path_cb) -{ - a->path_cb = path_cb; -} +void lv_anim_set_path_cb(lv_anim_t * a, lv_anim_path_cb_t path_cb); /** * Set a function call when the animation really starts (considering `delay`) * @param a pointer to an initialized `lv_anim_t` variable * @param start_cb a function call when the animation starts */ -static inline void lv_anim_set_start_cb(lv_anim_t * a, lv_anim_start_cb_t start_cb) -{ - a->start_cb = start_cb; -} +void lv_anim_set_start_cb(lv_anim_t * a, lv_anim_start_cb_t start_cb); /** * Set a function to use the current value of the variable and make start and end value @@ -286,78 +240,54 @@ static inline void lv_anim_set_start_cb(lv_anim_t * a, lv_anim_start_cb_t start_ * @param a pointer to an initialized `lv_anim_t` variable * @param get_value_cb a function call when the animation starts */ -static inline void lv_anim_set_get_value_cb(lv_anim_t * a, lv_anim_get_value_cb_t get_value_cb) -{ - a->get_value_cb = get_value_cb; -} +void lv_anim_set_get_value_cb(lv_anim_t * a, lv_anim_get_value_cb_t get_value_cb); /** * Set a function call when the animation is completed * @param a pointer to an initialized `lv_anim_t` variable * @param completed_cb a function call when the animation is fully completed */ -static inline void lv_anim_set_completed_cb(lv_anim_t * a, lv_anim_completed_cb_t completed_cb) -{ - a->completed_cb = completed_cb; -} +void lv_anim_set_completed_cb(lv_anim_t * a, lv_anim_completed_cb_t completed_cb); /** * Set a function call when the animation is deleted. * @param a pointer to an initialized `lv_anim_t` variable * @param deleted_cb a function call when the animation is deleted */ -static inline void lv_anim_set_deleted_cb(lv_anim_t * a, lv_anim_deleted_cb_t deleted_cb) -{ - a->deleted_cb = deleted_cb; -} +void lv_anim_set_deleted_cb(lv_anim_t * a, lv_anim_deleted_cb_t deleted_cb); /** * Make the animation to play back to when the forward direction is ready * @param a pointer to an initialized `lv_anim_t` variable * @param time the duration of the playback animation in milliseconds. 0: disable playback */ -static inline void lv_anim_set_playback_duration(lv_anim_t * a, uint32_t duration) -{ - a->playback_duration = duration; -} +void lv_anim_set_playback_duration(lv_anim_t * a, uint32_t duration); /** * Legacy `lv_anim_set_playback_time` API will be removed soon, use `lv_anim_set_playback_duration` instead. */ -static inline void lv_anim_set_playback_time(lv_anim_t * a, uint32_t duration) -{ - lv_anim_set_playback_duration(a, duration); -} +void lv_anim_set_playback_time(lv_anim_t * a, uint32_t duration); /** * Make the animation to play back to when the forward direction is ready * @param a pointer to an initialized `lv_anim_t` variable * @param delay delay in milliseconds before starting the playback animation. */ -static inline void lv_anim_set_playback_delay(lv_anim_t * a, uint32_t delay) -{ - a->playback_delay = delay; -} +void lv_anim_set_playback_delay(lv_anim_t * a, uint32_t delay); /** * Make the animation repeat itself. * @param a pointer to an initialized `lv_anim_t` variable * @param cnt repeat count or `LV_ANIM_REPEAT_INFINITE` for infinite repetition. 0: to disable repetition. */ -static inline void lv_anim_set_repeat_count(lv_anim_t * a, uint32_t cnt) -{ - a->repeat_cnt = cnt; -} +void lv_anim_set_repeat_count(lv_anim_t * a, uint32_t cnt); /** * Set a delay before repeating the animation. * @param a pointer to an initialized `lv_anim_t` variable * @param delay delay in milliseconds before repeating the animation. */ -static inline void lv_anim_set_repeat_delay(lv_anim_t * a, uint32_t delay) -{ - a->repeat_delay = delay; -} +void lv_anim_set_repeat_delay(lv_anim_t * a, uint32_t delay); /** * Set a whether the animation's should be applied immediately or only when the delay expired. @@ -365,20 +295,14 @@ static inline void lv_anim_set_repeat_delay(lv_anim_t * a, uint32_t delay) * @param en true: apply the start value immediately in `lv_anim_start`; * false: apply the start value only when `delay` ms is elapsed and the animations really starts */ -static inline void lv_anim_set_early_apply(lv_anim_t * a, bool en) -{ - a->early_apply = en; -} +void lv_anim_set_early_apply(lv_anim_t * a, bool en); /** * Set the custom user data field of the animation. * @param a pointer to an initialized `lv_anim_t` variable * @param user_data pointer to the new user_data. */ -static inline void lv_anim_set_user_data(lv_anim_t * a, void * user_data) -{ - a->user_data = user_data; -} +void lv_anim_set_user_data(lv_anim_t * a, void * user_data); /** * Set parameter for cubic bezier path @@ -387,15 +311,7 @@ static inline void lv_anim_set_user_data(lv_anim_t * a, void * user_data) * @param y1 * @param y1 second control point */ -static inline void lv_anim_set_bezier3_param(lv_anim_t * a, int16_t x1, int16_t y1, int16_t x2, int16_t y2) -{ - struct _lv_anim_bezier3_para_t * para = &a->parameter.bezier3; - - para->x1 = x1; - para->x2 = x2; - para->y1 = y1; - para->y2 = y2; -} +void lv_anim_set_bezier3_param(lv_anim_t * a, int16_t x1, int16_t y1, int16_t x2, int16_t y2); /** * Create an animation @@ -409,10 +325,7 @@ lv_anim_t * lv_anim_start(const lv_anim_t * a); * @param a pointer to an initialized `lv_anim_t` variable * @return delay before the animation in milliseconds */ -static inline uint32_t lv_anim_get_delay(const lv_anim_t * a) -{ - return -a->act_time; -} +uint32_t lv_anim_get_delay(const lv_anim_t * a); /** * Get the time used to play the animation. @@ -426,30 +339,21 @@ uint32_t lv_anim_get_playtime(const lv_anim_t * a); * @param a pointer to an initialized `lv_anim_t` variable * @return the duration of the animation in milliseconds */ -static inline uint32_t lv_anim_get_time(const lv_anim_t * a) -{ - return a->duration; -} +uint32_t lv_anim_get_time(const lv_anim_t * a); /** * Get the repeat count of the animation. * @param a pointer to an initialized `lv_anim_t` variable * @return the repeat count or `LV_ANIM_REPEAT_INFINITE` for infinite repetition. 0: disabled repetition. */ -static inline uint32_t lv_anim_get_repeat_count(const lv_anim_t * a) -{ - return a->repeat_cnt; -} +uint32_t lv_anim_get_repeat_count(const lv_anim_t * a); /** * Get the user_data field of the animation * @param a pointer to an initialized `lv_anim_t` variable * @return the pointer to the custom user_data of the animation */ -static inline void * lv_anim_get_user_data(const lv_anim_t * a) -{ - return a->user_data; -} +void * lv_anim_get_user_data(const lv_anim_t * a); /** * Delete animation(s) of a variable with a given animator function @@ -490,10 +394,7 @@ lv_timer_t * lv_anim_get_timer(void); * or NULL to ignore it and delete all the animations of 'var * @return true: at least 1 animation is deleted, false: no animation is deleted */ -static inline bool lv_anim_custom_delete(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) -{ - return lv_anim_delete(a ? a->var : NULL, (lv_anim_exec_xcb_t)exec_cb); -} +bool lv_anim_custom_delete(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb); /** * Get the animation of a variable and its `exec_cb`. @@ -504,10 +405,7 @@ static inline bool lv_anim_custom_delete(lv_anim_t * a, lv_anim_custom_exec_cb_t * @param exec_cb a function pointer which is animating 'var', or NULL to return first matching 'var' * @return pointer to the animation. */ -static inline lv_anim_t * lv_anim_custom_get(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) -{ - return lv_anim_get(a ? a->var : NULL, (lv_anim_exec_xcb_t)exec_cb); -} +lv_anim_t * lv_anim_custom_get(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb); /** * Get the number of currently running animations diff --git a/src/misc/lv_anim_private.h b/src/misc/lv_anim_private.h new file mode 100644 index 000000000..5c2585017 --- /dev/null +++ b/src/misc/lv_anim_private.h @@ -0,0 +1,56 @@ +/** + * @file lv_anim_private.h + * + */ + +#ifndef LV_ANIM_PRIVATE_H +#define LV_ANIM_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_anim.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + bool anim_list_changed; + bool anim_run_round; + lv_timer_t * timer; + lv_ll_t anim_ll; +} lv_anim_state_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Init the animation module + */ +void lv_anim_core_init(void); + +/** + * Deinit the animation module + */ +void lv_anim_core_deinit(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ANIM_PRIVATE_H*/ diff --git a/src/misc/lv_anim_timeline.c b/src/misc/lv_anim_timeline.c index d2e6dff36..c1d4a6fce 100644 --- a/src/misc/lv_anim_timeline.c +++ b/src/misc/lv_anim_timeline.c @@ -6,6 +6,7 @@ /********************* * INCLUDES *********************/ +#include "lv_anim_private.h" #include "lv_assert.h" #include "lv_anim_timeline.h" #include "../stdlib/lv_mem.h" @@ -27,7 +28,7 @@ typedef struct { } lv_anim_timeline_dsc_t; /*Data of anim_timeline*/ -struct _lv_anim_timeline_t { +struct lv_anim_timeline_t { lv_anim_timeline_dsc_t * anim_dsc; /**< Dynamically allocated anim dsc array*/ uint32_t anim_dsc_cnt; /**< The length of anim dsc array*/ uint32_t act_time; /**< Current time of the animation*/ diff --git a/src/misc/lv_anim_timeline.h b/src/misc/lv_anim_timeline.h index dd2707041..7449a6a6b 100644 --- a/src/misc/lv_anim_timeline.h +++ b/src/misc/lv_anim_timeline.h @@ -25,7 +25,7 @@ extern "C" { * TYPEDEFS **********************/ -typedef struct _lv_anim_timeline_t lv_anim_timeline_t; +typedef struct lv_anim_timeline_t lv_anim_timeline_t; /********************** * GLOBAL PROTOTYPES diff --git a/src/misc/lv_area.c b/src/misc/lv_area.c index 3cfd12144..4410076d6 100644 --- a/src/misc/lv_area.c +++ b/src/misc/lv_area.c @@ -9,7 +9,7 @@ #include "../lv_conf_internal.h" #include "../core/lv_global.h" -#include "lv_area.h" +#include "lv_area_private.h" #include "lv_math.h" /********************* @@ -56,7 +56,7 @@ void lv_area_set_height(lv_area_t * area_p, int32_t h) area_p->y2 = area_p->y1 + h - 1; } -void _lv_area_set_pos(lv_area_t * area_p, int32_t x, int32_t y) +void lv_area_set_pos(lv_area_t * area_p, int32_t x, int32_t y) { int32_t w = lv_area_get_width(area_p); int32_t h = lv_area_get_height(area_p); @@ -91,7 +91,7 @@ void lv_area_move(lv_area_t * area, int32_t x_ofs, int32_t y_ofs) area->y2 += y_ofs; } -bool _lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) +bool lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) { /*Get the smaller area from 'a1_p' and 'a2_p'*/ res_p->x1 = LV_MAX(a1_p->x1, a2_p->x1); @@ -108,13 +108,13 @@ bool _lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area return union_ok; } -int8_t _lv_area_diff(lv_area_t res_p[], const lv_area_t * a1_p, const lv_area_t * a2_p) +int8_t lv_area_diff(lv_area_t res_p[], const lv_area_t * a1_p, const lv_area_t * a2_p) { /*Areas have no common parts*/ - if(!_lv_area_is_on(a1_p, a2_p)) return -1; + if(!lv_area_is_on(a1_p, a2_p)) return -1; /*No remaining areas after removing common parts*/ - if(_lv_area_is_in(a1_p, a2_p, 0)) return 0; + if(lv_area_is_in(a1_p, a2_p, 0)) return 0; /*Result counter*/ int8_t res_c = 0; @@ -173,7 +173,7 @@ int8_t _lv_area_diff(lv_area_t res_p[], const lv_area_t * a1_p, const lv_area_t return res_c; } -void _lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) +void lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) { a_res_p->x1 = LV_MIN(a1_p->x1, a2_p->x1); a_res_p->y1 = LV_MIN(a1_p->y1, a2_p->y1); @@ -181,7 +181,7 @@ void _lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t a_res_p->y2 = LV_MAX(a1_p->y2, a2_p->y2); } -bool _lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, int32_t radius) +bool lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, int32_t radius) { /*First check the basic area*/ bool is_on_rect = false; @@ -208,7 +208,7 @@ bool _lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, int32_t corner_area.x2 = a_p->x1 + radius; corner_area.y1 = a_p->y1; corner_area.y2 = a_p->y1 + radius; - if(_lv_area_is_point_on(&corner_area, p_p, 0)) { + if(lv_area_is_point_on(&corner_area, p_p, 0)) { corner_area.x2 += radius; corner_area.y2 += radius; return lv_point_within_circle(&corner_area, p_p); @@ -216,7 +216,7 @@ bool _lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, int32_t /*Bottom left*/ corner_area.y1 = a_p->y2 - radius; corner_area.y2 = a_p->y2; - if(_lv_area_is_point_on(&corner_area, p_p, 0)) { + if(lv_area_is_point_on(&corner_area, p_p, 0)) { corner_area.x2 += radius; corner_area.y1 -= radius; return lv_point_within_circle(&corner_area, p_p); @@ -224,7 +224,7 @@ bool _lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, int32_t /*Bottom right*/ corner_area.x1 = a_p->x2 - radius; corner_area.x2 = a_p->x2; - if(_lv_area_is_point_on(&corner_area, p_p, 0)) { + if(lv_area_is_point_on(&corner_area, p_p, 0)) { corner_area.x1 -= radius; corner_area.y1 -= radius; return lv_point_within_circle(&corner_area, p_p); @@ -232,7 +232,7 @@ bool _lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, int32_t /*Top right*/ corner_area.y1 = a_p->y1; corner_area.y2 = a_p->y1 + radius; - if(_lv_area_is_point_on(&corner_area, p_p, 0)) { + if(lv_area_is_point_on(&corner_area, p_p, 0)) { corner_area.x1 -= radius; corner_area.y2 += radius; return lv_point_within_circle(&corner_area, p_p); @@ -241,7 +241,7 @@ bool _lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, int32_t return true; } -bool _lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p) +bool lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p) { if((a1_p->x1 <= a2_p->x2) && (a1_p->x2 >= a2_p->x1) && (a1_p->y1 <= a2_p->y2) && (a1_p->y2 >= a2_p->y1)) { return true; @@ -251,7 +251,7 @@ bool _lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p) } } -bool _lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p, int32_t radius) +bool lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p, int32_t radius) { bool is_in = false; @@ -267,21 +267,21 @@ bool _lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p, int32_ lv_point_t p; lv_point_set(&p, ain_p->x1, ain_p->y1); - if(_lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + if(lv_area_is_point_on(aholder_p, &p, radius) == false) return false; lv_point_set(&p, ain_p->x2, ain_p->y1); - if(_lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + if(lv_area_is_point_on(aholder_p, &p, radius) == false) return false; lv_point_set(&p, ain_p->x1, ain_p->y2); - if(_lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + if(lv_area_is_point_on(aholder_p, &p, radius) == false) return false; lv_point_set(&p, ain_p->x2, ain_p->y2); - if(_lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + if(lv_area_is_point_on(aholder_p, &p, radius) == false) return false; return true; } -bool _lv_area_is_out(const lv_area_t * aout_p, const lv_area_t * aholder_p, int32_t radius) +bool lv_area_is_out(const lv_area_t * aout_p, const lv_area_t * aholder_p, int32_t radius) { if(aout_p->x2 < aholder_p->x1 || aout_p->y2 < aholder_p->y1 || aout_p->x1 > aholder_p->x2 || aout_p->y1 > aholder_p->y2) { @@ -294,21 +294,21 @@ bool _lv_area_is_out(const lv_area_t * aout_p, const lv_area_t * aholder_p, int3 lv_point_t p; lv_point_set(&p, aout_p->x1, aout_p->y1); - if(_lv_area_is_point_on(aholder_p, &p, radius)) return false; + if(lv_area_is_point_on(aholder_p, &p, radius)) return false; lv_point_set(&p, aout_p->x2, aout_p->y1); - if(_lv_area_is_point_on(aholder_p, &p, radius)) return false; + if(lv_area_is_point_on(aholder_p, &p, radius)) return false; lv_point_set(&p, aout_p->x1, aout_p->y2); - if(_lv_area_is_point_on(aholder_p, &p, radius)) return false; + if(lv_area_is_point_on(aholder_p, &p, radius)) return false; lv_point_set(&p, aout_p->x2, aout_p->y2); - if(_lv_area_is_point_on(aholder_p, &p, radius)) return false; + if(lv_area_is_point_on(aholder_p, &p, radius)) return false; return true; } -bool _lv_area_is_equal(const lv_area_t * a, const lv_area_t * b) +bool lv_area_is_equal(const lv_area_t * a, const lv_area_t * b) { return a->x1 == b->x1 && a->x2 == b->x2 && a->y1 == b->y1 && a->y2 == b->y2; } @@ -438,7 +438,7 @@ void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t alig to_align->y2 = to_align->y1 + h - 1; } -#define _LV_TRANSFORM_TRIGO_SHIFT 10 +#define LV_TRANSFORM_TRIGO_SHIFT 10 void lv_point_transform(lv_point_t * point, int32_t angle, int32_t scale_x, int32_t scale_y, const lv_point_t * pivot, bool zoom_first) @@ -483,32 +483,100 @@ void lv_point_array_transform(lv_point_t * points, size_t count, int32_t angle, int32_t c2 = lv_trigo_sin(angle_high + 90); int32_t sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10; - sinma = sinma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT); + sinma = sinma >> (LV_TRIGO_SHIFT - LV_TRANSFORM_TRIGO_SHIFT); int32_t cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10; - cosma = cosma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT); + cosma = cosma >> (LV_TRIGO_SHIFT - LV_TRANSFORM_TRIGO_SHIFT); for(i = 0; i < count; i++) { int32_t x = points[i].x; int32_t y = points[i].y; if(scale_x == 256 && scale_y == 256) { - points[i].x = ((cosma * x - sinma * y) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->x; - points[i].y = ((sinma * x + cosma * y) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->y; + points[i].x = ((cosma * x - sinma * y) >> LV_TRANSFORM_TRIGO_SHIFT) + pivot->x; + points[i].y = ((sinma * x + cosma * y) >> LV_TRANSFORM_TRIGO_SHIFT) + pivot->y; } else { if(zoom_first) { x *= scale_x; y *= scale_y; - points[i].x = (((cosma * x - sinma * y)) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x; - points[i].y = (((sinma * x + cosma * y)) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y; + points[i].x = (((cosma * x - sinma * y)) >> (LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x; + points[i].y = (((sinma * x + cosma * y)) >> (LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y; } else { - points[i].x = (((cosma * x - sinma * y) * scale_x) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x; - points[i].y = (((sinma * x + cosma * y) * scale_y) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y; + points[i].x = (((cosma * x - sinma * y) * scale_x) >> (LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x; + points[i].y = (((sinma * x + cosma * y) * scale_y) >> (LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y; } } } } +int32_t lv_area_get_width(const lv_area_t * area_p) +{ + return (int32_t)(area_p->x2 - area_p->x1 + 1); +} + +int32_t lv_area_get_height(const lv_area_t * area_p) +{ + return (int32_t)(area_p->y2 - area_p->y1 + 1); +} + +lv_point_t lv_point_from_precise(const lv_point_precise_t * p) +{ + lv_point_t point = { + (int32_t)p->x, (int32_t)p->y + }; + + return point; +} + +lv_point_precise_t lv_point_to_precise(const lv_point_t * p) +{ + lv_point_precise_t point = { + (lv_value_precise_t)p->x, (lv_value_precise_t)p->y + }; + + return point; +} + +void lv_point_set(lv_point_t * p, int32_t x, int32_t y) +{ + p->x = x; + p->y = y; +} + +void lv_point_precise_set(lv_point_precise_t * p, lv_value_precise_t x, lv_value_precise_t y) +{ + p->x = x; + p->y = y; +} + +void lv_point_swap(lv_point_t * p1, lv_point_t * p2) +{ + lv_point_t tmp = *p1; + *p1 = *p2; + *p2 = tmp; +} + +void lv_point_precise_swap(lv_point_precise_t * p1, lv_point_precise_t * p2) +{ + lv_point_precise_t tmp = *p1; + *p1 = *p2; + *p2 = tmp; +} + +int32_t lv_pct(int32_t x) +{ + return LV_PCT(x); +} + +int32_t lv_pct_to_px(int32_t v, int32_t base) +{ + if(LV_COORD_IS_PCT(v)) { + return (LV_COORD_GET_PCT(v) * base) / 100; + } + + return v; +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/misc/lv_area.h b/src/misc/lv_area.h index 9a0c8a847..1b0d80ba8 100644 --- a/src/misc/lv_area.h +++ b/src/misc/lv_area.h @@ -48,7 +48,7 @@ typedef struct { /** Alignments*/ -enum _lv_align_t { +typedef enum { LV_ALIGN_DEFAULT = 0, LV_ALIGN_TOP_LEFT, LV_ALIGN_TOP_MID, @@ -72,15 +72,9 @@ enum _lv_align_t { LV_ALIGN_OUT_RIGHT_TOP, LV_ALIGN_OUT_RIGHT_MID, LV_ALIGN_OUT_RIGHT_BOTTOM, -}; +} lv_align_t; -#ifdef DOXYGEN -typedef _lv_align_t lv_align_t; -#else -typedef uint8_t lv_align_t; -#endif /*DOXYGEN*/ - -enum _lv_dir_t { +typedef enum { LV_DIR_NONE = 0x00, LV_DIR_LEFT = (1 << 0), LV_DIR_RIGHT = (1 << 1), @@ -89,13 +83,7 @@ enum _lv_dir_t { LV_DIR_HOR = LV_DIR_LEFT | LV_DIR_RIGHT, LV_DIR_VER = LV_DIR_TOP | LV_DIR_BOTTOM, LV_DIR_ALL = LV_DIR_HOR | LV_DIR_VER, -}; - -#ifdef DOXYGEN -typedef _lv_dir_t lv_dir_t; -#else -typedef uint8_t lv_dir_t; -#endif /*DOXYGEN*/ +} lv_dir_t; /********************** * GLOBAL PROTOTYPES @@ -129,20 +117,14 @@ inline static void lv_area_copy(lv_area_t * dest, const lv_area_t * src) * @param area_p pointer to an area * @return the width of the area (if x1 == x2 -> width = 1) */ -static inline int32_t lv_area_get_width(const lv_area_t * area_p) -{ - return (int32_t)(area_p->x2 - area_p->x1 + 1); -} +int32_t lv_area_get_width(const lv_area_t * area_p); /** * Get the height of an area * @param area_p pointer to an area * @return the height of the area (if y1 == y2 -> height = 1) */ -static inline int32_t lv_area_get_height(const lv_area_t * area_p) -{ - return (int32_t)(area_p->y2 - area_p->y1 + 1); -} +int32_t lv_area_get_height(const lv_area_t * area_p); /** * Set the width of an area @@ -158,14 +140,6 @@ void lv_area_set_width(lv_area_t * area_p, int32_t w); */ void lv_area_set_height(lv_area_t * area_p, int32_t h); -/** - * Set the position of an area (width and height will be kept) - * @param area_p pointer to an area - * @param x the new x coordinate of the area - * @param y the new y coordinate of the area - */ -void _lv_area_set_pos(lv_area_t * area_p, int32_t x, int32_t y); - /** * Return with area of an area (x * y) * @param area_p pointer to an area @@ -177,74 +151,6 @@ void lv_area_increase(lv_area_t * area, int32_t w_extra, int32_t h_extra); void lv_area_move(lv_area_t * area, int32_t x_ofs, int32_t y_ofs); -/** - * Get the common parts of two areas - * @param res_p pointer to an area, the result will be stored her - * @param a1_p pointer to the first area - * @param a2_p pointer to the second area - * @return false: the two area has NO common parts, res_p is invalid - */ -bool _lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); - -/** - * Get resulting sub areas after removing the common parts of two areas from the first area - * @param res_p pointer to an array of areas with a count of 4, the resulting areas will be stored here - * @param a1_p pointer to the first area - * @param a2_p pointer to the second area - * @return number of results (max 4) or -1 if no intersect - */ -int8_t _lv_area_diff(lv_area_t res_p[], const lv_area_t * a1_p, const lv_area_t * a2_p); - -/** - * Join two areas into a third which involves the other two - * @param a_res_p pointer to an area, the result will be stored here - * @param a1_p pointer to the first area - * @param a2_p pointer to the second area - */ -void _lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); - -/** - * Check if a point is on an area - * @param a_p pointer to an area - * @param p_p pointer to a point - * @param radius radius of area (e.g. for rounded rectangle) - * @return false:the point is out of the area - */ -bool _lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, int32_t radius); - -/** - * Check if two area has common parts - * @param a1_p pointer to an area. - * @param a2_p pointer to another area - * @return false: a1_p and a2_p has no common parts - */ -bool _lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p); - -/** - * Check if an area is fully on another - * @param ain_p pointer to an area which could be in 'aholder_p' - * @param aholder_p pointer to an area which could involve 'ain_p' - * @param radius radius of `aholder_p` (e.g. for rounded rectangle) - * @return true: `ain_p` is fully inside `aholder_p` - */ -bool _lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p, int32_t radius); - -/** - * Check if an area is fully out of another - * @param aout_p pointer to an area which could be in 'aholder_p' - * @param aholder_p pointer to an area which could involve 'ain_p' - * @param radius radius of `aholder_p` (e.g. for rounded rectangle) - * @return true: `aout_p` is fully outside `aholder_p` - */ -bool _lv_area_is_out(const lv_area_t * aout_p, const lv_area_t * aholder_p, int32_t radius); - -/** - * Check if 2 area is the same - * @param a pointer to an area - * @param b pointer to another area - */ -bool _lv_area_is_equal(const lv_area_t * a, const lv_area_t * b); - /** * Align an area to another * @param base an area where the other will be aligned @@ -281,83 +187,51 @@ void lv_point_array_transform(lv_point_t * points, size_t count, int32_t angle, const lv_point_t * pivot, bool zoom_first); -static inline lv_point_t lv_point_from_precise(const lv_point_precise_t * p) -{ - lv_point_t point = { - (int32_t)p->x, (int32_t)p->y - }; +lv_point_t lv_point_from_precise(const lv_point_precise_t * p); - return point; -} +lv_point_precise_t lv_point_to_precise(const lv_point_t * p); -static inline lv_point_precise_t lv_point_to_precise(const lv_point_t * p) -{ - lv_point_precise_t point = { - (lv_value_precise_t)p->x, (lv_value_precise_t)p->y - }; +void lv_point_set(lv_point_t * p, int32_t x, int32_t y); - return point; -} +void lv_point_precise_set(lv_point_precise_t * p, lv_value_precise_t x, lv_value_precise_t y); -static inline void lv_point_set(lv_point_t * p, int32_t x, int32_t y) -{ - p->x = x; - p->y = y; -} +void lv_point_swap(lv_point_t * p1, lv_point_t * p2); -static inline void lv_point_precise_set(lv_point_precise_t * p, lv_value_precise_t x, lv_value_precise_t y) -{ - p->x = x; - p->y = y; -} - -static inline void lv_point_swap(lv_point_t * p1, lv_point_t * p2) -{ - lv_point_t tmp = *p1; - *p1 = *p2; - *p2 = tmp; -} - -static inline void lv_point_precise_swap(lv_point_precise_t * p1, lv_point_precise_t * p2) -{ - lv_point_precise_t tmp = *p1; - *p1 = *p2; - *p2 = tmp; -} +void lv_point_precise_swap(lv_point_precise_t * p1, lv_point_precise_t * p2); /********************** * MACROS **********************/ -#define _LV_COORD_TYPE_SHIFT (29U) +#define LV_COORD_TYPE_SHIFT (29U) -#define _LV_COORD_TYPE_MASK (3 << _LV_COORD_TYPE_SHIFT) -#define _LV_COORD_TYPE(x) ((x) & _LV_COORD_TYPE_MASK) /*Extract type specifiers*/ -#define _LV_COORD_PLAIN(x) ((x) & ~_LV_COORD_TYPE_MASK) /*Remove type specifiers*/ +#define LV_COORD_TYPE_MASK (3 << LV_COORD_TYPE_SHIFT) +#define LV_COORD_TYPE(x) ((x) & LV_COORD_TYPE_MASK) /*Extract type specifiers*/ +#define LV_COORD_PLAIN(x) ((x) & ~LV_COORD_TYPE_MASK) /*Remove type specifiers*/ -#define _LV_COORD_TYPE_PX (0 << _LV_COORD_TYPE_SHIFT) -#define _LV_COORD_TYPE_SPEC (1 << _LV_COORD_TYPE_SHIFT) -#define _LV_COORD_TYPE_PX_NEG (3 << _LV_COORD_TYPE_SHIFT) +#define LV_COORD_TYPE_PX (0 << LV_COORD_TYPE_SHIFT) +#define LV_COORD_TYPE_SPEC (1 << LV_COORD_TYPE_SHIFT) +#define LV_COORD_TYPE_PX_NEG (3 << LV_COORD_TYPE_SHIFT) -#define LV_COORD_IS_PX(x) (_LV_COORD_TYPE(x) == _LV_COORD_TYPE_PX || _LV_COORD_TYPE(x) == _LV_COORD_TYPE_PX_NEG) -#define LV_COORD_IS_SPEC(x) (_LV_COORD_TYPE(x) == _LV_COORD_TYPE_SPEC) +#define LV_COORD_IS_PX(x) (LV_COORD_TYPE(x) == LV_COORD_TYPE_PX || LV_COORD_TYPE(x) == LV_COORD_TYPE_PX_NEG) +#define LV_COORD_IS_SPEC(x) (LV_COORD_TYPE(x) == LV_COORD_TYPE_SPEC) -#define LV_COORD_SET_SPEC(x) ((x) | _LV_COORD_TYPE_SPEC) +#define LV_COORD_SET_SPEC(x) ((x) | LV_COORD_TYPE_SPEC) /*Max coordinate value*/ -#define LV_COORD_MAX ((1 << _LV_COORD_TYPE_SHIFT) - 1) +#define LV_COORD_MAX ((1 << LV_COORD_TYPE_SHIFT) - 1) #define LV_COORD_MIN (-LV_COORD_MAX) /*Special coordinates*/ #define LV_SIZE_CONTENT LV_COORD_SET_SPEC(LV_COORD_MAX) -#define _LV_PCT_STORED_MAX (LV_COORD_MAX - 1) -#if _LV_PCT_STORED_MAX % 2 != 0 -#error _LV_PCT_STORED_MAX should be an even number +#define LV_PCT_STORED_MAX (LV_COORD_MAX - 1) +#if LV_PCT_STORED_MAX % 2 != 0 +#error LV_PCT_STORED_MAX should be an even number #endif -#define _LV_PCT_POS_MAX (_LV_PCT_STORED_MAX / 2) -#define LV_PCT(x) (LV_COORD_SET_SPEC(((x) < 0 ? (_LV_PCT_POS_MAX - LV_MAX((x), -_LV_PCT_POS_MAX)) : LV_MIN((x), _LV_PCT_POS_MAX)))) -#define LV_COORD_IS_PCT(x) ((LV_COORD_IS_SPEC(x) && _LV_COORD_PLAIN(x) <= _LV_PCT_STORED_MAX)) -#define LV_COORD_GET_PCT(x) (_LV_COORD_PLAIN(x) > _LV_PCT_POS_MAX ? _LV_PCT_POS_MAX - _LV_COORD_PLAIN(x) : _LV_COORD_PLAIN(x)) +#define LV_PCT_POS_MAX (LV_PCT_STORED_MAX / 2) +#define LV_PCT(x) (LV_COORD_SET_SPEC(((x) < 0 ? (LV_PCT_POS_MAX - LV_MAX((x), -LV_PCT_POS_MAX)) : LV_MIN((x), LV_PCT_POS_MAX)))) +#define LV_COORD_IS_PCT(x) ((LV_COORD_IS_SPEC(x) && LV_COORD_PLAIN(x) <= LV_PCT_STORED_MAX)) +#define LV_COORD_GET_PCT(x) (LV_COORD_PLAIN(x) > LV_PCT_POS_MAX ? LV_PCT_POS_MAX - LV_COORD_PLAIN(x) : LV_COORD_PLAIN(x)) LV_EXPORT_CONST_INT(LV_COORD_MAX); LV_EXPORT_CONST_INT(LV_COORD_MIN); @@ -369,19 +243,9 @@ LV_EXPORT_CONST_INT(LV_SIZE_CONTENT); * @param x the percentage (0..1000) * @return a coordinate that stores the percentage */ -static inline int32_t lv_pct(int32_t x) -{ - return LV_PCT(x); -} +int32_t lv_pct(int32_t x); -static inline int32_t lv_pct_to_px(int32_t v, int32_t base) -{ - if(LV_COORD_IS_PCT(v)) { - return (LV_COORD_GET_PCT(v) * base) / 100; - } - - return v; -} +int32_t lv_pct_to_px(int32_t v, int32_t base); #ifdef __cplusplus } /*extern "C"*/ diff --git a/src/misc/lv_area_private.h b/src/misc/lv_area_private.h new file mode 100644 index 000000000..bebca5940 --- /dev/null +++ b/src/misc/lv_area_private.h @@ -0,0 +1,115 @@ +/** + * @file lv_area_private.h + * + */ + +#ifndef LV_AREA_PRIVATE_H +#define LV_AREA_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_area.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Set the position of an area (width and height will be kept) + * @param area_p pointer to an area + * @param x the new x coordinate of the area + * @param y the new y coordinate of the area + */ +void lv_area_set_pos(lv_area_t * area_p, int32_t x, int32_t y); + +/** + * Get the common parts of two areas + * @param res_p pointer to an area, the result will be stored her + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + * @return false: the two area has NO common parts, res_p is invalid + */ +bool lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); + +/** + * Get resulting sub areas after removing the common parts of two areas from the first area + * @param res_p pointer to an array of areas with a count of 4, the resulting areas will be stored here + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + * @return number of results (max 4) or -1 if no intersect + */ +int8_t lv_area_diff(lv_area_t res_p[], const lv_area_t * a1_p, const lv_area_t * a2_p); + +/** + * Join two areas into a third which involves the other two + * @param a_res_p pointer to an area, the result will be stored here + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + */ +void lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); + +/** + * Check if a point is on an area + * @param a_p pointer to an area + * @param p_p pointer to a point + * @param radius radius of area (e.g. for rounded rectangle) + * @return false:the point is out of the area + */ +bool lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, int32_t radius); + +/** + * Check if two area has common parts + * @param a1_p pointer to an area. + * @param a2_p pointer to another area + * @return false: a1_p and a2_p has no common parts + */ +bool lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p); + +/** + * Check if an area is fully on another + * @param ain_p pointer to an area which could be in 'aholder_p' + * @param aholder_p pointer to an area which could involve 'ain_p' + * @param radius radius of `aholder_p` (e.g. for rounded rectangle) + * @return true: `ain_p` is fully inside `aholder_p` + */ +bool lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p, int32_t radius); + +/** + * Check if an area is fully out of another + * @param aout_p pointer to an area which could be in 'aholder_p' + * @param aholder_p pointer to an area which could involve 'ain_p' + * @param radius radius of `aholder_p` (e.g. for rounded rectangle) + * @return true: `aout_p` is fully outside `aholder_p` + */ +bool lv_area_is_out(const lv_area_t * aout_p, const lv_area_t * aholder_p, int32_t radius); + +/** + * Check if 2 area is the same + * @param a pointer to an area + * @param b pointer to another area + */ +bool lv_area_is_equal(const lv_area_t * a, const lv_area_t * b); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_AREA_PRIVATE_H*/ diff --git a/src/misc/lv_array.c b/src/misc/lv_array.c index 5de604b45..39382bcbf 100644 --- a/src/misc/lv_array.c +++ b/src/misc/lv_array.c @@ -181,3 +181,42 @@ lv_result_t lv_array_assign(lv_array_t * array, uint32_t index, const void * val lv_memcpy(data, value, array->element_size); return LV_RESULT_OK; } + +uint32_t lv_array_size(const lv_array_t * array) +{ + return array->size; +} + +uint32_t lv_array_capacity(const lv_array_t * array) +{ + return array->capacity; +} + +bool lv_array_is_empty(const lv_array_t * array) +{ + return array->size == 0; +} + +bool lv_array_is_full(const lv_array_t * array) +{ + return array->size == array->capacity; +} + +void lv_array_clear(lv_array_t * array) +{ + array->size = 0; +} + +void * lv_array_front(const lv_array_t * array) +{ + return lv_array_at(array, 0); +} + +void * lv_array_back(const lv_array_t * array) +{ + return lv_array_at(array, lv_array_size(array) - 1); +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/src/misc/lv_array.h b/src/misc/lv_array.h index a32490913..e63f56318 100644 --- a/src/misc/lv_array.h +++ b/src/misc/lv_array.h @@ -70,40 +70,28 @@ void lv_array_deinit(lv_array_t * array); * @param array pointer to an `lv_array_t` variable * @return the number of elements stored in the array */ -static inline uint32_t lv_array_size(const lv_array_t * array) -{ - return array->size; -} +uint32_t lv_array_size(const lv_array_t * array); /** * Return the capacity of the array, i.e. how many elements can be stored. * @param array pointer to an `lv_array_t` variable * @return the capacity of the array */ -static inline uint32_t lv_array_capacity(const lv_array_t * array) -{ - return array->capacity; -} +uint32_t lv_array_capacity(const lv_array_t * array); /** * Return if the array is empty * @param array pointer to an `lv_array_t` variable * @return true: array is empty; false: array is not empty */ -static inline bool lv_array_is_empty(const lv_array_t * array) -{ - return array->size == 0; -} +bool lv_array_is_empty(const lv_array_t * array); /** * Return if the array is full * @param array pointer to an `lv_array_t` variable * @return true: array is full; false: array is not full */ -static inline bool lv_array_is_full(const lv_array_t * array) -{ - return array->size == array->capacity; -} +bool lv_array_is_full(const lv_array_t * array); /** * Copy an array to another. @@ -117,10 +105,7 @@ void lv_array_copy(lv_array_t * target, const lv_array_t * source); * Remove all elements in array. * @param array pointer to an `lv_array_t` variable */ -static inline void lv_array_clear(lv_array_t * array) -{ - array->size = 0; -} +void lv_array_clear(lv_array_t * array); /** * Shrink the memory capacity of array if necessary. @@ -187,19 +172,13 @@ void * lv_array_at(const lv_array_t * array, uint32_t index); * @param array pointer to an `lv_array_t` variable * @return a pointer to the first element in the array */ -static inline void * lv_array_front(const lv_array_t * array) -{ - return lv_array_at(array, 0); -} +void * lv_array_front(const lv_array_t * array); /** * Returns a pointer to the last element in the array. * @param array pointer to an `lv_array_t` variable */ -static inline void * lv_array_back(const lv_array_t * array) -{ - return lv_array_at(array, lv_array_size(array) - 1); -} +void * lv_array_back(const lv_array_t * array); /********************** * MACROS diff --git a/src/misc/lv_async.c b/src/misc/lv_async.c index 591d2303f..e1657aeb4 100644 --- a/src/misc/lv_async.c +++ b/src/misc/lv_async.c @@ -8,7 +8,7 @@ *********************/ #include "lv_async.h" -#include "lv_timer.h" +#include "lv_timer_private.h" #include "../stdlib/lv_mem.h" /********************* @@ -19,7 +19,7 @@ * TYPEDEFS **********************/ -typedef struct _lv_async_info_t { +typedef struct lv_async_info_t { lv_async_cb_t cb; void * user_data; } lv_async_info_t; diff --git a/src/misc/lv_bidi.c b/src/misc/lv_bidi.c index f3a0f7489..44f014e28 100644 --- a/src/misc/lv_bidi.c +++ b/src/misc/lv_bidi.c @@ -6,7 +6,7 @@ /********************* * INCLUDES *********************/ -#include "lv_bidi.h" +#include "lv_bidi_private.h" #include "lv_text_private.h" #include "lv_types.h" #include "../stdlib/lv_mem.h" @@ -74,9 +74,9 @@ static const char * custom_neutrals = NULL; * GLOBAL FUNCTIONS **********************/ -void _lv_bidi_process(const char * str_in, char * str_out, lv_base_dir_t base_dir) +void lv_bidi_process(const char * str_in, char * str_out, lv_base_dir_t base_dir) { - if(base_dir == LV_BASE_DIR_AUTO) base_dir = _lv_bidi_detect_base_dir(str_in); + if(base_dir == LV_BASE_DIR_AUTO) base_dir = lv_bidi_detect_base_dir(str_in); uint32_t par_start = 0; uint32_t par_len; @@ -88,7 +88,7 @@ void _lv_bidi_process(const char * str_in, char * str_out, lv_base_dir_t base_di while(str_in[par_start] != '\0') { par_len = lv_bidi_get_next_paragraph(&str_in[par_start]); - _lv_bidi_process_paragraph(&str_in[par_start], &str_out[par_start], par_len, base_dir, NULL, 0); + lv_bidi_process_paragraph(&str_in[par_start], &str_out[par_start], par_len, base_dir, NULL, 0); par_start += par_len; while(str_in[par_start] == '\n' || str_in[par_start] == '\r') { @@ -105,7 +105,7 @@ void _lv_bidi_process(const char * str_in, char * str_out, lv_base_dir_t base_di * @param txt the text to process * @return `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` */ -lv_base_dir_t _lv_bidi_detect_base_dir(const char * txt) +lv_base_dir_t lv_bidi_detect_base_dir(const char * txt) { uint32_t i = 0; uint32_t letter; @@ -122,8 +122,8 @@ lv_base_dir_t _lv_bidi_detect_base_dir(const char * txt) else return LV_BIDI_BASE_DIR_DEF; } -uint16_t _lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_base_dir_t base_dir, - uint32_t visual_pos, bool * is_rtl) +uint16_t lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_base_dir_t base_dir, + uint32_t visual_pos, bool * is_rtl) { uint32_t pos_conv_len = get_txt_len(str_in, len); char * buf = lv_malloc(len + 1); @@ -137,7 +137,7 @@ uint16_t _lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_ if(bidi_txt) *bidi_txt = buf; - _lv_bidi_process_paragraph(str_in, bidi_txt ? *bidi_txt : NULL, len, base_dir, pos_conv_buf, pos_conv_len); + lv_bidi_process_paragraph(str_in, bidi_txt ? *bidi_txt : NULL, len, base_dir, pos_conv_buf, pos_conv_len); if(is_rtl) *is_rtl = IS_RTL_POS(pos_conv_buf[visual_pos]); @@ -147,8 +147,8 @@ uint16_t _lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_ return res; } -uint16_t _lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t len, lv_base_dir_t base_dir, - uint32_t logical_pos, bool * is_rtl) +uint16_t lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t len, lv_base_dir_t base_dir, + uint32_t logical_pos, bool * is_rtl) { uint32_t pos_conv_len = get_txt_len(str_in, len); char * buf = lv_malloc(len + 1); @@ -162,7 +162,7 @@ uint16_t _lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t if(bidi_txt) *bidi_txt = buf; - _lv_bidi_process_paragraph(str_in, bidi_txt ? *bidi_txt : NULL, len, base_dir, pos_conv_buf, pos_conv_len); + lv_bidi_process_paragraph(str_in, bidi_txt ? *bidi_txt : NULL, len, base_dir, pos_conv_buf, pos_conv_len); for(uint16_t i = 0; i < pos_conv_len; i++) { if(GET_POS(pos_conv_buf[i]) == logical_pos) { @@ -179,8 +179,8 @@ uint16_t _lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t return (uint16_t) -1; } -void _lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t len, lv_base_dir_t base_dir, - uint16_t * pos_conv_out, uint16_t pos_conv_len) +void lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t len, lv_base_dir_t base_dir, + uint16_t * pos_conv_out, uint16_t pos_conv_len) { uint32_t run_len = 0; lv_base_dir_t run_dir; @@ -190,7 +190,7 @@ void _lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t le uint16_t pos_conv_rd = 0; uint16_t pos_conv_wr; - if(base_dir == LV_BASE_DIR_AUTO) base_dir = _lv_bidi_detect_base_dir(str_in); + if(base_dir == LV_BASE_DIR_AUTO) base_dir = lv_bidi_detect_base_dir(str_in); if(base_dir == LV_BASE_DIR_RTL) { wr = len; pos_conv_wr = pos_conv_len; @@ -274,7 +274,7 @@ void _lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t le void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt) { - if(*base_dir == LV_BASE_DIR_AUTO) *base_dir = _lv_bidi_detect_base_dir(txt); + if(*base_dir == LV_BASE_DIR_AUTO) *base_dir = lv_bidi_detect_base_dir(txt); if(*align == LV_TEXT_ALIGN_AUTO) { if(*base_dir == LV_BASE_DIR_RTL) *align = LV_TEXT_ALIGN_RIGHT; diff --git a/src/misc/lv_bidi.h b/src/misc/lv_bidi.h index c54edf8d6..b0e5f4e4a 100644 --- a/src/misc/lv_bidi.h +++ b/src/misc/lv_bidi.h @@ -28,85 +28,20 @@ extern "C" { /********************** * TYPEDEFS **********************/ -enum _lv_base_dir_t { +typedef enum { LV_BASE_DIR_LTR = 0x00, LV_BASE_DIR_RTL = 0x01, LV_BASE_DIR_AUTO = 0x02, LV_BASE_DIR_NEUTRAL = 0x20, LV_BASE_DIR_WEAK = 0x21, -}; - -#ifdef DOXYGEN -typedef _lv_base_dir_t lv_base_dir_t; -#else -typedef uint8_t lv_base_dir_t; -#endif /*DOXYGEN*/ +} lv_base_dir_t; /********************** * GLOBAL PROTOTYPES **********************/ #if LV_USE_BIDI -/** - * Convert a text to get the characters in the correct visual order according to - * Unicode Bidirectional Algorithm - * @param str_in the text to process - * @param str_out store the result here. Has the be `strlen(str_in)` length - * @param base_dir `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` - */ -void _lv_bidi_process(const char * str_in, char * str_out, lv_base_dir_t base_dir); - -/** - * Auto-detect the direction of a text based on the first strong character - * @param txt the text to process - * @return `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` - */ -lv_base_dir_t _lv_bidi_detect_base_dir(const char * txt); - -/** - * Get the logical position of a character in a line - * @param str_in the input string. Can be only one line. - * @param bidi_txt internally the text is bidi processed which buffer can be get here. - * If not required anymore has to freed with `lv_free()` - * Can be `NULL` is unused - * @param len length of the line in character count - * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` - * @param visual_pos the visual character position which logical position should be get - * @param is_rtl tell the char at `visual_pos` is RTL or LTR context - * @return the logical character position - */ -uint16_t _lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_base_dir_t base_dir, - uint32_t visual_pos, bool * is_rtl); - -/** - * Get the visual position of a character in a line - * @param str_in the input string. Can be only one line. - * @param bidi_txt internally the text is bidi processed which buffer can be get here. - * If not required anymore has to freed with `lv_free()` - * Can be `NULL` is unused - * @param len length of the line in character count - * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` - * @param logical_pos the logical character position which visual position should be get - * @param is_rtl tell the char at `logical_pos` is RTL or LTR context - * @return the visual character position - */ -uint16_t _lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t len, lv_base_dir_t base_dir, - uint32_t logical_pos, bool * is_rtl); - -/** - * Bidi process a paragraph of text - * @param str_in the string to process - * @param str_out store the result here - * @param len length of the text - * @param base_dir base dir of the text - * @param pos_conv_out an `uint16_t` array to store the related logical position of the character. - * Can be `NULL` is unused - * @param pos_conv_len length of `pos_conv_out` in element count - */ -void _lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t len, lv_base_dir_t base_dir, - uint16_t * pos_conv_out, uint16_t pos_conv_len); - /** * Get the real text alignment from the a text alignment, base direction and a text. * @param align LV_TEXT_ALIGN_..., write back the calculated align here (LV_TEXT_ALIGN_LEFT/RIGHT/CENTER) diff --git a/src/misc/lv_bidi_private.h b/src/misc/lv_bidi_private.h new file mode 100644 index 000000000..d197e4ac4 --- /dev/null +++ b/src/misc/lv_bidi_private.h @@ -0,0 +1,98 @@ +/** + * @file lv_bidi_private.h + * + */ + +#ifndef LV_BIDI_PRIVATE_H +#define LV_BIDI_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_bidi.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Convert a text to get the characters in the correct visual order according to + * Unicode Bidirectional Algorithm + * @param str_in the text to process + * @param str_out store the result here. Has the be `strlen(str_in)` length + * @param base_dir `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + */ +void lv_bidi_process(const char * str_in, char * str_out, lv_base_dir_t base_dir); + +/** + * Auto-detect the direction of a text based on the first strong character + * @param txt the text to process + * @return `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + */ +lv_base_dir_t lv_bidi_detect_base_dir(const char * txt); + +/** + * Get the logical position of a character in a line + * @param str_in the input string. Can be only one line. + * @param bidi_txt internally the text is bidi processed which buffer can be get here. + * If not required anymore has to freed with `lv_free()` + * Can be `NULL` is unused + * @param len length of the line in character count + * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + * @param visual_pos the visual character position which logical position should be get + * @param is_rtl tell the char at `visual_pos` is RTL or LTR context + * @return the logical character position + */ +uint16_t lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_base_dir_t base_dir, + uint32_t visual_pos, bool * is_rtl); + +/** + * Get the visual position of a character in a line + * @param str_in the input string. Can be only one line. + * @param bidi_txt internally the text is bidi processed which buffer can be get here. + * If not required anymore has to freed with `lv_free()` + * Can be `NULL` is unused + * @param len length of the line in character count + * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + * @param logical_pos the logical character position which visual position should be get + * @param is_rtl tell the char at `logical_pos` is RTL or LTR context + * @return the visual character position + */ +uint16_t lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t len, lv_base_dir_t base_dir, + uint32_t logical_pos, bool * is_rtl); + +/** + * Bidi process a paragraph of text + * @param str_in the string to process + * @param str_out store the result here + * @param len length of the text + * @param base_dir base dir of the text + * @param pos_conv_out an `uint16_t` array to store the related logical position of the character. + * Can be `NULL` is unused + * @param pos_conv_len length of `pos_conv_out` in element count + */ +void lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t len, lv_base_dir_t base_dir, + uint16_t * pos_conv_out, uint16_t pos_conv_len); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BIDI_PRIVATE_H*/ diff --git a/src/misc/lv_color.c b/src/misc/lv_color.c index 8e63d3c56..d56e355fe 100644 --- a/src/misc/lv_color.c +++ b/src/misc/lv_color.c @@ -8,7 +8,6 @@ *********************/ #include "lv_color.h" #include "lv_log.h" -#include "../misc/lv_color.h" /********************* * DEFINES @@ -241,6 +240,143 @@ lv_color_hsv_t lv_color_to_hsv(lv_color_t c) return lv_color_rgb_to_hsv(c.red, c.green, c.blue); } +uint8_t lv_color_format_get_size(lv_color_format_t cf) +{ + return (lv_color_format_get_bpp(cf) + 7) >> 3; +} + +uint32_t lv_color_to_int(lv_color_t c) +{ + uint8_t * tmp = (uint8_t *) &c; + return tmp[0] + (tmp[1] << 8) + (tmp[2] << 16); +} + +bool lv_color_eq(lv_color_t c1, lv_color_t c2) +{ + return lv_color_to_int(c1) == lv_color_to_int(c2); +} + +bool lv_color32_eq(lv_color32_t c1, lv_color32_t c2) +{ + return *((uint32_t *)&c1) == *((uint32_t *)&c2); +} + +lv_color_t lv_color_hex(uint32_t c) +{ + lv_color_t ret; + ret.red = (c >> 16) & 0xff; + ret.green = (c >> 8) & 0xff; + ret.blue = (c >> 0) & 0xff; + return ret; +} + +lv_color_t lv_color_make(uint8_t r, uint8_t g, uint8_t b) +{ + lv_color_t ret; + ret.red = r; + ret.green = g; + ret.blue = b; + return ret; +} + +lv_color32_t lv_color32_make(uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + lv_color32_t ret; + ret.red = r; + ret.green = g; + ret.blue = b; + ret.alpha = a; + return ret; +} + +lv_color_t lv_color_hex3(uint32_t c) +{ + return lv_color_make((uint8_t)(((c >> 4) & 0xF0) | ((c >> 8) & 0xF)), (uint8_t)((c & 0xF0) | ((c & 0xF0) >> 4)), + (uint8_t)((c & 0xF) | ((c & 0xF) << 4))); +} + +uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_16_16_mix(uint16_t c1, uint16_t c2, uint8_t mix) +{ + if(mix == 255) return c1; + if(mix == 0) return c2; + if(c1 == c2) return c1; + + uint16_t ret; + + /* Source: https://stackoverflow.com/a/50012418/1999969*/ + mix = (uint32_t)((uint32_t)mix + 4) >> 3; + + /*0x7E0F81F = 0b00000111111000001111100000011111*/ + uint32_t bg = (uint32_t)(c2 | ((uint32_t)c2 << 16)) & 0x7E0F81F; + uint32_t fg = (uint32_t)(c1 | ((uint32_t)c1 << 16)) & 0x7E0F81F; + uint32_t result = ((((fg - bg) * mix) >> 5) + bg) & 0x7E0F81F; + ret = (uint16_t)(result >> 16) | result; + + return ret; +} + +lv_color_t lv_color_white(void) +{ + return lv_color_make(0xff, 0xff, 0xff); +} + +lv_color_t lv_color_black(void) +{ + return lv_color_make(0x00, 0x00, 0x00); +} + +void lv_color_premultiply(lv_color32_t * c) +{ + if(c->alpha == LV_OPA_COVER) { + return; + } + + if(c->alpha == LV_OPA_TRANSP) { + lv_memzero(c, sizeof(lv_color32_t)); + return; + } + + c->red = LV_OPA_MIX2(c->red, c->alpha); + c->green = LV_OPA_MIX2(c->green, c->alpha); + c->blue = LV_OPA_MIX2(c->blue, c->alpha); +} + +void lv_color16_premultiply(lv_color16_t * c, lv_opa_t a) +{ + if(a == LV_OPA_COVER) { + return; + } + + if(a == LV_OPA_TRANSP) { + lv_memzero(c, sizeof(lv_color16_t)); + return; + } + + c->red = LV_OPA_MIX2(c->red, a); + c->green = LV_OPA_MIX2(c->green, a); + c->blue = LV_OPA_MIX2(c->blue, a); +} + +uint8_t lv_color_luminance(lv_color_t c) +{ + return (uint8_t)((uint16_t)(77u * c.red + 151u * c.green + 28u * c.blue) >> 8); +} + +uint8_t lv_color16_luminance(const lv_color16_t c) +{ + return (uint8_t)((uint16_t)(635u * c.red + 613u * c.green + 231u * c.blue) >> 8); +} + +uint8_t lv_color24_luminance(const uint8_t * c) +{ + return (uint8_t)((uint16_t)(77u * c[2] + 151u * c[1] + 28u * c[0]) >> 8); +} + +uint8_t lv_color32_luminance(lv_color32_t c) +{ + return (uint8_t)((uint16_t)(77u * c.red + 151u * c.green + 28u * c.blue) >> 8); +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/misc/lv_color.h b/src/misc/lv_color.h index 993045f01..e5beb2103 100644 --- a/src/misc/lv_color.h +++ b/src/misc/lv_color.h @@ -24,20 +24,20 @@ extern "C" { LV_EXPORT_CONST_INT(LV_COLOR_DEPTH); #if LV_COLOR_DEPTH == 8 -#define _LV_COLOR_NATIVE_WITH_ALPHA_SIZE 2 +#define LV_COLOR_NATIVE_WITH_ALPHA_SIZE 2 #elif LV_COLOR_DEPTH == 16 -#define _LV_COLOR_NATIVE_WITH_ALPHA_SIZE 3 +#define LV_COLOR_NATIVE_WITH_ALPHA_SIZE 3 #elif LV_COLOR_DEPTH == 24 -#define _LV_COLOR_NATIVE_WITH_ALPHA_SIZE 4 +#define LV_COLOR_NATIVE_WITH_ALPHA_SIZE 4 #elif LV_COLOR_DEPTH == 32 -#define _LV_COLOR_NATIVE_WITH_ALPHA_SIZE 4 +#define LV_COLOR_NATIVE_WITH_ALPHA_SIZE 4 #endif /** * Opacity percentages. */ -enum _lv_opa_t { +enum { LV_OPA_TRANSP = 0, LV_OPA_0 = 0, LV_OPA_10 = 25, @@ -53,12 +53,6 @@ enum _lv_opa_t { LV_OPA_COVER = 255, }; -#ifdef DOXYGEN -typedef _lv_opa_t lv_opa_t; -#else -typedef uint8_t lv_opa_t; -#endif /*DOXYGEN*/ - #define LV_OPA_MIN 2 /*Opacities below this will be transparent*/ #define LV_OPA_MAX 253 /*Opacities above this will fully cover*/ @@ -130,7 +124,7 @@ typedef struct { uint8_t alpha; } lv_color16a_t; -enum _lv_color_format_t { +typedef enum { LV_COLOR_FORMAT_UNKNOWN = 0, LV_COLOR_FORMAT_RAW = 0x01, @@ -190,13 +184,7 @@ enum _lv_color_format_t { LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_XRGB8888, LV_COLOR_FORMAT_NATIVE_WITH_ALPHA = LV_COLOR_FORMAT_ARGB8888, #endif -}; - -#ifdef DOXYGEN -typedef _lv_color_format_t lv_color_format_t; -#else -typedef uint8_t lv_color_format_t; -#endif /*DOXYGEN*/ +} lv_color_format_t; #define LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf) ((cf) >= LV_COLOR_FORMAT_A1 && (cf) <= LV_COLOR_FORMAT_A8) #define LV_COLOR_FORMAT_IS_INDEXED(cf) ((cf) >= LV_COLOR_FORMAT_I1 && (cf) <= LV_COLOR_FORMAT_I8) @@ -233,10 +221,7 @@ uint8_t lv_color_format_get_bpp(lv_color_format_t cf); * @return the pixel size in bytes * @sa LV_COLOR_FORMAT_GET_SIZE */ -static inline uint8_t lv_color_format_get_size(lv_color_format_t cf) -{ - return (lv_color_format_get_bpp(cf) + 7) >> 3; -} +uint8_t lv_color_format_get_size(lv_color_format_t cf); /** * Check if a color format has alpha channel or not @@ -258,11 +243,7 @@ lv_color32_t lv_color_to_32(lv_color_t color, lv_opa_t opa); * @param c an RGB888 color * @return `c` as an integer */ -static inline uint32_t lv_color_to_int(lv_color_t c) -{ - uint8_t * tmp = (uint8_t *) &c; - return tmp[0] + (tmp[1] << 8) + (tmp[2] << 16); -} +uint32_t lv_color_to_int(lv_color_t c); /** * Check if two RGB888 color are equal @@ -270,10 +251,7 @@ static inline uint32_t lv_color_to_int(lv_color_t c) * @param c2 the second color * @return true: equal */ -static inline bool lv_color_eq(lv_color_t c1, lv_color_t c2) -{ - return lv_color_to_int(c1) == lv_color_to_int(c2); -} +bool lv_color_eq(lv_color_t c1, lv_color_t c2); /** * Check if two ARGB8888 color are equal @@ -281,24 +259,14 @@ static inline bool lv_color_eq(lv_color_t c1, lv_color_t c2) * @param c2 the second color * @return true: equal */ -static inline bool lv_color32_eq(lv_color32_t c1, lv_color32_t c2) -{ - return *((uint32_t *)&c1) == *((uint32_t *)&c2); -} +bool lv_color32_eq(lv_color32_t c1, lv_color32_t c2); /** * Create a color from 0x000000..0xffffff input * @param c the hex input * @return the color */ -static inline lv_color_t lv_color_hex(uint32_t c) -{ - lv_color_t ret; - ret.red = (c >> 16) & 0xff; - ret.green = (c >> 8) & 0xff; - ret.blue = (c >> 0) & 0xff; - return ret; -} +lv_color_t lv_color_hex(uint32_t c); /** * Create an RGB888 color @@ -307,14 +275,7 @@ static inline lv_color_t lv_color_hex(uint32_t c) * @param b the blue channel (0..255) * @return the color */ -static inline lv_color_t lv_color_make(uint8_t r, uint8_t g, uint8_t b) -{ - lv_color_t ret; - ret.red = r; - ret.green = g; - ret.blue = b; - return ret; -} +lv_color_t lv_color_make(uint8_t r, uint8_t g, uint8_t b); /** * Create an ARGB8888 color @@ -324,26 +285,14 @@ static inline lv_color_t lv_color_make(uint8_t r, uint8_t g, uint8_t b) * @param a the alpha channel (0..255) * @return the color */ -static inline lv_color32_t lv_color32_make(uint8_t r, uint8_t g, uint8_t b, uint8_t a) -{ - lv_color32_t ret; - ret.red = r; - ret.green = g; - ret.blue = b; - ret.alpha = a; - return ret; -} +lv_color32_t lv_color32_make(uint8_t r, uint8_t g, uint8_t b, uint8_t a); /** * Create a color from 0x000..0xfff input * @param c the hex input (e.g. 0x123 will be 0x112233) * @return the color */ -static inline lv_color_t lv_color_hex3(uint32_t c) -{ - return lv_color_make((uint8_t)(((c >> 4) & 0xF0) | ((c >> 8) & 0xF)), (uint8_t)((c & 0xF0) | ((c & 0xF0) >> 4)), - (uint8_t)((c & 0xF) | ((c & 0xF) << 4))); -} +lv_color_t lv_color_hex3(uint32_t c); /** * Convert am RGB888 color to RGB565 stored in `uint16_t` @@ -368,25 +317,7 @@ uint32_t lv_color_to_u32(lv_color_t color); * mix == 255: c1 * mix == 128: 0.5 x c1 + 0.5 x c2 */ -static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_16_16_mix(uint16_t c1, uint16_t c2, uint8_t mix) -{ - if(mix == 255) return c1; - if(mix == 0) return c2; - if(c1 == c2) return c1; - - uint16_t ret; - - /* Source: https://stackoverflow.com/a/50012418/1999969*/ - mix = (uint32_t)((uint32_t)mix + 4) >> 3; - - /*0x7E0F81F = 0b00000111111000001111100000011111*/ - uint32_t bg = (uint32_t)(c2 | ((uint32_t)c2 << 16)) & 0x7E0F81F; - uint32_t fg = (uint32_t)(c1 | ((uint32_t)c1 << 16)) & 0x7E0F81F; - uint32_t result = ((((fg - bg) * mix) >> 5) + bg) & 0x7E0F81F; - ret = (uint16_t)(result >> 16) | result; - - return ret; -} +uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_16_16_mix(uint16_t c1, uint16_t c2, uint8_t mix); /** * Mix white to a color @@ -435,91 +366,45 @@ lv_color_hsv_t lv_color_to_hsv(lv_color_t color); * A helper for white color * @return a white color */ -static inline lv_color_t lv_color_white(void) -{ - return lv_color_make(0xff, 0xff, 0xff); -} +lv_color_t lv_color_white(void); /** * A helper for black color * @return a black color */ -static inline lv_color_t lv_color_black(void) -{ - return lv_color_make(0x00, 0x00, 0x00); -} +lv_color_t lv_color_black(void); -static inline void lv_color_premultiply(lv_color32_t * c) -{ - if(c->alpha == LV_OPA_COVER) { - return; - } +void lv_color_premultiply(lv_color32_t * c); - if(c->alpha == LV_OPA_TRANSP) { - lv_memzero(c, sizeof(lv_color32_t)); - return; - } - - c->red = LV_OPA_MIX2(c->red, c->alpha); - c->green = LV_OPA_MIX2(c->green, c->alpha); - c->blue = LV_OPA_MIX2(c->blue, c->alpha); -} - -static inline void lv_color16_premultiply(lv_color16_t * c, lv_opa_t a) -{ - if(a == LV_OPA_COVER) { - return; - } - - if(a == LV_OPA_TRANSP) { - lv_memzero(c, sizeof(lv_color16_t)); - return; - } - - c->red = LV_OPA_MIX2(c->red, a); - c->green = LV_OPA_MIX2(c->green, a); - c->blue = LV_OPA_MIX2(c->blue, a); -} +void lv_color16_premultiply(lv_color16_t * c, lv_opa_t a); /** * Get the luminance of a color: luminance = 0.3 R + 0.59 G + 0.11 B * @param color a color * @return the brightness [0..255] */ -static inline uint8_t lv_color_luminance(lv_color_t c) -{ - return (uint8_t)((uint16_t)(77u * c.red + 151u * c.green + 28u * c.blue) >> 8); -} +uint8_t lv_color_luminance(lv_color_t c); /** * Get the luminance of a color16: luminance = 0.3 R + 0.59 G + 0.11 B * @param color a color * @return the brightness [0..255] */ -static inline uint8_t lv_color16_luminance(const lv_color16_t c) -{ - return (uint8_t)((uint16_t)(635u * c.red + 613u * c.green + 231u * c.blue) >> 8); -} +uint8_t lv_color16_luminance(const lv_color16_t c); /** * Get the luminance of a color24: luminance = 0.3 R + 0.59 G + 0.11 B * @param color a color * @return the brightness [0..255] */ -static inline uint8_t lv_color24_luminance(const uint8_t * c) -{ - return (uint8_t)((uint16_t)(77u * c[2] + 151u * c[1] + 28u * c[0]) >> 8); -} +uint8_t lv_color24_luminance(const uint8_t * c); /** * Get the luminance of a color32: luminance = 0.3 R + 0.59 G + 0.11 B * @param color a color * @return the brightness [0..255] */ -static inline uint8_t lv_color32_luminance(lv_color32_t c) -{ - return (uint8_t)((uint16_t)(77u * c.red + 151u * c.green + 28u * c.blue) >> 8); -} +uint8_t lv_color32_luminance(lv_color32_t c); /********************** * MACROS diff --git a/src/misc/lv_color_op.c b/src/misc/lv_color_op.c index 5e2fb3455..a26f2b453 100644 --- a/src/misc/lv_color_op.c +++ b/src/misc/lv_color_op.c @@ -6,9 +6,8 @@ /********************* * INCLUDES *********************/ -#include "lv_color.h" +#include "lv_color_op_private.h" #include "lv_log.h" -#include "../misc/lv_color.h" /********************* * DEFINES @@ -33,3 +32,43 @@ /********************** * GLOBAL FUNCTIONS **********************/ + +lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix) +{ + lv_color_t ret; + + ret.red = LV_UDIV255((uint16_t)c1.red * mix + c2.red * (255 - mix) + LV_COLOR_MIX_ROUND_OFS); + ret.green = LV_UDIV255((uint16_t)c1.green * mix + c2.green * (255 - mix) + LV_COLOR_MIX_ROUND_OFS); + ret.blue = LV_UDIV255((uint16_t)c1.blue * mix + c2.blue * (255 - mix) + LV_COLOR_MIX_ROUND_OFS); + return ret; +} + +lv_color32_t lv_color_mix32(lv_color32_t fg, lv_color32_t bg) +{ + if(fg.alpha >= LV_OPA_MAX) { + fg.alpha = bg.alpha; + return fg; + } + if(fg.alpha <= LV_OPA_MIN) { + return bg; + } + bg.red = (uint32_t)((uint32_t)fg.red * fg.alpha + (uint32_t)bg.red * (255 - fg.alpha)) >> 8; + bg.green = (uint32_t)((uint32_t)fg.green * fg.alpha + (uint32_t)bg.green * (255 - fg.alpha)) >> 8; + bg.blue = (uint32_t)((uint32_t)fg.blue * fg.alpha + (uint32_t)bg.blue * (255 - fg.alpha)) >> 8; + return bg; +} + +uint8_t lv_color_brightness(lv_color_t c) +{ + uint16_t bright = (uint16_t)(3u * c.red + c.green + 4u * c.blue); + return (uint8_t)(bright >> 3); +} + +void lv_color_filter_dsc_init(lv_color_filter_dsc_t * dsc, lv_color_filter_cb_t cb) +{ + dsc->filter_cb = cb; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/src/misc/lv_color_op.h b/src/misc/lv_color_op.h index e16510abc..c1820a6aa 100644 --- a/src/misc/lv_color_op.h +++ b/src/misc/lv_color_op.h @@ -26,14 +26,14 @@ extern "C" { * TYPEDEFS **********************/ -struct _lv_color_filter_dsc_t; +struct lv_color_filter_dsc_t; -typedef lv_color_t (*lv_color_filter_cb_t)(const struct _lv_color_filter_dsc_t *, lv_color_t, lv_opa_t); +typedef lv_color_t (*lv_color_filter_cb_t)(const struct lv_color_filter_dsc_t *, lv_color_t, lv_opa_t); -typedef struct _lv_color_filter_dsc_t { +struct lv_color_filter_dsc_t { lv_color_filter_cb_t filter_cb; void * user_data; -} lv_color_filter_dsc_t; +}; /********************** * GLOBAL PROTOTYPES @@ -46,15 +46,7 @@ typedef struct _lv_color_filter_dsc_t { * @param mix The ratio of the colors. 0: full `c2`, 255: full `c1`, 127: half `c1` and half`c2` * @return the mixed color */ -static inline lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix) -{ - lv_color_t ret; - - ret.red = LV_UDIV255((uint16_t)c1.red * mix + c2.red * (255 - mix) + LV_COLOR_MIX_ROUND_OFS); - ret.green = LV_UDIV255((uint16_t)c1.green * mix + c2.green * (255 - mix) + LV_COLOR_MIX_ROUND_OFS); - ret.blue = LV_UDIV255((uint16_t)c1.blue * mix + c2.blue * (255 - mix) + LV_COLOR_MIX_ROUND_OFS); - return ret; -} +lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix); /** * @@ -64,20 +56,7 @@ static inline lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix(lv_color_t c1, lv_co * @note Use bg.alpha in the return value * @note Use fg.alpha as mix ratio */ -static inline lv_color32_t lv_color_mix32(lv_color32_t fg, lv_color32_t bg) -{ - if(fg.alpha >= LV_OPA_MAX) { - fg.alpha = bg.alpha; - return fg; - } - if(fg.alpha <= LV_OPA_MIN) { - return bg; - } - bg.red = (uint32_t)((uint32_t)fg.red * fg.alpha + (uint32_t)bg.red * (255 - fg.alpha)) >> 8; - bg.green = (uint32_t)((uint32_t)fg.green * fg.alpha + (uint32_t)bg.green * (255 - fg.alpha)) >> 8; - bg.blue = (uint32_t)((uint32_t)fg.blue * fg.alpha + (uint32_t)bg.blue * (255 - fg.alpha)) >> 8; - return bg; -} +lv_color32_t lv_color_mix32(lv_color32_t fg, lv_color32_t bg); //! @endcond @@ -86,16 +65,9 @@ static inline lv_color32_t lv_color_mix32(lv_color32_t fg, lv_color32_t bg) * @param color a color * @return the brightness [0..255] */ -static inline uint8_t lv_color_brightness(lv_color_t c) -{ - uint16_t bright = (uint16_t)(3u * c.red + c.green + 4u * c.blue); - return (uint8_t)(bright >> 3); -} +uint8_t lv_color_brightness(lv_color_t c); -static inline void lv_color_filter_dsc_init(lv_color_filter_dsc_t * dsc, lv_color_filter_cb_t cb) -{ - dsc->filter_cb = cb; -} +void lv_color_filter_dsc_init(lv_color_filter_dsc_t * dsc, lv_color_filter_cb_t cb); /********************** * PREDEFINED COLORS diff --git a/src/misc/lv_color_op_private.h b/src/misc/lv_color_op_private.h new file mode 100644 index 000000000..d6516ebd0 --- /dev/null +++ b/src/misc/lv_color_op_private.h @@ -0,0 +1,39 @@ +/** + * @file lv_color_op_private.h + * + */ + +#ifndef LV_COLOR_OP_PRIVATE_H +#define LV_COLOR_OP_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_color_op.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_COLOR_OP_PRIVATE_H*/ diff --git a/src/misc/lv_event.c b/src/misc/lv_event.c index 00f16f62b..ec985ed25 100644 --- a/src/misc/lv_event.c +++ b/src/misc/lv_event.c @@ -6,7 +6,7 @@ /********************* * INCLUDES *********************/ -#include "lv_event.h" +#include "lv_event_private.h" #include "../core/lv_global.h" #include "../stdlib/lv_mem.h" #include "lv_assert.h" @@ -45,7 +45,7 @@ * GLOBAL FUNCTIONS **********************/ -void _lv_event_push(lv_event_t * e) +void lv_event_push(lv_event_t * e) { /*Build a simple linked list from the objects used in the events *It's important to know if this object was deleted by a nested event @@ -55,7 +55,7 @@ void _lv_event_push(lv_event_t * e) } -void _lv_event_pop(lv_event_t * e) +void lv_event_pop(lv_event_t * e) { event_head = e->prev; } @@ -209,7 +209,7 @@ uint32_t lv_event_register_id(void) return event_last_id; } -void _lv_event_mark_deleted(void * target) +void lv_event_mark_deleted(void * target) { lv_event_t * e = event_head; diff --git a/src/misc/lv_event.h b/src/misc/lv_event.h index 606ea04c0..10c36c32c 100644 --- a/src/misc/lv_event.h +++ b/src/misc/lv_event.h @@ -28,12 +28,6 @@ extern "C" { typedef void (*lv_event_cb_t)(lv_event_t * e); -typedef struct { - lv_event_cb_t cb; - void * user_data; - uint32_t filter; -} lv_event_dsc_t; - /** * Type of event being sent to the object. */ @@ -113,7 +107,7 @@ typedef enum { LV_EVENT_VSYNC, - _LV_EVENT_LAST, /** Number of default events*/ + LV_EVENT_LAST, /** Number of default events*/ LV_EVENT_PREPROCESS = 0x8000, /** This is a flag that can be set with an event so it's processed before the class default event processing */ @@ -121,32 +115,12 @@ typedef enum { typedef lv_array_t lv_event_list_t; -struct _lv_event_t { - void * current_target; - void * original_target; - lv_event_code_t code; - void * user_data; - void * param; - lv_event_t * prev; - uint8_t deleted : 1; - uint8_t stop_processing : 1; - uint8_t stop_bubbling : 1; -}; - /** * @brief Event callback. * Events are used to notify the user of some action being taken on the object. * For details, see ::lv_event_t. */ -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void _lv_event_push(lv_event_t * e); - -void _lv_event_pop(lv_event_t * e); - lv_result_t lv_event_send(lv_event_list_t * list, lv_event_t * e, bool preprocess); lv_event_dsc_t * lv_event_add(lv_event_list_t * list, lv_event_cb_t cb, lv_event_code_t filter, void * user_data); @@ -227,13 +201,6 @@ void lv_event_stop_processing(lv_event_t * e); */ uint32_t lv_event_register_id(void); -/** - * Nested events can be called and one of them might belong to an object that is being deleted. - * Mark this object's `event_temp_data` deleted to know that its `lv_obj_send_event` should return `LV_RESULT_INVALID` - * @param target pointer to an event target which was deleted - */ -void _lv_event_mark_deleted(void * target); - /********************** * MACROS **********************/ diff --git a/src/misc/lv_event_private.h b/src/misc/lv_event_private.h new file mode 100644 index 000000000..b31ca81b8 --- /dev/null +++ b/src/misc/lv_event_private.h @@ -0,0 +1,73 @@ +/** + * @file lv_event_private.h + * + */ + +#ifndef LV_EVENT_PRIVATE_H +#define LV_EVENT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_event.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_event_dsc_t { + lv_event_cb_t cb; + void * user_data; + uint32_t filter; +}; + +struct lv_event_t { + void * current_target; + void * original_target; + lv_event_code_t code; + void * user_data; + void * param; + lv_event_t * prev; + uint8_t deleted : 1; + uint8_t stop_processing : 1; + uint8_t stop_bubbling : 1; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_event_push(lv_event_t * e); + +void lv_event_pop(lv_event_t * e); + +/** + * Nested events can be called and one of them might belong to an object that is being deleted. + * Mark this object's `event_temp_data` deleted to know that its `lv_obj_send_event` should return `LV_RESULT_INVALID` + * @param target pointer to an event target which was deleted + */ +void lv_event_mark_deleted(void * target); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_EVENT_PRIVATE_H*/ diff --git a/src/misc/lv_fs.c b/src/misc/lv_fs.c index c7079f521..3c3a587eb 100644 --- a/src/misc/lv_fs.c +++ b/src/misc/lv_fs.c @@ -6,7 +6,7 @@ /********************* * INCLUDES *********************/ -#include "lv_fs.h" +#include "lv_fs_private.h" #include "../misc/lv_assert.h" #include "../misc/lv_profiler.h" @@ -43,14 +43,14 @@ static lv_fs_res_t lv_fs_seek_cached(lv_fs_file_t * file_p, uint32_t pos, lv_fs_ * GLOBAL FUNCTIONS **********************/ -void _lv_fs_init(void) +void lv_fs_init(void) { - _lv_ll_init(fsdrv_ll_p, sizeof(lv_fs_drv_t *)); + lv_ll_init(fsdrv_ll_p, sizeof(lv_fs_drv_t *)); } -void _lv_fs_deinit(void) +void lv_fs_deinit(void) { - _lv_ll_clear(fsdrv_ll_p); + lv_ll_clear(fsdrv_ll_p); } bool lv_fs_is_ready(char letter) @@ -388,7 +388,7 @@ void lv_fs_drv_register(lv_fs_drv_t * drv_p) { /*Save the new driver*/ lv_fs_drv_t ** new_drv; - new_drv = _lv_ll_ins_head(fsdrv_ll_p); + new_drv = lv_ll_ins_head(fsdrv_ll_p); LV_ASSERT_MALLOC(new_drv); if(new_drv == NULL) return; @@ -399,7 +399,7 @@ lv_fs_drv_t * lv_fs_get_drv(char letter) { lv_fs_drv_t ** drv; - _LV_LL_READ(fsdrv_ll_p, drv) { + LV_LL_READ(fsdrv_ll_p, drv) { if((*drv)->letter == letter) { return *drv; } @@ -413,7 +413,7 @@ char * lv_fs_get_letters(char * buf) lv_fs_drv_t ** drv; uint8_t i = 0; - _LV_LL_READ(fsdrv_ll_p, drv) { + LV_LL_READ(fsdrv_ll_p, drv) { buf[i] = (*drv)->letter; i++; } diff --git a/src/misc/lv_fs.h b/src/misc/lv_fs.h index dfa004e81..27e311f5d 100644 --- a/src/misc/lv_fs.h +++ b/src/misc/lv_fs.h @@ -31,7 +31,7 @@ extern "C" { /** * Errors in the file system module. */ -enum _lv_fs_res_t { +typedef enum { LV_FS_RES_OK = 0, LV_FS_RES_HW_ERR, /*Low level hardware error*/ LV_FS_RES_FS_ERR, /*Error in the file system structure*/ @@ -45,27 +45,15 @@ enum _lv_fs_res_t { LV_FS_RES_OUT_OF_MEM, /*Not enough memory for an internal operation*/ LV_FS_RES_INV_PARAM, /*Invalid parameter among arguments*/ LV_FS_RES_UNKNOWN, /*Other unknown error*/ -}; - -#ifdef DOXYGEN -typedef _lv_fs_res_t lv_fs_res_t; -#else -typedef uint8_t lv_fs_res_t; -#endif /*DOXYGEN*/ +} lv_fs_res_t; /** * File open mode. */ -enum _lv_fs_mode_t { +typedef enum { LV_FS_MODE_WR = 0x01, LV_FS_MODE_RD = 0x02, -}; - -#ifdef DOXYGEN -typedef _lv_fs_mode_t lv_fs_mode_t; -#else -typedef uint8_t lv_fs_mode_t; -#endif /*DOXYGEN*/ +} lv_fs_mode_t; /** * Seek modes. @@ -76,9 +64,9 @@ typedef enum { LV_FS_SEEK_END = 0x02, /**< Set the position from the end of the file*/ } lv_fs_whence_t; -struct _lv_fs_drv_t; -typedef struct _lv_fs_drv_t lv_fs_drv_t; -struct _lv_fs_drv_t { +struct lv_fs_drv_t; +typedef struct lv_fs_drv_t lv_fs_drv_t; +struct lv_fs_drv_t { char letter; uint32_t cache_size; bool (*ready_cb)(lv_fs_drv_t * drv); @@ -97,45 +85,16 @@ struct _lv_fs_drv_t { void * user_data; /**< Custom file user data*/ }; -typedef struct { - uint32_t start; - uint32_t end; - uint32_t file_position; - void * buffer; -} lv_fs_file_cache_t; - typedef struct { void * file_d; lv_fs_drv_t * drv; lv_fs_file_cache_t * cache; } lv_fs_file_t; -/* Extended path object to specify the buffer for memory-mapped files */ -typedef struct { - char path[4]; /* This is needed to make it compatible with a normal path */ - const void * buffer; - uint32_t size; -} lv_fs_path_ex_t; - -typedef struct { - void * dir_d; - lv_fs_drv_t * drv; -} lv_fs_dir_t; - /********************** * GLOBAL PROTOTYPES **********************/ -/** - * Initialize the File system interface - */ -void _lv_fs_init(void); - -/** - * Deinitialize the File system interface - */ -void _lv_fs_deinit(void); - /** * Initialize a file system driver with default values. * It is used to ensure all fields have known values and not memory junk. diff --git a/src/misc/lv_fs_private.h b/src/misc/lv_fs_private.h new file mode 100644 index 000000000..60f23d22c --- /dev/null +++ b/src/misc/lv_fs_private.h @@ -0,0 +1,69 @@ +/** + * @file lv_fs_private.h + * + */ + +#ifndef LV_FS_PRIVATE_H +#define LV_FS_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_fs.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_fs_file_cache_t { + uint32_t start; + uint32_t end; + uint32_t file_position; + void * buffer; +}; + +/* Extended path object to specify the buffer for memory-mapped files */ +struct lv_fs_path_ex_t { + char path[4]; /* This is needed to make it compatible with a normal path */ + const void * buffer; + uint32_t size; +}; + +struct lv_fs_dir_t { + void * dir_d; + lv_fs_drv_t * drv; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the File system interface + */ +void lv_fs_init(void); + +/** + * Deinitialize the File system interface + */ +void lv_fs_deinit(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FS_PRIVATE_H*/ diff --git a/src/misc/lv_ll.c b/src/misc/lv_ll.c index 6debda073..ca1339ec5 100644 --- a/src/misc/lv_ll.c +++ b/src/misc/lv_ll.c @@ -39,7 +39,7 @@ static void node_set_next(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * nex * GLOBAL FUNCTIONS **********************/ -void _lv_ll_init(lv_ll_t * ll_p, uint32_t node_size) +void lv_ll_init(lv_ll_t * ll_p, uint32_t node_size) { ll_p->head = NULL; ll_p->tail = NULL; @@ -54,7 +54,7 @@ void _lv_ll_init(lv_ll_t * ll_p, uint32_t node_size) ll_p->n_size = node_size; } -void * _lv_ll_ins_head(lv_ll_t * ll_p) +void * lv_ll_ins_head(lv_ll_t * ll_p) { lv_ll_node_t * n_new; @@ -77,14 +77,14 @@ void * _lv_ll_ins_head(lv_ll_t * ll_p) return n_new; } -void * _lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act) +void * lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act) { lv_ll_node_t * n_new; if(NULL == ll_p || NULL == n_act) return NULL; - if(_lv_ll_get_head(ll_p) == n_act) { - n_new = _lv_ll_ins_head(ll_p); + if(lv_ll_get_head(ll_p) == n_act) { + n_new = lv_ll_ins_head(ll_p); if(n_new == NULL) return NULL; } else { @@ -92,7 +92,7 @@ void * _lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act) if(n_new == NULL) return NULL; lv_ll_node_t * n_prev; - n_prev = _lv_ll_get_prev(ll_p, n_act); + n_prev = lv_ll_get_prev(ll_p, n_act); node_set_next(ll_p, n_prev, n_new); node_set_prev(ll_p, n_new, n_prev); node_set_prev(ll_p, n_act, n_new); @@ -102,7 +102,7 @@ void * _lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act) return n_new; } -void * _lv_ll_ins_tail(lv_ll_t * ll_p) +void * lv_ll_ins_tail(lv_ll_t * ll_p) { lv_ll_node_t * n_new; @@ -124,13 +124,13 @@ void * _lv_ll_ins_tail(lv_ll_t * ll_p) return n_new; } -void _lv_ll_remove(lv_ll_t * ll_p, void * node_p) +void lv_ll_remove(lv_ll_t * ll_p, void * node_p) { if(ll_p == NULL) return; - if(_lv_ll_get_head(ll_p) == node_p) { + if(lv_ll_get_head(ll_p) == node_p) { /*The new head will be the node after 'n_act'*/ - ll_p->head = _lv_ll_get_next(ll_p, node_p); + ll_p->head = lv_ll_get_next(ll_p, node_p); if(ll_p->head == NULL) { ll_p->tail = NULL; } @@ -138,9 +138,9 @@ void _lv_ll_remove(lv_ll_t * ll_p, void * node_p) node_set_prev(ll_p, ll_p->head, NULL); } } - else if(_lv_ll_get_tail(ll_p) == node_p) { + else if(lv_ll_get_tail(ll_p) == node_p) { /*The new tail will be the node before 'n_act'*/ - ll_p->tail = _lv_ll_get_prev(ll_p, node_p); + ll_p->tail = lv_ll_get_prev(ll_p, node_p); if(ll_p->tail == NULL) { ll_p->head = NULL; } @@ -149,26 +149,26 @@ void _lv_ll_remove(lv_ll_t * ll_p, void * node_p) } } else { - lv_ll_node_t * n_prev = _lv_ll_get_prev(ll_p, node_p); - lv_ll_node_t * n_next = _lv_ll_get_next(ll_p, node_p); + lv_ll_node_t * n_prev = lv_ll_get_prev(ll_p, node_p); + lv_ll_node_t * n_next = lv_ll_get_next(ll_p, node_p); node_set_next(ll_p, n_prev, n_next); node_set_prev(ll_p, n_next, n_prev); } } -void _lv_ll_clear_custom(lv_ll_t * ll_p, void(*cleanup)(void *)) +void lv_ll_clear_custom(lv_ll_t * ll_p, void(*cleanup)(void *)) { void * i; void * i_next; - i = _lv_ll_get_head(ll_p); + i = lv_ll_get_head(ll_p); i_next = NULL; while(i != NULL) { - i_next = _lv_ll_get_next(ll_p, i); + i_next = lv_ll_get_next(ll_p, i); if(cleanup == NULL) { - _lv_ll_remove(ll_p, i); + lv_ll_remove(ll_p, i); lv_free(i); } else { @@ -178,9 +178,9 @@ void _lv_ll_clear_custom(lv_ll_t * ll_p, void(*cleanup)(void *)) } } -void _lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool head) +void lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool head) { - _lv_ll_remove(ll_ori_p, node); + lv_ll_remove(ll_ori_p, node); if(head) { /*Set node as head*/ @@ -212,19 +212,19 @@ void _lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool h } } -void * _lv_ll_get_head(const lv_ll_t * ll_p) +void * lv_ll_get_head(const lv_ll_t * ll_p) { if(ll_p == NULL) return NULL; return ll_p->head; } -void * _lv_ll_get_tail(const lv_ll_t * ll_p) +void * lv_ll_get_tail(const lv_ll_t * ll_p) { if(ll_p == NULL) return NULL; return ll_p->tail; } -void * _lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act) +void * lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act) { /*Pointer to the next node is stored in the end of this node. *Go there and return the address found there*/ @@ -233,7 +233,7 @@ void * _lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act) return *((lv_ll_node_t **)n_act_d); } -void * _lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act) +void * lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act) { /*Pointer to the prev. node is stored in the end of this node. *Go there and return the address found there*/ @@ -242,32 +242,32 @@ void * _lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act) return *((lv_ll_node_t **)n_act_d); } -uint32_t _lv_ll_get_len(const lv_ll_t * ll_p) +uint32_t lv_ll_get_len(const lv_ll_t * ll_p) { uint32_t len = 0; void * node; - for(node = _lv_ll_get_head(ll_p); node != NULL; node = _lv_ll_get_next(ll_p, node)) { + for(node = lv_ll_get_head(ll_p); node != NULL; node = lv_ll_get_next(ll_p, node)) { len++; } return len; } -void _lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after) +void lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after) { if(n_act == n_after) return; /*Can't move before itself*/ void * n_before; if(n_after != NULL) - n_before = _lv_ll_get_prev(ll_p, n_after); + n_before = lv_ll_get_prev(ll_p, n_after); else - n_before = _lv_ll_get_tail(ll_p); /*if `n_after` is NULL `n_act` should be the new tail*/ + n_before = lv_ll_get_tail(ll_p); /*if `n_after` is NULL `n_act` should be the new tail*/ if(n_act == n_before) return; /*Already before `n_after`*/ /*It's much easier to remove from the list and add again*/ - _lv_ll_remove(ll_p, n_act); + lv_ll_remove(ll_p, n_act); /*Add again by setting the prev. and next nodes*/ node_set_next(ll_p, n_before, n_act); @@ -282,7 +282,7 @@ void _lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after) if(n_before == NULL) ll_p->head = n_act; } -bool _lv_ll_is_empty(lv_ll_t * ll_p) +bool lv_ll_is_empty(lv_ll_t * ll_p) { if(ll_p == NULL) return true; @@ -291,6 +291,11 @@ bool _lv_ll_is_empty(lv_ll_t * ll_p) return false; } +void lv_ll_clear(lv_ll_t * ll_p) +{ + lv_ll_clear_custom(ll_p, NULL); +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/misc/lv_ll.h b/src/misc/lv_ll.h index 7a9007c8f..384bf3a2f 100644 --- a/src/misc/lv_ll.h +++ b/src/misc/lv_ll.h @@ -43,14 +43,14 @@ typedef struct { * @param ll_p pointer to lv_ll_t variable * @param node_size the size of 1 node in bytes */ -void _lv_ll_init(lv_ll_t * ll_p, uint32_t node_size); +void lv_ll_init(lv_ll_t * ll_p, uint32_t node_size); /** * Add a new head to a linked list * @param ll_p pointer to linked list * @return pointer to the new head */ -void * _lv_ll_ins_head(lv_ll_t * ll_p); +void * lv_ll_ins_head(lv_ll_t * ll_p); /** * Insert a new node in front of the n_act node @@ -58,14 +58,14 @@ void * _lv_ll_ins_head(lv_ll_t * ll_p); * @param n_act pointer a node * @return pointer to the new node */ -void * _lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act); +void * lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act); /** * Add a new tail to a linked list * @param ll_p pointer to linked list * @return pointer to the new tail */ -void * _lv_ll_ins_tail(lv_ll_t * ll_p); +void * lv_ll_ins_tail(lv_ll_t * ll_p); /** * Remove the node 'node_p' from 'll_p' linked list. @@ -73,18 +73,15 @@ void * _lv_ll_ins_tail(lv_ll_t * ll_p); * @param ll_p pointer to the linked list of 'node_p' * @param node_p pointer to node in 'll_p' linked list */ -void _lv_ll_remove(lv_ll_t * ll_p, void * node_p); +void lv_ll_remove(lv_ll_t * ll_p, void * node_p); -void _lv_ll_clear_custom(lv_ll_t * ll_p, void(*cleanup)(void *)); +void lv_ll_clear_custom(lv_ll_t * ll_p, void(*cleanup)(void *)); /** * Remove and free all elements from a linked list. The list remain valid but become empty. * @param ll_p pointer to linked list */ -static inline void _lv_ll_clear(lv_ll_t * ll_p) -{ - _lv_ll_clear_custom(ll_p, NULL); -} +void lv_ll_clear(lv_ll_t * ll_p); /** * Move a node to a new linked list @@ -94,21 +91,21 @@ static inline void _lv_ll_clear(lv_ll_t * ll_p) * @param head true: be the head in the new list * false be the tail in the new list */ -void _lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool head); +void lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool head); /** * Return with head node of the linked list * @param ll_p pointer to linked list * @return pointer to the head of 'll_p' */ -void * _lv_ll_get_head(const lv_ll_t * ll_p); +void * lv_ll_get_head(const lv_ll_t * ll_p); /** * Return with tail node of the linked list * @param ll_p pointer to linked list * @return pointer to the tail of 'll_p' */ -void * _lv_ll_get_tail(const lv_ll_t * ll_p); +void * lv_ll_get_tail(const lv_ll_t * ll_p); /** * Return with the pointer of the next node after 'n_act' @@ -116,7 +113,7 @@ void * _lv_ll_get_tail(const lv_ll_t * ll_p); * @param n_act pointer a node * @return pointer to the next node */ -void * _lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act); +void * lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act); /** * Return with the pointer of the previous node after 'n_act' @@ -124,14 +121,14 @@ void * _lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act); * @param n_act pointer a node * @return pointer to the previous node */ -void * _lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act); +void * lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act); /** * Return the length of the linked list. * @param ll_p pointer to linked list * @return length of the linked list */ -uint32_t _lv_ll_get_len(const lv_ll_t * ll_p); +uint32_t lv_ll_get_len(const lv_ll_t * ll_p); /** * TODO @@ -147,22 +144,22 @@ void lv_ll_swap(lv_ll_t * ll_p, void * n1_p, void * n2_p); * @param n_act pointer to node to move * @param n_after pointer to a node which should be after `n_act` */ -void _lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after); +void lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after); /** * Check if a linked list is empty * @param ll_p pointer to a linked list * @return true: the linked list is empty; false: not empty */ -bool _lv_ll_is_empty(lv_ll_t * ll_p); +bool lv_ll_is_empty(lv_ll_t * ll_p); /********************** * MACROS **********************/ -#define _LV_LL_READ(list, i) for(i = _lv_ll_get_head(list); i != NULL; i = _lv_ll_get_next(list, i)) +#define LV_LL_READ(list, i) for(i = lv_ll_get_head(list); i != NULL; i = lv_ll_get_next(list, i)) -#define _LV_LL_READ_BACK(list, i) for(i = _lv_ll_get_tail(list); i != NULL; i = _lv_ll_get_prev(list, i)) +#define LV_LL_READ_BACK(list, i) for(i = lv_ll_get_tail(list); i != NULL; i = lv_ll_get_prev(list, i)) #ifdef __cplusplus } /*extern "C"*/ diff --git a/src/misc/lv_log.c b/src/misc/lv_log.c index 46f78873d..3f3caec8d 100644 --- a/src/misc/lv_log.c +++ b/src/misc/lv_log.c @@ -69,9 +69,9 @@ void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb) custom_print_cb = print_cb; } -void _lv_log_add(lv_log_level_t level, const char * file, int line, const char * func, const char * format, ...) +void lv_log_add(lv_log_level_t level, const char * file, int line, const char * func, const char * format, ...) { - if(level >= _LV_LOG_LEVEL_NUM) return; /*Invalid level*/ + if(level >= LV_LOG_LEVEL_NUM) return; /*Invalid level*/ if(level >= LV_LOG_LEVEL) { va_list args; diff --git a/src/misc/lv_log.h b/src/misc/lv_log.h index acf264303..a04898343 100644 --- a/src/misc/lv_log.h +++ b/src/misc/lv_log.h @@ -29,7 +29,7 @@ extern "C" { #define LV_LOG_LEVEL_ERROR 3 /**< Only critical issue, when the system may fail*/ #define LV_LOG_LEVEL_USER 4 /**< Custom logs from the user*/ #define LV_LOG_LEVEL_NONE 5 /**< Do not log anything*/ -#define _LV_LOG_LEVEL_NUM 6 /**< Number of log levels*/ +#define LV_LOG_LEVEL_NUM 6 /**< Number of log levels*/ LV_EXPORT_CONST_INT(LV_LOG_LEVEL_TRACE); LV_EXPORT_CONST_INT(LV_LOG_LEVEL_INFO); @@ -88,15 +88,15 @@ void lv_log(const char * format, ...) LV_FORMAT_ATTRIBUTE(1, 2); * @param format printf-like format string * @param ... parameters for `format` */ -void _lv_log_add(lv_log_level_t level, const char * file, int line, - const char * func, const char * format, ...) LV_FORMAT_ATTRIBUTE(5, 6); +void lv_log_add(lv_log_level_t level, const char * file, int line, + const char * func, const char * format, ...) LV_FORMAT_ATTRIBUTE(5, 6); /********************** * MACROS **********************/ #ifndef LV_LOG_TRACE # if LV_LOG_LEVEL <= LV_LOG_LEVEL_TRACE -# define LV_LOG_TRACE(...) _lv_log_add(LV_LOG_LEVEL_TRACE, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) +# define LV_LOG_TRACE(...) lv_log_add(LV_LOG_LEVEL_TRACE, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) # else # define LV_LOG_TRACE(...) do {}while(0) # endif @@ -104,7 +104,7 @@ void _lv_log_add(lv_log_level_t level, const char * file, int line, #ifndef LV_LOG_INFO # if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO -# define LV_LOG_INFO(...) _lv_log_add(LV_LOG_LEVEL_INFO, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) +# define LV_LOG_INFO(...) lv_log_add(LV_LOG_LEVEL_INFO, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) # else # define LV_LOG_INFO(...) do {}while(0) # endif @@ -112,7 +112,7 @@ void _lv_log_add(lv_log_level_t level, const char * file, int line, #ifndef LV_LOG_WARN # if LV_LOG_LEVEL <= LV_LOG_LEVEL_WARN -# define LV_LOG_WARN(...) _lv_log_add(LV_LOG_LEVEL_WARN, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) +# define LV_LOG_WARN(...) lv_log_add(LV_LOG_LEVEL_WARN, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) # else # define LV_LOG_WARN(...) do {}while(0) # endif @@ -120,7 +120,7 @@ void _lv_log_add(lv_log_level_t level, const char * file, int line, #ifndef LV_LOG_ERROR # if LV_LOG_LEVEL <= LV_LOG_LEVEL_ERROR -# define LV_LOG_ERROR(...) _lv_log_add(LV_LOG_LEVEL_ERROR, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) +# define LV_LOG_ERROR(...) lv_log_add(LV_LOG_LEVEL_ERROR, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) # else # define LV_LOG_ERROR(...) do {}while(0) # endif @@ -128,7 +128,7 @@ void _lv_log_add(lv_log_level_t level, const char * file, int line, #ifndef LV_LOG_USER # if LV_LOG_LEVEL <= LV_LOG_LEVEL_USER -# define LV_LOG_USER(...) _lv_log_add(LV_LOG_LEVEL_USER, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) +# define LV_LOG_USER(...) lv_log_add(LV_LOG_LEVEL_USER, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) # else # define LV_LOG_USER(...) do {}while(0) # endif @@ -145,7 +145,7 @@ void _lv_log_add(lv_log_level_t level, const char * file, int line, #else /*LV_USE_LOG*/ /*Do nothing if `LV_USE_LOG 0`*/ -#define _lv_log_add(level, file, line, ...) +#define lv_log_add(level, file, line, ...) #define LV_LOG_TRACE(...) do {}while(0) #define LV_LOG_INFO(...) do {}while(0) #define LV_LOG_WARN(...) do {}while(0) diff --git a/src/misc/lv_lru.c b/src/misc/lv_lru.c index 006584153..f8d4c0682 100755 --- a/src/misc/lv_lru.c +++ b/src/misc/lv_lru.c @@ -23,13 +23,13 @@ * TYPEDEFS **********************/ -struct _lv_lru_item_t { +struct lv_lru_item_t { void * value; void * key; size_t value_length; size_t key_length; uint64_t access_count; - struct _lv_lru_item_t * next; + struct lv_lru_item_t * next; }; /********************** diff --git a/src/misc/lv_lru.h b/src/misc/lv_lru.h index f9c11182d..1bb25861f 100755 --- a/src/misc/lv_lru.h +++ b/src/misc/lv_lru.h @@ -37,7 +37,7 @@ typedef enum { typedef void (*lv_lru_free_cb_t)(void * v); -typedef struct _lv_lru_item_t lv_lru_item_t; +typedef struct lv_lru_item_t lv_lru_item_t; typedef struct lv_lru_t { lv_lru_item_t ** items; diff --git a/src/misc/lv_math.c b/src/misc/lv_math.c index a303a4c79..bd728fbcf 100644 --- a/src/misc/lv_math.c +++ b/src/misc/lv_math.c @@ -439,6 +439,18 @@ uint32_t lv_rand(uint32_t min, uint32_t max) return (rand_seed % (max - min + 1)) + min; } +int32_t LV_ATTRIBUTE_FAST_MEM lv_trigo_cos(int16_t angle) +{ + return lv_trigo_sin(angle + 90); +} + +int32_t lv_bezier3(int32_t t, int32_t u0, uint32_t u1, int32_t u2, int32_t u3) +{ + LV_UNUSED(u0); + LV_UNUSED(u3); + return lv_cubic_bezier(t, 341, u1, 683, u2); +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/misc/lv_math.h b/src/misc/lv_math.h index 334094009..02870a343 100644 --- a/src/misc/lv_math.h +++ b/src/misc/lv_math.h @@ -53,10 +53,7 @@ typedef struct { */ int32_t /* LV_ATTRIBUTE_FAST_MEM */ lv_trigo_sin(int16_t angle); -static inline int32_t LV_ATTRIBUTE_FAST_MEM lv_trigo_cos(int16_t angle) -{ - return lv_trigo_sin(angle + 90); -} +int32_t LV_ATTRIBUTE_FAST_MEM lv_trigo_cos(int16_t angle); //! @endcond @@ -80,12 +77,7 @@ int32_t lv_cubic_bezier(int32_t x, int32_t x1, int32_t y1, int32_t x2, int32_t y * @param u3 must be LV_BEZIER_VAL_MAX * @return the value calculated from the given parameters in range of [0..LV_BEZIER_VAL_MAX] */ -static inline int32_t lv_bezier3(int32_t t, int32_t u0, uint32_t u1, int32_t u2, int32_t u3) -{ - LV_UNUSED(u0); - LV_UNUSED(u3); - return lv_cubic_bezier(t, 341, u1, 683, u2); -} +int32_t lv_bezier3(int32_t t, int32_t u0, uint32_t u1, int32_t u2, int32_t u3); /** diff --git a/src/misc/lv_matrix.h b/src/misc/lv_matrix.h index 53887317f..9583fa9af 100644 --- a/src/misc/lv_matrix.h +++ b/src/misc/lv_matrix.h @@ -33,9 +33,9 @@ extern "C" { * TYPEDEFS **********************/ -typedef struct { +struct lv_matrix_t { float m[3][3]; -} lv_matrix_t; +}; /********************** * GLOBAL PROTOTYPES diff --git a/src/misc/lv_palette.c b/src/misc/lv_palette.c index 31aa66cf9..cbcdf4e64 100644 --- a/src/misc/lv_palette.c +++ b/src/misc/lv_palette.c @@ -42,7 +42,7 @@ lv_color_t lv_palette_main(lv_palette_t p) LV_COLOR_MAKE(0x79, 0x55, 0x48), LV_COLOR_MAKE(0x60, 0x7D, 0x8B), LV_COLOR_MAKE(0x9E, 0x9E, 0x9E) }; - if(p >= _LV_PALETTE_LAST) { + if(p >= LV_PALETTE_LAST) { LV_LOG_WARN("Invalid palette: %d", p); return lv_color_black(); } @@ -75,7 +75,7 @@ lv_color_t lv_palette_lighten(lv_palette_t p, uint8_t lvl) {LV_COLOR_MAKE(0xBD, 0xBD, 0xBD), LV_COLOR_MAKE(0xE0, 0xE0, 0xE0), LV_COLOR_MAKE(0xEE, 0xEE, 0xEE), LV_COLOR_MAKE(0xF5, 0xF5, 0xF5), LV_COLOR_MAKE(0xFA, 0xFA, 0xFA)}, }; - if(p >= _LV_PALETTE_LAST) { + if(p >= LV_PALETTE_LAST) { LV_LOG_WARN("Invalid palette: %d", p); return lv_color_black(); } @@ -114,7 +114,7 @@ lv_color_t lv_palette_darken(lv_palette_t p, uint8_t lvl) {LV_COLOR_MAKE(0x75, 0x75, 0x75), LV_COLOR_MAKE(0x61, 0x61, 0x61), LV_COLOR_MAKE(0x42, 0x42, 0x42), LV_COLOR_MAKE(0x21, 0x21, 0x21)}, }; - if(p >= _LV_PALETTE_LAST) { + if(p >= LV_PALETTE_LAST) { LV_LOG_WARN("Invalid palette: %d", p); return lv_color_black(); } diff --git a/src/misc/lv_palette.h b/src/misc/lv_palette.h index 39b5cd71f..d2f408ca2 100644 --- a/src/misc/lv_palette.h +++ b/src/misc/lv_palette.h @@ -43,7 +43,7 @@ typedef enum { LV_PALETTE_BROWN, LV_PALETTE_BLUE_GREY, LV_PALETTE_GREY, - _LV_PALETTE_LAST, + LV_PALETTE_LAST, LV_PALETTE_NONE = 0xff, } lv_palette_t; diff --git a/src/misc/lv_profiler_builtin.c b/src/misc/lv_profiler_builtin.c index ba278ae94..b6b6fd435 100644 --- a/src/misc/lv_profiler_builtin.c +++ b/src/misc/lv_profiler_builtin.c @@ -7,7 +7,7 @@ * INCLUDES *********************/ -#include "lv_profiler_builtin.h" +#include "lv_profiler_builtin_private.h" #include "../lvgl.h" #include "../core/lv_global.h" @@ -54,7 +54,7 @@ typedef struct { /** * @brief Structure representing a context for the LVGL built-in profiler */ -typedef struct _lv_profiler_builtin_ctx_t { +typedef struct lv_profiler_builtin_ctx_t { lv_profiler_builtin_item_t * item_arr; /**< Pointer to an array of profiler items */ uint32_t item_num; /**< Number of profiler items in the array */ uint32_t cur_index; /**< Index of the current profiler item */ diff --git a/src/misc/lv_profiler_builtin.h b/src/misc/lv_profiler_builtin.h index 5cf2ea105..aa0220b20 100644 --- a/src/misc/lv_profiler_builtin.h +++ b/src/misc/lv_profiler_builtin.h @@ -33,18 +33,6 @@ extern "C" { * TYPEDEFS **********************/ -/** - * @brief LVGL profiler built-in configuration structure - */ -typedef struct { - size_t buf_size; /**< The size of the buffer used for profiling data */ - uint32_t tick_per_sec; /**< The number of ticks per second */ - uint32_t (*tick_get_cb)(void); /**< Callback function to get the current tick count */ - void (*flush_cb)(const char * buf); /**< Callback function to flush the profiling data */ - int (*tid_get_cb)(void); /**< Callback function to get the current thread ID */ - int (*cpu_get_cb)(void); /**< Callback function to get the current CPU */ -} lv_profiler_builtin_config_t; - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/misc/lv_profiler_builtin_private.h b/src/misc/lv_profiler_builtin_private.h new file mode 100644 index 000000000..3fb9938a2 --- /dev/null +++ b/src/misc/lv_profiler_builtin_private.h @@ -0,0 +1,56 @@ +/** + * @file lv_profiler_builtin_private.h + * + */ + +#ifndef LV_PROFILER_BUILTIN_PRIVATE_H +#define LV_PROFILER_BUILTIN_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_profiler_builtin.h" + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * @brief LVGL profiler built-in configuration structure + */ +struct lv_profiler_builtin_config_t { + size_t buf_size; /**< The size of the buffer used for profiling data */ + uint32_t tick_per_sec; /**< The number of ticks per second */ + uint32_t (*tick_get_cb)(void); /**< Callback function to get the current tick count */ + void (*flush_cb)(const char * buf); /**< Callback function to flush the profiling data */ + int (*tid_get_cb)(void); /**< Callback function to get the current thread ID */ + int (*cpu_get_cb)(void); /**< Callback function to get the current CPU */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PROFILER_BUILTIN_PRIVATE_H*/ diff --git a/src/misc/lv_rb.c b/src/misc/lv_rb.c index 8a564599b..8a7328caa 100755 --- a/src/misc/lv_rb.c +++ b/src/misc/lv_rb.c @@ -6,7 +6,7 @@ /********************* * INCLUDES *********************/ -#include "lv_rb.h" +#include "lv_rb_private.h" #include "../stdlib/lv_string.h" /********************* diff --git a/src/misc/lv_rb.h b/src/misc/lv_rb.h index dcfacadfb..bec0a788f 100755 --- a/src/misc/lv_rb.h +++ b/src/misc/lv_rb.h @@ -30,24 +30,10 @@ typedef enum { LV_RB_COLOR_BLACK } lv_rb_color_t; -typedef struct lv_rb_node_t { - struct lv_rb_node_t * parent; - struct lv_rb_node_t * left; - struct lv_rb_node_t * right; - lv_rb_color_t color; - void * data; -} lv_rb_node_t; - typedef int8_t lv_rb_compare_res_t; typedef lv_rb_compare_res_t (*lv_rb_compare_t)(const void * a, const void * b); -typedef struct { - lv_rb_node_t * root; - lv_rb_compare_t compare; - size_t size; -} lv_rb_t; - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/misc/lv_rb_private.h b/src/misc/lv_rb_private.h new file mode 100644 index 000000000..327b7b0be --- /dev/null +++ b/src/misc/lv_rb_private.h @@ -0,0 +1,54 @@ +/** + * @file lv_rb_private.h + * + */ + +#ifndef LV_RB_PRIVATE_H +#define LV_RB_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_rb.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_rb_node_t { + struct lv_rb_node_t * parent; + struct lv_rb_node_t * left; + struct lv_rb_node_t * right; + lv_rb_color_t color; + void * data; +}; + +struct lv_rb_t { + lv_rb_node_t * root; + lv_rb_compare_t compare; + size_t size; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_RB_PRIVATE_H*/ diff --git a/src/misc/lv_style.c b/src/misc/lv_style.c index e7278434e..d137d67eb 100644 --- a/src/misc/lv_style.c +++ b/src/misc/lv_style.c @@ -6,7 +6,7 @@ /********************* * INCLUDES *********************/ -#include "lv_style.h" +#include "lv_style_private.h" #include "../core/lv_global.h" #include "../stdlib/lv_mem.h" #include "../stdlib/lv_string.h" @@ -16,8 +16,8 @@ /********************* * DEFINES *********************/ -#define _lv_style_custom_prop_flag_lookup_table_size LV_GLOBAL_DEFAULT()->style_custom_table_size -#define _lv_style_custom_prop_flag_lookup_table LV_GLOBAL_DEFAULT()->style_custom_prop_flag_lookup_table +#define lv_style_custom_prop_flag_lookup_table_size LV_GLOBAL_DEFAULT()->style_custom_table_size +#define lv_style_custom_prop_flag_lookup_table LV_GLOBAL_DEFAULT()->style_custom_prop_flag_lookup_table #define last_custom_prop_id LV_GLOBAL_DEFAULT()->style_last_custom_prop_id /********************** @@ -34,7 +34,7 @@ const lv_style_prop_t lv_style_const_prop_id_inv = LV_STYLE_PROP_INV; -const uint8_t _lv_style_builtin_prop_flag_lookup_table[_LV_STYLE_NUM_BUILT_IN_PROPS] = { +const uint8_t lv_style_builtin_prop_flag_lookup_table[LV_STYLE_NUM_BUILT_IN_PROPS] = { [LV_STYLE_WIDTH] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, [LV_STYLE_MIN_WIDTH] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, [LV_STYLE_MAX_WIDTH] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, @@ -200,9 +200,9 @@ void lv_style_reset(lv_style_t * style) lv_style_prop_t lv_style_register_prop(uint8_t flag) { - if(_lv_style_custom_prop_flag_lookup_table == NULL) { - _lv_style_custom_prop_flag_lookup_table_size = 0; - last_custom_prop_id = (uint16_t)_LV_STYLE_LAST_BUILT_IN_PROP; + if(lv_style_custom_prop_flag_lookup_table == NULL) { + lv_style_custom_prop_flag_lookup_table_size = 0; + last_custom_prop_id = (uint16_t)LV_STYLE_LAST_BUILT_IN_PROP; } // if((last_custom_prop_id + 1) != 0) { @@ -213,30 +213,30 @@ lv_style_prop_t lv_style_register_prop(uint8_t flag) /* * Allocate the lookup table if it's not yet available. */ - size_t required_size = (last_custom_prop_id + 1 - _LV_STYLE_LAST_BUILT_IN_PROP); - if(_lv_style_custom_prop_flag_lookup_table_size < required_size) { + size_t required_size = (last_custom_prop_id + 1 - LV_STYLE_LAST_BUILT_IN_PROP); + if(lv_style_custom_prop_flag_lookup_table_size < required_size) { /* Round required_size up to the nearest 32-byte value */ required_size = (required_size + 31) & ~31; LV_ASSERT_MSG(required_size > 0, "required size has become 0?"); - uint8_t * old_p = _lv_style_custom_prop_flag_lookup_table; + uint8_t * old_p = lv_style_custom_prop_flag_lookup_table; uint8_t * new_p = lv_realloc(old_p, required_size * sizeof(uint8_t)); if(new_p == NULL) { LV_LOG_ERROR("Unable to allocate space for custom property lookup table"); return LV_STYLE_PROP_INV; } - _lv_style_custom_prop_flag_lookup_table = new_p; - _lv_style_custom_prop_flag_lookup_table_size = required_size; + lv_style_custom_prop_flag_lookup_table = new_p; + lv_style_custom_prop_flag_lookup_table_size = required_size; } last_custom_prop_id++; /* This should never happen - we should bail out above */ - LV_ASSERT_NULL(_lv_style_custom_prop_flag_lookup_table); - _lv_style_custom_prop_flag_lookup_table[last_custom_prop_id - _LV_STYLE_NUM_BUILT_IN_PROPS] = flag; + LV_ASSERT_NULL(lv_style_custom_prop_flag_lookup_table); + lv_style_custom_prop_flag_lookup_table[last_custom_prop_id - LV_STYLE_NUM_BUILT_IN_PROPS] = flag; return last_custom_prop_id; } lv_style_prop_t lv_style_get_num_custom_props(void) { - return last_custom_prop_id - _LV_STYLE_LAST_BUILT_IN_PROP; + return last_custom_prop_id - LV_STYLE_LAST_BUILT_IN_PROP; } bool lv_style_remove_prop(lv_style_t * style, lv_style_prop_t prop) @@ -329,7 +329,7 @@ void lv_style_set_prop(lv_style_t * style, lv_style_prop_t prop, lv_style_value_ props[style->prop_cnt - 1] = prop; values[style->prop_cnt - 1] = value; - uint32_t group = _lv_style_get_prop_group(prop); + uint32_t group = lv_style_get_prop_group(prop); style->has_group |= (uint32_t)1 << group; } @@ -424,16 +424,16 @@ bool lv_style_is_empty(const lv_style_t * style) return style->prop_cnt == 0; } -uint8_t _lv_style_prop_lookup_flags(lv_style_prop_t prop) +uint8_t lv_style_prop_lookup_flags(lv_style_prop_t prop) { if(prop == LV_STYLE_PROP_ANY) return LV_STYLE_PROP_FLAG_ALL; /*Any prop can have any flags*/ if(prop == LV_STYLE_PROP_INV) return 0; - if(prop < _LV_STYLE_NUM_BUILT_IN_PROPS) - return _lv_style_builtin_prop_flag_lookup_table[prop]; - prop -= _LV_STYLE_NUM_BUILT_IN_PROPS; - if(_lv_style_custom_prop_flag_lookup_table != NULL && prop < _lv_style_custom_prop_flag_lookup_table_size) - return _lv_style_custom_prop_flag_lookup_table[prop]; + if(prop < LV_STYLE_NUM_BUILT_IN_PROPS) + return lv_style_builtin_prop_flag_lookup_table[prop]; + prop -= LV_STYLE_NUM_BUILT_IN_PROPS; + if(lv_style_custom_prop_flag_lookup_table != NULL && prop < lv_style_custom_prop_flag_lookup_table_size) + return lv_style_custom_prop_flag_lookup_table[prop]; return 0; } diff --git a/src/misc/lv_style.h b/src/misc/lv_style.h index 2fd84a0a7..fa35daf8e 100644 --- a/src/misc/lv_style.h +++ b/src/misc/lv_style.h @@ -68,7 +68,7 @@ LV_EXPORT_CONST_INT(LV_SCALE_NONE); #endif // *INDENT-ON* -#define LV_STYLE_CONST_PROPS_END { .prop_ptr = NULL, .value = { .num = 0 } } +#define LV_STYLE_CONST_PROPS_END { .prop = LV_STYLE_PROP_INV, .value = { .num = 0 } } /********************** * TYPEDEFS @@ -77,40 +77,28 @@ LV_EXPORT_CONST_INT(LV_SCALE_NONE); /** * Possible options how to blend opaque drawings */ -enum _lv_blend_mode_t { +typedef enum { LV_BLEND_MODE_NORMAL, /**< Simply mix according to the opacity value*/ LV_BLEND_MODE_ADDITIVE, /**< Add the respective color channels*/ LV_BLEND_MODE_SUBTRACTIVE,/**< Subtract the foreground from the background*/ LV_BLEND_MODE_MULTIPLY, /**< Multiply the foreground and background*/ -}; - -#ifdef DOXYGEN -typedef _lv_blend_mode_t lv_blend_mode_t; -#else -typedef uint8_t lv_blend_mode_t; -#endif /*DOXYGEN*/ +} lv_blend_mode_t; /** * Some options to apply decorations on texts. * 'OR'ed values can be used. */ -enum _lv_text_decor_t { +typedef enum { LV_TEXT_DECOR_NONE = 0x00, LV_TEXT_DECOR_UNDERLINE = 0x01, LV_TEXT_DECOR_STRIKETHROUGH = 0x02, -}; - -#ifdef DOXYGEN -typedef _lv_text_decor_t lv_text_decor_t; -#else -typedef uint8_t lv_text_decor_t; -#endif /*DOXYGEN*/ +} lv_text_decor_t; /** * Selects on which sides border should be drawn * 'OR'ed values can be used. */ -enum _lv_border_side_t { +typedef enum { LV_BORDER_SIDE_NONE = 0x00, LV_BORDER_SIDE_BOTTOM = 0x01, LV_BORDER_SIDE_TOP = 0x02, @@ -118,44 +106,28 @@ enum _lv_border_side_t { LV_BORDER_SIDE_RIGHT = 0x08, LV_BORDER_SIDE_FULL = 0x0F, LV_BORDER_SIDE_INTERNAL = 0x10, /**< FOR matrix-like objects (e.g. Button matrix)*/ -}; - -#ifdef DOXYGEN -typedef _lv_border_side_t lv_border_side_t; -#else -typedef uint8_t lv_border_side_t; -#endif /*DOXYGEN*/ +} lv_border_side_t; /** * The direction of the gradient. */ -enum _lv_grad_dir_t { +typedef enum { LV_GRAD_DIR_NONE, /**< No gradient (the `grad_color` property is ignored)*/ LV_GRAD_DIR_VER, /**< Simple vertical (top to bottom) gradient*/ LV_GRAD_DIR_HOR, /**< Simple horizontal (left to right) gradient*/ LV_GRAD_DIR_LINEAR, /**< Linear gradient defined by start and end points. Can be at any angle.*/ LV_GRAD_DIR_RADIAL, /**< Radial gradient defined by start and end circles*/ LV_GRAD_DIR_CONICAL, /**< Conical gradient defined by center point, start and end angles*/ -}; +} lv_grad_dir_t; /** * Gradient behavior outside the defined range. */ -enum _lv_grad_extend_t { +typedef enum { LV_GRAD_EXTEND_PAD, /**< Repeat the same color*/ LV_GRAD_EXTEND_REPEAT, /**< Repeat the pattern*/ LV_GRAD_EXTEND_REFLECT, /**< Repeat the pattern mirrored*/ -}; - -#ifdef DOXYGEN -typedef _lv_grad_dir_t lv_grad_dir_t; -typedef _lv_grad_type_t lv_grad_type_t; -typedef _lv_grad_extend_t lv_grad_extend_t; -#else -typedef uint8_t lv_grad_dir_t; -typedef uint8_t lv_grad_type_t; -typedef uint8_t lv_grad_extend_t; -#endif /*DOXYGEN*/ +} lv_grad_extend_t; /** A gradient stop definition. * This matches a color and a position in a virtual 0-255 scale. @@ -215,7 +187,7 @@ typedef union { * * Props are split into groups of 16. When adding a new prop to a group, ensure it does not overflow into the next one. */ -enum _lv_style_prop_t { +enum { LV_STYLE_PROP_INV = 0, /*Group 0*/ @@ -359,30 +331,18 @@ enum _lv_style_prop_t { LV_STYLE_GRID_CELL_ROW_SPAN = 138, LV_STYLE_GRID_CELL_Y_ALIGN = 139, - _LV_STYLE_LAST_BUILT_IN_PROP = 140, + LV_STYLE_LAST_BUILT_IN_PROP = 140, - _LV_STYLE_NUM_BUILT_IN_PROPS = _LV_STYLE_LAST_BUILT_IN_PROP + 1, + LV_STYLE_NUM_BUILT_IN_PROPS = LV_STYLE_LAST_BUILT_IN_PROP + 1, LV_STYLE_PROP_ANY = 0xFF, - _LV_STYLE_PROP_CONST = 0xFF /* magic value for const styles */ + LV_STYLE_PROP_CONST = 0xFF /* magic value for const styles */ }; -#ifdef DOXYGEN -typedef _lv_style_prop_t lv_style_prop_t; -#else -typedef uint8_t lv_style_prop_t; -#endif /*DOXYGEN*/ - -enum _lv_style_res_t { +typedef enum { LV_STYLE_RES_NOT_FOUND, LV_STYLE_RES_FOUND, -}; - -#ifdef DOXYGEN -typedef _lv_style_res_t lv_style_res_t; -#else -typedef uint8_t lv_style_res_t; -#endif /*DOXYGEN*/ +} lv_style_res_t; /** * Descriptor for style transitions @@ -399,7 +359,7 @@ typedef struct { * Descriptor of a constant style property. */ typedef struct { - const lv_style_prop_t * prop_ptr; + lv_style_prop_t prop; lv_style_value_t value; } lv_style_const_prop_t; @@ -536,8 +496,8 @@ static inline lv_style_res_t lv_style_get_prop_inlined(const lv_style_t * style, if(lv_style_is_const(style)) { lv_style_const_prop_t * props = (lv_style_const_prop_t *)style->values_and_props; uint32_t i; - for(i = 0; props[i].prop_ptr; i++) { - if(*props[i].prop_ptr == prop) { + for(i = 0; props[i].prop != LV_STYLE_PROP_INV; i++) { + if(props[i].prop == prop) { *value = props[i].value; return LV_STYLE_RES_FOUND; } @@ -570,7 +530,7 @@ bool lv_style_is_empty(const lv_style_t * style); * @param prop a style property * @return the group [0..30] 30 means all the custom properties with index > 120 */ -static inline uint32_t _lv_style_get_prop_group(lv_style_prop_t prop) +static inline uint32_t lv_style_get_prop_group(lv_style_prop_t prop) { uint32_t group = prop >> 2; if(group > 30) group = 31; /*The MSB marks all the custom properties*/ @@ -584,7 +544,7 @@ static inline uint32_t _lv_style_get_prop_group(lv_style_prop_t prop) * @param prop a style property * @return the flags of the property */ -uint8_t _lv_style_prop_lookup_flags(lv_style_prop_t prop); +uint8_t lv_style_prop_lookup_flags(lv_style_prop_t prop); #include "lv_style_gen.h" @@ -638,7 +598,7 @@ static inline void lv_style_set_transform_scale(lv_style_t * style, int32_t valu */ static inline bool lv_style_prop_has_flag(lv_style_prop_t prop, uint8_t flag) { - return _lv_style_prop_lookup_flags(prop) & flag; + return lv_style_prop_lookup_flags(prop) & flag; } /************************* diff --git a/src/misc/lv_style_gen.c b/src/misc/lv_style_gen.c index 3abeffea7..233cf7b94 100644 --- a/src/misc/lv_style_gen.c +++ b/src/misc/lv_style_gen.c @@ -18,8 +18,6 @@ void lv_style_set_width(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_WIDTH, v); } -const lv_style_prop_t _lv_style_const_prop_id_WIDTH = LV_STYLE_WIDTH; - void lv_style_set_min_width(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -28,8 +26,6 @@ void lv_style_set_min_width(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_MIN_WIDTH, v); } -const lv_style_prop_t _lv_style_const_prop_id_MIN_WIDTH = LV_STYLE_MIN_WIDTH; - void lv_style_set_max_width(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -38,8 +34,6 @@ void lv_style_set_max_width(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_MAX_WIDTH, v); } -const lv_style_prop_t _lv_style_const_prop_id_MAX_WIDTH = LV_STYLE_MAX_WIDTH; - void lv_style_set_height(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -48,8 +42,6 @@ void lv_style_set_height(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_HEIGHT, v); } -const lv_style_prop_t _lv_style_const_prop_id_HEIGHT = LV_STYLE_HEIGHT; - void lv_style_set_min_height(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -58,8 +50,6 @@ void lv_style_set_min_height(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_MIN_HEIGHT, v); } -const lv_style_prop_t _lv_style_const_prop_id_MIN_HEIGHT = LV_STYLE_MIN_HEIGHT; - void lv_style_set_max_height(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -68,8 +58,6 @@ void lv_style_set_max_height(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_MAX_HEIGHT, v); } -const lv_style_prop_t _lv_style_const_prop_id_MAX_HEIGHT = LV_STYLE_MAX_HEIGHT; - void lv_style_set_length(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -78,8 +66,6 @@ void lv_style_set_length(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_LENGTH, v); } -const lv_style_prop_t _lv_style_const_prop_id_LENGTH = LV_STYLE_LENGTH; - void lv_style_set_x(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -88,8 +74,6 @@ void lv_style_set_x(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_X, v); } -const lv_style_prop_t _lv_style_const_prop_id_X = LV_STYLE_X; - void lv_style_set_y(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -98,8 +82,6 @@ void lv_style_set_y(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_Y, v); } -const lv_style_prop_t _lv_style_const_prop_id_Y = LV_STYLE_Y; - void lv_style_set_align(lv_style_t * style, lv_align_t value) { lv_style_value_t v = { @@ -108,8 +90,6 @@ void lv_style_set_align(lv_style_t * style, lv_align_t value) lv_style_set_prop(style, LV_STYLE_ALIGN, v); } -const lv_style_prop_t _lv_style_const_prop_id_ALIGN = LV_STYLE_ALIGN; - void lv_style_set_transform_width(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -118,8 +98,6 @@ void lv_style_set_transform_width(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_TRANSFORM_WIDTH, v); } -const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_WIDTH = LV_STYLE_TRANSFORM_WIDTH; - void lv_style_set_transform_height(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -128,8 +106,6 @@ void lv_style_set_transform_height(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_TRANSFORM_HEIGHT, v); } -const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_HEIGHT = LV_STYLE_TRANSFORM_HEIGHT; - void lv_style_set_translate_x(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -138,8 +114,6 @@ void lv_style_set_translate_x(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_TRANSLATE_X, v); } -const lv_style_prop_t _lv_style_const_prop_id_TRANSLATE_X = LV_STYLE_TRANSLATE_X; - void lv_style_set_translate_y(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -148,8 +122,6 @@ void lv_style_set_translate_y(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_TRANSLATE_Y, v); } -const lv_style_prop_t _lv_style_const_prop_id_TRANSLATE_Y = LV_STYLE_TRANSLATE_Y; - void lv_style_set_transform_scale_x(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -158,8 +130,6 @@ void lv_style_set_transform_scale_x(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_TRANSFORM_SCALE_X, v); } -const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SCALE_X = LV_STYLE_TRANSFORM_SCALE_X; - void lv_style_set_transform_scale_y(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -168,8 +138,6 @@ void lv_style_set_transform_scale_y(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_TRANSFORM_SCALE_Y, v); } -const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SCALE_Y = LV_STYLE_TRANSFORM_SCALE_Y; - void lv_style_set_transform_rotation(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -178,8 +146,6 @@ void lv_style_set_transform_rotation(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_TRANSFORM_ROTATION, v); } -const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_ROTATION = LV_STYLE_TRANSFORM_ROTATION; - void lv_style_set_transform_pivot_x(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -188,8 +154,6 @@ void lv_style_set_transform_pivot_x(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_TRANSFORM_PIVOT_X, v); } -const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_PIVOT_X = LV_STYLE_TRANSFORM_PIVOT_X; - void lv_style_set_transform_pivot_y(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -198,8 +162,6 @@ void lv_style_set_transform_pivot_y(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_TRANSFORM_PIVOT_Y, v); } -const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_PIVOT_Y = LV_STYLE_TRANSFORM_PIVOT_Y; - void lv_style_set_transform_skew_x(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -208,8 +170,6 @@ void lv_style_set_transform_skew_x(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_TRANSFORM_SKEW_X, v); } -const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SKEW_X = LV_STYLE_TRANSFORM_SKEW_X; - void lv_style_set_transform_skew_y(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -218,8 +178,6 @@ void lv_style_set_transform_skew_y(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_TRANSFORM_SKEW_Y, v); } -const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SKEW_Y = LV_STYLE_TRANSFORM_SKEW_Y; - void lv_style_set_pad_top(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -228,8 +186,6 @@ void lv_style_set_pad_top(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_PAD_TOP, v); } -const lv_style_prop_t _lv_style_const_prop_id_PAD_TOP = LV_STYLE_PAD_TOP; - void lv_style_set_pad_bottom(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -238,8 +194,6 @@ void lv_style_set_pad_bottom(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_PAD_BOTTOM, v); } -const lv_style_prop_t _lv_style_const_prop_id_PAD_BOTTOM = LV_STYLE_PAD_BOTTOM; - void lv_style_set_pad_left(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -248,8 +202,6 @@ void lv_style_set_pad_left(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_PAD_LEFT, v); } -const lv_style_prop_t _lv_style_const_prop_id_PAD_LEFT = LV_STYLE_PAD_LEFT; - void lv_style_set_pad_right(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -258,8 +210,6 @@ void lv_style_set_pad_right(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_PAD_RIGHT, v); } -const lv_style_prop_t _lv_style_const_prop_id_PAD_RIGHT = LV_STYLE_PAD_RIGHT; - void lv_style_set_pad_row(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -268,8 +218,6 @@ void lv_style_set_pad_row(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_PAD_ROW, v); } -const lv_style_prop_t _lv_style_const_prop_id_PAD_ROW = LV_STYLE_PAD_ROW; - void lv_style_set_pad_column(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -278,8 +226,6 @@ void lv_style_set_pad_column(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_PAD_COLUMN, v); } -const lv_style_prop_t _lv_style_const_prop_id_PAD_COLUMN = LV_STYLE_PAD_COLUMN; - void lv_style_set_margin_top(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -288,8 +234,6 @@ void lv_style_set_margin_top(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_MARGIN_TOP, v); } -const lv_style_prop_t _lv_style_const_prop_id_MARGIN_TOP = LV_STYLE_MARGIN_TOP; - void lv_style_set_margin_bottom(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -298,8 +242,6 @@ void lv_style_set_margin_bottom(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_MARGIN_BOTTOM, v); } -const lv_style_prop_t _lv_style_const_prop_id_MARGIN_BOTTOM = LV_STYLE_MARGIN_BOTTOM; - void lv_style_set_margin_left(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -308,8 +250,6 @@ void lv_style_set_margin_left(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_MARGIN_LEFT, v); } -const lv_style_prop_t _lv_style_const_prop_id_MARGIN_LEFT = LV_STYLE_MARGIN_LEFT; - void lv_style_set_margin_right(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -318,8 +258,6 @@ void lv_style_set_margin_right(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_MARGIN_RIGHT, v); } -const lv_style_prop_t _lv_style_const_prop_id_MARGIN_RIGHT = LV_STYLE_MARGIN_RIGHT; - void lv_style_set_bg_color(lv_style_t * style, lv_color_t value) { lv_style_value_t v = { @@ -328,8 +266,6 @@ void lv_style_set_bg_color(lv_style_t * style, lv_color_t value) lv_style_set_prop(style, LV_STYLE_BG_COLOR, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_COLOR = LV_STYLE_BG_COLOR; - void lv_style_set_bg_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -338,8 +274,6 @@ void lv_style_set_bg_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_BG_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_OPA = LV_STYLE_BG_OPA; - void lv_style_set_bg_grad_color(lv_style_t * style, lv_color_t value) { lv_style_value_t v = { @@ -348,8 +282,6 @@ void lv_style_set_bg_grad_color(lv_style_t * style, lv_color_t value) lv_style_set_prop(style, LV_STYLE_BG_GRAD_COLOR, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_COLOR = LV_STYLE_BG_GRAD_COLOR; - void lv_style_set_bg_grad_dir(lv_style_t * style, lv_grad_dir_t value) { lv_style_value_t v = { @@ -358,8 +290,6 @@ void lv_style_set_bg_grad_dir(lv_style_t * style, lv_grad_dir_t value) lv_style_set_prop(style, LV_STYLE_BG_GRAD_DIR, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_DIR = LV_STYLE_BG_GRAD_DIR; - void lv_style_set_bg_main_stop(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -368,8 +298,6 @@ void lv_style_set_bg_main_stop(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_BG_MAIN_STOP, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_MAIN_STOP = LV_STYLE_BG_MAIN_STOP; - void lv_style_set_bg_grad_stop(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -378,8 +306,6 @@ void lv_style_set_bg_grad_stop(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_BG_GRAD_STOP, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_STOP = LV_STYLE_BG_GRAD_STOP; - void lv_style_set_bg_main_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -388,8 +314,6 @@ void lv_style_set_bg_main_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_BG_MAIN_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_MAIN_OPA = LV_STYLE_BG_MAIN_OPA; - void lv_style_set_bg_grad_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -398,8 +322,6 @@ void lv_style_set_bg_grad_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_BG_GRAD_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_OPA = LV_STYLE_BG_GRAD_OPA; - void lv_style_set_bg_grad(lv_style_t * style, const lv_grad_dsc_t * value) { lv_style_value_t v = { @@ -408,8 +330,6 @@ void lv_style_set_bg_grad(lv_style_t * style, const lv_grad_dsc_t * value) lv_style_set_prop(style, LV_STYLE_BG_GRAD, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD = LV_STYLE_BG_GRAD; - void lv_style_set_bg_image_src(lv_style_t * style, const void * value) { lv_style_value_t v = { @@ -418,8 +338,6 @@ void lv_style_set_bg_image_src(lv_style_t * style, const void * value) lv_style_set_prop(style, LV_STYLE_BG_IMAGE_SRC, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_SRC = LV_STYLE_BG_IMAGE_SRC; - void lv_style_set_bg_image_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -428,8 +346,6 @@ void lv_style_set_bg_image_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_BG_IMAGE_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_OPA = LV_STYLE_BG_IMAGE_OPA; - void lv_style_set_bg_image_recolor(lv_style_t * style, lv_color_t value) { lv_style_value_t v = { @@ -438,8 +354,6 @@ void lv_style_set_bg_image_recolor(lv_style_t * style, lv_color_t value) lv_style_set_prop(style, LV_STYLE_BG_IMAGE_RECOLOR, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_RECOLOR = LV_STYLE_BG_IMAGE_RECOLOR; - void lv_style_set_bg_image_recolor_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -448,8 +362,6 @@ void lv_style_set_bg_image_recolor_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_BG_IMAGE_RECOLOR_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_RECOLOR_OPA = LV_STYLE_BG_IMAGE_RECOLOR_OPA; - void lv_style_set_bg_image_tiled(lv_style_t * style, bool value) { lv_style_value_t v = { @@ -458,8 +370,6 @@ void lv_style_set_bg_image_tiled(lv_style_t * style, bool value) lv_style_set_prop(style, LV_STYLE_BG_IMAGE_TILED, v); } -const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_TILED = LV_STYLE_BG_IMAGE_TILED; - void lv_style_set_border_color(lv_style_t * style, lv_color_t value) { lv_style_value_t v = { @@ -468,8 +378,6 @@ void lv_style_set_border_color(lv_style_t * style, lv_color_t value) lv_style_set_prop(style, LV_STYLE_BORDER_COLOR, v); } -const lv_style_prop_t _lv_style_const_prop_id_BORDER_COLOR = LV_STYLE_BORDER_COLOR; - void lv_style_set_border_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -478,8 +386,6 @@ void lv_style_set_border_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_BORDER_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_BORDER_OPA = LV_STYLE_BORDER_OPA; - void lv_style_set_border_width(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -488,8 +394,6 @@ void lv_style_set_border_width(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_BORDER_WIDTH, v); } -const lv_style_prop_t _lv_style_const_prop_id_BORDER_WIDTH = LV_STYLE_BORDER_WIDTH; - void lv_style_set_border_side(lv_style_t * style, lv_border_side_t value) { lv_style_value_t v = { @@ -498,8 +402,6 @@ void lv_style_set_border_side(lv_style_t * style, lv_border_side_t value) lv_style_set_prop(style, LV_STYLE_BORDER_SIDE, v); } -const lv_style_prop_t _lv_style_const_prop_id_BORDER_SIDE = LV_STYLE_BORDER_SIDE; - void lv_style_set_border_post(lv_style_t * style, bool value) { lv_style_value_t v = { @@ -508,8 +410,6 @@ void lv_style_set_border_post(lv_style_t * style, bool value) lv_style_set_prop(style, LV_STYLE_BORDER_POST, v); } -const lv_style_prop_t _lv_style_const_prop_id_BORDER_POST = LV_STYLE_BORDER_POST; - void lv_style_set_outline_width(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -518,8 +418,6 @@ void lv_style_set_outline_width(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_OUTLINE_WIDTH, v); } -const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_WIDTH = LV_STYLE_OUTLINE_WIDTH; - void lv_style_set_outline_color(lv_style_t * style, lv_color_t value) { lv_style_value_t v = { @@ -528,8 +426,6 @@ void lv_style_set_outline_color(lv_style_t * style, lv_color_t value) lv_style_set_prop(style, LV_STYLE_OUTLINE_COLOR, v); } -const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_COLOR = LV_STYLE_OUTLINE_COLOR; - void lv_style_set_outline_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -538,8 +434,6 @@ void lv_style_set_outline_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_OUTLINE_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_OPA = LV_STYLE_OUTLINE_OPA; - void lv_style_set_outline_pad(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -548,8 +442,6 @@ void lv_style_set_outline_pad(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_OUTLINE_PAD, v); } -const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_PAD = LV_STYLE_OUTLINE_PAD; - void lv_style_set_shadow_width(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -558,8 +450,6 @@ void lv_style_set_shadow_width(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_SHADOW_WIDTH, v); } -const lv_style_prop_t _lv_style_const_prop_id_SHADOW_WIDTH = LV_STYLE_SHADOW_WIDTH; - void lv_style_set_shadow_offset_x(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -568,8 +458,6 @@ void lv_style_set_shadow_offset_x(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_SHADOW_OFFSET_X, v); } -const lv_style_prop_t _lv_style_const_prop_id_SHADOW_OFFSET_X = LV_STYLE_SHADOW_OFFSET_X; - void lv_style_set_shadow_offset_y(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -578,8 +466,6 @@ void lv_style_set_shadow_offset_y(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_SHADOW_OFFSET_Y, v); } -const lv_style_prop_t _lv_style_const_prop_id_SHADOW_OFFSET_Y = LV_STYLE_SHADOW_OFFSET_Y; - void lv_style_set_shadow_spread(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -588,8 +474,6 @@ void lv_style_set_shadow_spread(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_SHADOW_SPREAD, v); } -const lv_style_prop_t _lv_style_const_prop_id_SHADOW_SPREAD = LV_STYLE_SHADOW_SPREAD; - void lv_style_set_shadow_color(lv_style_t * style, lv_color_t value) { lv_style_value_t v = { @@ -598,8 +482,6 @@ void lv_style_set_shadow_color(lv_style_t * style, lv_color_t value) lv_style_set_prop(style, LV_STYLE_SHADOW_COLOR, v); } -const lv_style_prop_t _lv_style_const_prop_id_SHADOW_COLOR = LV_STYLE_SHADOW_COLOR; - void lv_style_set_shadow_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -608,8 +490,6 @@ void lv_style_set_shadow_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_SHADOW_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_SHADOW_OPA = LV_STYLE_SHADOW_OPA; - void lv_style_set_image_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -618,8 +498,6 @@ void lv_style_set_image_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_IMAGE_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_IMAGE_OPA = LV_STYLE_IMAGE_OPA; - void lv_style_set_image_recolor(lv_style_t * style, lv_color_t value) { lv_style_value_t v = { @@ -628,8 +506,6 @@ void lv_style_set_image_recolor(lv_style_t * style, lv_color_t value) lv_style_set_prop(style, LV_STYLE_IMAGE_RECOLOR, v); } -const lv_style_prop_t _lv_style_const_prop_id_IMAGE_RECOLOR = LV_STYLE_IMAGE_RECOLOR; - void lv_style_set_image_recolor_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -638,8 +514,6 @@ void lv_style_set_image_recolor_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_IMAGE_RECOLOR_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_IMAGE_RECOLOR_OPA = LV_STYLE_IMAGE_RECOLOR_OPA; - void lv_style_set_line_width(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -648,8 +522,6 @@ void lv_style_set_line_width(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_LINE_WIDTH, v); } -const lv_style_prop_t _lv_style_const_prop_id_LINE_WIDTH = LV_STYLE_LINE_WIDTH; - void lv_style_set_line_dash_width(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -658,8 +530,6 @@ void lv_style_set_line_dash_width(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_LINE_DASH_WIDTH, v); } -const lv_style_prop_t _lv_style_const_prop_id_LINE_DASH_WIDTH = LV_STYLE_LINE_DASH_WIDTH; - void lv_style_set_line_dash_gap(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -668,8 +538,6 @@ void lv_style_set_line_dash_gap(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_LINE_DASH_GAP, v); } -const lv_style_prop_t _lv_style_const_prop_id_LINE_DASH_GAP = LV_STYLE_LINE_DASH_GAP; - void lv_style_set_line_rounded(lv_style_t * style, bool value) { lv_style_value_t v = { @@ -678,8 +546,6 @@ void lv_style_set_line_rounded(lv_style_t * style, bool value) lv_style_set_prop(style, LV_STYLE_LINE_ROUNDED, v); } -const lv_style_prop_t _lv_style_const_prop_id_LINE_ROUNDED = LV_STYLE_LINE_ROUNDED; - void lv_style_set_line_color(lv_style_t * style, lv_color_t value) { lv_style_value_t v = { @@ -688,8 +554,6 @@ void lv_style_set_line_color(lv_style_t * style, lv_color_t value) lv_style_set_prop(style, LV_STYLE_LINE_COLOR, v); } -const lv_style_prop_t _lv_style_const_prop_id_LINE_COLOR = LV_STYLE_LINE_COLOR; - void lv_style_set_line_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -698,8 +562,6 @@ void lv_style_set_line_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_LINE_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_LINE_OPA = LV_STYLE_LINE_OPA; - void lv_style_set_arc_width(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -708,8 +570,6 @@ void lv_style_set_arc_width(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_ARC_WIDTH, v); } -const lv_style_prop_t _lv_style_const_prop_id_ARC_WIDTH = LV_STYLE_ARC_WIDTH; - void lv_style_set_arc_rounded(lv_style_t * style, bool value) { lv_style_value_t v = { @@ -718,8 +578,6 @@ void lv_style_set_arc_rounded(lv_style_t * style, bool value) lv_style_set_prop(style, LV_STYLE_ARC_ROUNDED, v); } -const lv_style_prop_t _lv_style_const_prop_id_ARC_ROUNDED = LV_STYLE_ARC_ROUNDED; - void lv_style_set_arc_color(lv_style_t * style, lv_color_t value) { lv_style_value_t v = { @@ -728,8 +586,6 @@ void lv_style_set_arc_color(lv_style_t * style, lv_color_t value) lv_style_set_prop(style, LV_STYLE_ARC_COLOR, v); } -const lv_style_prop_t _lv_style_const_prop_id_ARC_COLOR = LV_STYLE_ARC_COLOR; - void lv_style_set_arc_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -738,8 +594,6 @@ void lv_style_set_arc_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_ARC_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_ARC_OPA = LV_STYLE_ARC_OPA; - void lv_style_set_arc_image_src(lv_style_t * style, const void * value) { lv_style_value_t v = { @@ -748,8 +602,6 @@ void lv_style_set_arc_image_src(lv_style_t * style, const void * value) lv_style_set_prop(style, LV_STYLE_ARC_IMAGE_SRC, v); } -const lv_style_prop_t _lv_style_const_prop_id_ARC_IMAGE_SRC = LV_STYLE_ARC_IMAGE_SRC; - void lv_style_set_text_color(lv_style_t * style, lv_color_t value) { lv_style_value_t v = { @@ -758,8 +610,6 @@ void lv_style_set_text_color(lv_style_t * style, lv_color_t value) lv_style_set_prop(style, LV_STYLE_TEXT_COLOR, v); } -const lv_style_prop_t _lv_style_const_prop_id_TEXT_COLOR = LV_STYLE_TEXT_COLOR; - void lv_style_set_text_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -768,8 +618,6 @@ void lv_style_set_text_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_TEXT_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_TEXT_OPA = LV_STYLE_TEXT_OPA; - void lv_style_set_text_font(lv_style_t * style, const lv_font_t * value) { lv_style_value_t v = { @@ -778,8 +626,6 @@ void lv_style_set_text_font(lv_style_t * style, const lv_font_t * value) lv_style_set_prop(style, LV_STYLE_TEXT_FONT, v); } -const lv_style_prop_t _lv_style_const_prop_id_TEXT_FONT = LV_STYLE_TEXT_FONT; - void lv_style_set_text_letter_space(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -788,8 +634,6 @@ void lv_style_set_text_letter_space(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_TEXT_LETTER_SPACE, v); } -const lv_style_prop_t _lv_style_const_prop_id_TEXT_LETTER_SPACE = LV_STYLE_TEXT_LETTER_SPACE; - void lv_style_set_text_line_space(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -798,8 +642,6 @@ void lv_style_set_text_line_space(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_TEXT_LINE_SPACE, v); } -const lv_style_prop_t _lv_style_const_prop_id_TEXT_LINE_SPACE = LV_STYLE_TEXT_LINE_SPACE; - void lv_style_set_text_decor(lv_style_t * style, lv_text_decor_t value) { lv_style_value_t v = { @@ -808,8 +650,6 @@ void lv_style_set_text_decor(lv_style_t * style, lv_text_decor_t value) lv_style_set_prop(style, LV_STYLE_TEXT_DECOR, v); } -const lv_style_prop_t _lv_style_const_prop_id_TEXT_DECOR = LV_STYLE_TEXT_DECOR; - void lv_style_set_text_align(lv_style_t * style, lv_text_align_t value) { lv_style_value_t v = { @@ -818,8 +658,6 @@ void lv_style_set_text_align(lv_style_t * style, lv_text_align_t value) lv_style_set_prop(style, LV_STYLE_TEXT_ALIGN, v); } -const lv_style_prop_t _lv_style_const_prop_id_TEXT_ALIGN = LV_STYLE_TEXT_ALIGN; - void lv_style_set_radius(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -828,8 +666,6 @@ void lv_style_set_radius(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_RADIUS, v); } -const lv_style_prop_t _lv_style_const_prop_id_RADIUS = LV_STYLE_RADIUS; - void lv_style_set_clip_corner(lv_style_t * style, bool value) { lv_style_value_t v = { @@ -838,8 +674,6 @@ void lv_style_set_clip_corner(lv_style_t * style, bool value) lv_style_set_prop(style, LV_STYLE_CLIP_CORNER, v); } -const lv_style_prop_t _lv_style_const_prop_id_CLIP_CORNER = LV_STYLE_CLIP_CORNER; - void lv_style_set_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -848,8 +682,6 @@ void lv_style_set_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_OPA = LV_STYLE_OPA; - void lv_style_set_opa_layered(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -858,8 +690,6 @@ void lv_style_set_opa_layered(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_OPA_LAYERED, v); } -const lv_style_prop_t _lv_style_const_prop_id_OPA_LAYERED = LV_STYLE_OPA_LAYERED; - void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value) { lv_style_value_t v = { @@ -868,8 +698,6 @@ void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc lv_style_set_prop(style, LV_STYLE_COLOR_FILTER_DSC, v); } -const lv_style_prop_t _lv_style_const_prop_id_COLOR_FILTER_DSC = LV_STYLE_COLOR_FILTER_DSC; - void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value) { lv_style_value_t v = { @@ -878,8 +706,6 @@ void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_COLOR_FILTER_OPA, v); } -const lv_style_prop_t _lv_style_const_prop_id_COLOR_FILTER_OPA = LV_STYLE_COLOR_FILTER_OPA; - void lv_style_set_anim(lv_style_t * style, const lv_anim_t * value) { lv_style_value_t v = { @@ -888,8 +714,6 @@ void lv_style_set_anim(lv_style_t * style, const lv_anim_t * value) lv_style_set_prop(style, LV_STYLE_ANIM, v); } -const lv_style_prop_t _lv_style_const_prop_id_ANIM = LV_STYLE_ANIM; - void lv_style_set_anim_duration(lv_style_t * style, uint32_t value) { lv_style_value_t v = { @@ -898,8 +722,6 @@ void lv_style_set_anim_duration(lv_style_t * style, uint32_t value) lv_style_set_prop(style, LV_STYLE_ANIM_DURATION, v); } -const lv_style_prop_t _lv_style_const_prop_id_ANIM_DURATION = LV_STYLE_ANIM_DURATION; - void lv_style_set_transition(lv_style_t * style, const lv_style_transition_dsc_t * value) { lv_style_value_t v = { @@ -908,8 +730,6 @@ void lv_style_set_transition(lv_style_t * style, const lv_style_transition_dsc_t lv_style_set_prop(style, LV_STYLE_TRANSITION, v); } -const lv_style_prop_t _lv_style_const_prop_id_TRANSITION = LV_STYLE_TRANSITION; - void lv_style_set_blend_mode(lv_style_t * style, lv_blend_mode_t value) { lv_style_value_t v = { @@ -918,8 +738,6 @@ void lv_style_set_blend_mode(lv_style_t * style, lv_blend_mode_t value) lv_style_set_prop(style, LV_STYLE_BLEND_MODE, v); } -const lv_style_prop_t _lv_style_const_prop_id_BLEND_MODE = LV_STYLE_BLEND_MODE; - void lv_style_set_layout(lv_style_t * style, uint16_t value) { lv_style_value_t v = { @@ -928,8 +746,6 @@ void lv_style_set_layout(lv_style_t * style, uint16_t value) lv_style_set_prop(style, LV_STYLE_LAYOUT, v); } -const lv_style_prop_t _lv_style_const_prop_id_LAYOUT = LV_STYLE_LAYOUT; - void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value) { lv_style_value_t v = { @@ -938,8 +754,6 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value) lv_style_set_prop(style, LV_STYLE_BASE_DIR, v); } -const lv_style_prop_t _lv_style_const_prop_id_BASE_DIR = LV_STYLE_BASE_DIR; - void lv_style_set_bitmap_mask_src(lv_style_t * style, const void * value) { lv_style_value_t v = { @@ -948,8 +762,6 @@ void lv_style_set_bitmap_mask_src(lv_style_t * style, const void * value) lv_style_set_prop(style, LV_STYLE_BITMAP_MASK_SRC, v); } -const lv_style_prop_t _lv_style_const_prop_id_BITMAP_MASK_SRC = LV_STYLE_BITMAP_MASK_SRC; - void lv_style_set_rotary_sensitivity(lv_style_t * style, uint32_t value) { lv_style_value_t v = { @@ -957,8 +769,6 @@ void lv_style_set_rotary_sensitivity(lv_style_t * style, uint32_t value) }; lv_style_set_prop(style, LV_STYLE_ROTARY_SENSITIVITY, v); } - -const lv_style_prop_t _lv_style_const_prop_id_ROTARY_SENSITIVITY = LV_STYLE_ROTARY_SENSITIVITY; #if LV_USE_FLEX void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value) @@ -969,8 +779,6 @@ void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value) lv_style_set_prop(style, LV_STYLE_FLEX_FLOW, v); } -const lv_style_prop_t _lv_style_const_prop_id_FLEX_FLOW = LV_STYLE_FLEX_FLOW; - void lv_style_set_flex_main_place(lv_style_t * style, lv_flex_align_t value) { lv_style_value_t v = { @@ -979,8 +787,6 @@ void lv_style_set_flex_main_place(lv_style_t * style, lv_flex_align_t value) lv_style_set_prop(style, LV_STYLE_FLEX_MAIN_PLACE, v); } -const lv_style_prop_t _lv_style_const_prop_id_FLEX_MAIN_PLACE = LV_STYLE_FLEX_MAIN_PLACE; - void lv_style_set_flex_cross_place(lv_style_t * style, lv_flex_align_t value) { lv_style_value_t v = { @@ -989,8 +795,6 @@ void lv_style_set_flex_cross_place(lv_style_t * style, lv_flex_align_t value) lv_style_set_prop(style, LV_STYLE_FLEX_CROSS_PLACE, v); } -const lv_style_prop_t _lv_style_const_prop_id_FLEX_CROSS_PLACE = LV_STYLE_FLEX_CROSS_PLACE; - void lv_style_set_flex_track_place(lv_style_t * style, lv_flex_align_t value) { lv_style_value_t v = { @@ -999,8 +803,6 @@ void lv_style_set_flex_track_place(lv_style_t * style, lv_flex_align_t value) lv_style_set_prop(style, LV_STYLE_FLEX_TRACK_PLACE, v); } -const lv_style_prop_t _lv_style_const_prop_id_FLEX_TRACK_PLACE = LV_STYLE_FLEX_TRACK_PLACE; - void lv_style_set_flex_grow(lv_style_t * style, uint8_t value) { lv_style_value_t v = { @@ -1008,8 +810,6 @@ void lv_style_set_flex_grow(lv_style_t * style, uint8_t value) }; lv_style_set_prop(style, LV_STYLE_FLEX_GROW, v); } - -const lv_style_prop_t _lv_style_const_prop_id_FLEX_GROW = LV_STYLE_FLEX_GROW; #endif /*LV_USE_FLEX*/ #if LV_USE_GRID @@ -1022,8 +822,6 @@ void lv_style_set_grid_column_dsc_array(lv_style_t * style, const int32_t * valu lv_style_set_prop(style, LV_STYLE_GRID_COLUMN_DSC_ARRAY, v); } -const lv_style_prop_t _lv_style_const_prop_id_GRID_COLUMN_DSC_ARRAY = LV_STYLE_GRID_COLUMN_DSC_ARRAY; - void lv_style_set_grid_column_align(lv_style_t * style, lv_grid_align_t value) { lv_style_value_t v = { @@ -1032,8 +830,6 @@ void lv_style_set_grid_column_align(lv_style_t * style, lv_grid_align_t value) lv_style_set_prop(style, LV_STYLE_GRID_COLUMN_ALIGN, v); } -const lv_style_prop_t _lv_style_const_prop_id_GRID_COLUMN_ALIGN = LV_STYLE_GRID_COLUMN_ALIGN; - void lv_style_set_grid_row_dsc_array(lv_style_t * style, const int32_t * value) { lv_style_value_t v = { @@ -1042,8 +838,6 @@ void lv_style_set_grid_row_dsc_array(lv_style_t * style, const int32_t * value) lv_style_set_prop(style, LV_STYLE_GRID_ROW_DSC_ARRAY, v); } -const lv_style_prop_t _lv_style_const_prop_id_GRID_ROW_DSC_ARRAY = LV_STYLE_GRID_ROW_DSC_ARRAY; - void lv_style_set_grid_row_align(lv_style_t * style, lv_grid_align_t value) { lv_style_value_t v = { @@ -1052,8 +846,6 @@ void lv_style_set_grid_row_align(lv_style_t * style, lv_grid_align_t value) lv_style_set_prop(style, LV_STYLE_GRID_ROW_ALIGN, v); } -const lv_style_prop_t _lv_style_const_prop_id_GRID_ROW_ALIGN = LV_STYLE_GRID_ROW_ALIGN; - void lv_style_set_grid_cell_column_pos(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -1062,8 +854,6 @@ void lv_style_set_grid_cell_column_pos(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_GRID_CELL_COLUMN_POS, v); } -const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_COLUMN_POS = LV_STYLE_GRID_CELL_COLUMN_POS; - void lv_style_set_grid_cell_x_align(lv_style_t * style, lv_grid_align_t value) { lv_style_value_t v = { @@ -1072,8 +862,6 @@ void lv_style_set_grid_cell_x_align(lv_style_t * style, lv_grid_align_t value) lv_style_set_prop(style, LV_STYLE_GRID_CELL_X_ALIGN, v); } -const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_X_ALIGN = LV_STYLE_GRID_CELL_X_ALIGN; - void lv_style_set_grid_cell_column_span(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -1082,8 +870,6 @@ void lv_style_set_grid_cell_column_span(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_GRID_CELL_COLUMN_SPAN, v); } -const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_COLUMN_SPAN = LV_STYLE_GRID_CELL_COLUMN_SPAN; - void lv_style_set_grid_cell_row_pos(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -1092,8 +878,6 @@ void lv_style_set_grid_cell_row_pos(lv_style_t * style, int32_t value) lv_style_set_prop(style, LV_STYLE_GRID_CELL_ROW_POS, v); } -const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_ROW_POS = LV_STYLE_GRID_CELL_ROW_POS; - void lv_style_set_grid_cell_y_align(lv_style_t * style, lv_grid_align_t value) { lv_style_value_t v = { @@ -1102,8 +886,6 @@ void lv_style_set_grid_cell_y_align(lv_style_t * style, lv_grid_align_t value) lv_style_set_prop(style, LV_STYLE_GRID_CELL_Y_ALIGN, v); } -const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_Y_ALIGN = LV_STYLE_GRID_CELL_Y_ALIGN; - void lv_style_set_grid_cell_row_span(lv_style_t * style, int32_t value) { lv_style_value_t v = { @@ -1111,7 +893,5 @@ void lv_style_set_grid_cell_row_span(lv_style_t * style, int32_t value) }; lv_style_set_prop(style, LV_STYLE_GRID_CELL_ROW_SPAN, v); } - -const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_ROW_SPAN = LV_STYLE_GRID_CELL_ROW_SPAN; #endif /*LV_USE_GRID*/ diff --git a/src/misc/lv_style_gen.h b/src/misc/lv_style_gen.h index 5bd9833ed..5714e74d9 100644 --- a/src/misc/lv_style_gen.h +++ b/src/misc/lv_style_gen.h @@ -15,731 +15,621 @@ extern "C" { #endif void lv_style_set_width(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_WIDTH; void lv_style_set_min_width(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MIN_WIDTH; void lv_style_set_max_width(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MAX_WIDTH; void lv_style_set_height(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_HEIGHT; void lv_style_set_min_height(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MIN_HEIGHT; void lv_style_set_max_height(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MAX_HEIGHT; void lv_style_set_length(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LENGTH; void lv_style_set_x(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_X; void lv_style_set_y(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_Y; void lv_style_set_align(lv_style_t * style, lv_align_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ALIGN; void lv_style_set_transform_width(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_WIDTH; void lv_style_set_transform_height(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_HEIGHT; void lv_style_set_translate_x(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSLATE_X; void lv_style_set_translate_y(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSLATE_Y; void lv_style_set_transform_scale_x(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SCALE_X; void lv_style_set_transform_scale_y(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SCALE_Y; void lv_style_set_transform_rotation(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_ROTATION; void lv_style_set_transform_pivot_x(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_PIVOT_X; void lv_style_set_transform_pivot_y(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_PIVOT_Y; void lv_style_set_transform_skew_x(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SKEW_X; void lv_style_set_transform_skew_y(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SKEW_Y; void lv_style_set_pad_top(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_PAD_TOP; void lv_style_set_pad_bottom(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_PAD_BOTTOM; void lv_style_set_pad_left(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_PAD_LEFT; void lv_style_set_pad_right(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_PAD_RIGHT; void lv_style_set_pad_row(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_PAD_ROW; void lv_style_set_pad_column(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_PAD_COLUMN; void lv_style_set_margin_top(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MARGIN_TOP; void lv_style_set_margin_bottom(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MARGIN_BOTTOM; void lv_style_set_margin_left(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MARGIN_LEFT; void lv_style_set_margin_right(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MARGIN_RIGHT; void lv_style_set_bg_color(lv_style_t * style, lv_color_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_COLOR; void lv_style_set_bg_opa(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_OPA; void lv_style_set_bg_grad_color(lv_style_t * style, lv_color_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_COLOR; void lv_style_set_bg_grad_dir(lv_style_t * style, lv_grad_dir_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_DIR; void lv_style_set_bg_main_stop(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_MAIN_STOP; void lv_style_set_bg_grad_stop(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_STOP; void lv_style_set_bg_main_opa(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_MAIN_OPA; void lv_style_set_bg_grad_opa(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_OPA; void lv_style_set_bg_grad(lv_style_t * style, const lv_grad_dsc_t * value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD; void lv_style_set_bg_image_src(lv_style_t * style, const void * value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_SRC; void lv_style_set_bg_image_opa(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_OPA; void lv_style_set_bg_image_recolor(lv_style_t * style, lv_color_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_RECOLOR; void lv_style_set_bg_image_recolor_opa(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_RECOLOR_OPA; void lv_style_set_bg_image_tiled(lv_style_t * style, bool value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_TILED; void lv_style_set_border_color(lv_style_t * style, lv_color_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BORDER_COLOR; void lv_style_set_border_opa(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BORDER_OPA; void lv_style_set_border_width(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BORDER_WIDTH; void lv_style_set_border_side(lv_style_t * style, lv_border_side_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BORDER_SIDE; void lv_style_set_border_post(lv_style_t * style, bool value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BORDER_POST; void lv_style_set_outline_width(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_WIDTH; void lv_style_set_outline_color(lv_style_t * style, lv_color_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_COLOR; void lv_style_set_outline_opa(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_OPA; void lv_style_set_outline_pad(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_PAD; void lv_style_set_shadow_width(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_SHADOW_WIDTH; void lv_style_set_shadow_offset_x(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_SHADOW_OFFSET_X; void lv_style_set_shadow_offset_y(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_SHADOW_OFFSET_Y; void lv_style_set_shadow_spread(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_SHADOW_SPREAD; void lv_style_set_shadow_color(lv_style_t * style, lv_color_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_SHADOW_COLOR; void lv_style_set_shadow_opa(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_SHADOW_OPA; void lv_style_set_image_opa(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_IMAGE_OPA; void lv_style_set_image_recolor(lv_style_t * style, lv_color_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_IMAGE_RECOLOR; void lv_style_set_image_recolor_opa(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_IMAGE_RECOLOR_OPA; void lv_style_set_line_width(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LINE_WIDTH; void lv_style_set_line_dash_width(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LINE_DASH_WIDTH; void lv_style_set_line_dash_gap(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LINE_DASH_GAP; void lv_style_set_line_rounded(lv_style_t * style, bool value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LINE_ROUNDED; void lv_style_set_line_color(lv_style_t * style, lv_color_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LINE_COLOR; void lv_style_set_line_opa(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LINE_OPA; void lv_style_set_arc_width(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ARC_WIDTH; void lv_style_set_arc_rounded(lv_style_t * style, bool value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ARC_ROUNDED; void lv_style_set_arc_color(lv_style_t * style, lv_color_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ARC_COLOR; void lv_style_set_arc_opa(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ARC_OPA; void lv_style_set_arc_image_src(lv_style_t * style, const void * value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ARC_IMAGE_SRC; void lv_style_set_text_color(lv_style_t * style, lv_color_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TEXT_COLOR; void lv_style_set_text_opa(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TEXT_OPA; void lv_style_set_text_font(lv_style_t * style, const lv_font_t * value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TEXT_FONT; void lv_style_set_text_letter_space(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TEXT_LETTER_SPACE; void lv_style_set_text_line_space(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TEXT_LINE_SPACE; void lv_style_set_text_decor(lv_style_t * style, lv_text_decor_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TEXT_DECOR; void lv_style_set_text_align(lv_style_t * style, lv_text_align_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TEXT_ALIGN; void lv_style_set_radius(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_RADIUS; void lv_style_set_clip_corner(lv_style_t * style, bool value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_CLIP_CORNER; void lv_style_set_opa(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_OPA; void lv_style_set_opa_layered(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_OPA_LAYERED; void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_COLOR_FILTER_DSC; void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_COLOR_FILTER_OPA; void lv_style_set_anim(lv_style_t * style, const lv_anim_t * value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ANIM; void lv_style_set_anim_duration(lv_style_t * style, uint32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ANIM_DURATION; void lv_style_set_transition(lv_style_t * style, const lv_style_transition_dsc_t * value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSITION; void lv_style_set_blend_mode(lv_style_t * style, lv_blend_mode_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BLEND_MODE; void lv_style_set_layout(lv_style_t * style, uint16_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LAYOUT; void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BASE_DIR; void lv_style_set_bitmap_mask_src(lv_style_t * style, const void * value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BITMAP_MASK_SRC; void lv_style_set_rotary_sensitivity(lv_style_t * style, uint32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ROTARY_SENSITIVITY; #if LV_USE_FLEX void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_FLOW; void lv_style_set_flex_main_place(lv_style_t * style, lv_flex_align_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_MAIN_PLACE; void lv_style_set_flex_cross_place(lv_style_t * style, lv_flex_align_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_CROSS_PLACE; void lv_style_set_flex_track_place(lv_style_t * style, lv_flex_align_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_TRACK_PLACE; void lv_style_set_flex_grow(lv_style_t * style, uint8_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_GROW; #endif /*LV_USE_FLEX*/ #if LV_USE_GRID void lv_style_set_grid_column_dsc_array(lv_style_t * style, const int32_t * value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_COLUMN_DSC_ARRAY; void lv_style_set_grid_column_align(lv_style_t * style, lv_grid_align_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_COLUMN_ALIGN; void lv_style_set_grid_row_dsc_array(lv_style_t * style, const int32_t * value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_ROW_DSC_ARRAY; void lv_style_set_grid_row_align(lv_style_t * style, lv_grid_align_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_ROW_ALIGN; void lv_style_set_grid_cell_column_pos(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_COLUMN_POS; void lv_style_set_grid_cell_x_align(lv_style_t * style, lv_grid_align_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_X_ALIGN; void lv_style_set_grid_cell_column_span(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_COLUMN_SPAN; void lv_style_set_grid_cell_row_pos(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_ROW_POS; void lv_style_set_grid_cell_y_align(lv_style_t * style, lv_grid_align_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_Y_ALIGN; void lv_style_set_grid_cell_row_span(lv_style_t * style, int32_t value); -LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_ROW_SPAN; #endif /*LV_USE_GRID*/ #define LV_STYLE_CONST_WIDTH(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_WIDTH, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_WIDTH, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_MIN_WIDTH(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_MIN_WIDTH, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_MIN_WIDTH, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_MAX_WIDTH(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_MAX_WIDTH, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_MAX_WIDTH, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_HEIGHT(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_HEIGHT, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_HEIGHT, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_MIN_HEIGHT(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_MIN_HEIGHT, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_MIN_HEIGHT, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_MAX_HEIGHT(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_MAX_HEIGHT, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_MAX_HEIGHT, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_LENGTH(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_LENGTH, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_LENGTH, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_X(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_X, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_X, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_Y(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_Y, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_Y, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_ALIGN(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_ALIGN, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_ALIGN, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TRANSFORM_WIDTH(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_WIDTH, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TRANSFORM_WIDTH, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TRANSFORM_HEIGHT(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_HEIGHT, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TRANSFORM_HEIGHT, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TRANSLATE_X(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TRANSLATE_X, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TRANSLATE_X, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TRANSLATE_Y(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TRANSLATE_Y, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TRANSLATE_Y, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TRANSFORM_SCALE_X(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_SCALE_X, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TRANSFORM_SCALE_X, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TRANSFORM_SCALE_Y(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_SCALE_Y, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TRANSFORM_SCALE_Y, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TRANSFORM_ROTATION(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_ROTATION, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TRANSFORM_ROTATION, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TRANSFORM_PIVOT_X(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_PIVOT_X, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TRANSFORM_PIVOT_X, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TRANSFORM_PIVOT_Y(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_PIVOT_Y, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TRANSFORM_PIVOT_Y, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TRANSFORM_SKEW_X(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_SKEW_X, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TRANSFORM_SKEW_X, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TRANSFORM_SKEW_Y(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_SKEW_Y, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TRANSFORM_SKEW_Y, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_PAD_TOP(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_PAD_TOP, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_PAD_TOP, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_PAD_BOTTOM(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_PAD_BOTTOM, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_PAD_BOTTOM, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_PAD_LEFT(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_PAD_LEFT, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_PAD_LEFT, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_PAD_RIGHT(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_PAD_RIGHT, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_PAD_RIGHT, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_PAD_ROW(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_PAD_ROW, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_PAD_ROW, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_PAD_COLUMN(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_PAD_COLUMN, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_PAD_COLUMN, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_MARGIN_TOP(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_MARGIN_TOP, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_MARGIN_TOP, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_MARGIN_BOTTOM(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_MARGIN_BOTTOM, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_MARGIN_BOTTOM, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_MARGIN_LEFT(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_MARGIN_LEFT, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_MARGIN_LEFT, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_MARGIN_RIGHT(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_MARGIN_RIGHT, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_MARGIN_RIGHT, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_BG_COLOR(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_COLOR, .value = { .color = val } \ + .prop = LV_STYLE_BG_COLOR, .value = { .color = val } \ } #define LV_STYLE_CONST_BG_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_OPA, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_BG_OPA, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_BG_GRAD_COLOR(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_GRAD_COLOR, .value = { .color = val } \ + .prop = LV_STYLE_BG_GRAD_COLOR, .value = { .color = val } \ } #define LV_STYLE_CONST_BG_GRAD_DIR(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_GRAD_DIR, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_BG_GRAD_DIR, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_BG_MAIN_STOP(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_MAIN_STOP, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_BG_MAIN_STOP, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_BG_GRAD_STOP(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_GRAD_STOP, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_BG_GRAD_STOP, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_BG_MAIN_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_MAIN_OPA, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_BG_MAIN_OPA, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_BG_GRAD_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_GRAD_OPA, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_BG_GRAD_OPA, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_BG_GRAD(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_GRAD, .value = { .ptr = val } \ + .prop = LV_STYLE_BG_GRAD, .value = { .ptr = val } \ } #define LV_STYLE_CONST_BG_IMAGE_SRC(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_IMAGE_SRC, .value = { .ptr = val } \ + .prop = LV_STYLE_BG_IMAGE_SRC, .value = { .ptr = val } \ } #define LV_STYLE_CONST_BG_IMAGE_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_IMAGE_OPA, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_BG_IMAGE_OPA, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_BG_IMAGE_RECOLOR(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_IMAGE_RECOLOR, .value = { .color = val } \ + .prop = LV_STYLE_BG_IMAGE_RECOLOR, .value = { .color = val } \ } #define LV_STYLE_CONST_BG_IMAGE_RECOLOR_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_IMAGE_RECOLOR_OPA, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_BG_IMAGE_RECOLOR_OPA, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_BG_IMAGE_TILED(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BG_IMAGE_TILED, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_BG_IMAGE_TILED, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_BORDER_COLOR(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BORDER_COLOR, .value = { .color = val } \ + .prop = LV_STYLE_BORDER_COLOR, .value = { .color = val } \ } #define LV_STYLE_CONST_BORDER_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BORDER_OPA, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_BORDER_OPA, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_BORDER_WIDTH(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BORDER_WIDTH, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_BORDER_WIDTH, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_BORDER_SIDE(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BORDER_SIDE, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_BORDER_SIDE, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_BORDER_POST(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BORDER_POST, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_BORDER_POST, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_OUTLINE_WIDTH(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_OUTLINE_WIDTH, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_OUTLINE_WIDTH, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_OUTLINE_COLOR(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_OUTLINE_COLOR, .value = { .color = val } \ + .prop = LV_STYLE_OUTLINE_COLOR, .value = { .color = val } \ } #define LV_STYLE_CONST_OUTLINE_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_OUTLINE_OPA, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_OUTLINE_OPA, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_OUTLINE_PAD(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_OUTLINE_PAD, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_OUTLINE_PAD, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_SHADOW_WIDTH(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_SHADOW_WIDTH, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_SHADOW_WIDTH, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_SHADOW_OFFSET_X(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_SHADOW_OFFSET_X, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_SHADOW_OFFSET_X, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_SHADOW_OFFSET_Y(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_SHADOW_OFFSET_Y, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_SHADOW_OFFSET_Y, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_SHADOW_SPREAD(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_SHADOW_SPREAD, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_SHADOW_SPREAD, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_SHADOW_COLOR(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_SHADOW_COLOR, .value = { .color = val } \ + .prop = LV_STYLE_SHADOW_COLOR, .value = { .color = val } \ } #define LV_STYLE_CONST_SHADOW_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_SHADOW_OPA, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_SHADOW_OPA, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_IMAGE_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_IMAGE_OPA, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_IMAGE_OPA, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_IMAGE_RECOLOR(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_IMAGE_RECOLOR, .value = { .color = val } \ + .prop = LV_STYLE_IMAGE_RECOLOR, .value = { .color = val } \ } #define LV_STYLE_CONST_IMAGE_RECOLOR_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_IMAGE_RECOLOR_OPA, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_IMAGE_RECOLOR_OPA, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_LINE_WIDTH(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_LINE_WIDTH, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_LINE_WIDTH, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_LINE_DASH_WIDTH(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_LINE_DASH_WIDTH, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_LINE_DASH_WIDTH, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_LINE_DASH_GAP(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_LINE_DASH_GAP, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_LINE_DASH_GAP, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_LINE_ROUNDED(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_LINE_ROUNDED, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_LINE_ROUNDED, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_LINE_COLOR(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_LINE_COLOR, .value = { .color = val } \ + .prop = LV_STYLE_LINE_COLOR, .value = { .color = val } \ } #define LV_STYLE_CONST_LINE_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_LINE_OPA, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_LINE_OPA, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_ARC_WIDTH(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_ARC_WIDTH, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_ARC_WIDTH, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_ARC_ROUNDED(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_ARC_ROUNDED, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_ARC_ROUNDED, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_ARC_COLOR(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_ARC_COLOR, .value = { .color = val } \ + .prop = LV_STYLE_ARC_COLOR, .value = { .color = val } \ } #define LV_STYLE_CONST_ARC_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_ARC_OPA, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_ARC_OPA, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_ARC_IMAGE_SRC(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_ARC_IMAGE_SRC, .value = { .ptr = val } \ + .prop = LV_STYLE_ARC_IMAGE_SRC, .value = { .ptr = val } \ } #define LV_STYLE_CONST_TEXT_COLOR(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TEXT_COLOR, .value = { .color = val } \ + .prop = LV_STYLE_TEXT_COLOR, .value = { .color = val } \ } #define LV_STYLE_CONST_TEXT_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TEXT_OPA, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TEXT_OPA, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TEXT_FONT(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TEXT_FONT, .value = { .ptr = val } \ + .prop = LV_STYLE_TEXT_FONT, .value = { .ptr = val } \ } #define LV_STYLE_CONST_TEXT_LETTER_SPACE(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TEXT_LETTER_SPACE, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TEXT_LETTER_SPACE, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TEXT_LINE_SPACE(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TEXT_LINE_SPACE, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TEXT_LINE_SPACE, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TEXT_DECOR(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TEXT_DECOR, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TEXT_DECOR, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TEXT_ALIGN(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TEXT_ALIGN, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_TEXT_ALIGN, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_RADIUS(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_RADIUS, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_RADIUS, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_CLIP_CORNER(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_CLIP_CORNER, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_CLIP_CORNER, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_OPA, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_OPA, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_OPA_LAYERED(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_OPA_LAYERED, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_OPA_LAYERED, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_COLOR_FILTER_DSC(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_COLOR_FILTER_DSC, .value = { .ptr = val } \ + .prop = LV_STYLE_COLOR_FILTER_DSC, .value = { .ptr = val } \ } #define LV_STYLE_CONST_COLOR_FILTER_OPA(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_COLOR_FILTER_OPA, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_COLOR_FILTER_OPA, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_ANIM(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_ANIM, .value = { .ptr = val } \ + .prop = LV_STYLE_ANIM, .value = { .ptr = val } \ } #define LV_STYLE_CONST_ANIM_DURATION(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_ANIM_DURATION, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_ANIM_DURATION, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_TRANSITION(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_TRANSITION, .value = { .ptr = val } \ + .prop = LV_STYLE_TRANSITION, .value = { .ptr = val } \ } #define LV_STYLE_CONST_BLEND_MODE(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BLEND_MODE, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_BLEND_MODE, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_LAYOUT(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_LAYOUT, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_LAYOUT, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_BASE_DIR(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BASE_DIR, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_BASE_DIR, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_BITMAP_MASK_SRC(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_BITMAP_MASK_SRC, .value = { .ptr = val } \ + .prop = LV_STYLE_BITMAP_MASK_SRC, .value = { .ptr = val } \ } #define LV_STYLE_CONST_ROTARY_SENSITIVITY(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_ROTARY_SENSITIVITY, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_ROTARY_SENSITIVITY, .value = { .num = (int32_t)val } \ } #if LV_USE_FLEX #define LV_STYLE_CONST_FLEX_FLOW(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_FLEX_FLOW, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_FLEX_FLOW, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_FLEX_MAIN_PLACE(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_FLEX_MAIN_PLACE, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_FLEX_MAIN_PLACE, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_FLEX_CROSS_PLACE(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_FLEX_CROSS_PLACE, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_FLEX_CROSS_PLACE, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_FLEX_TRACK_PLACE(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_FLEX_TRACK_PLACE, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_FLEX_TRACK_PLACE, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_FLEX_GROW(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_FLEX_GROW, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_FLEX_GROW, .value = { .num = (int32_t)val } \ } #endif /*LV_USE_FLEX*/ @@ -747,52 +637,52 @@ LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GR #define LV_STYLE_CONST_GRID_COLUMN_DSC_ARRAY(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_GRID_COLUMN_DSC_ARRAY, .value = { .ptr = val } \ + .prop = LV_STYLE_GRID_COLUMN_DSC_ARRAY, .value = { .ptr = val } \ } #define LV_STYLE_CONST_GRID_COLUMN_ALIGN(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_GRID_COLUMN_ALIGN, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_GRID_COLUMN_ALIGN, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_GRID_ROW_DSC_ARRAY(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_GRID_ROW_DSC_ARRAY, .value = { .ptr = val } \ + .prop = LV_STYLE_GRID_ROW_DSC_ARRAY, .value = { .ptr = val } \ } #define LV_STYLE_CONST_GRID_ROW_ALIGN(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_GRID_ROW_ALIGN, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_GRID_ROW_ALIGN, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_GRID_CELL_COLUMN_POS(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_GRID_CELL_COLUMN_POS, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_GRID_CELL_COLUMN_POS, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_GRID_CELL_X_ALIGN(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_GRID_CELL_X_ALIGN, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_GRID_CELL_X_ALIGN, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_GRID_CELL_COLUMN_SPAN(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_GRID_CELL_COLUMN_SPAN, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_GRID_CELL_COLUMN_SPAN, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_GRID_CELL_ROW_POS(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_GRID_CELL_ROW_POS, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_GRID_CELL_ROW_POS, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_GRID_CELL_Y_ALIGN(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_GRID_CELL_Y_ALIGN, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_GRID_CELL_Y_ALIGN, .value = { .num = (int32_t)val } \ } #define LV_STYLE_CONST_GRID_CELL_ROW_SPAN(val) \ { \ - .prop_ptr = &_lv_style_const_prop_id_GRID_CELL_ROW_SPAN, .value = { .num = (int32_t)val } \ + .prop = LV_STYLE_GRID_CELL_ROW_SPAN, .value = { .num = (int32_t)val } \ } #endif /*LV_USE_GRID*/ diff --git a/src/misc/lv_style_private.h b/src/misc/lv_style_private.h new file mode 100644 index 000000000..8a88185d6 --- /dev/null +++ b/src/misc/lv_style_private.h @@ -0,0 +1,39 @@ +/** + * @file lv_style_private.h + * + */ + +#ifndef LV_STYLE_PRIVATE_H +#define LV_STYLE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_STYLE_PRIVATE_H*/ diff --git a/src/misc/lv_text.c b/src/misc/lv_text.c index d531176dd..9eb240cb2 100644 --- a/src/misc/lv_text.c +++ b/src/misc/lv_text.c @@ -426,13 +426,13 @@ char * lv_text_set_text_vfmt(const char * fmt, va_list ap) lv_vsnprintf(raw_txt, len + 1, fmt, ap); /*Get the size of the Arabic text and process it*/ - size_t len_ap = _lv_text_ap_calc_bytes_count(raw_txt); + size_t len_ap = lv_text_ap_calc_bytes_count(raw_txt); text = lv_malloc(len_ap + 1); LV_ASSERT_MALLOC(text); if(text == NULL) { return NULL; } - _lv_text_ap_proc(raw_txt, text); + lv_text_ap_proc(raw_txt, text); lv_free(raw_txt); #else diff --git a/src/misc/lv_text.h b/src/misc/lv_text.h index 0b8fd5d91..f2407dd8e 100644 --- a/src/misc/lv_text.h +++ b/src/misc/lv_text.h @@ -35,7 +35,7 @@ extern "C" { * Options for text rendering. */ -enum _lv_text_flag_t { +typedef enum { LV_TEXT_FLAG_NONE = 0x00, LV_TEXT_FLAG_EXPAND = 0x01, /**< Ignore max-width to avoid automatic word wrapping*/ LV_TEXT_FLAG_FIT = 0x02, /**< Max-width is already equal to the longest line. (Used to skip some calculation)*/ @@ -43,27 +43,15 @@ enum _lv_text_flag_t { Otherwise breaks are inserted at word boundaries, as configured via LV_TXT_BREAK_CHARS or according to LV_TXT_LINE_BREAK_LONG_LEN, LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN, and LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN.*/ -}; - -#ifdef DOXYGEN -typedef _lv_text_flag_t lv_text_flag_t; -#else -typedef uint8_t lv_text_flag_t; -#endif /*DOXYGEN*/ +} lv_text_flag_t; /** Label align policy*/ -enum _lv_text_align_t { +typedef enum { LV_TEXT_ALIGN_AUTO, /**< Align text auto*/ LV_TEXT_ALIGN_LEFT, /**< Align text to left*/ LV_TEXT_ALIGN_CENTER, /**< Align text to center*/ LV_TEXT_ALIGN_RIGHT, /**< Align text to right*/ -}; - -#ifdef DOXYGEN -typedef _lv_text_align_t lv_text_align_t; -#else -typedef uint8_t lv_text_align_t; -#endif /*DOXYGEN*/ +} lv_text_align_t; /********************** * GLOBAL PROTOTYPES diff --git a/src/misc/lv_text_ap.c b/src/misc/lv_text_ap.c index 00c23fc25..320debd0f 100644 --- a/src/misc/lv_text_ap.c +++ b/src/misc/lv_text_ap.c @@ -106,7 +106,7 @@ const ap_chars_map_t ap_chars_map[] = { /********************** * GLOBAL FUNCTIONS **********************/ -uint32_t _lv_text_ap_calc_bytes_count(const char * txt) +uint32_t lv_text_ap_calc_bytes_count(const char * txt) { uint32_t txt_length = 0; uint32_t chars_cnt = 0; @@ -140,7 +140,7 @@ uint32_t _lv_text_ap_calc_bytes_count(const char * txt) return chars_cnt + 1; } -void _lv_text_ap_proc(const char * txt, char * txt_out) +void lv_text_ap_proc(const char * txt, char * txt_out) { uint32_t txt_length = 0; uint32_t index_current, idx_next, idx_previous, i, j; diff --git a/src/misc/lv_text_ap.h b/src/misc/lv_text_ap.h index 1530190a2..cac7c7121 100644 --- a/src/misc/lv_text_ap.h +++ b/src/misc/lv_text_ap.h @@ -33,8 +33,8 @@ extern "C" { /********************** * GLOBAL PROTOTYPES **********************/ -uint32_t _lv_text_ap_calc_bytes_count(const char * txt); -void _lv_text_ap_proc(const char * txt, char * txt_out); +uint32_t lv_text_ap_calc_bytes_count(const char * txt); +void lv_text_ap_proc(const char * txt, char * txt_out); /********************** * MACROS diff --git a/src/misc/lv_timer.c b/src/misc/lv_timer.c index 57d201fe9..959ce53b9 100644 --- a/src/misc/lv_timer.c +++ b/src/misc/lv_timer.c @@ -5,7 +5,7 @@ /********************* * INCLUDES *********************/ -#include "lv_timer.h" +#include "lv_timer_private.h" #include "../core/lv_global.h" #include "../tick/lv_tick.h" #include "../stdlib/lv_mem.h" @@ -52,9 +52,9 @@ static void lv_timer_handler_resume(void); * GLOBAL FUNCTIONS **********************/ -void _lv_timer_core_init(void) +void lv_timer_core_init(void) { - _lv_ll_init(timer_ll_p, sizeof(lv_timer_t)); + lv_ll_init(timer_ll_p, sizeof(lv_timer_t)); /*Initially enable the lv_timer handling*/ lv_timer_enable(true); @@ -98,11 +98,11 @@ LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void) state_p->timer_deleted = false; state_p->timer_created = false; - timer_active = _lv_ll_get_head(timer_head); + timer_active = lv_ll_get_head(timer_head); while(timer_active) { /*The timer might be deleted if it runs only once ('repeat_count = 1') *So get next element until the current is surely valid*/ - next = _lv_ll_get_next(timer_head, timer_active); + next = lv_ll_get_next(timer_head, timer_active); if(lv_timer_exec(timer_active)) { /*If a timer was created or deleted then this or the next item might be corrupted*/ @@ -117,7 +117,7 @@ LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void) } while(timer_active); uint32_t time_until_next = LV_NO_TIMER_READY; - next = _lv_ll_get_head(timer_head); + next = lv_ll_get_head(timer_head); while(next) { if(!next->paused) { uint32_t delay = lv_timer_time_remaining(next); @@ -125,7 +125,7 @@ LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void) time_until_next = delay; } - next = _lv_ll_get_next(timer_head, next); /*Find the next timer*/ + next = lv_ll_get_next(timer_head, next); /*Find the next timer*/ } state_p->busy_time += lv_tick_elaps(handler_start); @@ -167,7 +167,7 @@ lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * us { lv_timer_t * new_timer = NULL; - new_timer = _lv_ll_ins_head(timer_ll_p); + new_timer = lv_ll_ins_head(timer_ll_p); LV_ASSERT_MALLOC(new_timer); if(new_timer == NULL) return NULL; @@ -194,7 +194,7 @@ void lv_timer_set_cb(lv_timer_t * timer, lv_timer_cb_t timer_cb) void lv_timer_delete(lv_timer_t * timer) { - _lv_ll_remove(timer_ll_p, timer); + lv_ll_remove(timer_ll_p, timer); state.timer_deleted = true; lv_free(timer); @@ -256,11 +256,11 @@ void lv_timer_enable(bool en) if(en) lv_timer_handler_resume(); } -void _lv_timer_core_deinit(void) +void lv_timer_core_deinit(void) { lv_timer_enable(false); - _lv_ll_clear(timer_ll_p); + lv_ll_clear(timer_ll_p); } uint32_t lv_timer_get_idle(void) @@ -275,8 +275,29 @@ uint32_t lv_timer_get_time_until_next(void) lv_timer_t * lv_timer_get_next(lv_timer_t * timer) { - if(timer == NULL) return _lv_ll_get_head(timer_ll_p); - else return _lv_ll_get_next(timer_ll_p, timer); + if(timer == NULL) return lv_ll_get_head(timer_ll_p); + else return lv_ll_get_next(timer_ll_p, timer); +} + +LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler_run_in_period(uint32_t period) +{ + static uint32_t last_tick = 0; + + if(lv_tick_elaps(last_tick) >= period) { + last_tick = lv_tick_get(); + return lv_timer_handler(); + } + return 1; +} + +void * lv_timer_get_user_data(lv_timer_t * timer) +{ + return timer->user_data; +} + +bool lv_timer_get_paused(lv_timer_t * timer) +{ + return timer->paused; } /********************** diff --git a/src/misc/lv_timer.h b/src/misc/lv_timer.h index 119b8bc9a..be2500333 100644 --- a/src/misc/lv_timer.h +++ b/src/misc/lv_timer.h @@ -40,52 +40,10 @@ typedef void (*lv_timer_cb_t)(lv_timer_t *); */ typedef void (*lv_timer_handler_resume_cb_t)(void * data); -/** - * Descriptor of a lv_timer - */ -struct _lv_timer_t { - uint32_t period; /**< How often the timer should run*/ - uint32_t last_run; /**< Last time the timer ran*/ - lv_timer_cb_t timer_cb; /**< Timer function*/ - void * user_data; /**< Custom user data*/ - int32_t repeat_count; /**< 1: One time; -1 : infinity; n>0: residual times*/ - uint32_t paused : 1; - uint32_t auto_delete : 1; -}; - -typedef struct { - lv_ll_t timer_ll; /*Linked list to store the lv_timers*/ - - bool lv_timer_run; - uint8_t idle_last; - bool timer_deleted; - bool timer_created; - uint32_t timer_time_until_next; - - bool already_running; - uint32_t periodic_last_tick; - uint32_t busy_time; - uint32_t idle_period_start; - uint32_t run_cnt; - - lv_timer_handler_resume_cb_t resume_cb; - void * resume_data; -} lv_timer_state_t; - /********************** * GLOBAL PROTOTYPES **********************/ -/** - * Init the lv_timer module - */ -void _lv_timer_core_init(void); - -/** - * Deinit the lv_timer module - */ -void _lv_timer_core_deinit(void); - //! @cond Doxygen_Suppress /** @@ -103,16 +61,7 @@ LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void); * @param period the period for running lv_timer_handler() * @return the time after which it must be called again */ -static inline LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler_run_in_period(uint32_t period) -{ - static uint32_t last_tick = 0; - - if(lv_tick_elaps(last_tick) >= period) { - last_tick = lv_tick_get(); - return lv_timer_handler(); - } - return 1; -} +LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler_run_in_period(uint32_t period); /** * Call it in the super-loop of main() or threads. It will automatically call lv_timer_handler() at the right time. @@ -241,20 +190,14 @@ lv_timer_t * lv_timer_get_next(lv_timer_t * timer); * @param timer pointer to the lv_timer * @return pointer to the user_data */ -static inline void * lv_timer_get_user_data(lv_timer_t * timer) -{ - return timer->user_data; -} +void * lv_timer_get_user_data(lv_timer_t * timer); /** * Get the pause state of a timer * @param timer pointer to a lv_timer * @return true: timer is paused; false: timer is running */ -static inline bool lv_timer_get_paused(lv_timer_t * timer) -{ - return timer->paused; -} +bool lv_timer_get_paused(lv_timer_t * timer); /********************** * MACROS diff --git a/src/misc/lv_timer_private.h b/src/misc/lv_timer_private.h new file mode 100644 index 000000000..d7c883a47 --- /dev/null +++ b/src/misc/lv_timer_private.h @@ -0,0 +1,81 @@ +/** + * @file lv_timer_private.h + * + */ + +#ifndef LV_TIMER_PRIVATE_H +#define LV_TIMER_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_timer.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Descriptor of a lv_timer + */ +struct lv_timer_t { + uint32_t period; /**< How often the timer should run*/ + uint32_t last_run; /**< Last time the timer ran*/ + lv_timer_cb_t timer_cb; /**< Timer function*/ + void * user_data; /**< Custom user data*/ + int32_t repeat_count; /**< 1: One time; -1 : infinity; n>0: residual times*/ + uint32_t paused : 1; + uint32_t auto_delete : 1; +}; + +typedef struct { + lv_ll_t timer_ll; /*Linked list to store the lv_timers*/ + + bool lv_timer_run; + uint8_t idle_last; + bool timer_deleted; + bool timer_created; + uint32_t timer_time_until_next; + + bool already_running; + uint32_t periodic_last_tick; + uint32_t busy_time; + uint32_t idle_period_start; + uint32_t run_cnt; + + lv_timer_handler_resume_cb_t resume_cb; + void * resume_data; +} lv_timer_state_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Init the lv_timer module + */ +void lv_timer_core_init(void); + +/** + * Deinit the lv_timer module + */ +void lv_timer_core_deinit(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TIMER_PRIVATE_H*/ diff --git a/src/misc/lv_types.h b/src/misc/lv_types.h index 7caf3e183..891259ec8 100644 --- a/src/misc/lv_types.h +++ b/src/misc/lv_types.h @@ -51,17 +51,11 @@ extern "C" { /** * LVGL error codes. */ -enum _lv_result_t { +typedef enum { LV_RESULT_INVALID = 0, /*Typically indicates that the object is deleted (become invalid) in the action function or an operation was failed*/ LV_RESULT_OK, /*The object is valid (no deleted) after the action*/ -}; - -#ifdef DOXYGEN -typedef _lv_result_t lv_result_t; -#else -typedef uint8_t lv_result_t; -#endif /*DOXYGEN*/ +} lv_result_t; #if defined(__cplusplus) || __STDC_VERSION__ >= 199901L /*If c99 or newer, use the definition of uintptr_t directly from */ @@ -92,77 +86,257 @@ typedef int32_t lv_value_precise_t; * They are defined here to avoid circular dependencies. */ -struct _lv_obj_t; -typedef struct _lv_obj_t lv_obj_t; +typedef struct lv_obj_t lv_obj_t; -#ifdef DOXYGEN -typedef _lv_state_t lv_state_t; -typedef _lv_part_t lv_part_t; -typedef _lv_obj_flag_t lv_obj_flag_t; -#else typedef uint16_t lv_state_t; typedef uint32_t lv_part_t; -typedef uint32_t lv_obj_flag_t; -#endif /*DOXYGEN*/ -struct _lv_obj_class_t; -typedef struct _lv_obj_class_t lv_obj_class_t; +typedef uint8_t lv_opa_t; -struct _lv_group_t; -typedef struct _lv_group_t lv_group_t; +typedef uint8_t lv_style_prop_t; -#ifdef DOXYGEN -typedef _lv_key_t lv_key_t; -#else -typedef uint8_t lv_key_t; -#endif /*DOXYGEN*/ +typedef struct lv_obj_class_t lv_obj_class_t; -struct _lv_display_t; -typedef struct _lv_display_t lv_display_t; +typedef struct lv_group_t lv_group_t; -struct _lv_layer_t; -typedef struct _lv_layer_t lv_layer_t; -struct _lv_draw_unit_t; -typedef struct _lv_draw_unit_t lv_draw_unit_t; -struct _lv_draw_task_t; -typedef struct _lv_draw_task_t lv_draw_task_t; +typedef struct lv_display_t lv_display_t; -struct _lv_indev_t; -typedef struct _lv_indev_t lv_indev_t; +typedef struct lv_layer_t lv_layer_t; +typedef struct lv_draw_unit_t lv_draw_unit_t; +typedef struct lv_draw_task_t lv_draw_task_t; -struct _lv_event_t; -typedef struct _lv_event_t lv_event_t; +typedef struct lv_indev_t lv_indev_t; -struct _lv_timer_t; -typedef struct _lv_timer_t lv_timer_t; +typedef struct lv_event_t lv_event_t; -struct _lv_theme_t; -typedef struct _lv_theme_t lv_theme_t; +typedef struct lv_timer_t lv_timer_t; -struct _lv_anim_t; -typedef struct _lv_anim_t lv_anim_t; +typedef struct lv_theme_t lv_theme_t; -struct _lv_font_t; -typedef struct _lv_font_t lv_font_t; +typedef struct lv_anim_t lv_anim_t; -struct _lv_image_decoder_t; -typedef struct _lv_image_decoder_t lv_image_decoder_t; +typedef struct lv_font_t lv_font_t; + +typedef struct lv_image_decoder_t lv_image_decoder_t; + +typedef struct lv_image_decoder_dsc_t lv_image_decoder_dsc_t; + +typedef struct lv_fragment_t lv_fragment_t; +typedef struct lv_fragment_class_t lv_fragment_class_t; +typedef struct lv_fragment_managed_states_t lv_fragment_managed_states_t; + +typedef struct lv_profiler_builtin_config_t lv_profiler_builtin_config_t; + +typedef struct lv_rb_node_t lv_rb_node_t; + +typedef struct lv_rb_t lv_rb_t; + +typedef struct lv_color_filter_dsc_t lv_color_filter_dsc_t; + +typedef struct lv_event_dsc_t lv_event_dsc_t; + +typedef struct lv_fs_file_cache_t lv_fs_file_cache_t; + +typedef struct lv_fs_path_ex_t lv_fs_path_ex_t; + +typedef struct lv_fs_dir_t lv_fs_dir_t; + +typedef struct lv_image_decoder_args_t lv_image_decoder_args_t; + +typedef struct lv_image_cache_data_t lv_image_cache_data_t; + +typedef struct lv_image_header_cache_data_t lv_image_header_cache_data_t; + +typedef struct lv_draw_mask_t lv_draw_mask_t; + +typedef struct lv_grad_t lv_grad_t; + +typedef struct lv_draw_label_hint_t lv_draw_label_hint_t; + +typedef struct lv_draw_glyph_dsc_t lv_draw_glyph_dsc_t; + +typedef struct lv_draw_image_sup_t lv_draw_image_sup_t; + +typedef struct lv_draw_mask_rect_dsc_t lv_draw_mask_rect_dsc_t; + +typedef struct lv_obj_style_t lv_obj_style_t; + +typedef struct lv_obj_style_transition_dsc_t lv_obj_style_transition_dsc_t; + +typedef struct lv_hit_test_info_t lv_hit_test_info_t; + +typedef struct lv_cover_check_info_t lv_cover_check_info_t; + +typedef struct lv_obj_spec_attr_t lv_obj_spec_attr_t; + +typedef struct lv_font_fmt_txt_kern_pair_t lv_font_fmt_txt_kern_pair_t; + +typedef struct lv_image_t lv_image_t; + +typedef struct lv_animimg_t lv_animimg_t; + +typedef struct lv_arc_t lv_arc_t; + +typedef struct lv_label_t lv_label_t; + +typedef struct lv_bar_anim_t lv_bar_anim_t; + +typedef struct lv_bar_t lv_bar_t; + +typedef struct lv_button_t lv_button_t; + +typedef struct lv_buttonmatrix_t lv_buttonmatrix_t; + +typedef struct lv_calendar_t lv_calendar_t; + +typedef struct lv_calendar_chinese_t lv_calendar_chinese_t; + +typedef struct lv_canvas_t lv_canvas_t; + +typedef struct lv_chart_series_t lv_chart_series_t; + +typedef struct lv_chart_cursor_t lv_chart_cursor_t; + +typedef struct lv_chart_t lv_chart_t; + +typedef struct lv_checkbox_t lv_checkbox_t; + +typedef struct lv_dropdown_t lv_dropdown_t; + +typedef struct lv_dropdown_list_t lv_dropdown_list_t; + +typedef struct lv_imagebutton_src_info_t lv_imagebutton_src_info_t; + +typedef struct lv_imagebutton_t lv_imagebutton_t; + +typedef struct lv_keyboard_t lv_keyboard_t; + +typedef struct lv_led_t lv_led_t; + +typedef struct lv_line_t lv_line_t; + +typedef struct lv_menu_load_page_event_data_t lv_menu_load_page_event_data_t; + +typedef struct lv_menu_history_t lv_menu_history_t; + +typedef struct lv_menu_t lv_menu_t; + +typedef struct lv_menu_page_t lv_menu_page_t; + +typedef struct lv_msgbox_t lv_msgbox_t; + +typedef struct lv_roller_t lv_roller_t; + +typedef struct lv_scale_section_t lv_scale_section_t; + +typedef struct lv_scale_t lv_scale_t; + +typedef struct lv_slider_t lv_slider_t; + +typedef struct lv_span_t lv_span_t; + +typedef struct lv_spangroup_t lv_spangroup_t; + +typedef struct lv_textarea_t lv_textarea_t; + +typedef struct lv_spinbox_t lv_spinbox_t; + +typedef struct lv_switch_t lv_switch_t; + +typedef struct lv_table_cell_t lv_table_cell_t; + +typedef struct lv_table_t lv_table_t; + +typedef struct lv_tabview_t lv_tabview_t; + +typedef struct lv_tileview_t lv_tileview_t; + +typedef struct lv_tileview_tile_t lv_tileview_tile_t; + +typedef struct lv_win_t lv_win_t; + +typedef struct lv_observer_t lv_observer_t; + +typedef struct lv_monkey_config_t lv_monkey_config_t; + +typedef struct lv_pinyin_dict_t lv_pinyin_dict_t; + +typedef struct lv_ime_pinyin_t lv_ime_pinyin_t; + +typedef struct lv_file_explorer_t lv_file_explorer_t; + +typedef struct lv_barcode_t lv_barcode_t; + +typedef struct lv_gif_t lv_gif_t; + +typedef struct lv_qrcode_t lv_qrcode_t; + +typedef struct lv_freetype_outline_vector_t lv_freetype_outline_vector_t; + +typedef struct lv_freetype_outline_event_param_t lv_freetype_outline_event_param_t; + +typedef struct lv_fpoint_t lv_fpoint_t; + +typedef struct lv_matrix_t lv_matrix_t; + +typedef struct lv_vector_path_t lv_vector_path_t; + +typedef struct lv_vector_gradient_t lv_vector_gradient_t; + +typedef struct lv_vector_fill_dsc_t lv_vector_fill_dsc_t; + +typedef struct lv_vector_stroke_dsc_t lv_vector_stroke_dsc_t; + +typedef struct lv_vector_draw_dsc_t lv_vector_draw_dsc_t; + +typedef struct lv_draw_vector_task_dsc_t lv_draw_vector_task_dsc_t; + +typedef struct lv_vector_dsc_t lv_vector_dsc_t; + +typedef struct lv_xkb_t lv_xkb_t; + +typedef struct lv_libinput_event_t lv_libinput_event_t; + +typedef struct lv_libinput_t lv_libinput_t; + +typedef struct lv_draw_sw_unit_t lv_draw_sw_unit_t; + +typedef struct lv_draw_sw_mask_common_dsc_t lv_draw_sw_mask_common_dsc_t; + +typedef struct lv_draw_sw_mask_line_param_t lv_draw_sw_mask_line_param_t; + +typedef struct lv_draw_sw_mask_angle_param_t lv_draw_sw_mask_angle_param_t; + +typedef struct lv_draw_sw_mask_radius_param_t lv_draw_sw_mask_radius_param_t; + +typedef struct lv_draw_sw_mask_fade_param_t lv_draw_sw_mask_fade_param_t; + +typedef struct lv_draw_sw_mask_map_param_t lv_draw_sw_mask_map_param_t; + +typedef struct lv_draw_sw_blend_dsc_t lv_draw_sw_blend_dsc_t; + +typedef struct lv_draw_sw_blend_fill_dsc_t lv_draw_sw_blend_fill_dsc_t; + +typedef struct lv_draw_sw_blend_image_dsc_t lv_draw_sw_blend_image_dsc_t; + +typedef struct lv_draw_buf_handlers_t lv_draw_buf_handlers_t; + +typedef struct lv_rlottie_t lv_rlottie_t; + +typedef struct lv_ffmpeg_player_t lv_ffmpeg_player_t; typedef uint32_t lv_prop_id_t; #if LV_USE_OBJ_PROPERTY -struct _lv_property_name_t; -typedef struct _lv_property_name_t lv_property_name_t; +typedef struct lv_property_name_t lv_property_name_t; #endif #if LV_USE_SYSMON -struct _lv_sysmon_backend_data_t; -typedef struct _lv_sysmon_backend_data_t lv_sysmon_backend_data_t; +typedef struct lv_sysmon_backend_data_t lv_sysmon_backend_data_t; #if LV_USE_PERF_MONITOR -struct _lv_sysmon_perf_info_t; -typedef struct _lv_sysmon_perf_info_t lv_sysmon_perf_info_t; +typedef struct lv_sysmon_perf_info_t lv_sysmon_perf_info_t; #endif /*LV_USE_PERF_MONITOR*/ #endif /*LV_USE_SYSMON*/ @@ -181,9 +355,11 @@ typedef struct _lv_sysmon_perf_info_t lv_sysmon_perf_info_t; #define _LV_CONCAT(x, y) x ## y #define LV_CONCAT(x, y) _LV_CONCAT(x, y) +#undef _LV_CONCAT #define _LV_CONCAT3(x, y, z) x ## y ## z #define LV_CONCAT3(x, y, z) _LV_CONCAT3(x, y, z) +#undef _LV_CONCAT3 #if defined(PYCPARSER) || defined(__CC_ARM) #define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) diff --git a/src/others/file_explorer/lv_file_explorer.c b/src/others/file_explorer/lv_file_explorer.c index ac68078be..1d9059437 100644 --- a/src/others/file_explorer/lv_file_explorer.c +++ b/src/others/file_explorer/lv_file_explorer.c @@ -6,7 +6,9 @@ /********************* * INCLUDES *********************/ -#include "lv_file_explorer.h" +#include "../../misc/lv_fs_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_file_explorer_private.h" #if LV_USE_FILE_EXPLORER != 0 #include "../../lvgl.h" diff --git a/src/others/file_explorer/lv_file_explorer.h b/src/others/file_explorer/lv_file_explorer.h index 9d1c3cc8a..8dd7762f5 100644 --- a/src/others/file_explorer/lv_file_explorer.h +++ b/src/others/file_explorer/lv_file_explorer.h @@ -42,30 +42,6 @@ typedef enum { } lv_file_explorer_dir_t; #endif -/*Data of canvas*/ -typedef struct { - lv_obj_t obj; - lv_obj_t * cont; - lv_obj_t * head_area; - lv_obj_t * browser_area; - lv_obj_t * file_table; - lv_obj_t * path_label; -#if LV_FILE_EXPLORER_QUICK_ACCESS - lv_obj_t * quick_access_area; - lv_obj_t * list_device; - lv_obj_t * list_places; - char * home_dir; - char * music_dir; - char * pictures_dir; - char * video_dir; - char * docs_dir; - char * fs_dir; -#endif - const char * sel_fn; - char current_path[LV_FILE_EXPLORER_PATH_MAX_LEN]; - lv_file_explorer_sort_t sort; -} lv_file_explorer_t; - extern const lv_obj_class_t lv_file_explorer_class; /*********************** diff --git a/src/others/file_explorer/lv_file_explorer_private.h b/src/others/file_explorer/lv_file_explorer_private.h new file mode 100644 index 000000000..1b7eca1dd --- /dev/null +++ b/src/others/file_explorer/lv_file_explorer_private.h @@ -0,0 +1,69 @@ +/** + * @file lv_file_explorer_private.h + * + */ + +#ifndef LV_FILE_EXPLORER_PRIVATE_H +#define LV_FILE_EXPLORER_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_file_explorer.h" + +#if LV_USE_FILE_EXPLORER != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of canvas*/ +struct lv_file_explorer_t { + lv_obj_t obj; + lv_obj_t * cont; + lv_obj_t * head_area; + lv_obj_t * browser_area; + lv_obj_t * file_table; + lv_obj_t * path_label; +#if LV_FILE_EXPLORER_QUICK_ACCESS + lv_obj_t * quick_access_area; + lv_obj_t * list_device; + lv_obj_t * list_places; + char * home_dir; + char * music_dir; + char * pictures_dir; + char * video_dir; + char * docs_dir; + char * fs_dir; +#endif + const char * sel_fn; + char current_path[LV_FILE_EXPLORER_PATH_MAX_LEN]; + lv_file_explorer_sort_t sort; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_FILE_EXPLORER != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FILE_EXPLORER_PRIVATE_H*/ diff --git a/src/others/fragment/lv_fragment.c b/src/others/fragment/lv_fragment.c index c04b3e84c..6deb4e785 100644 --- a/src/others/fragment/lv_fragment.c +++ b/src/others/fragment/lv_fragment.c @@ -7,7 +7,7 @@ * INCLUDES *********************/ -#include "lv_fragment.h" +#include "lv_fragment_private.h" #if LV_USE_FRAGMENT #include "../../stdlib/lv_string.h" diff --git a/src/others/fragment/lv_fragment.h b/src/others/fragment/lv_fragment.h index 593b5b575..f93473757 100644 --- a/src/others/fragment/lv_fragment.h +++ b/src/others/fragment/lv_fragment.h @@ -25,13 +25,9 @@ extern "C" { * TYPEDEFS **********************/ -typedef struct _lv_fragment_manager_t lv_fragment_manager_t; +typedef struct lv_fragment_manager_t lv_fragment_manager_t; -typedef struct _lv_fragment_t lv_fragment_t; -typedef struct _lv_fragment_class_t lv_fragment_class_t; -typedef struct _lv_fragment_managed_states_t lv_fragment_managed_states_t; - -struct _lv_fragment_t { +struct lv_fragment_t { /** * Class of this fragment */ @@ -53,7 +49,7 @@ struct _lv_fragment_t { }; -struct _lv_fragment_class_t { +struct lv_fragment_class_t { /** * Constructor function for fragment class * @param self Fragment instance @@ -124,40 +120,6 @@ struct _lv_fragment_class_t { size_t instance_size; }; -/** - * Fragment states - */ -struct _lv_fragment_managed_states_t { - /** - * Class of the fragment - */ - const lv_fragment_class_t * cls; - /** - * Manager the fragment attached to - */ - lv_fragment_manager_t * manager; - /** - * Container object the fragment adding view to - */ - lv_obj_t * const * container; - /** - * Fragment instance - */ - lv_fragment_t * instance; - /** - * true between `create_obj_cb` and `obj_deleted_cb` - */ - bool obj_created; - /** - * true before `lv_fragment_delete_obj` is called. Don't touch any object if this is true - */ - bool destroying_obj; - /** - * true if this fragment is in navigation stack that can be popped - */ - bool in_stack; -}; - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/others/fragment/lv_fragment_manager.c b/src/others/fragment/lv_fragment_manager.c index 73b0c9df2..a8565185b 100644 --- a/src/others/fragment/lv_fragment_manager.c +++ b/src/others/fragment/lv_fragment_manager.c @@ -7,7 +7,7 @@ * INCLUDES *********************/ -#include "lv_fragment.h" +#include "lv_fragment_private.h" #if LV_USE_FRAGMENT @@ -21,11 +21,11 @@ /********************** * TYPEDEFS **********************/ -typedef struct _lv_fragment_stack_item_t { +typedef struct lv_fragment_stack_item_t { lv_fragment_managed_states_t * states; } lv_fragment_stack_item_t; -struct _lv_fragment_manager_t { +struct lv_fragment_manager_t { lv_fragment_t * parent; /** * Linked list to store attached fragments @@ -66,8 +66,8 @@ lv_fragment_manager_t * lv_fragment_manager_create(lv_fragment_t * parent) { lv_fragment_manager_t * instance = lv_malloc_zeroed(sizeof(lv_fragment_manager_t)); instance->parent = parent; - _lv_ll_init(&instance->attached, sizeof(lv_fragment_managed_states_t)); - _lv_ll_init(&instance->stack, sizeof(lv_fragment_stack_item_t)); + lv_ll_init(&instance->attached, sizeof(lv_fragment_managed_states_t)); + lv_ll_init(&instance->stack, sizeof(lv_fragment_stack_item_t)); return instance; } @@ -75,21 +75,21 @@ void lv_fragment_manager_delete(lv_fragment_manager_t * manager) { LV_ASSERT_NULL(manager); lv_fragment_managed_states_t * states; - _LV_LL_READ_BACK(&manager->attached, states) { + LV_LL_READ_BACK(&manager->attached, states) { item_delete_obj(states); item_delete_fragment(states); } - _lv_ll_clear(&manager->attached); - _lv_ll_clear(&manager->stack); + lv_ll_clear(&manager->attached); + lv_ll_clear(&manager->stack); lv_free(manager); } void lv_fragment_manager_create_obj(lv_fragment_manager_t * manager) { LV_ASSERT_NULL(manager); - lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack); + lv_fragment_stack_item_t * top = lv_ll_get_tail(&manager->stack); lv_fragment_managed_states_t * states = NULL; - _LV_LL_READ(&manager->attached, states) { + LV_LL_READ(&manager->attached, states) { if(states->in_stack && top->states != states) { /*Only create obj for top item in stack*/ continue; @@ -102,7 +102,7 @@ void lv_fragment_manager_delete_obj(lv_fragment_manager_t * manager) { LV_ASSERT_NULL(manager); lv_fragment_managed_states_t * states = NULL; - _LV_LL_READ_BACK(&manager->attached, states) { + LV_LL_READ_BACK(&manager->attached, states) { item_delete_obj(states); } } @@ -125,25 +125,25 @@ void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * lv_fragment_managed_states_t * prev = NULL; bool was_top = false; if(states->in_stack) { - void * stack_top = _lv_ll_get_tail(&manager->stack); + void * stack_top = lv_ll_get_tail(&manager->stack); lv_fragment_stack_item_t * item = NULL; - _LV_LL_READ_BACK(&manager->stack, item) { + LV_LL_READ_BACK(&manager->stack, item) { if(item->states == states) { was_top = stack_top == item; - void * stack_prev = _lv_ll_get_prev(&manager->stack, item); + void * stack_prev = lv_ll_get_prev(&manager->stack, item); if(!stack_prev) break; prev = ((lv_fragment_stack_item_t *) stack_prev)->states; break; } } if(item) { - _lv_ll_remove(&manager->stack, item); + lv_ll_remove(&manager->stack, item); lv_free(item); } } item_delete_obj(states); item_delete_fragment(states); - _lv_ll_remove(&manager->attached, states); + lv_ll_remove(&manager->attached, states); lv_free(states); if(prev && was_top) { item_create_obj(prev); @@ -152,14 +152,14 @@ void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * void lv_fragment_manager_push(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container) { - lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack); + lv_fragment_stack_item_t * top = lv_ll_get_tail(&manager->stack); if(top != NULL) { item_delete_obj(top->states); } lv_fragment_managed_states_t * states = fragment_attach(manager, fragment, container); states->in_stack = true; /*Add fragment to the top of the stack*/ - lv_fragment_stack_item_t * item = _lv_ll_ins_tail(&manager->stack); + lv_fragment_stack_item_t * item = lv_ll_ins_tail(&manager->stack); lv_memzero(item, sizeof(lv_fragment_stack_item_t)); item->states = states; item_create_obj(states); @@ -187,7 +187,7 @@ bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, v { LV_ASSERT_NULL(manager); lv_fragment_managed_states_t * p = NULL; - _LV_LL_READ_BACK(&manager->attached, p) { + LV_LL_READ_BACK(&manager->attached, p) { if(!p->obj_created || p->destroying_obj) continue; lv_fragment_t * instance = p->instance; if(!instance) continue; @@ -200,13 +200,13 @@ bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, v size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager) { LV_ASSERT_NULL(manager); - return _lv_ll_get_len(&manager->stack); + return lv_ll_get_len(&manager->stack); } lv_fragment_t * lv_fragment_manager_get_top(lv_fragment_manager_t * manager) { LV_ASSERT(manager); - lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack); + lv_fragment_stack_item_t * top = lv_ll_get_tail(&manager->stack); if(!top)return NULL; return top->states->instance; } @@ -215,7 +215,7 @@ lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * ma { LV_ASSERT(manager); lv_fragment_managed_states_t * states; - _LV_LL_READ(&manager->attached, states) { + LV_LL_READ(&manager->attached, states) { if(*states->container == container) return states->instance; } return NULL; @@ -263,7 +263,7 @@ static lv_fragment_managed_states_t * fragment_attach(lv_fragment_manager_t * ma LV_ASSERT(manager); LV_ASSERT(fragment); LV_ASSERT(fragment->managed == NULL); - lv_fragment_managed_states_t * states = _lv_ll_ins_tail(&manager->attached); + lv_fragment_managed_states_t * states = lv_ll_ins_tail(&manager->attached); lv_memzero(states, sizeof(lv_fragment_managed_states_t)); states->cls = fragment->cls; states->manager = manager; diff --git a/src/others/fragment/lv_fragment_private.h b/src/others/fragment/lv_fragment_private.h new file mode 100644 index 000000000..3af36ddbc --- /dev/null +++ b/src/others/fragment/lv_fragment_private.h @@ -0,0 +1,77 @@ +/** + * @file lv_fragment_private.h + * + */ + +#ifndef LV_FRAGMENT_PRIVATE_H +#define LV_FRAGMENT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_fragment.h" + +#if LV_USE_FRAGMENT + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Fragment states + */ +struct lv_fragment_managed_states_t { + /** + * Class of the fragment + */ + const lv_fragment_class_t * cls; + /** + * Manager the fragment attached to + */ + lv_fragment_manager_t * manager; + /** + * Container object the fragment adding view to + */ + lv_obj_t * const * container; + /** + * Fragment instance + */ + lv_fragment_t * instance; + /** + * true between `create_obj_cb` and `obj_deleted_cb` + */ + bool obj_created; + /** + * true before `lv_fragment_delete_obj` is called. Don't touch any object if this is true + */ + bool destroying_obj; + /** + * true if this fragment is in navigation stack that can be popped + */ + bool in_stack; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_FRAGMENT */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FRAGMENT_PRIVATE_H*/ diff --git a/src/others/gridnav/lv_gridnav.c b/src/others/gridnav/lv_gridnav.c index 51c414dd0..5f348af58 100644 --- a/src/others/gridnav/lv_gridnav.c +++ b/src/others/gridnav/lv_gridnav.c @@ -12,6 +12,7 @@ #include "../../misc/lv_assert.h" #include "../../misc/lv_math.h" #include "../../indev/lv_indev.h" +#include "../../core/lv_obj_private.h" /********************* * DEFINES diff --git a/src/others/ime/lv_ime_pinyin.c b/src/others/ime/lv_ime_pinyin.c index 9343239f6..0bcc76fd2 100644 --- a/src/others/ime/lv_ime_pinyin.c +++ b/src/others/ime/lv_ime_pinyin.c @@ -6,10 +6,12 @@ /********************* * INCLUDES *********************/ -#include "lv_ime_pinyin.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_ime_pinyin_private.h" #if LV_USE_IME_PINYIN != 0 #include "../../lvgl.h" +#include "../../core/lv_global.h" /********************* * DEFINES @@ -582,7 +584,7 @@ static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * pinyin_k9_init_data(obj); - _lv_ll_init(&(pinyin_ime->k9_legal_py_ll), sizeof(ime_pinyin_k9_py_str_t)); + lv_ll_init(&(pinyin_ime->k9_legal_py_ll), sizeof(ime_pinyin_k9_py_str_t)); #endif } @@ -1005,19 +1007,19 @@ static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char * uint32_t ll_len = 0; ime_pinyin_k9_py_str_t * ll_index = NULL; - ll_len = _lv_ll_get_len(&pinyin_ime->k9_legal_py_ll); - ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); + ll_len = lv_ll_get_len(&pinyin_ime->k9_legal_py_ll); + ll_index = lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); while(index != -1) { if(index == len) { if(pinyin_k9_is_valid_py(obj, py_comp)) { if((count >= ll_len) || (ll_len == 0)) { - ll_index = _lv_ll_ins_tail(&pinyin_ime->k9_legal_py_ll); + ll_index = lv_ll_ins_tail(&pinyin_ime->k9_legal_py_ll); lv_strcpy(ll_index->py_str, py_comp); } else if((count < ll_len)) { lv_strcpy(ll_index->py_str, py_comp); - ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); + ll_index = lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); } count++; } @@ -1095,7 +1097,7 @@ static void pinyin_k9_fill_cand(lv_obj_t * obj) cand_len = tmp_len; } - ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); + ll_index = lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); lv_strcpy(pinyin_ime->input_char, ll_index->py_str); for(uint8_t i = 0; i < LV_IME_PINYIN_K9_CAND_TEXT_NUM; i++) { @@ -1110,7 +1112,7 @@ static void pinyin_k9_fill_cand(lv_obj_t * obj) lv_strcpy(lv_pinyin_k9_cand_str[index], ll_index->py_str); } - ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ + ll_index = lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ index++; } pinyin_ime->k9_py_ll_pos = index; @@ -1128,17 +1130,17 @@ static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir) lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); - uint16_t ll_len = _lv_ll_get_len(&pinyin_ime->k9_legal_py_ll); + uint16_t ll_len = lv_ll_get_len(&pinyin_ime->k9_legal_py_ll); if((ll_len > LV_IME_PINYIN_K9_CAND_TEXT_NUM) && (pinyin_ime->k9_legal_py_count > LV_IME_PINYIN_K9_CAND_TEXT_NUM)) { ime_pinyin_k9_py_str_t * ll_index = NULL; int count = 0; - ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); + ll_index = lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); while(ll_index) { if(count >= pinyin_ime->k9_py_ll_pos) break; - ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ + ll_index = lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ count++; } @@ -1160,7 +1162,7 @@ static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir) break; lv_strcpy(lv_pinyin_k9_cand_str[count], ll_index->py_str); - ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ + ll_index = lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ count++; } pinyin_ime->k9_py_ll_pos += count - 1; @@ -1172,12 +1174,12 @@ static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir) lv_strcpy(lv_pinyin_k9_cand_str[i], " "); } count = LV_IME_PINYIN_K9_CAND_TEXT_NUM - 1; - ll_index = _lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index); + ll_index = lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index); while(ll_index) { if(count < 0) break; lv_strcpy(lv_pinyin_k9_cand_str[count], ll_index->py_str); - ll_index = _lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the previous list*/ + ll_index = lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the previous list*/ count--; } diff --git a/src/others/ime/lv_ime_pinyin.h b/src/others/ime/lv_ime_pinyin.h index a342d2c72..4e10df715 100644 --- a/src/others/ime/lv_ime_pinyin.h +++ b/src/others/ime/lv_ime_pinyin.h @@ -32,40 +32,11 @@ typedef enum { LV_IME_PINYIN_MODE_K9_NUMBER, } lv_ime_pinyin_mode_t; -/*Data of pinyin_dict*/ -typedef struct { - const char * const py; - const char * const py_mb; -} lv_pinyin_dict_t; - /*Data of 9-key input(k9) mode*/ typedef struct { char py_str[7]; } ime_pinyin_k9_py_str_t; -/*Data of lv_ime_pinyin*/ -typedef struct { - lv_obj_t obj; - lv_obj_t * kb; - lv_obj_t * cand_panel; - const lv_pinyin_dict_t * dict; - lv_ll_t k9_legal_py_ll; - char * cand_str; /* Candidate string */ - char input_char[16]; /* Input box character */ -#if LV_IME_PINYIN_USE_K9_MODE - char k9_input_str[LV_IME_PINYIN_K9_MAX_INPUT + 1]; /* 9-key input(k9) mode input string */ - uint16_t k9_py_ll_pos; /* Current pinyin map pages(k9) */ - uint16_t k9_legal_py_count; /* Count of legal Pinyin numbers(k9) */ - uint16_t k9_input_str_len; /* 9-key input(k9) mode input string max len */ -#endif - uint16_t ta_count; /* The number of characters entered in the text box this time */ - uint16_t cand_num; /* Number of candidates */ - uint16_t py_page; /* Current pinyin map pages(k26) */ - uint16_t py_num[26]; /* Number and length of Pinyin */ - uint16_t py_pos[26]; /* Pinyin position */ - lv_ime_pinyin_mode_t mode; /* Set mode, 1: 26-key input(k26), 0: 9-key input(k9). Default: 1. */ -} lv_ime_pinyin_t; - /*********************** * GLOBAL VARIABLES ***********************/ diff --git a/src/others/ime/lv_ime_pinyin_private.h b/src/others/ime/lv_ime_pinyin_private.h new file mode 100644 index 000000000..6d72cada6 --- /dev/null +++ b/src/others/ime/lv_ime_pinyin_private.h @@ -0,0 +1,74 @@ +/** + * @file lv_ime_pinyin_private.h + * + */ + +#ifndef LV_IME_PINYIN_PRIVATE_H +#define LV_IME_PINYIN_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_ime_pinyin.h" + +#if LV_USE_IME_PINYIN != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of pinyin_dict*/ +struct lv_pinyin_dict_t { + const char * const py; + const char * const py_mb; +}; + +/*Data of lv_ime_pinyin*/ +struct lv_ime_pinyin_t { + lv_obj_t obj; + lv_obj_t * kb; + lv_obj_t * cand_panel; + const lv_pinyin_dict_t * dict; + lv_ll_t k9_legal_py_ll; + char * cand_str; /* Candidate string */ + char input_char[16]; /* Input box character */ +#if LV_IME_PINYIN_USE_K9_MODE + char k9_input_str[LV_IME_PINYIN_K9_MAX_INPUT + 1]; /* 9-key input(k9) mode input string */ + uint16_t k9_py_ll_pos; /* Current pinyin map pages(k9) */ + uint16_t k9_legal_py_count; /* Count of legal Pinyin numbers(k9) */ + uint16_t k9_input_str_len; /* 9-key input(k9) mode input string max len */ +#endif + uint16_t ta_count; /* The number of characters entered in the text box this time */ + uint16_t cand_num; /* Number of candidates */ + uint16_t py_page; /* Current pinyin map pages(k26) */ + uint16_t py_num[26]; /* Number and length of Pinyin */ + uint16_t py_pos[26]; /* Pinyin position */ + lv_ime_pinyin_mode_t mode; /* Set mode, 1: 26-key input(k26), 0: 9-key input(k9). Default: 1. */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_IME_PINYIN != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IME_PINYIN_PRIVATE_H*/ diff --git a/src/others/monkey/lv_monkey.c b/src/others/monkey/lv_monkey.c index 9f970919d..97ba10a51 100644 --- a/src/others/monkey/lv_monkey.c +++ b/src/others/monkey/lv_monkey.c @@ -6,7 +6,7 @@ /********************* * INCLUDES *********************/ -#include "lv_monkey.h" +#include "lv_monkey_private.h" #if LV_USE_MONKEY != 0 @@ -24,7 +24,7 @@ /********************** * TYPEDEFS **********************/ -struct _lv_monkey { +struct lv_monkey_t { lv_monkey_config_t config; lv_indev_data_t indev_data; lv_indev_t * indev; @@ -98,7 +98,7 @@ void lv_monkey_set_enable(lv_monkey_t * monkey, bool en) bool lv_monkey_get_enable(lv_monkey_t * monkey) { LV_ASSERT_NULL(monkey); - return !monkey->timer->paused; + return !lv_timer_get_paused(monkey->timer); } void lv_monkey_set_user_data(lv_monkey_t * monkey, void * user_data) @@ -147,7 +147,7 @@ static int32_t lv_monkey_random(int32_t howsmall, int32_t howbig) static void lv_monkey_timer_cb(lv_timer_t * timer) { - lv_monkey_t * monkey = timer->user_data; + lv_monkey_t * monkey = lv_timer_get_user_data(timer); lv_indev_data_t * data = &monkey->indev_data; switch(lv_indev_get_type(monkey->indev)) { diff --git a/src/others/monkey/lv_monkey.h b/src/others/monkey/lv_monkey.h index 3791abc85..6cbe0ec56 100644 --- a/src/others/monkey/lv_monkey.h +++ b/src/others/monkey/lv_monkey.h @@ -24,10 +24,10 @@ extern "C" { /********************** * TYPEDEFS **********************/ -struct _lv_monkey; -typedef struct _lv_monkey lv_monkey_t; -typedef struct { +typedef struct lv_monkey_t lv_monkey_t; + +struct lv_monkey_config_t { /**< Input device type*/ lv_indev_type_t type; @@ -44,7 +44,7 @@ typedef struct { int32_t min; int32_t max; } input_range; -} lv_monkey_config_t; +}; /********************** * GLOBAL PROTOTYPES diff --git a/src/others/monkey/lv_monkey_private.h b/src/others/monkey/lv_monkey_private.h new file mode 100644 index 000000000..a08ea0731 --- /dev/null +++ b/src/others/monkey/lv_monkey_private.h @@ -0,0 +1,43 @@ +/** + * @file lv_monkey_private.h + * + */ + +#ifndef LV_MONKEY_PRIVATE_H +#define LV_MONKEY_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_monkey.h" + +#if LV_USE_MONKEY != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_MONKEY != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MONKEY_PRIVATE_H*/ diff --git a/src/others/observer/lv_observer.c b/src/others/observer/lv_observer.c index ced337880..8d43f52de 100644 --- a/src/others/observer/lv_observer.c +++ b/src/others/observer/lv_observer.c @@ -7,10 +7,12 @@ * INCLUDES *********************/ -#include "lv_observer.h" +#include "lv_observer_private.h" #if LV_USE_OBSERVER #include "../../lvgl.h" +#include "../../core/lv_obj_private.h" +#include "../../misc/lv_event_private.h" /********************* * DEFINES @@ -78,7 +80,7 @@ void lv_subject_init_int(lv_subject_t * subject, int32_t value) subject->type = LV_SUBJECT_TYPE_INT; subject->value.num = value; subject->prev_value.num = value; - _lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); + lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); } void lv_subject_set_int(lv_subject_t * subject, int32_t value) @@ -124,7 +126,7 @@ void lv_subject_init_string(lv_subject_t * subject, char * buf, char * prev_buf, subject->value.pointer = buf; subject->prev_value.pointer = prev_buf; - _lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); + lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); } void lv_subject_copy_string(lv_subject_t * subject, const char * buf) @@ -171,7 +173,7 @@ void lv_subject_init_pointer(lv_subject_t * subject, void * value) subject->type = LV_SUBJECT_TYPE_POINTER; subject->value.pointer = value; subject->prev_value.pointer = value; - _lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); + lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); } void lv_subject_set_pointer(lv_subject_t * subject, void * ptr) @@ -212,7 +214,7 @@ void lv_subject_init_color(lv_subject_t * subject, lv_color_t color) subject->type = LV_SUBJECT_TYPE_COLOR; subject->value.color = color; subject->prev_value.color = color; - _lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); + lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); } void lv_subject_set_color(lv_subject_t * subject, lv_color_t color) @@ -251,7 +253,7 @@ void lv_subject_init_group(lv_subject_t * subject, lv_subject_t * list[], uint32 { subject->type = LV_SUBJECT_TYPE_GROUP; subject->size = list_len; - _lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); + lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); subject->value.pointer = list; /* bind all subjects to this subject */ @@ -264,9 +266,9 @@ void lv_subject_init_group(lv_subject_t * subject, lv_subject_t * list[], uint32 void lv_subject_deinit(lv_subject_t * subject) { - lv_observer_t * observer = _lv_ll_get_head(&subject->subs_ll); + lv_observer_t * observer = lv_ll_get_head(&subject->subs_ll); while(observer) { - lv_observer_t * observer_next = _lv_ll_get_next(&subject->subs_ll, observer); + lv_observer_t * observer_next = lv_ll_get_next(&subject->subs_ll, observer); if(observer->for_obj) { lv_obj_remove_event_cb(observer->target, unsubscribe_on_delete_cb); @@ -277,7 +279,7 @@ void lv_subject_deinit(lv_subject_t * subject) observer = observer_next; } - _lv_ll_clear(&subject->subs_ll); + lv_ll_clear(&subject->subs_ll); } lv_subject_t * lv_subject_get_group_element(lv_subject_t * subject, int32_t index) @@ -309,7 +311,7 @@ lv_observer_t * lv_subject_add_observer_obj(lv_subject_t * subject, lv_observer_ LV_LOG_WARN("Subject not initialized yet"); return NULL; } - lv_observer_t * observer = _lv_ll_ins_tail(&(subject->subs_ll)); + lv_observer_t * observer = lv_ll_ins_tail(&(subject->subs_ll)); LV_ASSERT_MALLOC(observer); if(observer == NULL) return NULL; @@ -339,7 +341,7 @@ lv_observer_t * lv_subject_add_observer_with_target(lv_subject_t * subject, lv_o LV_LOG_WARN("Subject not initialized yet"); return NULL; } - lv_observer_t * observer = _lv_ll_ins_tail(&(subject->subs_ll)); + lv_observer_t * observer = lv_ll_ins_tail(&(subject->subs_ll)); LV_ASSERT_MALLOC(observer); if(observer == NULL) return NULL; @@ -363,7 +365,7 @@ void lv_observer_remove(lv_observer_t * observer) observer->subject->notify_restart_query = 1; - _lv_ll_remove(&(observer->subject->subs_ll), observer); + lv_ll_remove(&(observer->subject->subs_ll), observer); if(observer->auto_free_user_data) { lv_free(observer->user_data); @@ -399,13 +401,13 @@ void lv_subject_notify(lv_subject_t * subject) LV_ASSERT_NULL(subject); lv_observer_t * observer; - _LV_LL_READ(&(subject->subs_ll), observer) { + LV_LL_READ(&(subject->subs_ll), observer) { observer->notified = 0; } do { subject->notify_restart_query = 0; - _LV_LL_READ(&(subject->subs_ll), observer) { + LV_LL_READ(&(subject->subs_ll), observer) { if(observer->cb && observer->notified == 0) { observer->cb(observer, subject); if(subject->notify_restart_query) break; @@ -534,6 +536,18 @@ lv_observer_t * lv_dropdown_bind_value(lv_obj_t * obj, lv_subject_t * subject) #endif /*LV_USE_DROPDOWN*/ +lv_obj_t * lv_observer_get_target_obj(lv_observer_t * observer) +{ + return (lv_obj_t *)lv_observer_get_target(observer); +} + +void * lv_observer_get_user_data(const lv_observer_t * observer) +{ + LV_ASSERT_NULL(observer); + + return observer->user_data; +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/others/observer/lv_observer.h b/src/others/observer/lv_observer.h index f7d538965..a3fc2a2d0 100644 --- a/src/others/observer/lv_observer.h +++ b/src/others/observer/lv_observer.h @@ -25,9 +25,6 @@ extern "C" { * TYPEDEFS **********************/ -struct _lv_observer_t; -typedef struct _lv_observer_t lv_observer_t; - typedef enum { LV_SUBJECT_TYPE_INVALID = 0, /**< indicates subject not initialized yet*/ LV_SUBJECT_TYPE_NONE = 1, /**< a null value like None or NILt*/ @@ -67,19 +64,6 @@ typedef struct { */ typedef void (*lv_observer_cb_t)(lv_observer_t * observer, lv_subject_t * subject); -/** - * The observer object: a descriptor returned when subscribing LVGL widgets to subjects - */ -struct _lv_observer_t { - lv_subject_t * subject; /**< The observed value */ - lv_observer_cb_t cb; /**< Callback that should be called when the value changes*/ - void * target; /**< A target for the observer, e.g. a widget or style*/ - void * user_data; /**< Additional parameter supplied when subscribing*/ - uint32_t auto_free_user_data : 1; /**< Automatically free user data when the observer is removed */ - uint32_t notified : 1; /**< Mark if this observer was already notified*/ - uint32_t for_obj : 1; /**< `target` is an `lv_obj_t *`*/ -}; - /********************** * GLOBAL PROTOTYPES **********************/ @@ -286,10 +270,14 @@ void * lv_observer_get_target(lv_observer_t * observer); * @param observer pointer to an observer * @return pointer to the saved object target */ -static inline lv_obj_t * lv_observer_get_target_obj(lv_observer_t * observer) -{ - return (lv_obj_t *)lv_observer_get_target(observer); -} +lv_obj_t * lv_observer_get_target_obj(lv_observer_t * observer); + +/** + * Get the user data of the observer. + * @param observer pointer to an observer + * @return void pointer to the saved user data +*/ +void * lv_observer_get_user_data(const lv_observer_t * observer); /** * Notify all observers of subject diff --git a/src/others/observer/lv_observer_private.h b/src/others/observer/lv_observer_private.h new file mode 100644 index 000000000..04a7992eb --- /dev/null +++ b/src/others/observer/lv_observer_private.h @@ -0,0 +1,57 @@ +/** + * @file lv_observer_private.h + * + */ + +#ifndef LV_OBSERVER_PRIVATE_H +#define LV_OBSERVER_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_observer.h" + +#if LV_USE_OBSERVER + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * The observer object: a descriptor returned when subscribing LVGL widgets to subjects + */ +struct lv_observer_t { + lv_subject_t * subject; /**< The observed value */ + lv_observer_cb_t cb; /**< Callback that should be called when the value changes*/ + void * target; /**< A target for the observer, e.g. a widget or style*/ + void * user_data; /**< Additional parameter supplied when subscribing*/ + uint32_t auto_free_user_data : 1; /**< Automatically free user data when the observer is removed */ + uint32_t notified : 1; /**< Mark if this observer was already notified*/ + uint32_t for_obj : 1; /**< `target` is an `lv_obj_t *`*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_OBSERVER */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBSERVER_PRIVATE_H*/ diff --git a/src/others/snapshot/lv_snapshot.c b/src/others/snapshot/lv_snapshot.c index 74609aa37..02ab3510a 100644 --- a/src/others/snapshot/lv_snapshot.c +++ b/src/others/snapshot/lv_snapshot.c @@ -6,12 +6,14 @@ /********************* * INCLUDES *********************/ +#include "../../draw/lv_draw_private.h" +#include "../../core/lv_obj_draw_private.h" #include "lv_snapshot.h" #if LV_USE_SNAPSHOT #include #include "../../display/lv_display.h" -#include "../../core/lv_refr.h" +#include "../../core/lv_refr_private.h" #include "../../display/lv_display_private.h" #include "../../stdlib/lv_string.h" @@ -47,7 +49,7 @@ lv_draw_buf_t * lv_snapshot_create_draw_buf(lv_obj_t * obj, lv_color_format_t cf lv_obj_update_layout(obj); int32_t w = lv_obj_get_width(obj); int32_t h = lv_obj_get_height(obj); - int32_t ext_size = _lv_obj_get_ext_draw_size(obj); + int32_t ext_size = lv_obj_get_ext_draw_size(obj); w += ext_size * 2; h += ext_size * 2; if(w == 0 || h == 0) return NULL; @@ -60,7 +62,7 @@ lv_result_t lv_snapshot_reshape_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_bu lv_obj_update_layout(obj); int32_t w = lv_obj_get_width(obj); int32_t h = lv_obj_get_height(obj); - int32_t ext_size = _lv_obj_get_ext_draw_size(obj); + int32_t ext_size = lv_obj_get_ext_draw_size(obj); w += ext_size * 2; h += ext_size * 2; if(w == 0 || h == 0) return LV_RESULT_INVALID; @@ -97,7 +99,7 @@ lv_result_t lv_snapshot_take_to_draw_buf(lv_obj_t * obj, lv_color_format_t cf, l lv_area_t snapshot_area; int32_t w = draw_buf->header.w; int32_t h = draw_buf->header.h; - int32_t ext_size = _lv_obj_get_ext_draw_size(obj); + int32_t ext_size = lv_obj_get_ext_draw_size(obj); lv_obj_get_coords(obj, &snapshot_area); lv_area_increase(&snapshot_area, ext_size, ext_size); @@ -115,12 +117,12 @@ lv_result_t lv_snapshot_take_to_draw_buf(lv_obj_t * obj, lv_color_format_t cf, l lv_matrix_identity(&layer.matrix); #endif - lv_display_t * disp_old = _lv_refr_get_disp_refreshing(); + lv_display_t * disp_old = lv_refr_get_disp_refreshing(); lv_display_t * disp_new = lv_obj_get_display(obj); lv_layer_t * layer_old = disp_new->layer_head; disp_new->layer_head = &layer; - _lv_refr_set_disp_refreshing(disp_new); + lv_refr_set_disp_refreshing(disp_new); lv_obj_redraw(&layer, obj); while(layer.draw_task_head) { @@ -129,7 +131,7 @@ lv_result_t lv_snapshot_take_to_draw_buf(lv_obj_t * obj, lv_color_format_t cf, l } disp_new->layer_head = layer_old; - _lv_refr_set_disp_refreshing(disp_old); + lv_refr_set_disp_refreshing(disp_old); return LV_RESULT_OK; } @@ -148,6 +150,26 @@ lv_draw_buf_t * lv_snapshot_take(lv_obj_t * obj, lv_color_format_t cf) return draw_buf; } +void lv_snapshot_free(lv_image_dsc_t * dsc) +{ + LV_LOG_WARN("Deprecated API, use lv_draw_buf_destroy directly."); + lv_draw_buf_destroy((lv_draw_buf_t *)dsc); +} + +lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_image_dsc_t * dsc, + void * buf, + uint32_t buf_size) +{ + lv_draw_buf_t draw_buf; + LV_LOG_WARN("Deprecated API, use lv_snapshot_take_to_draw_buf instead."); + lv_draw_buf_init(&draw_buf, 1, 1, cf, buf_size, buf, buf_size); + lv_result_t res = lv_snapshot_take_to_draw_buf(obj, cf, &draw_buf); + if(res == LV_RESULT_OK) { + lv_memcpy((void *)dsc, &draw_buf, sizeof(lv_image_dsc_t)); + } + return res; +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/others/snapshot/lv_snapshot.h b/src/others/snapshot/lv_snapshot.h index 3a685cf11..90de106cd 100644 --- a/src/others/snapshot/lv_snapshot.h +++ b/src/others/snapshot/lv_snapshot.h @@ -73,11 +73,7 @@ lv_result_t lv_snapshot_take_to_draw_buf(lv_obj_t * obj, lv_color_format_t cf, l * Free the snapshot image returned by @ref lv_snapshot_take * @param dsc the image descriptor generated by lv_snapshot_take. */ -static inline void lv_snapshot_free(lv_image_dsc_t * dsc) -{ - LV_LOG_WARN("Deprecated API, use lv_draw_buf_destroy directly."); - lv_draw_buf_destroy((lv_draw_buf_t *)dsc); -} +void lv_snapshot_free(lv_image_dsc_t * dsc); /** * Take snapshot for object with its children, save image info to provided buffer. @@ -89,19 +85,9 @@ static inline void lv_snapshot_free(lv_image_dsc_t * dsc) * @return LV_RESULT_OK on success, LV_RESULT_INVALID on error. * @deprecated Use lv_snapshot_take_to_draw_buf instead. */ -static inline lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_image_dsc_t * dsc, - void * buf, - uint32_t buf_size) -{ - lv_draw_buf_t draw_buf; - LV_LOG_WARN("Deprecated API, use lv_snapshot_take_to_draw_buf instead."); - lv_draw_buf_init(&draw_buf, 1, 1, cf, buf_size, buf, buf_size); - lv_result_t res = lv_snapshot_take_to_draw_buf(obj, cf, &draw_buf); - if(res == LV_RESULT_OK) { - lv_memcpy((void *)dsc, &draw_buf, sizeof(lv_image_dsc_t)); - } - return res; -} +lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_image_dsc_t * dsc, + void * buf, + uint32_t buf_size); /********************** * MACROS diff --git a/src/others/sysmon/lv_sysmon.c b/src/others/sysmon/lv_sysmon.c index b13a19fea..59fee7078 100644 --- a/src/others/sysmon/lv_sysmon.c +++ b/src/others/sysmon/lv_sysmon.c @@ -7,7 +7,8 @@ * INCLUDES *********************/ -#include "lv_sysmon.h" +#include "../../misc/lv_timer_private.h" +#include "lv_sysmon_private.h" #if LV_USE_SYSMON @@ -59,7 +60,7 @@ * GLOBAL FUNCTIONS **********************/ -void _lv_sysmon_builtin_init(void) +void lv_sysmon_builtin_init(void) { #if LV_USE_MEM_MONITOR @@ -69,7 +70,7 @@ void _lv_sysmon_builtin_init(void) #endif } -void _lv_sysmon_builtin_deinit(void) +void lv_sysmon_builtin_deinit(void) { #if LV_USE_MEM_MONITOR lv_timer_delete(sysmon_mem.timer); diff --git a/src/others/sysmon/lv_sysmon.h b/src/others/sysmon/lv_sysmon.h index e106eadd5..0859c064d 100644 --- a/src/others/sysmon/lv_sysmon.h +++ b/src/others/sysmon/lv_sysmon.h @@ -35,44 +35,6 @@ extern "C" { * TYPEDEFS **********************/ -struct _lv_sysmon_backend_data_t { - lv_subject_t subject; - lv_timer_t * timer; -}; - -#if LV_USE_PERF_MONITOR -struct _lv_sysmon_perf_info_t { - struct { - bool inited; - uint32_t refr_start; - uint32_t refr_interval_sum; - uint32_t refr_elaps_sum; - uint32_t refr_cnt; - uint32_t render_start; - uint32_t render_elaps_sum; /*Contains the flush time too*/ - uint32_t render_cnt; - uint32_t flush_in_render_start; - uint32_t flush_in_render_elaps_sum; - uint32_t flush_not_in_render_start; - uint32_t flush_not_in_render_elaps_sum; - uint32_t last_report_timestamp; - uint32_t render_in_progress : 1; - } measured; - - struct { - uint32_t fps; - uint32_t cpu; - uint32_t refr_avg_time; - uint32_t render_avg_time; /**< Pure rendering time without flush time*/ - uint32_t flush_avg_time; /**< Pure flushing time without rendering time*/ - uint32_t cpu_avg_total; - uint32_t fps_avg_total; - uint32_t run_cnt; - } calculated; - -}; -#endif - /********************** * GLOBAL PROTOTYPES **********************/ @@ -116,16 +78,6 @@ void lv_sysmon_hide_memory(lv_display_t * disp); #endif /*LV_USE_MEM_MONITOR*/ -/** - * Initialize built-in system monitor, such as performance and memory monitor. - */ -void _lv_sysmon_builtin_init(void); - -/** - * DeInitialize built-in system monitor, such as performance and memory monitor. - */ -void _lv_sysmon_builtin_deinit(void); - /********************** * MACROS **********************/ diff --git a/src/others/sysmon/lv_sysmon_private.h b/src/others/sysmon/lv_sysmon_private.h new file mode 100644 index 000000000..08d6156d3 --- /dev/null +++ b/src/others/sysmon/lv_sysmon_private.h @@ -0,0 +1,91 @@ +/** + * @file lv_sysmon_private.h + * + */ + +#ifndef LV_SYSMON_PRIVATE_H +#define LV_SYSMON_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_sysmon.h" + +#if LV_USE_SYSMON + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_sysmon_backend_data_t { + lv_subject_t subject; + lv_timer_t * timer; +}; + +#if LV_USE_PERF_MONITOR +struct lv_sysmon_perf_info_t { + struct { + bool inited; + uint32_t refr_start; + uint32_t refr_interval_sum; + uint32_t refr_elaps_sum; + uint32_t refr_cnt; + uint32_t render_start; + uint32_t render_elaps_sum; /*Contains the flush time too*/ + uint32_t render_cnt; + uint32_t flush_in_render_start; + uint32_t flush_in_render_elaps_sum; + uint32_t flush_not_in_render_start; + uint32_t flush_not_in_render_elaps_sum; + uint32_t last_report_timestamp; + uint32_t render_in_progress : 1; + } measured; + + struct { + uint32_t fps; + uint32_t cpu; + uint32_t refr_avg_time; + uint32_t render_avg_time; /**< Pure rendering time without flush time*/ + uint32_t flush_avg_time; /**< Pure flushing time without rendering time*/ + uint32_t cpu_avg_total; + uint32_t fps_avg_total; + uint32_t run_cnt; + } calculated; + +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize built-in system monitor, such as performance and memory monitor. + */ +void lv_sysmon_builtin_init(void); + +/** + * DeInitialize built-in system monitor, such as performance and memory monitor. + */ +void lv_sysmon_builtin_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_SYSMON */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SYSMON_PRIVATE_H*/ diff --git a/src/stdlib/builtin/lv_mem_core_builtin.c b/src/stdlib/builtin/lv_mem_core_builtin.c index b7b707de3..23a218154 100644 --- a/src/stdlib/builtin/lv_mem_core_builtin.c +++ b/src/stdlib/builtin/lv_mem_core_builtin.c @@ -86,10 +86,10 @@ void lv_mem_init(void) state.tlsf = lv_tlsf_create_with_pool((void *)LV_MEM_ADR, LV_MEM_SIZE); #endif - _lv_ll_init(&state.pool_ll, sizeof(lv_pool_t)); + lv_ll_init(&state.pool_ll, sizeof(lv_pool_t)); /*Record the first pool*/ - lv_pool_t * pool_p = _lv_ll_ins_tail(&state.pool_ll); + lv_pool_t * pool_p = lv_ll_ins_tail(&state.pool_ll); LV_ASSERT_MALLOC(pool_p); *pool_p = lv_tlsf_get_pool(state.tlsf); @@ -100,7 +100,7 @@ void lv_mem_init(void) void lv_mem_deinit(void) { - _lv_ll_clear(&state.pool_ll); + lv_ll_clear(&state.pool_ll); lv_tlsf_destroy(state.tlsf); #if LV_USE_OS lv_mutex_delete(&state.mutex); @@ -115,7 +115,7 @@ lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes) return NULL; } - lv_pool_t * pool_p = _lv_ll_ins_tail(&state.pool_ll); + lv_pool_t * pool_p = lv_ll_ins_tail(&state.pool_ll); LV_ASSERT_MALLOC(pool_p); *pool_p = new_pool; @@ -125,9 +125,9 @@ lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes) void lv_mem_remove_pool(lv_mem_pool_t pool) { lv_pool_t * pool_p; - _LV_LL_READ(&state.pool_ll, pool_p) { + LV_LL_READ(&state.pool_ll, pool_p) { if(*pool_p == pool) { - _lv_ll_remove(&state.pool_ll, pool_p); + lv_ll_remove(&state.pool_ll, pool_p); lv_free(pool_p); lv_tlsf_remove_pool(state.tlsf, pool); return; @@ -201,7 +201,7 @@ void lv_mem_monitor_core(lv_mem_monitor_t * mon_p) LV_TRACE_MEM("begin"); lv_pool_t * pool_p; - _LV_LL_READ(&state.pool_ll, pool_p) { + LV_LL_READ(&state.pool_ll, pool_p) { lv_tlsf_walk_pool(*pool_p, lv_mem_walker, mon_p); } @@ -233,7 +233,7 @@ lv_result_t lv_mem_test_core(void) } lv_pool_t * pool_p; - _LV_LL_READ(&state.pool_ll, pool_p) { + LV_LL_READ(&state.pool_ll, pool_p) { if(lv_tlsf_check_pool(*pool_p)) { LV_LOG_WARN("pool failed"); #if LV_USE_OS diff --git a/src/stdlib/builtin/lv_sprintf_builtin.c b/src/stdlib/builtin/lv_sprintf_builtin.c index d5fc55537..fc34db4d1 100644 --- a/src/stdlib/builtin/lv_sprintf_builtin.c +++ b/src/stdlib/builtin/lv_sprintf_builtin.c @@ -552,7 +552,7 @@ static size_t _etoa(out_fct_type out, char * buffer, size_t idx, size_t maxlen, #endif // PRINTF_SUPPORT_FLOAT // internal vsnprintf -static int _lv_vsnprintf(out_fct_type out, char * buffer, const size_t maxlen, const char * format, va_list va) +static int lv_vsnprintf_inner(out_fct_type out, char * buffer, const size_t maxlen, const char * format, va_list va) { unsigned int flags, width, precision, n; size_t idx = 0U; @@ -759,7 +759,7 @@ static int _lv_vsnprintf(out_fct_type out, char * buffer, const size_t maxlen, c va_list copy; va_copy(copy, *vaf->va); - idx += _lv_vsnprintf(out, buffer + idx, maxlen - idx, vaf->fmt, copy); + idx += lv_vsnprintf_inner(out, buffer + idx, maxlen - idx, vaf->fmt, copy); va_end(copy); } else { @@ -873,14 +873,14 @@ int lv_snprintf(char * buffer, size_t count, const char * format, ...) { va_list va; va_start(va, format); - const int ret = _lv_vsnprintf(_out_buffer, buffer, count, format, va); + const int ret = lv_vsnprintf_inner(_out_buffer, buffer, count, format, va); va_end(va); return ret; } int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va) { - return _lv_vsnprintf(_out_buffer, buffer, count, format, va); + return lv_vsnprintf_inner(_out_buffer, buffer, count, format, va); } #endif /*LV_STDLIB_BUILTIN*/ diff --git a/src/stdlib/builtin/lv_tlsf.c b/src/stdlib/builtin/lv_tlsf.c index 6048245c3..4232ae324 100644 --- a/src/stdlib/builtin/lv_tlsf.c +++ b/src/stdlib/builtin/lv_tlsf.c @@ -1,7 +1,7 @@ #include "../../lv_conf_internal.h" #if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN -#include "lv_tlsf.h" +#include "lv_tlsf_private.h" #include "../../stdlib/lv_string.h" #include "../../misc/lv_log.h" #include "../../misc/lv_assert.h" @@ -219,16 +219,16 @@ tlsf_decl int tlsf_fls_sizet(size_t size) */ /* Public constants: may be modified. */ -enum tlsf_public { +typedef enum { /* log2 of number of linear subdivisions of block sizes. Larger ** values require more memory in the control structure. Values of ** 4 or 5 are typical. */ SL_INDEX_COUNT_LOG2 = 5, -}; +} tlsf_public; /* Private constants: do not modify. */ -enum tlsf_private { +typedef enum { #if defined (TLSF_64BIT) /* All allocation sizes and addresses are aligned to 8 bytes. */ ALIGN_SIZE_LOG2 = 3, @@ -265,7 +265,7 @@ enum tlsf_private { FL_INDEX_COUNT = (FL_INDEX_MAX - FL_INDEX_SHIFT + 1), SMALL_BLOCK_SIZE = (1 << FL_INDEX_SHIFT), -}; +} tlsf_private; /* ** Cast and min/max macros. diff --git a/src/stdlib/builtin/lv_tlsf.h b/src/stdlib/builtin/lv_tlsf.h index 002e56e18..4127271db 100644 --- a/src/stdlib/builtin/lv_tlsf.h +++ b/src/stdlib/builtin/lv_tlsf.h @@ -54,16 +54,6 @@ extern "C" { typedef void * lv_tlsf_t; typedef void * lv_pool_t; -typedef struct { -#if LV_USE_OS - lv_mutex_t mutex; -#endif - lv_tlsf_t tlsf; - size_t cur_used; - size_t max_used; - lv_ll_t pool_ll; -} lv_tlsf_state_t; - /* Create/destroy a memory pool. */ lv_tlsf_t lv_tlsf_create(void * mem); lv_tlsf_t lv_tlsf_create_with_pool(void * mem, size_t bytes); diff --git a/src/stdlib/builtin/lv_tlsf_private.h b/src/stdlib/builtin/lv_tlsf_private.h new file mode 100644 index 000000000..036e9d73e --- /dev/null +++ b/src/stdlib/builtin/lv_tlsf_private.h @@ -0,0 +1,53 @@ +/** + * @file lv_tlsf_private.h + * + */ + +#ifndef LV_TLSF_PRIVATE_H +#define LV_TLSF_PRIVATE_H + +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_tlsf.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { +#if LV_USE_OS + lv_mutex_t mutex; +#endif + lv_tlsf_t tlsf; + size_t cur_used; + size_t max_used; + lv_ll_t pool_ll; +} lv_tlsf_state_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/ + +#endif /*LV_TLSF_PRIVATE_H*/ diff --git a/src/stdlib/lv_mem.c b/src/stdlib/lv_mem.c index c1ab647e3..bfc887fff 100644 --- a/src/stdlib/lv_mem.c +++ b/src/stdlib/lv_mem.c @@ -5,7 +5,7 @@ /********************* * INCLUDES *********************/ -#include "lv_mem.h" +#include "lv_mem_private.h" #include "lv_string.h" #include "../misc/lv_assert.h" #include "../misc/lv_log.h" diff --git a/src/stdlib/lv_mem_private.h b/src/stdlib/lv_mem_private.h new file mode 100644 index 000000000..9e70ae1af --- /dev/null +++ b/src/stdlib/lv_mem_private.h @@ -0,0 +1,39 @@ +/** + * @file lv_mem_private.h + * + */ + +#ifndef LV_MEM_PRIVATE_H +#define LV_MEM_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_mem.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MEM_PRIVATE_H*/ diff --git a/src/stdlib/lv_sprintf.h b/src/stdlib/lv_sprintf.h index a47b4307c..9def1ec32 100644 --- a/src/stdlib/lv_sprintf.h +++ b/src/stdlib/lv_sprintf.h @@ -3,8 +3,8 @@ * */ -#ifndef _LV_SPRINTF_H_ -#define _LV_SPRINTF_H_ +#ifndef LV_SPRINTF_H_ +#define LV_SPRINTF_H_ #if defined(__has_include) #if __has_include(LV_INTTYPES_INCLUDE) @@ -42,4 +42,4 @@ int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va); } /*extern "C"*/ #endif -#endif /* _LV_SPRINTF_H_*/ +#endif /* LV_SPRINTF_H_*/ diff --git a/src/themes/default/lv_theme_default.c b/src/themes/default/lv_theme_default.c index 7f3e2b05b..fa1266219 100644 --- a/src/themes/default/lv_theme_default.c +++ b/src/themes/default/lv_theme_default.c @@ -10,7 +10,7 @@ #if LV_USE_THEME_DEFAULT -#include "../lv_theme.h" +#include "../lv_theme_private.h" #include "../../misc/lv_color.h" #include "../../core/lv_global.h" @@ -24,7 +24,7 @@ typedef struct _my_theme_t my_theme_t; #define theme_def (*(my_theme_t **)(&LV_GLOBAL_DEFAULT()->theme_default)) #define MODE_DARK 1 -#define RADIUS_DEFAULT _LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 12 : 8) +#define RADIUS_DEFAULT LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 12 : 8) /*SCREEN*/ #define LIGHT_COLOR_SCR lv_palette_lighten(LV_PALETTE_GREY, 4) @@ -37,12 +37,12 @@ typedef struct _my_theme_t my_theme_t; #define DARK_COLOR_GREY lv_color_hex(0x2f3237) #define TRANSITION_TIME LV_THEME_DEFAULT_TRANSITION_TIME -#define BORDER_WIDTH _LV_DPX_CALC(theme->disp_dpi, 2) -#define OUTLINE_WIDTH _LV_DPX_CALC(theme->disp_dpi, 3) +#define BORDER_WIDTH LV_DPX_CALC(theme->disp_dpi, 2) +#define OUTLINE_WIDTH LV_DPX_CALC(theme->disp_dpi, 3) -#define PAD_DEF _LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 24 : theme->disp_size == DISP_MEDIUM ? 20 : 16) -#define PAD_SMALL _LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 14 : theme->disp_size == DISP_MEDIUM ? 12 : 10) -#define PAD_TINY _LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 8 : theme->disp_size == DISP_MEDIUM ? 6 : 2) +#define PAD_DEF LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 24 : theme->disp_size == DISP_MEDIUM ? 20 : 16) +#define PAD_SMALL LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 14 : theme->disp_size == DISP_MEDIUM ? 12 : 10) +#define PAD_TINY LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 8 : theme->disp_size == DISP_MEDIUM ? 6 : 2) /********************** * TYPEDEFS @@ -247,8 +247,8 @@ static void style_init(my_theme_t * theme) lv_style_set_bg_color(&theme->styles.scrollbar, sb_color); lv_style_set_radius(&theme->styles.scrollbar, LV_RADIUS_CIRCLE); - lv_style_set_pad_all(&theme->styles.scrollbar, _LV_DPX_CALC(theme->disp_dpi, 7)); - lv_style_set_width(&theme->styles.scrollbar, _LV_DPX_CALC(theme->disp_dpi, 5)); + lv_style_set_pad_all(&theme->styles.scrollbar, LV_DPX_CALC(theme->disp_dpi, 7)); + lv_style_set_width(&theme->styles.scrollbar, LV_DPX_CALC(theme->disp_dpi, 5)); lv_style_set_bg_opa(&theme->styles.scrollbar, LV_OPA_40); #if TRANSITION_TIME lv_style_set_transition(&theme->styles.scrollbar, &theme->trans_normal); @@ -278,7 +278,7 @@ static void style_init(my_theme_t * theme) lv_style_set_pad_row(&theme->styles.card, PAD_SMALL); lv_style_set_pad_column(&theme->styles.card, PAD_SMALL); lv_style_set_line_color(&theme->styles.card, lv_palette_main(LV_PALETTE_GREY)); - lv_style_set_line_width(&theme->styles.card, _LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_line_width(&theme->styles.card, LV_DPX_CALC(theme->disp_dpi, 1)); style_init_reset(&theme->styles.outline_primary); lv_style_set_outline_color(&theme->styles.outline_primary, theme->base.color_primary); @@ -293,20 +293,20 @@ static void style_init(my_theme_t * theme) style_init_reset(&theme->styles.btn); lv_style_set_radius(&theme->styles.btn, - _LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 16 : theme->disp_size == DISP_MEDIUM ? 12 : 8)); + LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 16 : theme->disp_size == DISP_MEDIUM ? 12 : 8)); lv_style_set_bg_opa(&theme->styles.btn, LV_OPA_COVER); lv_style_set_bg_color(&theme->styles.btn, theme->color_grey); if(!(theme->base.flags & MODE_DARK)) { lv_style_set_shadow_color(&theme->styles.btn, lv_palette_main(LV_PALETTE_GREY)); lv_style_set_shadow_width(&theme->styles.btn, LV_DPX(3)); lv_style_set_shadow_opa(&theme->styles.btn, LV_OPA_50); - lv_style_set_shadow_offset_y(&theme->styles.btn, _LV_DPX_CALC(theme->disp_dpi, LV_DPX(4))); + lv_style_set_shadow_offset_y(&theme->styles.btn, LV_DPX_CALC(theme->disp_dpi, LV_DPX(4))); } lv_style_set_text_color(&theme->styles.btn, theme->color_text); lv_style_set_pad_hor(&theme->styles.btn, PAD_DEF); lv_style_set_pad_ver(&theme->styles.btn, PAD_SMALL); - lv_style_set_pad_column(&theme->styles.btn, _LV_DPX_CALC(theme->disp_dpi, 5)); - lv_style_set_pad_row(&theme->styles.btn, _LV_DPX_CALC(theme->disp_dpi, 5)); + lv_style_set_pad_column(&theme->styles.btn, LV_DPX_CALC(theme->disp_dpi, 5)); + lv_style_set_pad_row(&theme->styles.btn, LV_DPX_CALC(theme->disp_dpi, 5)); lv_color_filter_dsc_init(&theme->dark_filter, dark_color_filter_cb); lv_color_filter_dsc_init(&theme->grey_filter, grey_filter_cb); @@ -333,11 +333,11 @@ static void style_init(my_theme_t * theme) lv_style_set_pad_gap(&theme->styles.pad_small, PAD_SMALL); style_init_reset(&theme->styles.pad_gap); - lv_style_set_pad_row(&theme->styles.pad_gap, _LV_DPX_CALC(theme->disp_dpi, 10)); - lv_style_set_pad_column(&theme->styles.pad_gap, _LV_DPX_CALC(theme->disp_dpi, 10)); + lv_style_set_pad_row(&theme->styles.pad_gap, LV_DPX_CALC(theme->disp_dpi, 10)); + lv_style_set_pad_column(&theme->styles.pad_gap, LV_DPX_CALC(theme->disp_dpi, 10)); style_init_reset(&theme->styles.line_space_large); - lv_style_set_text_line_space(&theme->styles.line_space_large, _LV_DPX_CALC(theme->disp_dpi, 20)); + lv_style_set_text_line_space(&theme->styles.line_space_large, LV_DPX_CALC(theme->disp_dpi, 20)); style_init_reset(&theme->styles.text_align_center); lv_style_set_text_align(&theme->styles.text_align_center, LV_TEXT_ALIGN_CENTER); @@ -393,14 +393,14 @@ static void style_init(my_theme_t * theme) #if LV_THEME_DEFAULT_GROW style_init_reset(&theme->styles.grow); - lv_style_set_transform_width(&theme->styles.grow, _LV_DPX_CALC(theme->disp_dpi, 3)); - lv_style_set_transform_height(&theme->styles.grow, _LV_DPX_CALC(theme->disp_dpi, 3)); + lv_style_set_transform_width(&theme->styles.grow, LV_DPX_CALC(theme->disp_dpi, 3)); + lv_style_set_transform_height(&theme->styles.grow, LV_DPX_CALC(theme->disp_dpi, 3)); #endif style_init_reset(&theme->styles.knob); lv_style_set_bg_color(&theme->styles.knob, theme->base.color_primary); lv_style_set_bg_opa(&theme->styles.knob, LV_OPA_COVER); - lv_style_set_pad_all(&theme->styles.knob, _LV_DPX_CALC(theme->disp_dpi, 6)); + lv_style_set_pad_all(&theme->styles.knob, LV_DPX_CALC(theme->disp_dpi, 6)); lv_style_set_radius(&theme->styles.knob, LV_RADIUS_CIRCLE); style_init_reset(&theme->styles.anim); @@ -412,7 +412,7 @@ static void style_init(my_theme_t * theme) #if LV_USE_ARC style_init_reset(&theme->styles.arc_indic); lv_style_set_arc_color(&theme->styles.arc_indic, theme->color_grey); - lv_style_set_arc_width(&theme->styles.arc_indic, _LV_DPX_CALC(theme->disp_dpi, 15)); + lv_style_set_arc_width(&theme->styles.arc_indic, LV_DPX_CALC(theme->disp_dpi, 15)); lv_style_set_arc_rounded(&theme->styles.arc_indic, true); style_init_reset(&theme->styles.arc_indic_primary); @@ -425,7 +425,7 @@ static void style_init(my_theme_t * theme) #endif #if LV_USE_CHECKBOX style_init_reset(&theme->styles.cb_marker); - lv_style_set_pad_all(&theme->styles.cb_marker, _LV_DPX_CALC(theme->disp_dpi, 3)); + lv_style_set_pad_all(&theme->styles.cb_marker, LV_DPX_CALC(theme->disp_dpi, 3)); lv_style_set_border_width(&theme->styles.cb_marker, BORDER_WIDTH); lv_style_set_border_color(&theme->styles.cb_marker, theme->base.color_primary); lv_style_set_bg_color(&theme->styles.cb_marker, theme->color_card); @@ -440,7 +440,7 @@ static void style_init(my_theme_t * theme) #if LV_USE_SWITCH style_init_reset(&theme->styles.switch_knob); - lv_style_set_pad_all(&theme->styles.switch_knob, - _LV_DPX_CALC(theme->disp_dpi, 4)); + lv_style_set_pad_all(&theme->styles.switch_knob, - LV_DPX_CALC(theme->disp_dpi, 4)); lv_style_set_bg_color(&theme->styles.switch_knob, lv_color_white()); #endif @@ -453,16 +453,16 @@ static void style_init(my_theme_t * theme) #if LV_USE_CHART style_init_reset(&theme->styles.chart_bg); lv_style_set_border_post(&theme->styles.chart_bg, false); - lv_style_set_pad_column(&theme->styles.chart_bg, _LV_DPX_CALC(theme->disp_dpi, 10)); + lv_style_set_pad_column(&theme->styles.chart_bg, LV_DPX_CALC(theme->disp_dpi, 10)); lv_style_set_line_color(&theme->styles.chart_bg, theme->color_grey); style_init_reset(&theme->styles.chart_series); - lv_style_set_line_width(&theme->styles.chart_series, _LV_DPX_CALC(theme->disp_dpi, 3)); - lv_style_set_radius(&theme->styles.chart_series, _LV_DPX_CALC(theme->disp_dpi, 3)); + lv_style_set_line_width(&theme->styles.chart_series, LV_DPX_CALC(theme->disp_dpi, 3)); + lv_style_set_radius(&theme->styles.chart_series, LV_DPX_CALC(theme->disp_dpi, 3)); - int32_t chart_size = _LV_DPX_CALC(theme->disp_dpi, 8); + int32_t chart_size = LV_DPX_CALC(theme->disp_dpi, 8); lv_style_set_size(&theme->styles.chart_series, chart_size, chart_size); - lv_style_set_pad_column(&theme->styles.chart_series, _LV_DPX_CALC(theme->disp_dpi, 2)); + lv_style_set_pad_column(&theme->styles.chart_series, LV_DPX_CALC(theme->disp_dpi, 2)); style_init_reset(&theme->styles.chart_indic); lv_style_set_radius(&theme->styles.chart_indic, LV_RADIUS_CIRCLE); @@ -490,7 +490,7 @@ static void style_init(my_theme_t * theme) lv_style_set_pad_hor(&theme->styles.menu_cont, PAD_SMALL); lv_style_set_pad_ver(&theme->styles.menu_cont, PAD_SMALL); lv_style_set_pad_gap(&theme->styles.menu_cont, PAD_SMALL); - lv_style_set_border_width(&theme->styles.menu_cont, _LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_width(&theme->styles.menu_cont, LV_DPX_CALC(theme->disp_dpi, 1)); lv_style_set_border_opa(&theme->styles.menu_cont, LV_OPA_10); lv_style_set_border_color(&theme->styles.menu_cont, theme->color_text); lv_style_set_border_side(&theme->styles.menu_cont, LV_BORDER_SIDE_NONE); @@ -498,7 +498,7 @@ static void style_init(my_theme_t * theme) style_init_reset(&theme->styles.menu_sidebar_cont); lv_style_set_pad_all(&theme->styles.menu_sidebar_cont, 0); lv_style_set_pad_gap(&theme->styles.menu_sidebar_cont, 0); - lv_style_set_border_width(&theme->styles.menu_sidebar_cont, _LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_width(&theme->styles.menu_sidebar_cont, LV_DPX_CALC(theme->disp_dpi, 1)); lv_style_set_border_opa(&theme->styles.menu_sidebar_cont, LV_OPA_10); lv_style_set_border_color(&theme->styles.menu_sidebar_cont, theme->color_text); lv_style_set_border_side(&theme->styles.menu_sidebar_cont, LV_BORDER_SIDE_RIGHT); @@ -534,7 +534,7 @@ static void style_init(my_theme_t * theme) #if LV_USE_TABLE style_init_reset(&theme->styles.table_cell); - lv_style_set_border_width(&theme->styles.table_cell, _LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_width(&theme->styles.table_cell, LV_DPX_CALC(theme->disp_dpi, 1)); lv_style_set_border_color(&theme->styles.table_cell, theme->color_grey); lv_style_set_border_side(&theme->styles.table_cell, LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_BOTTOM); #endif @@ -542,8 +542,8 @@ static void style_init(my_theme_t * theme) #if LV_USE_TEXTAREA style_init_reset(&theme->styles.ta_cursor); lv_style_set_border_color(&theme->styles.ta_cursor, theme->color_text); - lv_style_set_border_width(&theme->styles.ta_cursor, _LV_DPX_CALC(theme->disp_dpi, 2)); - lv_style_set_pad_left(&theme->styles.ta_cursor, - _LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_width(&theme->styles.ta_cursor, LV_DPX_CALC(theme->disp_dpi, 2)); + lv_style_set_pad_left(&theme->styles.ta_cursor, - LV_DPX_CALC(theme->disp_dpi, 1)); lv_style_set_border_side(&theme->styles.ta_cursor, LV_BORDER_SIDE_LEFT); lv_style_set_anim_duration(&theme->styles.ta_cursor, 400); @@ -559,7 +559,7 @@ static void style_init(my_theme_t * theme) lv_style_set_pad_gap(&theme->styles.calendar_btnm_bg, PAD_SMALL / 2); style_init_reset(&theme->styles.calendar_btnm_day); - lv_style_set_border_width(&theme->styles.calendar_btnm_day, _LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_width(&theme->styles.calendar_btnm_day, LV_DPX_CALC(theme->disp_dpi, 1)); lv_style_set_border_color(&theme->styles.calendar_btnm_day, theme->color_grey); lv_style_set_bg_color(&theme->styles.calendar_btnm_day, theme->color_card); lv_style_set_bg_opa(&theme->styles.calendar_btnm_day, LV_OPA_20); @@ -602,7 +602,7 @@ static void style_init(my_theme_t * theme) lv_style_set_clip_corner(&theme->styles.list_bg, true); style_init_reset(&theme->styles.list_btn); - lv_style_set_border_width(&theme->styles.list_btn, _LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_width(&theme->styles.list_btn, LV_DPX_CALC(theme->disp_dpi, 1)); lv_style_set_border_color(&theme->styles.list_btn, theme->color_grey); lv_style_set_border_side(&theme->styles.list_btn, LV_BORDER_SIDE_BOTTOM); lv_style_set_pad_all(&theme->styles.list_btn, PAD_SMALL); @@ -618,9 +618,9 @@ static void style_init(my_theme_t * theme) lv_style_set_bg_color(&theme->styles.led, lv_color_white()); lv_style_set_bg_grad_color(&theme->styles.led, lv_palette_main(LV_PALETTE_GREY)); lv_style_set_radius(&theme->styles.led, LV_RADIUS_CIRCLE); - lv_style_set_shadow_width(&theme->styles.led, _LV_DPX_CALC(theme->disp_dpi, 15)); + lv_style_set_shadow_width(&theme->styles.led, LV_DPX_CALC(theme->disp_dpi, 15)); lv_style_set_shadow_color(&theme->styles.led, lv_color_white()); - lv_style_set_shadow_spread(&theme->styles.led, _LV_DPX_CALC(theme->disp_dpi, 5)); + lv_style_set_shadow_spread(&theme->styles.led, LV_DPX_CALC(theme->disp_dpi, 5)); #endif #if LV_USE_SCALE diff --git a/src/themes/lv_theme.c b/src/themes/lv_theme.c index 352047539..5dcd6c6ae 100644 --- a/src/themes/lv_theme.c +++ b/src/themes/lv_theme.c @@ -6,6 +6,9 @@ /********************* * INCLUDES *********************/ +#include "lv_theme_private.h" +#include "../core/lv_obj_private.h" +#include "../core/lv_obj_class_private.h" #include "../../lvgl.h" /********************* diff --git a/src/themes/lv_theme.h b/src/themes/lv_theme.h index fc19f4c45..21cb09b11 100644 --- a/src/themes/lv_theme.h +++ b/src/themes/lv_theme.h @@ -25,19 +25,6 @@ extern "C" { typedef void (*lv_theme_apply_cb_t)(lv_theme_t *, lv_obj_t *); -struct _lv_theme_t { - lv_theme_apply_cb_t apply_cb; - lv_theme_t * parent; /**< Apply the current theme's style on top of this theme.*/ - void * user_data; - lv_display_t * disp; - lv_color_t color_primary; - lv_color_t color_secondary; - const lv_font_t * font_small; - const lv_font_t * font_normal; - const lv_font_t * font_large; - uint32_t flags; /*Any custom flag used by the theme*/ -}; - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/themes/lv_theme_private.h b/src/themes/lv_theme_private.h new file mode 100644 index 000000000..d4b0cf1b0 --- /dev/null +++ b/src/themes/lv_theme_private.h @@ -0,0 +1,53 @@ +/** + * @file lv_theme_private.h + * + */ + +#ifndef LV_THEME_PRIVATE_H +#define LV_THEME_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_theme.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_theme_t { + lv_theme_apply_cb_t apply_cb; + lv_theme_t * parent; /**< Apply the current theme's style on top of this theme.*/ + void * user_data; + lv_display_t * disp; + lv_color_t color_primary; + lv_color_t color_secondary; + const lv_font_t * font_small; + const lv_font_t * font_normal; + const lv_font_t * font_large; + uint32_t flags; /*Any custom flag used by the theme*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_THEME_PRIVATE_H*/ diff --git a/src/themes/mono/lv_theme_mono.c b/src/themes/mono/lv_theme_mono.c index 6beaa9ac6..cd71ecb3d 100644 --- a/src/themes/mono/lv_theme_mono.c +++ b/src/themes/mono/lv_theme_mono.c @@ -6,6 +6,7 @@ /********************* * INCLUDES *********************/ +#include "../lv_theme_private.h" #include "../../../lvgl.h" #if LV_USE_THEME_MONO diff --git a/src/themes/simple/lv_theme_simple.c b/src/themes/simple/lv_theme_simple.c index b7dac5b1c..8a325550f 100644 --- a/src/themes/simple/lv_theme_simple.c +++ b/src/themes/simple/lv_theme_simple.c @@ -6,6 +6,7 @@ /********************* * INCLUDES *********************/ +#include "../lv_theme_private.h" #include "../../../lvgl.h" /*To see all the widgets*/ #if LV_USE_THEME_SIMPLE diff --git a/src/tick/lv_tick.c b/src/tick/lv_tick.c index 09fcd007a..21e22959d 100644 --- a/src/tick/lv_tick.c +++ b/src/tick/lv_tick.c @@ -6,7 +6,7 @@ /********************* * INCLUDES *********************/ -#include "lv_tick.h" +#include "lv_tick_private.h" #include "../misc/lv_types.h" #include "../core/lv_global.h" diff --git a/src/tick/lv_tick.h b/src/tick/lv_tick.h index ef65b967f..048b93a31 100644 --- a/src/tick/lv_tick.h +++ b/src/tick/lv_tick.h @@ -31,13 +31,6 @@ typedef uint32_t (*lv_tick_get_cb_t)(void); typedef void (*lv_delay_cb_t)(uint32_t ms); -typedef struct { - uint32_t sys_time; - volatile uint8_t sys_irq_flag; - lv_tick_get_cb_t tick_get_cb; - lv_delay_cb_t delay_cb; -} lv_tick_state_t; - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/tick/lv_tick_private.h b/src/tick/lv_tick_private.h new file mode 100644 index 000000000..cf8ae9b09 --- /dev/null +++ b/src/tick/lv_tick_private.h @@ -0,0 +1,46 @@ +/** + * @file lv_tick_private.h + * + */ + +#ifndef LV_TICK_PRIVATE_H +#define LV_TICK_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_tick.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + uint32_t sys_time; + volatile uint8_t sys_irq_flag; + lv_tick_get_cb_t tick_get_cb; + lv_delay_cb_t delay_cb; +} lv_tick_state_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TICK_PRIVATE_H*/ diff --git a/src/widgets/animimage/lv_animimage.c b/src/widgets/animimage/lv_animimage.c index 88ca98077..3c6ed50cd 100644 --- a/src/widgets/animimage/lv_animimage.c +++ b/src/widgets/animimage/lv_animimage.c @@ -6,7 +6,8 @@ /********************* * INCLUDES *********************/ -#include "lv_animimage.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_animimage_private.h" #if LV_USE_ANIMIMG != 0 /*Testing of dependencies*/ diff --git a/src/widgets/animimage/lv_animimage.h b/src/widgets/animimage/lv_animimage.h index 0e88a2635..d5d5b68fc 100644 --- a/src/widgets/animimage/lv_animimage.h +++ b/src/widgets/animimage/lv_animimage.h @@ -32,25 +32,10 @@ extern "C" { LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_animimg_class; -/*Data of the animimage*/ -typedef struct { - lv_image_t img; - lv_anim_t anim; - /*picture sequence */ - const void ** dsc; - int8_t pic_count; -} lv_animimg_t; - /*Image parts*/ -enum _lv_animimg_part_t { +typedef enum { LV_ANIM_IMAGE_PART_MAIN, -}; - -#ifdef DOXYGEN -typedef _lv_animimg_part_t lv_animimg_part_t; -#else -typedef uint8_t lv_animimg_part_t; -#endif +} lv_animimg_part_t; /********************** * GLOBAL PROTOTYPES diff --git a/src/widgets/animimage/lv_animimage_private.h b/src/widgets/animimage/lv_animimage_private.h new file mode 100644 index 000000000..89d6f49ef --- /dev/null +++ b/src/widgets/animimage/lv_animimage_private.h @@ -0,0 +1,55 @@ +/** + * @file lv_animimage_private.h + * + */ + +#ifndef LV_ANIMIMAGE_PRIVATE_H +#define LV_ANIMIMAGE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../image/lv_image_private.h" +#include "../../misc/lv_anim_private.h" +#include "lv_animimage.h" + +#if LV_USE_ANIMIMG != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of the animimage*/ +struct lv_animimg_t { + lv_image_t img; + lv_anim_t anim; + /*picture sequence */ + const void ** dsc; + int8_t pic_count; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_ANIMIMG != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ANIMIMAGE_PRIVATE_H*/ diff --git a/src/widgets/arc/lv_arc.c b/src/widgets/arc/lv_arc.c index 8bfe0c0ce..8ddd6aba6 100644 --- a/src/widgets/arc/lv_arc.c +++ b/src/widgets/arc/lv_arc.c @@ -6,7 +6,11 @@ /********************* * INCLUDES *********************/ -#include "lv_arc.h" +#include "../../misc/lv_area_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_event_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_arc_private.h" #if LV_USE_ARC != 0 #include "../../core/lv_group.h" @@ -646,14 +650,14 @@ static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e) lv_area_t a; /*Invalid if clicked inside*/ lv_area_set(&a, p.x - r, p.y - r, p.x + r, p.y + r); - if(_lv_area_is_point_on(&a, info->point, LV_RADIUS_CIRCLE)) { + if(lv_area_is_point_on(&a, info->point, LV_RADIUS_CIRCLE)) { info->res = false; return; } /*Valid if no clicked outside*/ lv_area_increase(&a, w + ext_click_area * 2, w + ext_click_area * 2); - info->res = _lv_area_is_point_on(&a, info->point, LV_RADIUS_CIRCLE); + info->res = lv_area_is_point_on(&a, info->point, LV_RADIUS_CIRCLE); } else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); diff --git a/src/widgets/arc/lv_arc.h b/src/widgets/arc/lv_arc.h index bea60c6ef..f241745ff 100644 --- a/src/widgets/arc/lv_arc.h +++ b/src/widgets/arc/lv_arc.h @@ -26,37 +26,11 @@ extern "C" { /********************** * TYPEDEFS **********************/ -enum _lv_arc_mode_t { +typedef enum { LV_ARC_MODE_NORMAL, LV_ARC_MODE_SYMMETRICAL, LV_ARC_MODE_REVERSE -}; - -#ifdef DOXYGEN -typedef _lv_arc_mode_t lv_arc_mode_t; -#else -typedef uint8_t lv_arc_mode_t; -#endif /*DOXYGEN*/ - -typedef struct { - lv_obj_t obj; - int32_t rotation; - lv_value_precise_t indic_angle_start; - lv_value_precise_t indic_angle_end; - lv_value_precise_t bg_angle_start; - lv_value_precise_t bg_angle_end; - int32_t value; /*Current value of the arc*/ - int32_t min_value; /*Minimum value of the arc*/ - int32_t max_value; /*Maximum value of the arc*/ - uint32_t dragging : 1; - uint32_t type : 2; - uint32_t min_close : 1; /*1: the last pressed angle was closer to minimum end*/ - uint32_t in_out : 1; /* 1: The click was within the background arc angles. 0: Click outside */ - uint32_t chg_rate; /*Drag angle rate of change of the arc (degrees/sec)*/ - uint32_t last_tick; /*Last dragging event timestamp of the arc*/ - lv_value_precise_t last_angle; /*Last dragging angle of the arc*/ - int16_t knob_offset; /*knob offset from the main arc*/ -} lv_arc_t; +} lv_arc_mode_t; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_arc_class; diff --git a/src/widgets/arc/lv_arc_private.h b/src/widgets/arc/lv_arc_private.h new file mode 100644 index 000000000..864651dc6 --- /dev/null +++ b/src/widgets/arc/lv_arc_private.h @@ -0,0 +1,64 @@ +/** + * @file lv_arc_private.h + * + */ + +#ifndef LV_ARC_PRIVATE_H +#define LV_ARC_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_arc.h" + +#if LV_USE_ARC != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_arc_t { + lv_obj_t obj; + int32_t rotation; + lv_value_precise_t indic_angle_start; + lv_value_precise_t indic_angle_end; + lv_value_precise_t bg_angle_start; + lv_value_precise_t bg_angle_end; + int32_t value; /*Current value of the arc*/ + int32_t min_value; /*Minimum value of the arc*/ + int32_t max_value; /*Maximum value of the arc*/ + uint32_t dragging : 1; + uint32_t type : 2; + uint32_t min_close : 1; /*1: the last pressed angle was closer to minimum end*/ + uint32_t in_out : 1; /* 1: The click was within the background arc angles. 0: Click outside */ + uint32_t chg_rate; /*Drag angle rate of change of the arc (degrees/sec)*/ + uint32_t last_tick; /*Last dragging event timestamp of the arc*/ + lv_value_precise_t last_angle; /*Last dragging angle of the arc*/ + int16_t knob_offset; /*knob offset from the main arc*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_ARC != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ARC_PRIVATE_H*/ diff --git a/src/widgets/bar/lv_bar.c b/src/widgets/bar/lv_bar.c index c0327a4c5..6ca271b82 100644 --- a/src/widgets/bar/lv_bar.c +++ b/src/widgets/bar/lv_bar.c @@ -6,12 +6,16 @@ /********************* * INCLUDES *********************/ -#include "lv_bar.h" +#include "../../misc/lv_area_private.h" +#include "../../draw/lv_draw_mask_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_bar_private.h" #if LV_USE_BAR != 0 #include "../../draw/lv_draw.h" #include "../../misc/lv_assert.h" -#include "../../misc/lv_anim.h" +#include "../../misc/lv_anim_private.h" #include "../../misc/lv_math.h" /********************* @@ -49,8 +53,8 @@ static void lv_bar_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); static void lv_bar_event(const lv_obj_class_t * class_p, lv_event_t * e); static void draw_indic(lv_event_t * e); static void lv_bar_set_value_with_anim(lv_obj_t * obj, int32_t new_value, int32_t * value_ptr, - _lv_bar_anim_t * anim_info, lv_anim_enable_t en); -static void lv_bar_init_anim(lv_obj_t * bar, _lv_bar_anim_t * bar_anim); + lv_bar_anim_t * anim_info, lv_anim_enable_t en); +static void lv_bar_init_anim(lv_obj_t * bar, lv_bar_anim_t * bar_anim); static void lv_bar_anim(void * bar, int32_t value); static void lv_bar_anim_completed(lv_anim_t * a); @@ -509,7 +513,7 @@ static void draw_indic(lv_event_t * e) /*The indicator is fully drawn if it's larger than the bg*/ if((bg_left < 0 || bg_right < 0 || bg_top < 0 || bg_bottom < 0)) radius_issue = false; else if(indic_radius >= bg_radius) radius_issue = false; - else if(_lv_area_is_in(&indic_area, &bar_coords, bg_radius)) radius_issue = false; + else if(lv_area_is_in(&indic_area, &bar_coords, bg_radius)) radius_issue = false; if(radius_issue || mask_needed) { if(!radius_issue) { @@ -624,14 +628,14 @@ static void lv_bar_event(const lv_obj_class_t * class_p, lv_event_t * e) static void lv_bar_anim(void * var, int32_t value) { - _lv_bar_anim_t * bar_anim = var; + lv_bar_anim_t * bar_anim = var; bar_anim->anim_state = value; lv_obj_invalidate(bar_anim->bar); } static void lv_bar_anim_completed(lv_anim_t * a) { - _lv_bar_anim_t * var = a->var; + lv_bar_anim_t * var = a->var; lv_obj_t * obj = (lv_obj_t *)var->bar; lv_bar_t * bar = (lv_bar_t *)obj; @@ -644,7 +648,7 @@ static void lv_bar_anim_completed(lv_anim_t * a) } static void lv_bar_set_value_with_anim(lv_obj_t * obj, int32_t new_value, int32_t * value_ptr, - _lv_bar_anim_t * anim_info, lv_anim_enable_t en) + lv_bar_anim_t * anim_info, lv_anim_enable_t en) { if(en == LV_ANIM_OFF) { lv_anim_delete(anim_info, NULL); @@ -683,7 +687,7 @@ static void lv_bar_set_value_with_anim(lv_obj_t * obj, int32_t new_value, int32_ } } -static void lv_bar_init_anim(lv_obj_t * obj, _lv_bar_anim_t * bar_anim) +static void lv_bar_init_anim(lv_obj_t * obj, lv_bar_anim_t * bar_anim) { bar_anim->bar = obj; bar_anim->anim_start = 0; diff --git a/src/widgets/bar/lv_bar.h b/src/widgets/bar/lv_bar.h index 212abff28..93c88786f 100644 --- a/src/widgets/bar/lv_bar.h +++ b/src/widgets/bar/lv_bar.h @@ -28,48 +28,17 @@ extern "C" { /********************** * TYPEDEFS **********************/ -enum _lv_bar_mode_t { +typedef enum { LV_BAR_MODE_NORMAL, LV_BAR_MODE_SYMMETRICAL, LV_BAR_MODE_RANGE -}; -#ifdef DOXYGEN -typedef _lv_bar_mode_t lv_bar_mode_t; -#else -typedef uint8_t lv_bar_mode_t; -#endif /*DOXYGEN*/ +} lv_bar_mode_t; -enum _lv_bar_orientation_t { +typedef enum { LV_BAR_ORIENTATION_AUTO, LV_BAR_ORIENTATION_HORIZONTAL, LV_BAR_ORIENTATION_VERTICAL -}; -#ifdef DOXYGEN -typedef _lv_bar_orientation_t lv_bar_orientation_t; -#else -typedef uint8_t lv_bar_orientation_t; -#endif /*DOXYGEN*/ - -typedef struct { - lv_obj_t * bar; - int32_t anim_start; - int32_t anim_end; - int32_t anim_state; -} _lv_bar_anim_t; - -typedef struct { - lv_obj_t obj; - int32_t cur_value; /**< Current value of the bar*/ - int32_t min_value; /**< Minimum value of the bar*/ - int32_t max_value; /**< Maximum value of the bar*/ - int32_t start_value; /**< Start value of the bar*/ - lv_area_t indic_area; /**< Save the indicator area. Might be used by derived types*/ - bool val_reversed; /**< Whether value been reversed */ - _lv_bar_anim_t cur_value_anim; - _lv_bar_anim_t start_value_anim; - lv_bar_mode_t mode : 2; /**< Type of bar*/ - lv_bar_orientation_t orientation : 2; /**< Orientation of bar*/ -} lv_bar_t; +} lv_bar_orientation_t; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_bar_class; diff --git a/src/widgets/bar/lv_bar_private.h b/src/widgets/bar/lv_bar_private.h new file mode 100644 index 000000000..891d14a34 --- /dev/null +++ b/src/widgets/bar/lv_bar_private.h @@ -0,0 +1,66 @@ +/** + * @file lv_bar_private.h + * + */ + +#ifndef LV_BAR_PRIVATE_H +#define LV_BAR_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_bar.h" + +#if LV_USE_BAR != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_bar_anim_t { + lv_obj_t * bar; + int32_t anim_start; + int32_t anim_end; + int32_t anim_state; +}; + +struct lv_bar_t { + lv_obj_t obj; + int32_t cur_value; /**< Current value of the bar*/ + int32_t min_value; /**< Minimum value of the bar*/ + int32_t max_value; /**< Maximum value of the bar*/ + int32_t start_value; /**< Start value of the bar*/ + lv_area_t indic_area; /**< Save the indicator area. Might be used by derived types*/ + bool val_reversed; /**< Whether value been reversed */ + lv_bar_anim_t cur_value_anim; + lv_bar_anim_t start_value_anim; + lv_bar_mode_t mode : 2; /**< Type of bar*/ + lv_bar_orientation_t orientation : 2; /**< Orientation of bar*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_BAR != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BAR_PRIVATE_H*/ diff --git a/src/widgets/button/lv_button.c b/src/widgets/button/lv_button.c index 8f57aa409..b6cba65b5 100644 --- a/src/widgets/button/lv_button.c +++ b/src/widgets/button/lv_button.c @@ -7,7 +7,8 @@ * INCLUDES *********************/ -#include "lv_button.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_button_private.h" #if LV_USE_BUTTON != 0 /********************* diff --git a/src/widgets/button/lv_button.h b/src/widgets/button/lv_button.h index 85803e6f5..eb7a0a57c 100644 --- a/src/widgets/button/lv_button.h +++ b/src/widgets/button/lv_button.h @@ -22,14 +22,6 @@ extern "C" { * DEFINES *********************/ -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_obj_t obj; -} lv_button_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_button_class; /********************** diff --git a/src/widgets/button/lv_button_private.h b/src/widgets/button/lv_button_private.h new file mode 100644 index 000000000..ce310f32c --- /dev/null +++ b/src/widgets/button/lv_button_private.h @@ -0,0 +1,53 @@ +/** + * @file lv_button_private.h + * + */ + +#ifndef LV_BUTTON_PRIVATE_H +#define LV_BUTTON_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_button.h" + +#if LV_USE_BUTTON != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_button_t { + lv_obj_t obj; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_BUTTON != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BUTTON_PRIVATE_H*/ diff --git a/src/widgets/buttonmatrix/lv_buttonmatrix.c b/src/widgets/buttonmatrix/lv_buttonmatrix.c index 2b02670bd..a48b8e123 100644 --- a/src/widgets/buttonmatrix/lv_buttonmatrix.c +++ b/src/widgets/buttonmatrix/lv_buttonmatrix.c @@ -6,7 +6,10 @@ /********************* * INCLUDES *********************/ -#include "lv_buttonmatrix.h" +#include "../../misc/lv_area_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_buttonmatrix_private.h" #if LV_USE_BUTTONMATRIX != 0 #include "../../misc/lv_assert.h" @@ -775,9 +778,9 @@ static void draw_main(lv_event_t * e) #if LV_USE_ARABIC_PERSIAN_CHARS /*Get the size of the Arabic text and process it*/ - size_t len_ap = _lv_text_ap_calc_bytes_count(txt); + size_t len_ap = lv_text_ap_calc_bytes_count(txt); if(len_ap < sizeof(txt_ap)) { - _lv_text_ap_proc(txt, txt_ap); + lv_text_ap_proc(txt, txt_ap); txt = txt_ap; } #endif @@ -950,7 +953,7 @@ static uint32_t get_button_from_point(lv_obj_t * obj, lv_point_t * p) BTN_EXTRA_CLICK_AREA_MAX); /*-2 for rounding error*/ else btn_area.y2 += obj_cords.y1 + prow; - if(_lv_area_is_point_on(&btn_area, p, 0) != false) { + if(lv_area_is_point_on(&btn_area, p, 0) != false) { break; } } diff --git a/src/widgets/buttonmatrix/lv_buttonmatrix.h b/src/widgets/buttonmatrix/lv_buttonmatrix.h index 7ceaf29b2..c095eec35 100644 --- a/src/widgets/buttonmatrix/lv_buttonmatrix.h +++ b/src/widgets/buttonmatrix/lv_buttonmatrix.h @@ -31,8 +31,7 @@ LV_EXPORT_CONST_INT(LV_BUTTONMATRIX_BUTTON_NONE); /** Type to store button control bits (disabled, hidden etc.) * The first 3 bits are used to store the width*/ -enum _lv_buttonmatrix_ctrl_t { - _LV_BUTTONMATRIX_WIDTH = 0x000F, /**< Reserved to store the size units*/ +typedef enum { LV_BUTTONMATRIX_CTRL_HIDDEN = 0x0010, /**< Button hidden*/ LV_BUTTONMATRIX_CTRL_NO_REPEAT = 0x0020, /**< Do not repeat press this button.*/ LV_BUTTONMATRIX_CTRL_DISABLED = 0x0040, /**< Disable this button.*/ @@ -40,34 +39,16 @@ enum _lv_buttonmatrix_ctrl_t { LV_BUTTONMATRIX_CTRL_CHECKED = 0x0100, /**< Button is currently toggled (e.g. checked).*/ LV_BUTTONMATRIX_CTRL_CLICK_TRIG = 0x0200, /**< 1: Send LV_EVENT_VALUE_CHANGE on CLICK, 0: Send LV_EVENT_VALUE_CHANGE on PRESS*/ LV_BUTTONMATRIX_CTRL_POPOVER = 0x0400, /**< Show a popover when pressing this key*/ - _LV_BUTTONMATRIX_CTRL_RESERVED_1 = 0x0800, /**< Reserved for later use*/ - _LV_BUTTONMATRIX_CTRL_RESERVED_2 = 0x1000, /**< Reserved for later use*/ - _LV_BUTTONMATRIX_CTRL_RESERVED_3 = 0x2000, /**< Reserved for later use*/ + LV_BUTTONMATRIX_CTRL_RESERVED_1 = 0x0800, /**< Reserved for later use*/ + LV_BUTTONMATRIX_CTRL_RESERVED_2 = 0x1000, /**< Reserved for later use*/ + LV_BUTTONMATRIX_CTRL_RESERVED_3 = 0x2000, /**< Reserved for later use*/ LV_BUTTONMATRIX_CTRL_CUSTOM_1 = 0x4000, /**< Custom free to use flag*/ LV_BUTTONMATRIX_CTRL_CUSTOM_2 = 0x8000, /**< Custom free to use flag*/ -}; - -#ifdef DOXYGEN -typedef _lv_buttonmatrix_ctrl_t lv_buttonmatrix_ctrl_t; -#else -typedef uint32_t lv_buttonmatrix_ctrl_t; -#endif /*DOXYGEN*/ +} lv_buttonmatrix_ctrl_t; typedef bool (*lv_buttonmatrix_button_draw_cb_t)(lv_obj_t * btnm, uint32_t btn_id, const lv_area_t * draw_area, const lv_area_t * clip_area); -/*Data of button matrix*/ -typedef struct { - lv_obj_t obj; - const char ** map_p; /*Pointer to the current map*/ - lv_area_t * button_areas; /*Array of areas of buttons*/ - lv_buttonmatrix_ctrl_t * ctrl_bits; /*Array of control bytes*/ - uint32_t btn_cnt; /*Number of button in 'map_p'(Handled by the library)*/ - uint32_t row_cnt; /*Number of rows in 'map_p'(Handled by the library)*/ - uint32_t btn_id_sel; /*Index of the active button (being pressed/released etc) or LV_BUTTONMATRIX_BUTTON_NONE*/ - uint32_t one_check : 1; /*Single button toggled at once*/ -} lv_buttonmatrix_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_buttonmatrix_class; /********************** diff --git a/src/widgets/buttonmatrix/lv_buttonmatrix_private.h b/src/widgets/buttonmatrix/lv_buttonmatrix_private.h new file mode 100644 index 000000000..fdacdf3da --- /dev/null +++ b/src/widgets/buttonmatrix/lv_buttonmatrix_private.h @@ -0,0 +1,57 @@ +/** + * @file lv_buttonmatrix_private.h + * + */ + +#ifndef LV_BUTTONMATRIX_PRIVATE_H +#define LV_BUTTONMATRIX_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_buttonmatrix.h" + +#if LV_USE_BUTTONMATRIX != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of button matrix*/ +struct lv_buttonmatrix_t { + lv_obj_t obj; + const char ** map_p; /*Pointer to the current map*/ + lv_area_t * button_areas; /*Array of areas of buttons*/ + lv_buttonmatrix_ctrl_t * ctrl_bits; /*Array of control bytes*/ + uint32_t btn_cnt; /*Number of button in 'map_p'(Handled by the library)*/ + uint32_t row_cnt; /*Number of rows in 'map_p'(Handled by the library)*/ + uint32_t btn_id_sel; /*Index of the active button (being pressed/released etc) or LV_BUTTONMATRIX_BUTTON_NONE*/ + uint32_t one_check : 1; /*Single button toggled at once*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_BUTTONMATRIX != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BUTTONMATRIX_PRIVATE_H*/ diff --git a/src/widgets/calendar/lv_calendar.c b/src/widgets/calendar/lv_calendar.c index 96282aef9..ef78d9dec 100644 --- a/src/widgets/calendar/lv_calendar.c +++ b/src/widgets/calendar/lv_calendar.c @@ -6,7 +6,9 @@ /********************* * INCLUDES *********************/ -#include "lv_calendar.h" +#include "../../draw/lv_draw_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_calendar_private.h" #include "../../../lvgl.h" #if LV_USE_CALENDAR diff --git a/src/widgets/calendar/lv_calendar.h b/src/widgets/calendar/lv_calendar.h index 3218c824b..2dbf10245 100644 --- a/src/widgets/calendar/lv_calendar.h +++ b/src/widgets/calendar/lv_calendar.h @@ -34,31 +34,6 @@ typedef struct { int8_t day; /** 1..31*/ } lv_calendar_date_t; -/*Data of calendar*/ -typedef struct { - lv_obj_t obj; - /*New data for this type*/ - lv_obj_t * btnm; - lv_calendar_date_t today; /**< Date of today*/ - lv_calendar_date_t showed_date; /**< Currently visible month (day is ignored)*/ - lv_calendar_date_t * highlighted_dates; /**< Apply different style on these days (pointer to user-defined array)*/ - size_t highlighted_dates_num; /**< Number of elements in `highlighted_days`*/ - const char * map[8 * 7]; -#ifdef LV_USE_CALENDAR_CHINESE - bool use_chinese_calendar; - - /* 7 * 6: A week has 7 days, and the calendar displays 6 weeks in total. - 20: Including the number of dates, line breaks, names for each day, - and reserving several spaces for addresses.*/ - char nums [7 * 6][20]; -#else - /* 7 * 6: A week has 7 days, and the calendar displays 6 weeks in total. - 6: Including the number of dates, and reserving several spaces for - addresses.*/ - char nums [7 * 6][4]; -#endif -} lv_calendar_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_calendar_class; /********************** diff --git a/src/widgets/calendar/lv_calendar_chinese.c b/src/widgets/calendar/lv_calendar_chinese.c index deb09de9d..81c844bf1 100644 --- a/src/widgets/calendar/lv_calendar_chinese.c +++ b/src/widgets/calendar/lv_calendar_chinese.c @@ -6,7 +6,8 @@ /********************* * INCLUDES *********************/ -#include "lv_calendar.h" +#include "lv_calendar_chinese_private.h" +#include "lv_calendar_private.h" #if LV_USE_CALENDAR && LV_USE_CALENDAR_CHINESE /********************* diff --git a/src/widgets/calendar/lv_calendar_chinese.h b/src/widgets/calendar/lv_calendar_chinese.h index 4e469ed37..8d5b174ab 100644 --- a/src/widgets/calendar/lv_calendar_chinese.h +++ b/src/widgets/calendar/lv_calendar_chinese.h @@ -14,21 +14,13 @@ extern "C" { * INCLUDES *********************/ #include "../../core/lv_obj.h" +#include "lv_calendar.h" #if LV_USE_CALENDAR && LV_USE_CALENDAR_CHINESE /********************* * DEFINES *********************/ -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_calendar_date_t today; - bool leep_month; -} lv_calendar_chinese_t; - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/widgets/calendar/lv_calendar_chinese_private.h b/src/widgets/calendar/lv_calendar_chinese_private.h new file mode 100644 index 000000000..5572259e2 --- /dev/null +++ b/src/widgets/calendar/lv_calendar_chinese_private.h @@ -0,0 +1,53 @@ +/** + * @file lv_calendar_chinese_private.h + * + */ + +#ifndef LV_CALENDAR_CHINESE_PRIVATE_H +#define LV_CALENDAR_CHINESE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_calendar_chinese.h" + +#if LV_USE_CALENDAR && LV_USE_CALENDAR_CHINESE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_calendar_chinese_t { + lv_calendar_date_t today; + bool leep_month; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_CALENDAR && LV_USE_CALENDAR_CHINESE */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CALENDAR_CHINESE_PRIVATE_H*/ diff --git a/src/widgets/calendar/lv_calendar_header_arrow.c b/src/widgets/calendar/lv_calendar_header_arrow.c index 3a8eeaa1a..09b201d04 100644 --- a/src/widgets/calendar/lv_calendar_header_arrow.c +++ b/src/widgets/calendar/lv_calendar_header_arrow.c @@ -6,6 +6,7 @@ /********************* * INCLUDES *********************/ +#include "../../core/lv_obj_class_private.h" #include "lv_calendar_header_arrow.h" #if LV_USE_CALENDAR && LV_USE_CALENDAR_HEADER_ARROW diff --git a/src/widgets/calendar/lv_calendar_header_dropdown.c b/src/widgets/calendar/lv_calendar_header_dropdown.c index 8b22609de..41fe53a82 100644 --- a/src/widgets/calendar/lv_calendar_header_dropdown.c +++ b/src/widgets/calendar/lv_calendar_header_dropdown.c @@ -6,6 +6,7 @@ /********************* * INCLUDES *********************/ +#include "../../core/lv_obj_class_private.h" #include "lv_calendar_header_dropdown.h" #if LV_USE_CALENDAR && LV_USE_CALENDAR_HEADER_DROPDOWN diff --git a/src/widgets/calendar/lv_calendar_private.h b/src/widgets/calendar/lv_calendar_private.h new file mode 100644 index 000000000..9150a9411 --- /dev/null +++ b/src/widgets/calendar/lv_calendar_private.h @@ -0,0 +1,70 @@ +/** + * @file lv_calendar_private.h + * + */ + +#ifndef LV_CALENDAR_PRIVATE_H +#define LV_CALENDAR_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_calendar.h" + +#if LV_USE_CALENDAR + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of calendar*/ +struct lv_calendar_t { + lv_obj_t obj; + /*New data for this type*/ + lv_obj_t * btnm; + lv_calendar_date_t today; /**< Date of today*/ + lv_calendar_date_t showed_date; /**< Currently visible month (day is ignored)*/ + lv_calendar_date_t * highlighted_dates; /**< Apply different style on these days (pointer to user-defined array)*/ + size_t highlighted_dates_num; /**< Number of elements in `highlighted_days`*/ + const char * map[8 * 7]; +#ifdef LV_USE_CALENDAR_CHINESE + bool use_chinese_calendar; + + /* 7 * 6: A week has 7 days, and the calendar displays 6 weeks in total. + 20: Including the number of dates, line breaks, names for each day, + and reserving several spaces for addresses.*/ + char nums [7 * 6][20]; +#else + /* 7 * 6: A week has 7 days, and the calendar displays 6 weeks in total. + 6: Including the number of dates, and reserving several spaces for + addresses.*/ + char nums [7 * 6][4]; +#endif +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_CALENDAR */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CALENDAR_PRIVATE_H*/ diff --git a/src/widgets/canvas/lv_canvas.c b/src/widgets/canvas/lv_canvas.c index b3823fc71..a34886588 100644 --- a/src/widgets/canvas/lv_canvas.c +++ b/src/widgets/canvas/lv_canvas.c @@ -6,11 +6,12 @@ /********************* * INCLUDES *********************/ -#include "lv_canvas.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_canvas_private.h" #if LV_USE_CANVAS != 0 #include "../../misc/lv_assert.h" #include "../../misc/lv_math.h" -#include "../../draw/lv_draw.h" +#include "../../draw/lv_draw_private.h" #include "../../core/lv_refr.h" #include "../../display/lv_display.h" #include "../../draw/sw/lv_draw_sw.h" @@ -392,6 +393,11 @@ void lv_canvas_finish_layer(lv_obj_t * canvas, lv_layer_t * layer) lv_obj_invalidate(canvas); } +uint32_t lv_canvas_buf_size(int32_t w, int32_t h, uint8_t bpp, uint8_t stride) +{ + return (uint32_t)LV_CANVAS_BUF_SIZE(w, h, bpp, stride); +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/widgets/canvas/lv_canvas.h b/src/widgets/canvas/lv_canvas.h index f581294e5..5123f164a 100644 --- a/src/widgets/canvas/lv_canvas.h +++ b/src/widgets/canvas/lv_canvas.h @@ -29,13 +29,6 @@ extern "C" { **********************/ LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_canvas_class; -/*Data of canvas*/ -typedef struct { - lv_image_t img; - lv_draw_buf_t * draw_buf; - lv_draw_buf_t static_buf; -} lv_canvas_t; - /********************** * GLOBAL PROTOTYPES **********************/ @@ -179,10 +172,7 @@ void lv_canvas_finish_layer(lv_obj_t * canvas, lv_layer_t * layer); /** * Just a wrapper to `LV_CANVAS_BUF_SIZE` for bindings. */ -static inline uint32_t lv_canvas_buf_size(int32_t w, int32_t h, uint8_t bpp, uint8_t stride) -{ - return (uint32_t)LV_CANVAS_BUF_SIZE(w, h, bpp, stride); -} +uint32_t lv_canvas_buf_size(int32_t w, int32_t h, uint8_t bpp, uint8_t stride); #endif /*LV_USE_CANVAS*/ diff --git a/src/widgets/canvas/lv_canvas_private.h b/src/widgets/canvas/lv_canvas_private.h new file mode 100644 index 000000000..13dc7ca74 --- /dev/null +++ b/src/widgets/canvas/lv_canvas_private.h @@ -0,0 +1,52 @@ +/** + * @file lv_canvas_private.h + * + */ + +#ifndef LV_CANVAS_PRIVATE_H +#define LV_CANVAS_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../image/lv_image_private.h" +#include "lv_canvas.h" + +#if LV_USE_CANVAS != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of canvas*/ +struct lv_canvas_t { + lv_image_t img; + lv_draw_buf_t * draw_buf; + lv_draw_buf_t static_buf; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_CANVAS != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CANVAS_PRIVATE_H*/ diff --git a/src/widgets/chart/lv_chart.c b/src/widgets/chart/lv_chart.c index 782b7c5a6..9b7dd9ed1 100644 --- a/src/widgets/chart/lv_chart.c +++ b/src/widgets/chart/lv_chart.c @@ -6,7 +6,11 @@ /********************* * INCLUDES *********************/ -#include "lv_chart.h" +#include "../../misc/lv_area_private.h" +#include "../../draw/lv_draw_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_chart_private.h" #if LV_USE_CHART != 0 #include "../../misc/lv_assert.h" @@ -81,7 +85,7 @@ void lv_chart_set_type(lv_obj_t * obj, lv_chart_type_t type) if(chart->type == LV_CHART_TYPE_SCATTER) { lv_chart_series_t * ser; - _LV_LL_READ_BACK(&chart->series_ll, ser) { + LV_LL_READ_BACK(&chart->series_ll, ser) { lv_free(ser->x_points); ser->x_points = NULL; } @@ -89,7 +93,7 @@ void lv_chart_set_type(lv_obj_t * obj, lv_chart_type_t type) if(type == LV_CHART_TYPE_SCATTER) { lv_chart_series_t * ser; - _LV_LL_READ_BACK(&chart->series_ll, ser) { + LV_LL_READ_BACK(&chart->series_ll, ser) { ser->x_points = lv_malloc(sizeof(lv_point_t) * chart->point_cnt); LV_ASSERT_MALLOC(ser->x_points); if(ser->x_points == NULL) return; @@ -112,7 +116,7 @@ void lv_chart_set_point_count(lv_obj_t * obj, uint32_t cnt) if(cnt < 1) cnt = 1; - _LV_LL_READ_BACK(&chart->series_ll, ser) { + LV_LL_READ_BACK(&chart->series_ll, ser) { if(chart->type == LV_CHART_TYPE_SCATTER) { if(!ser->x_ext_buf_assigned) new_points_alloc(obj, ser, cnt, &ser->x_points); } @@ -229,7 +233,7 @@ void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint3 p_out->x = lv_map(ser->x_points[id], chart->xmin[ser->x_axis_sec], chart->xmax[ser->x_axis_sec], 0, w); } else if(chart->type == LV_CHART_TYPE_BAR) { - uint32_t ser_cnt = _lv_ll_get_len(&chart->series_ll); + uint32_t ser_cnt = lv_ll_get_len(&chart->series_ll); int32_t ser_gap = lv_obj_get_style_pad_column(obj, LV_PART_ITEMS); /*Gap between the columns on adjacent X ticks*/ @@ -240,7 +244,7 @@ void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint3 p_out->x = (int32_t)((int32_t)(w - block_w) * id) / (chart->point_cnt - 1); lv_chart_series_t * ser_i = NULL; uint32_t ser_idx = 0; - _LV_LL_READ_BACK(&chart->series_ll, ser_i) { + LV_LL_READ_BACK(&chart->series_ll, ser_i) { if(ser_i == ser) break; ser_idx++; } @@ -286,7 +290,7 @@ lv_chart_series_t * lv_chart_add_series(lv_obj_t * obj, lv_color_t color, lv_cha lv_chart_t * chart = (lv_chart_t *)obj; /* Allocate space for a new series and add it to the chart series linked list */ - lv_chart_series_t * ser = _lv_ll_ins_tail(&chart->series_ll); + lv_chart_series_t * ser = lv_ll_ins_tail(&chart->series_ll); LV_ASSERT_MALLOC(ser); if(ser == NULL) return NULL; @@ -299,7 +303,7 @@ lv_chart_series_t * lv_chart_add_series(lv_obj_t * obj, lv_color_t color, lv_cha LV_ASSERT_MALLOC(ser->x_points); if(NULL == ser->x_points) { lv_free(ser->y_points); - _lv_ll_remove(&chart->series_ll, ser); + lv_ll_remove(&chart->series_ll, ser); lv_free(ser); return NULL; } @@ -309,7 +313,7 @@ lv_chart_series_t * lv_chart_add_series(lv_obj_t * obj, lv_color_t color, lv_cha } if(ser->y_points == NULL) { - _lv_ll_remove(&chart->series_ll, ser); + lv_ll_remove(&chart->series_ll, ser); lv_free(ser); return NULL; } @@ -342,7 +346,7 @@ void lv_chart_remove_series(lv_obj_t * obj, lv_chart_series_t * series) if(!series->y_ext_buf_assigned && series->y_points) lv_free(series->y_points); if(!series->x_ext_buf_assigned && series->x_points) lv_free(series->x_points); - _lv_ll_remove(&chart->series_ll, series); + lv_ll_remove(&chart->series_ll, series); lv_free(series); return; @@ -366,6 +370,15 @@ void lv_chart_set_series_color(lv_obj_t * chart, lv_chart_series_t * series, lv_ lv_chart_refresh(chart); } +lv_color_t lv_chart_get_series_color(lv_obj_t * chart, const lv_chart_series_t * series) +{ + LV_ASSERT_OBJ(chart, MY_CLASS); + LV_ASSERT_NULL(series); + LV_UNUSED(chart); + + return series->color; +} + void lv_chart_set_x_start_point(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id) { LV_ASSERT_OBJ(obj, MY_CLASS); @@ -381,8 +394,8 @@ lv_chart_series_t * lv_chart_get_series_next(const lv_obj_t * obj, const lv_char LV_ASSERT_OBJ(obj, MY_CLASS); lv_chart_t * chart = (lv_chart_t *)obj; - if(ser == NULL) return _lv_ll_get_head(&chart->series_ll); - else return _lv_ll_get_next(&chart->series_ll, ser); + if(ser == NULL) return lv_ll_get_head(&chart->series_ll); + else return lv_ll_get_next(&chart->series_ll, ser); } /*===================== @@ -394,7 +407,7 @@ lv_chart_cursor_t * lv_chart_add_cursor(lv_obj_t * obj, lv_color_t color, lv_di LV_ASSERT_OBJ(obj, MY_CLASS); lv_chart_t * chart = (lv_chart_t *)obj; - lv_chart_cursor_t * cursor = _lv_ll_ins_head(&chart->cursor_ll); + lv_chart_cursor_t * cursor = lv_ll_ins_head(&chart->cursor_ll); LV_ASSERT_MALLOC(cursor); if(cursor == NULL) return NULL; @@ -587,8 +600,8 @@ static void lv_chart_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) lv_chart_t * chart = (lv_chart_t *)obj; - _lv_ll_init(&chart->series_ll, sizeof(lv_chart_series_t)); - _lv_ll_init(&chart->cursor_ll, sizeof(lv_chart_cursor_t)); + lv_ll_init(&chart->series_ll, sizeof(lv_chart_series_t)); + lv_ll_init(&chart->cursor_ll, sizeof(lv_chart_cursor_t)); chart->ymin[0] = 0; chart->xmin[0] = 0; @@ -617,24 +630,24 @@ static void lv_chart_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) lv_chart_t * chart = (lv_chart_t *)obj; lv_chart_series_t * ser; while(chart->series_ll.head) { - ser = _lv_ll_get_head(&chart->series_ll); + ser = lv_ll_get_head(&chart->series_ll); if(!ser) continue; if(!ser->y_ext_buf_assigned) lv_free(ser->y_points); if(!ser->x_ext_buf_assigned) lv_free(ser->x_points); - _lv_ll_remove(&chart->series_ll, ser); + lv_ll_remove(&chart->series_ll, ser); lv_free(ser); } - _lv_ll_clear(&chart->series_ll); + lv_ll_clear(&chart->series_ll); lv_chart_cursor_t * cur; while(chart->cursor_ll.head) { - cur = _lv_ll_get_head(&chart->cursor_ll); - _lv_ll_remove(&chart->cursor_ll, cur); + cur = lv_ll_get_head(&chart->cursor_ll); + lv_ll_remove(&chart->cursor_ll, cur); lv_free(cur); } - _lv_ll_clear(&chart->cursor_ll); + lv_ll_clear(&chart->cursor_ll); LV_TRACE_OBJ_CREATE("finished"); } @@ -675,7 +688,7 @@ static void lv_chart_event(const lv_obj_class_t * class_p, lv_event_t * e) lv_layer_t * layer = lv_event_get_layer(e); draw_div_lines(obj, layer); - if(_lv_ll_is_empty(&chart->series_ll) == false) { + if(lv_ll_is_empty(&chart->series_ll) == false) { if(chart->type == LV_CHART_TYPE_LINE) draw_series_line(obj, layer); else if(chart->type == LV_CHART_TYPE_BAR) draw_series_bar(obj, layer); else if(chart->type == LV_CHART_TYPE_SCATTER) draw_series_scatter(obj, layer); @@ -690,7 +703,7 @@ static void draw_div_lines(lv_obj_t * obj, lv_layer_t * layer) lv_chart_t * chart = (lv_chart_t *)obj; lv_area_t series_clip_area; - bool mask_ret = _lv_area_intersect(&series_clip_area, &obj->coords, &layer->_clip_area); + bool mask_ret = lv_area_intersect(&series_clip_area, &obj->coords, &layer->_clip_area); if(mask_ret == false) return; const lv_area_t clip_area_ori = layer->_clip_area; @@ -764,7 +777,7 @@ static void draw_div_lines(lv_obj_t * obj, lv_layer_t * layer) static void draw_series_line(lv_obj_t * obj, lv_layer_t * layer) { lv_area_t clip_area; - if(_lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area) == false) return; + if(lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area) == false) return; const lv_area_t clip_area_ori = layer->_clip_area; layer->_clip_area = clip_area; @@ -783,7 +796,7 @@ static void draw_series_line(lv_obj_t * obj, lv_layer_t * layer) lv_chart_series_t * ser; lv_area_t series_clip_area; - bool mask_ret = _lv_area_intersect(&series_clip_area, &obj->coords, &layer->_clip_area); + bool mask_ret = lv_area_intersect(&series_clip_area, &obj->coords, &layer->_clip_area); if(mask_ret == false) return; lv_draw_line_dsc_t line_dsc; @@ -804,10 +817,10 @@ static void draw_series_line(lv_obj_t * obj, lv_layer_t * layer) /*If there are at least as many points as pixels then draw only vertical lines*/ bool crowded_mode = (int32_t)chart->point_cnt >= w; - line_dsc.base.id1 = _lv_ll_get_len(&chart->series_ll) - 1; + line_dsc.base.id1 = lv_ll_get_len(&chart->series_ll) - 1; point_dsc_default.base.id1 = line_dsc.base.id1; /*Go through all data lines*/ - _LV_LL_READ_BACK(&chart->series_ll, ser) { + LV_LL_READ_BACK(&chart->series_ll, ser) { if(ser->hidden) { line_dsc.base.id1--; point_dsc_default.base.id1--; @@ -918,7 +931,7 @@ static void draw_series_scatter(lv_obj_t * obj, lv_layer_t * layer) { lv_area_t clip_area; - if(_lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area) == false) return; + if(lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area) == false) return; const lv_area_t clip_area_ori = layer->_clip_area; layer->_clip_area = clip_area; @@ -951,7 +964,7 @@ static void draw_series_scatter(lv_obj_t * obj, lv_layer_t * layer) if(line_dsc.width == 1) line_dsc.raw_end = 1; /*Go through all data lines*/ - _LV_LL_READ_BACK(&chart->series_ll, ser) { + LV_LL_READ_BACK(&chart->series_ll, ser) { if(ser->hidden) continue; line_dsc.color = ser->color; point_dsc_default.bg_color = ser->color; @@ -1038,7 +1051,7 @@ static void draw_series_scatter(lv_obj_t * obj, lv_layer_t * layer) static void draw_series_bar(lv_obj_t * obj, lv_layer_t * layer) { lv_area_t clip_area; - if(_lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area) == false) return; + if(lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area) == false) return; const lv_area_t clip_area_ori = layer->_clip_area; layer->_clip_area = clip_area; @@ -1053,7 +1066,7 @@ static void draw_series_bar(lv_obj_t * obj, lv_layer_t * layer) int32_t h = lv_obj_get_content_height(obj); int32_t y_tmp; lv_chart_series_t * ser; - uint32_t ser_cnt = _lv_ll_get_len(&chart->series_ll); + uint32_t ser_cnt = lv_ll_get_len(&chart->series_ll); int32_t block_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); /*Gap between the column on ~adjacent X*/ int32_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; int32_t ser_gap = lv_obj_get_style_pad_column(obj, LV_PART_ITEMS); /*Gap between the columns on the ~same X*/ @@ -1080,7 +1093,7 @@ static void draw_series_bar(lv_obj_t * obj, lv_layer_t * layer) col_dsc.base.id1 = 0; /*Draw the current point of all data line*/ - _LV_LL_READ(&chart->series_ll, ser) { + LV_LL_READ(&chart->series_ll, ser) { if(ser->hidden) continue; int32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; @@ -1116,10 +1129,10 @@ static void draw_cursors(lv_obj_t * obj, lv_layer_t * layer) LV_ASSERT_OBJ(obj, MY_CLASS); lv_chart_t * chart = (lv_chart_t *)obj; - if(_lv_ll_is_empty(&chart->cursor_ll)) return; + if(lv_ll_is_empty(&chart->cursor_ll)) return; lv_area_t clip_area; - if(!_lv_area_intersect(&clip_area, &layer->_clip_area, &obj->coords)) return; + if(!lv_area_intersect(&clip_area, &layer->_clip_area, &obj->coords)) return; const lv_area_t clip_area_ori = layer->_clip_area; layer->_clip_area = clip_area; @@ -1141,7 +1154,7 @@ static void draw_cursors(lv_obj_t * obj, lv_layer_t * layer) int32_t point_h = lv_obj_get_style_width(obj, LV_PART_CURSOR) / 2; /*Go through all cursor lines*/ - _LV_LL_READ_BACK(&chart->cursor_ll, cursor) { + LV_LL_READ_BACK(&chart->cursor_ll, cursor) { lv_memcpy(&line_dsc, &line_dsc_ori, sizeof(lv_draw_line_dsc_t)); lv_memcpy(&point_dsc_tmp, &point_dsc_ori, sizeof(lv_draw_rect_dsc_t)); line_dsc.color = cursor->color; diff --git a/src/widgets/chart/lv_chart.h b/src/widgets/chart/lv_chart.h index a010bfda4..de2583146 100644 --- a/src/widgets/chart/lv_chart.h +++ b/src/widgets/chart/lv_chart.h @@ -33,89 +33,31 @@ LV_EXPORT_CONST_INT(LV_CHART_POINT_NONE); /** * Chart types */ -enum _lv_chart_type_t { +typedef enum { LV_CHART_TYPE_NONE, /**< Don't draw the series*/ LV_CHART_TYPE_LINE, /**< Connect the points with lines*/ LV_CHART_TYPE_BAR, /**< Draw columns*/ LV_CHART_TYPE_SCATTER, /**< Draw points and lines in 2D (x,y coordinates)*/ -}; - -#ifdef DOXYGEN -typedef _lv_chart_type_t lv_chart_type_t; -#else -typedef uint8_t lv_chart_type_t; -#endif /*DOXYGEN*/ +} lv_chart_type_t; /** * Chart update mode for `lv_chart_set_next` */ -enum _lv_chart_update_mode_t { +typedef enum { LV_CHART_UPDATE_MODE_SHIFT, /**< Shift old data to the left and add the new one the right*/ LV_CHART_UPDATE_MODE_CIRCULAR, /**< Add the new data in a circular way*/ -}; - -#ifdef DOXYGEN -typedef _lv_chart_update_mode_t lv_chart_update_mode_t; -#else -typedef uint8_t lv_chart_update_mode_t; -#endif /*DOXYGEN*/ +} lv_chart_update_mode_t; /** * Enumeration of the axis' */ -enum _lv_chart_axis_t { +typedef enum { LV_CHART_AXIS_PRIMARY_Y = 0x00, LV_CHART_AXIS_SECONDARY_Y = 0x01, LV_CHART_AXIS_PRIMARY_X = 0x02, LV_CHART_AXIS_SECONDARY_X = 0x04, - _LV_CHART_AXIS_LAST -}; - -#ifdef DOXYGEN -typedef _lv_chart_axis_t lv_chart_axis_t; -#else -typedef uint8_t lv_chart_axis_t; -#endif /*DOXYGEN*/ - -/** - * Descriptor a chart series - */ -typedef struct { - int32_t * x_points; - int32_t * y_points; - lv_color_t color; - uint32_t start_point; - uint32_t hidden : 1; - uint32_t x_ext_buf_assigned : 1; - uint32_t y_ext_buf_assigned : 1; - uint32_t x_axis_sec : 1; - uint32_t y_axis_sec : 1; -} lv_chart_series_t; - -typedef struct { - lv_point_t pos; - int32_t point_id; - lv_color_t color; - lv_chart_series_t * ser; - lv_dir_t dir; - uint32_t pos_set: 1; /*1: pos is set; 0: point_id is set*/ -} lv_chart_cursor_t; - -typedef struct { - lv_obj_t obj; - lv_ll_t series_ll; /**< Linked list for the series (stores lv_chart_series_t)*/ - lv_ll_t cursor_ll; /**< Linked list for the cursors (stores lv_chart_cursor_t)*/ - int32_t ymin[2]; - int32_t ymax[2]; - int32_t xmin[2]; - int32_t xmax[2]; - int32_t pressed_point_id; - uint32_t hdiv_cnt; /**< Number of horizontal division lines*/ - uint32_t vdiv_cnt; /**< Number of vertical division lines*/ - uint32_t point_cnt; /**< Point number in a data line*/ - lv_chart_type_t type : 3; /**< Line or column chart*/ - lv_chart_update_mode_t update_mode : 1; -} lv_chart_t; + LV_CHART_AXIS_LAST +} lv_chart_axis_t; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_chart_class; @@ -240,6 +182,14 @@ void lv_chart_hide_series(lv_obj_t * chart, lv_chart_series_t * series, bool hid */ void lv_chart_set_series_color(lv_obj_t * chart, lv_chart_series_t * series, lv_color_t color); +/** + * Get the color of a series + * @param chart pointer to a chart object. + * @param series pointer to a series object + * @return the color of the series + */ +lv_color_t lv_chart_get_series_color(lv_obj_t * chart, const lv_chart_series_t * series); + /** * Set the index of the x-axis start point in the data array. * This point will be considers the first (left) point and the other points will be drawn after it. diff --git a/src/widgets/chart/lv_chart_private.h b/src/widgets/chart/lv_chart_private.h new file mode 100644 index 000000000..224050737 --- /dev/null +++ b/src/widgets/chart/lv_chart_private.h @@ -0,0 +1,85 @@ +/** + * @file lv_chart_private.h + * + */ + +#ifndef LV_CHART_PRIVATE_H +#define LV_CHART_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_chart.h" + +#if LV_USE_CHART != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Descriptor a chart series + */ +struct lv_chart_series_t { + int32_t * x_points; + int32_t * y_points; + lv_color_t color; + uint32_t start_point; + uint32_t hidden : 1; + uint32_t x_ext_buf_assigned : 1; + uint32_t y_ext_buf_assigned : 1; + uint32_t x_axis_sec : 1; + uint32_t y_axis_sec : 1; +}; + +struct lv_chart_cursor_t { + lv_point_t pos; + int32_t point_id; + lv_color_t color; + lv_chart_series_t * ser; + lv_dir_t dir; + uint32_t pos_set: 1; /*1: pos is set; 0: point_id is set*/ +}; + +struct lv_chart_t { + lv_obj_t obj; + lv_ll_t series_ll; /**< Linked list for the series (stores lv_chart_series_t)*/ + lv_ll_t cursor_ll; /**< Linked list for the cursors (stores lv_chart_cursor_t)*/ + int32_t ymin[2]; + int32_t ymax[2]; + int32_t xmin[2]; + int32_t xmax[2]; + int32_t pressed_point_id; + uint32_t hdiv_cnt; /**< Number of horizontal division lines*/ + uint32_t vdiv_cnt; /**< Number of vertical division lines*/ + uint32_t point_cnt; /**< Point number in a data line*/ + lv_chart_type_t type : 3; /**< Line or column chart*/ + lv_chart_update_mode_t update_mode : 1; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_CHART != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CHART_PRIVATE_H*/ diff --git a/src/widgets/checkbox/lv_checkbox.c b/src/widgets/checkbox/lv_checkbox.c index ae42e7810..84715da61 100644 --- a/src/widgets/checkbox/lv_checkbox.c +++ b/src/widgets/checkbox/lv_checkbox.c @@ -6,7 +6,9 @@ /********************* * INCLUDES *********************/ -#include "lv_checkbox.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_checkbox_private.h" #if LV_USE_CHECKBOX != 0 #include "../../misc/lv_assert.h" @@ -75,7 +77,7 @@ void lv_checkbox_set_text(lv_obj_t * obj, const char * txt) size_t len; #if LV_USE_ARABIC_PERSIAN_CHARS - len = _lv_text_ap_calc_bytes_count(txt) + 1; + len = lv_text_ap_calc_bytes_count(txt) + 1; #else len = lv_strlen(txt) + 1; #endif @@ -87,7 +89,7 @@ void lv_checkbox_set_text(lv_obj_t * obj, const char * txt) if(NULL == cb->txt) return; #if LV_USE_ARABIC_PERSIAN_CHARS - _lv_text_ap_proc(txt, cb->txt); + lv_text_ap_proc(txt, cb->txt); #else lv_strcpy(cb->txt, txt); #endif diff --git a/src/widgets/checkbox/lv_checkbox.h b/src/widgets/checkbox/lv_checkbox.h index 25ba35946..804ff600f 100644 --- a/src/widgets/checkbox/lv_checkbox.h +++ b/src/widgets/checkbox/lv_checkbox.h @@ -22,16 +22,6 @@ extern "C" { * DEFINES *********************/ -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_obj_t obj; - char * txt; - uint32_t static_txt : 1; -} lv_checkbox_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_checkbox_class; /********************** diff --git a/src/widgets/checkbox/lv_checkbox_private.h b/src/widgets/checkbox/lv_checkbox_private.h new file mode 100644 index 000000000..dabc05d18 --- /dev/null +++ b/src/widgets/checkbox/lv_checkbox_private.h @@ -0,0 +1,54 @@ +/** + * @file lv_checkbox_private.h + * + */ + +#ifndef LV_CHECKBOX_PRIVATE_H +#define LV_CHECKBOX_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_checkbox.h" + +#if LV_USE_CHECKBOX != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_checkbox_t { + lv_obj_t obj; + char * txt; + uint32_t static_txt : 1; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_CHECKBOX != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CHECKBOX_PRIVATE_H*/ diff --git a/src/widgets/dropdown/lv_dropdown.c b/src/widgets/dropdown/lv_dropdown.c index 7a554bd32..38e136c6c 100644 --- a/src/widgets/dropdown/lv_dropdown.c +++ b/src/widgets/dropdown/lv_dropdown.c @@ -6,12 +6,14 @@ /********************* * INCLUDES *********************/ +#include "../../misc/lv_area_private.h" +#include "../../core/lv_obj_class_private.h" #include "../../core/lv_obj.h" -#include "lv_dropdown.h" +#include "lv_dropdown_private.h" #if LV_USE_DROPDOWN != 0 #include "../../misc/lv_assert.h" -#include "../../draw/lv_draw.h" +#include "../../draw/lv_draw_private.h" #include "../../core/lv_group.h" #include "../../indev/lv_indev.h" #include "../../display/lv_display.h" @@ -135,7 +137,7 @@ void lv_dropdown_set_options(lv_obj_t * obj, const char * options) #if LV_USE_ARABIC_PERSIAN_CHARS == 0 size_t len = lv_strlen(options) + 1; #else - size_t len = _lv_text_ap_calc_bytes_count(options) + 1; + size_t len = lv_text_ap_calc_bytes_count(options) + 1; #endif if(dropdown->options != NULL && dropdown->static_txt == 0) { @@ -151,7 +153,7 @@ void lv_dropdown_set_options(lv_obj_t * obj, const char * options) #if LV_USE_ARABIC_PERSIAN_CHARS == 0 lv_strcpy(dropdown->options, options); #else - _lv_text_ap_proc(options, dropdown->options); + lv_text_ap_proc(options, dropdown->options); #endif /*Now the text is dynamically allocated*/ @@ -211,7 +213,7 @@ void lv_dropdown_add_option(lv_obj_t * obj, const char * option, uint32_t pos) #if LV_USE_ARABIC_PERSIAN_CHARS == 0 size_t ins_len = lv_strlen(option) + 1; #else - size_t ins_len = _lv_text_ap_calc_bytes_count(option) + 1; + size_t ins_len = lv_text_ap_calc_bytes_count(option) + 1; #endif size_t new_len = ins_len + old_len + 2; /*+2 for terminating NULL and possible \n*/ @@ -244,7 +246,7 @@ void lv_dropdown_add_option(lv_obj_t * obj, const char * option, uint32_t pos) #if LV_USE_ARABIC_PERSIAN_CHARS == 0 lv_strcpy(ins_buf, option); #else - _lv_text_ap_proc(option, ins_buf); + lv_text_ap_proc(option, ins_buf); #endif if(pos < dropdown->option_cnt) lv_strcat(ins_buf, "\n"); @@ -920,7 +922,7 @@ static void draw_list(lv_event_t * e) * the selected option can be drawn on only the background*/ lv_area_t clip_area_core; bool has_common; - has_common = _lv_area_intersect(&clip_area_core, &layer->_clip_area, &dropdown->list->coords); + has_common = lv_area_intersect(&clip_area_core, &layer->_clip_area, &dropdown->list->coords); if(has_common) { const lv_area_t clip_area_ori = layer->_clip_area; layer->_clip_area = clip_area_core; @@ -1017,7 +1019,7 @@ static void draw_box_label(lv_obj_t * dropdown_obj, lv_layer_t * layer, uint32_t area_sel.x2 = list_obj->coords.x2; lv_area_t mask_sel; bool area_ok; - area_ok = _lv_area_intersect(&mask_sel, &layer->_clip_area, &area_sel); + area_ok = lv_area_intersect(&mask_sel, &layer->_clip_area, &area_sel); if(area_ok) { const lv_area_t clip_area_ori = layer->_clip_area; layer->_clip_area = mask_sel; diff --git a/src/widgets/dropdown/lv_dropdown.h b/src/widgets/dropdown/lv_dropdown.h index 614f5f192..528a458f2 100644 --- a/src/widgets/dropdown/lv_dropdown.h +++ b/src/widgets/dropdown/lv_dropdown.h @@ -31,30 +31,6 @@ extern "C" { #define LV_DROPDOWN_POS_LAST 0xFFFF LV_EXPORT_CONST_INT(LV_DROPDOWN_POS_LAST); -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_obj_t obj; - lv_obj_t * list; /**< The dropped down list*/ - const char * text; /**< Text to display on the dropdown's button*/ - const void * symbol; /**< Arrow or other icon when the drop-down list is closed*/ - char * options; /**< Options in a '\n' separated list*/ - uint32_t option_cnt; /**< Number of options*/ - uint32_t sel_opt_id; /**< Index of the currently selected option*/ - uint32_t sel_opt_id_orig; /**< Store the original index on focus*/ - uint32_t pr_opt_id; /**< Index of the currently pressed option*/ - lv_dir_t dir : 4; /**< Direction in which the list should open*/ - uint8_t static_txt : 1; /**< 1: Only a pointer is saved in `options`*/ - uint8_t selected_highlight: 1; /**< 1: Make the selected option highlighted in the list*/ -} lv_dropdown_t; - -typedef struct { - lv_obj_t obj; - lv_obj_t * dropdown; -} lv_dropdown_list_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_dropdown_class; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_dropdownlist_class; diff --git a/src/widgets/dropdown/lv_dropdown_private.h b/src/widgets/dropdown/lv_dropdown_private.h new file mode 100644 index 000000000..67d879aa1 --- /dev/null +++ b/src/widgets/dropdown/lv_dropdown_private.h @@ -0,0 +1,69 @@ +/** + * @file lv_dropdown_private.h + * + */ + +#ifndef LV_DROPDOWN_PRIVATE_H +#define LV_DROPDOWN_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_dropdown.h" + +#if LV_USE_DROPDOWN != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_dropdown_t { + lv_obj_t obj; + lv_obj_t * list; /**< The dropped down list*/ + const char * text; /**< Text to display on the dropdown's button*/ + const void * symbol; /**< Arrow or other icon when the drop-down list is closed*/ + char * options; /**< Options in a '\n' separated list*/ + uint32_t option_cnt; /**< Number of options*/ + uint32_t sel_opt_id; /**< Index of the currently selected option*/ + uint32_t sel_opt_id_orig; /**< Store the original index on focus*/ + uint32_t pr_opt_id; /**< Index of the currently pressed option*/ + uint8_t dir : 4; /**< Direction in which the list should open*/ + uint8_t static_txt : 1; /**< 1: Only a pointer is saved in `options`*/ + uint8_t selected_highlight: 1; /**< 1: Make the selected option highlighted in the list*/ +}; + +struct lv_dropdown_list_t { + lv_obj_t obj; + lv_obj_t * dropdown; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_DROPDOWN != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DROPDOWN_PRIVATE_H*/ diff --git a/src/widgets/image/lv_image.c b/src/widgets/image/lv_image.c index a8af7a7d8..96122d867 100644 --- a/src/widgets/image/lv_image.c +++ b/src/widgets/image/lv_image.c @@ -6,7 +6,12 @@ /********************* * INCLUDES *********************/ -#include "lv_image.h" +#include "../../misc/lv_area_private.h" +#include "../../draw/lv_draw_image_private.h" +#include "../../draw/lv_draw_private.h" +#include "../../core/lv_obj_event_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_image_private.h" #if LV_USE_IMAGE != 0 #include "../../stdlib/lv_string.h" @@ -29,6 +34,10 @@ static void lv_image_event(const lv_obj_class_t * class_p, lv_event_t * e); static void draw_image(lv_event_t * e); static void scale_update(lv_obj_t * obj, int32_t scale_x, int32_t scale_y); static void update_align(lv_obj_t * obj); +#if LV_USE_OBJ_PROPERTY + static void lv_image_set_pivot_helper(lv_obj_t * obj, lv_point_t * pivot); + static lv_point_t lv_image_get_pivot_helper(lv_obj_t * obj); +#endif #if LV_USE_OBJ_PROPERTY static const lv_property_ops_t properties[] = { @@ -54,8 +63,8 @@ static const lv_property_ops_t properties[] = { }, { .id = LV_PROPERTY_IMAGE_PIVOT, - .setter = _lv_image_set_pivot, - .getter = _lv_image_get_pivot, + .setter = lv_image_set_pivot_helper, + .getter = lv_image_get_pivot_helper, }, { .id = LV_PROPERTY_IMAGE_SCALE, @@ -263,7 +272,7 @@ void lv_image_set_rotation(lv_obj_t * obj, int32_t angle) LV_ASSERT_OBJ(obj, MY_CLASS); lv_image_t * img = (lv_image_t *)obj; - if(img->align > _LV_IMAGE_ALIGN_AUTO_TRANSFORM) { + if(img->align > LV_IMAGE_ALIGN_AUTO_TRANSFORM) { angle = 0; } else { @@ -279,7 +288,7 @@ void lv_image_set_rotation(lv_obj_t * obj, int32_t angle) lv_area_t a; lv_point_t pivot_px; lv_image_get_pivot(obj, &pivot_px); - _lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); a.x1 += obj->coords.x1; a.y1 += obj->coords.y1; a.x2 += obj->coords.x1; @@ -295,7 +304,7 @@ void lv_image_set_rotation(lv_obj_t * obj, int32_t angle) lv_obj_refresh_ext_draw_size(obj); lv_display_enable_invalidation(disp, true); - _lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); a.x1 += obj->coords.x1; a.y1 += obj->coords.y1; a.x2 += obj->coords.x1; @@ -308,7 +317,7 @@ void lv_image_set_pivot(lv_obj_t * obj, int32_t x, int32_t y) LV_ASSERT_OBJ(obj, MY_CLASS); lv_image_t * img = (lv_image_t *)obj; - if(img->align > _LV_IMAGE_ALIGN_AUTO_TRANSFORM) { + if(img->align > LV_IMAGE_ALIGN_AUTO_TRANSFORM) { x = 0; y = 0; } @@ -321,7 +330,7 @@ void lv_image_set_pivot(lv_obj_t * obj, int32_t x, int32_t y) lv_area_t a; lv_point_t pivot_px; lv_image_get_pivot(obj, &pivot_px); - _lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); a.x1 += obj->coords.x1; a.y1 += obj->coords.y1; a.x2 += obj->coords.x1; @@ -338,7 +347,7 @@ void lv_image_set_pivot(lv_obj_t * obj, int32_t x, int32_t y) lv_display_enable_invalidation(disp, true); lv_image_get_pivot(obj, &pivot_px); - _lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); a.x1 += obj->coords.x1; a.y1 += obj->coords.y1; a.x2 += obj->coords.x1; @@ -353,7 +362,7 @@ void lv_image_set_scale(lv_obj_t * obj, uint32_t zoom) lv_image_t * img = (lv_image_t *)obj; /*If scale is set internally, do no overwrite it*/ - if(img->align > _LV_IMAGE_ALIGN_AUTO_TRANSFORM) return; + if(img->align > LV_IMAGE_ALIGN_AUTO_TRANSFORM) return; if(zoom == img->scale_x && zoom == img->scale_y) return; @@ -369,7 +378,7 @@ void lv_image_set_scale_x(lv_obj_t * obj, uint32_t zoom) lv_image_t * img = (lv_image_t *)obj; /*If scale is set internally, do no overwrite it*/ - if(img->align > _LV_IMAGE_ALIGN_AUTO_TRANSFORM) return; + if(img->align > LV_IMAGE_ALIGN_AUTO_TRANSFORM) return; if(zoom == img->scale_x) return; @@ -385,7 +394,7 @@ void lv_image_set_scale_y(lv_obj_t * obj, uint32_t zoom) lv_image_t * img = (lv_image_t *)obj; /*If scale is set internally, do no overwrite it*/ - if(img->align > _LV_IMAGE_ALIGN_AUTO_TRANSFORM) return; + if(img->align > LV_IMAGE_ALIGN_AUTO_TRANSFORM) return; if(zoom == img->scale_y) return; @@ -628,7 +637,7 @@ static void lv_image_event(const lv_obj_class_t * class_p, lv_event_t * e) lv_area_t a; int32_t w = lv_obj_get_width(obj); int32_t h = lv_obj_get_height(obj); - _lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); *s = LV_MAX(*s, -a.x1); *s = LV_MAX(*s, -a.y1); *s = LV_MAX(*s, a.x2 - w); @@ -647,18 +656,18 @@ static void lv_image_event(const lv_obj_class_t * class_p, lv_event_t * e) int32_t w = lv_obj_get_width(obj); int32_t h = lv_obj_get_height(obj); lv_area_t coords; - _lv_image_buf_get_transformed_area(&coords, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + lv_image_buf_get_transformed_area(&coords, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); coords.x1 += obj->coords.x1; coords.y1 += obj->coords.y1; coords.x2 += obj->coords.x1; coords.y2 += obj->coords.y1; - info->res = _lv_area_is_point_on(&coords, info->point, 0); + info->res = lv_area_is_point_on(&coords, info->point, 0); } else { lv_area_t a; lv_obj_get_click_area(obj, &a); - info->res = _lv_area_is_point_on(&a, info->point, 0); + info->res = lv_area_is_point_on(&a, info->point, 0); } } else if(code == LV_EVENT_GET_SELF_SIZE) { @@ -702,7 +711,7 @@ static void draw_image(lv_event_t * e) } if(img->scale_x == LV_SCALE_NONE && img->scale_y == LV_SCALE_NONE) { - if(_lv_area_is_in(info->area, &obj->coords, 0) == false) { + if(lv_area_is_in(info->area, &obj->coords, 0) == false) { info->res = LV_COVER_RES_NOT_COVER; return; } @@ -711,14 +720,14 @@ static void draw_image(lv_event_t * e) lv_area_t a; lv_point_t pivot_px; lv_image_get_pivot(obj, &pivot_px); - _lv_image_buf_get_transformed_area(&a, lv_obj_get_width(obj), lv_obj_get_height(obj), 0, img->scale_x, img->scale_y, - &pivot_px); + lv_image_buf_get_transformed_area(&a, lv_obj_get_width(obj), lv_obj_get_height(obj), 0, img->scale_x, img->scale_y, + &pivot_px); a.x1 += obj->coords.x1; a.y1 += obj->coords.y1; a.x2 += obj->coords.x1; a.y2 += obj->coords.y1; - if(_lv_area_is_in(info->area, &a, 0) == false) { + if(lv_area_is_in(info->area, &a, 0) == false) { info->res = LV_COVER_RES_NOT_COVER; return; } @@ -759,12 +768,12 @@ static void draw_image(lv_event_t * e) draw_dsc.clip_radius = lv_obj_get_style_radius(obj, LV_PART_MAIN); lv_area_t coords; - if(img->align < _LV_IMAGE_ALIGN_AUTO_TRANSFORM) { + if(img->align < LV_IMAGE_ALIGN_AUTO_TRANSFORM) { lv_area_align(&obj->coords, &draw_dsc.image_area, img->align, img->offset.x, img->offset.y); coords = draw_dsc.image_area; } else if(img->align == LV_IMAGE_ALIGN_TILE) { - _lv_area_intersect(&layer->_clip_area, &layer->_clip_area, &obj->coords); + lv_area_intersect(&layer->_clip_area, &layer->_clip_area, &obj->coords); lv_area_move(&draw_dsc.image_area, img->offset.x, img->offset.y); lv_area_move(&draw_dsc.image_area, @@ -809,7 +818,7 @@ static void scale_update(lv_obj_t * obj, int32_t scale_x, int32_t scale_y) lv_area_t a; lv_point_t pivot_px; lv_image_get_pivot(obj, &pivot_px); - _lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); a.x1 += obj->coords.x1 - 1; a.y1 += obj->coords.y1 - 1; a.x2 += obj->coords.x1 + 1; @@ -826,7 +835,7 @@ static void scale_update(lv_obj_t * obj, int32_t scale_x, int32_t scale_y) lv_obj_refresh_ext_draw_size(obj); lv_display_enable_invalidation(disp, true); - _lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); a.x1 += obj->coords.x1 - 1; a.y1 += obj->coords.y1 - 1; a.x2 += obj->coords.x1 + 1; @@ -851,4 +860,19 @@ static void update_align(lv_obj_t * obj) } } + +#if LV_USE_OBJ_PROPERTY +static void lv_image_set_pivot_helper(lv_obj_t * obj, lv_point_t * pivot) +{ + lv_image_set_pivot(obj, pivot->x, pivot->y); +} + +static lv_point_t lv_image_get_pivot_helper(lv_obj_t * obj) +{ + lv_point_t pivot; + lv_image_get_pivot(obj, &pivot); + return pivot; +} +#endif + #endif diff --git a/src/widgets/image/lv_image.h b/src/widgets/image/lv_image.h index 8c45ee941..5c2d12a67 100644 --- a/src/widgets/image/lv_image.h +++ b/src/widgets/image/lv_image.h @@ -34,33 +34,12 @@ extern "C" { * TYPEDEFS **********************/ -/** - * Data of image - */ -typedef struct { - lv_obj_t obj; - const void * src; /**< Image source: Pointer to an array or a file or a symbol*/ - const lv_image_dsc_t * bitmap_mask_src; /**< Pointer to an A8 bitmap mask */ - lv_point_t offset; - int32_t w; /**< Width of the image (Handled by the library)*/ - int32_t h; /**< Height of the image (Handled by the library)*/ - uint32_t rotation; /**< Rotation angle of the image*/ - uint32_t scale_x; /**< 256 means no zoom, 512 double size, 128 half size*/ - uint32_t scale_y; /**< 256 means no zoom, 512 double size, 128 half size*/ - lv_point_t pivot; /**< Rotation center of the image*/ - uint32_t src_type : 2; /**< See: lv_image_src_t*/ - uint32_t cf : 5; /**< Color format from `lv_color_format_t`*/ - uint32_t antialias : 1; /**< Apply anti-aliasing in transformations (rotate, zoom)*/ - uint32_t align: 4; /**< Image size mode when image size and object size is different. See lv_image_align_t*/ - uint32_t blend_mode: 4; /**< Element of `lv_blend_mode_t`*/ -} lv_image_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_image_class; /** * Image size mode, when image size and object size is different */ -enum _lv_image_align_t { +typedef enum { LV_IMAGE_ALIGN_DEFAULT = 0, LV_IMAGE_ALIGN_TOP_LEFT, LV_IMAGE_ALIGN_TOP_MID, @@ -71,19 +50,13 @@ enum _lv_image_align_t { LV_IMAGE_ALIGN_LEFT_MID, LV_IMAGE_ALIGN_RIGHT_MID, LV_IMAGE_ALIGN_CENTER, - _LV_IMAGE_ALIGN_AUTO_TRANSFORM, + LV_IMAGE_ALIGN_AUTO_TRANSFORM, LV_IMAGE_ALIGN_STRETCH, LV_IMAGE_ALIGN_TILE, -}; - -#ifdef DOXYGEN -typedef _lv_image_align_t lv_image_align_t; -#else -typedef uint8_t lv_image_align_t; -#endif /*DOXYGEN*/ +} lv_image_align_t; #if LV_USE_OBJ_PROPERTY -enum _lv_image_property_t { +enum lv_image_property_t { LV_PROPERTY_ID(IMAGE, SRC, LV_PROPERTY_TYPE_IMGSRC, 0), LV_PROPERTY_ID(IMAGE, OFFSET_X, LV_PROPERTY_TYPE_INT, 1), LV_PROPERTY_ID(IMAGE, OFFSET_Y, LV_PROPERTY_TYPE_INT, 2), @@ -160,14 +133,6 @@ void lv_image_set_rotation(lv_obj_t * obj, int32_t angle); */ void lv_image_set_pivot(lv_obj_t * obj, int32_t x, int32_t y); -/** - * Set pivot to accept lv_point_t * directly - */ -static inline void _lv_image_set_pivot(lv_obj_t * obj, lv_point_t * pivot) -{ - lv_image_set_pivot(obj, pivot->x, pivot->y); -} - /** * Set the zoom factor of the image. * Note that indexed and alpha only images can't be transformed. @@ -280,16 +245,6 @@ int32_t lv_image_get_rotation(lv_obj_t * obj); */ void lv_image_get_pivot(lv_obj_t * obj, lv_point_t * pivot); -/** - * Get pivot to return lv_point_t directly - */ -static inline lv_point_t _lv_image_get_pivot(lv_obj_t * obj) -{ - lv_point_t pivot; - lv_image_get_pivot(obj, &pivot); - return pivot; -} - /** * Get the zoom factor of the image. * @param obj pointer to an image object diff --git a/src/widgets/image/lv_image_private.h b/src/widgets/image/lv_image_private.h new file mode 100644 index 000000000..e880f5d68 --- /dev/null +++ b/src/widgets/image/lv_image_private.h @@ -0,0 +1,66 @@ +/** + * @file lv_image_private.h + * + */ + +#ifndef LV_IMAGE_PRIVATE_H +#define LV_IMAGE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_image.h" + +#if LV_USE_IMAGE != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Data of image + */ +struct lv_image_t { + lv_obj_t obj; + const void * src; /**< Image source: Pointer to an array or a file or a symbol*/ + const lv_image_dsc_t * bitmap_mask_src; /**< Pointer to an A8 bitmap mask */ + lv_point_t offset; + int32_t w; /**< Width of the image (Handled by the library)*/ + int32_t h; /**< Height of the image (Handled by the library)*/ + uint32_t rotation; /**< Rotation angle of the image*/ + uint32_t scale_x; /**< 256 means no zoom, 512 double size, 128 half size*/ + uint32_t scale_y; /**< 256 means no zoom, 512 double size, 128 half size*/ + lv_point_t pivot; /**< Rotation center of the image*/ + uint32_t src_type : 2; /**< See: lv_image_src_t*/ + uint32_t cf : 5; /**< Color format from `lv_color_format_t`*/ + uint32_t antialias : 1; /**< Apply anti-aliasing in transformations (rotate, zoom)*/ + uint32_t align: 4; /**< Image size mode when image size and object size is different. See lv_image_align_t*/ + uint32_t blend_mode: 4; /**< Element of `lv_blend_mode_t`*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_IMAGE != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGE_PRIVATE_H*/ diff --git a/src/widgets/imagebutton/lv_imagebutton.c b/src/widgets/imagebutton/lv_imagebutton.c index dcecf9534..7a76c4ebd 100644 --- a/src/widgets/imagebutton/lv_imagebutton.c +++ b/src/widgets/imagebutton/lv_imagebutton.c @@ -7,7 +7,12 @@ * INCLUDES *********************/ -#include "lv_imagebutton.h" +#include "../../misc/lv_area_private.h" +#include "../../draw/lv_draw_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_event_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_imagebutton_private.h" #if LV_USE_IMAGEBUTTON != 0 @@ -231,7 +236,7 @@ static void draw_main(lv_event_t * e) coords_part.y2 = coords.y2; lv_area_t clip_area_center; - if(_lv_area_intersect(&clip_area_center, &coords_part, &layer->_clip_area)) { + if(lv_area_intersect(&clip_area_center, &coords_part, &layer->_clip_area)) { lv_area_t clip_area_ori = layer->_clip_area; layer->_clip_area = clip_area_center; img_dsc.src = src_info->img_src; diff --git a/src/widgets/imagebutton/lv_imagebutton.h b/src/widgets/imagebutton/lv_imagebutton.h index 1f91eb682..ed6dc3a5e 100644 --- a/src/widgets/imagebutton/lv_imagebutton.h +++ b/src/widgets/imagebutton/lv_imagebutton.h @@ -27,25 +27,12 @@ typedef enum { LV_IMAGEBUTTON_STATE_CHECKED_RELEASED, LV_IMAGEBUTTON_STATE_CHECKED_PRESSED, LV_IMAGEBUTTON_STATE_CHECKED_DISABLED, - _LV_IMAGEBUTTON_STATE_NUM, + LV_IMAGEBUTTON_STATE_NUM, } lv_imagebutton_state_t; -typedef struct { - const void * img_src; - lv_image_header_t header; -} lv_imagebutton_src_info_t; - /********************** * TYPEDEFS **********************/ -/*Data of image button*/ -typedef struct { - lv_obj_t obj; - lv_imagebutton_src_info_t src_mid[_LV_IMAGEBUTTON_STATE_NUM]; /*Store center images to each state*/ - lv_imagebutton_src_info_t src_left[_LV_IMAGEBUTTON_STATE_NUM]; /*Store left side images to each state*/ - lv_imagebutton_src_info_t src_right[_LV_IMAGEBUTTON_STATE_NUM]; /*Store right side images to each state*/ -} lv_imagebutton_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_imagebutton_class; /********************** diff --git a/src/widgets/imagebutton/lv_imagebutton_private.h b/src/widgets/imagebutton/lv_imagebutton_private.h new file mode 100644 index 000000000..8dc5d42b0 --- /dev/null +++ b/src/widgets/imagebutton/lv_imagebutton_private.h @@ -0,0 +1,57 @@ +/** + * @file lv_imagebutton_private.h + * + */ + +#ifndef LV_IMAGEBUTTON_PRIVATE_H +#define LV_IMAGEBUTTON_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_imagebutton.h" + +#if LV_USE_IMAGEBUTTON != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_imagebutton_src_info_t { + const void * img_src; + lv_image_header_t header; +}; + +/*Data of image button*/ +struct lv_imagebutton_t { + lv_obj_t obj; + lv_imagebutton_src_info_t src_mid[LV_IMAGEBUTTON_STATE_NUM]; /*Store center images to each state*/ + lv_imagebutton_src_info_t src_left[LV_IMAGEBUTTON_STATE_NUM]; /*Store left side images to each state*/ + lv_imagebutton_src_info_t src_right[LV_IMAGEBUTTON_STATE_NUM]; /*Store right side images to each state*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_IMAGEBUTTON != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGEBUTTON_PRIVATE_H*/ diff --git a/src/widgets/keyboard/lv_keyboard.c b/src/widgets/keyboard/lv_keyboard.c index a2bd3bb9a..801186a13 100644 --- a/src/widgets/keyboard/lv_keyboard.c +++ b/src/widgets/keyboard/lv_keyboard.c @@ -7,7 +7,8 @@ /********************* * INCLUDES *********************/ -#include "lv_keyboard.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_keyboard_private.h" #if LV_USE_KEYBOARD #include "../textarea/lv_textarea.h" @@ -206,7 +207,7 @@ void lv_keyboard_set_textarea(lv_obj_t * obj, lv_obj_t * ta) /*Show the cursor of the new Text area if cursor management is enabled*/ if(keyboard->ta) { - lv_obj_add_flag(obj, LV_STATE_FOCUSED); + lv_obj_add_state(obj, LV_STATE_FOCUSED); } } @@ -373,6 +374,21 @@ void lv_keyboard_def_event_cb(lv_event_t * e) } } +const char ** lv_keyboard_get_map_array(const lv_obj_t * kb) +{ + return lv_buttonmatrix_get_map(kb); +} + +uint32_t lv_keyboard_get_selected_button(const lv_obj_t * obj) +{ + return lv_buttonmatrix_get_selected_button(obj); +} + +const char * lv_keyboard_get_button_text(const lv_obj_t * obj, uint32_t btn_id) +{ + return lv_buttonmatrix_get_button_text(obj, btn_id); +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/widgets/keyboard/lv_keyboard.h b/src/widgets/keyboard/lv_keyboard.h index 3b916c7e1..4f90d5814 100644 --- a/src/widgets/keyboard/lv_keyboard.h +++ b/src/widgets/keyboard/lv_keyboard.h @@ -36,7 +36,7 @@ extern "C" { **********************/ /** Current keyboard mode.*/ -enum _lv_keyboard_mode_t { +typedef enum { LV_KEYBOARD_MODE_TEXT_LOWER, LV_KEYBOARD_MODE_TEXT_UPPER, LV_KEYBOARD_MODE_SPECIAL, @@ -48,21 +48,7 @@ enum _lv_keyboard_mode_t { #if LV_USE_ARABIC_PERSIAN_CHARS == 1 LV_KEYBOARD_MODE_TEXT_ARABIC #endif -}; - -#ifdef DOXYGEN -typedef _lv_keyboard_mode_t lv_keyboard_mode_t; -#else -typedef uint8_t lv_keyboard_mode_t; -#endif /*DOXYGEN*/ - -/*Data of keyboard*/ -typedef struct { - lv_buttonmatrix_t btnm; - lv_obj_t * ta; /*Pointer to the assigned text area*/ - lv_keyboard_mode_t mode; /*Key map type*/ - uint8_t popovers : 1; /*Show button titles in popovers on press*/ -} lv_keyboard_t; +} lv_keyboard_mode_t; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_keyboard_class; @@ -144,10 +130,7 @@ bool lv_buttonmatrix_get_popovers(const lv_obj_t * obj); * @param kb pointer to a keyboard object * @return the current map */ -static inline const char ** lv_keyboard_get_map_array(const lv_obj_t * kb) -{ - return lv_buttonmatrix_get_map(kb); -} +const char ** lv_keyboard_get_map_array(const lv_obj_t * kb); /** * Get the index of the lastly "activated" button by the user (pressed, released, focused etc) @@ -155,10 +138,7 @@ static inline const char ** lv_keyboard_get_map_array(const lv_obj_t * kb) * @param obj pointer to button matrix object * @return index of the last released button (LV_BUTTONMATRIX_BUTTON_NONE: if unset) */ -static inline uint32_t lv_keyboard_get_selected_button(const lv_obj_t * obj) -{ - return lv_buttonmatrix_get_selected_button(obj); -} +uint32_t lv_keyboard_get_selected_button(const lv_obj_t * obj); /** * Get the button's text @@ -166,10 +146,7 @@ static inline uint32_t lv_keyboard_get_selected_button(const lv_obj_t * obj) * @param btn_id the index a button not counting new line characters. * @return text of btn_index` button */ -static inline const char * lv_keyboard_get_button_text(const lv_obj_t * obj, uint32_t btn_id) -{ - return lv_buttonmatrix_get_button_text(obj, btn_id); -} +const char * lv_keyboard_get_button_text(const lv_obj_t * obj, uint32_t btn_id); /*===================== * Other functions diff --git a/src/widgets/keyboard/lv_keyboard_private.h b/src/widgets/keyboard/lv_keyboard_private.h new file mode 100644 index 000000000..8bb206ab2 --- /dev/null +++ b/src/widgets/keyboard/lv_keyboard_private.h @@ -0,0 +1,53 @@ +/** + * @file lv_keyboard_private.h + * + */ + +#ifndef LV_KEYBOARD_PRIVATE_H +#define LV_KEYBOARD_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../buttonmatrix/lv_buttonmatrix_private.h" +#include "lv_keyboard.h" + +#if LV_USE_KEYBOARD + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of keyboard*/ +struct lv_keyboard_t { + lv_buttonmatrix_t btnm; + lv_obj_t * ta; /*Pointer to the assigned text area*/ + lv_keyboard_mode_t mode; /*Key map type*/ + uint8_t popovers : 1; /*Show button titles in popovers on press*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_KEYBOARD */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_KEYBOARD_PRIVATE_H*/ diff --git a/src/widgets/label/lv_label.c b/src/widgets/label/lv_label.c index a358f763a..c99ade155 100644 --- a/src/widgets/label/lv_label.c +++ b/src/widgets/label/lv_label.c @@ -6,16 +6,20 @@ /********************* * INCLUDES *********************/ -#include "lv_label.h" +#include "../../misc/lv_area_private.h" +#include "../../misc/lv_anim_private.h" +#include "../../draw/lv_draw_label_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_label_private.h" #if LV_USE_LABEL != 0 -#include "../../core/lv_obj.h" +#include "../../core/lv_obj_private.h" #include "../../misc/lv_assert.h" #include "../../core/lv_group.h" #include "../../display/lv_display.h" -#include "../../draw/lv_draw.h" +#include "../../draw/lv_draw_private.h" #include "../../misc/lv_color.h" #include "../../misc/lv_math.h" -#include "../../misc/lv_bidi.h" +#include "../../misc/lv_bidi_private.h" #include "../../misc/lv_text_ap.h" #include "../../misc/lv_text_private.h" #include "../../stdlib/lv_sprintf.h" @@ -147,7 +151,7 @@ void lv_label_set_text(lv_obj_t * obj, const char * text) if(label->text == NULL) return; #if LV_USE_ARABIC_PERSIAN_CHARS - _lv_text_ap_proc(label->text, label->text); + lv_text_ap_proc(label->text, label->text); #endif } @@ -357,7 +361,7 @@ void lv_label_get_letter_pos(const lv_obj_t * obj, uint32_t char_id, lv_point_t uint32_t visual_byte_pos; #if LV_USE_BIDI lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); - if(base_dir == LV_BASE_DIR_AUTO) base_dir = _lv_bidi_detect_base_dir(txt); + if(base_dir == LV_BASE_DIR_AUTO) base_dir = lv_bidi_detect_base_dir(txt); char * mutable_bidi_txt = NULL; /*Handle Bidi*/ @@ -369,8 +373,8 @@ void lv_label_get_letter_pos(const lv_obj_t * obj, uint32_t char_id, lv_point_t uint32_t line_char_id = lv_text_encoded_get_char_id(&txt[line_start], byte_id - line_start); bool is_rtl; - uint32_t visual_char_pos = _lv_bidi_get_visual_pos(&txt[line_start], &mutable_bidi_txt, new_line_start - line_start, - base_dir, line_char_id, &is_rtl); + uint32_t visual_char_pos = lv_bidi_get_visual_pos(&txt[line_start], &mutable_bidi_txt, new_line_start - line_start, + base_dir, line_char_id, &is_rtl); bidi_txt = mutable_bidi_txt; if(is_rtl) visual_char_pos++; @@ -452,7 +456,7 @@ uint32_t lv_label_get_letter_on(const lv_obj_t * obj, lv_point_t * pos_in, bool bidi_txt = lv_malloc(new_line_start - line_start + 1); txt_len = new_line_start - line_start; if(new_line_start > 0 && txt[new_line_start - 1] == '\0' && txt_len > 0) txt_len--; - _lv_bidi_process_paragraph(txt + line_start, bidi_txt, txt_len, lv_obj_get_style_base_dir(obj, LV_PART_MAIN), NULL, 0); + lv_bidi_process_paragraph(txt + line_start, bidi_txt, txt_len, lv_obj_get_style_base_dir(obj, LV_PART_MAIN), NULL, 0); } else #endif @@ -500,8 +504,8 @@ uint32_t lv_label_get_letter_on(const lv_obj_t * obj, lv_point_t * pos_in, bool } else { bool is_rtl; - logical_pos = _lv_bidi_get_logical_pos(&txt[line_start], NULL, - txt_len, lv_obj_get_style_base_dir(obj, LV_PART_MAIN), cid, &is_rtl); + logical_pos = lv_bidi_get_logical_pos(&txt[line_start], NULL, + txt_len, lv_obj_get_style_base_dir(obj, LV_PART_MAIN), cid, &is_rtl); if(is_rtl) logical_pos++; } lv_free(bidi_txt); @@ -811,7 +815,7 @@ static void draw_main(lv_event_t * e) } lv_area_t txt_clip; - bool is_common = _lv_area_intersect(&txt_clip, &txt_coords, &layer->_clip_area); + bool is_common = lv_area_intersect(&txt_clip, &txt_coords, &layer->_clip_area); if(!is_common) { return; } @@ -934,7 +938,7 @@ static void lv_label_refr_text(lv_obj_t * obj) lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); if(base_dir == LV_BASE_DIR_AUTO) - base_dir = _lv_bidi_detect_base_dir(label->text); + base_dir = lv_bidi_detect_base_dir(label->text); if(base_dir == LV_BASE_DIR_RTL) { start = lv_area_get_width(&txt_coords) - size.x; @@ -1041,7 +1045,7 @@ static void lv_label_refr_text(lv_obj_t * obj) lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); if(base_dir == LV_BASE_DIR_AUTO) - base_dir = _lv_bidi_detect_base_dir(label->text); + base_dir = lv_bidi_detect_base_dir(label->text); if(base_dir == LV_BASE_DIR_RTL) { start = -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; @@ -1276,7 +1280,7 @@ static size_t get_text_length(const char * text) { size_t len = 0; #if LV_USE_ARABIC_PERSIAN_CHARS - len = _lv_text_ap_calc_bytes_count(text); + len = lv_text_ap_calc_bytes_count(text); #else len = lv_strlen(text) + 1; #endif @@ -1287,7 +1291,7 @@ static size_t get_text_length(const char * text) static void copy_text_to_label(lv_label_t * label, const char * text) { #if LV_USE_ARABIC_PERSIAN_CHARS - _lv_text_ap_proc(text, label->text); + lv_text_ap_proc(text, label->text); #else lv_strcpy(label->text, text); #endif diff --git a/src/widgets/label/lv_label.h b/src/widgets/label/lv_label.h index f0143d502..86964f33f 100644 --- a/src/widgets/label/lv_label.h +++ b/src/widgets/label/lv_label.h @@ -45,19 +45,13 @@ LV_EXPORT_CONST_INT(LV_LABEL_TEXT_SELECTION_OFF); **********************/ /** Long mode behaviors. Used in 'lv_label_ext_t'*/ -enum _lv_label_long_mode_t { +typedef enum { LV_LABEL_LONG_WRAP, /**< Keep the object width, wrap lines longer than object width and expand the object height*/ LV_LABEL_LONG_DOT, /**< Keep the size and write dots at the end if the text is too long*/ LV_LABEL_LONG_SCROLL, /**< Keep the size and roll the text back and forth*/ LV_LABEL_LONG_SCROLL_CIRCULAR, /**< Keep the size and roll the text circularly*/ LV_LABEL_LONG_CLIP, /**< Keep the size and clip the text out of it*/ -}; - -#ifdef DOXYGEN -typedef _lv_label_long_mode_t lv_label_long_mode_t; -#else -typedef uint8_t lv_label_long_mode_t; -#endif /*DOXYGEN*/ +} lv_label_long_mode_t; #if LV_USE_OBJ_PROPERTY enum { @@ -69,33 +63,6 @@ enum { }; #endif -typedef struct { - lv_obj_t obj; - char * text; - union { - char * tmp_ptr; /*Pointer to the allocated memory containing the character replaced by dots*/ - char tmp[LV_LABEL_DOT_NUM + 1]; /*Directly store the characters if <=4 characters*/ - } dot; - uint32_t dot_end; /*The real text length, used in dot mode*/ - -#if LV_LABEL_LONG_TXT_HINT - lv_draw_label_hint_t hint; -#endif - -#if LV_LABEL_TEXT_SELECTION - uint32_t sel_start; - uint32_t sel_end; -#endif - - lv_point_t size_cache; /*Text size cache*/ - lv_point_t offset; /*Text draw position offset*/ - lv_label_long_mode_t long_mode : 3; /*Determine what to do with the long texts*/ - uint8_t static_txt : 1; /*Flag to indicate the text is static*/ - uint8_t expand : 1; /*Ignore real width (used by the library with LV_LABEL_LONG_SCROLL)*/ - uint8_t dot_tmp_alloc : 1; /*1: dot is allocated, 0: dot directly holds up to 4 chars*/ - uint8_t invalid_size_cache : 1; /*1: Recalculate size and update cache*/ -} lv_label_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_label_class; /********************** diff --git a/src/widgets/label/lv_label_private.h b/src/widgets/label/lv_label_private.h new file mode 100644 index 000000000..84652a903 --- /dev/null +++ b/src/widgets/label/lv_label_private.h @@ -0,0 +1,73 @@ +/** + * @file lv_label_private.h + * + */ + +#ifndef LV_LABEL_PRIVATE_H +#define LV_LABEL_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../draw/lv_draw_label_private.h" +#include "../../core/lv_obj_private.h" +#include "lv_label.h" + +#if LV_USE_LABEL != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_label_t { + lv_obj_t obj; + char * text; + union { + char * tmp_ptr; /*Pointer to the allocated memory containing the character replaced by dots*/ + char tmp[LV_LABEL_DOT_NUM + 1]; /*Directly store the characters if <=4 characters*/ + } dot; + uint32_t dot_end; /*The real text length, used in dot mode*/ + +#if LV_LABEL_LONG_TXT_HINT + lv_draw_label_hint_t hint; +#endif + +#if LV_LABEL_TEXT_SELECTION + uint32_t sel_start; + uint32_t sel_end; +#endif + + lv_point_t size_cache; /*Text size cache*/ + lv_point_t offset; /*Text draw position offset*/ + lv_label_long_mode_t long_mode : 3; /*Determine what to do with the long texts*/ + uint8_t static_txt : 1; /*Flag to indicate the text is static*/ + uint8_t expand : 1; /*Ignore real width (used by the library with LV_LABEL_LONG_SCROLL)*/ + uint8_t dot_tmp_alloc : 1; /*1: dot is allocated, 0: dot directly holds up to 4 chars*/ + uint8_t invalid_size_cache : 1; /*1: Recalculate size and update cache*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_LABEL != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LABEL_PRIVATE_H*/ diff --git a/src/widgets/led/lv_led.c b/src/widgets/led/lv_led.c index bf5db77c5..d42daabcb 100644 --- a/src/widgets/led/lv_led.c +++ b/src/widgets/led/lv_led.c @@ -6,7 +6,9 @@ /********************* * INCLUDES *********************/ -#include "lv_led.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_led_private.h" #if LV_USE_LED #include "../../misc/lv_assert.h" diff --git a/src/widgets/led/lv_led.h b/src/widgets/led/lv_led.h index f1ac52d87..c085a97f6 100644 --- a/src/widgets/led/lv_led.h +++ b/src/widgets/led/lv_led.h @@ -34,13 +34,6 @@ extern "C" { * TYPEDEFS **********************/ -/*Data of led*/ -typedef struct { - lv_obj_t obj; - lv_color_t color; - uint8_t bright; /**< Current brightness of the LED (0..255)*/ -} lv_led_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_led_class; /********************** diff --git a/src/widgets/led/lv_led_private.h b/src/widgets/led/lv_led_private.h new file mode 100644 index 000000000..448069dde --- /dev/null +++ b/src/widgets/led/lv_led_private.h @@ -0,0 +1,51 @@ +/** + * @file lv_led_private.h + * + */ + +#ifndef LV_LED_PRIVATE_H +#define LV_LED_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_led.h" + +#if LV_USE_LED + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of led*/ +struct lv_led_t { + lv_obj_t obj; + lv_color_t color; + uint8_t bright; /**< Current brightness of the LED (0..255)*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_LED */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LED_PRIVATE_H*/ diff --git a/src/widgets/line/lv_line.c b/src/widgets/line/lv_line.c index fd384722f..d5a37aa68 100644 --- a/src/widgets/line/lv_line.c +++ b/src/widgets/line/lv_line.c @@ -6,7 +6,8 @@ /********************* * INCLUDES *********************/ -#include "lv_line.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_line_private.h" #if LV_USE_LINE != 0 #include "../../misc/lv_assert.h" diff --git a/src/widgets/line/lv_line.h b/src/widgets/line/lv_line.h index eac2482ed..d6a1d603e 100644 --- a/src/widgets/line/lv_line.h +++ b/src/widgets/line/lv_line.h @@ -24,18 +24,6 @@ extern "C" { * TYPEDEFS **********************/ -/*Data of line*/ -typedef struct { - lv_obj_t obj; - union { - const lv_point_precise_t * constant; - lv_point_precise_t * mut; - } point_array; /**< Pointer to an array with the points of the line*/ - uint32_t point_num; /**< Number of points in 'point_array'*/ - uint32_t y_inv : 1; /**< 1: y == 0 will be on the bottom*/ - uint32_t point_array_is_mutable : 1; /**< whether the point array is const or mutable*/ -} lv_line_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_line_class; /********************** diff --git a/src/widgets/line/lv_line_private.h b/src/widgets/line/lv_line_private.h new file mode 100644 index 000000000..900ea3a04 --- /dev/null +++ b/src/widgets/line/lv_line_private.h @@ -0,0 +1,57 @@ +/** + * @file lv_line_private.h + * + */ + +#ifndef LV_LINE_PRIVATE_H +#define LV_LINE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_line.h" + +#if LV_USE_LINE != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of line*/ +struct lv_line_t { + lv_obj_t obj; + union { + const lv_point_precise_t * constant; + lv_point_precise_t * mut; + } point_array; /**< Pointer to an array with the points of the line*/ + uint32_t point_num; /**< Number of points in 'point_array'*/ + uint32_t y_inv : 1; /**< 1: y == 0 will be on the bottom*/ + uint32_t point_array_is_mutable : 1; /**< whether the point array is const or mutable*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_LINE != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LINE_PRIVATE_H*/ diff --git a/src/widgets/list/lv_list.c b/src/widgets/list/lv_list.c index 5288c66e0..3556ef1dc 100644 --- a/src/widgets/list/lv_list.c +++ b/src/widgets/list/lv_list.c @@ -6,6 +6,7 @@ /********************* * INCLUDES *********************/ +#include "../../core/lv_obj_class_private.h" #include "lv_list.h" #include "../../layouts/flex/lv_flex.h" #include "../../display/lv_display.h" diff --git a/src/widgets/lottie/lv_lottie.c b/src/widgets/lottie/lv_lottie.c index ea803d48d..bc0bed586 100644 --- a/src/widgets/lottie/lv_lottie.c +++ b/src/widgets/lottie/lv_lottie.c @@ -15,8 +15,9 @@ #include "../../libs/thorvg/thorvg_capi.h" #endif +#include "lv_lottie_private.h" #include "../../misc/lv_timer.h" -#include "lv_lottie.h" +#include "../../core/lv_obj_class_private.h" /********************* * DEFINES diff --git a/src/widgets/lottie/lv_lottie.h b/src/widgets/lottie/lv_lottie.h index 5108621ba..1ccfe164a 100644 --- a/src/widgets/lottie/lv_lottie.h +++ b/src/widgets/lottie/lv_lottie.h @@ -25,7 +25,7 @@ extern "C" { #error "lv_lottie: ThorVG is required. Enable it in lv_conf.h (LV_USE_THORVG_INTERNAL/EXTERNAL 1)" #endif -#include "../../widgets/canvas/lv_canvas.h" +#include "../../draw/lv_draw_buf.h" /********************* * DEFINES @@ -35,21 +35,6 @@ extern "C" { * TYPEDEFS **********************/ -#ifndef __THORVG_CAPI_H__ /*To avoid redefinition of typedef warning*/ -typedef struct _Tvg_Paint Tvg_Paint; -typedef struct _Tvg_Canvas Tvg_Canvas; -typedef struct _Tvg_Animation Tvg_Animation; -#endif - -typedef struct { - lv_canvas_t canvas; - Tvg_Paint * tvg_paint; - Tvg_Canvas * tvg_canvas; - Tvg_Animation * tvg_anim; - lv_anim_t * anim; - int32_t last_rendered_time; -} lv_lottie_t; - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/widgets/lottie/lv_lottie_private.h b/src/widgets/lottie/lv_lottie_private.h new file mode 100644 index 000000000..1fec92d37 --- /dev/null +++ b/src/widgets/lottie/lv_lottie_private.h @@ -0,0 +1,59 @@ +/** + * @file lv_lottie_private.h + * + */ + +#ifndef LV_LOTTIE_PRIVATE_H +#define LV_LOTTIE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#if LV_USE_LOTTIE + +#include "lv_lottie.h" +#include "../canvas/lv_canvas_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +#ifndef __THORVG_CAPI_H__ /*To avoid redefinition of typedef warning*/ +typedef struct _Tvg_Paint Tvg_Paint; +typedef struct _Tvg_Canvas Tvg_Canvas; +typedef struct _Tvg_Animation Tvg_Animation; +#endif + +typedef struct { + lv_canvas_t canvas; + Tvg_Paint * tvg_paint; + Tvg_Canvas * tvg_canvas; + Tvg_Animation * tvg_anim; + lv_anim_t * anim; + int32_t last_rendered_time; +} lv_lottie_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_LOTTIE_H*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LOTTIE_PRIVATE_H*/ diff --git a/src/widgets/menu/lv_menu.c b/src/widgets/menu/lv_menu.c index e21bdcd18..8b2ea05b8 100644 --- a/src/widgets/menu/lv_menu.c +++ b/src/widgets/menu/lv_menu.c @@ -6,7 +6,8 @@ /********************* * INCLUDES *********************/ -#include "lv_menu.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_menu_private.h" #if LV_USE_MENU @@ -15,7 +16,7 @@ *********************/ #define MY_CLASS (&lv_menu_class) -#include "../../core/lv_obj.h" +#include "../../core/lv_obj_private.h" #include "../../layouts/lv_layout.h" #include "../../stdlib/lv_string.h" #include "../label/lv_label.h" @@ -170,14 +171,14 @@ void lv_menu_refr(lv_obj_t * obj) lv_ll_t * history_ll = &(menu->history_ll); /* The current menu */ - lv_menu_history_t * act_hist = _lv_ll_get_head(history_ll); + lv_menu_history_t * act_hist = lv_ll_get_head(history_ll); lv_obj_t * page = NULL; if(act_hist != NULL) { page = act_hist->page; /* Delete the current item from the history */ - _lv_ll_remove(history_ll, act_hist); + lv_ll_remove(history_ll, act_hist); lv_free(act_hist); menu->cur_depth--; } @@ -204,7 +205,7 @@ void lv_menu_set_page(lv_obj_t * obj, lv_obj_t * page) if(page != NULL) { /* Add a new node */ lv_ll_t * history_ll = &(menu->history_ll); - lv_menu_history_t * new_node = _lv_ll_ins_head(history_ll); + lv_menu_history_t * new_node = lv_ll_ins_head(history_ll); LV_ASSERT_MALLOC(new_node); new_node->page = page; menu->cur_depth++; @@ -506,7 +507,7 @@ void lv_menu_clear_history(lv_obj_t * obj) lv_menu_t * menu = (lv_menu_t *)obj; lv_ll_t * history_ll = &(menu->history_ll); - _lv_ll_clear(history_ll); + lv_ll_clear(history_ll); menu->cur_depth = 0; } @@ -531,7 +532,7 @@ static void lv_menu_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) menu->prev_depth = 0; menu->sidebar_generated = false; - _lv_ll_init(&(menu->history_ll), sizeof(lv_menu_history_t)); + lv_ll_init(&(menu->history_ll), sizeof(lv_menu_history_t)); menu->storage = lv_obj_create(obj); lv_obj_add_flag(menu->storage, LV_OBJ_FLAG_HIDDEN); @@ -590,7 +591,7 @@ static void lv_menu_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) lv_menu_t * menu = (lv_menu_t *)obj; lv_ll_t * history_ll = &(menu->history_ll); - _lv_ll_clear(history_ll); + lv_ll_clear(history_ll); LV_TRACE_OBJ_CREATE("finished"); } @@ -770,20 +771,20 @@ static void lv_menu_back_event_cb(lv_event_t * e) lv_ll_t * history_ll = &(menu->history_ll); /* The current menu */ - lv_menu_history_t * act_hist = _lv_ll_get_head(history_ll); + lv_menu_history_t * act_hist = lv_ll_get_head(history_ll); /* The previous menu */ - lv_menu_history_t * prev_hist = _lv_ll_get_next(history_ll, act_hist); + lv_menu_history_t * prev_hist = lv_ll_get_next(history_ll, act_hist); if(prev_hist != NULL) { /* Previous menu exists */ /* Delete the current item from the history */ - _lv_ll_remove(history_ll, act_hist); + lv_ll_remove(history_ll, act_hist); lv_free(act_hist); menu->cur_depth--; /* Create the previous menu. * Remove it from the history because `lv_menu_set_page` will add it again */ - _lv_ll_remove(history_ll, prev_hist); + lv_ll_remove(history_ll, prev_hist); menu->cur_depth--; lv_menu_set_page(&(menu->obj), prev_hist->page); diff --git a/src/widgets/menu/lv_menu.h b/src/widgets/menu/lv_menu.h index c187ff134..4fe3766f7 100644 --- a/src/widgets/menu/lv_menu.h +++ b/src/widgets/menu/lv_menu.h @@ -28,73 +28,16 @@ extern "C" { /********************** * TYPEDEFS **********************/ -enum _lv_menu_mode_header_t { +typedef enum { LV_MENU_HEADER_TOP_FIXED, /* Header is positioned at the top */ LV_MENU_HEADER_TOP_UNFIXED, /* Header is positioned at the top and can be scrolled out of view*/ LV_MENU_HEADER_BOTTOM_FIXED /* Header is positioned at the bottom */ -}; +} lv_menu_mode_header_t; -#ifdef DOXYGEN -typedef _lv_menu_mode_header_t lv_menu_mode_header_t; -#else -typedef uint8_t lv_menu_mode_header_t; -#endif /*DOXYGEN*/ - -enum _lv_menu_mode_root_back_button_t { +typedef enum { LV_MENU_ROOT_BACK_BUTTON_DISABLED, LV_MENU_ROOT_BACK_BUTTON_ENABLED -}; - -#ifdef DOXYGEN -typedef _lv_menu_mode_root_back_button_t lv_menu_mode_root_back_button_t; -#else -typedef uint8_t lv_menu_mode_root_back_button_t; -#endif /*DOXYGEN*/ - -typedef struct /// @cond -/** - * Tells Doxygen to ignore a duplicate declaration - */ - lv_menu_load_page_event_data_t -/// @endcond -{ - lv_obj_t * menu; - lv_obj_t * page; -} lv_menu_load_page_event_data_t ; - -typedef struct { - lv_obj_t * page; -} lv_menu_history_t; - -typedef struct { - lv_obj_t obj; - lv_obj_t * storage; /* a pointer to obj that is the parent of all pages not displayed */ - lv_obj_t * main; - lv_obj_t * main_page; - lv_obj_t * main_header; - lv_obj_t * - main_header_back_btn; /* a pointer to obj that on click triggers back btn event handler, can be same as 'main_header' */ - lv_obj_t * main_header_title; - lv_obj_t * sidebar; - lv_obj_t * sidebar_page; - lv_obj_t * sidebar_header; - lv_obj_t * - sidebar_header_back_btn; /* a pointer to obj that on click triggers back btn event handler, can be same as 'sidebar_header' */ - lv_obj_t * sidebar_header_title; - lv_obj_t * selected_tab; - lv_ll_t history_ll; - uint8_t cur_depth; - uint8_t prev_depth; - uint8_t sidebar_generated : 1; - lv_menu_mode_header_t mode_header : 2; - lv_menu_mode_root_back_button_t mode_root_back_btn : 1; -} lv_menu_t; - -typedef struct { - lv_obj_t obj; - char * title; - bool static_title; -} lv_menu_page_t; +} lv_menu_mode_root_back_button_t; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_class; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_page_class; diff --git a/src/widgets/menu/lv_menu_private.h b/src/widgets/menu/lv_menu_private.h new file mode 100644 index 000000000..997fa862e --- /dev/null +++ b/src/widgets/menu/lv_menu_private.h @@ -0,0 +1,84 @@ +/** + * @file lv_menu_private.h + * + */ + +#ifndef LV_MENU_PRIVATE_H +#define LV_MENU_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_menu.h" + +#if LV_USE_MENU + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_menu_load_page_event_data_t { + lv_obj_t * menu; + lv_obj_t * page; +}; + +struct lv_menu_history_t { + lv_obj_t * page; +}; + +struct lv_menu_t { + lv_obj_t obj; + lv_obj_t * storage; /* a pointer to obj that is the parent of all pages not displayed */ + lv_obj_t * main; + lv_obj_t * main_page; + lv_obj_t * main_header; + lv_obj_t * + main_header_back_btn; /* a pointer to obj that on click triggers back btn event handler, can be same as 'main_header' */ + lv_obj_t * main_header_title; + lv_obj_t * sidebar; + lv_obj_t * sidebar_page; + lv_obj_t * sidebar_header; + lv_obj_t * + sidebar_header_back_btn; /* a pointer to obj that on click triggers back btn event handler, can be same as 'sidebar_header' */ + lv_obj_t * sidebar_header_title; + lv_obj_t * selected_tab; + lv_ll_t history_ll; + uint8_t cur_depth; + uint8_t prev_depth; + uint8_t sidebar_generated : 1; + lv_menu_mode_header_t mode_header : 2; + lv_menu_mode_root_back_button_t mode_root_back_btn : 1; +}; + +struct lv_menu_page_t { + lv_obj_t obj; + char * title; + bool static_title; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_MENU */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MENU_PRIVATE_H*/ diff --git a/src/widgets/msgbox/lv_msgbox.c b/src/widgets/msgbox/lv_msgbox.c index 70edc51dd..8a9997726 100644 --- a/src/widgets/msgbox/lv_msgbox.c +++ b/src/widgets/msgbox/lv_msgbox.c @@ -6,7 +6,9 @@ /********************* * INCLUDES *********************/ -#include "lv_msgbox.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_msgbox_private.h" #if LV_USE_MSGBOX #include "../label/lv_label.h" diff --git a/src/widgets/msgbox/lv_msgbox.h b/src/widgets/msgbox/lv_msgbox.h index e2f863ae9..5605b8028 100644 --- a/src/widgets/msgbox/lv_msgbox.h +++ b/src/widgets/msgbox/lv_msgbox.h @@ -30,18 +30,6 @@ extern "C" { * DEFINES *********************/ -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_obj_t obj; - lv_obj_t * header; - lv_obj_t * content; - lv_obj_t * footer; - lv_obj_t * title; -} lv_msgbox_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_class; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_header_class; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_content_class; diff --git a/src/widgets/msgbox/lv_msgbox_private.h b/src/widgets/msgbox/lv_msgbox_private.h new file mode 100644 index 000000000..ebf660170 --- /dev/null +++ b/src/widgets/msgbox/lv_msgbox_private.h @@ -0,0 +1,56 @@ +/** + * @file lv_msgbox_private.h + * + */ + +#ifndef LV_MSGBOX_PRIVATE_H +#define LV_MSGBOX_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_msgbox.h" + +#if LV_USE_MSGBOX + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_msgbox_t { + lv_obj_t obj; + lv_obj_t * header; + lv_obj_t * content; + lv_obj_t * footer; + lv_obj_t * title; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_MSGBOX */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MSGBOX_PRIVATE_H*/ diff --git a/src/widgets/property/lv_obj_property_names.h b/src/widgets/property/lv_obj_property_names.h index f308bd27d..317a22ae0 100644 --- a/src/widgets/property/lv_obj_property_names.h +++ b/src/widgets/property/lv_obj_property_names.h @@ -13,6 +13,6 @@ extern const lv_property_name_t lv_image_property_names[11]; extern const lv_property_name_t lv_label_property_names[4]; extern const lv_property_name_t lv_obj_property_names[73]; - extern const lv_property_name_t lv_style_property_names[111]; + extern const lv_property_name_t lv_style_property_names[112]; #endif #endif diff --git a/src/widgets/property/lv_style_properties.c b/src/widgets/property/lv_style_properties.c index 9fc3cf4bf..22ef3e257 100644 --- a/src/widgets/property/lv_style_properties.c +++ b/src/widgets/property/lv_style_properties.c @@ -14,7 +14,7 @@ * Generated code from properties.py */ /* *INDENT-OFF* */ -const lv_property_name_t lv_style_property_names[111] = { +const lv_property_name_t lv_style_property_names[112] = { {"align", LV_PROPERTY_STYLE_ALIGN,}, {"anim", LV_PROPERTY_STYLE_ANIM,}, {"anim_duration", LV_PROPERTY_STYLE_ANIM_DURATION,}, @@ -67,6 +67,7 @@ const lv_property_name_t lv_style_property_names[111] = { {"image_opa", LV_PROPERTY_STYLE_IMAGE_OPA,}, {"image_recolor", LV_PROPERTY_STYLE_IMAGE_RECOLOR,}, {"image_recolor_opa", LV_PROPERTY_STYLE_IMAGE_RECOLOR_OPA,}, + {"last_built_in_prop", LV_PROPERTY_STYLE_LAST_BUILT_IN_PROP,}, {"layout", LV_PROPERTY_STYLE_LAYOUT,}, {"length", LV_PROPERTY_STYLE_LENGTH,}, {"line_color", LV_PROPERTY_STYLE_LINE_COLOR,}, diff --git a/src/widgets/property/lv_style_properties.h b/src/widgets/property/lv_style_properties.h index 720b13d8b..146f35ad7 100644 --- a/src/widgets/property/lv_style_properties.h +++ b/src/widgets/property/lv_style_properties.h @@ -64,6 +64,7 @@ enum { LV_PROPERTY_ID(STYLE, IMAGE_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_IMAGE_OPA), LV_PROPERTY_ID(STYLE, IMAGE_RECOLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_IMAGE_RECOLOR), LV_PROPERTY_ID(STYLE, IMAGE_RECOLOR_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_IMAGE_RECOLOR_OPA), + LV_PROPERTY_ID(STYLE, LAST_BUILT_IN_PROP, LV_PROPERTY_TYPE_INT, LV_STYLE_LAST_BUILT_IN_PROP), LV_PROPERTY_ID(STYLE, LAYOUT, LV_PROPERTY_TYPE_INT, LV_STYLE_LAYOUT), LV_PROPERTY_ID(STYLE, LENGTH, LV_PROPERTY_TYPE_INT, LV_STYLE_LENGTH), LV_PROPERTY_ID(STYLE, LINE_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_LINE_COLOR), diff --git a/src/widgets/roller/lv_roller.c b/src/widgets/roller/lv_roller.c index 34b559841..1d3dbc689 100644 --- a/src/widgets/roller/lv_roller.c +++ b/src/widgets/roller/lv_roller.c @@ -6,12 +6,17 @@ /********************* * INCLUDES *********************/ -#include "lv_roller.h" +#include "../label/lv_label_private.h" +#include "../../misc/lv_area_private.h" +#include "../../misc/lv_anim_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_roller_private.h" #if LV_USE_ROLLER != 0 #include "../../misc/lv_assert.h" #include "../../misc/lv_text_private.h" -#include "../../draw/lv_draw.h" +#include "../../draw/lv_draw_private.h" #include "../../core/lv_group.h" #include "../../indev/lv_indev.h" #include "../../indev/lv_indev_scroll.h" @@ -457,7 +462,7 @@ static void draw_main(lv_event_t * e) get_sel_area(obj, &sel_area); lv_area_t mask_sel; bool area_ok; - area_ok = _lv_area_intersect(&mask_sel, &layer->_clip_area, &sel_area); + area_ok = lv_area_intersect(&mask_sel, &layer->_clip_area, &sel_area); if(area_ok) { lv_obj_t * label = get_label(obj); @@ -525,7 +530,7 @@ static void draw_label(lv_event_t * e) *To solve this limit the clip area to the "plain" roller.*/ const lv_area_t clip_area_ori = layer->_clip_area; lv_area_t roller_clip_area; - if(!_lv_area_intersect(&roller_clip_area, &layer->_clip_area, &roller->coords)) return; + if(!lv_area_intersect(&roller_clip_area, &layer->_clip_area, &roller->coords)) return; layer->_clip_area = roller_clip_area; lv_area_t sel_area; @@ -536,7 +541,7 @@ static void draw_label(lv_event_t * e) clip2.y1 = label_obj->coords.y1; clip2.x2 = label_obj->coords.x2; clip2.y2 = sel_area.y1; - if(_lv_area_intersect(&clip2, &layer->_clip_area, &clip2)) { + if(lv_area_intersect(&clip2, &layer->_clip_area, &clip2)) { const lv_area_t clip_area_ori2 = layer->_clip_area; layer->_clip_area = clip2; label_draw_dsc.text = lv_label_get_text(label_obj); @@ -548,7 +553,7 @@ static void draw_label(lv_event_t * e) clip2.y1 = sel_area.y2; clip2.x2 = label_obj->coords.x2; clip2.y2 = label_obj->coords.y2; - if(_lv_area_intersect(&clip2, &layer->_clip_area, &clip2)) { + if(lv_area_intersect(&clip2, &layer->_clip_area, &clip2)) { const lv_area_t clip_area_ori2 = layer->_clip_area; layer->_clip_area = clip2; label_draw_dsc.text = lv_label_get_text(label_obj); diff --git a/src/widgets/roller/lv_roller.h b/src/widgets/roller/lv_roller.h index ff75f246f..5deb57f64 100644 --- a/src/widgets/roller/lv_roller.h +++ b/src/widgets/roller/lv_roller.h @@ -33,26 +33,10 @@ extern "C" { **********************/ /** Roller mode.*/ -enum _lv_roller_mode_t { +typedef enum { LV_ROLLER_MODE_NORMAL, /**< Normal mode (roller ends at the end of the options).*/ LV_ROLLER_MODE_INFINITE, /**< Infinite mode (roller can be scrolled forever).*/ -}; - -#ifdef DOXYGEN -typedef _lv_roller_mode_t lv_roller_mode_t; -#else -typedef uint8_t lv_roller_mode_t; -#endif /*DOXYGEN*/ - -typedef struct { - lv_obj_t obj; - uint32_t option_cnt; /**< Number of options*/ - uint32_t sel_opt_id; /**< Index of the current option*/ - uint32_t sel_opt_id_ori; /**< Store the original index on focus*/ - uint32_t inf_page_cnt; /**< Number of extra pages added to make the roller look infinite */ - lv_roller_mode_t mode : 1; - uint32_t moved : 1; -} lv_roller_t; +} lv_roller_mode_t; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_roller_class; diff --git a/src/widgets/roller/lv_roller_private.h b/src/widgets/roller/lv_roller_private.h new file mode 100644 index 000000000..f648d70e7 --- /dev/null +++ b/src/widgets/roller/lv_roller_private.h @@ -0,0 +1,54 @@ +/** + * @file lv_roller_private.h + * + */ + +#ifndef LV_ROLLER_PRIVATE_H +#define LV_ROLLER_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_roller.h" + +#if LV_USE_ROLLER != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_roller_t { + lv_obj_t obj; + uint32_t option_cnt; /**< Number of options*/ + uint32_t sel_opt_id; /**< Index of the current option*/ + uint32_t sel_opt_id_ori; /**< Store the original index on focus*/ + uint32_t inf_page_cnt; /**< Number of extra pages added to make the roller look infinite */ + lv_roller_mode_t mode : 1; + uint32_t moved : 1; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_ROLLER != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ROLLER_PRIVATE_H*/ diff --git a/src/widgets/scale/lv_scale.c b/src/widgets/scale/lv_scale.c index 24ee644e5..b6de17e90 100644 --- a/src/widgets/scale/lv_scale.c +++ b/src/widgets/scale/lv_scale.c @@ -6,7 +6,9 @@ /********************* * INCLUDES *********************/ -#include "lv_scale.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_scale_private.h" #if LV_USE_SCALE != 0 #include "../../core/lv_group.h" @@ -325,7 +327,7 @@ lv_scale_section_t * lv_scale_add_section(lv_obj_t * obj) LV_ASSERT_OBJ(obj, MY_CLASS); lv_scale_t * scale = (lv_scale_t *)obj; - lv_scale_section_t * section = _lv_ll_ins_head(&scale->section_ll); + lv_scale_section_t * section = lv_ll_ins_head(&scale->section_ll); LV_ASSERT_MALLOC(section); if(section == NULL) return NULL; @@ -434,7 +436,7 @@ static void lv_scale_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) lv_scale_t * scale = (lv_scale_t *)obj; - _lv_ll_init(&scale->section_ll, sizeof(lv_scale_section_t)); + lv_ll_init(&scale->section_ll, sizeof(lv_scale_section_t)); scale->total_tick_count = LV_SCALE_TOTAL_TICK_COUNT_DEFAULT; scale->major_tick_every = LV_SCALE_MAJOR_TICK_EVERY_DEFAULT; @@ -464,11 +466,11 @@ static void lv_scale_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) lv_scale_t * scale = (lv_scale_t *)obj; lv_scale_section_t * section; while(scale->section_ll.head) { - section = _lv_ll_get_head(&scale->section_ll); - _lv_ll_remove(&scale->section_ll, section); + section = lv_ll_get_head(&scale->section_ll); + lv_ll_remove(&scale->section_ll, section); lv_free(section); } - _lv_ll_clear(&scale->section_ll); + lv_ll_clear(&scale->section_ll); LV_TRACE_OBJ_CREATE("finished"); } @@ -568,7 +570,7 @@ static void scale_draw_indicator(lv_obj_t * obj, lv_event_t * event) /* Overwrite label and tick properties if tick value is within section range */ lv_scale_section_t * section; - _LV_LL_READ_BACK(&scale->section_ll, section) { + LV_LL_READ_BACK(&scale->section_ll, section) { if(section->minor_range <= tick_value && section->major_range >= tick_value) { if(is_major_tick) { scale_set_indicator_label_properties(obj, &label_dsc, section->indicator_style); @@ -704,7 +706,7 @@ static void scale_calculate_main_compensation(lv_obj_t * obj) /* Overwrite label and tick properties if tick value is within section range */ lv_scale_section_t * section; - _LV_LL_READ_BACK(&scale->section_ll, section) { + LV_LL_READ_BACK(&scale->section_ll, section) { if(section->minor_range <= tick_value && section->major_range >= tick_value) { if(is_major_tick) { scale_set_line_properties(obj, &major_tick_dsc, section->indicator_style, LV_PART_INDICATOR); @@ -808,7 +810,7 @@ static void scale_draw_main(lv_obj_t * obj, lv_event_t * event) lv_draw_line(layer, &line_dsc); lv_scale_section_t * section; - _LV_LL_READ_BACK(&scale->section_ll, section) { + LV_LL_READ_BACK(&scale->section_ll, section) { lv_draw_line_dsc_t section_line_dsc; lv_draw_line_dsc_init(§ion_line_dsc); lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, §ion_line_dsc); @@ -873,7 +875,7 @@ static void scale_draw_main(lv_obj_t * obj, lv_event_t * event) lv_draw_arc(layer, &arc_dsc); lv_scale_section_t * section; - _LV_LL_READ_BACK(&scale->section_ll, section) { + LV_LL_READ_BACK(&scale->section_ll, section) { lv_draw_arc_dsc_t main_arc_section_dsc; lv_draw_arc_dsc_init(&main_arc_section_dsc); lv_obj_init_draw_arc_dsc(obj, LV_PART_MAIN, &main_arc_section_dsc); @@ -1158,11 +1160,11 @@ static void scale_set_line_properties(lv_obj_t * obj, lv_draw_line_dsc_t * line_ { if(section_style) { lv_style_value_t value; - lv_result_t res; + lv_style_res_t res; /* Line width */ res = lv_style_get_prop(section_style, LV_STYLE_LINE_WIDTH, &value); - if(res == LV_RESULT_OK) { + if(res == LV_STYLE_RES_FOUND) { line_dsc->width = (int32_t)value.num; } else { @@ -1171,7 +1173,7 @@ static void scale_set_line_properties(lv_obj_t * obj, lv_draw_line_dsc_t * line_ /* Line color */ res = lv_style_get_prop(section_style, LV_STYLE_LINE_COLOR, &value); - if(res == LV_RESULT_OK) { + if(res == LV_STYLE_RES_FOUND) { line_dsc->color = value.color; } else { @@ -1180,7 +1182,7 @@ static void scale_set_line_properties(lv_obj_t * obj, lv_draw_line_dsc_t * line_ /* Line opa */ res = lv_style_get_prop(section_style, LV_STYLE_LINE_OPA, &value); - if(res == LV_RESULT_OK) { + if(res == LV_STYLE_RES_FOUND) { line_dsc->opa = (lv_opa_t)value.num; } else { @@ -1207,11 +1209,11 @@ static void scale_set_arc_properties(lv_obj_t * obj, lv_draw_arc_dsc_t * arc_dsc { if(section_style) { lv_style_value_t value; - lv_result_t res; + lv_style_res_t res; /* Line width */ res = lv_style_get_prop(section_style, LV_STYLE_ARC_WIDTH, &value); - if(res == LV_RESULT_OK) { + if(res == LV_STYLE_RES_FOUND) { arc_dsc->width = (int32_t)value.num; } else { @@ -1220,7 +1222,7 @@ static void scale_set_arc_properties(lv_obj_t * obj, lv_draw_arc_dsc_t * arc_dsc /* Line color */ res = lv_style_get_prop(section_style, LV_STYLE_ARC_COLOR, &value); - if(res == LV_RESULT_OK) { + if(res == LV_STYLE_RES_FOUND) { arc_dsc->color = value.color; } else { @@ -1229,7 +1231,7 @@ static void scale_set_arc_properties(lv_obj_t * obj, lv_draw_arc_dsc_t * arc_dsc /* Line opa */ res = lv_style_get_prop(section_style, LV_STYLE_ARC_OPA, &value); - if(res == LV_RESULT_OK) { + if(res == LV_STYLE_RES_FOUND) { arc_dsc->opa = (lv_opa_t)value.num; } else { @@ -1257,11 +1259,11 @@ static void scale_set_indicator_label_properties(lv_obj_t * obj, lv_draw_label_d { if(indicator_section_style) { lv_style_value_t value; - lv_result_t res; + lv_style_res_t res; /* Text color */ res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_COLOR, &value); - if(res == LV_RESULT_OK) { + if(res == LV_STYLE_RES_FOUND) { label_dsc->color = value.color; } else { @@ -1270,7 +1272,7 @@ static void scale_set_indicator_label_properties(lv_obj_t * obj, lv_draw_label_d /* Text opa */ res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_OPA, &value); - if(res == LV_RESULT_OK) { + if(res == LV_STYLE_RES_FOUND) { label_dsc->opa = (lv_opa_t)value.num; } else { @@ -1279,7 +1281,7 @@ static void scale_set_indicator_label_properties(lv_obj_t * obj, lv_draw_label_d /* Text letter space */ res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_LETTER_SPACE, &value); - if(res == LV_RESULT_OK) { + if(res == LV_STYLE_RES_FOUND) { label_dsc->letter_space = (int32_t)value.num; } else { @@ -1288,7 +1290,7 @@ static void scale_set_indicator_label_properties(lv_obj_t * obj, lv_draw_label_d /* Text font */ res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_FONT, &value); - if(res == LV_RESULT_OK) { + if(res == LV_STYLE_RES_FOUND) { label_dsc->font = (const lv_font_t *)value.ptr; } else { @@ -1321,7 +1323,7 @@ static void scale_find_section_tick_idx(lv_obj_t * obj) const int32_t tick_value = lv_map(tick_idx, 0U, total_tick_count - 1, min_out, max_out); lv_scale_section_t * section; - _LV_LL_READ_BACK(&scale->section_ll, section) { + LV_LL_READ_BACK(&scale->section_ll, section) { if(section->minor_range <= tick_value && section->major_range >= tick_value) { if(LV_SCALE_TICK_IDX_DEFAULT_ID == section->first_tick_idx_in_section) { section->first_tick_idx_in_section = tick_idx; @@ -1434,7 +1436,7 @@ static void scale_store_section_line_tick_width_compensation(lv_obj_t * obj, con lv_scale_t * scale = (lv_scale_t *) obj; lv_scale_section_t * section; - _LV_LL_READ_BACK(&scale->section_ll, section) { + LV_LL_READ_BACK(&scale->section_ll, section) { if(section->minor_range <= tick_value && section->major_range >= tick_value) { if(is_major_tick) { scale_set_line_properties(obj, major_tick_dsc, section->indicator_style, LV_PART_INDICATOR); diff --git a/src/widgets/scale/lv_scale.h b/src/widgets/scale/lv_scale.h index d453b0237..c569cd535 100644 --- a/src/widgets/scale/lv_scale.h +++ b/src/widgets/scale/lv_scale.h @@ -44,53 +44,15 @@ LV_EXPORT_CONST_INT(LV_SCALE_LABEL_ENABLED_DEFAULT); /** * Scale mode */ -enum { +typedef enum { LV_SCALE_MODE_HORIZONTAL_TOP = 0x00U, LV_SCALE_MODE_HORIZONTAL_BOTTOM = 0x01U, LV_SCALE_MODE_VERTICAL_LEFT = 0x02U, LV_SCALE_MODE_VERTICAL_RIGHT = 0x04U, LV_SCALE_MODE_ROUND_INNER = 0x08U, LV_SCALE_MODE_ROUND_OUTER = 0x10U, - _LV_SCALE_MODE_LAST -}; -typedef uint32_t lv_scale_mode_t; - -typedef struct { - lv_style_t * main_style; - lv_style_t * indicator_style; - lv_style_t * items_style; - int32_t minor_range; - int32_t major_range; - uint32_t first_tick_idx_in_section; - uint32_t last_tick_idx_in_section; - uint32_t first_tick_idx_is_major; - uint32_t last_tick_idx_is_major; - int32_t first_tick_in_section_width; - int32_t last_tick_in_section_width; - lv_point_t first_tick_in_section; - lv_point_t last_tick_in_section; -} lv_scale_section_t; - -typedef struct { - lv_obj_t obj; - lv_ll_t section_ll; /**< Linked list for the sections (stores lv_scale_section_t)*/ - const char ** txt_src; - lv_scale_mode_t mode; - int32_t range_min; - int32_t range_max; - uint32_t total_tick_count : 15; - uint32_t major_tick_every : 15; - uint32_t label_enabled : 1; - uint32_t post_draw : 1; - uint32_t draw_ticks_on_top : 1; - /* Round scale */ - uint32_t angle_range; - int32_t rotation; - /* Private properties */ - int32_t custom_label_cnt; - int32_t last_tick_width; - int32_t first_tick_width; -} lv_scale_t; + LV_SCALE_MODE_LAST +} lv_scale_mode_t; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_scale_class; diff --git a/src/widgets/scale/lv_scale_private.h b/src/widgets/scale/lv_scale_private.h new file mode 100644 index 000000000..cc9363f76 --- /dev/null +++ b/src/widgets/scale/lv_scale_private.h @@ -0,0 +1,81 @@ +/** + * @file lv_scale_private.h + * + */ + +#ifndef LV_SCALE_PRIVATE_H +#define LV_SCALE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_scale.h" + +#if LV_USE_SCALE != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_scale_section_t { + lv_style_t * main_style; + lv_style_t * indicator_style; + lv_style_t * items_style; + int32_t minor_range; + int32_t major_range; + uint32_t first_tick_idx_in_section; + uint32_t last_tick_idx_in_section; + uint32_t first_tick_idx_is_major; + uint32_t last_tick_idx_is_major; + int32_t first_tick_in_section_width; + int32_t last_tick_in_section_width; + lv_point_t first_tick_in_section; + lv_point_t last_tick_in_section; +}; + +struct lv_scale_t { + lv_obj_t obj; + lv_ll_t section_ll; /**< Linked list for the sections (stores lv_scale_section_t)*/ + const char ** txt_src; + lv_scale_mode_t mode; + int32_t range_min; + int32_t range_max; + uint32_t total_tick_count : 15; + uint32_t major_tick_every : 15; + uint32_t label_enabled : 1; + uint32_t post_draw : 1; + uint32_t draw_ticks_on_top : 1; + /* Round scale */ + uint32_t angle_range; + int32_t rotation; + /* Private properties */ + int32_t custom_label_cnt; + int32_t last_tick_width; + int32_t first_tick_width; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_SCALE != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SCALE_PRIVATE_H*/ diff --git a/src/widgets/slider/lv_slider.c b/src/widgets/slider/lv_slider.c index 2cce03ab2..31297577e 100644 --- a/src/widgets/slider/lv_slider.c +++ b/src/widgets/slider/lv_slider.c @@ -6,7 +6,11 @@ /********************* * INCLUDES *********************/ -#include "lv_slider.h" +#include "../../misc/lv_area_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_event_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_slider_private.h" #if LV_USE_SLIDER != 0 #include "../../misc/lv_assert.h" @@ -79,6 +83,59 @@ bool lv_slider_is_dragged(const lv_obj_t * obj) return slider->dragging; } +void lv_slider_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) +{ + lv_bar_set_value(obj, value, anim); +} + +void lv_slider_set_left_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) +{ + lv_bar_set_start_value(obj, value, anim); +} + +void lv_slider_set_range(lv_obj_t * obj, int32_t min, int32_t max) +{ + lv_bar_set_range(obj, min, max); +} + +void lv_slider_set_mode(lv_obj_t * obj, lv_slider_mode_t mode) +{ + lv_bar_set_mode(obj, (lv_bar_mode_t)mode); +} + +int32_t lv_slider_get_value(const lv_obj_t * obj) +{ + return lv_bar_get_value(obj); +} + +int32_t lv_slider_get_left_value(const lv_obj_t * obj) +{ + return lv_bar_get_start_value(obj); +} + +int32_t lv_slider_get_min_value(const lv_obj_t * obj) +{ + return lv_bar_get_min_value(obj); +} + +int32_t lv_slider_get_max_value(const lv_obj_t * obj) +{ + return lv_bar_get_max_value(obj); +} + +lv_slider_mode_t lv_slider_get_mode(lv_obj_t * slider) +{ + lv_bar_mode_t mode = lv_bar_get_mode(slider); + if(mode == LV_BAR_MODE_SYMMETRICAL) return LV_SLIDER_MODE_SYMMETRICAL; + else if(mode == LV_BAR_MODE_RANGE) return LV_SLIDER_MODE_RANGE; + else return LV_SLIDER_MODE_NORMAL; +} + +bool lv_slider_is_symmetrical(lv_obj_t * obj) +{ + return lv_bar_is_symmetrical(obj); +} + /********************** * STATIC FUNCTIONS **********************/ @@ -123,13 +180,13 @@ static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e) lv_area_t a; lv_area_copy(&a, &slider->right_knob_area); lv_area_increase(&a, ext_click_area, ext_click_area); - info->res = _lv_area_is_point_on(&a, info->point, 0); + info->res = lv_area_is_point_on(&a, info->point, 0); /*There's still a chance that there is a hit if there is another knob*/ if((info->res == false) && (type == LV_SLIDER_MODE_RANGE)) { lv_area_copy(&a, &slider->left_knob_area); lv_area_increase(&a, ext_click_area, ext_click_area); - info->res = _lv_area_is_point_on(&a, info->point, 0); + info->res = lv_area_is_point_on(&a, info->point, 0); } } else if(code == LV_EVENT_PRESSED) { diff --git a/src/widgets/slider/lv_slider.h b/src/widgets/slider/lv_slider.h index 6c83c14f0..5f08a5c58 100644 --- a/src/widgets/slider/lv_slider.h +++ b/src/widgets/slider/lv_slider.h @@ -29,27 +29,11 @@ extern "C" { /********************** * TYPEDEFS **********************/ -enum _lv_slider_mode_t { +typedef enum { LV_SLIDER_MODE_NORMAL = LV_BAR_MODE_NORMAL, LV_SLIDER_MODE_SYMMETRICAL = LV_BAR_MODE_SYMMETRICAL, LV_SLIDER_MODE_RANGE = LV_BAR_MODE_RANGE -}; - -#ifdef DOXYGEN -typedef _lv_slider_mode_t lv_slider_mode_t; -#else -typedef uint8_t lv_slider_mode_t; -#endif /*DOXYGEN*/ - -typedef struct { - lv_bar_t bar; /*Add the ancestor's type first*/ - lv_area_t left_knob_area; - lv_area_t right_knob_area; - lv_point_t pressed_point; - int32_t * value_to_set; /*Which bar value to set*/ - uint8_t dragging : 1; /*1: the slider is being dragged*/ - uint8_t left_knob_focus : 1; /*1: with encoder now the right knob can be adjusted*/ -} lv_slider_t; +} lv_slider_mode_t; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_slider_class; @@ -74,10 +58,7 @@ lv_obj_t * lv_slider_create(lv_obj_t * parent); * @param value the new value * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately */ -static inline void lv_slider_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) -{ - lv_bar_set_value(obj, value, anim); -} +void lv_slider_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim); /** * Set a new value for the left knob of a slider @@ -85,10 +66,7 @@ static inline void lv_slider_set_value(lv_obj_t * obj, int32_t value, lv_anim_en * @param value new value * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately */ -static inline void lv_slider_set_left_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) -{ - lv_bar_set_start_value(obj, value, anim); -} +void lv_slider_set_left_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim); /** * Set minimum and the maximum values of a bar @@ -96,20 +74,14 @@ static inline void lv_slider_set_left_value(lv_obj_t * obj, int32_t value, lv_an * @param min minimum value * @param max maximum value */ -static inline void lv_slider_set_range(lv_obj_t * obj, int32_t min, int32_t max) -{ - lv_bar_set_range(obj, min, max); -} +void lv_slider_set_range(lv_obj_t * obj, int32_t min, int32_t max); /** * Set the mode of slider. * @param obj pointer to a slider object * @param mode the mode of the slider. See ::lv_slider_mode_t */ -static inline void lv_slider_set_mode(lv_obj_t * obj, lv_slider_mode_t mode) -{ - lv_bar_set_mode(obj, (lv_bar_mode_t)mode); -} +void lv_slider_set_mode(lv_obj_t * obj, lv_slider_mode_t mode); /*===================== * Getter functions @@ -120,40 +92,28 @@ static inline void lv_slider_set_mode(lv_obj_t * obj, lv_slider_mode_t mode) * @param obj pointer to a slider object * @return the value of the main knob of the slider */ -static inline int32_t lv_slider_get_value(const lv_obj_t * obj) -{ - return lv_bar_get_value(obj); -} +int32_t lv_slider_get_value(const lv_obj_t * obj); /** * Get the value of the left knob of a slider * @param obj pointer to a slider object * @return the value of the left knob of the slider */ -static inline int32_t lv_slider_get_left_value(const lv_obj_t * obj) -{ - return lv_bar_get_start_value(obj); -} +int32_t lv_slider_get_left_value(const lv_obj_t * obj); /** * Get the minimum value of a slider * @param obj pointer to a slider object * @return the minimum value of the slider */ -static inline int32_t lv_slider_get_min_value(const lv_obj_t * obj) -{ - return lv_bar_get_min_value(obj); -} +int32_t lv_slider_get_min_value(const lv_obj_t * obj); /** * Get the maximum value of a slider * @param obj pointer to a slider object * @return the maximum value of the slider */ -static inline int32_t lv_slider_get_max_value(const lv_obj_t * obj) -{ - return lv_bar_get_max_value(obj); -} +int32_t lv_slider_get_max_value(const lv_obj_t * obj); /** * Give the slider is being dragged or not @@ -167,23 +127,14 @@ bool lv_slider_is_dragged(const lv_obj_t * obj); * @param slider pointer to a slider object * @return see ::lv_slider_mode_t */ -static inline lv_slider_mode_t lv_slider_get_mode(lv_obj_t * slider) -{ - lv_bar_mode_t mode = lv_bar_get_mode(slider); - if(mode == LV_BAR_MODE_SYMMETRICAL) return LV_SLIDER_MODE_SYMMETRICAL; - else if(mode == LV_BAR_MODE_RANGE) return LV_SLIDER_MODE_RANGE; - else return LV_SLIDER_MODE_NORMAL; -} +lv_slider_mode_t lv_slider_get_mode(lv_obj_t * slider); /** * Give the slider is in symmetrical mode or not * @param obj pointer to slider object * @return true: in symmetrical mode false : not in */ -static inline bool lv_slider_is_symmetrical(lv_obj_t * obj) -{ - return lv_bar_is_symmetrical(obj); -} +bool lv_slider_is_symmetrical(lv_obj_t * obj); /********************** * MACROS diff --git a/src/widgets/slider/lv_slider_private.h b/src/widgets/slider/lv_slider_private.h new file mode 100644 index 000000000..ad1d7e792 --- /dev/null +++ b/src/widgets/slider/lv_slider_private.h @@ -0,0 +1,55 @@ +/** + * @file lv_slider_private.h + * + */ + +#ifndef LV_SLIDER_PRIVATE_H +#define LV_SLIDER_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../bar/lv_bar_private.h" +#include "lv_slider.h" + +#if LV_USE_SLIDER != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_slider_t { + lv_bar_t bar; /*Add the ancestor's type first*/ + lv_area_t left_knob_area; + lv_area_t right_knob_area; + lv_point_t pressed_point; + int32_t * value_to_set; /*Which bar value to set*/ + uint8_t dragging : 1; /*1: the slider is being dragged*/ + uint8_t left_knob_focus : 1; /*1: with encoder now the right knob can be adjusted*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_SLIDER != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SLIDER_PRIVATE_H*/ diff --git a/src/widgets/span/lv_span.c b/src/widgets/span/lv_span.c index df38d4431..5e5291008 100644 --- a/src/widgets/span/lv_span.c +++ b/src/widgets/span/lv_span.c @@ -6,7 +6,10 @@ /********************* * INCLUDES *********************/ -#include "lv_span.h" +#include "../../misc/lv_area_private.h" +#include "../../draw/lv_draw_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_span_private.h" #if LV_USE_SPAN != 0 @@ -51,7 +54,7 @@ static const lv_font_t * lv_span_get_style_text_font(lv_obj_t * par, lv_span_t * static int32_t lv_span_get_style_text_letter_space(lv_obj_t * par, lv_span_t * span); static lv_color_t lv_span_get_style_text_color(lv_obj_t * par, lv_span_t * span); static lv_opa_t lv_span_get_style_text_opa(lv_obj_t * par, lv_span_t * span); -static lv_opa_t lv_span_get_style_text_blend_mode(lv_obj_t * par, lv_span_t * span); +static lv_blend_mode_t lv_span_get_style_text_blend_mode(lv_obj_t * par, lv_span_t * span); static int32_t lv_span_get_style_text_decor(lv_obj_t * par, lv_span_t * span); static inline void span_text_check(const char ** text); @@ -117,7 +120,7 @@ lv_span_t * lv_spangroup_new_span(lv_obj_t * obj) LV_ASSERT_OBJ(obj, MY_CLASS); lv_spangroup_t * spans = (lv_spangroup_t *)obj; - lv_span_t * span = _lv_ll_ins_tail(&spans->child_ll); + lv_span_t * span = lv_ll_ins_tail(&spans->child_ll); LV_ASSERT_MALLOC(span); lv_style_init(&span->style); @@ -139,9 +142,9 @@ void lv_spangroup_delete_span(lv_obj_t * obj, lv_span_t * span) LV_ASSERT_OBJ(obj, MY_CLASS); lv_spangroup_t * spans = (lv_spangroup_t *)obj; lv_span_t * cur_span; - _LV_LL_READ(&spans->child_ll, cur_span) { + LV_LL_READ(&spans->child_ll, cur_span) { if(cur_span == span) { - _lv_ll_remove(&spans->child_ll, cur_span); + lv_ll_remove(&spans->child_ll, cur_span); if(cur_span->txt && cur_span->static_flag == 0) { lv_free(cur_span->txt); cur_span->txt = NULL; @@ -211,7 +214,7 @@ void lv_spangroup_set_overflow(lv_obj_t * obj, lv_span_overflow_t overflow) LV_ASSERT_OBJ(obj, MY_CLASS); lv_spangroup_t * spans = (lv_spangroup_t *)obj; if(spans->overflow == overflow) return; - if(overflow >= _LV_SPAN_OVERFLOW_LAST) return; + if(overflow >= LV_SPAN_OVERFLOW_LAST) return; spans->overflow = overflow; lv_obj_invalidate(obj); } @@ -232,7 +235,7 @@ void lv_spangroup_set_mode(lv_obj_t * obj, lv_span_mode_t mode) LV_ASSERT_OBJ(obj, MY_CLASS); lv_spangroup_t * spans = (lv_spangroup_t *)obj; - if(mode >= _LV_SPAN_MODE_LAST) return; + if(mode >= LV_SPAN_MODE_LAST) return; spans->mode = mode; lv_spangroup_refr_mode(obj); @@ -250,6 +253,11 @@ void lv_spangroup_set_max_lines(lv_obj_t * obj, int32_t lines) * Getter functions *====================*/ +lv_style_t * lv_span_get_style(lv_span_t * span) +{ + return &span->style; +} + lv_span_t * lv_spangroup_get_child(const lv_obj_t * obj, int32_t id) { if(obj == NULL) { @@ -275,11 +283,11 @@ lv_span_t * lv_spangroup_get_child(const lv_obj_t * obj, int32_t id) return (lv_span_t *) cur_node; } if(traverse_forwards) { - cur_node = (lv_ll_node_t *) _lv_ll_get_next(linked_list, cur_node); + cur_node = (lv_ll_node_t *) lv_ll_get_next(linked_list, cur_node); cur_idx++; } else { - cur_node = (lv_ll_node_t *) _lv_ll_get_prev(linked_list, cur_node); + cur_node = (lv_ll_node_t *) lv_ll_get_prev(linked_list, cur_node); cur_idx--; } } @@ -297,7 +305,7 @@ uint32_t lv_spangroup_get_span_count(const lv_obj_t * obj) LV_ASSERT_OBJ(obj, MY_CLASS); lv_spangroup_t * spans = (lv_spangroup_t *)obj; - return _lv_ll_get_len(&(spans->child_ll)); + return lv_ll_get_len(&(spans->child_ll)); } lv_text_align_t lv_spangroup_get_align(lv_obj_t * obj) @@ -374,7 +382,7 @@ int32_t lv_spangroup_get_max_line_height(lv_obj_t * obj) int32_t max_line_h = 0; lv_span_t * cur_span; - _LV_LL_READ(&spans->child_ll, cur_span) { + LV_LL_READ(&spans->child_ll, cur_span) { const lv_font_t * font = lv_span_get_style_text_font(obj, cur_span); int32_t line_h = lv_font_get_line_height(font); if(line_h > max_line_h) { @@ -390,14 +398,14 @@ uint32_t lv_spangroup_get_expand_width(lv_obj_t * obj, uint32_t max_width) LV_ASSERT_OBJ(obj, MY_CLASS); lv_spangroup_t * spans = (lv_spangroup_t *)obj; - if(_lv_ll_get_head(&spans->child_ll) == NULL) { + if(lv_ll_get_head(&spans->child_ll) == NULL) { return 0; } uint32_t width = LV_COORD_IS_PCT(spans->indent) ? 0 : spans->indent; lv_span_t * cur_span; int32_t letter_space = 0; - _LV_LL_READ(&spans->child_ll, cur_span) { + LV_LL_READ(&spans->child_ll, cur_span) { const lv_font_t * font = lv_span_get_style_text_font(obj, cur_span); letter_space = lv_span_get_style_text_letter_space(obj, cur_span); uint32_t j = 0; @@ -421,7 +429,7 @@ int32_t lv_spangroup_get_expand_height(lv_obj_t * obj, int32_t width) { LV_ASSERT_OBJ(obj, MY_CLASS); lv_spangroup_t * spans = (lv_spangroup_t *)obj; - if(_lv_ll_get_head(&spans->child_ll) == NULL || width <= 0) { + if(lv_ll_get_head(&spans->child_ll) == NULL || width <= 0) { return 0; } @@ -436,7 +444,7 @@ int32_t lv_spangroup_get_expand_height(lv_obj_t * obj, int32_t width) lv_point_t txt_pos; lv_point_set(&txt_pos, 0, indent); /* first line need add indent */ - lv_span_t * cur_span = _lv_ll_get_head(&spans->child_ll); + lv_span_t * cur_span = lv_ll_get_head(&spans->child_ll); const char * cur_txt = cur_span->txt; span_text_check(&cur_txt); uint32_t cur_txt_ofs = 0; @@ -454,7 +462,7 @@ int32_t lv_spangroup_get_expand_height(lv_obj_t * obj, int32_t width) while(1) { /* switch to the next span when current is end */ if(cur_txt[cur_txt_ofs] == '\0') { - cur_span = _lv_ll_get_next(&spans->child_ll, cur_span); + cur_span = lv_ll_get_next(&spans->child_ll, cur_span); if(cur_span == NULL) break; cur_txt = cur_span->txt; span_text_check(&cur_txt); @@ -480,7 +488,7 @@ int32_t lv_spangroup_get_expand_height(lv_obj_t * obj, int32_t width) /* break word deal width */ if(isfill && next_ofs > 0 && snippet_cnt > 0) { int32_t drawn_width = use_width; - if(_lv_ll_get_next(&spans->child_ll, cur_span) == NULL) { + if(lv_ll_get_next(&spans->child_ll, cur_span) == NULL) { drawn_width -= snippet.letter_space; } if(max_w < drawn_width) { @@ -534,7 +542,7 @@ static void lv_spangroup_constructor(const lv_obj_class_t * class_p, lv_obj_t * { LV_UNUSED(class_p); lv_spangroup_t * spans = (lv_spangroup_t *)obj; - _lv_ll_init(&spans->child_ll, sizeof(lv_span_t)); + lv_ll_init(&spans->child_ll, sizeof(lv_span_t)); spans->indent = 0; spans->lines = -1; spans->mode = LV_SPAN_MODE_EXPAND; @@ -548,16 +556,16 @@ static void lv_spangroup_destructor(const lv_obj_class_t * class_p, lv_obj_t * o { LV_UNUSED(class_p); lv_spangroup_t * spans = (lv_spangroup_t *)obj; - lv_span_t * cur_span = _lv_ll_get_head(&spans->child_ll); + lv_span_t * cur_span = lv_ll_get_head(&spans->child_ll); while(cur_span) { - _lv_ll_remove(&spans->child_ll, cur_span); + lv_ll_remove(&spans->child_ll, cur_span); if(cur_span->txt && cur_span->static_flag == 0) { lv_free(cur_span->txt); cur_span->txt = NULL; } lv_style_reset(&cur_span->style); lv_free(cur_span); - cur_span = _lv_ll_get_head(&spans->child_ll); + cur_span = lv_ll_get_head(&spans->child_ll); } } @@ -688,8 +696,8 @@ static const lv_font_t * lv_span_get_style_text_font(lv_obj_t * par, lv_span_t * { const lv_font_t * font; lv_style_value_t value; - lv_result_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_FONT, &value); - if(res != LV_RESULT_OK) { + lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_FONT, &value); + if(res != LV_STYLE_RES_FOUND) { font = lv_obj_get_style_text_font(par, LV_PART_MAIN); } else { @@ -702,8 +710,8 @@ static int32_t lv_span_get_style_text_letter_space(lv_obj_t * par, lv_span_t * s { int32_t letter_space; lv_style_value_t value; - lv_result_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_LETTER_SPACE, &value); - if(res != LV_RESULT_OK) { + lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_LETTER_SPACE, &value); + if(res != LV_STYLE_RES_FOUND) { letter_space = lv_obj_get_style_text_letter_space(par, LV_PART_MAIN); } else { @@ -715,8 +723,8 @@ static int32_t lv_span_get_style_text_letter_space(lv_obj_t * par, lv_span_t * s static lv_color_t lv_span_get_style_text_color(lv_obj_t * par, lv_span_t * span) { lv_style_value_t value; - lv_result_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_COLOR, &value); - if(res != LV_RESULT_OK) { + lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_COLOR, &value); + if(res != LV_STYLE_RES_FOUND) { value.color = lv_obj_get_style_text_color(par, LV_PART_MAIN); } return value.color; @@ -726,8 +734,8 @@ static lv_opa_t lv_span_get_style_text_opa(lv_obj_t * par, lv_span_t * span) { lv_opa_t opa; lv_style_value_t value; - lv_result_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_OPA, &value); - if(res != LV_RESULT_OK) { + lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_OPA, &value); + if(res != LV_STYLE_RES_FOUND) { opa = (lv_opa_t)lv_obj_get_style_text_opa(par, LV_PART_MAIN); } else { @@ -740,8 +748,8 @@ static lv_blend_mode_t lv_span_get_style_text_blend_mode(lv_obj_t * par, lv_span { lv_blend_mode_t mode; lv_style_value_t value; - lv_result_t res = lv_style_get_prop(&span->style, LV_STYLE_BLEND_MODE, &value); - if(res != LV_RESULT_OK) { + lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_BLEND_MODE, &value); + if(res != LV_STYLE_RES_FOUND) { mode = (lv_blend_mode_t)lv_obj_get_style_blend_mode(par, LV_PART_MAIN); } else { @@ -754,8 +762,8 @@ static int32_t lv_span_get_style_text_decor(lv_obj_t * par, lv_span_t * span) { int32_t decor; lv_style_value_t value; - lv_result_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_DECOR, &value); - if(res != LV_RESULT_OK) { + lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_DECOR, &value); + if(res != LV_STYLE_RES_FOUND) { decor = (lv_text_decor_t)lv_obj_get_style_text_decor(par, LV_PART_MAIN);; } else { @@ -804,13 +812,13 @@ static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer) lv_spangroup_t * spans = (lv_spangroup_t *)obj; /* return if not span */ - if(_lv_ll_get_head(&spans->child_ll) == NULL) { + if(lv_ll_get_head(&spans->child_ll) == NULL) { return; } /* return if no draw area */ lv_area_t clip_area; - if(!_lv_area_intersect(&clip_area, &coords, &layer->_clip_area)) return; + if(!lv_area_intersect(&clip_area, &coords, &layer->_clip_area)) return; const lv_area_t clip_area_ori = layer->_clip_area; layer->_clip_area = clip_area; @@ -827,7 +835,7 @@ static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer) txt_pos.y = coords.y1; txt_pos.x = coords.x1 + indent; /* first line need add indent */ - lv_span_t * cur_span = _lv_ll_get_head(&spans->child_ll); + lv_span_t * cur_span = lv_ll_get_head(&spans->child_ll); const char * cur_txt = cur_span->txt; span_text_check(&cur_txt); uint32_t cur_txt_ofs = 0; @@ -850,7 +858,7 @@ static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer) while(1) { /* switch to the next span when current is end */ if(cur_txt[cur_txt_ofs] == '\0') { - cur_span = _lv_ll_get_next(&spans->child_ll, cur_span); + cur_span = lv_ll_get_next(&spans->child_ll, cur_span); if(cur_span == NULL) break; cur_txt = cur_span->txt; span_text_check(&cur_txt); @@ -876,7 +884,7 @@ static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer) if(isfill) { if(next_ofs > 0 && lv_get_snippet_count() > 0) { int32_t drawn_width = use_width; - if(_lv_ll_get_next(&spans->child_ll, cur_span) == NULL) { + if(lv_ll_get_next(&spans->child_ll, cur_span) == NULL) { drawn_width -= snippet.letter_space; } /* To prevent infinite loops, the lv_text_get_next_line() may return incomplete words, */ @@ -925,7 +933,7 @@ static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer) int32_t next_line_h = last_snippet->line_h; if(last_snippet->txt[last_snippet->bytes] == '\0') { next_line_h = 0; - lv_span_t * next_span = _lv_ll_get_next(&spans->child_ll, last_snippet->span); + lv_span_t * next_span = lv_ll_get_next(&spans->child_ll, last_snippet->span); if(next_span) { /* have the next line */ next_line_h = lv_font_get_line_height(lv_span_get_style_text_font(obj, next_span)) + line_space; } diff --git a/src/widgets/span/lv_span.h b/src/widgets/span/lv_span.h index 0b0386913..2eed5888b 100644 --- a/src/widgets/span/lv_span.h +++ b/src/widgets/span/lv_span.h @@ -28,50 +28,18 @@ extern "C" { /********************** * TYPEDEFS **********************/ -enum _lv_span_overflow_t { +typedef enum { LV_SPAN_OVERFLOW_CLIP, LV_SPAN_OVERFLOW_ELLIPSIS, - _LV_SPAN_OVERFLOW_LAST, /**< Fence member*/ -}; + LV_SPAN_OVERFLOW_LAST, /**< Fence member*/ +} lv_span_overflow_t; -#ifdef DOXYGEN -typedef _lv_span_overflow_t lv_span_overflow_t; -#else -typedef uint32_t lv_span_overflow_t; -#endif /*DOXYGEN*/ - -enum _lv_span_mode_t { +typedef enum { LV_SPAN_MODE_FIXED, /**< fixed the obj size*/ LV_SPAN_MODE_EXPAND, /**< Expand the object size to the text size*/ LV_SPAN_MODE_BREAK, /**< Keep width, break the too long lines and expand height*/ - _LV_SPAN_MODE_LAST /**< Fence member*/ -}; - -#ifdef DOXYGEN -typedef _lv_span_mode_t lv_span_mode_t; -#else -typedef uint32_t lv_span_mode_t; -#endif /*DOXYGEN*/ - -typedef struct { - char * txt; /* a pointer to display text */ - lv_obj_t * spangroup; /* a pointer to spangroup */ - lv_style_t style; /* display text style */ - uint32_t static_flag : 1;/* the text is static flag */ -} lv_span_t; - -/** Data of label*/ -typedef struct { - lv_obj_t obj; - int32_t lines; - int32_t indent; /* first line indent */ - int32_t cache_w; /* the cache automatically calculates the width */ - int32_t cache_h; /* similar cache_w */ - lv_ll_t child_ll; - uint32_t mode : 2; /* details see lv_span_mode_t */ - uint32_t overflow : 1; /* details see lv_span_overflow_t */ - uint32_t refresh : 1; /* the spangroup need refresh cache_w and cache_h */ -} lv_spangroup_t; + LV_SPAN_MODE_LAST /**< Fence member*/ +} lv_span_mode_t; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_spangroup_class; @@ -161,6 +129,13 @@ void lv_spangroup_set_max_lines(lv_obj_t * obj, int32_t lines); * Getter functions *====================*/ +/** + * Get a pointer to the style of a span + * @param span pointer to the span + * @return pointer to the style. valid as long as the span is valid +*/ +lv_style_t * lv_span_get_style(lv_span_t * span); + /** * Get a spangroup child by its index. * diff --git a/src/widgets/span/lv_span_private.h b/src/widgets/span/lv_span_private.h new file mode 100644 index 000000000..1fb031fe3 --- /dev/null +++ b/src/widgets/span/lv_span_private.h @@ -0,0 +1,65 @@ +/** + * @file lv_span_private.h + * + */ + +#ifndef LV_SPAN_PRIVATE_H +#define LV_SPAN_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_span.h" + +#if LV_USE_SPAN != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_span_t { + char * txt; /* a pointer to display text */ + lv_obj_t * spangroup; /* a pointer to spangroup */ + lv_style_t style; /* display text style */ + uint32_t static_flag : 1;/* the text is static flag */ +}; + +/** Data of label*/ +struct lv_spangroup_t { + lv_obj_t obj; + int32_t lines; + int32_t indent; /* first line indent */ + int32_t cache_w; /* the cache automatically calculates the width */ + int32_t cache_h; /* similar cache_w */ + lv_ll_t child_ll; + uint32_t mode : 2; /* details see lv_span_mode_t */ + uint32_t overflow : 1; /* details see lv_span_overflow_t */ + uint32_t refresh : 1; /* the spangroup need refresh cache_w and cache_h */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_SPAN != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SPAN_PRIVATE_H*/ diff --git a/src/widgets/spinbox/lv_spinbox.c b/src/widgets/spinbox/lv_spinbox.c index 667c310b3..5ee9f465b 100644 --- a/src/widgets/spinbox/lv_spinbox.c +++ b/src/widgets/spinbox/lv_spinbox.c @@ -6,7 +6,8 @@ /********************* * INCLUDES *********************/ -#include "lv_spinbox.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_spinbox_private.h" #if LV_USE_SPINBOX #include "../../misc/lv_assert.h" diff --git a/src/widgets/spinbox/lv_spinbox.h b/src/widgets/spinbox/lv_spinbox.h index 267026f2e..ae3fdb0c4 100644 --- a/src/widgets/spinbox/lv_spinbox.h +++ b/src/widgets/spinbox/lv_spinbox.h @@ -31,20 +31,6 @@ extern "C" { * TYPEDEFS **********************/ -/*Data of spinbox*/ -typedef struct { - lv_textarea_t ta; /*Ext. of ancestor*/ - /*New data for this type*/ - int32_t value; - int32_t range_max; - int32_t range_min; - int32_t step; - uint32_t digit_count : 4; - uint32_t dec_point_pos : 4; /*if 0, there is no separator and the number is an integer*/ - uint32_t rollover : 1; /* Set to true for rollover functionality*/ - uint32_t digit_step_dir : 2; /* the direction the digit will step on encoder button press when editing*/ -} lv_spinbox_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_spinbox_class; /********************** diff --git a/src/widgets/spinbox/lv_spinbox_private.h b/src/widgets/spinbox/lv_spinbox_private.h new file mode 100644 index 000000000..50333a8cb --- /dev/null +++ b/src/widgets/spinbox/lv_spinbox_private.h @@ -0,0 +1,59 @@ +/** + * @file lv_spinbox_private.h + * + */ + +#ifndef LV_SPINBOX_PRIVATE_H +#define LV_SPINBOX_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../textarea/lv_textarea_private.h" +#include "lv_spinbox.h" + +#if LV_USE_SPINBOX + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of spinbox*/ +struct lv_spinbox_t { + lv_textarea_t ta; /*Ext. of ancestor*/ + /*New data for this type*/ + int32_t value; + int32_t range_max; + int32_t range_min; + int32_t step; + uint32_t digit_count : 4; + uint32_t dec_point_pos : 4; /*if 0, there is no separator and the number is an integer*/ + uint32_t rollover : 1; /* Set to true for rollover functionality*/ + uint32_t digit_step_dir : 2; /* the direction the digit will step on encoder button press when editing*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_SPINBOX */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SPINBOX_PRIVATE_H*/ diff --git a/src/widgets/spinner/lv_spinner.c b/src/widgets/spinner/lv_spinner.c index 9b1daa8ef..18cb0050f 100644 --- a/src/widgets/spinner/lv_spinner.c +++ b/src/widgets/spinner/lv_spinner.c @@ -6,6 +6,8 @@ /********************* * INCLUDES *********************/ +#include "../../misc/lv_anim_private.h" +#include "../../core/lv_obj_class_private.h" #include "../../lvgl.h" #if LV_USE_SPINNER diff --git a/src/widgets/switch/lv_switch.c b/src/widgets/switch/lv_switch.c index f1973e9c4..8aa6bbe4e 100644 --- a/src/widgets/switch/lv_switch.c +++ b/src/widgets/switch/lv_switch.c @@ -6,13 +6,15 @@ /********************* * INCLUDES *********************/ -#include "lv_switch.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_switch_private.h" #if LV_USE_SWITCH != 0 #include "../../misc/lv_assert.h" #include "../../misc/lv_math.h" -#include "../../misc/lv_anim.h" +#include "../../misc/lv_anim_private.h" #include "../../indev/lv_indev.h" #include "../../display/lv_display.h" @@ -127,7 +129,7 @@ static void lv_switch_event(const lv_obj_class_t * class_p, lv_event_t * e) /*The smaller size is the knob diameter*/ int32_t knob_size = LV_MAX4(knob_left, knob_right, knob_bottom, knob_top); - knob_size += _LV_SWITCH_KNOB_EXT_AREA_CORRECTION; + knob_size += LV_SWITCH_KNOB_EXT_AREA_CORRECTION; knob_size += lv_obj_calculate_ext_draw_size(obj, LV_PART_KNOB); int32_t * s = lv_event_get_param(e); diff --git a/src/widgets/switch/lv_switch.h b/src/widgets/switch/lv_switch.h index da14450aa..989a3dd1b 100644 --- a/src/widgets/switch/lv_switch.h +++ b/src/widgets/switch/lv_switch.h @@ -24,16 +24,7 @@ extern "C" { *********************/ /** Switch knob extra area correction factor */ -#define _LV_SWITCH_KNOB_EXT_AREA_CORRECTION 2 - -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_obj_t obj; - int32_t anim_state; -} lv_switch_t; +#define LV_SWITCH_KNOB_EXT_AREA_CORRECTION 2 LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_switch_class; diff --git a/src/widgets/switch/lv_switch_private.h b/src/widgets/switch/lv_switch_private.h new file mode 100644 index 000000000..7f43d37b1 --- /dev/null +++ b/src/widgets/switch/lv_switch_private.h @@ -0,0 +1,53 @@ +/** + * @file lv_switch_private.h + * + */ + +#ifndef LV_SWITCH_PRIVATE_H +#define LV_SWITCH_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_switch.h" + +#if LV_USE_SWITCH != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_switch_t { + lv_obj_t obj; + int32_t anim_state; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_SWITCH != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SWITCH_PRIVATE_H*/ diff --git a/src/widgets/table/lv_table.c b/src/widgets/table/lv_table.c index 733fe04f7..a55c0fc7e 100644 --- a/src/widgets/table/lv_table.c +++ b/src/widgets/table/lv_table.c @@ -6,7 +6,10 @@ /********************* * INCLUDES *********************/ -#include "lv_table.h" +#include "../../misc/lv_area_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_table_private.h" #if LV_USE_TABLE != 0 #include "../../indev/lv_indev.h" @@ -15,7 +18,7 @@ #include "../../misc/lv_text_ap.h" #include "../../misc/lv_math.h" #include "../../stdlib/lv_sprintf.h" -#include "../../draw/lv_draw.h" +#include "../../draw/lv_draw_private.h" #include "../../stdlib/lv_string.h" /********************* @@ -166,14 +169,14 @@ void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint32_t row, uint32_t col, con lv_vsnprintf(raw_txt, len + 1, fmt, ap2); /*Get the size of the Arabic text and process it*/ - size_t len_ap = _lv_text_ap_calc_bytes_count(raw_txt); + size_t len_ap = lv_text_ap_calc_bytes_count(raw_txt); table->cell_data[cell] = lv_realloc(table->cell_data[cell], sizeof(lv_table_cell_t) + len_ap + 1); LV_ASSERT_MALLOC(table->cell_data[cell]); if(table->cell_data[cell] == NULL) { va_end(ap2); return; } - _lv_text_ap_proc(raw_txt, table->cell_data[cell]->txt); + lv_text_ap_proc(raw_txt, table->cell_data[cell]->txt); lv_free(raw_txt); #else @@ -671,7 +674,7 @@ static void draw_main(lv_event_t * e) lv_table_t * table = (lv_table_t *)obj; lv_layer_t * layer = lv_event_get_layer(e); lv_area_t clip_area; - if(!_lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area)) return; + if(!lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area)) return; const lv_area_t clip_area_ori = layer->_clip_area; layer->_clip_area = clip_area; @@ -837,7 +840,7 @@ static void draw_main(lv_event_t * e) lv_area_t label_clip_area; bool label_mask_ok; - label_mask_ok = _lv_area_intersect(&label_clip_area, &clip_area, &cell_area); + label_mask_ok = lv_area_intersect(&label_clip_area, &clip_area, &cell_area); if(label_mask_ok) { layer->_clip_area = label_clip_area; label_dsc_act.text = table->cell_data[cell]->txt; @@ -1037,7 +1040,7 @@ static size_t get_cell_txt_len(const char * txt) size_t retval = 0; #if LV_USE_ARABIC_PERSIAN_CHARS - retval = sizeof(lv_table_cell_t) + _lv_text_ap_calc_bytes_count(txt) + 1; + retval = sizeof(lv_table_cell_t) + lv_text_ap_calc_bytes_count(txt) + 1; #else retval = sizeof(lv_table_cell_t) + lv_strlen(txt) + 1; #endif @@ -1049,7 +1052,7 @@ static size_t get_cell_txt_len(const char * txt) static void copy_cell_txt(lv_table_cell_t * dst, const char * txt) { #if LV_USE_ARABIC_PERSIAN_CHARS - _lv_text_ap_proc(txt, dst->txt); + lv_text_ap_proc(txt, dst->txt); #else lv_strcpy(dst->txt, txt); #endif diff --git a/src/widgets/table/lv_table.h b/src/widgets/table/lv_table.h index c257996ee..0d615a1b1 100644 --- a/src/widgets/table/lv_table.h +++ b/src/widgets/table/lv_table.h @@ -33,39 +33,14 @@ LV_EXPORT_CONST_INT(LV_TABLE_CELL_NONE); * TYPEDEFS **********************/ -enum _lv_table_cell_ctrl_t { +typedef enum { LV_TABLE_CELL_CTRL_MERGE_RIGHT = 1 << 0, LV_TABLE_CELL_CTRL_TEXT_CROP = 1 << 1, LV_TABLE_CELL_CTRL_CUSTOM_1 = 1 << 4, LV_TABLE_CELL_CTRL_CUSTOM_2 = 1 << 5, LV_TABLE_CELL_CTRL_CUSTOM_3 = 1 << 6, LV_TABLE_CELL_CTRL_CUSTOM_4 = 1 << 7, -}; - -#ifdef DOXYGEN -typedef _lv_table_cell_ctrl_t lv_table_cell_ctrl_t; -#else -typedef uint32_t lv_table_cell_ctrl_t; -#endif /*DOXYGEN*/ - -/*Data of cell*/ -typedef struct { - lv_table_cell_ctrl_t ctrl; - void * user_data; /**< Custom user data*/ - char txt[1]; /**< Variable length array*/ -} lv_table_cell_t; - -/*Data of table*/ -typedef struct { - lv_obj_t obj; - uint32_t col_cnt; - uint32_t row_cnt; - lv_table_cell_t ** cell_data; - int32_t * row_h; - int32_t * col_w; - uint32_t col_act; - uint32_t row_act; -} lv_table_t; +} lv_table_cell_ctrl_t; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_table_class; diff --git a/src/widgets/table/lv_table_private.h b/src/widgets/table/lv_table_private.h new file mode 100644 index 000000000..410db7092 --- /dev/null +++ b/src/widgets/table/lv_table_private.h @@ -0,0 +1,63 @@ +/** + * @file lv_table_private.h + * + */ + +#ifndef LV_TABLE_PRIVATE_H +#define LV_TABLE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_table.h" + +#if LV_USE_TABLE != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of cell*/ +struct lv_table_cell_t { + lv_table_cell_ctrl_t ctrl; + void * user_data; /**< Custom user data*/ + char txt[1]; /**< Variable length array*/ +}; + +/*Data of table*/ +struct lv_table_t { + lv_obj_t obj; + uint32_t col_cnt; + uint32_t row_cnt; + lv_table_cell_t ** cell_data; + int32_t * row_h; + int32_t * col_w; + uint32_t col_act; + uint32_t row_act; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_TABLE != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TABLE_PRIVATE_H*/ diff --git a/src/widgets/tabview/lv_tabview.c b/src/widgets/tabview/lv_tabview.c index e6bd36805..29e3e2e27 100644 --- a/src/widgets/tabview/lv_tabview.c +++ b/src/widgets/tabview/lv_tabview.c @@ -6,6 +6,8 @@ /********************* * INCLUDES *********************/ +#include "lv_tabview_private.h" +#include "../../core/lv_obj_class_private.h" #include "../../lvgl.h" #if LV_USE_TABVIEW @@ -168,6 +170,11 @@ void lv_tabview_set_tab_bar_position(lv_obj_t * obj, lv_dir_t dir) case LV_DIR_RIGHT: lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW_REVERSE); break; + case LV_DIR_HOR: + case LV_DIR_VER: + case LV_DIR_ALL: + case LV_DIR_NONE: + break; } lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); @@ -192,6 +199,11 @@ void lv_tabview_set_tab_bar_position(lv_obj_t * obj, lv_dir_t dir) lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_NONE); lv_obj_set_scroll_snap_y(cont, LV_SCROLL_SNAP_CENTER); break; + case LV_DIR_HOR: + case LV_DIR_VER: + case LV_DIR_ALL: + case LV_DIR_NONE: + break; } bool was_ver = tabview->tab_pos & LV_DIR_VER; diff --git a/src/widgets/tabview/lv_tabview.h b/src/widgets/tabview/lv_tabview.h index edb464d8d..e5cb0c3ae 100644 --- a/src/widgets/tabview/lv_tabview.h +++ b/src/widgets/tabview/lv_tabview.h @@ -22,16 +22,6 @@ extern "C" { * DEFINES *********************/ -/********************** - * TYPEDEFS - **********************/ - -typedef struct { - lv_obj_t obj; - uint32_t tab_cur; - lv_dir_t tab_pos; -} lv_tabview_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_tabview_class; /********************** diff --git a/src/widgets/tabview/lv_tabview_private.h b/src/widgets/tabview/lv_tabview_private.h new file mode 100644 index 000000000..b08c96820 --- /dev/null +++ b/src/widgets/tabview/lv_tabview_private.h @@ -0,0 +1,55 @@ +/** + * @file lv_tabview_private.h + * + */ + +#ifndef LV_TABVIEW_PRIVATE_H +#define LV_TABVIEW_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_tabview.h" + +#if LV_USE_TABVIEW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_tabview_t { + lv_obj_t obj; + uint32_t tab_cur; + lv_dir_t tab_pos; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_TABVIEW */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TABVIEW_PRIVATE_H*/ diff --git a/src/widgets/textarea/lv_textarea.c b/src/widgets/textarea/lv_textarea.c index 51574677e..2aa64501e 100644 --- a/src/widgets/textarea/lv_textarea.c +++ b/src/widgets/textarea/lv_textarea.c @@ -6,7 +6,9 @@ /********************* * INCLUDES *********************/ -#include "lv_textarea.h" +#include "../label/lv_label_private.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_textarea_private.h" #if LV_USE_TEXTAREA != 0 #include "../../core/lv_group.h" @@ -14,7 +16,7 @@ #include "../../indev/lv_indev.h" #include "../../draw/lv_draw.h" #include "../../misc/lv_assert.h" -#include "../../misc/lv_anim.h" +#include "../../misc/lv_anim_private.h" #include "../../misc/lv_text_private.h" #include "../../misc/lv_math.h" #include "../../stdlib/lv_string.h" diff --git a/src/widgets/textarea/lv_textarea.h b/src/widgets/textarea/lv_textarea.h index ab90c63bd..b3007a1a5 100644 --- a/src/widgets/textarea/lv_textarea.h +++ b/src/widgets/textarea/lv_textarea.h @@ -33,36 +33,6 @@ LV_EXPORT_CONST_INT(LV_TEXTAREA_CURSOR_LAST); * TYPEDEFS **********************/ -/*Data of text area*/ -typedef struct { - lv_obj_t obj; - lv_obj_t * label; /*Label of the text area*/ - char * placeholder_txt; /*Place holder label. only visible if text is an empty string*/ - char * pwd_tmp; /*Used to store the original text in password mode*/ - char * pwd_bullet; /*Replacement characters displayed in password mode*/ - const char * accepted_chars; /*Only these characters will be accepted. NULL: accept all*/ - uint32_t max_length; /*The max. number of characters. 0: no limit*/ - uint32_t pwd_show_time; /*Time to show characters in password mode before change them to '*'*/ - struct { - int32_t valid_x; /*Used when stepping up/down to a shorter line. - *(Used by the library)*/ - uint32_t pos; /*The current cursor position - *(0: before 1st letter; 1: before 2nd letter ...)*/ - lv_area_t area; /*Cursor area relative to the Text Area*/ - uint32_t txt_byte_pos; /*Byte index of the letter after (on) the cursor*/ - uint8_t show : 1; /*Cursor is visible now or not (Handled by the library)*/ - uint8_t click_pos : 1; /*1: Enable positioning the cursor by clicking the text area*/ - } cursor; -#if LV_LABEL_TEXT_SELECTION - uint32_t sel_start; /*Temporary values for text selection*/ - uint32_t sel_end; - uint8_t text_sel_in_prog : 1; /*User is in process of selecting*/ - uint8_t text_sel_en : 1; /*Text can be selected on this text area*/ -#endif - uint8_t pwd_mode : 1; /*Replace characters with '*'*/ - uint8_t one_line : 1; /*One line mode (ignore line breaks)*/ -} lv_textarea_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_textarea_class; enum { diff --git a/src/widgets/textarea/lv_textarea_private.h b/src/widgets/textarea/lv_textarea_private.h new file mode 100644 index 000000000..e453de758 --- /dev/null +++ b/src/widgets/textarea/lv_textarea_private.h @@ -0,0 +1,75 @@ +/** + * @file lv_textarea_private.h + * + */ + +#ifndef LV_TEXTAREA_PRIVATE_H +#define LV_TEXTAREA_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_textarea.h" + +#if LV_USE_TEXTAREA != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of text area*/ +struct lv_textarea_t { + lv_obj_t obj; + lv_obj_t * label; /*Label of the text area*/ + char * placeholder_txt; /*Place holder label. only visible if text is an empty string*/ + char * pwd_tmp; /*Used to store the original text in password mode*/ + char * pwd_bullet; /*Replacement characters displayed in password mode*/ + const char * accepted_chars; /*Only these characters will be accepted. NULL: accept all*/ + uint32_t max_length; /*The max. number of characters. 0: no limit*/ + uint32_t pwd_show_time; /*Time to show characters in password mode before change them to '*'*/ + struct { + int32_t valid_x; /*Used when stepping up/down to a shorter line. + *(Used by the library)*/ + uint32_t pos; /*The current cursor position + *(0: before 1st letter; 1: before 2nd letter ...)*/ + lv_area_t area; /*Cursor area relative to the Text Area*/ + uint32_t txt_byte_pos; /*Byte index of the letter after (on) the cursor*/ + uint8_t show : 1; /*Cursor is visible now or not (Handled by the library)*/ + uint8_t click_pos : 1; /*1: Enable positioning the cursor by clicking the text area*/ + } cursor; +#if LV_LABEL_TEXT_SELECTION + uint32_t sel_start; /*Temporary values for text selection*/ + uint32_t sel_end; + uint8_t text_sel_in_prog : 1; /*User is in process of selecting*/ + uint8_t text_sel_en : 1; /*Text can be selected on this text area*/ +#endif + uint8_t pwd_mode : 1; /*Replace characters with '*'*/ + uint8_t one_line : 1; /*One line mode (ignore line breaks)*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_TEXTAREA != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEXTAREA_PRIVATE_H*/ diff --git a/src/widgets/tileview/lv_tileview.c b/src/widgets/tileview/lv_tileview.c index 400ca15c7..86a5db3c3 100644 --- a/src/widgets/tileview/lv_tileview.c +++ b/src/widgets/tileview/lv_tileview.c @@ -6,7 +6,8 @@ /********************* * INCLUDES *********************/ -#include "lv_tileview.h" +#include "../../core/lv_obj_class_private.h" +#include "lv_tileview_private.h" #include "../../indev/lv_indev.h" #include "../../indev/lv_indev_private.h" #if LV_USE_TILEVIEW diff --git a/src/widgets/tileview/lv_tileview.h b/src/widgets/tileview/lv_tileview.h index 6413a1b15..d373a2684 100644 --- a/src/widgets/tileview/lv_tileview.h +++ b/src/widgets/tileview/lv_tileview.h @@ -21,19 +21,6 @@ extern "C" { * DEFINES *********************/ -/********************** - * TYPEDEFS - **********************/ -typedef struct { - lv_obj_t obj; - lv_obj_t * tile_act; -} lv_tileview_t; - -typedef struct { - lv_obj_t obj; - lv_dir_t dir; -} lv_tileview_tile_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_tileview_class; LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_tileview_tile_class; diff --git a/src/widgets/tileview/lv_tileview_private.h b/src/widgets/tileview/lv_tileview_private.h new file mode 100644 index 000000000..5c91a409e --- /dev/null +++ b/src/widgets/tileview/lv_tileview_private.h @@ -0,0 +1,58 @@ +/** + * @file lv_tileview_private.h + * + */ + +#ifndef LV_TILEVIEW_PRIVATE_H +#define LV_TILEVIEW_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_tileview.h" + +#if LV_USE_TILEVIEW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ +struct lv_tileview_t { + lv_obj_t obj; + lv_obj_t * tile_act; +}; + +struct lv_tileview_tile_t { + lv_obj_t obj; + lv_dir_t dir; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_TILEVIEW */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TILEVIEW_PRIVATE_H*/ diff --git a/src/widgets/win/lv_win.c b/src/widgets/win/lv_win.c index 437b3af48..508d2f010 100644 --- a/src/widgets/win/lv_win.c +++ b/src/widgets/win/lv_win.c @@ -6,6 +6,8 @@ /********************* * INCLUDES *********************/ +#include "lv_win_private.h" +#include "../../core/lv_obj_class_private.h" #include "../../lvgl.h" #if LV_USE_WIN diff --git a/src/widgets/win/lv_win.h b/src/widgets/win/lv_win.h index 0f6d5a4ce..8191bd116 100644 --- a/src/widgets/win/lv_win.h +++ b/src/widgets/win/lv_win.h @@ -14,18 +14,12 @@ extern "C" { * INCLUDES *********************/ #include "../../lv_conf_internal.h" +#include "../../core/lv_obj.h" #if LV_USE_WIN /********************* * DEFINES *********************/ -/********************** - * TYPEDEFS - **********************/ -typedef struct { - lv_obj_t obj; -} lv_win_t; - LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_win_class; /********************** diff --git a/src/widgets/win/lv_win_private.h b/src/widgets/win/lv_win_private.h new file mode 100644 index 000000000..015224712 --- /dev/null +++ b/src/widgets/win/lv_win_private.h @@ -0,0 +1,52 @@ +/** + * @file lv_win_private.h + * + */ + +#ifndef LV_WIN_PRIVATE_H +#define LV_WIN_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_win.h" + +#if LV_USE_WIN + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ +struct lv_win_t { + lv_obj_t obj; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_WIN */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WIN_PRIVATE_H*/ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_image_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_image_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..8f311ca65779d7dfe658eb455b73c46616286832 GIT binary patch literal 19112 zcmeIac|4Tu-#+fXONyeqCd%5PkcmR}C5b{2vSw#S_AFyxO2wT*w$WfHLXF*o>`B>X zjO^LVGJ`S1*k%}h=cxPh{XEb2^Spk4{QmpBp6j1^z3RNK>%7kEI^XZ(eH_Qz)7yI2 z53%#Iv#_un(!O!ckcDN>NfwqrzVH7N{7W}1Ba4OQB#ZVn^*aISlu;|6;a1ezQZvUN zM-pxfM@#XE=v&rg4|N3AH)rHZwGFI@v<;f%oPT!Kt6f~VGPCn5&D^`(}81%^w0@; z!5FP&Pl%@a;Ut(jM6$Pm`-`G{SkoY6YonA5+3ZE2g|$<2 zb>3x(5~+daNP11TCKhU>Q)rSu?LBCI`%xS!?&!+Y;Zv*}DqY_;sLJDG8;QaOp+g&? z`1vzKC+d#uZ46K@!no8~4F5Av6E3zY}lS^k^?atq5Lt+_O)rq$iIeb8t}K+ z%*VtCwUxP*TNDnEO|X;$->ry7z6$?+Xrvu~OMc(^{Sl}&=7n`R!P2G zY?i2Y!nAjlMPa=ecCI?3lf=cvWsYon%x!CWJkkJiAqCg8{z~Uv8B{HNJ3V(cK-oib z*eGOo%ArRie|ViameWh>%$%Niv3h5d_L6pO^k9jo*$khMT$qsb=HGr=;k^ifz3LgH z7Q_v&@NhNWm``83SU$GkO?+jU^A!0%k96ATh_Nxc`_vcjs^<lE4Qo$%D7Y*IaBkb9vjlLdALOMr|j8dc@7YEZhBfTkl?KISCIZ!UyQkrU~zUs-Nc@>LE3{bA7P9SJUbyLc$L1NngueH;9HiT>@9kyo~}11mYUsA6qm#(iwPM8rvXn9bl*S*c2uQu|9({XI~2 zlkopC4t`Jvq8XUskDds$XdjvLbNn@mJ2EmNhh|uE)3N#0XRlg|!fL%GtX- zOST4(4mdU~E$yiOJ-@)vm#cVAxUn0I^B60~9<4@0>tj$UhwsgkUPxH@&gOXB0uo_` zdoApQgL29G+-Ust@sQu72$hHS@`U7=n=Gzu-ZOl2_^;723`V*0(aC#=L7aONo}aPc z-{6B%ik-w@>Ngi^o;`auc|H~bU3ZV+aZ?r~1#T}*w#@p{M?B1pjSV1n#}%#Xp5r|> zm=_%!G`AYqp${}92%m`2V%tti-zT7HAR^%X0F~`oPm7FTJ$N6?;9&^6wiwP^h8OYe)LANpLizIL%R@Coh$epv+DWwt{b+r0T#3V_x~ht{ zMWgoh_5G-P^4j*bJC(N86vdU;HnqGgrJbPCnN%8PY@FTocDSvV77`X5ytzgh-jms2 zU7RgCr;LrG%v-^017PN3BO@bYWBb(adwF^J`N;~#!Fa?{Mw4J-JmalJi5h(^3Poro zK3g$%?x3d;(~)tMkxab5zkm2PHM6+5xRXHG_;?_vcXV`=!C-`_W_FSSGi+>ZqU=P4 zaz0&D4j~@fRLMuz@b6yW`R)bg9pEgnAk1}(nz68a|1yKS)8VU#*2}ZX17W)4)n*Sb z__cmnkGK7U<*WFAh}X!RKc);zPVS$o-VDhmKTz6uNi#og+bG6vlD`|T0#B}tYL1S; zSN0>UM6^$nrCHSvN4~Cy+|;v)oeWSGOo4$Yh{VAvou7bM-IMYMH>>MOQ8V|Sm#}g7 zNUvuD>)0b~rBILUj_*~s8dxq?zNajGuxTkEUAV2Osp)AYMkyYg*S`e5=*uz?DEZe- zThm9|8TSn!vt%+N%59}tYyRYZLT4w>voAq)emuS39YDYiOb9-_*Bp6P`*dN!^BQ@% z8;z-Yc?D8*`xUHhj`R6AaH6sksktE>HDW@0Ie7g&)wV7AxmDi11laSr7QD#Jj%@wi z0Yqx<_P{>

2jWqLG}wuUPO!SRGEdA_ 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 VOAUU15d2uQHTA9)UA2w)e*peo16Ke5 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_image_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_image_opa_255.png new file mode 100644 index 0000000000000000000000000000000000000000..a9d94ba79b2dbe8ff7d701e5f0785927a28c1864 GIT binary patch literal 21817 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

}^6n)jl=-&b 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_blend_mode_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_blend_mode_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..48f37d5501201b9555147dc9cd503fd55ee4347f GIT binary patch literal 50855 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_border_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_border_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..32074b7deb5574259f08446e955ff2f38b9b91ef GIT binary patch literal 12494 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_border_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_border_opa_255.png new file mode 100644 index 0000000000000000000000000000000000000000..a3d8407f44aa9fb6411f00fec70945a8f86bc1ec GIT binary patch literal 12366 zcmeHtc{r5s+qb@i%1~L#UMOX)84U)BvVbg*^M_@)@%aLs5p|9RXk!?5h&U5TmG zc0}~|_fOkdl@z}4DmfhW=jafu{$NMt-G<>G`p-^|jw#%n7%x{{p6_qmiq!Q>gFk@SJ}(C7p}0M8!9mR z!Y3>pwU2=zOIutJOl$e$oF({VUmvg^tbv!2hk+pg&4vV5-kkq`aKSc)oq^%5mhhujP62Aii|mod8H}aczVaLI=4HVG_NCBw0+uSr|J199!7_^VVdi!1 z7mv?tuL`6$9L0Bj{~r459Zl($bZpr#K`CQKV9e9C^j$G<-+c$hU4pfK`O6ZQ(!niO zvSf6y2_uw#(>TjR?i^-z;nEoyE=2<0(v|N2I+7N7QOAaGStdJEDJG>1rLn;i0~5!x zePBn*NtH(VQ8(<7==*FrhkS%isS+6E-cJik@d3vu3cLpVL*brl`etF3DSTq}HKNHC z$!z;FQIQqbat^Op_Wu3bkJ(+2=K3zMaVc)pXAoZj2W2|Irxe~v%YB#rx=YUQy0_}H zGd0yXhV7X4geSC&yKnjpjbT$G%21jE7@@3vVHzPP@*uFRl2D%-bD4NZe504A=U8O{ zrLxex<_!+lgf0pBdPxi1LhMvr{dUa4le!<0%QEfhQ*~!4OQsBO+Q`TO(e)kaM+s2YUgY8XkU4Pw$mZ#?H>81~+p8HmL=z^eJ== zs+*ghp+58C@hcM~a%$rcUmSwZ*w7xicm=`y(oiP8hF>rt)*8Ot*w{Ebn`cqrUZE^6 zPyU3%^O`bs@iLxWghH&Xtvfn8#0`=K1O->;AMR{nYRu)i^+I&&pmDv9NNhzQA16dt zcIE*7*ZJ41WK0cbr(w2H1A6>Cu2=H5M65f__kl+$B&bgp-||>i}QnPoLhYhYP(r8i&NOt8+^uMa#G7#5^sWp zpIluU)*+3%kKEyFot<>>FR|#uOEELv5){(8?VgF!P_Ki&$a$;Lc>XolZa$?z_{;gk zUQ!2b0^wTT@HmH^qpR?HDk?h-#jAO%O=Rr&D^fj?p)Z^6mcWBF{CZ*k<3KuG<+(*h zSCyB?JH_x|g;Y}ucZ60V!IWWm2R%T8KOo#^i| zwYq~^b`nJ(WJ?m+dko%X+{!drFn~=j=Tgz4YND#4*6$ta&oG=p&dNzKMOVPzWo8OCESYw< zwY34)9#zOT`o8U)*5ns#0Vj%@^PL`hT&3o$zd~c$<^%GSnhAvBx6Gp z2U@7&J$TnQ{Bi#M$8Q*%%e!0$y=Wxu}O}+z`o_f^1;?{q^i9 z>m&zc=*;R?bG+;^9-eC9JD&=^H;X!}_~L5%)6&vjzI^HH>l+PCxLruLAYi4XV@DMV zEeNgX62@ithj7dq)VCZw+Rn~SOH-5hE{u48;>B<(FmI3diQdL~L`P9)Z1ebpa6>)) z=k)2*R9StVkI6ekY^r-jqBL&5M0~S{hsV{-A9eMJ@|&PNjKa!<*ANaaQB*ieb=0Vv2W+VuW?C!};Pw$QY&MXXij3QBtA^)82Lm z;1y$aE*$$FN`wju3RV;(cpii}<$3(@i6i<=cs57eLAot=6nUniaB6ikH}j1TZN++R z_=+ERZc4&VfV>o^-b9j$qdt`wQw?2vdXi!ywT$bKR&o*F{h5h!5K~P(xEUE3+!eW4 zo&k0ZY+cjuZXAeLjBhU6HTFgqkBJ+d+`UmM&SpV^;z)@uy>42y99X_M&EK3kQM+gC zkvmgcYw38cR-Hu{OA<|1u>|?&N+0I~Gtyswh8%8UQHAJ=ZXUSR=+7mWhunNPR>*`8 z$L)K1eMd%}p99MeV`K=}_c>k#FoFLW)%pybUMUQBbaj>O6`P?Fd7|+qSaohIatS`O zrqv4e>>RJTRw0isl(i^ z7W)@e7zM z^;7aSgtBs;aqiIE8lssf&`P~`wS4wC?RJv)NqjMvXx-t=ofD|g+3R4*VT6sMD+nKr`IX<|81KrEaDFWmuI{1$~fxd>k2 z^aU7fbg*Z5m_s7I6s*Lh4dX0!=1d7wOo>Lu`{eK?o-rEj)4KKbBn?|*8}F8ChX^?- zn3(+jrrx(lF~D_7o6#j8KMl=+EP71V+(;reu7jMOKRH3X_^mAZRRr$T>({TNmNP?W z*?D%1Yinx~vERdv$x`?88rq%2iJq@cz9}gwN#poKCSUzE40C50#hg3+(D%< zSW)L|07^j&O!%7e#c|_KMd5OUM<~57K;|{gH_kV%aT|6^3<(K|Lg+RM+zOP;thg)9 z7p^H03r!TKHaQ=`IG>1#DvM@~6^|$GaAFSckOIbk6dfkkGlqcA*u!0vRrd-%PfxB@ zRlW4opu^^N{HxXQ6_5`BK!g@9Hw~0%<67(miv$2{^m?C&uCV)y-}o>Y<5*@|V;*TF zw-Af`W!C%_(Vtab)<*C|00QDsahGE*RoZB; z(*qO=g~ehW9HwV`OMG_SzJ>#8CxD3<7mzxDe8pPZckT(otE{TZcbB%q!Xf13?2PNR zPQ9++Pow_+{d;M&p=I_+4a)iT5yzyPAma>4^BKDad)(-IUWQ`E7#m6PxDJ1E&eLf* z7*t#4NY+n6*kZ}ozx16GoktLOi{7*qz2(c%a1iYd=Iu0T`~LlVjqf^D_)t(S4rUh@ z7dJ6E33A}-e6Ep%vy)R^e!dEp`f)S6!h7jghHm`I{Gout<$&>2)c#b|zNYtE$Eh>9 zg+dqorUqNb-QxlKyFU_$Gb=187^?9F2=q`jS;=dDYn6h20AWjzpR{Z%^0{31SBx$B zd=J&|zMI=peK>!x?7h*-`TRTO-DGl&aQ@U{K)7asdCkn=_sL~f!p_=sN9M5aLXCQA z(T5KY?%)5Z(7LtdlWm0Xn9zHxSeKWV=eOJF37)jlt6xQ@NH#ZAoH%5xB8`$g=9?bRx9XfWG{OI>s z$fyE^LJ12CJL$T7EKFn0pXs>1k$X?|p7BIdQKy1*YB^Vr>wTS{pP$70&)0N(`1o;S zkGb&*JR?W+(tFGnS)`&AKgUbn-wEU%E~anfg<`haBYMrFe9cS zMhPN$lrIhiWXyF%=9j;JeqmgwA8(FVO7^l<@VJO4_-(rXi#~bo<^Y0&;EQ|M$=PBQ z@#TuL&q|}O?X5Fh>K6m86_$au4h98|D%`nqCsIh|-ex|Yx6(5Y#(ZmiUsy2r0l)|O zcub!H(ra?(&a%r>f6GQc^uN)@XYKJS9Yw&Jf3sP=@AdV;Ue*o{XZ>{Ra68Iab&GA4 zDPcM}W{kUB7aACBd;FG0Sd{g-vmmc5yAVmFXRZzkCHRJa63fdNpn?CzkM%-#F=R8@ zua@AZ%$-9OW&RrS0yzjhBNnN>eW8rFrPU+UHl2uUDM>Q{8g+jKB-@slENEsM>A6wIqcI|j4<9;gn-I7Yb#<)%V8C< zb52z8?IyhWIWu!_oB8A;(TlmcxwP>&z!v?#@BEV=Gx9(r1@=r&=f{&I{JP6PjV~E9 zIAIaA9{&1cfiLj1I49}Ac`eth$?G9-5RkQPMZ~mZRuN}sDOp+H!oquHeIOR8+qbqf z1zZLzZ{>CgG@Ru+2>evAdqep{PkLLQyz!tp*@)TiPT!waR>Cw5j3ng4CD=U4#CBT`Hj2ch`0->t9 zyEt;W!R^C`4|mBbkG4uj735uq1_lN^1v0OnIo|9y*_yQQX}h&*XQ@FLulx`y=0Ofi zQ~yS#`dv>tKW0-9-rL&?!15a0AX)h=PZ$U_!j7yiWSXC^qQG}~;u^uktlE32Ht5g@ zZZtwpENiSNb` ztA>=Q5u=G96}D&Sx-D=8)D&0{<}2sdhyC$78P&d;T3U`}eZWYg-oE__lK?V=RI#&3 zxEYXkMOqF%H@IhOdup1^$8YJ|F=+_Jz<;Zwz5OWUPymzKqqH{rjqql+g@FUbg*a52 zRk8Q>+T28t^NXHUr*+_KwG3$}T(o6UW@e^A5~A$WCl{xMAoUUI<}!GriO!I@2VPza z!-QRs4Z2Ij?%M|(@``Ur^^6Ix`Xq(I=wN=t`Swz4yG zQ+hecNJ674SG?c@!RDc%i<3Iyzi^Ct?f8KCt9R2pforo4kV2RM39I*a>R*RDWSRy-Z}}CB6ex2 zw53S@9f}1f8}rI&Zs8}Njm10$`5ZGF!DOd=c-zJy&jkzqm8xyTE-gsI08) z$rHu~HvoaU8SMayfAu`VR}%q#jS^_9g%iPL6%}XUu){83@d>V?irrOd{rWNrdi%)(PrxKX36Y8ly+_wl+A{0c3iqFcKX)eAVD9esVKjjpnHKVCn>C4i#zk_MLQ1(9%*+tMq^! z;oo>TmdB*J4ANr*M9hvy7pRZl!WzD{1r(DLdpeL^Wb?o3z=Gj>Gn3IJN2x@$+uSjU zCQ^Sy+uVVw0=vgVJN@!mh38{W@WC0;dz$hfpD_Tp-?szll_>S}D%W2M5lJirAniOs zaiNAk!|?3?g&qqE+P|PlCeWHqfOtJ|638Jln7BSz^bDovHa?!S~i+ zy<_E!U{lXkfW1sN@D>lL8*UqM?%f__4%6Vg@bt#rOSxcgo#YY}HhB#Z)*?{*zX>=i zx`5-cBPFjEx|dg0^8Hs0_#UusV0_@qkAaMIz+k!vFYfy$*`nF)uqv5*O9!PgHXME3 zY0Hx&U-|i=8cL;0gL8U5@aL+J5Txx-$7%rN<8)>}lF;g8tv$NVCn%VN$NPgUxyK3%D9L~dKkVr0 z>H^#VlzsUQkz?a4c0`{28>;ujD7q~#FM|@T9#|*6F6K2qunBThb-%Db)oo9>zWV8t zoRs7&$2YWlAX)jLp%f1(QPE?z=lnuBlOKfEE6hx1wqf?zBXe&@M@qjdAt^C&<>Cb? ze-$k={^Q;!DZK$;72CIG8F}>hS{}lh)#d` z@&$l7p|a9cCf^_8t>gM@B}{qK{0h4qyet*zGwwsyyQm77`HfUbm?B zzVS%S)Q62P3N*SL2wwkyCIHYx986bN7rOgl+{DZbXtV+^i6^59fC5!vcYNN4oCs=K zoo&$s4~-O7UAu@L`CFlN?h5ipeqrJc`vx+v{IP-K3(8LcMZpXjlKU=+8Rv!b*hHjH z65S}umWpv)VZpJilHHnzpjsjyP(eLFeE9Fup0IGdHO_0ZSBQA2lkuyGyS^SMg(i{PEMCA~pGL7SVK85yU-$;=`iVXvVLC!Ie3Zu?taOH18Dx}~);c;4Xq zhrB+$wht5}Eqg$Eq4!J9K(Dee1fa@mYUV0kYRn6}?$Hk9Ri+ze-<64PK`(DoJ3C(u z`3tyN1A(lS#Ik1aR7!^lsAaXJDujZFRx3hDt+H61QecNZ1-c)q#>>Ldih{)<)+BS`Y0Gdnr#{Ip$4_9ZpMn+KZ zgln1kidS=yQr-8;T3T8FQl_PeT5qc$5bkDPzP?HcEo+PU?VuY3)GzouH8quAJ`^fC zV%ak=(0OZ8;TNWJvajd}#<;YiqN2Qf@>Ub|6k}vW#E0^7{&3Co-AES~mrsD~`lF|B zpEUpEH*KF&f~v9o5d9dj3+g9nC=Jlc;D_j5oXN8X)f!h<5}h5y>STb*i%7if12Zpw ze}8v(L)%f%pSfLVeqs1B;o!)sqyZkIeJi%)OsGcDja6FBKgoOV7{+4yIp7&slw-A25=qpy%N!+mhMr2ae z?*6D??vQYnm~g-a_xiB~#<_wGKWr>`Kpi^@5(pJN%1;@%P!g`!Z8FUz3EC=fA#M2k z;#PpuHr<;)fBxKDo>U`TE3yqroa9gDjRt6(-dYwJGJ?oWuG6mz1?8J2O?Wph*f#hx zBEEUNAo{3-$q4k6jH?%5H`vtONmk*b>8R|IrAzOl!!hqbovo-fR_B!8lPmg| zbtYTN8~TIoK=}+xMT*>o*E=G`^%I}VUNe$_NM_3y0|PdgLfWljKi4BzY(LOnPfble zGz7G}s+U`pe7tH(N^Z);n~@>C6F+}i`ubLlAABB)OD(WY5^NX|d5%6_;898e;h-!h zrD%_A(#dI60TTK^&nHA zNNgA&Ija>}fOhAG=(6S@N_`YSn=QACtNexRGKiB#*M4=T2cXAv_yGMZ0B4R}Fd_$` zY-;eQbrlnk!(NirU}@NCz#J~?u@O|!&v_d27sV2EeA4PNSsjow_Q<2xyHGrmXkV=B@x(Y!r$v;Oy85Mi%YQoK&DEn4?1hF-2_Asu;|m2 zJsG_rEObwfZ$x&p)NTkwmS`Rd&^pBf7xD^@DSH0J z7Z=aV2T~MR$?G?70PDtsrdHLbRM38H@d^PM1iRXtot=&Mr{Nq$9XpF#<0N>(tjLY-+p(aPrPViup_-+GLyFH1+;j)b+tR}HlPdj@xt;oTN2rVTRNpR+Y6{b+j zZ+x0_GyJlr*yN>l_1V6n;#N55QJP&xyST_?oxtgV|E>3v)wm7q_(RP2-Df}>X|G;_ zJNeH6aY9cfhF$PUNrJ+{9KDu)e$|xQS*f`Nm=DpP%TDIB9$^Nx6A`{R-nZ;xW=sVT zeu~rR`PYq2Y&UP-1c5MB*&D(s&OD*laOF&QujbqC;8H{`y+Nq~qBLDln=izaAKu+t zZ+$KreL+b{NmaG*;}VrxUCQnnrVZwZDg)uBp}A$DED%0rj(gp+t%^`+EXSTRM|KE%v&uq&VNRdl3VFjnnVqQbIgpCUbY#wOYyCY zahmil?l~u`UCGa#om^=g3=GF5+6u^v=rJ8_Refp#ToE)c{2959Fi*H1p#2Y>9;{5Yn}e)8+3Rp2-7$ zMj*MO3%{hQs;Ztndj={K7at*J2vOeXy3)IWna>dG^)t=PH|!X{qOl#9`NM-L;CO+H zv-1vhne<4AiUz5LSfdEgG*%~8M`MC>;0UheL4gdKP7q{nWh#ka@(Vz$cO#ow^h>4Ba^T|3HN2jp|=u`Ugj2OzB*UfC4*KYb3C>^kPWdjeO z&;QWIW-Q5T=qln{Apl}q_yZDH%G%n4?F_eYvnl;!{FJ;Hpma$@;u&lniD4O+W~Lhz z+$GM>A@(ddgCCM>Kz|cMNeBI#wK{!_iL+)WE;p|8d<5Oer!sfR+=jVWfV~B{H1pW+ zU^Hy#mX*W5w^2b?dLe7UXa8A6N^d*ys@9bHKZNNb5k!e;iF-_A;+j{UH@IV$@?H*< z7%HRwA&9l|jh9_KRjA{6Ou7FipuHzRYE&3q`6Gv&l{cJ;fA>9sMpf-J$a__Clv&Bc z@ShD$lGLPJFnR)(dF#OdvHr<$J@IPv-*dE|qLQ4Uw*!HUz0x%Tg}{ZVa5VFe1SVO# zA24Wx8d&W}q!l;`a4C4Prd0e@l%fPsmr0!w+gcL}^d?~~&}E?pGVwPD3|oC%S_Nn^ z252-6OnroQCQxSb-R%wYK2DuRf!NKin21X2JuP?)h*E6@pv0EI`JK=^-%UtQk`&JZ z5zFe&RY1w{yJe;dmzS?oJ=mRmZi%QuZ)o1|avJ^OYCVw-<`h{1s+>F5?_%M{y_V#> z503fqUZp^TtaU>o7RaWf4gEbJJV9x6dh3GM+yPGF01T{qbOFd8-Eq~!m_=XQ+&yF{ zM*sU~xx7V0yv`{yX7r=|WNWK_#oc)y+o%ZOO+*#ldnyLkuF+G01UW`JzIlQZ4aKeL zGU|gbS2_$pJ~11<9`C`HLsmS3(|b3%zb^FK+cBabS(A*YDoE&D4MudEU?+xV@)R{Y zL2DIs(c1UWE_gg4IeC8Tz0y?1ZF0QLBS6>bO%((!hk|_)@g+U0Q}HY~&7-#d(nJ)x zKHG8|Gy#d0H)b@@uyotxzmbuayuVBFtQ94($tF;yR1+QEI1nix@9-L&i?Vt9=t3$t z6I=?1VF$s`9Yi#>f#Lvrj)K&xZipyQ!Rwg4~fN22MojJ5#s0DYp74KiF5 z?jbk?^56m7=1EF<`M6)+M-A;H&d##di576^BQo-t()5#15YCnL-HoIrM0!20T1%us1uH9NwES4 zyzr!j`FW6+73=ZCdZ$Z@ia@bSWT#vj2LTDm6xvXnti*<7hct8X85@C(In~WHT98IZ zN5P?qXo(3zWUMy%H%!-?@zOV-RaRC!C1U%AhvnloyK-*_siRz63d$w<;CAo_a<))j zD1XX%4*?4ONL)L%(CgaMJ-KW~4&TDn+wjMMBEcIKD?tH)SIy%(8CFsr#mGe98k5Tw zShO|XtHlOt1HS|uzk7LY?E|H9)u+Zd_blzmk6|K`JVR)mQsZ#EYz8{jHzMOuiKL5b{3vagkpJ;^rqWh~jUH`bKpMkve39>SfmjIm`IL^T*= zVnU21F~o$7b&TaXb^m|Q^ZI%DKaQUl9cj*MuIoCt?`J!Uzi+60>g1)93=9mXbne}K zz`$_i3IoGm-gMSJ!rnU0#GHH>zj2l}xbl{=Bja^+qd;g)f4+KH!^zwvU($vvHH z-y^kKGBD&4LNEEq^Y6BHk~Rwh&zrYwZ2Iyo_C?FRpT-%l=e z9*%&)^W{f;-`1|v!?C^(Ui~qM<7@($>o_#O&Y%o_O@**_-R$ei z7JaXc(u{!JSoRp8dKGpwiv;BO7m}3|g?%UZGryAS_zg^mzS$O;3(|w(&KUWY5jXh2 z9chS({aK5NyN!xmP}=~Ji?7d(grkG?vF=qP-8a6hY{3FgakFyGBCOi*&I)fj_)yI& zh!#A2!VecL^{4Ti!YkWrXfY4Bzy>c|J-v6#=Zkn_7_R5Lv!#~3O`O%T+KXC`wn9FL2fH4gRw#0Z74H~~tC-jfq6j-K=RHGe|4CDPF^SDe& zgOvB`YHD(gztJhY>T;L_ELQvG_+?Gw3$eZs*J=)PnJj&d%!VP^rA%5_)q9zFQw~jE z$no3Xo4wno8ogTboIKa!QXfiNnu%VV#Dq4|y6n=f8kjI5-I<1OSGl*JvC#g;ZV~9R zRjp_811(11rLE1asHm$Kynh8tNl8I_p_O|r$2ubh1eRQ6)w#_?Tt))px*Rl++bIXz zDY1qFIPA9A9kPp z@z!0}UN)g)?0LtXPx~F^H(T1J1*!^{#E|;&EkEN=kvCnHJV&b*VrPfMN&ZRQ4PIFN zoGYkHckGw$*gFvSI~MzY?R%WpeD&grG-v0u_)90_ZQVZFzzR)K@JqFX?yZ&OXcz(vBGyit%b{j8K)JDi1H$Dn_@@P?igBSdiH*Mp+Uru(b92fLnyUS%V*c}$Ot-HHMh|;9-}oWXC+u52B5LF= zg^$VJBdqVHOiFo4RM5b*`+&*vDSlQ9euf6xxLUop;!Ko7bq+fndr;jkdnK zLV8xF^;ItTqx$PnM{gg_D)&)d3)!?n6@jXEr^IiRU5qv@d+pRSJJi(pkA}X-OY<_R zsrd8KHXpB|?(;^~ACD?=jII19i9)_P4E~cXK&($390SUE3)1{OFlm^Q)B{5U6#pAKJY5) z(WH4zpl+^b+3qf}%*Yp_=c>NyS>9L})}4o*-Dyas6&|hIg^kKuHk@eiQqG@0YmxJ( zK-eJ=N04*j=dH><_V99QzM5}(_>G!EJpLMgE0kz*X;Wp;jQcdZL@~L#tEvaR=$xro zMLB1|IZ+x|w;SlDh+3R7uTc~*+<%O*b+x>H{CV`yLZ&ZCB{xKw#~oR9xI}N`?BXiZ zU_*OQd&Oi8`vI^1XNYz-uVce!weOLQ^xxU|OI4Wsnn zu8=4`EWuN<RFSnIui=3)Mim9uzyJzrFn>>cX~s?KI2o8TIJtPbr2^lZ89)MD$10xY5jn zR7#^d7CD;nO<$;)F{Kp71!+qJ%o0)Ro?SY(JG&l}Bg#`nX|D1J;cJ-$^}mn?sj%{B z@hyUfHr^eN*|}vwKgUH`1FO79FKav*ymzlI)zz$hd61*fh{lNRL0$ zA~Wz$iMG@KZWjeN?sE8sZV9aa)2e^3I;U>(b$~H z3hwmYulh!xaP-MhS2?WAXjv6*<>{8S$wPpjumF zvt~a2dMAc+HWKC;B1@R4DU47y@XHn80=cvgJ?Ix5&1~|MUj08mTeao%pd<|9tt!oM zWa(t5Q53OJSFY!<3d%s(@Pb|r+Hc)2X&R^UHz#hWNHRY|*j>vhT?kVvAk2fcZOmUL zP{u2lJoCOv)W|iR&2gu6*r93R$EIG1L9h6=+IzKP%D(3@wnlR=VjV6peQ=h}(!Y+j zgVr|L@fY(Kk)5)G{%N-u2~;JJ#w9a)(1!av-vb%-f@_$D<0ZU7kr!t&!#fKZ#fQS- zS$LPdh)AV8wz#fd*Z3I)1L6+JJ=$UW_wV0Jq{h`JDtU(7*jG0+Newy5pUse_7h)F^ z>%~NqXM_@tJ&%$xX8F(pt(;qf=g-fqZg<66WUADHikVCy|DpOnJxVeWPty_n6 z#TC0@?cMj0y^g1{eC#(96R4VD{`oHZNd2qaY;o;-OFm`9cf-1A{5@z-xt#NwH+WL& zIa{WN_xa}C^XIuS-^hM6DwVpvK1+`{!$dxKm?cJe{Y4NJ02UwERhsb~=tcapyt$`2 za>!HeGFx15aB#-di7u&xqT)t4C=th=)56*;#H>fSleAofYT}*x&=oQUmrsh~&>@(~ z5KKN{{=r9iRclozqLvq5U~@e{yMSwwV9^Sy=2>ZzuIJE@H)yY3rG zabz~tbEC!dQfJEwB6g_c#2?LKxK!@EdH99cwv|Sy^)J?u7n8J#2YyZ;{y1Q4GgE4M zoh=1%(u~Lx0C6!_XiT`+59LnyP#-l}Z_@Yhs8rwg#Kth`tdG8}&`Pkar_Dz1+$cqV z2nExVUuSNO<}B?VqU6b;iMd|DwMWKfesX-pAHTD`yrZpY-0fZ&^4sjL@mE7$UbeVJ z2UvIAK#-aqagPl4+BI5OJ=C-}mFjHSGKZh_I)?BfA%`CMBRi#3ygfZLIT=L>pp8W4 z;_Rga>s!WlnM`K>!FCZeDog>g*wAiKJyHsLTgZ>fZcD3Mz(_)wD{QMr`d!_xqQa)^ zD$Ok819I_J$2Vt9;XzOc)+%o6hr;mKuK~Ao{+V~i#yUO}G0 zrjX~k5w69$Q}0YcVbi{b+PsD`3^s{^#h&6%-W2QAk0&Yps(exo20duwXV7LMA7QOX z=wz1^t47u@hwQ!aoFJ)BxK%C1iXRGy*o2~g7N(JMvIE{Dk36h0%7m3OI>v6gkX-EX zF14a86&kJ!LHCQJOe1#S9GVIK-TlcO88lMDO~Fc0E7{ku4ny32%`rVBa7?Ru1)dW>Fx_l zusq%KnpaP2|N4H-i}24lGvzbS^%tVWM62xA^_U?6!^ZRuB}c?^;5F1^PQUM2$HnB! z3zebSK|kL%l8oKip~vXLU|$^0`GbAx`f`8Qp{j70ql8CPhtAA@q|eemTOE--Y+`1> zWOgwsW;5$iTRr<7e?e^)qz7BL$rm<-?srEyqXHpHlTVu zbj5mLrI$4YATV%QLW8A&B{AT>(A4i z;zRW^S0vs)gsifD+BkTYggZ~N#uP_}Tp=v`@nE79fyY8Vl<@l^z~G+8ILrRxe%SiR z!Df8G&zAc3#F{gND1SMe5U`bT`9p)3JMY?+LVuqLQ{yK@g{VMf=88(@3cUg9p1@)I zDvDC_j6yP9_d%kqu*1;Gmd%K)(dUJYkSa=kD6y*d&&!z{c27msXrR7a=H;d8v-GAa z3cYPzm$23?TAXW68R2^0bD+9aYLjsUR3?@~cyE@o$?F5Ahq&kIw6iV3%+Eg9+mjk{ zPi6aVU5-3a0kfovoL#$f);(<_ggbV+Nq$N99*4r*K`RXjI&|&Z6!S)*4 z<=}srGj@8Y6&fIylNZYVm0!n^T5dP^F+UscLR@$lUXvufbVc=(Z!Y*crrW9f`SW?f zB#BSM`w#L;!|vM4)?*N$#@oOcJ)|ydx7kUczK#UOFS)qb^(Yj`q%#eJ2XOp)vZ7H- zA7}CdtY$Gzt4IS;ECN?D4|geXA%Va2Qcn@qvUytD+uMU7G4V}4kETTd)9!KpL2r9e zpIMf)Sk--qWkV-mW*nM@laAyQ#eSNdTYEjugPlkI8Wa8wwZP5H6jPcvQ{>8o*)0sN zqLOdfb1x1vQt)(bS1yxq515Cf5YZ$J=K(4BFCv z0YZ!%D$h$CyM0Ecc~^x%-`jVV7EY;GP9}aFeM4zR4lRNvi+Y^WWwr5~X;Gr=mQ@tP z>uG>$1vtxMwn&z^t}YD-wrl!}@T=$eKI5Qd<_atpo0*x}($Yeeyl0=M#xdn*uW1Y< zi_6WO0#ULTShFpjXcDgpkUOMfd^DC^7%7KbTuhy?2DZTa_M;7X^G#kPKi9&s`p2 zKh%e$roV4#Q634*#F0JaaA>jcdTR+@Ufu&hM0^w=JkUa2C7{tj*p5Gs${KefZFFfWNGk6xR!b5MH`WUgQViex~ zt8wE(8rO1<2979$NB6a^R_~|UjO_iM?wWJGF|+(H0Xp2}X3kh_WLnFk9!;4$WX}EW zRkT9DbW#Bp!}@Y)&a5i1f+A6Z8<~1oYe5Ozxl87IN@>=1wm0zO#;&Q1ZYw00kk7j+ zLzEVl+|Wij7JeEcUXI7g#c`>kcgrO0B)(3|wI#5Nn20$)!kxv1nJ8XZ z;^lQmZcCi1b>_M5`Gsokbn_wyFT&RFNKaI={IjzbWfd{rCV;ji$sIxFDhA5+0mymt zd|3W`^33bTY@YB26P{%H$`H&mMP5ooc`!Nutz}EpI(&!;R)KWX+r#Fp<y->-E2`o$x)L4cKfZ2sl4>{b)mdR>(8U5);>(drg%=8E8XPm zbrmXkIDNnO70S?GRfZugA$2NjMN)5bTd0+46!e zq9lYv7YWT)ddyW$m#+LeAoad`pQZnRLsO#~jk#VI#xA3-5;b)DPkYIutAj^NpF3M3 z4pmWV3e~cAUm%^JG25diZ3ilV81DUg4Pbk@TAe#CR<$Povgebf9|NP;xfa9#5p&PR zC@t50gp-@SX?4+g7PoOeB^j)}po|Zl{d0@PMMG&RfvV?karYv1Qa=VjF7BwVcQ$*G zED<`H@75K9tdENO$h=}bd3edcPnA?9aKz+CvrfP2Y&3uJ48Kk)zwqgu;Zg0*U!@W4 zl9ArWUXbSpb1v=Q;(CtY!V7fi@V@R?y#9wM7CrCjNPq90s-fBZVm(tK8E?Ary!pk; zJk!ypxi_iu$-gz72B_7S3}R=9fL#91H6A@EMFEKj0jH$E2HnZ4)9s7>=?XWkMNFUM zslSR3pTj#D_)JIm{nK6ccad9-#a&|#tZ&|)BWAKgVvPeP+3heaimAdwjF(!E-VKOs zPq(t=(?jE;GiV0H;J3V(Cg%moww2?z?{jG4#M|xQ?XTT0&waGmH_j3hy)3yVBSJ6P z8g?Fal1}U>2h!rf!%UPNa|I_O<%{#nC1IoZ9K4G$M^lyZ1y&V;=!n+9&b3yf z0yV&};I?@J{5t0}2XHu?ryOOAe)~)}fqW0QX05v^V?f`FK)~iSui?XIfxd1bmddYK z7n;52Xo-M0;XU8L_P$a5`pgZF;(fG?L7@#$!nCxoJbSYrp_A%d4+Yi8=JS}98%^GH zC$Z<^NZ{6PMl{W@DHrdOJOjuR^;}4(AdbfxOzs?JF|bh3&=X>mjviOaVEX$%+)Vlc zYsAh%89t`M45=F4KDBcC*z*teDBEgKFlJ_EoTV?a#SMGJUyOAiVl6DQOA|j883wj# zSC0T&fVB(Y2zb7GSY=XJT0oLeLVkWe1WUvFMEL(46BsQe0uFfk^l88=!7CR!^66cd zKDnT9{1pF)!!frs{w%_LncY`}i6agAb*x)@bZmEnXTDeF7%fi>S0uCp*hQI90o$Ge z+V1mA&4MJaTG)jotwnJ=qVS%k;ed9rasE7kKmY>w^AER@Yp7wdKnJ29>=F*bzHFJ% zAmL5cYO1PDRia+=&E8F+;QfXk2@DOn)Q&ZX%Z}Ph-6MX5r2CcTz${bwDI3jmBZP&w z5Bku*(qrzCYpf;6V&gBiguG@*vzO&rHBM9jGcOVfiHJa?tH7cjeDPt+a=S5PO4W5lp0fY|2aur1gRRJe<%yQ( zhF1YDn1>e+xT)~CS~gfql#mKM-fyMvJF4LVl|`?}}k;30vWWwfuqtahx9n>p2*L@m{}h)7cqHZqaS9MwmsM z&{jU45k~KKsRcU51y;j&T~Y&fX4P4mwz*{0)V6?`%!Km1Hvc6{)|;kU)_uk$7X3YA z(Jy0Y2aUNX@Cud6-bt0O&vido4sH+KTAmR064?6`I6?Lk=5F6>9bA-b@H!pWHQ=_6 zlWgxc%?pfAmne-*LoFT<)%Vyz_4N7|j!ggE0W2mL9}%N?D~U|dZwFK|Ztlq~2o^`C zej)H3fr7ytJlYGh^T)n^8DMJtW_=m(TFke;<8IUM6N=pAa!wsPQW+g=vjxDHU30Ji*zwU{|=bMSeDI4a_RKE)2`6`%tKpjfh<6iZ|E z;Wuz*5 zG2Q#k9wSdGWbS*}{Jr85tE1{1cy-U+PYi-dX5V z@ZHha;E>`roxLNah`a?As>e@f*Tqh`CW9N zumHA=FA_8$4m}E7*NWWT_Ejs$QM4+xLEvE7rC9MzgXSsD&W5EA_P>EzoHr*eR(kM%g*^ zRWP#D&pw;ICJ&GhGhaxx8S<0kjY~-!4WY-IH0(Uw$y)!&B!<<2E#18mSv0jGs8h6U zx#`y2{xJCll0*4=y(f_BvS9zt8EeyCcMKU{@_p%O{(m<`6zI7)0-l>msjU>=yW|sKqNNLp%Bs6XN2rh?~{?=pPD` zNDuv$i5{0NIS8gNjMNofER=dY zNJba)sX8A7 zq09YUvHbar#`0E&!#gPe3QFCH0sxe|Jce+N=|c!cE^j~r17G<0j^k59+zG7jc;`$s zhgHQmGg%HWcghAd*qd%vne<*Bb5ilMh`Nm8??y1VkC>zCd80~x1TiB23Ac;cHEftk zN=h(a1pKjzr;_BjG@Fq{2?El-M*W(lzHJt^H`njL9?s|26h0_}sc1#(o>skKbVCLn z=vzR3;qeMssq@#-o{UIirePi?1cG#;0-sh@*>1g$tZXk1EjP0@h9?>5A9I8Hetp~6 zznEd$@^CpvTTJ)T)v3*O{|&r1RI#fBHfwxsezJKI{7pt=KkC5)jJ4vMqv9;V)UaQ#d2kR7J`KTerKc3;n zhHjtH_=A|%Bczb2* z)qWMn^`9e#uU&*)pBQrh51Ym4atXO-a3J?8w&M|aVBltv zL7zTw@-odoCzw(rbTE>AlaFm|j#}?m>*dmFKpA|*vc#+Tst0+8?$8Nag6OraC?{X@ zQGV%4;SKMvo!pahAT{6!J|2IEByQ+dy9C>etf^pq!=?nQ7t{71(59!#k@)-H5;~MF z9rjPjPjEZ)m9~>>ENv@s4i@`HrBm*o?r~^RAHLFk*;{eq)9q2t$@q0Dl`pjE+nbgm zPBq-4`jgLY*#?Nd5|DIICQD6@iBS<(F{h>sF`xLG$^7@TySMhPFdK$JpKvd=P9X97 z4>lVY6FMGP_VWPig$a=WMmKxQ^!3zMxSj1o0d@J}ZlJ%H{LZ)$2v;`+0w54%2PsG+ zyG%;+Vv{jqp5`fcb4$uAHsi-wjv4}NKB@dOtKYW5;fl?yjl6q)fB(S7cavR!YcH20 z8^UtWn8Tp%wLAMrU`ZjsC@R-$=Lrw%2}ypD3XT?|e1 zo$vfw)9yHH_GSo1iq&XJ5=VYus3;=bY+GG|GHWd^nOebJ^E9;kY6g(g9`DqGZBy*y zaf=Nzv_~DH!M({k89OumSSVCGmXwmyb0tLG@UDb>;@3UU`XmXHq;lz9;i}W<6Gg%G z@JIy+Xk0w?)Hbdaf@vaOHsE#2*mv}b9-2C|Vt|x=xBzla9(GZB*++viq7*B6oiLjr zHa`2!cTgs&2w;<(p1)m?09}xIn}h3KU}x?GK8iXUJH5AufxB4wJm0wlpoH*W=(zFJ z-RZ8lE6lwPfjf&qvU+Ej0PM@~P!^f}elZ0LbR8Fa3qDciXQz49?j4b^9}e<}LbEB+pW`a$bOvyJ(ekg|A|BKIwWJINuK&OaxADQS6md4Ff5y?5GK8iXbe z_NES0e_V`k&z_u`GP<4yh6`4((65uayP6W2u06tVjQ*$4rm1c99PwD*fmx664UAJ2YV|9 zN%fIU4PIQDSFvf)BVZs`=m12j2%&{e_T*_)TfTMQ`TZLRHef>2I5T7Tb*NL|jif7J zLYp+(YIBZHVQT8D*_mJxMDC45>L~K53rAYrBj$|qmsMBkBi?O)F*kYjLhG913yvd5 zA=Tz0>f2+KdPe%r1|>krbOB+Bs5BF$J@BmSIEOw-<9Ki}+TqE%L8cY3T(qi3y-NN( z`5Hl8&pvAB1Rj;Q*3JwvrBPt$7yO+wS9l66KCS5 ziHW@EjJ2J68DD_Ar;SOSxN==1j0bxi|j<5#Id-Vev;rWM-fE%Mn z$tdZ9nt0o5qPoQOb$^#ERVo05(~sTSHaQwcIeN89yb-csD7iFmTwqPMt%m^Ij|tr} zeAXD#ineVpn`L-u!;AGb<|wPSIVL@JTC_0m1(>Dl>wgfj^{ihYY$x#q($0wafNZxP z115R{AIk8q{Zg>L{RTa5c+184;oM6wTvX~g%~xO7A5Z~ru|%9_`cTzYFb{`d6F)ir z@tJ~GCXe2}zuXN9@p`!bBacUSEfa^01>;`M!vWA)UA>V|^kZX_q!gLY-{aS`ySYTN z+ou9*j+?(ccpp7FiDc*PrUGIQq6f2gDL-SnpUl#?R!Uau+qmUM95eb^@rq|pKf9Hnd6O-8XLAK@A(q@`?O|zV%#lAYD?k5vr-ob% z(riM>PVj3E0u8g2$4YsV00OPvcclUGLkA75oZZ)M>K(mpB;dq;3kv=AQc?%+!hCyk4Rj(DORShrL-S}7`l)x5>i}jfAdowxw(eqmbLX4Z z@1MX@&3eWRKDbtub-Mz>OKy|2GrV4{|ID2`a4sXym;^M2g$s|#)g zEaL}uwA$BOj5zhaoM$kf?01uM%}LR>;O;JddQFqksOG->lq!;O0(;zJ}#Z=kGr$qw5lTb*nbiizWU~Va$NoW`|(|SQ!Pt< zuqIEeEk%6X`Unc%s=d@tKkT>G3(kJJ4Z|{ReQqbZ?(5Ptj_4hmhI-IcJxTe7W#;S_ z8BV{xbnF0Kw=gR3V_RB#>W2mD09nBhf~AVPSq?i(->^$?xL~H#_SQf###yh=Io5A# z#Y+Jl9{h6CvU=pfF+fuYYa%O(s&0>KRJvVbs}JQ#B};P}Q@uy8xLw;s`3S`nY8#7Q z6hjSC=M)u|Qf!t6L7z;`xxQM13&$ATw)QU%rbT~=$jcpx%-eIf9KIoF%4C*z^qfWD z8H>y+a)(m(i~;}$!0!)V`=MujQFj+-MY{wSC?{BNWACr`X}X(8k5qr^tT9 z!$o=o2CKkZCfy+!hiMWE{rGaaO2=o>Dq;ah#t*$8-z*C|C}_3Bq734qd9r(3AxfM6xW+2Zm4p6@tO(({6j5V(YJh6ALX{!D)KCG_v z^A5JKw`}>aPWs|PLEy%~H(jLv-X%pzVZxNDYmmu7#_sMhWj67t>v)bU zsQy23n_bPBwuIW35>AtOVm_$z1{M8bW!)QRYF&L$BVVXqgVn%^uYL1xf`)R*WMLal*It`GlkFzWIxIo}yu8hHnio~FqiMbcvt>l(0R*%w; zHjG4%*{ANysCN}L=t-@SZwB%ts;ka1L7j7ql#}D0jfyQfUNpArU6mk;6YM@{WkA;J znH#?qeBP&O0&-frIuD`ly;Rn?>)W5fYIq@*330no(R+z$nB1`I+nmMv$qT%~*xSZy z0n^UE{`Pu9mJGPuk6<h2Cop4p{9KCFlKyeh7@fFHyy7qgG3izp7aQ~|O-C*PiBSe8NXTfYHJK^|V-f`S57 z!e!QD=)FI-8czy#re+6;8K!LbHCc;sf-s5e2-NQ|{)eAmyTS~@KD(%e1(d@DiA+7L z@BZ@2zBh38#E9sMQO}^r$aZKYaD&6`U|Dm2kI7C*v4T*o^~kAb9cwBX8Bj#Vd{aOb zND~1}882oz^H^bb$tTikL9)z3jI(wW*pIsM1JGX)$RQC{5ar~T0JrNEOm)&%!{s|w z2%XgKJOn!+9s$4(=3Runr4N2tG9ot{lza$QeQ%wZDQPF7m*({Arx)UW$dkjLm+Mj# zgH&g=0xN{#2N)*b$>SaT#d*zDipj_cu}`0%Ov6^p6-1EosSGA8OWL`~8DB41a+%SKR1C+d zhws!`OQi9yhPQ9~>gMLArDIV>S6v$rFn96C!~i85F;3u^DnOv8jN+1Jz6IKBuz81p zI8KcPzm8vsEk<$TaXnNqnKooDD;YYD+N+mWr_1^iZB zgg6BqKLX7E?id`t<3W=>|JVsJQp5Zj$g~)9#5f4a{$p)=Bl96uMLpa`oN4&6!bA51 zU3)LN{xCHV8z1NZf%banySm*7aV7+%*%u;Tw~OXvME2ik$YRa-Dste5fEB1mPFnx% zm>9mhUE_Bp%j>>pO_9(K1@9etpi*9y8FDt`E4xc_-VXy-_iQ=UUpurl*NjAJ4)K(z zcrCOtn?-bBWot&k+o7CXwO=H}%=l?#RTZQFL(co~I5lY6%f@$%-L+q6e%Dd{PwjD0 zY$_zwn1fr@rowTAyuA@3UVGJa@yUX$!Tit@m44fviVt|fpN}?xWNBS5?M%7rOjNt$ ztNYn(uCgtuN>e5eBmSbkaSq>5&gR9<1roI&G-VPJ_U(WJh} zBL}rCn5Ez8xMA@pHVS4fs8dUn&a&lBx$pP2IV}K_m+;h}H~)SIK5&bBIOr$mruD(f zqI$f}p?*W_BtxE`^PjLdM}}e~nQnMVVD($)WnqSZFRP%g9eqO=*)pxLv%C7Gvs{43 zXET}e`)6(<0YrAl^2qd+fg?{VdtVKWjVmv^{pCHnD)`_qWq!Xc=PgJUV0bhPAGt2N%{)&IjUdbS%Jc(^d zVZkQ)J&XzQja6*!C}T?cEyi`hdZ_hcmIaQDLN5 zgOHL`4*oEmg98p8Uc8l0=N!n$SOGEL!+Sawf-Gx|E>8aB2oh~G3d0`9eIeLzfp;ZC zs$la01lIDa8B|jD6#|@8siMrmB^-t*8-0p}GYWvEfvvT|8>vF5p7Y$r@B8WV$xocH zVyn=~1i=*9W=?jCR1eF-3=^X}dyaI>%}AEoNIs7;U|_t~$^F%M0?A%5suhVJzdb#D_0SuU6TGITrna~lKD9-Z@mhYo1DN}x`UeYK^bLCWMH78uU7;!1LIEhx z(tmaZ#K;eGnn!4jD|DA}8yGV_aAN4u#s+1C$W;$QoqEKtTYE$SV(1RH|9z}DP5~5nCFLmD0z%H^ zi41OVH<0VeVlq1n8_T7qTt_+6T!vp=taax@fpEOv&Y+x*{RB_~+JxYiX>eFt-Bb9P zs@+b%CeP&y9*U?-+^dzNcAG%E0abQmd2eqI7_$LNvX%VUZ@}@yrtqea#sKHp-WD3l zpfr;=dR;9gGShly-^cg>^Zg7H&>+BAE9HsUVu8~O9``Uc+sbLkERLgwN2>5hawaMy z3#is1au2Dkdv;so!6ZbFOxcbd76`=pg6tDu=8iSM@2GV&0#oo@E1=gSCxh1Bl^8&< z?^NnZYpp^FF140tm=fk6QaKT})$%+krU{?q|5($VQguN3IQhxsOZHyL2xV_+N9NFF z`=iU}RYlk@HB~!~q`wFH1u2L_Gjfk&hm#xw%Et6`Am7SxXJY-keKRmE_#Bn?GaT}6r0LqXS$tT>I*4z z57{~61b^{)Yj67TPkMw$t!7E+A7C^)bJv(3n-l+R2JuTF8PX9Nfo<@L`&SWMx@}*7 z(Sp8${H7GwD0FfmUYb$Rr!@1V!Xc_%QvnfH>;}guH#z#(7CnFd)UoHW<+gvci5Uf| zaJGe}vL}g$^%$@w=z1EBQwS^@z|ZVm7?(R3PDQJ<>0_YUSH~gyCdS98`SU<;%LuIh zLZ$b}B0ku^gk{Y>=Fs%3*KS+QQJw{9dF1lrg(b4Qxcc503Ru{Y#q%Z)K{qZQ|UqbB6kWU)%;6*rys zCT(6m%mf*<-~j>QUHW_kH*SQIt!^-kPt#S^NwuwZUDlI7kW20t^*{S2EW5nrx$|=z z(xdixR_*d+gCak)KjNN`Ca6>Lg1GWDq3w<6{Ei}0-E(jTV*aEUy^=2SD@oYb5+FI| zUc&kLBk8BhwN5YCQc~)~BPD7l=gdYd>vqq7(~kuKXPfpa0cJ+VL~o)rbpK?o0P0uc zG7=?UD*sy58;EYLw$){(%!tImG#e2;Iepe_&TnCFz1V*>{!0fRd0y9mp(`Xt?SMXV z1@%*|vXET;*^&`y&6mS5HZIj7BhdfwH#{GB2sc+*hFY$KmfW_ign3tWPSRPIuMdCo zpf1d3g2Nk^GMwEUve7eeo+!;mcXshe*|F1NCN3DomUb#j1{ErA0TnuoI4P%1djBOJ z2^-55qja;EF^ho*=LBJ=fUuzUw`ntgsw}Igd5#HVty~5F5LRgY8OHvzjTP*N2S1ph z`_McArb&Lmm&0U`D+~4;B#FNv`{p|3-@I$j9p~)?*rz3&iU3o+ZXoXKjm^jEb2|J`AC4>(YSSR-r^sPLNL!CD?xei(`_dimXy)pR|e}dIfr2;%C^oj zD71PX!p}26OU(`oY%>TRG1M(=GvW@LU0Oymd`Si;D{g~hU<%PEo*rg#k3}72V6eC3 z6gbPk@KpMw7&!k0L*!Il}MivH!TNjUV{`Z3a z^}Td>dY1t;p}s$(o*&B209lwjOgA$y$W#L9zNrxm{r7UItGcxTWq^Bob<6(S8~1wFs?#j)G5xbI1=o|^0%A^J&Qsz2bCbbef}JkjGT zcT2n?Wt5b7RiGk8Us&PPi5~VSV*5~{vIg^cr^llkgE{N$DjJERQA0lMNIhOz!9wg| zjYBQQF1~(RR;p2EOJsHVkg$A;h$u~%nX+rDY~T1m0jw^QD}MY4G8?sqFy#5uSb&5L!?-=byWv3U)4;oPb4 z-yRH~nr+J7*cnGEE4l@;$9;AXmHHl|go$`g>Wt`j6@P|2jTB>vRm&N$6812!8FPEw zV2<@U9j-vNSI*CuqLr_EZR+=Ez^xNK(oc}*&ykN1-X2|DOUBhmoc*A)Oy9yrz?d7H zCml1iycPc4P=+O$z!2LdfT36-C+NJzD@C2fa2b)JTvcmEFPenl*iUeIN-MCSFd30k zk}*@YC6_+M#CPXfGa&8qhUR~{2sY3vVpGI-B^(RlZI~ zuj^hc_Qa12$JEtd79~$zYXwFVmE3kpIl^cCNl^zLpU3PgDC_Vw!XkI6YlbQ(Qa;O) zXI5?ru!h(Qn`61G7HgW8#Z8@;O+%zP!dp0(+!1@GXe``C=IlvNy?jS*>PThwl?BT~ zsk!*tt>uZ+m3VSX#DPzLgWn;ci4$M#`dBJMHD_Snd%CTD{NX}}&Aq7+`yT~sgASsi zZUQW^T~jMd;d^^~THG8vs*>36pYG_fsiCotnAHqzuO?%LW=K&gANCHoJew@s?J;H+7A5|#L*xnDId;Z{db}xGCP+NGmh5-q9GCScvS#KH zQSBko`-OUidV|fLD-rVh3VY%Om~*my2^U@-{KHKUe1{^a5*;XS+mCIjw!(vNnSH-Jz&}3- zL1azRA}1wv3Wib$buzBP4P%1De0NDvT~wvQt|6@^x%Cs4)b#zg_DB&cqa_ji!-T|k z9Y561e$RAosiygycKh|cgRXe?AyI9t54q73b}QNEq0b!GPK<2oZ7mnU_qvFm`(ll7 z)2XvA7$RTFCaz9ry0vn@qns4gdZE;w-O4(Dhxm*FYz5u9&iLw(M|3nJrVk^7KZd{g z&*#LZ>iM4;aP_&1`8~#3els+#tykJ8h>4xKN$A8?GPNWAy?X(h;A@PiF4s9+b?#!P zZ1tPcDakZBQI~77@|||cL!E7_XmBr z7!dIsVNbU>d7YG>RC(#t@VA##o8K2Ub`P3Sk`+p9XF}OLi~=h@ONR>I8zj0S z`pt@1@(Qo*vr=?$0LRHtJI6QQ6nHk%dkrHip$G?7nN`e_6(FFS0?uNZSukFF26z6#oe*g9fIkZ}Bv-vm7k31w-?;BJ<~sBeYHy*@|4F`DT0br&~?Kyb_M@`1l35Z7ZB@#i&i0 z1H*Ig9zEV9bxy6JSE@OuLzEbzRkeq-IH?Quz6hVilyf>=K(Dj6eT1um6%G~95#WtQzJw326kz#?Q?m0>4w>- za(BEiRZkNAEbw|F|GaDaw<^f4(@l@O9=*{ikO+2=RvqTL^I8P|?A>|dGhv|{3?xWF z2;Q(YUOkPUJ=%^1Za2sbOjWoR{xqteADdHfJxTtf{rBBxZeqL515-a_|44g=$#e;m z8yPVZA1#Ub%xRR$jQ;lRN$SW?dt1x+1Cw&ja@5P84x(mQ^Fs$aDs0xyNv87YJlp@1 zXPCRl7xhb})xPSGN$<9^65cxBU-2^&^ttBOYhRI~rP@s8v#6LtIrjVPTbC~mqN_4@ zENW*ZV*=L3rEq#a-88vcqnuV3O6k;EQ)5GEy<1IeEuKN*!?qBr0$N5qB$>~i@_HZM z*6K4B(jp`jVKf`sfyd|VRvgBgA~0XDmI#5a3AdWGUVGl8_}9Y=8azJ5 zQn?@EhcYr~$jaQy)4fJQH^v7wWyZ{!UK6n&bG-Su_qi zvj2?AP`<0Q54aOF;4FI%c#F!bRRo!0c>TaRXW%Mb)J~N2W4__cirivfe(t|&nB|0i zZu^vcN9xi!@!vW4E%F;0?bjb_m@XP=eUC+UQS=;S;@3Ird-MBOTg$7f=UkTuR*l*e z9vYq+vw!5^?-DtdYFL(`;vNx->?$YGD24kRaOLh_B^wIqDf&M1uI4}$^T7BhX`u4@ zk3TT>ww%%TV05Pti0vr8WJYFWL?aOEA&e%u^=9O98@mOPBM?Lp6+5b?SG) zf{=rAOME7BSD2_FrH#BhF6GbO7?xE{D_{MvjMCVkf3~tpUK#XuL=!H+G|H{wTIIg@ z1B;I8xQZ+8)f*67cGAq0*v6apBsj~pavW3h9XoBxR{VPAsValWAR944saHHM^?TRR zHn{Bx`tjqe=bgUMqB+f{RIeq&a)*;zL|b#I&*$>t(mTA;TQ;~@SK8yHX$T`K=bEOp z6=tX{S&-DJ!7chW40?KRFwKiVd?jh-4LMF(3vaigiB05~1MK%N>m|6}I6f2iD!z7+ zlcV_{WWqBYDhs5eF*h`J2nitJ-UJE6V2#%vrTKIQVm*K9_ojK_HuW zr)g*7qZgx&ut^=DxTgGxWy}k-D=ubgeJ|K2b%e7(!-p~D>5_kD>Q2ZT%0_(qtFtp6 zlAKnH5hs?#FM0n0Bo+50zE*&zNwtLWrkYnO6bNJ>b$0!$ac8T7%YK*$MnnV3r{E2DYuh(hBO6*;&;~_|zNUlC8?l;$&1Qmzyh$-JF(3IOA2AmUIDD@zehkSW z--!RqY4YePNh}uo`0?Xt)toUm%vUnjdtiQ@L4jq^%CnMQ3v=^~tSrN#VW>pQok@FHkrCL12>!!I9yf&sZ7vk^ zS>dW(an({nChzIqIMD5wVtvf90!f-^%N99l>7lCoU7n}H+u$-CL<0!>btS!DCB`gm z`Mb+eKJ^c)Ob*uPhtA9Izt$VMM5&7OL@bJ@r>Tq-tEby z&wABSJ!c795X#eqP1A&co&<5&aQ0qd zOX^jm*yS!ZD@V0f6AEJIlM#%ibcIV>$)EI#^fBf6;Ykbi3#5GboweDL1#zZmGr@w) zmtO>)Y&xR`9Oiy}(?Z&HQ~A}IQPwk84>%~Z$NiGph98H0Suv{D&@WQqV_)}sV`IZg zn5_N;oPVWrEIO-31C8ZN()^wcTAw8H>zPA}x^EcYs_6#-98h?Lq{`S zhYNYy$!T>mI#i5?_za&BFQI1#?@^z*sToS8j$n4f$5&qx4GFq#jj-c=`>N|fLMW{$ z$%qyyKmToPBSqb&;tRu7qenI4>TKqN-@kCVN;vFq+k9LQ5`7U&E9Om#%Fd@Rk<}4cJlZ@q{?i%YT6aj_)oV>DR?Zp!HO3WhG7z#-g5YlQh+Md)6>sF#h!##(d@_O zwxbyBR57Qzy}}8Ge4RGeck}rl$qw*Ki(-8YQ5z-NBqPM^R=uJ(tQO7kevK!*rkz1O zw6An|?U=gaC&LoUbJV3?i0#UAXW2f8{Yjx&svFJG##@VZXU+F9O$hb5dkm(lht|ay zSEu8lHRur3JVM;Oaq6}rjQ;mip7KxXi!voyK}r3_r)rzhsm(e@c%jUWQ9+Q5JmIkF zRc@u|qIg7R|D2x#l`3!Z&E8HVB}h)_9+U))zwv%PpJUsnr_%DT3FL&)x)1b!6$Sjk zaMUOmIM9(B5aJ~dmrv8nerwK;xNH)=b5z3T{bY2?;#Tg?!yOFGSFU*Q zeP7;^&iD!tob`QxSwiTujtiwMO05*%%8!t?89!YSb^&Tf+hx;=(L_NiMIm4qo>0nTGf|pwCy)ntJQik<3EV{8y-F%;__Z9hwzhU_ z3aZMN*|mV0YvD_)y>7t%D7{ncTn-&`!bTR+@SO?U`p7;UKPj<$5ubWVrxx(#?y;O=B(fK&e zICZ_EVJJ@}f&H-zXHQM77zIXYu*L~;SDl;pt~V1jMbdhIrr7-(QIQNR3Zxdr?APn} z`h1}qF=MkbH!};`-(FeklixawAw_L0lW|$e25$1FheD~(<8%6nVkhQ<(vU^UR7%o2 zazKnZEVVz_o4-lC(3>XV>=u;YWal2bL`1G?zSNG>c^G>r{%2>fCFM6bCGmqSYL{SFKyv7;<1Tbr(4$nK_%1zXQJ< zs@i7fr=orNHYat?znv3fHw?lfipm*X|29 zaa5=nE3xx6QWPyeODSEt;cuZxX=&-(dAh?+8@szEnc?rN*5O(E`S@_%sZW-&@}~me zk|i66#NdHuli`b1%`r4Igos=8-J71~WQj$OU#&<_Pgl+vSXfwSXlMX#%dN&0hfFp_ z)!AXn%STZZ1{k`g;$LudlBO8bxhCU4PU`O2H3$#)f`9bvdub{JgUO(Z(S3|1p?oH0 z+NsZ0q|U6wh+hu&f|=m$U*}?4_+$|TnPiNkywG!NNI;9TcFpt7T1|oZ*aawZ%g^KJ znT4uE71-mpS2037Qhw93L*4fa6E#{P3j$UlCgyt^TJ@{(<$QdtP1#(1$wK{@8}}i1O)H?&ar0bwk?NkxUQ_9IR)F+q}UgMn1G!-=GHQSHCiln z8NhuRoL{F*;!$NW)-p1&2&tVBd^hmk?9WaRVQy}2dOG*+)u$864L%k#X$1b&$&@y$ z{^hOV2J1?c1xtzv)xc3tE&eRDDoXrPDP5M~b@TQj&Dyi=b6a}{A@XtR0FLx{tG+7e zB-GP2;VurHdxxwXuG(K!P7;hFKVuT&-h)~)j>C?K1 zVM;}Q*K4xKxC?E04LPeo%fpZ4Mn$g5glxxDkq(7(;g0C=bgECCIkEhXMK##cH~&OU zLJmpCsxfwkfF2dR({4KK98~nWN+T?ujbGOOtN6ewT`(dEin+yl^_GJ_zjHCW4d5L$ zotl(Lq}u11zM_71ru|pQIRm<;%OoZ&w~Zeok2tvc-UJ8#r}pkM`tSF8<~C`Y7A1~9 zB#jE)fS#GTQbw`j;TrGsb8G3S@y$yDu_qnXp`fk}xMnJ2I7s7dmq!~Z1ph)ewvu~P zmgz*_;V)EPUE?Kss?x4Gdc?Cm@uzK2ar;5fJRGw^D!4e1(h zbyj-JK=?}d&fypNBJ(EGjHL?b5Ya#YhKE+2nG;V_#JFFY(RaB~cOzNiMG=~M`0?~( z?yrfwo%#akW|7?Tgo;u!6FIVg|Es<3h4%VcZmF^bv!Gs8q%g}(?ZLl)q!ly$jLvHv zu^ux&++!vlR0iFu4E7=!q5DryPD6IhR8i{LtbgY0MnDrF`udW6=)OK5bnmD6?!>%q zxPU3QHO_*D2k}~v=I6KfV=9=_nvZhjdQ^WZ9^cMm5-v|um3pmXEdaMD6$5O$cY2%E z+vg$CC*5vOUwi4D;w=TxH=^BIBt`VBQhrv%{y;UefV_gcZ9fu%yZTsD*daHiWdyQc z(Mw`*d8=Wp1Uf08z%S2>i7XX;{jtCJevN&q8OqmT-!S?*5vqSx^H!Yo*megEot zlIXKVryWQ}e2C+H8~XHz=;SFoxqmW$g8PzL#nK&yW&f zv1j?7pZXtq!`;Qw_H~9%;-}H-F&A;jYjGW2l-&p`k(f8#wiM44xf4b+<7?Zju4pvc z{*KzGfpwjqaS`Xc&EWRZb{yI%?842MA>c!kG;;<@T}^#bc1&N$@h4ubt6dlB{ycoQ ztmWOk5P_%C2?Fv$Gy)Uzu&BrB2#XLZ2r&-m|J3&|zL_ev3+g}(F3IhZJ*KbVYt(u$ zd2ukS{cNkcsU+IMI zi%}ikQUYSGAJ=3U-4Y*cx~u6djE!Y1)X#hGPERWnT%|I;9w%Q&UO%_s(dOwo*5EJ% zrS1US;^yL_t6(y;VuRJcE!C%1{3MwvPo2P3LzU4(WA7J!Lx*e>nF;csPx;3OZJ3#x zn_F6{vByD>B}e=*_<;1ZDg1LqF2?M4=B$3vux~?g=3}AlKK%1f)r(G5sTjP@ojc*u z93SxJ*d(cYKKQ+GkVL%9AA=%8Z)RT!>m!|^Q*5xe(#5Jh)MG0$5MjtBZ_dv*krBnpMeNK3^-rZ$1kw~nZ|hFt zC!ixS7)(x1j(hWty^XMoBr{a9L*BBwtP!)r35U)N^))^_&&WHx2`Jky=3O!(_=d3YiKwS?~U zj11^Q0n$BQ9=8)=9DO0G(=rj;VN)}`89F+75&lTkDTXVq?X42d(T0)xscE!2v?e9E_9A}jadi}bpu71F*Pe+of;wpLpt(`NYUQt!V#|cPcp6;9Ta@{j&*yf9Lf7Su z02<<=q51tkhAq3Z2*PZ#kmZb5ou5qeuT23AF!_19^Xu!C6U$g9F~+T7+-j6*LCc%` z6rBPj4K*SP0$1Z(Xsh9C7LpiLZpIBSDigD5Cu-mj82NVq$z;a2w?>SLbKzjI=A1 zb0ck;i8`~19Pof%;h=gtxLB8Wz#R5xeU>(14jmJ659 z@KLgU9yTr1lMCL>T_AzZ1a>M@^w$=1<0nk^OTG;vBZ6(3^=bPtuR`}{BwGA;R`F67 zfbp@f7_}AgfBcxI{hx_R$hG?2+x&FWH*emQl|29nFW-%DuwTV2Z|>K!H@1A11ga#I zTu)NeFp9dAWjt|XS`AsGe(EByVR$@VVj}2YQ`ZO7pQ2ZGQBf0)J;_?!mQ4X0OJmZ9 z>IDcby;Ea(q&B^G3cj2JRD;HX4kse_;qmKE&vZTBysb-jRj&hIIVCAFYOEo z6kdL~Ds&j%H(T}hUgv$L=;xnGgr|}=3Gwj7%|Sbxi>4bcYQ6I-cknxfMw>M)2LiC8 zL01`JCo@_w610-NxZQV0_u!g)#b{$~?e?D{^f4*LN6N=`UIN&)!TCz2Pf4$7KZ$Wa zZ~qOCwdyCuZZ}6UWC3M%Ynh*Fg)Qd(-~F1~tp5FOkFXUftO*A})~jxR?D0g$l&6@a z-Q!)N|9Sz&8A0rE6He0XmbG??e*7bb#s0IV#;qEhYn2HAJMyt;Vf^MtQd#soab`mm(e=njLTJlWj73wIGIwVl(%WdU0I6@DA;hnw!Czzr~y zqIfQpj#T=!uBtu1`S5P<9OQ@9RS`%g>FHVsB%o~{O4D&ycU<+i19ke>IfEh5k?>{` zhGFK0_K?q*Nikh)*RX8%hafVWSa^PbEML4A#0Mm4s?dIUPt6!<=yj)dbyipDZ+W~& z!BE^?OMW_^kXNU@4w1d~KCX8+D6cvGGmK(-KCtME*eJ4W3fj@dE?pG6uj$U2&QVJc z@r-7ax4gZ>+P*kgzIsmL;Ufamcv@N-B-HuIpT9kfiVd(g=YV&|;34a*m%oJAS&Q`$ zOVYH%D-P_~ZVpA9XHD(R51Rk5^GD(DSK(JqRlM2Cd&sDcNeIcQdI++q(;Qi1EuQ*e z>;oT0T{H)Z5FejHkMUl&aBghIJN!K@qZ#%9GGZ86^D0-FeSxW_$3X`onw(ryH)6q( z#|`$fZGlb=+sti*%-gEyx!{dhv3#JYh?IE}S9szc33A+Z7ic7fR+Fym zll)>ATy!#dJeA@r>?;cMlXkk5a2v74nZv$Pmv82lxu=9I&H~@z@bic0v0@M9SUgQ6 zN?ZHhV8|ofyf+EcXL_Vv62>mF(ur9|Ka-(IPL)ANfcqyPkffK0FvDA-nZd&(1o1f5 zfJ{TdP&(q=Z)3*K^H}W|HoqB))N71a^BHRC zU-b34>?@v@6e62$GOXnubL(m9MO4MJ4!W&&8%DX>VZm0StRQ&pT)cXo7zOa zi8&iWxL{yx@4ow3)WDuIq1ys2u?Y-zO^5Bd*;~LPY*1>8G5W?a#oImmXH4;5S6h=0Z+DLr$)1(4K!9bbk#J7f8|e=cvGFroZ*$33br z<<}p5y+Qt*0f)A{SnLH84W<5u*Um1J5d;xCpfs-@?Q(u|N**h1JworaP-Ng=EHEaW zlyeiwh}hqp%>kgfP#MUdkEoxGYhB1%Zu~gPDqFr=x7l?;;eO2)AnszQCsBDHylWuga|3+t!8eYG|MSGiL6(=e*Hfv@)GR zRsP}!#U;I!FNZ8VjNfWpP4`yr^y6%F%WaI20b>OwY+4xGs-2Ji7!QX7yUBaZ^hrHnpTc3^fD|BNS{Vw8AZ7EdT zF%-WmDsis^C1u{*#Es1GlG|2n_J?Fijfzh;W%d<}pVa;h;cP_a1SOur0jcV# zeEoSw%Exh{j!4FN6owy5oll z__W$p-|(%Q&%4x->epO9fok!7`eM05gqnxmxYJ)@)WyKP|BW!i*%CB**m;azD8Ted zCw)uLw7*3SPF7Y{;35SzdRp49szKqwlFi4}nbBJXp}@2+3UH4p(`6?5>0iAFnA|SO zy=gC%YJK$lLm>j;omS#CHFBc`_u1>DsGI+1U3eoCXtKw31h8qd{sRtr1~)9$-Yjg? z%TQ+4vaQPi*VSQjJ^F?TKjsVGt8F7{ZS9f&psRzqmLK;He|@!hu}LutD=VyDkX%-; zJuo)`JO@sfUdc4SDgCCNo|Uz*Pb3%Kb|o2eawXJ)323JR-9i`fw7ywDx+^Q5Z`~&- z=0F+RWm?;!zp&AiXLzKUz>@=55Ou|>_(9we`$GY0Vidg)NF%N|7THEd#m*K8mela5 zV+UGRdb+yhKY9)e3k#;_Y+TQo_|(8h@(H&gA(lPh&=|O-gZyO-y1N(%hkWNl`gqpj zTDB*n6tk~%oONy&C? zV+^n$m1*X+TIZe#OXY78ab`(JD|%e(!DM058%FHhc1*mQ32v?8F+hKU0YX&^x-s@R zkc>?IDHPGzqYfua9#K*s&gABPj5h$N?!BTL62;)lk*3D-xa!0GS^0+|j5i6iFUJkQ zLHGq<-g%CqZw>ChW%o}Jq~}80yES18X7vOjxw1E<)(n7m6T0_z`Vb@1(p_tfItBLy zlfzA)YRSda3qUgk#N-h~J~#-bvW&ue884H(UOVX>y|Wi(MmzZYgPihzZ)E4#A5?6$ z5?Zz0`0_oPb7^~f`|sbsIQNz+R~+IFbk5^Vfi;Rtpw1(UB3&b5^?K2?K|leeat)p3dGb7z%Lr$qjD_*!VL& z{V6NPd4737jgAJ{k|fbbScye^^D&*P2iXZ?{hW24%?`g4^*Z4DB13c~LIA)ymBH)G zw+Bql;%SK8p)A-wX68-@9(CkB_7wyX{P*RME$M6e7Sq(}elH$*dd79zf*g3nhX76g zs%z>$jia5=oLkKvU`4nISW$ghfk02@S^2{?c@PBm%?L$BeVFvB6~CZIk1D>N5Nd&Y zD3CwUpuVsZdH5p<{W9_`Dk^Bp!HoVE$;jyFXm@v{iTwTBt?_8)6ob)aAOo8Nw)sXY zg0RhjTP0?KeL?=M;m3vXM0=ntJ+F)~P{ zq-CX|qT*k8Qom0$^wrBPhXgd@z`4u_;?#@2ctlRCV2B!(`*Nm$bYZLIQ1*!UrXhB| z4BM=jsuaoe`d=(7CKUQKC-Jl@6YZu)<~l+#Oc&X&tX?c2sJO2^zsW938kx95inK&s+md{VtH>L^NX25Dyw z9tl%n+2Als-LzL-pWGgQoVtVTARhH7x~>H0ASx&%Gy$r_!iKGf9`{dm>-S6z@ym~C zQ6T}}Dn9!){OhU$qp|%rOH0d3=lNoQuu$h*1qT7NKKnasU5eRyc}KM_u+sZ%-N4pq z)DeqOF$yB$&x#Sy{*APlaN3 z>903+Q<9)M0M~+BgkphM>7WO@SdW9<_77J{X1b^j7je*@aEsL~zg&#riq_Xfdw9Z! zM(R3qr?5^{@Go`dVOH=ALiDdt(<=H0Z=3a~wS8UZtE>suk%f)Dy}&NdX=&Y(GN-Bl zAD_J48RfMPQ`eF-simHsjT#>x-`xv&d&5NUrVDpM+;XvI-YWEjqtycFlz{S}kMgBb zvUyfj?`p(4Y|7|`ETBUJCeN*gZ)!AZU&;R#$0NM@;3b<1+)c(6v zx6sVeQb@O-9jhV30>THJ4QN3#Pm7yI5hJfE_{xZXbM#>rgt)7m(3#ZQPBUy0I_X|s?Fxh>f|l*7cqDu{OZQ>I#HmY>+A+hz z&tJXyP%v07UfyVC_8c)?@=ac(?AIpGZb<(Plj)hE0HeWbBYsu(3ygR5(5q%2{$LQ5 zUVQJJum83)M#3|N*TwZ1gBt^@PPJpgufPjFuqtA86Y<^N9)npGWUJW^G7YgnimVvh zGT;v5X%8>q_8%nB>`Ocyh=|lC?8@x0!9J`4@57uO{q6y!AoH)2*{0H*ku)Hx2Gv z17Rv)wMb|3)2Lpsaq!rC0!yHuY)lXaMXt^>RDOw*cQ9F7ZM#PuDhBpT zBfJFnA8(uqnb(rBSj#FOo(%(~S=yw&cM_Bg8i!VswN~5OZ$~T{S5ZT^>~D7Z@9g{S z?onvzmas^*qCe$^tWNcW0L5D>?t!t$iQCsL%TT`q2R`p3@Mwe7(Kf6Uf|OsrzSjw) zn2UE?P42H-TRfAu(C#TRdN@@^^{`So7+?CQ9JnxEvOS*ZuNRdEaBOe!TW@9>ZF&)R zT32&$sOQLu2c}}SwIFxVZVQch*jIkO{A^{dptJpjIELkPKChIu}FnF~ZV^#tAt|zDY z1vUdMIw;5V-uqf?Ds+`|yET#QQfK1}o(-*<-o7)-W91qtyC7bH5xzHC{#W0HY;K z0o_F*?tum&#AxKVjW69&Jwg{vLu6yj0C7z$(&v?F_Lq$A2W8ijLcpol|9^Z!7OgzlqCC|JOO_bNGeJli*Jq z_4?NA;d0pFKdb+*jc{S7JMwN(+&J6)vFM1$uRq7Xgz9@s72)X5v2HV(bt;|AsNvXW z*;p1le2~T)c_~^o@sog!49jiw{MMexq%*F1O7bAYGJ|_@S`_xsa8u?iIMDl9YWknl z?5nbe1I!>dl3x5De;}_&4|=J9(+#76j&oN18kf#(oFr9y@IjDfUB9dfJctrBjP+pT zcLsZ5&FI?`?mGfU!xf89!C8`#eENsotB8V~8}6qlyV|Pv^Wp2As^AirtQvYdFS}se zAKFT$$Je^@1(>FP=*sXbM>+4UJ(fL?3>-BdS}j@(I6zu$;i)=T2Z!}=1OQx$WU@$6@Pj2i0*FSs(m3~X(-s^hXe?J>nQH^^NjOlvxUQgrB(7p%jwbft;~kZy!F%U`kzD{f7O-;m zNz~0a>wR^NbTbv;us0U4V09$8!ta3-Vr+@xG*DAey+L>pNlBE*gML;u#}k1#1ZEuy zP0tR05o5F}z$IYSWLQj*N!_;IuEt-d#>UL$jwpQ9tN2m?G9Z@>&07*yll!vdvE|zB z!X+go;5`8*D=5ifbY`y5s~ymeQx!P<<+8AT7Sn%RYjDu&9JxXYsEnI`KHN<90UP4@ z&!68GHeAF5y}fgtE7stQfF?PnXxo3%S$$BeHzXQ^K99#LVnQz{*EoGP*JE#M}WTjG)e5N<8#;(FR9^LaLIBPv#Umk0@vO#KFJ?) ztP2=!UjnQOOlk)bT4FR7Cb~AQ@&FhCM_W`>q?k?ReG~Ol&T;wIm;Z4=n#o(p8oPaW z5eJK_M;2F-=4iD!8VlNA{|c~^y?=%36ESw=#(+QHnqP%W>R%M{idLx+wgNLwNDEpq zN#3e>r}gullPDnAozrNb+ZJU4ze)X;qbL)E_R#$MlL?jIP*15!0hFV$rilAA#J8C~ zO(?^9L;Kes3e#M6oZRs3Y@{f_`*{np*Pe!MOp8@p`LyhITM7Fe>~4ITh*8Y}>U!ZX zfY-sb#>fMv^A}Vx7Srw3CIX8&+cXx9egn{dL_5^rL|)5e=%Ws^nY-e$4}O7(<;Vhg z19L9VI5!gXY-a{EpCrq!Ls&gGSxE;z~n`a2d6?vae_nx=&x zncwop6i)Kn>EvORHPR2uP)sKvQtF+sKvO(q8T6BJ6J-i-vl3=N8B-O05Sv`tmcscD zf`S*=lqvHKnQeDu-lVi)q>PRwJRDq=B$O%I?o^1vqZu-azkXkah4p#WNJgi~^OP{T zW$S?QV#4*xDzDb~+oePEa{(U0@>Us{nI-ZUv`(Vl-l?WAQvLToMoAW(R*)*)Nk*LX zV@(~}s!d!ip4F!$@_cKPb*6!)#4{ao4&fCYExM9*TGan-Ho?WE4IGZ^Mr`GX>%aTI zVic_Z^7&osW-^tLGC4rP{_Y=rsNHpNck)QL+tx9wzH> zHEKeMQuTwPOIA$8&i7#`h$0vBwDG?2_3Ly|Df!ogOrtt%B1Y_N&6grozkjZie2ug` z(7*Yeg%qWo!dUtdvDWvSl>e_3xxsG~rNHGOzqtZPF>&gj(?)V@SYX;vz&$nJi6Vu7 z&X0QLYeAWd*C_Rc$wc@ioZ~yrB}g}VyeDfKH1j4W+~2z3Kz?s?J^b^Bw>J9Bu=DOg zhz!elH#N|1%FW)bcu2fa=LCKCXpljdy4-ss719W_!5cMe47h6S#EZ&C(jq-xP_;RY zc9zL$B0nuIE<*TYC&nJ^9uUSq74ht06x&&bh@E@eQ-!8OY3DYTD2<*hsh@Bz)qW(876AW%s_FWWa}(u57Tmpb*91nK8x@MM<{Q{H??*h^`7gg~_H6Myya z_rLb|GEGFTtPa@FAul{mqk+-_Go0S^tDLe~eW#nmH+p-uv+sVkuYi^f%Ea0ZctH=- zH1ntWOu%GFjaP$u~kw`$n94F7!u&$-VYR*#dlu*>`K}>IUE_ z0Bt)#7Pm2d^mD~8{K{MQ*U68$;^NTIs>E;#qc7g2sm9bGM}oe&j<+>NB0p_SPC`fh zY07gHz3a|Ny+hbr-q<_{l3T8K^Vk9>Vlxy;pp)M&@(nnw1GPdONxF3k2S$Sdha*G% zG?+vo6vWfC3x;5R%5di%H2nreaGp8h{td7?G?V}xiJeIN`4SXEz<_Yk3j5k{Dj3-wnV?a(t=|o!!@-Ay;9>*5ixfq!LHS@Y=$l3CuXI5j z0|ep_6!Qq&vha1q1_|A{^>ycT_~|hA6#yQRG&`zYG3BCid_V*omDRmJ!+aW=`K)+w zruoMfBYC!AWHzB2mLI4XEZWjJ$iOc!F!0f%8%)s_O#xheQdsb;0N4(K;&l&GJ{|pt z@c11J1{xIk1P5pI&5DiR-`G1ic5}k5RE)ZiRndT%WqZ5U0*z4{s_iR!JAz>9sdjBB;k%5eis~&#DP{{7gx@}s zcEoun97B|kXN?}s=*t+iUy4+oZq#ZdRxBxl8f2djUTI(zU2(vA1tUXuL*T}{rhuKN zi>fPG@Xy>dm#MaV;C8ONeA<*F83V5E$hCLQ^dUpBHb~j|JJq4eAAQcR&t3vg%j&cD zO?Z6AJzSwpD#p?6;G@>YZeRvAq8Fxn1_3C3GPp8f zqvlbS9$h4Nn1=KFcu6s(FXjA2t|XIi&!Hvaj_(}7YAR0!&+KM>CtB`CyXC* zz+@bD-N<%sBj5v4X_-ZT$@XgsnQH5gx`QQynrytG$1mdBy*zJjqS>X2IAN4?WuFdNA z@JE7eq-4Rj!Q5YNfpuay@b#0IE;bstt5M`btATLtn+Jt^$wWltBu9T2;3{%hUAA91 zs)L<4%8iEGB;>pczm=>QT!ub%!5`LF5vwOsnBQ)Zoe(=%DM+q7XH&2iHBLz^&?1q~ z(XL#ED!E)3aTaibjFi-ok5f?z9GcOjsPFgJc)$I#UC-v!A%GETYcH7GQ~L2BM{HvI zsep&n=lnL-GLFog^Pi~{Q_5jik{fxa_4ls^KHvb$^J|GsKc5!m8;3?etc1UR(=a5T z{9^jLui@E$$cGyQII9emqM1kb-?O-uslTu2VSELH!=^XPQ+ow5CY!Hrob`~B;G zhZc)?VE5YnXPWUz?zcd3bQs1D{s02M+Y$UY84W~)z?Vh}qHNQ$Q%7jS@Mwl{+dvB( zo5xLb||h6c&1ti0JKW z24W&22i35n|1*-)5fO#ja~cs55v9gi{qG0=KUk8Ky7?1CL_M46!(BAYDHHKY)gDC} z5m6W&j5?;t!Jp^|ZBjhS{ePXhA* literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_conical_gradient_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_conical_gradient_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..ba56e552f7f87e85fded5f90b11b826108b61803 GIT binary patch literal 23392 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

ltlFq$?uq^q$}`iXFq~hT!iNPl6wh1+J9+7 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đ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 Zine8VOW)P~wEM_kbKJdeSBaf3^&dSG#lipp literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_conical_gradient_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_conical_gradient_opa_255.png new file mode 100644 index 0000000000000000000000000000000000000000..75ccdad4528113058faff3d18bc4001aa726558c GIT binary patch literal 28336 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 LQ+Ox$;PHO|IHlGA literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_fill_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_fill_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..5442807449fa3a6a9cd3aab9184dddfcece8cfab GIT binary patch literal 17436 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 A(f|Me literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_fill_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_fill_opa_255.png new file mode 100644 index 0000000000000000000000000000000000000000..2615e12b125dc283ec1a2d68043ef03c68423ccf GIT binary patch literal 18118 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 DbUQ43 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_2_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..92ddaec467b3b350e1a1c0d5d3cac39f7554214f GIT binary patch literal 16131 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_2_opa_255.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd9f11358cc08ee76128461a1c9a9037728eca9 GIT binary patch literal 18416 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_1_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..f18d43a5a9e052562bf99ae84b7d032e71d5c1dd GIT binary patch literal 40095 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_2_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..4ac4d25f1bfe5219f92464736d5032e481904be6 GIT binary patch literal 13530 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 qo#fBoZ-~w#AYz@vzno&Yiz>)l+p& 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_layer_normal_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_layer_normal_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..ba4bd75608a9243a6876c90f6b7d01332f7aabf5 GIT binary patch literal 59240 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%0DYan{xmpoM|Dq)2>|4dMx;c6R!6^6jIl8zruX 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 z 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 C!P+1I literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_line_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_line_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e6ec83fb61cf94ecdb5219863effe2d13fbecb GIT binary patch literal 13304 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_line_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_line_opa_255.png new file mode 100644 index 0000000000000000000000000000000000000000..053dbba52287a5c2ec93ef4af873237ac40e5286 GIT binary patch literal 13305 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_linear_gradient_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_linear_gradient_opa_255.png new file mode 100644 index 0000000000000000000000000000000000000000..6a0e4bd42d09753aa1471616065431effd90f532 GIT binary patch literal 22287 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 AMF0Q* literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_radial_gradient_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_radial_gradient_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..072ec6fedac2ee3aec52b6d8a649535e6e64233f GIT binary patch literal 27688 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_radial_gradient_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_radial_gradient_opa_255.png new file mode 100644 index 0000000000000000000000000000000000000000..d43c9e635bf40c5c5f08560cb9cedb78c0d14c5a GIT binary patch literal 34876 zcmd>mWn7e9_pVAxmvl=gE!_x=fRd6!cO%^?EubKRAX3r|14x%J0@5JeB{`%pbezre z{NMMS^Z9%{gAT*|X6{{UuYIj+UF(igQ<2BTqQts)?;h?;1&I2+dnokx?%iL)d;s40 zZJCjM?;icVmk?=9@3ftCzmFtq4Y!$F8JCu((k7GGPnrq|KN<=|J^UE+q>$ByNVwpM z5|%I<0Ze_f2uri*%CvNB)}$VU6w+57lQRcbn0CFTJ$ z+S-Zz)5-C1-Pq!x0e{Iwr=UyycPEV=h>23&YS0dNK^SjG(Y7cBx%u?+FtciCV-{wL zaxy%WL;163Z@QY*t?s(kEJ(!XFB9RiO@UHMNM=cCX&Af;VQH?F?_J)NC24PuqKI1J z-7K_0a{DyKB+BH`xGvccny!WhypLxUjEtR~-PGBitUpz#0!;ePC}KOm??VG%t;ark zgMK)*p0gwoiW@h3$4hm_pKg>^XPv1wG&X)c1-xu%9ReM)V?v6wEp> zE<5ned8?}GN;?(LPqQU1g+q;s@nY=1I>NE-?d_Af3>z(ah>&ezCgT$mDk;2{^Nk)_ zT3WNUZ{YGnl9wE<0$?@9OLXW&-3w=rf=xIL>Ujt-kI&s&P})1V!6Kae&QkIPQCA&4I3HoXQxO1_FuKV zSG;&f)pNZ+<$8Mgd5VC2($I$fcbgGK?v~@drhW9#c1NMUu40ktmyQ)(rk)d>{?ZXL zS@+B6=B(OHoUbpC0s;b5f)3uuah=I>!`VzHT*6Mz-n7`=p`jwDOE)HoH=~zvcwe8> zA8eOYxJFwXu5?~E!!B*d({`9PbXL_eJ(AIrFelzl;5+gWauAj-5VlkDKRyV7==_MJ z3;bn&vNJ9FstT5wDj+CWT(%r1d4c%=Tf`7%B5i4DN&D)>rL0Sa>%NrE>(^NgkRQITA$+`urtcw8NmhS26Ka%wA zdcZd{`y5>b-u5K0`n_sM{%GPtT;{dEYs&{s;|}Rp%vBhRjz%W>-8Sr?#dwL0g@jji z$kY1dwzf)ESDOrL5A>)+tk_YPTN|d4Sy)=Gfs17X-JB~Xb7e7_fwfE#xs(*bj)cca z-3U*NO->342$UJMe8sP5Z4CsQmsKTgs@}!?Htx;4CxaS$*Be%YY3El*Lr&9GmS9~X z@o0K?1Q3>WeAa_=;B!w%ip$GshrKX~|)QdUVNl(axvL!=NodEtFJ6CckBpzc)H-XuSRkYH*rOL%_z_jEK8P}4H(;)v1|g}0sZf&Q2N4S3Ve|8*>trvFy_tkjm(Ycu6EsV znRtT_vH=r@l)(Lc6K?TRcsi&-+RjK=Y9@-1G5nZ<65(Bp4Rc=ZxEY%{ZPiuHoS2yS zd&a;k&x0cXeAs;K%J$lZa2fU(W0It*=hp8$@o$nxqiJfoy0#RM4)GH(P>GW-jaJUu zG{aWs4U~}=rEgM#w75t4&#rH_x3`5B{i|nfDFq$p-Z@Fb1f3QfigvqcIW|W7jurP? zFZaL*hp+A|r`zP3O$laUofvO1ppP$9d zr<3pdtGVbO4{JX@NId%S>v+xxuRfKM!}c#WII=?ME#R2xJ%->Iy?36nSzkyVT#$z0 zYBv7q(%x5O$*~dBFZ&OX*FT@cL^HjI%kl3)oF%0|mPL=*@#BX^NhEP6g)J~68WGn& znVc6+A0vO49JX$L#p_Gzn}k?LdNdBGjy355r}gT9DeZvhcOO zwO5n<6OOn+q(GKQmE`P48wFvg9DetRDtmBJ7>Y_E!QWr@d~-a-7?AC z#tXnJ&pNeT|3JZiXZJAlIVBWMO$d7UDg+*h-*&bVbB_POkCiCOVZN~@E6Wsk!MX)s z`z(Con+41TGa;0EtWwJ#Oi8 z6lM}VCUZM@%X4=|Ycpq)yUBBxsE6nxiXRrizz7YYPegTUK9qYH^=PWbJ~?+G{O0a! z5&wQ|86K&~IFivbQKp|4rnyN>@j|%tiEaB=$$&4$l40MLwzL>LYM(?-oGtorz^A`1PJ2(LQ-` zEX;$Wi72aE=v^jAyVBqPyVeKRWkMETBJsK$3(vnSGjt#_WzkZVd!o98O|Tz_HRLlc zBXpV`{CYg#TU>!0U46b)tPOf_xm)K}Rq{Y@f46Rt3weH}X-qZjAPN7mUnO5-#7{Xe z_ano0)YL?nu+)K|y%!z)+SGvgX1kYJ*Ue(=x@cB?LQd#Aty#FXcIa^vMJ2i`k>f>b za}SYidn;c~D^ z!yiTUJwhcc?O+6>yC&o4+VwoLqKzwnluf=7Uv(Dty-nJ-*98Vpu@e7Dih1Zj~O7AELqa8J7s{81V6)i^S_H34T*WBX} zEu6c4OQH3J6zgfKPgJLVT=6=nxheRd$j>6~`bQzj?+F_M?5N!D$5=&Xr0iNn7n$x} zP4mn%3crY;ahN%ZJ|3`shX9B%EhW`ckr#jIWr8 zrpROSxyYpC<7fxg5uH{oIr4Eg#|2U}b6!XIUOzQ-Dnq(ER}Upmms}eTIO}GWtyUV& z(z#d*Cp0>-UX3e**?ve2oFF(41Mk)xKyee2_BX8J@WJO; z^qz3zwJ6qpX0G#t(mUlV&)&oqN5CN@QGtnrDml#Al9+%r3t9Ev>FD9c z%(OARwllvsalcvnvNJTdf6evvBu>Cfexj;iw_Uq<8xGP?OB2}`i|O&xJ20z>Izin2 zfDt+-i#5FEt~c@cydX&^F$}q6lXAYgkV7e;s>GcAS~eKUO_e?JBr*g-64UujGeAxt z_m}3O5PrnF!9f)~w5TVvad1b{np=4Q-(r5Q{q&t?xU&-y4s4Zzgv1O;q4u)`ilKXF zG)?-d*MIFabM*56n02%>O!P(c+Yr!?44RE6prxs>QsD+-$SEk`(R$48X{LgE#D7;RF{$P?1S&9d&p_sqpxp3X0MQ-1m?io-M4 zx4y-oR~iXA^A{#PgEi^uq2WcMAUFq5cpjK{-01Jq;c^gixQKvH+--VjT)$1^JSShV zX+aL*mRZYV&@l*OR%5Cuc@pl_R$&l4Lyn{cI+UTn1c50SaH0JBJve4v2J^4igz^Yt z@WzjMUWwR zgiRDgh8iXXzL7O6iDfvMx1TL#p=S#MxSwlP(xu6Fo{T5Ev;dE<*PV-2BSnd&6Uj>m zE+9%PKHA{T(J;D2om8I83?`)<(TJH;Z@>cD1Kulw&`bi6JJkF5caw*xK=DhK1aC1j zSsE}CP%Gn(Ii)WJMfwGyO{UXpt|I9wb+fy!4X?aN3)+Ka(Bis7(VG9RIy(qbt+%Y~ z?#?w5wNoy0vHmkf?a$QOAAmJve$%!P+-Xpj=Nl=Ce5fNdvwM;u zj)@@r4J~F!z-o}%%)T4Rw)pb)DkJnAQB>H4!ox?UUc%G_?8wKUX{2w9kyHGTYzFi8 zbWt3^&+5T>Xkj-bpT0=$MQ|1%B3?GK>)?xGCZ+w!z=-K&R*(a0(3G4K4-4}3Xa z86>;r_}c4pvDyo@gMRFi@6@S*AneCHIknSkHouGzLjB z?)(I^vZI%f2sfnv%W$^Hq4yl4fv2P1ox9L>fmVe1Yk|c_XMo~Fh7hoqa?INh?7^`m zOkL`Je|l;)^W8S+_Hwa$?&Tr0f&@jTVlpP&h964`93nfans77Vw&=BGgJ3TrDHUb? z%_^aFgvi@RA@6`UA|-qjeAi*hJIBwc?N~=;CUA_Ain8?BE~8%6Sfj15k*b25VH_O5 zzJkWwf(T0=Q6KcWzY0t;R^sqa<6=|LN9?8CpVy^T)XFewOnbJIxIWi1-FfIc_e0da zeG~&rWz&WlvrTBMrrd~OUw*yN(=&Sk0b$l^*M}zm^S|Ft)x;;Lgd7b(^!%;Oh+s;Z zF<#;JvItuA>$oXC!Cq(i=!0BNfZ)d+e^!8_+Orv98JOBH>-F&{KAJo$)wGy_g}Ls& z-+p@S($Y_!|2;7}1weIxAi#t?gF1n@5S)i^#uBQ~m4 zPC7AC3aE;xeGpXpZ~q=pF_nqW)E??p%ogUWw)MTYjyU6q48x%FKLBUE+`6kXNhq?} zXg?HR^2-1%RyZYb)#`DP9yNygmW5HogK=MnN=L1}!4lw2P-EUfVCdlhcN`nTG==eU zvnq{v$PJpk5BY|~HT3mUXC+E-#w%DZpZ839A z1?$&yL%9zq@}Y$l65T63r$II&1 z*M^;D=_*Y!$g%#|&;9*BXXFwM|FIQZ1}GaYTv z)#2f4_XZDA62hVPT|q`V>lWu*FxXx)0Ex@gp@z025tH0dn8`x3Phi{apPmE>%ZW(k z7bY(chGp?V7;+7uaev^KK{Xx_WdM2vr;QigRDt3-z&H?CG%+EEDbwiG6gdvM2+P%G zP8{G{-eCqWhM-}OImf>%E-8uH1XS9eF9$hslD!DRIB!P)loxMrPVWMlB#nzT(u&DT z5RBXfFRr&l=)L#uB1z^*%p@MOhyRA$=>JE|tz=kSQDI!~yc|W$dKdHU0@epGHw`YU zU20D>4GjY}hZzQkv3=nCr&3@+@FmZdfLVM_cxhc_3W9I9^?t%UBJ_cO8p(SH8sSY5 zakKL9Kz4ngdKQ)<{|EI!Fo+4Qfb9cI0Q6ct2%H-nO#!b1EU>7g1g-ly7`%*6=X&X@G(L=6z=(kGYEr_ z63x`)4xLC7MAMD1OA}zlYHy<4@wuqdXDknX&hQ%{~_ixHzsf?~bJrvm%$%&>+Tb zL6$eHQ%1sFc55b$yyovr?AL6{NhWve86!0wYeJ6#6A=zNE?j{nVZ>&P=RK4o=~bS3 z(by+u#g#*Eaa#OvnJ7qhSs7=%0s-LyWkj&kVR*a}OVlr(_wJ(Uuky6Z^uiaTJI#{N z7+o6-Dxm=713YBZU^~k4WyY$yeat&1hR&%{LcGJVu4&$p@vm=7-D030?T(-tQ4~a& z8ZTUihK5F`+<+n5gy)MAi>c_DO6COne^`iK2r9eO9|#O~j~hj$fR8p#EPYT3p{1?e zIKO9K-jH8a<+?LfDI!khNg4yS{c1(XzHkq5NVnWnY6S^HLdJ%N-=dY))l-Rmg)j5q zgi3`k?oL(8j(*o<6Y$zI;O&e)jbNYHaxX?4PB?NWQQgN3mkB!WGX~o@RP6~WqTRr! zdI3;SQWu*5q)7lo1-Oj))x$r?D?jFV1$TDsr^KWsfMW6%2YCG8vk8v^gu_0GpVSk=ok`eB99#|1MR|dDS+14J%TuZ%?jh>V!IN(iG_0H8`-9(r+YThbgOAX zaz>nmuRtP#i6{z8{s%eYD995M#!+8_tBg{NYLgb4ugn0e-2DhZ{;0uzIas-r@RQ>- z8gP9NC=x>eH*Nb>(D!)rsYbq1s-W`c8flcEcC?{|TwBVqDAP)_TeGZHq(#It$al95 zm6)7EbV%Z>yo0B$eT1>w5zuPz=2?0O31vICen@v@*F(2gLk>8fhzBzyW`~Cl2F3PCvXCGP0?2D2+uyn3)7jQHfH7ks zdI$*}X2&~+mVVPAC;?#7f_Hj)`XM)BX9qHe87E6l9Mc)nPT%^@7#w`iO~LaHdlL(- z8esvHwo!gu5%0mMrP$D22Hn#+H`PF;N$icGOeY(gFH%8)jPdU}&EC9uLr`MF|5b^_ zypntdI%4x(9}zCYa78vnr9X7ifzAC91Os%jF_=pF{y9J`_|(E`eQ(qT6q~ZT)KB9YhJ{x)ZCa zs~yMn{*GgjW_0KewI^Zh_hU(;AP4$M+R{u!F2dATq^7iDG$kJw_gR^R{m<8uqkcKo zRa=<)IV^cL?E}{QD)qJHVrzik>7HS;cO{#4k405Z4$1^P?~|t98>3c#)6ORSHIJOEZO>7QU6m6HDHltP16DDeW`e0@EiE+0aS+B|Nz6nKQwO>RFqypTANtLLVft*OU!Lx(=BW#&eo(!C zImXYKqGb0~(6TqN`(u88}5%81ruVAz( zrzle&0cEl48G{7A2e5Vyg0tUdp#Zf{dVrG?&J68r@{@s!hcK$}xfRgL%L8g-66q|AGu<65 zU1PvCN#iwF>9udfo8x%(STGegzjoR|Xx?3;z4YaGU|n5ZU7y)?7z?Yvmkal0*h-MH z&vA#ef9v!WOjT|J=KT`HeRn_X@;F5%l}Hoj)B(~DaxS|r1m8K(xBsIB_@cnXuN(tm zEJl9QD@G1xO3~p(g5cpoI?Y^G7UdYL!kK;So+&fF*wR77Dlw`^q1sRVFi``tcH>Fq zdR031>D7-iYLU|Sn&t<|P*Sqp|NiOWZo8@~F2=H7iW8<$9{rg66cen7RN$3&5p*9> z(Z*G35pXhX?M#rX_3Z__b}7iyAJG3~;Lxs5m3?!MjfAl4nu6Dwc|xs0h_ z2~(e(`$NWl{|4YHz5<{VcAatv&E7(bpO~oVoe#oW5ue6*r@*IJ0on*=!kR19PhMSr zU@-XU`MN{2qjv7!x-ny+MpAoozCQ^)O2Nf7*;65A$-mI5*WfWMm~zPhW@GD6AND3y4mS{ zVJcO~u;dwy-7@Ho0T&tiM9bCRKD$Vc6j$x%^w7J`t`ebdX~Q@sRwbn^%7nk08=4Jt z;Cpy_>S?b8J~XdFzQdf5<@Dzv2Y}3>1vnSN5qc)Y59;J6lyhg($f64eD=|(knTJrK3GV%_p5N9Pv&3N8y#m^+bY*6fl zCBs6B(viXu-r{?wm%8VMTsmx@fAix;glpJ;)qdV{@h3qQfK-4r!HPQnC??dbR4*gL zK{wrnFy2Qn2yZyWn@NbhlK-#8i~XgCw&>%pK4}<;9_U!+nfwBd=~x`oyYYVh{28Rf z@s2Ih*Wcn_DT{gTyp?q!((#}hpXZ2=t47>2S};P0Rzc9P;DgOcn$=c;_7HnzuE|8P>=+1LAYZ~mPp$a7p^XaZngWUj{ZJE=_tvQyy9<*BqO=;gF5 z-#|R<3b>oWckNO z8(;2H|0#^PMympvBHr%|k1ruFWd$&QyuhU0S6Bmz{~78a!T-!u0*W&+ zG4Psf#D;`HUYyn%Vc6(y+nf0GBv94(6wqlVto1iuyEEZcwC`z_QE}SVq@9feke@F| z2Rp+d;#FZn&q;nhRupb}uMm+#W=Qd>WAb6-vs}#<6N+Hv-cstCX$PsZc6`@Bt>eLN zx*#0;#KOCSSU@>d*u^Yk*AvhkkkI-YAVk43T!~iAtxyvS_eSrG1z6;RwbGZ4b8?4F zl>#3l(Q=INruGr%f!zM!WsBI>ux4`#Eyo@Ub-qaPgp{y#&j(MDy&zigsa*z;glFhZ zmqK{#+R2JfR0nke1ToCWAf+@?J{|srz>Q0u4@Wi>jd=a7^wqr+D!fP$XH}Mjb`u`c z*e5?fU^KP5u3-hTkmHo=)nEnvxZH267}T0)O>>GI@i{2V^Xr?Q4+{jlW3~;D^-c58 z)kE)ktl!Jdh2LF8@tRI@jTJ^0btj zFtw!f(({|$u5(XR93a&AkZSHYJ}5mw<0)crLfXD!i#dEE(}cx_P8NE_klJ|>jtdL2 z2!Qn;Q4$cIB=A_TLSi|A;cwwold~JWd&nepxl?^|;>oC2>!8~~9arj!XQhW<;6TVx z3!3WEF)0rdAx*!Oq}Sk~WG6ovvX$ZYIrlygYWGbu3`GK57Dp>Fb9_jbQaqHEFhp25mVb1aTIC$|++1H03MPI>;=s?qVe{8PlviUW7ZPemiWQuarL@;+7C!wcVI5VE zx@)P7a=)^v^4Mhn<&x&q*JU;MnuNCdB`@ZKSYo0|;LK?&(yb8zz(LgaIrD$v;gg5a zy6!pvct)!d%NZXm(-`B&rilOg!w0M;rwyeKcu(rhI|WERB@FkE)}aqDblj_DYaPaBiB9f^-xqDHR|@FKB+bSJ#Uu zzwY%H#zB9yew!U^vejs`J#h)f1NhbyYeZ2<=TRBH3T#SRy%)kdS2rlZYoO7oW$!J3 z11!Pa(^HfhuQsk6(PQy@_0UA>%$9fK>5FQU@nWqz&&L@5>vll>5eL+1I3%1n%&2;P z%GY4^3orKb23ZViK<=1G6pTJBlb84TP2Kr&9jcN!6!|7?J;%c+@OBi&kUko)3IjM0$FQ0x+hh~U*IRXHhE5}#T zpv7(Owq^B_m+Mh2QC(+c<`rVxIx|2H-r*bkoPNmH@(Z#03ZYT%pP4AkWsIlzSshQP zwMu!I@27aV9s4<7zEw)mYjl6=xcKZymm6~2%U&T4w4bR$PAqGJ1*z4wE2{0o31PYi zfI*R^e%n_j@Qjz~Erl3&AxX8}v1#z{0?1&hrcjHDa7;a4X2S z^n6LA}UVr^{RrkJPh@AKo*yJbNjX-`mvR+P)A84%s)79e5LZgK#CHmy{k|3Yb` z+shQU!=uN|9|c~!?M@ldtm0IzNIp^FEa<-U+_DKK0~IA}kZS`dR-nABk-@%T}3 z)R_BuyyyEFZP}}qp%e4DND~X5G39##VwC8+)L|UR#6e)bgdCE}P;($YD@LkCm#}yC zJ$0kUtCinQ*B`n|bepfc<+OpMK}mUI@lf@I2hF6oJjpxje`Ewe$~Ue_po5c7!SU6@gjCJ!VtMSz4-tgjQ&go}OMIB4NvC+BT%_ zPJz4jS;u?k{&;gG^!>nKyQw(s#wDgWm!;&epcB845LHB$o~qWR5`uwwXaa74l0hj z*Fa?8xxcV0nCbefsfL7TYrXl8ct(7X&c0saz$9*)-TGS+q(COj1Q#Cx0$Hxi3G?<9 zffj61>xM$^cD+{rbC73w_5!!A2S$w*4uD99GS?V0hjHti8v6dnzlr=cm{I+Ip6!2B zN*)Z_PDG2DJm!LuB9M##E&SQ8ufkR4uQlpNomjoEU5xY=-0mL}OOE*A3y{_3kZwtG z<&0l>s_FakpM1~?((6KF9lG)#MV87%H_Hqx%|Vg6gN5vQnme!Tc7C=kBp{X%)5hp1 zD{~EQ@E%{E3HD8tl*fj!PceZCDX-)DXP-gjc57HixnV+Zp0T3Ox}|#h`p+hxr7=_E ztv=Q+10ecaF|TEkMP>C-Jk!AMm)mRxg+F@>w%%<5b*s(PPqSwksQjjq4Si-3)VZRI zkMva^vBPwf=)kvQ2DgUr&HZ!jLHcy5qyW^clQ;rbxPY ztXuVI{lJ*7o>*yHU zz537TS*iQa>B-vO(KfoUFj)2-U=dR_hTjJqx^u#U{j~bX4F#WEiQ1osIh3WUW0dz= z>^HvR>V)s=cIZh;klU*q{YU`d+^^F-n?sE zpE;rZ5XuO*ISOklj?(WLtW}7;od`r22%9+j%?S{O?-Qm>3;Z%7Q$_GgIjwZky+CI;c5SC?-NJ6{2i= z`fFrMlempzd8n$o%+TWFM@kGe-z5)FF-uJ1q~Wc@n?Ib2fjf9~p-nxELC zGi@{96^0U0VHC^$cH8(X@BPTpwAk2Hisq`OqAd$Xb!%7GCt3?%oX{i-t#ZyexeL4D zYLnh9M`uTOS{`S=52>Tb!;3JH`S+&e&A2Ih`EsFC?>n&``@xtA(L$v&#_^vLm4al> zOE*aoq-Pu#x4N7KO6)_<&YUYlN2@;{0D*{+)A@P2fnc%{O0n+$>r8WZWi|ULqwn#E z{IfLbYGyzy^51Cxh<=U|EY_HFcw%C6p4HpQl4-N%&IjvF%O*Yhr$^`tL`OqKZGBvKi3dp@&u8ip zV?_aI+rf`efk+3Ye%S2tR+g;X=ZAi4tqA4M*@+2l4iJccllT^x-XEpojb*d&mQE(F z4s3$X2RZ`K*lyk^_xt8Dy~#*^LXH~|q?h8@zg-17$X?&MSv+sumNOq$;@9*r? zjRDge5pakPtR60nWYWe(UgOP*4KxI$_x^e`9^}(PSyG7c*7AmbC=dvLB7lsrWRlHz z$S#t|Ds>g}B^P?>1cg^vweme|Ys>p$Zuui4 z5I40pb53#^ZzRo@i>kh=yIh`av6LbWs%##Z!;c%Rbf~!St26FrJ^!8|2h5=3zjHh7 zo0LU`Gjw6ETVdtKNr+vsVad4iwBy;=u*svUeA^^U3~W-VDvM;FfExsj7BHT-rnQO7 zUgA&6SZ_hPvGC|Vpk15k#*y9*7b70k<}yf4AY239nY@l_ zN(1H&fmNA8bcbBCtRmA8#u$K&q-N#Kn1 z?NvYh9$Y=4(j?1{zBPsn_q5jA>$J1oSA60z7J~>!> zLjkqgO59kMZ>AW;W_^T-%3+F+Z(emq^A#0j16C&Ag#$t3B~73X-v*)wCu6)qBly!E zSVXJo8cgk|#{W#|PrV@?oTmBmeDj{Pz6eG9X}U_INe>R#V-vO7d|Ps=pO@#|O2ac! z`D}lXg)!s&xR=XcNKvrQ_*vyD+lH(9&^I^KT1isLN#p=4aT&F=8v1ai^nM|MMm2@EY44EFynD1 zx>sF{hFDXTSU6D{eWZ6wb?}>5=Lf0oWQ$E~Kbw;u*hIp!F3?K2s1xe`T>of0D;?oc z$WwP#G8)oq_~QHZG)Mb*CH5O_+=wilPR8pp>*{F$mItgf%A_G6{X!dOo-M!de9|Lz zAfn^}`p-J&2?q&D>9}t5>S^G4O1W+Svz~u+0lfv1yR+~+5K0JHbk zoWgI-re$h7iR?$DjCcg>%{3edsFxFaK1Wu(Pt^#@>+gkWfmtl}PSG{_W$|kHv88n1CNbeaA0DO<4jOh74QYPLG_4 zT6-XzS!CeP_4y_JCWMrp?kzRy=1fGfrNDjRTfb^l~jEOb8TJ9647laMsOz zlA0xCn3i7m=p*C%fh$BBbNFWd?=jv0>dXp%utmeXqqu)ksH}hQNbI(Y4TH%o&@G>n z)x^JD9QR1KB+iJbLwi~0Cr(>q1{7Hg$zjAl?;iHo| ztt1FJfZR_SW`I?^1qRu=$wQa;5V6d=nv|Ar3(QbIZwjhac3(j2!+SlslOh^1PjZUG z(D)INSOi_bVZ>hrr&tSq<Yk;=4h!zG}1VGA1xN7+s)E z5YMO^VOkhqcA!lwm25p8!iaQ~5TLX`==w(TDk|B{6XCN2dG zq~1>c6E+k<9SgXv_= zEMF!475ta4aC&q5a&%r!R1SBa!kZJZR!cY6uoBwqz&3a(rrC=SHx~lTO2%py{ehb5 zor8>V*$1WgczMT9Zod%-#w#2gh8mSd*5by9*M6UNm?AP|xFw^OfxrJhyX{NFAy5#j z#L7BTNjpLx7?WDyT|ygWCxL`rrnrD)>W+5Of{!5uS(HC)+Yvf6m@Oy3^VsZ5*!fSn zFr{}s!ZW6~9Z6@8cH}*tkK>NZuB_&k-+U2bQOyt!ygFMpZ2?iY9Z2B$Je!qrZZP=u zSADV+mT&tsk0@CSQ^-=l7u8Nl0TS5O*4&(CE3X%g2Cd zj|%z*&n}*VvGq@Cy!#o&$Opl1N2!zH1wX6{y22nNn5bRvDd5U1q&~{1F+io)<9oNo z#;O5zO&ft;D(?W$udfjc{l7iq9Z`MO@7@5iaNh#y0 zv^7f%hEdCdBr<{_6UjtPwr~pdGqUjkqII4`$?DET!Y=Y&2-~?%8Qs+q1|04ybukk6 z*Mb*KC9j&=B{#B<*48`;4IJWnSxNCz1JOOt>3^WO18oE-cLK!~Ahd%$&sSR3aERFD z12qWzzXGj?$bYW7i;j5wD2r*n&k&uO)1e!yiEs%=pLu~-Z5P6e)b?B@Fh1R66#Jg>8lr^z?%Db`r{^M_t0>>jpOirC&oGEQHAEx z&E@{7w|Jf-VBpRZGOw6aSu~bDzTa3U8L9)Sd zAIHDVuKBN=0*e0jM!jwUC{`jBzR?R0xHOT*!QV8NmcGZvcYZ7v@PNxz;3;0gRFx(6 zC1t_y>p-cor*0Dd#AbPW-OJ9KSQesRDdR;4Y;DGFD*Z!RG1bw{^h+bZ#ea@0i;Tt` zY&y~f`EGge#Wdk3iC3Y zl%NGvDUg)6`v#q@(%rs8S(4Rxtk*P;*D3DvH`i+LVJv>CPr)a5;cnt_IU*@R;Inm%q=P>ujw<4Z9 z(3krAtWxJaKsJ%2+7zDxUuEQjQ@^q$M;}T{Q7Hfl)1Js;gf9oFZ0pCwrUy!>kLkp{ z51JOQxo*WQ)>AZ*!3ECC=0KRFgRas&AZEiTrPYN%l0sm=x7?XJ+_s|sqXi&ppN|<( zfD|Lo26JuoI7mka8jcBwmR!Ql65mOl|49(rZze{htFX%1fa5|X6VVte&NxUp5enjQ zAU|n&nZD9D4LC+xpLHni<}*Jo}-#uRvB& zmQ!JX&#_L78c&{)@Ctc#t5+Hs7H-#)IQ=rb4}X%a)NAQSa3}^o*rEv^l2i(inb$kk z|G)*4e>S`%8X%`CCJ{&HJD!(xHwTf|m#1!n_(`wL1qV}Hjx;}@1G?GA$LDs)3kZIc zm6g?`@B~EOMAS`vviy)k`MpCVC9*m@^Q zypC2qA=VAdys>R|c9!sCm<)sCScjRKfBhVApYa)hCV%R?kmc_D9bjWip!czR zDP~XVG1<~tv%mqJbA(HRVw#_Ew|%TSh8`eQAkUlfUM>e%3@cnX=^ca-$X$UL}*j6uJ1UkXS3{reY`MmsFFN>JnJXlZfkR^`^#CcVR>6^H8ROpcBH zIXVYga3Gwc0e4pb^$&)IWk&rL7m{35a2_@M$lAvSPc2Wf#L`u~>27p6V0I`wk?(+4 z-c!E_rQ@! z82dG6@ygLT8yg!?sfEL3RnpOt%E)3m>v`|L^!0EIb1cIs^See)M*T9<)@A{j?te-o z54k^KY7d3vslR?r7}E*Lr1EWly#WL&$gKeo37mOtZ7sObfdfd|n|HmJR=EcEU07RN z1MswN5+MO}srD5uwct)1U}wcq@U4S-3t^wXf40X<*xA^CgQ@S;5dbKjz(4MThqRt79nW<_M_TfL}=dh_o8YxaPk7%k9IXQg@)4 zs8a39AFn_k7lKS9TKH}|3JMk853H;^1c@`HS)vw)A9V5H#CjeS6_4vp>Y9Il@8Wbd zx%8Qjn;N%RKGx>rX;KiV8UT4kupPQ5;NiJ?_{HIeszw#be8Uw*7{UtMJcO}8iB9e^*K|x*6K`7nW z!~~e!y{XDoU<*&Vx#{?<`u9Pd77(R@d!@LyhoD74%z$!v@nWKmjh$V{aqcXA-`^U% z5AyhT3N81|VNg0E0M-RytqjQkJ)z5L;ddKXDFc7HsGP(-wn-*dsR62AOgdYU9sFTc zO<~oVoS@Wn?7w@O8 zeip;v4C%aX@SPl##w4wMeYE>E|IXW?Rpt(DD6%9hJCom54OoSKEtybE;d{HJbQiSq zpn280k_nbtYk*A~VVd~)bCw``x{7gw>l(N<#mVLMlY7c}>L8QyMc5@f-xi$NQF1xh zq#WSR1u|f^fzI=;y#20f2kg&E=$+^r-1y>)sK@qHr8&4K43O6c1YEa(Oa!RrnRo5u z1Tv-s7UjmhMno;RF@pEu3b?1jWZTW779GJOhB9Hn8b9osxFXGMaODHu6ER_Ij+_M( zlP4!)Dj|$qD@HgqCnG$5_4SG|{oX9;Dv$qHdtc#I<=%A*qO^#pbV(|ybR$ToN=PHp zNT+N{X{1|PKtQCsK@p`}dIQoRB`M9f_IbbeyMMsFL|D34yJhZEM-l52NvhEt0Q0V>ZAFp~iZH|{%vv0CLOOIM|viG9#k!yFyA=4(K_ zl`QS*?&jUYVUCttga{-ZEvv1qEtDn(_-L5Zb~Zk|Tx1rPkhr+ck3{K#G{emr&Qk>f z7g+8@qq~!-DdSD$B(8v9$TuL~Wq2KGUkC!-%KIEa_qni8-I!#Hk*D6(E_2~cXtbd3 zpo{+XSM}`k595+DVE$-1cfG@!?8z8*VBA%FH_HN!ykeSt@wCU(-bY4pr9eG~^Q*7* z^_fQr+?VXB`5ghVr7k{2B0R4Ez3P$83l}FHC$5G)-iiTbQ8Z$)3r@B*R_uhydPz=^ zs|BTNtjj0sCH(jcJxScq0Fr0xDy3#FgF65B4>@;i^cQd*aq5EO*OI9ua_M`zp?BwJm1ilCg{w?qn3|WB3N%f)n%g)8UMZ#&Y7@3@cBJo5Y zO_Ui2CA;0Fd)!IvWG+-K^=%p&YHKE3erC_C82(6m{(g}0<|FIy6%5|%-@?7mild|7 zXBJ;{U^09c#p{4c_m4=L7C_O_)y$xrR{$Q#@)(~ckMd)E2}MOb=4tsPF3ir?so1!f zf3ALp5zLWiv%Nsini1WQ3zhdf#WACZKqhXR$7b>&EJuY&Y-+WG_I%{MoYc!3J@2KH zG8&&pB|nY-{Fz00SS4K~qw+ob0_;zLj2cDfT z1X9?N@>=}_dc!fIqcXjJ#V_4Ss`rCs+hnn~iEKP*Q2g_kW-+PISFRp9b~?!#Y>M9P zzwIx}AmxT&=EUefyw)~gMknO7tOUgJ(q5cfOmJ#HuN zuYOXMFTP&ES1$cR!i|(VFX1&!HuU!RJB`XpQ^x+N{5*fb=tld=a-nC|w42l{^1V^3 zU8fR7dwgC%Zau-DMRvSCKuKS0&R%SS>74=4`G?p3wVL$yg}U|P2K)Z5NUD>oE7*T) z+FnNy6zlnWHUa;r<>))7fL@!5fR59>e(t3yjuiDKJ~l3C1*wlI-=^h~j0oi2(pMrC zr3J}>$-s-(4Wd;5V{u2t^7aT6p0)6Ax8X%hXj!Q!egwK`s@LB?GKwI#o6|D{DTKvl*yM3+<5rO2;CgJlcu$@r0~mp(IR-&IiD~#2k9#Gcy<9 zTp&uJRCIzNcCGZLK;8`rnOV>>fd&7M9`|lbGGqKIWk^zb zS<0OuCQ|_uJO6<3JN3)D#rh43ISKyEi z#+NyJr1P*cKhpjiiJ|A<&!0ahC%Z=Ru3pj0T(TDcq-Icnl?}!$TkVEK#zW&kv)zL+ z!&k|C0N-v9G*SZE&DwC@pvw`^j!<)PV2F_lyB1E{f{s@|r(yFMNPsD)3OpnV0ihnR zi{lm44u_AfR_c9N7+0#@KiPCBxP8snTYOuVvN;klU$%8HB?Ml4B6U!7jm+ ze!85aasklYnwmE28*g*U_~09va|l_S$lF_-gf~?`Wse%FjbUDm)iiT_woWrrF6%0& zRiXM-a?|I6BRn108Y3ekv&VgIP=LY53p8jFu7{KJ{syTsZHUZaWZd=ahb-7wH>iQ` z19;xkEw`2ev1`~q{J(|nZryj1q`JNAR1w0P#;M|ocfM^kLC=Y%JUk%w#f)@t?E!OY z1vaq`gBNZ>@p`ZmZbb3=>++Aq>j1XI&C$6bqo$jYEXawk5>&C)vGVl!dgjnCFf7w` zkVYD}t}bal`3+GECDOH)o06-VL4YBdztyDf~3Qd0RdAVnAb>~r;8pjL?xEhgoY zvG;^8P2a1nkq7R8KHLMJ=Q4%@lo8-ve6~GiQ@BhO+}-Pn*TpinKNl2t`5hEP4+T`% zfc|#5VJ?2U;&ZVAJkq+?ak!L1&e%cW6Q#k}{r)4pLWDizaeQBQp$dN(mC=)M?}q!2 zrg;4u-a+e0=PKOHjsE!$Co#Q2KqgZ%U%hK#=fg{igFCi0x_4OV=HChkux$81`!L|4 zsoQG37<4V+L)_sALK0aG4W`HyNRj*wfcFu|Uv}`PYf~lkz`EsZiPL=yl%k%EkR^x$ zR6AcS4}j!g6UzM4`yi}C?_?PmZJv@ogk&#T|3%8b2sxAdU@YvTLWdJA3eJ=C!xYC#l(iMJdC&PSn1J zE;;RLUOC0wf=}J14FUz%D|MvX*5z*kt>&w5Kuw6$JUsKhO`42b5U#;Tdu$;EzdZm_ zMh4cpzR&pqN8)-eAdYu_P%tYe$Bk8N(m=*2v?UK91aRg%uN$kX?s)mUAII@3{DkYv zk)75Ag{2l7oVmxDQ9_@vig-5E!W{*if9P@~%-74j;9q(92=P8eyLOk|7if|{e5K8Z zm0f<%&q0w4!f)W-Ae%)A5hk#Qf_}tn5mNkCAl@K!jD)C-r?AZ&Jbiz>j|N zQsnHD3&CS_}0p~sD(nu8Dz2v*& zB}Q{I;F}TKgSU^~1p9t{u}s#RA?_1w!$%6`ECUf4Yej*a=x$ZeMP`U zxWH%fkc&d+(8e{f9y@Z=)zzI?0J!{w`Of-LaPXfyTpFQkn$5V1Jmlw)LmdJ>KUK)(T@e<> zF5hF5e^GVbVqgV-YHU1%g0=+&H`$7xYtaI`$)xA~Ln(DlO&Kzj9EyDpVS%dn`EA3w zG$r8t0p*!Zv(X#IX{de_En)3kAO*~9+ZP0Z)SUb5=1r5X^@DPyYgf=ap3)M&5tJ^B;!rAa@5Z7c8*qB?@PITKZ~$3?9g3C;U6xXfqaCTzz(6GKC^XZ#;@<_+s)=Pp7Ong}eVqA(fe2WnPy{ik14!>|nrHeYW2kPEYO25vgltii@aHwZub?^; zU-0SEBT6|bNI^lh1vMmEU9Ek+L+2SDOo*N(iYD)`BoU0_(9_LN$-)ySW>QK0lzydz zla8;h2}CDnGIMjuGZ4uQ8Dnr!ag&GB135I7{@Bf>}0kzS96G}asdjYFHMFJ-R=|G9B`AIecyRzI1$ z6yYUdRKmn|WQEMq18m*b76HTxZ8R8yg3g8C!3!;}B7Wf7K?$Rj%!32a2oMSk)S4sr zJ0O(y0cFt4Cmk1%{-6M#Mjog^o8Chy-|wS-&+cB4Itn`ff;bYoxMH%}9!BO@gMwZo zp`$)Wx<7Gu3>c+9tln5eeSa4W=Mawb%JS2*N4X@B=YaQ{9J<+W#NZPh{K0?Y)kaa8 z0y+k9?bO>iz1(E|x$bL|#1jxFb%o%zhZVF$2&yMoW;v{qt1)#~W zq1{2y_AVHD7a++4$}u`;kE8%b8mw`+JzJ9SkoIvuOAsf~QvpiN_;&})gxJ5vz^=mM z^=Kre#tb~z`HbgUbqk+&%V~YZ?S`5VG;;j_p&g%?C`%Weo0|*7C#}LDsZ&U(Mz}D+ ztv@0B@As=l-5myBX(`l9f=)~D3Iov}a$cjt+!gkziiXVm@Rs!Rn>1y1j(wyT-$99C^?_Z;0rAt9 zHyEY6a65oxehJ9*z**v=gBiqn5yTx3mc0>j=LCym65NB7pI+w|3MBl*poAnDqaED} zVZd(uOG?|jLFa4J z^#;dW-tuI3yrfKD)wk(diZmrdwc$N0SrIJBj)x2M8*ef0&a`~yGr2fG8mhj#>fpsN z^>J$WexXSdD%Da=SNC9fH-UieJ7d-rg@oi+;$A0}_0)B)!6+s`qM!l9LXoRjYwlHH znNVdy{Z30~vikJfz|4#-DW)gx4~c364GOL%92ptc3@Ti))}XQ2>^qv}5tM>JD7(+q zEn3pBB@`V09U*cxsHoi(ADVlm)YhTofrp2{{9M~RzIbZE=qvrN=cvv7(^oq8V4$gE zj^`ECg8TMgSfZJ&>d+!i~c#V?QhQU3%DJrK=GV6<1h5~@-6?2F&Mn=b?6A)iQ1 zU*W?1@{r-i?4S$Pv^Iq5>#}b;5^E|eOCRq%qGZ$kF=4-i;b904@3I0#p3VAkcDx8` zJwZ2UwpLePl+9=RE=S$h)WTWU?jl8Nj}r03s!^AAT7)1( zs9kxuSecGr*Sqj^lN&^qI04>I0LlZH04fe5fVzolr9!&Tb5(PVg1WQ^Di+A6qS8Rw zH-*yKN}!oDk6 z`>9gnvnC74-A62vA|Hm{(Mg1&?Ywz}{rZDk9M%jjr(C57?OizVRy5j9nX(D2rg7raqqv%r2 zm{JBr`I%P1>c~0>%-PPS^!yBIF%Ox6q~qlDbg8=Z&QO`_^(sC}8{6oGNu=KRhYciE z12Qm`TU6ABIhl)T$$Q1V(=7Z<)~3W z-X3dTSa`U6`Ow^*gcA zaDy_fIPVWm9CyW4Tj`8kL=g;ZvaLdftuZnD*jK{SdmIv+O|s4LPWEK%pyr}EUzL5{ zJg-!wIZQH`IqN8JtSS(~kIU|&yp0+j9^Pc$JClRgCqyxe z4Yd}tJv}{0Wa>U9nCD!}JLbHX2Col$b9~&>4vV^>F18i$%RQ${nzy2EB1P|-@ku{sHhyH!GI7NEgl3y1s}rC z&yT#R!v?>+IUbKcCyGXCJiU_Mi1*a_CIcJTclU3T)*&!zmvcu0z5STEt{?M|@=?;z z7|!W%2iSAo7kx&M`1?*DTd~J{8;*^wW4ZcVG`g9)_>!acCXxbWKHAt`ioO`F@>|AAN$g`fL)BPM^Iy_@e-?xxC(!@qym?Zd=^x6ww? zK@0g1nmu`!tW6S~B76v#3DrVKS{RJg7I1xi0mB^_vsqZkZ5g5dSTQHYQ}LFgw!gn= zbSWiHsDIVVG$k!QwJI`ED#y{nDxb>>kdrGq^HWqDdumj-quw%uXneuZrsyM+lA_1v zYW7A@Y?_%&WudBNQsqH;VhlZfd$+R(`CM9dOu6PoeiKTFT`m9T9l|CkovOYaD|FDz z&dnLsl>&aIq`_VQnN;RFK`RlVX!j&mBVRpciY6zzOHF7xPmcr4T#74Rze1+(XM1%d z37Mf`?z;hN&imcEPc)YyDJE)?%%mNhYH%yjB^O=$DZg*>Qy$@$Txe!)PCr=D&7`>h z`vBqV59VCJ00)>T;Z<6xFKzI~wU6E3>T?DwTpD%x5RPVqS0UyY7&XVteBj|fT^hRx ztK=o&Fr;hGsatzgPB1lvZkFF@I%jC(aB_l3nyIQae{3i?(_T?Be0> zF)>lpbXOK$VRA%gwy0K1wXrSw@k;3N)@+oC>E%czzW@&p!(bFT-UOC(%m`={EiO(> zXir>WCKA=>)8@+oH6fg|@7bvHDh+l!9fOF>w6RMYq)E_o1GmRHr-8e~R(1iH;^R7R6hlOJX-}2*N=c!#Xk|Q6= zq957JHH;lNtRd-4too^{B!|PMv8HV-nX?aw66lSJB34o6Ss>l&XmsNVriDw&PiWXh z8Z;S1N~ty*7iEoE@PHtEQ~V<9-SZ@w?95w^2emfB2xJ6t_h}+-gLOxqT(aVyaQg{C z8-dB8gX~T}xydpc5pO*j9-YDr$F&ZoThEpDH!iMH(Kmesvr0+*?XY%TVR;a5hlBD- zV%Z_eH|_Q@YEL8$av<&XW8$5Kt4;x6%g~Cr_V{$K`k>B!ACZ)vDKciK59bvX||2_NxVKVVZ#YUk=H6SePG*R6eV5=2JceL&%{z8#|y9dW%|aHq^f zl-klctzRF+z5>OXuVlGFzgLm8kkq3)cOP?QdD%Jd#oeZ_vCOIpsE}{JcAXmXJ#dYV z&6G4$RDkn%qpZm#_0p{ZvWuK&@~-nk2j~hpL!hDRa!q+cqD>QTlG{4DTqvVq<0Nf} zB2FW16G^*vJzc;-GAP6Ov4J)kYCiAS%s?EHuB=Ja1k)d;f4plKL{&PYDg`YY8C8!! zWwp`PR$r<{y>uRbkZ3ij(AE~wjCkIY{+aL2>apWjeVI^-@W2h-oZjAm>rw`?2reO( zBsm5^kKNKXe3Bj>sVDOzCdaNqp*}#Wgleb(LK`)+dWb-r zz_fu}6oPLJ<9KE6imHlA*KufQCM5}v+E#xcw;!f7ccK?r(A>a}cof*-q?@>;L|tg5Rkz1!BW8gT1% z?A*pJ8-<~^eJozCLv8b|FR`O0r+kxbbX4iZJVNl!Yaj1~N^g40Z5L~?DeOi+JfKB- z8}R4Y_f-iQk_V?X(5G1)vvW}9m9R}mYGt?>o&QRWjc8)OV}dr5%XS=H{IL)PR(5t) zH|tj~7y(`nFFDZCL`6hI`1qn`i&dRl?il4 zox*jLDU^e+uy6{X@uC&;K}TA3ccb+1JFo_i8pwD!vqmi;(?%`c9G_*s^l%} zr#LmD@l3fbleui7!-C+M=)zUfH*IT5xd#=aN*9mf2N#14gypn0UmHrRPChj$F6PEN zWBSIcyb*8!<|)&6!}n3&*mAC&3j(1tm7LDGsWPQQsKQ;o$)Q#6rTsDE*70q9G7%=k zX2+7_PEucA9ejhXRl6e13hrzdBXNB<8GHhQuH#AM;!#IO2XHO2Y?S*GU70s4b&3cG z2!2eZojsq8cgE8nU){)C9Ubrp%1)#;(nnX0SgrE&ABp&DzTc(DFXd)*`B9H!3Uj{4 zswsMJNyk%A?`Vt~z8F?)=SQCFWN)kObZMp*Y}Z614r>ps=)`B_!S;cgUrmuEyaGZq zj&;bkHh-Hp9I0ef6OX0^YmB~OHdvRFlaUR=o4D|wKqqd3g4M=2tWcOeNAe8QmYqni z!b46d``h69$ODank^KC8t16u$%^Nggg(T>ZB5kPMyed(qRq3U6{ng^sb}MIwKDM`e znw{hBGW~3rdM&BMnVlygM;@8r47T0htx^6TH=7Qf#f&=3wRR0PiZod>JA~t8NRIOy z=FYVcqBX2D{e#2BirIsuEn|I5W$kMD>UZ_b`>L-|5k;hyw8zfj2DDa}$OW|vlGHH| zC5f9Ak-s>5jYZhxx~iA@_AR>bz^j${@r4nqDs`4LQ4h`JJW+9M-=kxpT`qopbMX(G zN#o>-+u6a5s*%#ZvQ(i4oZwjR|Idxq-3JdsKONTbrVKvaD{^-zz>|I@ua)Zdek~Py zwXo6c9;WAqXRotwRX;a=JQ#mydb7zDK(-1wS&3r-X`#lEQ>Iay*GJ1s4RfBsj-!vF zvk}DGQ#GoQiheO6V%6%w{6a>dS1C68w&TbL=T;A5N{inx$?i`|v|6>FawDQStCb$+ zk62Y#3}WXYG3Qtu5al9OwY3%$FTN=ajx2z>Y{a3t&UBH5ZmdZ4EoHiGk(r=1PYedc zW~t!@Y|VLDb}w;k^FSa;Ii`Ol^!xnc;>YwW zsPPq80Yv2}j;pb#r73yk5mMkjk#+X^8OjF7Uiq-%C>jnolhyqG_wnAIT3tI2cC-O; z>@?o_)~2D9bWR&)M{hXLUilpuUdVm=HV@vHNo9+Q;j2}~R#pn$`L?kvix<)>$UlGV zP3Vc!l!*il#iSR{aGPERFcXkn;do^R@rz7RvS2N_1iC%XcEnwGx~WcrkXa0&;ycMwurZa=%% z5qhX!b`W}_L}L@oh{h-P@gYnV2C7LKp+H+=yEO-_j8}V9>cLSknO-;acJE|_y5cmE#GJY98drB(EKJn6S zK!pym8Ffl!nq(o2Cc?uL*J-lv*eIF~PVl%TNh)p?9dAV4A!Tz`o+H zFdKiU>q|R88`o?0`(%D-YrlqPGiuz(ctTG7d;j*!#K6_6$Cz&p92=<bYe@hMe*ga7ZQKKde#GDX{e5`UOSAv&e^>2WW3WzM zdwYwe^mc{n#w$o0d=*So$@2)Co106|G5NZPmxb|Vl4Cx*Bi}yFOR#S3Sm;YCmxo(@ zsd9dYogG_~(?draQ7yzmw$^njQtAE4OpGtPZleTf>w@rR#Mv?3f0g^k(3fek86@PX z3)ES_nh?A@ZFI7gA_M;U!Wy+&AG+qmJZ2s{+*HVkIeQpmfq&zMBF}~w7f};T1)={# zRur5u%YuNeLJANHwL|`KAQ%63AOy^X9d0gCJfUOjV|CT2?nOM!YO(H^JWV#X)78VxkobBtA-bAv7T`kSqiS5u| zC|C2{$3Li<(kFzfaKyQ-iO4qV7cVJEVO}1{B1>g4fBUnu3WKta zx8#toJ~U)uZ(nLq0<=(rf9judsDI?Niltj)GTF{I0Rw4JvM#tw>xiRKy`Ns=#*4v3gD8>e)7O(?>B?%Yd^M({gr$p>#gVm>Er%e7!)U!f z&y7Y$B{|4~V5M|OTsCXjbNw|BA+VNb>)>U%WkhW zBmLH^v0~*wU8c}(egyOez;CqtBCM21Sh3-yk}Wpt*wHB(#a^*^Rek?9?$F)1OXYxq zO?8$##}em19qs(=bK}`FVAF$so(9)^GpqneipZ9QuN|I#c)}3bDG`!RAh|ZCm7O;s zvt_gD!oapdiSueiD$;-Cw^vMQA4Sva@@K3e2B67pySNL75C2@Ic`E!5T`d8Aw{iHJ zv*0s3u?#z*6N=ev$Qj6~UGY5RwHOLD?ueqypWXCU0;MI)+%@~%%4S{+uUfj- zn06=J@m`d<$Ms@EiCHRepL}k_$&0N*#@gpu1J4ltru11yN$9=|UHHSSwJ&*iQ#x)9 z0Z`r!z}vyah-~j3y`0 ztZi>6Mj953K+6#%e$Pz%DWVs4X`AyxUzM@d;RU^@Z}9sK%^A?(D|N1&7EJ6lgKitE zI6O8%ev;cwmkr!Z&x~KU+{saq6Lz-QD1Z8FEi`oi~jv~g%Ug*QC7KoFSo2{O z==Opmiu5^K;Aq@&hRtX+M_;fskD@pIiOAR!O3J2Rd`1D&u4&(qCW#G=B6&AK{4eKj*HtIwJRrd&xc)>JfYEj6QY zgd_+%IISkv)uN9q-o?J7OE0V!p5IDky^RaNFoWUM&gHgmIecqRaHhg!ow(;iEu1mRX2{V>-9P7EaDlT@)eDP{}P!@ z&FTH&q+YN<71e7-^ZM6YLs*cPXt^&2^FFs6VH<8$;QJ#V{7z+!S2*_cwzBFH%%hS_ zil!ekV2$qr^WDE@!!@Q7y?Aem+xk1^*F$QTM%ZEd>LTpy!&!=fHN#{~rwOPDECxPZ zL2hhVXFhqKp6=Rb8T7<#v8TUZao^0$Y~N*rR+<5^<}3s?!@GaFoBC0G3~Z+qK8F<< z`Y=6BQd)+YiT9tcSg7rJD@dTMp?2@~_M`SxE}=HdR@VCshPv;;X?;Nc-YJ~>t`V5LzpkXglRwo4YCasH4iG0z94FZ9O8aGMvQ@O z&GSzB^AVHRDaJ*bx)o;O)QJY+XDKp$W9^e$L?LZl7~i6ovr7g(^N$zJxw=fdj7>ZB zivppsyaAc@7g#@tmoHy_r}@dO?X7C-`BRq~lGT~z#qK8-fX9;LF@Z+ zH?bu(HTCQVe{-}#4r(?HjGTQ~2QmrpTN1!sgLdBGm$w)IhH*2|YBDHkfzbh=BTtt3 zTLihdb^-Kt339I|0FGw6zm8g?yEXlfuz5&Gh^WWm84&xZ$jICmqh-BMhBJP*ItuX> z(zn4mNGq)#Y1`JToPOV-R{UN3Q@cr(0um-)fFMarO>GRza@&Ks3s7%XPE8UOAQh*e z2xV(wzKqwU28Bu%Cxw044dtbwWRo`0-L4aQI7{<L!4x9^)AvwSM>3ykWB8X=TNd(ZBwsu34iFM?$97CMHoO^so|IKU5ZD z203^uy&Y6h(S}rHh{*oNGV!cVtE8%v`Wbc*Q(FOqt;X;C?JVV=fF13BhR!tA!^3uWj$Y4JU<7`HI3AdML+x1y&feLppG6xE$J&$nKsrR4QiovRGUE8R%*Gjfy#-ynZm+3p(HKQdud=S@*l^rIzN(iM$iKt1+NCdN*pfoD z$y~iUEozS!vHLx0b%HY_+<=aVizq?5b%=xkHML%iVPc~Yt;=R5`i7$UCn@Ewu_@N@ zAfT~XgLLeMGrN*{I#S~8BH>XwIdM1NUip^$fCZ1UO30aA=9AJrcanczv1U;Q6PF__ z!>*3Vp|X`D)?m#dM;9hm2cSBka%DJh~^q~fj8K=mVMeT`L-3$b<6f0E)xVf|Gx2k=zs9Jvv zRV_Jxy?t76K>VX4C|-s|maeEL$!AIPoVcuq(D4i_(fuEP&(v3{=~WmLEoy1Wol@OCeGB9E@SWzXY=N1qP|B=w_PYn zzxoN?jxgE2A;XMFgCqx2s;Eb`7Mo^)#zewQI&F8CR5M1k>OEPyK}CUoU*{$fBb#~F z-MLgDtZt{sRu+Z zSTq7V3?j$Y4*({;2AE6~{eV7Fq}=P&)%`ch`GHRPQu-il1AAu642--go!-%QM?7Pg z3vlS`s)#=~ksD8XwN+%R1!`QeN9WOp&r@qoN!%N8Jz&(<>%FFESPz@tFTpu(K#z>T zl@(Z;8trmd)rww) zHgsS5Wv8k)R|?7{{{=8BB`N9AK#&+ir-H#5*b+FbQYW+Tu(0X@IC9jD1Wa0w2^XX} zL4AnPJd@GA^S`s4s`5btDwMEyB}UMtO%$7CEgWgURHtGWR7x|-*Rv!W%DFlu>Alf{ zhK4mPFD0SwIsEo;WR#+^d}0H(g2U!p6s8m!uc+Ohe2|p)k^G!?>?br>Gj-9>77wVNG*PDN4H^)TLl+fXA+1J+U7{VTt!a z!AbItDS4_B&?dHF!jBu^t5*_jn%cEgzHy9zRNhi0Agb`JSh%%Ixg5%e$@fgnCIaHc zH@7Tv7=3kjZ1qSIOPddh?1~n@3oG5ytkUrUp1lxZ(?~`s#C%?Hai2fGB(%Tj6MrSA zrluw%L$MHr(h@W<0k;Ru8a+Bt+kpWySa4t6;NT$4EdKoZ3e$vGLX3)!4KsbvJu!Jq zQTM32RXLfH!w9u4z(#s;s1&E5rslZ<4Tb2$gFK@I=k4w7u`I*Gpr|hEfWh_k_1Ho# z5fMu56Ld6=s&rWGHxONlhK6<~@43vKv3BSIzpu^OPrtkkztO|SWrJV(@1gz+k?b#5 z(9r&bUBN>``@;SI$`9BEH~G=fEVhapwtgS#qS;5!xLqU0flJV{5{1LH{@)jDe}fne z?Tz_uEx6G1r!Uaa&|b^Dy@rPNi|pEee(;}L@*iXP&oTJ_!ZVzUn-t+-wle4M!{wsM MORGo~OTO^^FGZ}qM*si- literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_text_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_text_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..0a12a450749ce69069a0b81998f49c1f1a94634a GIT binary patch literal 19202 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

i1{|}ns|2oxQ6ZOBb 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%0D-r4%PMNvrQZJO74fc}V+ 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 z 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 Su7b(28S0r{DZXU);C}(Hpxh_` literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_triangle_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_triangle_opa_255.png new file mode 100644 index 0000000000000000000000000000000000000000..194fd278a1d569e70b7715813f9f8c78393be8fb GIT binary patch literal 21903 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..8e9ff999e13190ff8f554da2c7c95b3da35efddc GIT binary patch literal 42107 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_255.png new file mode 100644 index 0000000000000000000000000000000000000000..f37d36b717d5620ae576a01c76f23a9a1156c060 GIT binary patch literal 50632 zcma&OcR1DY|2Hn#9V1D{h(jmIJV`o6Rur<5?Ceceva)5Cy_204vXg8lNj6Ey&I;Mt z+|SeZ^Znkxab5RypFg@>$g9 zR7nnBMo)4-CLr{aMA49a8Y3y|C*e6KsAN#dVKikUnF7~193(XGu>&obno9^54ZO;IXhz6NkH4r@p13zPoa{i(zt=!XxeqL^iDQoWY7#2f%|0aXlM6le|u@?&sa+T``5}A zHa1HO3!EM0_sSURJCmM@P~*<5!P-xO21PuH_qI&;sxMO#^hJz9&0Do}dLK`T?W zs8X1WXuA8-@cO}^rolx<#{DjP?`*Y#=Qn+}3k@y`JIU;7mJF>QFU&r`Gx z7HZm$*SRnMC{u51MJFdG?;URTJmS01=D0LeQu6jK*VU`-pMv_&NYSuFT6lWa6&H7{ z?mQD?ahq7$ZaI_Kabx~M;N>y9>e64YyTeM+MPX*zHG0Yef;i04(UEyY^2~=T>7D}a zDGWhY*483E$6``6L{g@L4y~JF9p#MSxgS0t#lB2U8P$$??`_P+DWm;SckbRzNlB4q z?^8p}x$ASqhsk6mCo=@&%3M}PWJ|c#HRNItM1&?LCfJA$Q-P8pU48wAuVXy^sQvwY z5m8Y}lG`X63=(nU#*MLBXVDx8IedNBV+&4_7&yVA?xXM6s=1ojS)skJ@ZVA zjMlcc%L@y;eUaWo>HfO!?I#+%4*nV;zYh=Zb&IafAmgv`eY;)l-4oz%B9Hu|#o}E2u@GT{9 z5tTvnw3ioY6y9JAcd8LXA|k@Wi3$CfZrZ*1W%#Jp<*~Cf-E<(s_B&*dk+#d`T-UR| z%kF=NEnxo+THkX0^Yem%r{mH7cAUm}s^CagiH5CS4y6H`??uravnwkra7-9H3=Oqi z3=K013-4vBR#sLnIE%!#3knNsYiMZb=)C&dl|!6hrjjl`_U#){o{X|`1a7KSi|73L z^RAz=sR;eFE~B5O*xB0tthP^YH-&|K=~#+EoFi0*?FaiX)peW!iOkQ>-)&d%HZIf3 zs?UM7{AMfEhE;+0Xj$6W*uZ~A2M0_z)%X4-bqvA;X@2l`#kdTKD~0<>ExwCN_UvU} z`2G9U>(_KaD$#O+aAR-XT5%RRLqP#MB0e-cH*j%r@%Z@I0n0=GqFMAgj*t0pPybUR zKW3gVs{LzEkIzD8Fc&ws634*Wngblh-CZ{u8yf|oU}?4>BY{VbfkwzSN9n3_@-f&5 z8^KqPN8fMn?6^8Rzo~o+?<|RujQOS386m?Cf7#&Zx8~Kbn0C`V<<#H5e=F1m%&xoH z{ru23K5kc~(`tN8K4wi>Utb?ZgJfkbDJW=fZmiOF)e?AyzwyxNWno;? zlMRphsB6#T-@K?K`g=7@#A9p0YiI0AVu#Pc=tMbBN~mXZmCX<;mc8zDAd0zd`|n>W zN=o6>?(*{Tr%T^+yaw)B*xD*OrzqOLFiOh$_qz4$uUw8=s&ZTT@~2NSZzaOy&^l># z)F0-CN(>Sea`yK26mt5F%a}!7iV6$Q{4R?j?T)(4Vj5%wMWotwRo@?FD>RyX-6Em< z{ocZ#KP(q7Rt?+I^wBAsR}3$&yP;`AM_0OgdSE@G+f9=(hG+HaJ*sMJnKoKmq~_em z?WzxsyaT1rk`cjvcw1Pg8QBG`=4p9pz|&t}qDfiY2$-`2NU336I2=lO=+6Whkpvhy zIMCc{dAMsp+!q%Y-@bi&W@hH;)2CL5jU3`vx!MVjf+!uC+crJz?A|pSqR6Cq=xqcUW82mB z^q|x?AV_!!%d}v7-MxGF%9Se;2g}!E(Ao)4MN*ML_vzyM-}VcPMVbwlmkT)X4ZVBB zP5)wmB|7!ht8$%U`WM9A`pw#>Sh;D)c8`wb(9@fH%v5(B9UX(hn$*~7LlJOym?IVt zJj|CPW?H5kIO#qPzz_N|Vv$yu^b))uEoJC?T7u#VGXt`mVi&CS;K z_K_vGcRcC?0s>gQcQf@%pzS8v=N}yJG}>d3`tGymcW-_qIfE^97p%OZna%kclW+$!)^vg#LSw>o@YZtgLvT}BN-6~2glpDZz;~48L*Sz zcrD@MZEA`>CMSJSKD_AsQSV(*5fAhjVd0u-p-VI&4?75}ch6l>Hbnj%u_=*lbpQ3` zY;$uMxm2*HJQg3r&4$<4 z*WnZQ_xCR^FBcRPynp{bEiFx5GpElIgV@~j4CRH5r4W*kmJ;9)v9`)CmQwkllt{|i z#RUp>`|Jj{=DRhq^zn&zjg1pi4nJ()?{!nKrF3rA;ilHy#Ds-~G1{5Axp(pga{7|+ zJvccjDZ|R6;r7{;t0OBe)uY9ImKxvjt?ZR{lL;1D{q5Vh&*4mguAbr()ZS~SGc|6B z5N-b*wP!+*xEbWA-CAop9UdNz>PU`J5>Mx^N|pO^v@_9YgbUi$F^`yer&r_jcX@b_ zhA2i3E!NYx)^g_A&Yz=!^kYF05w6(wIcJKp{FWkUGYBfGk(Ix2D8GLFYWChe#}{W@ zJt}c>xY^ftKk6If#f#zX%V=D8s%W+S1Pd9_+&#N68TN=7F%}gcpA#qzxw*MbT?#n6 zB2Kh?L_~!5R^MHL-(^ATHb#-|+N_dZC zw3~`J{R)YiJ9n5@J?^oTlc+D^vW)zcKJGRXu4&-4T{Wa1zz~8Adg_9INjuy#G&Cg8 z_wB`np1Z;bAfe3WggU{jqP%=M{lGnKqSm!UqY%G1mF40ILrVa~S{yycK0Z~**#LmN z|K-bB1A68+J?iyKhGy2aiof5m`TprAx4>N$6%~aF(&sHaoE#?F z-&b5lZQsvU;+M#YR#@w91oNq*x5&RMqdR?fSzBwR?qsh&n>ZL3U9Gz$Q#|f-a)b+} zW|i<}RttybJ)39{p?tD;bi8nwtzTkqX&K_Wm>`X&t#O)FIP{9mU95k$V>i)ov^Isa z`uUUHp+=7-GT3am!lFmx;X{V-JK=X8sH+PK2yBc_94DYch;YJg=Ur;Y%qx_Xl;Y#! zJQwd7D6G0Aqcdb^9+AaMlG=nyp^!1!3E?vA8BJ7!e+u3O=Ppi7O$`qZ6LmlzH1B!^ z_0=Esr*;(%V*@~MqR~W!PN@jCJtB4~n$k=DEK)k~Dfkj?%*}($hT{msCV#Gpv62zl zjeU$yOeD>D>LB~3qizq$z`(%D8cbUJOGUZaymsu50~UIt7)ww2@JmUQhH&T~Up#nw zy(+Q4kUfdMDB`@(n|ZsBb#Q2?t@E0g+uEcj)q}&K>wX=xuO56(oxv^$mWw?d-aIva zKFA0yAJ#ezU<4Zf$jHdgpLzxA`_nJ@)5P5SS9h-HlmA?3`~11nykckxiaQ|h&GMv^ zlS_#mYoUJCAA^?XST&bDp}2nix?QzyfjVrHFAW8Q zzbkdmgtSfrD5avNR#8?CYc&qbqPM6Rvx6Q&5y%esGBVQQ8@|x&*Tm|K@kX2{pGTA9 zFm~0Vw4qJ6VMo%*2I8imoLN@E#f`u_3EjBiUO!Hp{+2Bahf#d??3sZ<`mpW0cklSP zxpfncnlOmMqM|J~F*;fK95ui_>RgV@t~GjaPow3~NQAkCMXeqmbK8-(1W|ax@c@q_ zr9X$YvBu9ck-6pNPHhnvncG?m$5XoCHl-b2YnQo}EQe;7-&o8`=i}wAcV3KXn`w5` zV~>7g9WRF_)P8P=K~es7#C+ z=Na2vtC2E?`KsFWiySfiLJWS9vmEy zl8`_ZOn5v!HAcidk6b^?`MJ?!`*+Qgd5yJDLJ`k(RHrVqUfy!~GRWRnAenN=FeYv(b6Ir?a~o zaP7|DzXFI$(1my2W}gmbiOj356@|`CMm!IE$QK*7PR7i-VywJMpRjw8M<`0v| zF{n&F$D8S}xru(o7%)Z5SXb%f4TQE%1G0dNg|f;%w3J=m?`MBK+!%PQqkiuRKd8VZNO7=b8~=@5>RASI+R&C(PzG~jn-3@1KQ;Zcs0xOqN<}~EtF#Q zDuR#17@7O=BV(Im^{5x%WVCMD6xOa{7#XyFaD)oyP3(wQFyq*nv?mM30o9`lzRg3A zWAXbeB6}aR9*zo;L#wH)tE;M_qUE5yOXfKa^C&7RxWC>FoGDzs?(7059hTR~k&3>f zeDwWeZeCucsv0AmHNfhP6Eo{kXshZ`T^$|3ZujoNF24G$hCBZ21%0lsBNQrKR=gQ9U*V(5PizvtUy~LIRZafaVNUPE!E}G9R=L z#_CmfN5^QR&xuLoEe_x{JGB$3;$Au&vD(Go0fe<`he)FSSkl|Y5B&J?qraapT-kMH zWU#lFpq_Bx_u1 z#7Fmyr-El`=OD8PJILah>^p-EGNKJ}H9_9N3m*<|q3KWr0+K)cz>U=s>j|huTzNP$ z##1tM=E%Z$Jor*0JF(W31D1xYiJF)5f})DbZ9$u^S3vTE%(P?B_}&u}6C-iF9+|0X z>B#k0+DHSmr{!f^4D$8s*LuMFfjqpmc~Ya7sVWx|wJt{8#SXHRynN_CrJ()9lcxh( z@Z*VwM;x(xN8Z7>X2;ix9Jj~M6FT;k`<`A0q)1IgB?PEHF%kcTkPsCWmA~ih5s9xf zt*xy@QZkzQCe?SP+`ORi?bc{!c=QepC9+YfxrOw=R{8o>t#D8vxf2ljm|cPyaKxVS zqG4O04r&Uz7Rb+b)i-b64Dg;CYWQ2Fs3p#d(P-WknJ*<;C-|~$SZHFcfB*h{4UL4+ zl{9|UQ{BcI8uZALKFc)sIXv_QW%1H5iqm^tY}Kg-VAZg#IWhX@u{gw16#m;H8m6U_Cx zTo<>?+|sCnao&xr0+x*7Bwzg=a>cjJ7$NTzs0$!A+a!*!4Jt5_`ARMGa&zA+8OrNh zCYFCF=XFD|n1Uq0|3q*?z(H`fv9L@Wy~41i{d}IPf0|W zVIFbx_yZLOuAGO7A`qC&#^$CH$2lpQ$=a>0Enk6^>D*`vqbmt!kA;|?<3OhCvn(no z&|dS;u^O3mx`sGc@$`!{)RY2s#!wkNN-{+-y^<7Vj#yvE7nO})?a&_>5J6@QB)~x5 z8vBg~1G)xI_2^M*pQT_**9AU3-`tzYyPUT<=_rD6*YZx_KD1&wL4cSJ%(Z+q4j3_4 zDJ6ncf@&(vdHD2G^dv$mRaExAPO(PbfK`=FwA?35Col!jDCzG@5&O{tT-xa1&+C{( z%a>mbqw&*PUjtN?LC!!%M7w)gtfz3$IxI_)VG5K7p%kSkzH`1m&SNQ|zLEr-+GqqO z41I^g_aoh$uF6)~BOz?W=E0GlB!P$5XZwo^>kiE6X=yA>OrvEc!Fqf{)>W|Gp_$zq z7L;pjF$yLTr3%h2FIPj;p1*M63YA&w^AaMrv^=Yim6dewngP(H?xLTc-|yensmk-4d;JTBAWkF0P*>Z_ZL!Snhi%dFzqdUsoncFY<_xgv8seUO zC~1r4()Z$fiB+yQp#;xw%Cbij-Ayt=#-OF9uF{YpsHp+W?*0|%qx#<48>Ph~#28K| zYbD57JH~QJ_vz5&&Ot!4q313aWB#iajAF6IZKqfxWV6Mit$5zWa`Bt?!;8CnF%$wA|ZsQW6#JInN*n*sua#auTZk5qm* zl19Q&Obpjzrd_6m*k68;wjenm zs5Ah0K=-|^pY}y~8JGRA6;e@Bg2uAH-o~oQN%w@sGjCvV+hc|@C`!xQTfEINk>5aB zp8k9-?;gn$>dUm`AK?_pWEs`g)VQ0Q&lOjX`+v^4lU-IMZdLDq2s> zE5s>uX~KMVEp3QqYlwCLBb(f+v$Jz&XD7hm=;&x5-T>{tfBOdJL0@0r-@ku}WScRs zRp}n;>eecX27CxUb(JEr?ezQ;e-!=m5(G(r4Ew3n2yhIpY*u1eY3$-UW)V231aQHj zt;SV4M{780QbNCo2&%$C05~5(Zb;&n4vkmE(0DPF^Au_nR#a3l1c6%fX*y0P(8d8o z>ldRp;KSaGULY@TXwc78t=pSR0giwA^lA7PzsICA^Gixp4(=w8;t*YhIx@e5jgavQ z#51Z}LsNTcMo18jL_`$u1`Aa%baW<*p0vyIP8|un2K)Vq(8OpHH&p4i!B%;4_8^8H zC6)Xu<|=Qxu*Oec*-`~t4tcd=4GS|fsoPgj-q*;q&(qUe3o?dqfn-tj{(bH%-*dhL zBoRzr^$eOI@HD*|@-;yYTo31p0{nk~+ zWmsk^gF3gf=8wp4RQO3w{wOnXcXx*^?S8yB@3a2GpmX?$B#60QzY$y5Pskd$VE;_a zK<|Qg3Y0Ez`K46!izPeq#)M|+sDz$^5bkVBg*6S; zv1daBC!n~@$LSh{m&pLiU=XLBimq)(sCFc!q@0PNge3(@nmp_Wy$rV7rS=Hcmr2Mr zs$&+jX$V`%)00_82{_0np9?MO?9m}8vUHFu_L@#`7#;};1HQxo!J~tT6Yst$Zss;h z5*&s8e^*gx;&`EEc8~LRDNms)r>D3<=Ys;wq?DsgXZ3SG3EI$4pLC$Ad(@LsF>AfP z)tgQE`Dua~LlE>M1Wr*&iM(e58Ptqva(q3y^4SqYrgpqZB$`)2R<#0p&Cmr4H64Nz z^4z7KYQ?P|)O(EBx@#|53$rZbdrMu~9y`T}o72AGz5&p4G#Nd~d`$e?Y;R z)wM{0Cg|?mts*C-A34|RW78*h#i&YZY?*pJZ28 zUoft`w|8U8bkg11&~Va1;$RqB7pP0nM@C0Sk?U-wW3FNqr!R1qh76mNS;ux+1Cj6xWgGrip`A;LyCHZoRRmB zbx|}9SY~VlVE@JmesEUV?_-d0?WPV|lG5aH3H{@wB#K|VyJ4Sg#-E=dS{`igH8QJLL2hhVT^eV< znnzsm6ogF1Wgp(Zcd@p9o1agHUlsPmj!%vZVgH>4V9U51+m3o86Y~qW0C-HUt~X^E z`_s7T&?DzMKDHG28~p$dn%=)Z;C&p0)&}v-V(ChdQB(7Vo7lQYK0uqCoXf}AaRd)l zu$I^eZaNCM#&>Ah`^|=`T=7BDY z#Z(|Hi^XFhb9WZBkBQYQWbDjT-0=z@{?Jhbs&fUpB7>|RKPC=;r~ag%aGnuha$y)a z_&T#q|IWue+Z!Az3Vi=OwF0orrd(>vYQCKXujYD>SOuZW32(0egSB4PrNBOZls0{+ z3@RWY_TLMuOVk_*l&B+-f1=L)K~&O5i%ct^gI(GI#DAX!)?1HFTg92?hsDKl{*=+ zI#%o29T?DzdhLddcve3yiOT4+l#6+89$hM$sR|cAY%7#GYO-PXovY?wF((w(D)a|o zuzG;QcVV!=g%EQ_-5tr&3z!B z)m|Uj66=AZ+LdxMUCiC-Dk;s^xyhx;emK)|Y0_DgbYnnw6gdJ$TwdjZt~c9}=*X;6 z@`PuZSUt(i!s51*5F?gR)sHIi{EtpY=E~*gaw%FoLG-bJm!Pu(Pii2HRi^z>`u3d^ z$bfGpslIb%fqn%q*gG_2k{8tg8A;KA`|01={d%f!)pK5y+xRg;HFVVhTl%3rpig!Q zv?-4_Yhn`v12Ya-2xhp5(w#l`2gHip+|QPR3TU{Kv^9EExT&x|3lsq}9|o<%ebVRm zKr2Py_#S4ooF{Exyr6y(NpYNlZMc^!G!_!F}-JKVBj1X5h^kD z2fyB}|2onrQk%gtn<2i&iHUFD)WP)D(pqq;f!%rPC^P#)z?EeXy(;Odcv2m(%iA8A z1Jj;Yr4!6k)aj=+O-;dcSw038B8<~S z;F@ehkttJRMDB5bG{Hy8Q4_v(tKMZr2k&Jph2P0m9h^U6 zr&0}m)xL7?qkTWWQ&A6Ej^E$i1_4gvTT|nyX(E4B>q9~eiab=gH&vlmfLM&Yx0&{P zl<>hS-6XbWSb;j?@bxAEYVbz-t0jLqbPRy1!F!wAN~9&={fEjBj?%vU0vfur$RjX| zr8B?u^sq8BgZBGlr9JY+z$aS&R3a(J$Xsf0N=M5lnPBIC>1Fqku}lS?xd8oiXo->} z;L)Q;+1c5E@<{?R0YKN)dAhk_{V4x)2g06JYwaq-4}MP^uS`_x6zlN?e?^laqtMC1 zM`T3O1fFpY*v_5_2b$Uy^K~))PIN2A7DxtQg$(0Tpym)s0h(+FK(?x?3PLePNY39n zuZ>hk)0#TY{$9`aW4^37Qt!T*E5q)WqydQ}k9sKhus!PQFE(iD>51jta3vCuyw?}un zfeWq5$dF`@HZ?OVu9OXVM!1$B`9gw2A9IoD%ZH;8r_amrQZtBjlh1wiQ%Ke*tQuYM z_rK$*Mb@I3(R^w^A}=p5GnJ~NTs%E8cM&v(l&;)9O9cgmuN@tbJ85bn_@X*&`yTxy z&|mPh6iuY~{(@%*4bdqj+Q5s?2|XctfdTsU5)<%{Ah*O?@KsBTG;>?eYvJn#8g%m4 zQ8XdMQdIQpw|t|{|MJlInk%_+!=wB^j2k$elE?Xg%#l;Y6NwKB9O4< zk$y=vpii#eve9d$h8Q`#GzmCx(OE-NGZtL~(HStkVy~!x5|baI(r+Gv9xB$oX;5fO zqZ1J0+3aenO)o-cq}p5u*-XHruaJw$U|Q&p22CXH3^v+#B`$z~2(XO5ve%FmrU2dsBj*zhA~#Ek0R zuWb)r`g>2FZ0_!2cO~&*pUO9ipVdQ@p@{6YXcCyN|8f%kfiQlgsx2WXC^+vdmtY2V z4(QF-5C=!AK47uT+Z^p}4X9i(;U)C@kSKMQN5%uv8wKhlgnmRTPJ5$<)i@UEP(?uu zsS-+u-ln0XX$`_R0+p_Xr2Z(*uq-Q)2KyKq-LRde=Q!jg&7iS&A|8M|FZ>kT?agow z8>2GzbInob$}G6vQLdb~2|VW-;X>A^1M`(m=GSRyu%aTVREHJBM>CdIL6BG?ri^$m zOh++0KVQKEc6`aBT8?Nr<9;6p&n=HzoC+Vt?7lquTojeXDcDHlCy74oR7$hR1_CDf zYGQ|x+7Hjz(d^(#)0oh{qsa_ob7iwjWm<~&)dh@_M4<&0sTE{s>u(*jG;Y>hb*Q`= z7AEX#T;|pwGx}N%P3xeYF?Uf~1E8duy`WO$%a@(=Mz@78d@=K@Md-iM;{)@7q=dUH zh4>UYP`V5Xiu&WA$KeqX(%)5R%md6IPS?}J&&_RuoC9L1UvhIiuod$%D<86hmm96{ z!ht_Ctgf%Z#jq@6ir|^`Jx^p%s7w~1rYkiY|1i9P$6`*7j{E%SS=A?>e`mBC`fCB0 zIoXXo`QXgtz?|4_N+&BNpP*3)X5AzP)O@JrY_V8Y25J$Y=3{KG3|FQRFC@hF@p+! zNtA#eV4B=+5MHyS{3J6>?~+D)T%HKpIB`Ks~gT9wZRlNEj2a#*L@l?nV1YRdLRSfXo9r<<(G#T zOXiaa&j%OTc=HDq1sRp>?D#s$!Eb?n5asZi|4;l&!P^_ZfSk?GQzH;BBO*5N?hiC= zDJefW^ghHbZ?W{e9?_(e_1a9C(3}2uA*aI(*=Ry?2#d|ZDh3X=!kt+p?s3g67A;?_ zkpf=!;6C0zA|mXK7nU+UJHi86kd@%8${%|7@0WqP0$8d{OHW_l4hpvUW^b>mXTZe; z#fPA6C#*m_eMUsr404^7B$^hQO1Gt;i>qsZZ!PBNfgB^n6nB!?m(4>+F#PzTg+VGt zX}wG^ms>@M=WFrv@o8|n*d^~rQn_H`#kgjtid}|YePfH zBW4U6*y{MPA!vE=yEu>nXq(Jh{^)ja{I7tH1 zz_R7#ocfI^EVvwe8!F_QrH4T z1fWy{UU>wmWFR5#csFEyED?$~beZb@1a`=e8%ti529jY6Y3QYRP5pxW{3tmzO7Sa3 zk&`ZqQ=vdz{CIbU`!P^&NgmpN8k#%#R;Ea+F{tLbiOZ z;X6e5TzfwP|HJ>wFFVI1UeHuhsHBPvLYo9VX7p<=QJW)xz@A$>aQwzC(!CNmm`vOu zD}1oO4{+sr<*_0`o4bq4``X$A_-N1&5jex@(H=9Zh#AhXukGyxg@uL1#r05mHYVzy zJZ_ljo`(=BXt0Q4iE}?g|K;FX$5sv3#ZETUPYz>M#HZZ7L$mK=ndh((==SRt-G^Iw z5=x1I*S>xKuHWF9j3SFcgQME3(NERp2pOXJp7d2nPAx5Eb5iW51FemiK?X%DaaA9zm3L3#UB` z7YL~`z@0H@`>~I3lQl-zp-;_6f58X7-BzlG8g}YeA+~eI-g|~=f|H-$XD0ln_kRNP zZU+B5KyQOj)&0K%^eu0V8$c{TkN^wEfrr&!ZbE3${TfP=iUV`o`sLZ%Rf&4xcdIGS(>#py4*JhQjAhe8J-t;&k& zor9?=NO^9)5KpJpcdLh3f=lf={>61Sw=@fF4bT%4G1snvO^iX@Yi|~LGS|s^ycYca zy^w=zf?E)p1o8c!do?KqK>^X!?(g5f$1(Fjj2@DGId?VO(jd2sjewR9u}g%o7T6tA z4qMyX(C(qnCV&)R0UBi3ix=0+YMepn5kFY2fZGR6YEulDywg9Br8&X}%XtNs6BH?| z!(f;Su#uL9#XP(RgfUsXw(d_Y+1GE=*Ztk|gkaiUGb95RJ>V4i!?qEQX$aKBy<#pt9 zG~@#_D^yFykcCT5OXHBIJ)U(Rw-o{!1=%d{;TKe=twFtZH8%FowK7@`{(pq(V^lff z)6-9SZ&N?i(0HYo3sM8@zOu41{2sK0oIG<|&d0nL5Q~VIQRH|4R8c+#!vEQQwxjQh z|D~`ldc$hQN9g28+dlwlh2|EGl~Dnsmv~ zGoZe8b#3sItyG?6Lx%9ri3Z+#*^%M`$%@x5Yh05whUi+;RyFaX z%Z(E!P~Pq|KACJf6|YcLI@l5M|H;%Va@;%MfIb!+6!g>XrqrinPKR0x+JT!eulGBw$-z^0>Vhi59F&*sQqlFY+nHxAoPEH#Y zJ>r+-W6ZSk2FL?duNG4fy4`#JFH671_Wi%J^eexALzW%_jShb)uE{aC2}hj4Yk>Jc zyYutE%x}7jrNME{8}gOKh>3{_2+%&E^au3<$h;i7e{AfLx;k)85Jd5b++H0(9be_G z>Dkl^bb09U=Fn;QDJdx_m~yx4^$qUdzczv00e(4Qh^gE7%DraqObNn2ShkSE0I!F$ zU*U{Za@D6zF^E#JtI@@itF+9lZ|&?{2~m`!`?R#JU*}c^D`9S)TUog^{(9p14DddP z&x6p8riIT0FxR0@O^3RpoIzo`n_NDI=8T^Yxxd!W?};o=agLtG#(;1L2aHrG9B@RT*g?iCB}G?PH^t>%j0LQwsi|qVjcVyIe44GT1?P{j zzp6*;{}Y~Xp`wq|KbrSBo)3m`0SEz|xv{LJM+W^ss!Nop2Z}a*QEr$rRzqD~izfkc z_HTxoA?f3g80mfPPdr*amrf!ik~ilC=q#zqt}w0@9Swd5VGGd{!khcx9W5?eK?LOb z^(RoYEWW&r)9Q9+LK6Y*fvhC>yLq{};Qd14UTs_RpA!Ue?Xq=M3Gg%eReY0v4zM#9 zRWh6UqhN>&GP1v%_TsrU6U5J;gP`d_0<=nJp8N9!fgrJ-TD^A=v;mIM->>$i;o-xF z_}n~zBnB3ipsS2e_-MRhu&K(`qqlC{xNIt{`RTu+^M*}p9`*K(M}PfJlL|c^+4>Fx zU0eP4An{C38`#H|57lhV{{6~b0tpOOaZfjM^E-TrS3dOJHUh0>sHw?!bmjZfb|D+C zT&&5cY;+~v=Xh^n0rC-OGGk}wZ&MCrv8Q8x0R$d~uz9QTsroXcCIJVpe|Zz^X~>Wk zYjDfQbf}spSjojOU%Ys^?zJ06lpS78^+kpK5`Mul0R7Oa1K}Hyh zgFX&Q+9@`{%eyL*-WNq(5YsC5b?cuCp{c|8#R`O7?L^>A!0TFkCb$P{gwI)&Ut{|K zxOE@lFmMMT)|xcNQAeKKFrW79&&0{m1We9UD1KAF967Oi0tc*T^YHlSAk*all1<<# zfQcuNY}>#_VaygS_p3kW9@KxKl;RH`+=%CI@~WJoClICLs45XTF-o>R$^s;mk3 zUr!I={wwJ=8o)0Z4ZGX7@ z*}MXV4>-sSTA5DEDmO!N7y(!bwiL+F>u&w;!fvv{WZp#<7G?e7+ocR)?H_AvVde~S z;!Y#~l@n(!g1o$|i;FkF`xa4BY8DtHbldE@34vOJ&pft*jEw+4{VeI-9^o^6Q#kw# z9!!mrgHO#dfbTr1$B<4cssHj*oHrlU*&%pUKDe~jE|kQE~UCC zLKMyG2l^Q@Ggo*BGck1iIgoKjG4CzPKxzFF*F}oed!JT!0MAZWGcYm&slYqX5JS6@ z%|@10P;ix*3c~gIQ7Vdxkf#JZ4E6EgPp!TC@&#W`xV6u(T4DO1FbB_I-A-fZn(ZK@ zU-|7iIg@{U-ba#PoYa8xmS8n9BbXY8p_!8}{Z-Bu+YYe@Me55xy!=sW3V(BMIuMJ& zg8H|A!Iq#?djY!^_Sh zAo1+(?&7C@ALIM*(a)oLvU4v(GQL)H{*^gL6`ZP^r}~!N^r$;sq6Es1&*8d7nmbr- z#EhGl_0P*VY9&0jw{HY>A2$V9wLdr%WVSb!YPWrOU1 z5Oa`Zpk{Q-Gr^sKz*e`69+y0X(k%r&>cwe8mnRw8(o!&$|#fH?cI}-*7RIO%sDz zc!=4ClfXQhC^7hINU(fo(>pYhE?){av<(~xVt{n zc9E*BFZ(VlXe*sbtS@wm`S|#tlTncbz<4ihsBaj@Ck%{_bJE2qL!n*!}M;0Jj##`wFBc0R90v?4K`uoDJpYP(`NxkV zrUHS|5HmLuWQ4W~JB<3=79@b)$||o7&2IuioS&N`36LT)0}X>`%)Cs?6F#aOx*TE+ zU%x^Y1y~F;Ecc3GPpC4%xagQFo{nkkJB>oP=~_GuPnV#{!7EX}#NcBA46R3;#;5Rm zHetcnP1w+khKIWy2FHXw-`k5GLpd6)wukX&_o=`OP)SRCj%=g`oEXSR0(u=Gz335n zqWj!c$bKCBA#QH&%sv73%l^%%PWPAHb^$33AmxD?4RRfC<3mic9iSq+>d5eL7}!PC{fxhQ@E9jGPBf$fLk92hpzCBO@of^6)45=rWX0U-dV0pkwzjrbR(_|RfglZsa!oPe zFT^|r&%Wp>m!g8%Q?Oe1s*;FdThFQS0&xTVv7@5{%0}hr3K#)1SfunDwM7_t)k?VK zvBl}!u4Env@)K@~^<=jVKZ6)34U5?Uf@P8j12U3B0}k%>D}3~(Ra5MW<}d)oJD3t&o$ZJ z{gB(=&`L}mC=Cf=a}3#6Vqp2p!xi9ML#VFc-8+yboN5l+ucQkmE5aENeto5YCEfCB zFxVCVNClEJ+PZ@%nbdB8S&dT(9ZL&>-?S1++4eXBrcKR^?FGO)FcAA|L@S~A?c0$C zuUbV8==fB@0cP6pN9(wWrqj%fGW(jFn}MA|!GtdWcf!9gOCoWO)hq;1*6n`YxlmSX z4bHIrubK_U6~o3(^z6}=*4EaBhNyEQt1wss6O0ZH4zRK+5Q2f?4G(r$Ugqg69{u2W zsm&26AyJwNka_w5=03QG#Rra_1mq~Oadwvqb zph_C(6bu3g=WSRs7?X-iNcgN$dg0GEiNh&shM-UeJtLj(kv@kr_^FD;L3a?xSR&h| z9B7F8`unp676C>J0YXpfxDB3_)kvA70~rz9Sp~@CXkC@k5=L=dE53SC5$9 zm3%g~wEfvFKWf`tTZoxzXKM?lfdN{>JRQv71LT3Z=nzZ3?u&E{#NjUu=WJn$d0?@# ztLss3G3;!Y+KcGktcl>^lBg~?7m#+B-*3x^29fY{TN|)jkRD-B=~ZH4b?1M@TX-f7 zA&Uf5PLekeCNvzT{CjP=S742R3&4yX+x^SFGrIxQ;^6ndYy;6YeP8+=_GtKW%iws{ z04Pr4xIQ~JqIS$Ks)ve*5L(@e%lzytNU8^(;z35h(ZJ@xKz<{{nOZ&ki)lHKOCROL zW_flpZw~!CWMxIRPBdU}FtM__ilj~^b}kx1Qi&`)M20=24Kk=npDr|teNupO2iqAa zf-vNQrruSCc%RxNcWsr4Od$P|4um_%sI$ zi+Z^T2u+mpDzdWt@%iz6bg7Lryx78})<4ztVv2f}bgq5~dA>5ABu| z(HIUx%Xsa1-vhvwOYOi75unkD9mJ>Eiq5IGOhq(0&U~JpHimgnTKT6>wM%`1$a9C`jrXM+f=Tl~H8c)O%M&(-Lmc)C3d-{W-$Z5^GD z|A##PeM^}ne2ss@HN83`ohl$7vmX07GnUcxXTK$)XY*R0z?Y>yLCXC;IAXI-^)Rc? z>T`&HCeGw!#-MfTK#Q;@RX`VhI!JKD^TMUqOyoMVk~J(uvK>4OB*+MfCS~(WYijndgeanml+-D= z*B}|gbBbOp^@NWpxBgGE9~4cPlXQjKh93!6-v|7F=>!Y+(A7(v^$o|oa|GChu&n?W z+ht21hK+v7g@^ul zdXk&Kqhr8{_NZUWp#2y5R|g8hEyZHynEEBqX00GEP3Px3aP4YCWv;EksRB!3F2x?! z0X%cTn>QOF{7(^>1=SIXmmT%>xD5HHRRFWVn*r!5$3o6p#sgjCYq{;+yTPr-nVfK6 zfhWKma{AG-1^BEI$1@Tv?!V4zaroU*D{$`1dU0=FS@Ahr$^|938!(M_CmVhVZ&1yN z32P?={(^l51x~D|x~dAE-}5i;AIF{F0QrNkER=O?IZwWN z&?j^q0p||9D;Vz$3J$(-QAc+epSUXGqIXk0XocYa6kd9p3eGUn($w66=e>wR!y+rz z5Cx@A-w~ByHtXd6c7lLDYu&UhoNF%cE#OuqOOD+)NJ3D4xCwVLkxp z`*}Y5S8~+$nn_uG6)X^{SKbU-y8z!3BA6T31=&0pNO+xNfNd(&tx z_y7O5BqU|nrb?0|m6?RhQKCedGl!6wB$OgDhRQsILgqQ73>ga{nL?%vB_zp^;s3ns z|L?!f&9m0IbIw`&b7QZ)_V=4UuIoL#hUfF~Qm$uH0}1Z|YFxK^8)j-F3fTuzWG zA4QtxDv9Nj#?NI=X(b4EKAONxWqNJJ(`g1Pw>Byo{VV-l?>ci^R`JRfGQWXg;E zzbgN0YHDmt+);#dc2?(&yiCu)M}o8fT3<&;$HdUx&kr;E-aEVByINIMm4=EelCDB` z*XAW9$!&jJEnS@`E&cL%au9+kq$x0l%l2P#HRO_E{9GpQxl_18fNC4VY}DP$$QX+h z;bDapUGCtD2*1-$m}}aYblOhcUAg&l3ruiWu(Hll>vMZq<0}`k?RY*sFWPd}KlK~w z#SI!En$^3I%24`fsxrL6X-Q8hKs7q&O6vcKS@!c}YQWHLuWJ(5E^)iSd(ohlXHlUMA4u^6Xef-}45%S{*51?Ec{s8On$V7Kr17-IDqBR` za3rwBY*{`P+Y;g7=_N)hu>`jlu@sTHw!D9j9u6u5Xg-RN* zEa~cCZfyG4AtQ86kaqk1qIKem-nTWY(oNOz$jqz)*W-6CvtMqnt=uRd;B{5AKl#Z* zSfZ7Qk+FWtsM;om&F}MP-NsW@e_0w(21FD3&w=&f15zkoC|o%lu7s8Y7d`ghWiEOM zRgg3%IIW^9i(g7wx-va|hf=8t<6YY}*rftRICzS$swZnsQtuA$ogk%YKZ^GT zxhTf?lEe^%aicayPH$#_*C+$tBV zd{Xt2#jCF&seLu(CwqU0UATF%uTau*QCLjUvLM#+~`%dH~cQ1)luC&MV==N&~ds;16C0pljNke_dMgfG# zqv!JM!~MmmNLLOXID7QyZh!epNN?2CwnmaOhTlc+0RHx5E?ljIaJ>@>h3cR(7O8;b zm)4*wXhV33A~95#Hx|BYgelU0q1zJ2QyR*6-3g+dI+N&3rX(4*7wPF+FG`Mhqp)vY z$fK_Vj}nScXykgaq4R^D3o4PIA*gb}6TxWW6gsmqyb8SU)=Nx zw4_@F6;-pIwOhc2Epz=2h+_z1(0Gzy&PXiCx4-&m zf)%&uxw^Gkqr+mzL-1ktl~pAlH?0=hX3C5{2K>$&K$>)Yb2ceV4@Mu0W>!b%lhqAf z-M#nYt0GAhxOly`!%Ko4g?h{;^8#>&+iMhFZ0G1WQc3RN03y+`VQDyf<_xMagC9Q% zN=Ur!c`&&4KsOsi5GUs`#;2`##S*M`ILH(0>4`@I4$Dn+Bv+T`l`V6R()qLOet<-H zt5}2?8Z3~wBB#d9V*H2$W>K7<_ADjZ+-OffYnORg3`2flp^!nk0q^6T`2sK2@ZWJj zweM>h`-K9nukq00j;4Z>w*9J^oluv<#|3HKJsG5wG&OnXAccN=FlB!)m9te6YNNgY}P?g0om#LNOCXwK0xDk2;T|UFVpSv|1e{MWzoj{W> z6$mBf%w2*-T+Vo;`s#BErq6s-!#O7$Lj58vH0WCXn* z8qL{i5a=gH?bj3FO2i@zjm0|$(*ow5l#gh>!GX8nhDK;2Cv_3WI3JU8hCA+h4u-~R zC3dUp*9EA`;fQCWLDz{rj7wVD6OB>S`uAE~Jo_M*gKme1Rozx{3Z-AquF;y@WL2;# z-kYq7xLqqp&q0(Wk!r`Dr+zvV!WR$#5xxXXO;FqhUf=4NnCJ179)14Ssu(rNGpDqn ztEQ|&Ms)U(X>AJZxj-QlW4D88qI08}32I1t@%YdeK6_mh*X7itFLbbmoJ~?iwdYfJ z_bHa$Fjf_<5y2lb^Ieki(&rRnL*Kpjw|pK&y9B4FE!p8~Licr%-?vUo&CGzu9@^-by-#7OSbo!4TqG++WxCl}9_2SQPt4^Z&ii#-OeaRAg zQhhSjGtRQ!GEF(Zt6|fGtH|oZN4=QO?0b*`UDW$>NeEAI#FX?US?@IArwP8Rd&iYV z<^1{QX=$gUWVso=-_|Ly7#0`-CwNgX?s#rDk~tVIi}>I$L-7Q6D>`^J!+yqhHi+WY~;uH z+zUEL5n6#f0$C&b*Q(CWJMe|;A3b#FZZqen(3av|Ow)HK>7Nui(H@;qDCHzkPy;DI z!k7H@3MI5up+5t(fzZ6r0kLdh%eQVOcsy~G^A1r zAYOF-94P3QmiA1{%SxLE)?pb`zdgKuT5OiGVNQo|U6ktO_&IIQzZ78>7#N7q9Ga%d z$rpOOh%PK(O+sgasPR62=lpvTj$gIOUER%7$kpf*+TCcu!MbdVSQiCupa4b|RO>BmRr?jw(XjpB?V0Yc-#`aPi{F z=<{rWG;gkdXz`LiNRf3qz5^=-C+gztprNLw%iKualPC0el>jp|9(7I&bD`p_9wROO zLzrAkY=e7bp0%UH+IlRXjKPx5-_+T;=*=5+WU(b186E}&(K9mQ%3c8Q%gV;)Hk3)@ z0&Kni=cV+f;~31&zC96tGm(F1GE>{-KZH6^>B@uB4U}!6E`Sbeb+k;xyNRxbzfEjg zitm>%UvLdU^azW$US{X3ff>}-=;@`vS&B>$xc@y9#;>!vC3l9I9Od@-#sQce*?CNyw-`zg-xFbs%MC5 z-s+>b@u+U+N&n2w*vyx=aoe{kO1WuM80K@MM!j>vm?pyey>v*!RR9@X+>s>7vja=x zw1aom#W?%ZbDo$K;q}a7YN~Ma!9s$&1_fh$F8f z6ed~v#a0a6m-d^V@@-{@X%{guC7Czctv-!9u6qUODIIK{mC4f@FvH6v;$?>ShYjFef+3t zgtU9vf0HMXva+9>3)hX`cn!fC6BCp7#PFPJshGE(Hbp;EnBsHI%!BPB{KRL=sLb9&zAS;cAVOIHP0E=1eH@_j;OW%U;N6JlZ z{E@COgb3bY@sLggZnk-AC}@HP!UVQu@3Pln8z<$1SYvYbRJ=;)Ym%q?YWQC`k(4wK z+gGu{&H4tyKHNPhNFW43evjx@|H7N=O99@=T>09~qjRGB)g#Pc9I=eCwXzx+IJkO9 z_`)?)Q-EinOB!tmL8rD%*As%b$(&RO)5%$&-5oiNSQvdcf*NLQ-1_OKP0y*SLPpL% zXYI(8hw^vz*%xT{Qw;aj)FYx!P35f#%i)HM4e6?UeNE(pr`mq|d~$updgApAmUi6t z`i<{6aHE^eU~KVkHQ&~T?Ps824`ngcaY4=8$ms6nsiAcey_@@~YV28NfBYcbhu{`Z za{T1o%PVXY$Rd(vNc}xdtf9U8XAI*IXUI+&=2VD5lw)NN+oV}_GB7@ ztNBwdSgczUb?*BuB@$4YXyDpfU;i}sK0sz&-|{s;yY9lQ*OB8A)9hzP&%mz2`IzUg z1K-JG;m0H;<4;MqA7Nz4oqW6_jn;X-Z0zS=H+fzft}RUcTUiWI4t(?oJ(_o>USEf@ z+T~R?sC4<9SYMub2Bxo`qBU#cOMPxe!pS-;qRc_(#fGXml)D!%Qi~?iJ_P+2RS}fd z1)|TR(~8~^4EUm}b{?bqb`G8(x#wy$4Do?giVZ~3i>z!c(D?qo;ah8nZ4MDvX&}p* zY}*_nQ-GUOQ_b;MU?toD8u9Dm--&4D#&bg0IvSap(@^x2#TM&MHyrS^F6?Eqq_8yO z>O(XK!x&uqOTc;G!7+){Z2uwpz`9rw8#k=gt35ZY5i`Qo|pTkdu&KFK^ zP{&XVM05JHq1@;-pw{3Z#8r-V5*J%w -aa9cKg(?{vaeeb4jya$>lGVgmF=e*dU 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..0e8f91d9b66b998dcd221f971a6649cfce245a4f GIT binary patch literal 13466 zcmeHt`#;nD|Np4yk|+sDlunXUl9*GMP~k!jBj-y(64D%+!|HNL2$xGj(k_HdYl&IR zra~@hG}4@A4k2ci<1mNM!}VW$Z{PQRbhGWX$Mf;HKkkQTlAXhERzYt5n2lQl61?Y8rM`^k({I%E(+rbF zeW&{SH9AVR`Q6|nbuNnNux{3 zErn{9%1web%#v5#i-Ru8zg;G3M9^?fruK;!s*bEL(c14Qa+{T~FNF|Kjd^u*ZI^Ju zca0}(R<^=(Jv)0p)A-)uv&P1+7y)55?#1>QVdt`2uj%HUk*CkjzIn7|`i!x099q;w zd1Pdy#@&X<%(g5R@Ogq5T0PFnLwlh4e9G_3TqrrRQ+_yC+h{lm=63?-7cKATp~l_1bxJXPf9gjrmy0StV`!+5 zYH?FHuVLtcMNxcwynL$PjT;`PoX+6daf7+9&9@s;o^9-X>8^47l*e@)c_%0Aa;q0@V_hJXUgK8gxH6og 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 EKVLE`!2kdN literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_1_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..2643f82c60bc28e27b1cfa9e6cf56bb759f35912 GIT binary patch literal 35443 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%0AX%_97;6UWn)K~fK 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_128.png new file mode 100644 index 0000000000000000000000000000000000000000..63cd21d55f0b5abd46570b3679109d2e5df9f548 GIT binary patch literal 11603 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_255.png new file mode 100644 index 0000000000000000000000000000000000000000..e17bd361ba22154ffda00c0098c9297069a2210f GIT binary patch literal 13455 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 diff --git a/tests/src/test_cases/cache/test_cache.c b/tests/src/test_cases/cache/test_cache.c index 7d3a7198d..ce181bf7e 100644 --- a/tests/src/test_cases/cache/test_cache.c +++ b/tests/src/test_cases/cache/test_cache.c @@ -1,6 +1,7 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "lv_test_helpers.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/draw/test_clip_corner.c b/tests/src/test_cases/draw/test_clip_corner.c index 08ba63555..e839be83c 100644 --- a/tests/src/test_cases/draw/test_clip_corner.c +++ b/tests/src/test_cases/draw/test_clip_corner.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/draw/test_draw_blend.c b/tests/src/test_cases/draw/test_draw_blend.c index 753cdef37..598590309 100644 --- a/tests/src/test_cases/draw/test_draw_blend.c +++ b/tests/src/test_cases/draw/test_draw_blend.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "lv_test_helpers.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/draw/test_draw_label.c b/tests/src/test_cases/draw/test_draw_label.c index f06c2c1a1..749e9fcb8 100644 --- a/tests/src/test_cases/draw/test_draw_label.c +++ b/tests/src/test_cases/draw/test_draw_label.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/draw/test_draw_layer.c b/tests/src/test_cases/draw/test_draw_layer.c index 174a733de..c60ffd2d8 100644 --- a/tests/src/test_cases/draw/test_draw_layer.c +++ b/tests/src/test_cases/draw/test_draw_layer.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/draw/test_draw_sw_post_process.c b/tests/src/test_cases/draw/test_draw_sw_post_process.c index 8371b0ab3..51f114281 100644 --- a/tests/src/test_cases/draw/test_draw_sw_post_process.c +++ b/tests/src/test_cases/draw/test_draw_sw_post_process.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/draw/test_draw_vector.c b/tests/src/test_cases/draw/test_draw_vector.c index 8f5e6f900..914e03ba9 100644 --- a/tests/src/test_cases/draw/test_draw_vector.c +++ b/tests/src/test_cases/draw/test_draw_vector.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "lv_test_helpers.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/draw/test_image_formats.c b/tests/src/test_cases/draw/test_image_formats.c index 2a58f0a8c..ffe47457f 100644 --- a/tests/src/test_cases/draw/test_image_formats.c +++ b/tests/src/test_cases/draw/test_image_formats.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include diff --git a/tests/src/test_cases/draw/test_layer_transform.c b/tests/src/test_cases/draw/test_layer_transform.c index a9729e293..a5e11693b 100644 --- a/tests/src/test_cases/draw/test_layer_transform.c +++ b/tests/src/test_cases/draw/test_layer_transform.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/draw/test_render_to_al88.c b/tests/src/test_cases/draw/test_render_to_al88.c index 76fd1ace4..c65194471 100644 --- a/tests/src/test_cases/draw/test_render_to_al88.c +++ b/tests/src/test_cases/draw/test_render_to_al88.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "../demos/lv_demos.h" #include "unity/unity.h" @@ -26,7 +27,7 @@ void test_render_to_al88(void) uint32_t opa; for(opa = 0; opa < 2; opa++) { uint32_t i; - for(i = 0; i < _LV_DEMO_RENDER_SCENE_NUM; i++) { + for(i = 0; i < LV_DEMO_RENDER_SCENE_NUM; i++) { /*Skip test with transformed indexed images if they are not loaded to RAM*/ if(LV_BIN_DECODER_RAM_LOAD == 0 && diff --git a/tests/src/test_cases/draw/test_render_to_argb8888.c b/tests/src/test_cases/draw/test_render_to_argb8888.c index aef82831a..695fed29f 100644 --- a/tests/src/test_cases/draw/test_render_to_argb8888.c +++ b/tests/src/test_cases/draw/test_render_to_argb8888.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "../demos/lv_demos.h" #include "unity/unity.h" @@ -23,7 +24,7 @@ void test_render_to_argb8888(void) uint32_t opa; for(opa = 0; opa < 2; opa++) { uint32_t i; - for(i = 0; i < _LV_DEMO_RENDER_SCENE_NUM; i++) { + for(i = 0; i < LV_DEMO_RENDER_SCENE_NUM; i++) { /*Skip test with transformed indexed images if they are not loaded to RAM*/ if(LV_BIN_DECODER_RAM_LOAD == 0 && diff --git a/tests/src/test_cases/draw/test_render_to_i1.c b/tests/src/test_cases/draw/test_render_to_i1.c index 313f2a6fb..7afc93d29 100644 --- a/tests/src/test_cases/draw/test_render_to_i1.c +++ b/tests/src/test_cases/draw/test_render_to_i1.c @@ -24,7 +24,7 @@ void test_render_to_i1(void) uint32_t opa; for(opa = 0; opa < 2; opa++) { uint32_t i; - for(i = 0; i < _LV_DEMO_RENDER_SCENE_NUM; i++) { + for(i = 0; i < LV_DEMO_RENDER_SCENE_NUM; i++) { lv_demo_render(i, opa_values[opa]); char buf[128]; diff --git a/tests/src/test_cases/draw/test_render_to_l8.c b/tests/src/test_cases/draw/test_render_to_l8.c index 2098dd860..93339b230 100644 --- a/tests/src/test_cases/draw/test_render_to_l8.c +++ b/tests/src/test_cases/draw/test_render_to_l8.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "../demos/lv_demos.h" #include "unity/unity.h" @@ -26,7 +27,7 @@ void test_render_to_l8(void) uint32_t opa; for(opa = 0; opa < 2; opa++) { uint32_t i; - for(i = 0; i < _LV_DEMO_RENDER_SCENE_NUM; i++) { + for(i = 0; i < LV_DEMO_RENDER_SCENE_NUM; i++) { lv_demo_render(i, opa_values[opa]); /*Skip test with transformed indexed images if they are not loaded to RAM*/ diff --git a/tests/src/test_cases/draw/test_render_to_rgb565.c b/tests/src/test_cases/draw/test_render_to_rgb565.c index d9b53706a..52d855944 100644 --- a/tests/src/test_cases/draw/test_render_to_rgb565.c +++ b/tests/src/test_cases/draw/test_render_to_rgb565.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "../demos/lv_demos.h" #include "unity/unity.h" @@ -23,7 +24,7 @@ void test_render_to_rgb565(void) uint32_t opa; for(opa = 0; opa < 2; opa++) { uint32_t i; - for(i = 0; i < _LV_DEMO_RENDER_SCENE_NUM; i++) { + for(i = 0; i < LV_DEMO_RENDER_SCENE_NUM; i++) { /*Skip test with transformed indexed images if they are not loaded to RAM*/ if(LV_BIN_DECODER_RAM_LOAD == 0 && diff --git a/tests/src/test_cases/draw/test_render_to_rgb888.c b/tests/src/test_cases/draw/test_render_to_rgb888.c index ab3978420..12e72a2bd 100644 --- a/tests/src/test_cases/draw/test_render_to_rgb888.c +++ b/tests/src/test_cases/draw/test_render_to_rgb888.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "../demos/lv_demos.h" #include "unity/unity.h" @@ -23,7 +24,7 @@ void test_render_to_rgb888(void) uint32_t opa; for(opa = 0; opa < 2; opa++) { uint32_t i; - for(i = 0; i < _LV_DEMO_RENDER_SCENE_NUM; i++) { + for(i = 0; i < LV_DEMO_RENDER_SCENE_NUM; i++) { /*Skip test with transformed indexed images if they are not loaded to RAM*/ if(LV_BIN_DECODER_RAM_LOAD == 0 && diff --git a/tests/src/test_cases/draw/test_render_to_xrgb8888.c b/tests/src/test_cases/draw/test_render_to_xrgb8888.c index 15b0ec4a1..e21addf2c 100644 --- a/tests/src/test_cases/draw/test_render_to_xrgb8888.c +++ b/tests/src/test_cases/draw/test_render_to_xrgb8888.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "../demos/lv_demos.h" #include "unity/unity.h" @@ -23,7 +24,7 @@ void test_render_to_xrgb8888(void) uint32_t opa; for(opa = 0; opa < 2; opa++) { uint32_t i; - for(i = 0; i < _LV_DEMO_RENDER_SCENE_NUM; i++) { + for(i = 0; i < LV_DEMO_RENDER_SCENE_NUM; i++) { /*Skip test with transformed indexed images if they are not loaded to RAM*/ if(LV_BIN_DECODER_RAM_LOAD == 0 && diff --git a/tests/src/test_cases/libs/test_barcode.c b/tests/src/test_cases/libs/test_barcode.c index 5a0e3e534..fabd6712c 100644 --- a/tests/src/test_cases/libs/test_barcode.c +++ b/tests/src/test_cases/libs/test_barcode.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/libs/test_bin_decoder.c b/tests/src/test_cases/libs/test_bin_decoder.c index 55e2ee684..a1d642519 100644 --- a/tests/src/test_cases/libs/test_bin_decoder.c +++ b/tests/src/test_cases/libs/test_bin_decoder.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/libs/test_bmp.c b/tests/src/test_cases/libs/test_bmp.c index 9e96f5331..6230647d6 100644 --- a/tests/src/test_cases/libs/test_bmp.c +++ b/tests/src/test_cases/libs/test_bmp.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_helpers.h" diff --git a/tests/src/test_cases/libs/test_font_stress.c b/tests/src/test_cases/libs/test_font_stress.c index c36797aa5..a18a9a2b4 100644 --- a/tests/src/test_cases/libs/test_font_stress.c +++ b/tests/src/test_cases/libs/test_font_stress.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/libs/test_freetype.c b/tests/src/test_cases/libs/test_freetype.c index cc58bc119..86768938b 100644 --- a/tests/src/test_cases/libs/test_freetype.c +++ b/tests/src/test_cases/libs/test_freetype.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../libs/freetype/lv_freetype_private.h" #include "unity/unity.h" @@ -483,7 +484,7 @@ void test_freetype_outline_rendering_test(void) uint32_t i = 0; lv_freetype_outline_event_param_t * param; - _LV_LL_READ(outline_data, param) { + LV_LL_READ(outline_data, param) { #if OPTION_GENERATE_OUTLINE_DATA /*FOR Generate outline data*/ #if OPTION_GENERATE_VECTOR_OPS_STRING @@ -517,14 +518,14 @@ static void freetype_outline_event_cb(lv_event_t * e) switch(code) { case LV_EVENT_CREATE: param->outline = lv_malloc_zeroed(sizeof(lv_ll_t)); - _lv_ll_init(param->outline, sizeof(lv_freetype_outline_event_param_t)); + lv_ll_init(param->outline, sizeof(lv_freetype_outline_event_param_t)); break; case LV_EVENT_DELETE: - _lv_ll_clear(param->outline); + lv_ll_clear(param->outline); lv_free(param->outline); break; case LV_EVENT_INSERT: { - void * entry = _lv_ll_ins_tail(param->outline); + void * entry = lv_ll_ins_tail(param->outline); lv_memcpy(entry, param, sizeof(lv_freetype_outline_event_param_t)); break; } diff --git a/tests/src/test_cases/libs/test_libjpeg_turbo.c b/tests/src/test_cases/libs/test_libjpeg_turbo.c index 69cf037b9..b084de569 100644 --- a/tests/src/test_cases/libs/test_libjpeg_turbo.c +++ b/tests/src/test_cases/libs/test_libjpeg_turbo.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_helpers.h" diff --git a/tests/src/test_cases/libs/test_libpng.c b/tests/src/test_cases/libs/test_libpng.c index 67eed0543..714eab355 100644 --- a/tests/src/test_cases/libs/test_libpng.c +++ b/tests/src/test_cases/libs/test_libpng.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_helpers.h" diff --git a/tests/src/test_cases/libs/test_lodepng.c b/tests/src/test_cases/libs/test_lodepng.c index 487e39c90..5f3f1cf78 100644 --- a/tests/src/test_cases/libs/test_lodepng.c +++ b/tests/src/test_cases/libs/test_lodepng.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_helpers.h" diff --git a/tests/src/test_cases/libs/test_memmove.c b/tests/src/test_cases/libs/test_memmove.c index c4d73b61a..cb28a5b73 100644 --- a/tests/src/test_cases/libs/test_memmove.c +++ b/tests/src/test_cases/libs/test_memmove.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_helpers.h" diff --git a/tests/src/test_cases/libs/test_qrcode.c b/tests/src/test_cases/libs/test_qrcode.c index 630daec82..4720b20f4 100644 --- a/tests/src/test_cases/libs/test_qrcode.c +++ b/tests/src/test_cases/libs/test_qrcode.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/libs/test_tiny_ttf.c b/tests/src/test_cases/libs/test_tiny_ttf.c index 8204dbce1..2f82b765d 100644 --- a/tests/src/test_cases/libs/test_tiny_ttf.c +++ b/tests/src/test_cases/libs/test_tiny_ttf.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/libs/test_tjpgd.c b/tests/src/test_cases/libs/test_tjpgd.c index 628fb4ec5..2ee8422d3 100644 --- a/tests/src/test_cases/libs/test_tjpgd.c +++ b/tests/src/test_cases/libs/test_tjpgd.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_helpers.h" diff --git a/tests/src/test_cases/test_align_flex.c b/tests/src/test_cases/test_align_flex.c index 91bcaf72d..feb6cf8a6 100644 --- a/tests/src/test_cases/test_align_flex.c +++ b/tests/src/test_cases/test_align_flex.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/test_anim.c b/tests/src/test_cases/test_anim.c index cb8c59606..3f041aaf4 100644 --- a/tests/src/test_cases/test_anim.c +++ b/tests/src/test_cases/test_anim.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_helpers.h" diff --git a/tests/src/test_cases/test_anim_timeline.c b/tests/src/test_cases/test_anim_timeline.c index 293cd4fe6..3358ca1ac 100644 --- a/tests/src/test_cases/test_anim_timeline.c +++ b/tests/src/test_cases/test_anim_timeline.c @@ -1,6 +1,7 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_helpers.h" diff --git a/tests/src/test_cases/test_area.c b/tests/src/test_cases/test_area.c index 104952480..e683acc66 100644 --- a/tests/src/test_cases/test_area.c +++ b/tests/src/test_cases/test_area.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/test_array.c b/tests/src/test_cases/test_array.c index c2f32692d..604b21f96 100644 --- a/tests/src/test_cases/test_array.c +++ b/tests/src/test_cases/test_array.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/test_bindings.c b/tests/src/test_cases/test_bindings.c index 364e8ad95..47eaa08f5 100644 --- a/tests/src/test_cases/test_bindings.c +++ b/tests/src/test_cases/test_bindings.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_indev.h" diff --git a/tests/src/test_cases/test_config.c b/tests/src/test_cases/test_config.c index 78a5d3970..c852d2ea2 100644 --- a/tests/src/test_cases/test_config.c +++ b/tests/src/test_cases/test_config.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/test_demo_stress.c b/tests/src/test_cases/test_demo_stress.c index 3eb09ee27..56ee06744 100644 --- a/tests/src/test_cases/test_demo_stress.c +++ b/tests/src/test_cases/test_demo_stress.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "../demos/lv_demos.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/test_demo_widgets.c b/tests/src/test_cases/test_demo_widgets.c index d73f4cccc..b9c5e55e3 100644 --- a/tests/src/test_cases/test_demo_widgets.c +++ b/tests/src/test_cases/test_demo_widgets.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "../demos/lv_demos.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/test_draw_buf_stride.c b/tests/src/test_cases/test_draw_buf_stride.c index 65beb398e..a3ec51e37 100644 --- a/tests/src/test_cases/test_draw_buf_stride.c +++ b/tests/src/test_cases/test_draw_buf_stride.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_helpers.h" diff --git a/tests/src/test_cases/test_event.c b/tests/src/test_cases/test_event.c index faea2fbe4..ee5186dda 100644 --- a/tests/src/test_cases/test_event.c +++ b/tests/src/test_cases/test_event.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_indev.h" diff --git a/tests/src/test_cases/test_font_loader.c b/tests/src/test_cases/test_font_loader.c index 26a4d7524..ff639c6a7 100644 --- a/tests/src/test_cases/test_font_loader.c +++ b/tests/src/test_cases/test_font_loader.c @@ -9,6 +9,7 @@ #if LV_BUILD_TEST #include "../../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/test_fs.c b/tests/src/test_cases/test_fs.c index cb8965f60..25ca52825 100644 --- a/tests/src/test_cases/test_fs.c +++ b/tests/src/test_cases/test_fs.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include diff --git a/tests/src/test_cases/test_grid.c b/tests/src/test_cases/test_grid.c index 03251034e..865678145 100644 --- a/tests/src/test_cases/test_grid.c +++ b/tests/src/test_cases/test_grid.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/test_group.c b/tests/src/test_cases/test_group.c index bad4f56df..409cfc51b 100644 --- a/tests/src/test_cases/test_group.c +++ b/tests/src/test_cases/test_group.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/test_hover.c b/tests/src/test_cases/test_hover.c index e5f860e93..66cbcfb0c 100644 --- a/tests/src/test_cases/test_hover.c +++ b/tests/src/test_cases/test_hover.c @@ -7,7 +7,7 @@ typedef struct _test_hover_t { /* data */ - uint32_t id; + char id[32]; uint32_t counts; } test_hover_t; @@ -35,8 +35,8 @@ void tearDown(void) static void hovered_event_cb(lv_event_t * e) { - test_hover_t * hover = (test_hover_t *)e->user_data; - lv_log("Object(ID:%d) hovered %d/%d times.\n", hover->id, hover->counts, TEST_HOVER_COUNTS); + test_hover_t * hover = lv_event_get_user_data(e); + lv_log("Object(ID:%s) hovered %u/%d times.\n", hover->id, hover->counts, TEST_HOVER_COUNTS); } static void test_move_mouse(lv_point_t * point, uint8_t size) @@ -61,7 +61,7 @@ void test_hover_basic(void) lv_obj_set_style_text_color(label, lv_color_hex(0x5be1b6), LV_PART_MAIN | LV_STATE_HOVERED); /*Set hover callback*/ - label_hovered.id = (lv_uintptr_t)label->id; + lv_obj_stringify_id(label, label_hovered.id, sizeof(label_hovered.id)); label_hovered.counts = 0; lv_obj_add_event_cb(label, hovered_event_cb, LV_EVENT_HOVER_OVER, &label_hovered); @@ -71,7 +71,7 @@ void test_hover_basic(void) lv_obj_set_style_bg_opa(btn, 128, LV_PART_MAIN | LV_STATE_HOVERED); /*Set hover callback*/ - btn_hovered.id = (lv_uintptr_t)btn->id; + lv_obj_stringify_id(btn, btn_hovered.id, sizeof(btn_hovered.id)); btn_hovered.counts = 0; lv_obj_add_event_cb(btn, hovered_event_cb, LV_EVENT_HOVER_OVER, &btn_hovered); diff --git a/tests/src/test_cases/test_margin_align.c b/tests/src/test_cases/test_margin_align.c index 2f667140a..12d118e0f 100644 --- a/tests/src/test_cases/test_margin_align.c +++ b/tests/src/test_cases/test_margin_align.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/test_margin_flex.c b/tests/src/test_cases/test_margin_flex.c index bff9d17b1..e52c03db5 100644 --- a/tests/src/test_cases/test_margin_flex.c +++ b/tests/src/test_cases/test_margin_flex.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/test_margin_grid.c b/tests/src/test_cases/test_margin_grid.c index c9c030983..57e8392ca 100644 --- a/tests/src/test_cases/test_margin_grid.c +++ b/tests/src/test_cases/test_margin_grid.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/test_math.c b/tests/src/test_cases/test_math.c index e96e856fa..880a0dc77 100644 --- a/tests/src/test_cases/test_math.c +++ b/tests/src/test_cases/test_math.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/test_mem.c b/tests/src/test_cases/test_mem.c index 1d40f03cb..ddb998286 100644 --- a/tests/src/test_cases/test_mem.c +++ b/tests/src/test_cases/test_mem.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/test_observer.c b/tests/src/test_cases/test_observer.c index 3de18609d..ac7673834 100644 --- a/tests/src/test_cases/test_observer.c +++ b/tests/src/test_cases/test_observer.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST == 1 #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_indev.h" @@ -260,7 +261,7 @@ void test_observer_obj_state(void) lv_obj_bind_state_if_eq(obj, &subject, LV_STATE_CHECKED, 5); /*Should be applied immediately*/ - TEST_ASSERT_EQUAL(false, lv_obj_has_flag(obj, LV_STATE_CHECKED)); + TEST_ASSERT_EQUAL(false, lv_obj_has_state(obj, LV_STATE_CHECKED)); lv_obj_bind_state_if_not_eq(obj, &subject, LV_STATE_DISABLED, 10); /*Should be applied immediately*/ diff --git a/tests/src/test_cases/test_profiler.c b/tests/src/test_cases/test_profiler.c index 9925c93cf..4aef90d92 100644 --- a/tests/src/test_cases/test_profiler.c +++ b/tests/src/test_cases/test_profiler.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include diff --git a/tests/src/test_cases/test_screen_load.c b/tests/src/test_cases/test_screen_load.c index 19a9f71ec..7af5e5374 100644 --- a/tests/src/test_cases/test_screen_load.c +++ b/tests/src/test_cases/test_screen_load.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/test_snapshot.c b/tests/src/test_cases/test_snapshot.c index 203a4c0f0..462d18b07 100644 --- a/tests/src/test_cases/test_snapshot.c +++ b/tests/src/test_cases/test_snapshot.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #if LV_USE_SNAPSHOT diff --git a/tests/src/test_cases/test_style.c b/tests/src/test_cases/test_style.c index 3fd6b6906..4454df892 100644 --- a/tests/src/test_cases/test_style.c +++ b/tests/src/test_cases/test_style.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include @@ -49,13 +50,13 @@ void test_custom_prop_ids(void) for(uint32_t i = 0; i < max_props_to_register; i++) { lv_style_prop_t prop = lv_style_register_prop(fake_flag); /* Should have a higher index than the last built-in prop */ - TEST_ASSERT_GREATER_THAN(_LV_STYLE_LAST_BUILT_IN_PROP, prop); + TEST_ASSERT_GREATER_THAN(LV_STYLE_LAST_BUILT_IN_PROP, prop); if(i == 0) { /* Should be equal to the first expected index of a custom prop */ - TEST_ASSERT_EQUAL(_LV_STYLE_NUM_BUILT_IN_PROPS + initial_custom_props, prop); + TEST_ASSERT_EQUAL(LV_STYLE_NUM_BUILT_IN_PROPS + initial_custom_props, prop); } /*We should find our flags*/ - TEST_ASSERT_EQUAL(fake_flag, _lv_style_prop_lookup_flags(prop)); + TEST_ASSERT_EQUAL(fake_flag, lv_style_prop_lookup_flags(prop)); if(fake_flag == 0xff) fake_flag = 0; else diff --git a/tests/src/test_cases/test_txt.c b/tests/src/test_cases/test_txt.c index ce4ec1d78..2d36a3984 100644 --- a/tests/src/test_cases/test_txt.c +++ b/tests/src/test_cases/test_txt.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "../../../src/misc/lv_text_private.h" diff --git a/tests/src/test_cases/widgets/test_animimg.c b/tests/src/test_cases/widgets/test_animimg.c index e58a6ac77..4bba8ebe5 100644 --- a/tests/src/test_cases/widgets/test_animimg.c +++ b/tests/src/test_cases/widgets/test_animimg.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_indev.h" diff --git a/tests/src/test_cases/widgets/test_arc.c b/tests/src/test_cases/widgets/test_arc.c index 7776f87c6..0d6bd6ad6 100644 --- a/tests/src/test_cases/widgets/test_arc.c +++ b/tests/src/test_cases/widgets/test_arc.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_indev.h" diff --git a/tests/src/test_cases/widgets/test_bar.c b/tests/src/test_cases/widgets/test_bar.c index 8b2da2219..a6fa8f58f 100644 --- a/tests/src/test_cases/widgets/test_bar.c +++ b/tests/src/test_cases/widgets/test_bar.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_btn.c b/tests/src/test_cases/widgets/test_btn.c index 8ca454fa4..c904af143 100644 --- a/tests/src/test_cases/widgets/test_btn.c +++ b/tests/src/test_cases/widgets/test_btn.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_btnmatrix.c b/tests/src/test_cases/widgets/test_btnmatrix.c index d188bf0f5..dedab5fed 100644 --- a/tests/src/test_cases/widgets/test_btnmatrix.c +++ b/tests/src/test_cases/widgets/test_btnmatrix.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "lv_test_indev.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_calendar.c b/tests/src/test_cases/widgets/test_calendar.c index 7def57486..9df3ae2a5 100644 --- a/tests/src/test_cases/widgets/test_calendar.c +++ b/tests/src/test_cases/widgets/test_calendar.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_canvas.c b/tests/src/test_cases/widgets/test_canvas.c index 0b3eb836e..98689dbf8 100644 --- a/tests/src/test_cases/widgets/test_canvas.c +++ b/tests/src/test_cases/widgets/test_canvas.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_chart.c b/tests/src/test_cases/widgets/test_chart.c index 575c92639..264d59ef3 100644 --- a/tests/src/test_cases/widgets/test_chart.c +++ b/tests/src/test_cases/widgets/test_chart.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_checkbox.c b/tests/src/test_cases/widgets/test_checkbox.c index 77cb044b7..cdfeed51f 100644 --- a/tests/src/test_cases/widgets/test_checkbox.c +++ b/tests/src/test_cases/widgets/test_checkbox.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_dropdown.c b/tests/src/test_cases/widgets/test_dropdown.c index 2d2fe0992..7d77d9bcd 100644 --- a/tests/src/test_cases/widgets/test_dropdown.c +++ b/tests/src/test_cases/widgets/test_dropdown.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_indev.h" diff --git a/tests/src/test_cases/widgets/test_image.c b/tests/src/test_cases/widgets/test_image.c index 5ede0725f..6a61479a6 100644 --- a/tests/src/test_cases/widgets/test_image.c +++ b/tests/src/test_cases/widgets/test_image.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_image_property.c b/tests/src/test_cases/widgets/test_image_property.c index a8af1bc50..7c9eb3a87 100644 --- a/tests/src/test_cases/widgets/test_image_property.c +++ b/tests/src/test_cases/widgets/test_image_property.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_imgfont.c b/tests/src/test_cases/widgets/test_imgfont.c index 739ead5fe..de59b95af 100644 --- a/tests/src/test_cases/widgets/test_imgfont.c +++ b/tests/src/test_cases/widgets/test_imgfont.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_keyboard.c b/tests/src/test_cases/widgets/test_keyboard.c index f892c30fa..f47cc7039 100644 --- a/tests/src/test_cases/widgets/test_keyboard.c +++ b/tests/src/test_cases/widgets/test_keyboard.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_label.c b/tests/src/test_cases/widgets/test_label.c index e393b3238..3e5a11092 100644 --- a/tests/src/test_cases/widgets/test_label.c +++ b/tests/src/test_cases/widgets/test_label.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include @@ -55,7 +56,7 @@ void test_label_set_text(void) void test_label_get_letter_pos_align_left(void) { - lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_LEFT, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_LEFT, LV_STYLE_STATE_CMP_SAME); lv_point_t first_letter_point; lv_point_t last_letter_point; const lv_point_t expected_first_letter_point = { @@ -83,7 +84,7 @@ void test_label_get_letter_pos_align_left(void) void test_label_get_letter_pos_align_left_on_empty_text(void) { - lv_obj_set_style_text_align(empty_label, LV_TEXT_ALIGN_LEFT, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(empty_label, LV_TEXT_ALIGN_LEFT, LV_STYLE_STATE_CMP_SAME); lv_point_t first_letter_point; lv_point_t last_letter_point; const lv_point_t expected_first_letter_point = { @@ -111,7 +112,7 @@ void test_label_get_letter_pos_align_left_on_empty_text(void) void test_label_long_text_multiline_get_letter_pos_align_left(void) { - lv_obj_set_style_text_align(long_label_multiline, LV_TEXT_ALIGN_LEFT, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(long_label_multiline, LV_TEXT_ALIGN_LEFT, LV_STYLE_STATE_CMP_SAME); lv_point_t first_letter_point; lv_point_t last_letter_point; lv_point_t last_letter_after_new_line_point; @@ -153,7 +154,7 @@ void test_label_long_text_get_letter_pos_align_left(void) lv_label_set_long_mode(long_label, LV_LABEL_LONG_WRAP); lv_obj_set_width(long_label, 150); lv_obj_set_height(long_label, 500); - lv_obj_set_style_text_align(long_label, LV_TEXT_ALIGN_LEFT, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(long_label, LV_TEXT_ALIGN_LEFT, LV_STYLE_STATE_CMP_SAME); lv_point_t first_letter_point; lv_point_t last_letter_point; @@ -182,7 +183,7 @@ void test_label_long_text_get_letter_pos_align_left(void) void test_label_get_letter_pos_align_right(void) { - lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_RIGHT, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_RIGHT, LV_STYLE_STATE_CMP_SAME); lv_point_t first_letter_point; lv_point_t last_letter_point; const lv_point_t expected_first_letter_point = { @@ -210,7 +211,7 @@ void test_label_get_letter_pos_align_right(void) void test_label_get_letter_pos_align_right_on_empty_text(void) { - lv_obj_set_style_text_align(empty_label, LV_TEXT_ALIGN_RIGHT, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(empty_label, LV_TEXT_ALIGN_RIGHT, LV_STYLE_STATE_CMP_SAME); lv_point_t first_letter_point; lv_point_t last_letter_point; const lv_point_t expected_first_letter_point = { @@ -238,7 +239,7 @@ void test_label_get_letter_pos_align_right_on_empty_text(void) void test_label_long_text_multiline_get_letter_pos_align_right(void) { - lv_obj_set_style_text_align(long_label_multiline, LV_TEXT_ALIGN_RIGHT, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(long_label_multiline, LV_TEXT_ALIGN_RIGHT, LV_STYLE_STATE_CMP_SAME); lv_point_t first_letter_point; lv_point_t last_letter_point; lv_point_t last_letter_after_new_line_point; @@ -280,7 +281,7 @@ void test_label_long_text_get_letter_pos_align_right(void) lv_label_set_long_mode(long_label, LV_LABEL_LONG_WRAP); lv_obj_set_width(long_label, 150); lv_obj_set_height(long_label, 500); - lv_obj_set_style_text_align(long_label, LV_TEXT_ALIGN_RIGHT, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(long_label, LV_TEXT_ALIGN_RIGHT, LV_STYLE_STATE_CMP_SAME); lv_point_t first_letter_point; lv_point_t last_letter_point; @@ -309,7 +310,7 @@ void test_label_long_text_get_letter_pos_align_right(void) void test_label_get_letter_pos_align_center(void) { - lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, LV_STYLE_STATE_CMP_SAME); lv_point_t first_letter_point; lv_point_t last_letter_point; const lv_point_t expected_first_letter_point = { @@ -337,7 +338,7 @@ void test_label_get_letter_pos_align_center(void) void test_label_get_letter_pos_align_center_on_empty_text(void) { - lv_obj_set_style_text_align(empty_label, LV_TEXT_ALIGN_CENTER, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(empty_label, LV_TEXT_ALIGN_CENTER, LV_STYLE_STATE_CMP_SAME); lv_point_t first_letter_point; lv_point_t last_letter_point; const lv_point_t expected_first_letter_point = { @@ -365,7 +366,7 @@ void test_label_get_letter_pos_align_center_on_empty_text(void) void test_label_long_text_multiline_get_letter_pos_align_center(void) { - lv_obj_set_style_text_align(long_label_multiline, LV_TEXT_ALIGN_CENTER, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(long_label_multiline, LV_TEXT_ALIGN_CENTER, LV_STYLE_STATE_CMP_SAME); lv_point_t first_letter_point; lv_point_t last_letter_point; lv_point_t last_letter_after_new_line_point; @@ -407,7 +408,7 @@ void test_label_long_text_get_letter_pos_align_center(void) lv_label_set_long_mode(long_label, LV_LABEL_LONG_WRAP); lv_obj_set_width(long_label, 150); lv_obj_set_height(long_label, 500); - lv_obj_set_style_text_align(long_label, LV_TEXT_ALIGN_CENTER, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(long_label, LV_TEXT_ALIGN_CENTER, LV_STYLE_STATE_CMP_SAME); lv_point_t first_letter_point; lv_point_t last_letter_point; @@ -436,7 +437,7 @@ void test_label_long_text_get_letter_pos_align_center(void) void test_label_is_char_under_pos_align_left(void) { - lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_LEFT, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_LEFT, LV_STYLE_STATE_CMP_SAME); bool expected_result = true; bool result = false; lv_point_t last_letter_point; @@ -459,7 +460,7 @@ void test_label_is_char_under_pos_align_left(void) void test_label_is_char_under_pos_align_right(void) { - lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_RIGHT, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_RIGHT, LV_STYLE_STATE_CMP_SAME); bool expected_result = true; bool result = false; lv_point_t last_letter_point; @@ -482,7 +483,7 @@ void test_label_is_char_under_pos_align_right(void) void test_label_is_char_under_pos_align_center(void) { - lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, LV_STYLE_STATE_CMP_SAME); bool expected_result = true; bool result = false; lv_point_t last_letter_point; @@ -514,7 +515,7 @@ void test_label_cut_text(void) void test_label_get_letter_on_left(void) { - lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_LEFT, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_LEFT, LV_STYLE_STATE_CMP_SAME); lv_point_t last_letter_point; const uint32_t last_letter_idx = strlen(lv_label_get_text(label)) - 1; @@ -527,7 +528,7 @@ void test_label_get_letter_on_left(void) void test_label_get_letter_on_center(void) { - lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, LV_STYLE_STATE_CMP_SAME); lv_point_t last_letter_point; const uint32_t last_letter_idx = strlen(lv_label_get_text(label)) - 1; @@ -540,7 +541,7 @@ void test_label_get_letter_on_center(void) void test_label_get_letter_on_right(void) { - lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_RIGHT, _LV_STYLE_STATE_CMP_SAME); + lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_RIGHT, LV_STYLE_STATE_CMP_SAME); lv_point_t last_letter_point; const uint32_t last_letter_idx = strlen(lv_label_get_text(label)) - 1; diff --git a/tests/src/test_cases/widgets/test_led.c b/tests/src/test_cases/widgets/test_led.c index c631c83a5..de52a162a 100644 --- a/tests/src/test_cases/widgets/test_led.c +++ b/tests/src/test_cases/widgets/test_led.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_line.c b/tests/src/test_cases/widgets/test_line.c index beb2d3af6..d4a6875b1 100644 --- a/tests/src/test_cases/widgets/test_line.c +++ b/tests/src/test_cases/widgets/test_line.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" @@ -75,7 +76,7 @@ void test_line_should_update_extra_draw_size_based_on_style(void) /* Trigger the extra draw size event */ lv_obj_refresh_ext_draw_size(line); - TEST_ASSERT_EQUAL(initial_extra_draw_size, _lv_obj_get_ext_draw_size(line)); + TEST_ASSERT_EQUAL(initial_extra_draw_size, lv_obj_get_ext_draw_size(line)); /* Update line width style, the event handler should set the extra draw size * to the line width */ @@ -84,7 +85,7 @@ void test_line_should_update_extra_draw_size_based_on_style(void) /* Trigger the extra draw size event */ lv_obj_refresh_ext_draw_size(line); - TEST_ASSERT_EQUAL(final_extra_draw_size, _lv_obj_get_ext_draw_size(line)); + TEST_ASSERT_EQUAL(final_extra_draw_size, lv_obj_get_ext_draw_size(line)); } void test_line_basic_render(void) diff --git a/tests/src/test_cases/widgets/test_list.c b/tests/src/test_cases/widgets/test_list.c index 9724ddb10..64d01d9d6 100644 --- a/tests/src/test_cases/widgets/test_list.c +++ b/tests/src/test_cases/widgets/test_list.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_msgbox.c b/tests/src/test_cases/widgets/test_msgbox.c index f5f29c577..a2f42339c 100644 --- a/tests/src/test_cases/widgets/test_msgbox.c +++ b/tests/src/test_cases/widgets/test_msgbox.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_indev.h" diff --git a/tests/src/test_cases/widgets/test_obj_flags.c b/tests/src/test_cases/widgets/test_obj_flags.c index 41df79872..88f6d7846 100644 --- a/tests/src/test_cases/widgets/test_obj_flags.c +++ b/tests/src/test_cases/widgets/test_obj_flags.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_indev.h" diff --git a/tests/src/test_cases/widgets/test_obj_property.c b/tests/src/test_cases/widgets/test_obj_property.c index 998aebd39..fa2736cec 100644 --- a/tests/src/test_cases/widgets/test_obj_property.c +++ b/tests/src/test_cases/widgets/test_obj_property.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_obj_tree.c b/tests/src/test_cases/widgets/test_obj_tree.c index 3644f6bb7..4aa21b694 100644 --- a/tests/src/test_cases/widgets/test_obj_tree.c +++ b/tests/src/test_cases/widgets/test_obj_tree.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_objid.c b/tests/src/test_cases/widgets/test_objid.c index 8ec2a8361..013215df7 100644 --- a/tests/src/test_cases/widgets/test_objid.c +++ b/tests/src/test_cases/widgets/test_objid.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include diff --git a/tests/src/test_cases/widgets/test_roller.c b/tests/src/test_cases/widgets/test_roller.c index 736611ef3..c55c7b992 100644 --- a/tests/src/test_cases/widgets/test_roller.c +++ b/tests/src/test_cases/widgets/test_roller.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_indev.h" @@ -259,7 +260,7 @@ void test_roller_appearance(void) /* a normal and infinite roller with the same size font for the main and selected parts */ lv_obj_set_pos(roller, 20, 20); - lv_roller_set_options(roller, opts, LV_PART_MAIN); + lv_roller_set_options(roller, opts, LV_ROLLER_MODE_NORMAL); lv_obj_set_pos(roller_infinite, 20, 200); lv_roller_set_options(roller_infinite, opts, LV_ROLLER_MODE_INFINITE); diff --git a/tests/src/test_cases/widgets/test_scale.c b/tests/src/test_cases/widgets/test_scale.c index cb0fcc86a..aa3425bab 100644 --- a/tests/src/test_cases/widgets/test_scale.c +++ b/tests/src/test_cases/widgets/test_scale.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_slider.c b/tests/src/test_cases/widgets/test_slider.c index 4c32eebc6..c79c4c4c7 100644 --- a/tests/src/test_cases/widgets/test_slider.c +++ b/tests/src/test_cases/widgets/test_slider.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_indev.h" diff --git a/tests/src/test_cases/widgets/test_span.c b/tests/src/test_cases/widgets/test_span.c index 654fb69ac..44ee88690 100644 --- a/tests/src/test_cases/widgets/test_span.c +++ b/tests/src/test_cases/widgets/test_span.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" @@ -139,7 +140,7 @@ void test_spangroup_set_overflow(void) void test_spangroup_set_overflow_invalid_parameters_overflow_not_changed(void) { lv_spangroup_set_overflow(spangroup, LV_SPAN_OVERFLOW_ELLIPSIS); - lv_spangroup_set_overflow(spangroup, _LV_SPAN_OVERFLOW_LAST); + lv_spangroup_set_overflow(spangroup, LV_SPAN_OVERFLOW_LAST); TEST_ASSERT_EQUAL(LV_SPAN_OVERFLOW_ELLIPSIS, lv_spangroup_get_overflow(spangroup)); } @@ -168,7 +169,7 @@ void test_spangroup_set_mode(void) void test_spangroup_set_mode_invalid_parameter_mode_not_changed(void) { lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_EXPAND); - lv_spangroup_set_mode(spangroup, _LV_SPAN_MODE_LAST); + lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_LAST); TEST_ASSERT_EQUAL(LV_SPAN_MODE_EXPAND, lv_spangroup_get_mode(spangroup)); } diff --git a/tests/src/test_cases/widgets/test_spinbox.c b/tests/src/test_cases/widgets/test_spinbox.c index 3f8e5ba6c..c404203e0 100644 --- a/tests/src/test_cases/widgets/test_spinbox.c +++ b/tests/src/test_cases/widgets/test_spinbox.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_indev.h" diff --git a/tests/src/test_cases/widgets/test_spinner.c b/tests/src/test_cases/widgets/test_spinner.c index 27270cbc8..74f54a552 100644 --- a/tests/src/test_cases/widgets/test_spinner.c +++ b/tests/src/test_cases/widgets/test_spinner.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_switch.c b/tests/src/test_cases/widgets/test_switch.c index e0e86e5c6..aff45bf73 100644 --- a/tests/src/test_cases/widgets/test_switch.c +++ b/tests/src/test_cases/widgets/test_switch.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" @@ -89,7 +90,7 @@ void test_switch_animation(void) void test_switch_should_not_have_extra_draw_size_at_creation(void) { - int32_t extra_size = _lv_obj_get_ext_draw_size(sw); + int32_t extra_size = lv_obj_get_ext_draw_size(sw); TEST_ASSERT_EQUAL(0, extra_size); } @@ -98,7 +99,7 @@ void test_switch_should_update_extra_draw_size_after_editing_padding(void) { int32_t pad = 6; int32_t actual = 0; - int32_t expected = pad + _LV_SWITCH_KNOB_EXT_AREA_CORRECTION; + int32_t expected = pad + LV_SWITCH_KNOB_EXT_AREA_CORRECTION; static lv_style_t style_knob; lv_style_init(&style_knob); @@ -109,7 +110,7 @@ void test_switch_should_update_extra_draw_size_after_editing_padding(void) lv_obj_center(sw); /* Get extra draw size */ - actual = _lv_obj_get_ext_draw_size(sw); + actual = lv_obj_get_ext_draw_size(sw); TEST_ASSERT_EQUAL(expected, actual); } diff --git a/tests/src/test_cases/widgets/test_table.c b/tests/src/test_cases/widgets/test_table.c index cbee86cd1..bbe145bc1 100644 --- a/tests/src/test_cases/widgets/test_table.c +++ b/tests/src/test_cases/widgets/test_table.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_tabview.c b/tests/src/test_cases/widgets/test_tabview.c index 54d36ec29..e31fff1f1 100644 --- a/tests/src/test_cases/widgets/test_tabview.c +++ b/tests/src/test_cases/widgets/test_tabview.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" #include "lv_test_indev.h" diff --git a/tests/src/test_cases/widgets/test_textarea.c b/tests/src/test_cases/widgets/test_textarea.c index 6a7a8c620..739d7d490 100644 --- a/tests/src/test_cases/widgets/test_textarea.c +++ b/tests/src/test_cases/widgets/test_textarea.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" diff --git a/tests/src/test_cases/widgets/test_win.c b/tests/src/test_cases/widgets/test_win.c index ed83eb5ca..0e8647fad 100644 --- a/tests/src/test_cases/widgets/test_win.c +++ b/tests/src/test_cases/widgets/test_win.c @@ -1,5 +1,6 @@ #if LV_BUILD_TEST #include "../lvgl.h" +#include "../../lvgl_private.h" #include "unity/unity.h" static lv_obj_t * active_screen = NULL;