diff --git a/.github/workflows/api_audit.yml b/.github/workflows/api_audit.yml new file mode 100644 index 00000000..91e6a9da --- /dev/null +++ b/.github/workflows/api_audit.yml @@ -0,0 +1,31 @@ +name: API Coverage Audit + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + audit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Run API Audit + run: | + python3 scripts/audit_api_coverage.py ../lvgl . + working-directory: ${{ github.workspace }} + + - name: Check for Coverage Regressions + run: | + # Currently we just run it to ensure it passes. + # Future: Compare with baseline. + echo "API Coverage Audit Completed" diff --git a/CMakeLists.txt b/CMakeLists.txt index b0d36deb..89e3cb8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,11 +11,19 @@ set(SOURCES font/owned_font.cpp misc/file_system.cpp core/observer.cpp - draw/image_decoder.cpp +) + +set(DRAW_SOURCES draw/draw.cpp + draw/draw_buf.cpp draw/draw_task.cpp + draw/image_decoder.cpp draw/image_descriptor.cpp - +) + +list(APPEND SOURCES ${DRAW_SOURCES}) + +set(WIDGET_SOURCES widgets/button.cpp widgets/label.cpp widgets/bar.cpp @@ -60,6 +68,7 @@ set(SOURCES misc/theme.cpp misc/vector.cpp ) +list(APPEND SOURCES ${WIDGET_SOURCES}) if(IDF_TARGET) idf_component_register(SRCS ${SOURCES} diff --git a/design/api_coverage_report.md b/design/api_coverage_report.md index 9813e7c8..bd1296fc 100644 --- a/design/api_coverage_report.md +++ b/design/api_coverage_report.md @@ -34,7 +34,7 @@ The audit scans all lvgl_cpp source files (`.h` and `.cpp`) for actual usage of: | Category | Total | Used | Coverage | |----------|-------|------|----------| -| **Functions** | 1,836 | 949 | **51.7%** | +| **Functions** | 1,836 | 968 | **52.7%** | | **Enums and Constants** | 859 | 289 | **33.6%** | ## Function coverage diff --git a/docs/api_coverage.json b/docs/api_coverage.json index 1d56fbc0..fce92299 100644 --- a/docs/api_coverage.json +++ b/docs/api_coverage.json @@ -1,13 +1,13 @@ { "summary": { - "total_user_api": 1460, - "wrapped": 776, - "not_wrapped": 684, + "total_user_api": 1836, + "wrapped": 968, + "not_wrapped": 868, "internal_api_violations": [], - "total_enums": 423, - "enums_used": 275, - "function_coverage_percent": 53.2, - "enum_coverage_percent": 65.0 + "total_enums": 859, + "enums_used": 289, + "function_coverage_percent": 52.7, + "enum_coverage_percent": 33.6 }, "subsystems": { "lv_timer": { @@ -41,7 +41,7 @@ "lv_anim": { "prefix": "lv_anim_", "total": 62, - "wrapped_count": 30, + "wrapped_count": 37, "wrapped": [ "lv_anim_delete", "lv_anim_get", @@ -66,11 +66,18 @@ "lv_anim_timeline_add", "lv_anim_timeline_create", "lv_anim_timeline_delete", + "lv_anim_timeline_get_delay", "lv_anim_timeline_get_playtime", "lv_anim_timeline_get_progress", + "lv_anim_timeline_get_repeat_count", + "lv_anim_timeline_get_repeat_delay", "lv_anim_timeline_get_reverse", + "lv_anim_timeline_merge", "lv_anim_timeline_pause", + "lv_anim_timeline_set_delay", "lv_anim_timeline_set_progress", + "lv_anim_timeline_set_repeat_count", + "lv_anim_timeline_set_repeat_delay", "lv_anim_timeline_set_reverse", "lv_anim_timeline_start" ], @@ -98,20 +105,41 @@ "lv_anim_speed", "lv_anim_speed_clamped", "lv_anim_speed_to_time", + "lv_anim_timeline_get_user_data", + "lv_anim_timeline_set_user_data" + ] + }, + "lv_anim_timeline": { + "prefix": "lv_anim_timeline_", + "total": 19, + "wrapped_count": 17, + "wrapped": [ + "lv_anim_timeline_add", + "lv_anim_timeline_create", + "lv_anim_timeline_delete", "lv_anim_timeline_get_delay", + "lv_anim_timeline_get_playtime", + "lv_anim_timeline_get_progress", "lv_anim_timeline_get_repeat_count", "lv_anim_timeline_get_repeat_delay", - "lv_anim_timeline_get_user_data", + "lv_anim_timeline_get_reverse", "lv_anim_timeline_merge", + "lv_anim_timeline_pause", "lv_anim_timeline_set_delay", + "lv_anim_timeline_set_progress", "lv_anim_timeline_set_repeat_count", "lv_anim_timeline_set_repeat_delay", + "lv_anim_timeline_set_reverse", + "lv_anim_timeline_start" + ], + "not_wrapped": [ + "lv_anim_timeline_get_user_data", "lv_anim_timeline_set_user_data" ] }, "lv_obj": { "prefix": "lv_obj_", - "total": 467, + "total": 465, "wrapped_count": 142, "wrapped": [ "lv_obj_add_flag", @@ -140,6 +168,7 @@ "lv_obj_get_child_count", "lv_obj_get_content_height", "lv_obj_get_content_width", + "lv_obj_get_group", "lv_obj_get_height", "lv_obj_get_index", "lv_obj_get_parent", @@ -156,8 +185,6 @@ "lv_obj_get_y", "lv_obj_has_flag", "lv_obj_has_state", - "lv_obj_move_background", - "lv_obj_move_foreground", "lv_obj_remove_event_cb_with_user_data", "lv_obj_remove_flag", "lv_obj_remove_state", @@ -168,6 +195,7 @@ "lv_obj_scroll_to_view_recursive", "lv_obj_scroll_to_x", "lv_obj_scroll_to_y", + "lv_obj_send_event", "lv_obj_set_align", "lv_obj_set_flex_align", "lv_obj_set_flex_flow", @@ -292,7 +320,6 @@ "lv_obj_get_display", "lv_obj_get_event_count", "lv_obj_get_event_dsc", - "lv_obj_get_group", "lv_obj_get_id", "lv_obj_get_index_by_type", "lv_obj_get_local_style_prop", @@ -492,7 +519,6 @@ "lv_obj_reset_transform", "lv_obj_scroll_by_bounded", "lv_obj_scrollbar_invalidate", - "lv_obj_send_event", "lv_obj_set_content_height", "lv_obj_set_content_width", "lv_obj_set_ext_click_area", @@ -1456,6 +1482,20 @@ "lv_image_src_get_type" ] }, + "lv_imagebutton": { + "prefix": "lv_imagebutton_", + "total": 6, + "wrapped_count": 6, + "wrapped": [ + "lv_imagebutton_create", + "lv_imagebutton_get_src_left", + "lv_imagebutton_get_src_middle", + "lv_imagebutton_get_src_right", + "lv_imagebutton_set_src", + "lv_imagebutton_set_state" + ], + "not_wrapped": [] + }, "lv_led": { "prefix": "lv_led_", "total": 7, @@ -1504,18 +1544,54 @@ "lv_span": { "prefix": "lv_span_", "total": 7, - "wrapped_count": 0, - "wrapped": [], - "not_wrapped": [ - "lv_span_get_style", + "wrapped_count": 3, + "wrapped": [ "lv_span_get_text", "lv_span_set_text", + "lv_span_set_text_static" + ], + "not_wrapped": [ + "lv_span_get_style", "lv_span_set_text_fmt", - "lv_span_set_text_static", "lv_span_stack_deinit", "lv_span_stack_init" ] }, + "lv_spangroup": { + "prefix": "lv_spangroup_", + "total": 26, + "wrapped_count": 18, + "wrapped": [ + "lv_spangroup_add_span", + "lv_spangroup_create", + "lv_spangroup_delete_span", + "lv_spangroup_get_align", + "lv_spangroup_get_child", + "lv_spangroup_get_indent", + "lv_spangroup_get_max_line_height", + "lv_spangroup_get_max_lines", + "lv_spangroup_get_mode", + "lv_spangroup_get_overflow", + "lv_spangroup_get_span_count", + "lv_spangroup_refresh", + "lv_spangroup_set_align", + "lv_spangroup_set_indent", + "lv_spangroup_set_max_lines", + "lv_spangroup_set_mode", + "lv_spangroup_set_overflow", + "lv_spangroup_set_span_style" + ], + "not_wrapped": [ + "lv_spangroup_bind_span_text", + "lv_spangroup_get_expand_height", + "lv_spangroup_get_expand_width", + "lv_spangroup_get_span_by_point", + "lv_spangroup_get_span_coords", + "lv_spangroup_set_span_text", + "lv_spangroup_set_span_text_fmt", + "lv_spangroup_set_span_text_static" + ] + }, "lv_scale": { "prefix": "lv_scale_", "total": 34, @@ -1818,6 +1894,412 @@ "lv_color_to_u16", "lv_color_to_u32" ] + }, + "lv_animimg": { + "prefix": "lv_animimg_", + "total": 14, + "wrapped_count": 5, + "wrapped": [ + "lv_animimg_create", + "lv_animimg_set_duration", + "lv_animimg_set_repeat_count", + "lv_animimg_set_src", + "lv_animimg_start" + ], + "not_wrapped": [ + "lv_animimg_delete", + "lv_animimg_get_anim", + "lv_animimg_get_duration", + "lv_animimg_get_repeat_count", + "lv_animimg_get_src", + "lv_animimg_get_src_count", + "lv_animimg_set_reverse_delay", + "lv_animimg_set_reverse_duration", + "lv_animimg_set_src_reverse" + ] + }, + "lv_buttonmatrix": { + "prefix": "lv_buttonmatrix_", + "total": 15, + "wrapped_count": 15, + "wrapped": [ + "lv_buttonmatrix_clear_button_ctrl", + "lv_buttonmatrix_clear_button_ctrl_all", + "lv_buttonmatrix_create", + "lv_buttonmatrix_get_button_text", + "lv_buttonmatrix_get_map", + "lv_buttonmatrix_get_one_checked", + "lv_buttonmatrix_get_selected_button", + "lv_buttonmatrix_has_button_ctrl", + "lv_buttonmatrix_set_button_ctrl", + "lv_buttonmatrix_set_button_ctrl_all", + "lv_buttonmatrix_set_button_width", + "lv_buttonmatrix_set_ctrl_map", + "lv_buttonmatrix_set_map", + "lv_buttonmatrix_set_one_checked", + "lv_buttonmatrix_set_selected_button" + ], + "not_wrapped": [] + }, + "lv_spinner": { + "prefix": "lv_spinner_", + "total": 2, + "wrapped_count": 2, + "wrapped": [ + "lv_spinner_create", + "lv_spinner_set_anim_params" + ], + "not_wrapped": [] + }, + "lv_lottie": { + "prefix": "lv_lottie_", + "total": 6, + "wrapped_count": 6, + "wrapped": [ + "lv_lottie_create", + "lv_lottie_get_anim", + "lv_lottie_set_buffer", + "lv_lottie_set_draw_buf", + "lv_lottie_set_src_data", + "lv_lottie_set_src_file" + ], + "not_wrapped": [] + }, + "lv_vector": { + "prefix": "lv_vector_", + "total": 16, + "wrapped_count": 15, + "wrapped": [ + "lv_vector_path_append_arc", + "lv_vector_path_append_circle", + "lv_vector_path_append_path", + "lv_vector_path_append_rectangle", + "lv_vector_path_arc_to", + "lv_vector_path_clear", + "lv_vector_path_close", + "lv_vector_path_copy", + "lv_vector_path_create", + "lv_vector_path_cubic_to", + "lv_vector_path_delete", + "lv_vector_path_get_bounding", + "lv_vector_path_line_to", + "lv_vector_path_move_to", + "lv_vector_path_quad_to" + ], + "not_wrapped": [ + "lv_vector_path_append_rect" + ] + }, + "lv_observer": { + "prefix": "lv_observer_", + "total": 4, + "wrapped_count": 4, + "wrapped": [ + "lv_observer_get_target", + "lv_observer_get_target_obj", + "lv_observer_get_user_data", + "lv_observer_remove" + ], + "not_wrapped": [] + }, + "lv_subject": { + "prefix": "lv_subject_", + "total": 32, + "wrapped_count": 29, + "wrapped": [ + "lv_subject_add_observer", + "lv_subject_add_observer_with_target", + "lv_subject_copy_string", + "lv_subject_deinit", + "lv_subject_get_color", + "lv_subject_get_float", + "lv_subject_get_int", + "lv_subject_get_pointer", + "lv_subject_get_previous_color", + "lv_subject_get_previous_float", + "lv_subject_get_previous_int", + "lv_subject_get_previous_pointer", + "lv_subject_get_previous_string", + "lv_subject_get_string", + "lv_subject_init_color", + "lv_subject_init_float", + "lv_subject_init_group", + "lv_subject_init_int", + "lv_subject_init_pointer", + "lv_subject_init_string", + "lv_subject_notify", + "lv_subject_set_color", + "lv_subject_set_float", + "lv_subject_set_int", + "lv_subject_set_max_value_float", + "lv_subject_set_max_value_int", + "lv_subject_set_min_value_float", + "lv_subject_set_min_value_int", + "lv_subject_set_pointer" + ], + "not_wrapped": [ + "lv_subject_add_observer_obj", + "lv_subject_get_group_element", + "lv_subject_snprintf" + ] + }, + "lv_screen": { + "prefix": "lv_screen_", + "total": 3, + "wrapped_count": 3, + "wrapped": [ + "lv_screen_active", + "lv_screen_load", + "lv_screen_load_anim" + ], + "not_wrapped": [] + }, + "lv_draw": { + "prefix": "lv_draw_", + "total": 224, + "wrapped_count": 52, + "wrapped": [ + "lv_draw_add_task", + "lv_draw_arc", + "lv_draw_buf_clear", + "lv_draw_buf_clear_flag", + "lv_draw_buf_create", + "lv_draw_buf_destroy", + "lv_draw_buf_set_flag", + "lv_draw_buf_width_to_stride", + "lv_draw_finalize_task_creation", + "lv_draw_image", + "lv_draw_label", + "lv_draw_layer_alloc_buf", + "lv_draw_line", + "lv_draw_mask_rect", + "lv_draw_mask_rect_dsc_init", + "lv_draw_rect", + "lv_draw_task_get_area", + "lv_draw_task_get_draw_dsc", + "lv_draw_task_get_type", + "lv_draw_vector", + "lv_draw_vector_dsc_add_path", + "lv_draw_vector_dsc_clear_area", + "lv_draw_vector_dsc_create", + "lv_draw_vector_dsc_delete", + "lv_draw_vector_dsc_identity", + "lv_draw_vector_dsc_rotate", + "lv_draw_vector_dsc_scale", + "lv_draw_vector_dsc_set_blend_mode", + "lv_draw_vector_dsc_set_fill_color32", + "lv_draw_vector_dsc_set_fill_gradient_color_stops", + "lv_draw_vector_dsc_set_fill_gradient_spread", + "lv_draw_vector_dsc_set_fill_image", + "lv_draw_vector_dsc_set_fill_linear_gradient", + "lv_draw_vector_dsc_set_fill_opa", + "lv_draw_vector_dsc_set_fill_radial_gradient", + "lv_draw_vector_dsc_set_fill_rule", + "lv_draw_vector_dsc_set_fill_transform", + "lv_draw_vector_dsc_set_stroke_cap", + "lv_draw_vector_dsc_set_stroke_color32", + "lv_draw_vector_dsc_set_stroke_dash", + "lv_draw_vector_dsc_set_stroke_gradient_color_stops", + "lv_draw_vector_dsc_set_stroke_gradient_spread", + "lv_draw_vector_dsc_set_stroke_join", + "lv_draw_vector_dsc_set_stroke_linear_gradient", + "lv_draw_vector_dsc_set_stroke_miter_limit", + "lv_draw_vector_dsc_set_stroke_opa", + "lv_draw_vector_dsc_set_stroke_radial_gradient", + "lv_draw_vector_dsc_set_stroke_transform", + "lv_draw_vector_dsc_set_stroke_width", + "lv_draw_vector_dsc_set_transform", + "lv_draw_vector_dsc_skew", + "lv_draw_vector_dsc_translate" + ], + "not_wrapped": [ + "lv_draw_3d", + "lv_draw_3d_dsc_init", + "lv_draw_arc_dsc_init", + "lv_draw_arc_get_area", + "lv_draw_border", + "lv_draw_border_dsc_init", + "lv_draw_box_shadow", + "lv_draw_box_shadow_dsc_init", + "lv_draw_buf_adjust_stride", + "lv_draw_buf_align", + "lv_draw_buf_align_ex", + "lv_draw_buf_convert_premultiply", + "lv_draw_buf_copy", + "lv_draw_buf_create_ex", + "lv_draw_buf_dup", + "lv_draw_buf_dup_ex", + "lv_draw_buf_flush_cache", + "lv_draw_buf_from_image", + "lv_draw_buf_g2d_init_handlers", + "lv_draw_buf_get_font_handlers", + "lv_draw_buf_get_handlers", + "lv_draw_buf_get_image_handlers", + "lv_draw_buf_goto_xy", + "lv_draw_buf_handlers_init", + "lv_draw_buf_has_flag", + "lv_draw_buf_init", + "lv_draw_buf_init_with_default_handlers", + "lv_draw_buf_invalidate_cache", + "lv_draw_buf_ppa_init_handlers", + "lv_draw_buf_premultiply", + "lv_draw_buf_pxp_init_handlers", + "lv_draw_buf_reshape", + "lv_draw_buf_save_to_file", + "lv_draw_buf_set_palette", + "lv_draw_buf_to_image", + "lv_draw_buf_vg_lite_init_handlers", + "lv_draw_buf_width_to_stride_ex", + "lv_draw_character", + "lv_draw_create_unit", + "lv_draw_dave2d_arc", + "lv_draw_dave2d_border", + "lv_draw_dave2d_box_shadow", + "lv_draw_dave2d_fill", + "lv_draw_dave2d_image", + "lv_draw_dave2d_init", + "lv_draw_dave2d_is_dest_cf_supported", + "lv_draw_dave2d_label", + "lv_draw_dave2d_layer", + "lv_draw_dave2d_line", + "lv_draw_dave2d_lv_colour_fmt_to_d2_fmt", + "lv_draw_dave2d_lv_colour_to_d2_colour", + "lv_draw_dave2d_mask_rect", + "lv_draw_dave2d_transform", + "lv_draw_dave2d_triangle", + "lv_draw_deinit", + "lv_draw_dispatch", + "lv_draw_dispatch_layer", + "lv_draw_dispatch_request", + "lv_draw_dispatch_wait_for_request", + "lv_draw_dma2d_deinit", + "lv_draw_dma2d_init", + "lv_draw_dma2d_transfer_complete_interrupt_handler", + "lv_draw_eve_display_create", + "lv_draw_eve_display_get_user_data", + "lv_draw_eve_init", + "lv_draw_eve_memread16", + "lv_draw_eve_memread32", + "lv_draw_eve_memread8", + "lv_draw_eve_memwrite16", + "lv_draw_eve_memwrite32", + "lv_draw_eve_memwrite8", + "lv_draw_eve_pre_upload_font_range", + "lv_draw_eve_pre_upload_font_text", + "lv_draw_eve_pre_upload_image", + "lv_draw_eve_ramg_get_addr", + "lv_draw_eve_set_display_data", + "lv_draw_eve_touch_create", + "lv_draw_fill", + "lv_draw_fill_dsc_init", + "lv_draw_g2d_deinit", + "lv_draw_g2d_fill", + "lv_draw_g2d_img", + "lv_draw_g2d_init", + "lv_draw_get_available_task", + "lv_draw_get_dependent_count", + "lv_draw_get_next_available_task", + "lv_draw_get_unit_count", + "lv_draw_glyph_dsc_init", + "lv_draw_image_dsc_init", + "lv_draw_init", + "lv_draw_label_dsc_init", + "lv_draw_label_iterate_characters", + "lv_draw_layer", + "lv_draw_layer_create", + "lv_draw_layer_go_to_xy", + "lv_draw_layer_init", + "lv_draw_letter", + "lv_draw_letter_dsc_init", + "lv_draw_line_dsc_init", + "lv_draw_nema_gfx_arc", + "lv_draw_nema_gfx_border", + "lv_draw_nema_gfx_deinit", + "lv_draw_nema_gfx_fill", + "lv_draw_nema_gfx_img", + "lv_draw_nema_gfx_init", + "lv_draw_nema_gfx_label", + "lv_draw_nema_gfx_label_init", + "lv_draw_nema_gfx_layer", + "lv_draw_nema_gfx_line", + "lv_draw_nema_gfx_triangle", + "lv_draw_nema_gfx_vector", + "lv_draw_opengles_deinit", + "lv_draw_opengles_init", + "lv_draw_ppa_deinit", + "lv_draw_ppa_fill", + "lv_draw_ppa_img", + "lv_draw_ppa_init", + "lv_draw_pxp_deinit", + "lv_draw_pxp_fill", + "lv_draw_pxp_img", + "lv_draw_pxp_init", + "lv_draw_pxp_layer", + "lv_draw_pxp_rotate", + "lv_draw_rect_dsc_init", + "lv_draw_sdl_arc", + "lv_draw_sdl_border", + "lv_draw_sdl_box_shadow", + "lv_draw_sdl_fill", + "lv_draw_sdl_image", + "lv_draw_sdl_init", + "lv_draw_sdl_label", + "lv_draw_sdl_layer", + "lv_draw_sdl_line", + "lv_draw_sdl_mask_rect", + "lv_draw_sdl_triangle", + "lv_draw_svg", + "lv_draw_svg_render", + "lv_draw_task_get_3d_dsc", + "lv_draw_task_get_arc_dsc", + "lv_draw_task_get_border_dsc", + "lv_draw_task_get_box_shadow_dsc", + "lv_draw_task_get_fill_dsc", + "lv_draw_task_get_image_dsc", + "lv_draw_task_get_label_dsc", + "lv_draw_task_get_line_dsc", + "lv_draw_task_get_mask_rect_dsc", + "lv_draw_task_get_triangle_dsc", + "lv_draw_task_get_vector_dsc", + "lv_draw_triangle", + "lv_draw_triangle_dsc_init", + "lv_draw_unit_draw_letter", + "lv_draw_unit_send_event", + "lv_draw_vector_dsc_set_fill_color", + "lv_draw_vector_dsc_set_fill_units", + "lv_draw_vector_dsc_set_stroke_color", + "lv_draw_vg_lite_arc", + "lv_draw_vg_lite_border", + "lv_draw_vg_lite_box_shadow", + "lv_draw_vg_lite_deinit", + "lv_draw_vg_lite_fill", + "lv_draw_vg_lite_img", + "lv_draw_vg_lite_init", + "lv_draw_vg_lite_label", + "lv_draw_vg_lite_label_deinit", + "lv_draw_vg_lite_label_init", + "lv_draw_vg_lite_layer", + "lv_draw_vg_lite_letter", + "lv_draw_vg_lite_line", + "lv_draw_vg_lite_mask_rect", + "lv_draw_vg_lite_triangle", + "lv_draw_vg_lite_vector", + "lv_draw_wait_for_finish" + ] + }, + "lv_layer": { + "prefix": "lv_layer_", + "total": 5, + "wrapped_count": 4, + "wrapped": [ + "lv_layer_init", + "lv_layer_reset", + "lv_layer_sys", + "lv_layer_top" + ], + "not_wrapped": [ + "lv_layer_bottom" + ] } }, "enums": { @@ -2157,31 +2639,6 @@ "LV_ANIM_TIMELINE_PROGRESS_MAX" ] }, - "LV_SCR_LOAD_ANIM": { - "prefix": "LV_SCR_LOAD_ANIM_", - "total": 16, - "used_count": 15, - "used": [ - "LV_SCR_LOAD_ANIM_FADE_ON", - "LV_SCR_LOAD_ANIM_FADE_OUT", - "LV_SCR_LOAD_ANIM_MOVE_BOTTOM", - "LV_SCR_LOAD_ANIM_MOVE_LEFT", - "LV_SCR_LOAD_ANIM_MOVE_RIGHT", - "LV_SCR_LOAD_ANIM_MOVE_TOP", - "LV_SCR_LOAD_ANIM_NONE", - "LV_SCR_LOAD_ANIM_OUT_BOTTOM", - "LV_SCR_LOAD_ANIM_OUT_LEFT", - "LV_SCR_LOAD_ANIM_OUT_RIGHT", - "LV_SCR_LOAD_ANIM_OUT_TOP", - "LV_SCR_LOAD_ANIM_OVER_BOTTOM", - "LV_SCR_LOAD_ANIM_OVER_LEFT", - "LV_SCR_LOAD_ANIM_OVER_RIGHT", - "LV_SCR_LOAD_ANIM_OVER_TOP" - ], - "not_used": [ - "LV_SCR_LOAD_ANIM_FADE_IN" - ] - }, "LV_TEXT": { "prefix": "LV_TEXT_", "total": 14, @@ -2207,14 +2664,9 @@ }, "LV_LABEL": { "prefix": "LV_LABEL_", - "total": 18, - "used_count": 6, + "total": 13, + "used_count": 1, "used": [ - "LV_LABEL_LONG_CLIP", - "LV_LABEL_LONG_DOT", - "LV_LABEL_LONG_SCROLL", - "LV_LABEL_LONG_SCROLL_CIRCULAR", - "LV_LABEL_LONG_WRAP", "LV_LABEL_TEXT_SELECTION_OFF" ], "not_used": [ @@ -2437,7 +2889,7 @@ }, "LV_INDEV": { "prefix": "LV_INDEV_", - "total": 27, + "total": 25, "used_count": 10, "used": [ "LV_INDEV_GESTURE_CNT", @@ -2466,9 +2918,7 @@ "LV_INDEV_H", "LV_INDEV_MODE_EVENT", "LV_INDEV_MODE_TIMER", - "LV_INDEV_SCROLL_H", - "LV_INDEV_STATE_PR", - "LV_INDEV_STATE_REL" + "LV_INDEV_SCROLL_H" ] }, "LV_DISPLAY": { @@ -2487,6 +2937,542 @@ "LV_DISPLAY_RENDER_MODE_DIRECT", "LV_DISPLAY_RENDER_MODE_FULL" ] + }, + "LV_BUTTONMATRIX": { + "prefix": "LV_BUTTONMATRIX_", + "total": 30, + "used_count": 1, + "used": [ + "LV_BUTTONMATRIX_BUTTON_NONE" + ], + "not_used": [ + "LV_BUTTONMATRIX_CTRL_CHECKABLE", + "LV_BUTTONMATRIX_CTRL_CHECKED", + "LV_BUTTONMATRIX_CTRL_CLICK_TRIG", + "LV_BUTTONMATRIX_CTRL_CUSTOM_1", + "LV_BUTTONMATRIX_CTRL_CUSTOM_2", + "LV_BUTTONMATRIX_CTRL_DISABLED", + "LV_BUTTONMATRIX_CTRL_HIDDEN", + "LV_BUTTONMATRIX_CTRL_NONE", + "LV_BUTTONMATRIX_CTRL_NO_REPEAT", + "LV_BUTTONMATRIX_CTRL_POPOVER", + "LV_BUTTONMATRIX_CTRL_RECOLOR", + "LV_BUTTONMATRIX_CTRL_RESERVED_1", + "LV_BUTTONMATRIX_CTRL_RESERVED_2", + "LV_BUTTONMATRIX_CTRL_WIDTH_1", + "LV_BUTTONMATRIX_CTRL_WIDTH_10", + "LV_BUTTONMATRIX_CTRL_WIDTH_11", + "LV_BUTTONMATRIX_CTRL_WIDTH_12", + "LV_BUTTONMATRIX_CTRL_WIDTH_13", + "LV_BUTTONMATRIX_CTRL_WIDTH_14", + "LV_BUTTONMATRIX_CTRL_WIDTH_15", + "LV_BUTTONMATRIX_CTRL_WIDTH_2", + "LV_BUTTONMATRIX_CTRL_WIDTH_3", + "LV_BUTTONMATRIX_CTRL_WIDTH_4", + "LV_BUTTONMATRIX_CTRL_WIDTH_5", + "LV_BUTTONMATRIX_CTRL_WIDTH_6", + "LV_BUTTONMATRIX_CTRL_WIDTH_7", + "LV_BUTTONMATRIX_CTRL_WIDTH_8", + "LV_BUTTONMATRIX_CTRL_WIDTH_9", + "LV_BUTTONMATRIX_H" + ] + }, + "LV_IMAGEBUTTON": { + "prefix": "LV_IMAGEBUTTON_", + "total": 8, + "used_count": 0, + "used": [], + "not_used": [ + "LV_IMAGEBUTTON_H", + "LV_IMAGEBUTTON_STATE_CHECKED_DISABLED", + "LV_IMAGEBUTTON_STATE_CHECKED_PRESSED", + "LV_IMAGEBUTTON_STATE_CHECKED_RELEASED", + "LV_IMAGEBUTTON_STATE_DISABLED", + "LV_IMAGEBUTTON_STATE_NUM", + "LV_IMAGEBUTTON_STATE_PRESSED", + "LV_IMAGEBUTTON_STATE_RELEASED" + ] + }, + "LV_SPAN": { + "prefix": "LV_SPAN_", + "total": 9, + "used_count": 2, + "used": [ + "LV_SPAN_MODE_FIXED", + "LV_SPAN_OVERFLOW_CLIP" + ], + "not_used": [ + "LV_SPAN_H", + "LV_SPAN_MODE_BREAK", + "LV_SPAN_MODE_EXPAND", + "LV_SPAN_MODE_LAST", + "LV_SPAN_OVERFLOW_ELLIPSIS", + "LV_SPAN_OVERFLOW_LAST", + "LV_SPAN_SNIPPET_STACK_SIZE" + ] + }, + "LV_IMAGE": { + "prefix": "LV_IMAGE_", + "total": 43, + "used_count": 2, + "used": [ + "LV_IMAGE_ALIGN_DEFAULT", + "LV_IMAGE_HEADER_MAGIC" + ], + "not_used": [ + "LV_IMAGE_ALIGN_BOTTOM_LEFT", + "LV_IMAGE_ALIGN_BOTTOM_MID", + "LV_IMAGE_ALIGN_BOTTOM_RIGHT", + "LV_IMAGE_ALIGN_CENTER", + "LV_IMAGE_ALIGN_CONTAIN", + "LV_IMAGE_ALIGN_COVER", + "LV_IMAGE_ALIGN_LEFT_MID", + "LV_IMAGE_ALIGN_RIGHT_MID", + "LV_IMAGE_ALIGN_STRETCH", + "LV_IMAGE_ALIGN_TILE", + "LV_IMAGE_ALIGN_TOP_LEFT", + "LV_IMAGE_ALIGN_TOP_MID", + "LV_IMAGE_ALIGN_TOP_RIGHT", + "LV_IMAGE_CACHE_H", + "LV_IMAGE_COMPRESS_LZ4", + "LV_IMAGE_COMPRESS_NONE", + "LV_IMAGE_COMPRESS_RLE", + "LV_IMAGE_DECLARE", + "LV_IMAGE_DECODER_H", + "LV_IMAGE_DSC_H", + "LV_IMAGE_FLAGS_ALLOCATED", + "LV_IMAGE_FLAGS_COMPRESSED", + "LV_IMAGE_FLAGS_CUSTOM_DRAW", + "LV_IMAGE_FLAGS_MODIFIABLE", + "LV_IMAGE_FLAGS_PREMULTIPLIED", + "LV_IMAGE_FLAGS_USER1", + "LV_IMAGE_FLAGS_USER2", + "LV_IMAGE_FLAGS_USER3", + "LV_IMAGE_FLAGS_USER4", + "LV_IMAGE_FLAGS_USER5", + "LV_IMAGE_FLAGS_USER6", + "LV_IMAGE_FLAGS_USER7", + "LV_IMAGE_FLAGS_USER8", + "LV_IMAGE_FLAGS_USER_MASK", + "LV_IMAGE_H", + "LV_IMAGE_HEADER_CACHE_DEF_CNT", + "LV_IMAGE_HEADER_CACHE_H", + "LV_IMAGE_SRC_FILE", + "LV_IMAGE_SRC_SYMBOL", + "LV_IMAGE_SRC_UNKNOWN", + "LV_IMAGE_SRC_VARIABLE" + ] + }, + "LV_LOTTIE": { + "prefix": "LV_LOTTIE_", + "total": 1, + "used_count": 0, + "used": [], + "not_used": [ + "LV_LOTTIE_H" + ] + }, + "LV_VECTOR": { + "prefix": "LV_VECTOR_", + "total": 35, + "used_count": 1, + "used": [ + "LV_VECTOR_PATH_QUALITY_MEDIUM" + ], + "not_used": [ + "LV_VECTOR_BLEND_ADDITIVE", + "LV_VECTOR_BLEND_DST_IN", + "LV_VECTOR_BLEND_DST_OVER", + "LV_VECTOR_BLEND_MULTIPLY", + "LV_VECTOR_BLEND_NONE", + "LV_VECTOR_BLEND_SCREEN", + "LV_VECTOR_BLEND_SRC_IN", + "LV_VECTOR_BLEND_SRC_OVER", + "LV_VECTOR_BLEND_SUBTRACTIVE", + "LV_VECTOR_DRAW_STYLE_GRADIENT", + "LV_VECTOR_DRAW_STYLE_PATTERN", + "LV_VECTOR_DRAW_STYLE_SOLID", + "LV_VECTOR_FILL_EVENODD", + "LV_VECTOR_FILL_NONZERO", + "LV_VECTOR_FILL_UNITS_OBJECT_BOUNDING_BOX", + "LV_VECTOR_FILL_UNITS_USER_SPACE_ON_USE", + "LV_VECTOR_GRADIENT_SPREAD_PAD", + "LV_VECTOR_GRADIENT_SPREAD_REFLECT", + "LV_VECTOR_GRADIENT_SPREAD_REPEAT", + "LV_VECTOR_GRADIENT_STYLE_LINEAR", + "LV_VECTOR_GRADIENT_STYLE_RADIAL", + "LV_VECTOR_PATH_OP_CLOSE", + "LV_VECTOR_PATH_OP_CUBIC_TO", + "LV_VECTOR_PATH_OP_LINE_TO", + "LV_VECTOR_PATH_OP_MOVE_TO", + "LV_VECTOR_PATH_OP_QUAD_TO", + "LV_VECTOR_PATH_QUALITY_HIGH", + "LV_VECTOR_PATH_QUALITY_LOW", + "LV_VECTOR_STROKE_CAP_BUTT", + "LV_VECTOR_STROKE_CAP_ROUND", + "LV_VECTOR_STROKE_CAP_SQUARE", + "LV_VECTOR_STROKE_JOIN_BEVEL", + "LV_VECTOR_STROKE_JOIN_MITER", + "LV_VECTOR_STROKE_JOIN_ROUND" + ] + }, + "LV_SUBJECT": { + "prefix": "LV_SUBJECT_", + "total": 8, + "used_count": 0, + "used": [], + "not_used": [ + "LV_SUBJECT_TYPE_COLOR", + "LV_SUBJECT_TYPE_FLOAT", + "LV_SUBJECT_TYPE_GROUP", + "LV_SUBJECT_TYPE_INT", + "LV_SUBJECT_TYPE_INVALID", + "LV_SUBJECT_TYPE_NONE", + "LV_SUBJECT_TYPE_POINTER", + "LV_SUBJECT_TYPE_STRING" + ] + }, + "LV_OBJ": { + "prefix": "LV_OBJ_", + "total": 62, + "used_count": 28, + "used": [ + "LV_OBJ_FLAG_ADV_HITTEST", + "LV_OBJ_FLAG_CHECKABLE", + "LV_OBJ_FLAG_CLICKABLE", + "LV_OBJ_FLAG_CLICK_FOCUSABLE", + "LV_OBJ_FLAG_EVENT_BUBBLE", + "LV_OBJ_FLAG_FLOATING", + "LV_OBJ_FLAG_GESTURE_BUBBLE", + "LV_OBJ_FLAG_HIDDEN", + "LV_OBJ_FLAG_IGNORE_LAYOUT", + "LV_OBJ_FLAG_LAYOUT_1", + "LV_OBJ_FLAG_LAYOUT_2", + "LV_OBJ_FLAG_OVERFLOW_VISIBLE", + "LV_OBJ_FLAG_PRESS_LOCK", + "LV_OBJ_FLAG_SCROLLABLE", + "LV_OBJ_FLAG_SCROLL_CHAIN", + "LV_OBJ_FLAG_SCROLL_CHAIN_HOR", + "LV_OBJ_FLAG_SCROLL_CHAIN_VER", + "LV_OBJ_FLAG_SCROLL_ELASTIC", + "LV_OBJ_FLAG_SCROLL_MOMENTUM", + "LV_OBJ_FLAG_SCROLL_ON_FOCUS", + "LV_OBJ_FLAG_SCROLL_WITH_ARROW", + "LV_OBJ_FLAG_SNAPPABLE", + "LV_OBJ_FLAG_USER_1", + "LV_OBJ_FLAG_USER_2", + "LV_OBJ_FLAG_USER_3", + "LV_OBJ_FLAG_USER_4", + "LV_OBJ_FLAG_WIDGET_1", + "LV_OBJ_FLAG_WIDGET_2" + ], + "not_used": [ + "LV_OBJ_CLASS_EDITABLE_FALSE", + "LV_OBJ_CLASS_EDITABLE_INHERIT", + "LV_OBJ_CLASS_EDITABLE_TRUE", + "LV_OBJ_CLASS_GROUP_DEF_FALSE", + "LV_OBJ_CLASS_GROUP_DEF_INHERIT", + "LV_OBJ_CLASS_GROUP_DEF_TRUE", + "LV_OBJ_CLASS_H", + "LV_OBJ_CLASS_THEME_INHERITABLE_FALSE", + "LV_OBJ_CLASS_THEME_INHERITABLE_TRUE", + "LV_OBJ_DRAW_H", + "LV_OBJ_EVENT_H", + "LV_OBJ_FLAG_EVENT_TRICKLE", + "LV_OBJ_FLAG_FLEX_IN_NEW_TRACK", + "LV_OBJ_FLAG_SCROLL_ONE", + "LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS", + "LV_OBJ_FLAG_STATE_TRICKLE", + "LV_OBJ_H", + "LV_OBJ_ID_AUTO_ASSIGN", + "LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE", + "LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE", + "LV_OBJ_POINT_TRANSFORM_FLAG_NONE", + "LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE", + "LV_OBJ_POS_H", + "LV_OBJ_PROPERTY_H", + "LV_OBJ_PROPERTY_NAMES_H", + "LV_OBJ_SCROLL_H", + "LV_OBJ_SET_PROPERTY_ARRAY", + "LV_OBJ_STYLE_CACHE", + "LV_OBJ_STYLE_GEN_H", + "LV_OBJ_STYLE_H", + "LV_OBJ_TREE_H", + "LV_OBJ_TREE_WALK_END", + "LV_OBJ_TREE_WALK_NEXT", + "LV_OBJ_TREE_WALK_SKIP_CHILDREN" + ] + }, + "LV_STYLE": { + "prefix": "LV_STYLE_", + "total": 263, + "used_count": 0, + "used": [], + "not_used": [ + "LV_STYLE_ALIGN", + "LV_STYLE_ANIM", + "LV_STYLE_ANIM_DURATION", + "LV_STYLE_ARC_COLOR", + "LV_STYLE_ARC_IMAGE_SRC", + "LV_STYLE_ARC_OPA", + "LV_STYLE_ARC_ROUNDED", + "LV_STYLE_ARC_WIDTH", + "LV_STYLE_BASE_DIR", + "LV_STYLE_BG_COLOR", + "LV_STYLE_BG_GRAD", + "LV_STYLE_BG_GRAD_COLOR", + "LV_STYLE_BG_GRAD_DIR", + "LV_STYLE_BG_GRAD_OPA", + "LV_STYLE_BG_GRAD_STOP", + "LV_STYLE_BG_IMAGE_OPA", + "LV_STYLE_BG_IMAGE_RECOLOR", + "LV_STYLE_BG_IMAGE_RECOLOR_OPA", + "LV_STYLE_BG_IMAGE_SRC", + "LV_STYLE_BG_IMAGE_TILED", + "LV_STYLE_BG_MAIN_OPA", + "LV_STYLE_BG_MAIN_STOP", + "LV_STYLE_BG_OPA", + "LV_STYLE_BITMAP_MASK_SRC", + "LV_STYLE_BLEND_MODE", + "LV_STYLE_BORDER_COLOR", + "LV_STYLE_BORDER_OPA", + "LV_STYLE_BORDER_POST", + "LV_STYLE_BORDER_SIDE", + "LV_STYLE_BORDER_WIDTH", + "LV_STYLE_CLIP_CORNER", + "LV_STYLE_COLOR_FILTER_DSC", + "LV_STYLE_COLOR_FILTER_OPA", + "LV_STYLE_CONST_ALIGN", + "LV_STYLE_CONST_ANIM", + "LV_STYLE_CONST_ANIM_DURATION", + "LV_STYLE_CONST_ARC_COLOR", + "LV_STYLE_CONST_ARC_IMAGE_SRC", + "LV_STYLE_CONST_ARC_OPA", + "LV_STYLE_CONST_ARC_ROUNDED", + "LV_STYLE_CONST_ARC_WIDTH", + "LV_STYLE_CONST_BASE_DIR", + "LV_STYLE_CONST_BG_COLOR", + "LV_STYLE_CONST_BG_GRAD", + "LV_STYLE_CONST_BG_GRAD_COLOR", + "LV_STYLE_CONST_BG_GRAD_DIR", + "LV_STYLE_CONST_BG_GRAD_OPA", + "LV_STYLE_CONST_BG_GRAD_STOP", + "LV_STYLE_CONST_BG_IMAGE_OPA", + "LV_STYLE_CONST_BG_IMAGE_RECOLOR", + "LV_STYLE_CONST_BG_IMAGE_RECOLOR_OPA", + "LV_STYLE_CONST_BG_IMAGE_SRC", + "LV_STYLE_CONST_BG_IMAGE_TILED", + "LV_STYLE_CONST_BG_MAIN_OPA", + "LV_STYLE_CONST_BG_MAIN_STOP", + "LV_STYLE_CONST_BG_OPA", + "LV_STYLE_CONST_BITMAP_MASK_SRC", + "LV_STYLE_CONST_BLEND_MODE", + "LV_STYLE_CONST_BORDER_COLOR", + "LV_STYLE_CONST_BORDER_OPA", + "LV_STYLE_CONST_BORDER_POST", + "LV_STYLE_CONST_BORDER_SIDE", + "LV_STYLE_CONST_BORDER_WIDTH", + "LV_STYLE_CONST_CLIP_CORNER", + "LV_STYLE_CONST_COLOR_FILTER_DSC", + "LV_STYLE_CONST_COLOR_FILTER_OPA", + "LV_STYLE_CONST_FLEX_CROSS_PLACE", + "LV_STYLE_CONST_FLEX_FLOW", + "LV_STYLE_CONST_FLEX_GROW", + "LV_STYLE_CONST_FLEX_MAIN_PLACE", + "LV_STYLE_CONST_FLEX_TRACK_PLACE", + "LV_STYLE_CONST_GRID_CELL_COLUMN_POS", + "LV_STYLE_CONST_GRID_CELL_COLUMN_SPAN", + "LV_STYLE_CONST_GRID_CELL_ROW_POS", + "LV_STYLE_CONST_GRID_CELL_ROW_SPAN", + "LV_STYLE_CONST_GRID_CELL_X_ALIGN", + "LV_STYLE_CONST_GRID_CELL_Y_ALIGN", + "LV_STYLE_CONST_GRID_COLUMN_ALIGN", + "LV_STYLE_CONST_GRID_COLUMN_DSC_ARRAY", + "LV_STYLE_CONST_GRID_ROW_ALIGN", + "LV_STYLE_CONST_GRID_ROW_DSC_ARRAY", + "LV_STYLE_CONST_HEIGHT", + "LV_STYLE_CONST_IMAGE_COLORKEY", + "LV_STYLE_CONST_IMAGE_OPA", + "LV_STYLE_CONST_IMAGE_RECOLOR", + "LV_STYLE_CONST_IMAGE_RECOLOR_OPA", + "LV_STYLE_CONST_INIT", + "LV_STYLE_CONST_LAYOUT", + "LV_STYLE_CONST_LENGTH", + "LV_STYLE_CONST_LINE_COLOR", + "LV_STYLE_CONST_LINE_DASH_GAP", + "LV_STYLE_CONST_LINE_DASH_WIDTH", + "LV_STYLE_CONST_LINE_OPA", + "LV_STYLE_CONST_LINE_ROUNDED", + "LV_STYLE_CONST_LINE_WIDTH", + "LV_STYLE_CONST_MARGIN_BOTTOM", + "LV_STYLE_CONST_MARGIN_LEFT", + "LV_STYLE_CONST_MARGIN_RIGHT", + "LV_STYLE_CONST_MARGIN_TOP", + "LV_STYLE_CONST_MAX_HEIGHT", + "LV_STYLE_CONST_MAX_WIDTH", + "LV_STYLE_CONST_MIN_HEIGHT", + "LV_STYLE_CONST_MIN_WIDTH", + "LV_STYLE_CONST_OPA", + "LV_STYLE_CONST_OPA_LAYERED", + "LV_STYLE_CONST_OUTLINE_COLOR", + "LV_STYLE_CONST_OUTLINE_OPA", + "LV_STYLE_CONST_OUTLINE_PAD", + "LV_STYLE_CONST_OUTLINE_WIDTH", + "LV_STYLE_CONST_PAD_BOTTOM", + "LV_STYLE_CONST_PAD_COLUMN", + "LV_STYLE_CONST_PAD_LEFT", + "LV_STYLE_CONST_PAD_RADIAL", + "LV_STYLE_CONST_PAD_RIGHT", + "LV_STYLE_CONST_PAD_ROW", + "LV_STYLE_CONST_PAD_TOP", + "LV_STYLE_CONST_PROPS_END", + "LV_STYLE_CONST_RADIAL_OFFSET", + "LV_STYLE_CONST_RADIUS", + "LV_STYLE_CONST_RECOLOR", + "LV_STYLE_CONST_RECOLOR_OPA", + "LV_STYLE_CONST_ROTARY_SENSITIVITY", + "LV_STYLE_CONST_SHADOW_COLOR", + "LV_STYLE_CONST_SHADOW_OFFSET_X", + "LV_STYLE_CONST_SHADOW_OFFSET_Y", + "LV_STYLE_CONST_SHADOW_OPA", + "LV_STYLE_CONST_SHADOW_SPREAD", + "LV_STYLE_CONST_SHADOW_WIDTH", + "LV_STYLE_CONST_TEXT_ALIGN", + "LV_STYLE_CONST_TEXT_COLOR", + "LV_STYLE_CONST_TEXT_DECOR", + "LV_STYLE_CONST_TEXT_FONT", + "LV_STYLE_CONST_TEXT_LETTER_SPACE", + "LV_STYLE_CONST_TEXT_LINE_SPACE", + "LV_STYLE_CONST_TEXT_OPA", + "LV_STYLE_CONST_TEXT_OUTLINE_STROKE_COLOR", + "LV_STYLE_CONST_TEXT_OUTLINE_STROKE_OPA", + "LV_STYLE_CONST_TEXT_OUTLINE_STROKE_WIDTH", + "LV_STYLE_CONST_TRANSFORM_HEIGHT", + "LV_STYLE_CONST_TRANSFORM_PIVOT_X", + "LV_STYLE_CONST_TRANSFORM_PIVOT_Y", + "LV_STYLE_CONST_TRANSFORM_ROTATION", + "LV_STYLE_CONST_TRANSFORM_SCALE_X", + "LV_STYLE_CONST_TRANSFORM_SCALE_Y", + "LV_STYLE_CONST_TRANSFORM_SKEW_X", + "LV_STYLE_CONST_TRANSFORM_SKEW_Y", + "LV_STYLE_CONST_TRANSFORM_WIDTH", + "LV_STYLE_CONST_TRANSITION", + "LV_STYLE_CONST_TRANSLATE_RADIAL", + "LV_STYLE_CONST_TRANSLATE_X", + "LV_STYLE_CONST_TRANSLATE_Y", + "LV_STYLE_CONST_WIDTH", + "LV_STYLE_CONST_X", + "LV_STYLE_CONST_Y", + "LV_STYLE_FLEX_CROSS_PLACE", + "LV_STYLE_FLEX_FLOW", + "LV_STYLE_FLEX_GROW", + "LV_STYLE_FLEX_MAIN_PLACE", + "LV_STYLE_FLEX_TRACK_PLACE", + "LV_STYLE_GEN_H", + "LV_STYLE_GRID_CELL_COLUMN_POS", + "LV_STYLE_GRID_CELL_COLUMN_SPAN", + "LV_STYLE_GRID_CELL_ROW_POS", + "LV_STYLE_GRID_CELL_ROW_SPAN", + "LV_STYLE_GRID_CELL_X_ALIGN", + "LV_STYLE_GRID_CELL_Y_ALIGN", + "LV_STYLE_GRID_COLUMN_ALIGN", + "LV_STYLE_GRID_COLUMN_DSC_ARRAY", + "LV_STYLE_GRID_ROW_ALIGN", + "LV_STYLE_GRID_ROW_DSC_ARRAY", + "LV_STYLE_H", + "LV_STYLE_HEIGHT", + "LV_STYLE_IMAGE_COLORKEY", + "LV_STYLE_IMAGE_OPA", + "LV_STYLE_IMAGE_RECOLOR", + "LV_STYLE_IMAGE_RECOLOR_OPA", + "LV_STYLE_LAST_BUILT_IN_PROP", + "LV_STYLE_LAYOUT", + "LV_STYLE_LENGTH", + "LV_STYLE_LINE_COLOR", + "LV_STYLE_LINE_DASH_GAP", + "LV_STYLE_LINE_DASH_WIDTH", + "LV_STYLE_LINE_OPA", + "LV_STYLE_LINE_ROUNDED", + "LV_STYLE_LINE_WIDTH", + "LV_STYLE_MARGIN_BOTTOM", + "LV_STYLE_MARGIN_LEFT", + "LV_STYLE_MARGIN_RIGHT", + "LV_STYLE_MARGIN_TOP", + "LV_STYLE_MAX_HEIGHT", + "LV_STYLE_MAX_WIDTH", + "LV_STYLE_MIN_HEIGHT", + "LV_STYLE_MIN_WIDTH", + "LV_STYLE_NUM_BUILT_IN_PROPS", + "LV_STYLE_OPA", + "LV_STYLE_OPA_LAYERED", + "LV_STYLE_OUTLINE_COLOR", + "LV_STYLE_OUTLINE_OPA", + "LV_STYLE_OUTLINE_PAD", + "LV_STYLE_OUTLINE_WIDTH", + "LV_STYLE_PAD_BOTTOM", + "LV_STYLE_PAD_COLUMN", + "LV_STYLE_PAD_LEFT", + "LV_STYLE_PAD_RADIAL", + "LV_STYLE_PAD_RIGHT", + "LV_STYLE_PAD_ROW", + "LV_STYLE_PAD_TOP", + "LV_STYLE_PROPERTIES_H", + "LV_STYLE_PROP_ANY", + "LV_STYLE_PROP_CONST", + "LV_STYLE_PROP_FLAG_ALL", + "LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE", + "LV_STYLE_PROP_FLAG_INHERITABLE", + "LV_STYLE_PROP_FLAG_LAYER_UPDATE", + "LV_STYLE_PROP_FLAG_LAYOUT_UPDATE", + "LV_STYLE_PROP_FLAG_NONE", + "LV_STYLE_PROP_FLAG_PARENT_LAYOUT_UPDATE", + "LV_STYLE_PROP_FLAG_TRANSFORM", + "LV_STYLE_PROP_INV", + "LV_STYLE_RADIAL_OFFSET", + "LV_STYLE_RADIUS", + "LV_STYLE_RECOLOR", + "LV_STYLE_RECOLOR_OPA", + "LV_STYLE_RES_FOUND", + "LV_STYLE_RES_NOT_FOUND", + "LV_STYLE_ROTARY_SENSITIVITY", + "LV_STYLE_SENTINEL_VALUE", + "LV_STYLE_SHADOW_COLOR", + "LV_STYLE_SHADOW_OFFSET_X", + "LV_STYLE_SHADOW_OFFSET_Y", + "LV_STYLE_SHADOW_OPA", + "LV_STYLE_SHADOW_SPREAD", + "LV_STYLE_SHADOW_WIDTH", + "LV_STYLE_STATE_CMP_DIFF_DRAW_PAD", + "LV_STYLE_STATE_CMP_DIFF_LAYOUT", + "LV_STYLE_STATE_CMP_DIFF_REDRAW", + "LV_STYLE_STATE_CMP_SAME", + "LV_STYLE_TEXT_ALIGN", + "LV_STYLE_TEXT_COLOR", + "LV_STYLE_TEXT_DECOR", + "LV_STYLE_TEXT_FONT", + "LV_STYLE_TEXT_LETTER_SPACE", + "LV_STYLE_TEXT_LINE_SPACE", + "LV_STYLE_TEXT_OPA", + "LV_STYLE_TEXT_OUTLINE_STROKE_COLOR", + "LV_STYLE_TEXT_OUTLINE_STROKE_OPA", + "LV_STYLE_TEXT_OUTLINE_STROKE_WIDTH", + "LV_STYLE_TRANSFORM_HEIGHT", + "LV_STYLE_TRANSFORM_PIVOT_X", + "LV_STYLE_TRANSFORM_PIVOT_Y", + "LV_STYLE_TRANSFORM_ROTATION", + "LV_STYLE_TRANSFORM_SCALE_X", + "LV_STYLE_TRANSFORM_SCALE_Y", + "LV_STYLE_TRANSFORM_SKEW_X", + "LV_STYLE_TRANSFORM_SKEW_Y", + "LV_STYLE_TRANSFORM_WIDTH", + "LV_STYLE_TRANSITION", + "LV_STYLE_TRANSLATE_RADIAL", + "LV_STYLE_TRANSLATE_X", + "LV_STYLE_TRANSLATE_Y", + "LV_STYLE_WIDTH", + "LV_STYLE_X", + "LV_STYLE_Y" + ] } } } \ No newline at end of file diff --git a/draw/draw.h b/draw/draw.h index ae135aa5..4a5e50d4 100644 --- a/draw/draw.h +++ b/draw/draw.h @@ -1,11 +1,13 @@ #ifndef LVGL_CPP_DRAW_DRAW_H_ #define LVGL_CPP_DRAW_DRAW_H_ +#include "draw_buf.h" #include "draw_task.h" #include "lvgl.h" namespace lvgl { +using draw::DrawBuf; using draw::DrawTask; using draw::DrawTaskType; diff --git a/draw/draw_buf.cpp b/draw/draw_buf.cpp new file mode 100644 index 00000000..d9e77eb2 --- /dev/null +++ b/draw/draw_buf.cpp @@ -0,0 +1,67 @@ +#include "draw_buf.h" + +#include + +namespace lvgl { +namespace draw { + +DrawBuf::DrawBuf(uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride) + : buf_(lv_draw_buf_create(w, h, cf, stride)), owns_(true) {} + +DrawBuf::DrawBuf(lv_draw_buf_t* buf, bool take_ownership) + : buf_(buf), owns_(take_ownership) {} + +DrawBuf::~DrawBuf() { + if (buf_ && owns_) { + lv_draw_buf_destroy(buf_); + } +} + +DrawBuf::DrawBuf(DrawBuf&& other) noexcept + : buf_(other.buf_), owns_(other.owns_) { + other.buf_ = nullptr; + other.owns_ = false; +} + +DrawBuf& DrawBuf::operator=(DrawBuf&& other) noexcept { + if (this != &other) { + if (buf_ && owns_) { + lv_draw_buf_destroy(buf_); + } + buf_ = other.buf_; + owns_ = other.owns_; + other.buf_ = nullptr; + other.owns_ = false; + } + return *this; +} + +uint32_t DrawBuf::width() const { return buf_ ? buf_->header.w : 0; } + +uint32_t DrawBuf::height() const { return buf_ ? buf_->header.h : 0; } + +lv_color_format_t DrawBuf::format() const { + return buf_ ? static_cast(buf_->header.cf) + : LV_COLOR_FORMAT_UNKNOWN; +} + +void DrawBuf::clear(const lv_area_t* area) { + if (buf_) { + lv_draw_buf_clear(buf_, area); + } +} + +void DrawBuf::set_flag(lv_image_flags_t flag) { + if (buf_) { + lv_draw_buf_set_flag(buf_, flag); + } +} + +void DrawBuf::clear_flag(lv_image_flags_t flag) { + if (buf_) { + lv_draw_buf_clear_flag(buf_, flag); + } +} + +} // namespace draw +} // namespace lvgl diff --git a/draw/draw_buf.h b/draw/draw_buf.h new file mode 100644 index 00000000..3306739e --- /dev/null +++ b/draw/draw_buf.h @@ -0,0 +1,85 @@ +#ifndef LVGL_CPP_DRAW_DRAW_BUF_H_ +#define LVGL_CPP_DRAW_DRAW_BUF_H_ + +#include + +#include "lvgl.h" + +namespace lvgl { +namespace draw { + +/** + * @brief RAII wrapper for lv_draw_buf_t. + * Manages allocation and deallocation of an LVGL drawing buffer. + */ +class DrawBuf { + public: + /** + * @brief Create a draw buffer with specified dimensions and format. + * @param w Width in pixels. + * @param h Height in pixels. + * @param cf Color format (default ARGB8888). + * @param stride Stride in bytes (0 for auto). + */ + DrawBuf(uint32_t w, uint32_t h, + lv_color_format_t cf = LV_COLOR_FORMAT_ARGB8888, uint32_t stride = 0); + + /** + * @brief Wrap an existing C draw buffer. + * @param buf Pointer to the C struct. + * @param take_ownership If true, will destroy the buffer in destructor. + */ + explicit DrawBuf(lv_draw_buf_t* buf, bool take_ownership = false); + + ~DrawBuf(); + + // Non-copyable + DrawBuf(const DrawBuf&) = delete; + DrawBuf& operator=(const DrawBuf&) = delete; + + // Movable + DrawBuf(DrawBuf&& other) noexcept; + DrawBuf& operator=(DrawBuf&& other) noexcept; + + /** + * @brief Get the underlying C struct. + */ + lv_draw_buf_t* raw() const { return buf_; } + + /** @brief Get width in pixels. */ + uint32_t width() const; + + /** @brief Get height in pixels. */ + uint32_t height() const; + + /** @brief Get color format. */ + lv_color_format_t format() const; + + /** + * @brief Clear the buffer (fill with 0/transparent). + * @param area Specific area to clear, or nullptr for the whole buffer. + */ + void clear(const lv_area_t* area = nullptr); + + /** + * @brief Set a flag on the draw buffer. + */ + void set_flag(lv_image_flags_t flag); + + /** + * @brief Clear a flag on the draw buffer. + */ + void clear_flag(lv_image_flags_t flag); + + private: + lv_draw_buf_t* buf_ = nullptr; + bool owns_ = false; +}; + +} // namespace draw + +using draw::DrawBuf; + +} // namespace lvgl + +#endif // LVGL_CPP_DRAW_DRAW_BUF_H_ diff --git a/misc/animation_timeline.cpp b/misc/animation_timeline.cpp index 86de2d1d..8471586b 100644 --- a/misc/animation_timeline.cpp +++ b/misc/animation_timeline.cpp @@ -70,6 +70,18 @@ void AnimationTimeline::set_reverse(bool reverse) { if (timeline_) lv_anim_timeline_set_reverse(timeline_, reverse); } +void AnimationTimeline::set_delay(uint32_t delay) { + if (timeline_) lv_anim_timeline_set_delay(timeline_, delay); +} + +void AnimationTimeline::set_repeat_count(uint32_t count) { + if (timeline_) lv_anim_timeline_set_repeat_count(timeline_, count); +} + +void AnimationTimeline::set_repeat_delay(uint32_t delay) { + if (timeline_) lv_anim_timeline_set_repeat_delay(timeline_, delay); +} + void AnimationTimeline::set_progress(uint16_t progress) { if (timeline_) lv_anim_timeline_set_progress(timeline_, progress); } @@ -84,9 +96,31 @@ bool AnimationTimeline::get_reverse() const { return false; } +uint32_t AnimationTimeline::get_delay() const { + if (timeline_) return lv_anim_timeline_get_delay(timeline_); + return 0; +} + uint16_t AnimationTimeline::get_progress() const { if (timeline_) return lv_anim_timeline_get_progress(timeline_); return 0; } +uint32_t AnimationTimeline::get_repeat_count() const { + if (timeline_) return lv_anim_timeline_get_repeat_count(timeline_); + return 0; +} + +uint32_t AnimationTimeline::get_repeat_delay() const { + if (timeline_) return lv_anim_timeline_get_repeat_delay(timeline_); + return 0; +} + +void AnimationTimeline::merge(const AnimationTimeline& other, + int32_t extra_delay) { + if (timeline_ && other.timeline_) { + lv_anim_timeline_merge(timeline_, other.timeline_, extra_delay); + } +} + } // namespace lvgl diff --git a/misc/animation_timeline.h b/misc/animation_timeline.h index 658738e1..30fa9306 100644 --- a/misc/animation_timeline.h +++ b/misc/animation_timeline.h @@ -42,6 +42,26 @@ class AnimationTimeline { */ void set_reverse(bool reverse); + /** + * @brief Set the time to wait before starting the animation. + * Applies only when playing from the very start, or reverse from the very + * end. + * @param delay The delay time in milliseconds. + */ + void set_delay(uint32_t delay); + + /** + * @brief Make the animation timeline repeat itself. + * @param count Repeat count or LV_ANIM_REPEAT_INFINITE. 0 to disable. + */ + void set_repeat_count(uint32_t count); + + /** + * @brief Set a delay before repeating the animation timeline. + * @param delay Delay in milliseconds. + */ + void set_repeat_delay(uint32_t delay); + /** * @brief Set the progress of the timeline. * @param progress Progress 0..65535 map to 0..100%. @@ -60,12 +80,37 @@ class AnimationTimeline { */ bool get_reverse() const; + /** + * @brief Get the start delay. + * @return Delay in milliseconds. + */ + uint32_t get_delay() const; + /** * @brief Get the current progress. * @return Progress 0..65535. */ uint16_t get_progress() const; + /** + * @brief Get the repeat count. + * @return Repeat count. + */ + uint32_t get_repeat_count() const; + + /** + * @brief Get the repeat delay. + * @return Delay in milliseconds. + */ + uint32_t get_repeat_delay() const; + + /** + * @brief Merge animations from another timeline into this one. + * @param other The timeline to merge from. + * @param extra_delay Extra delay to add for the merged animations. + */ + void merge(const AnimationTimeline& other, int32_t extra_delay = 0); + /** * @brief Access the underlying C struct. */ diff --git a/tests/test_animation_timeline.cpp b/tests/test_animation_timeline.cpp index 6c552af9..4e10822f 100644 --- a/tests/test_animation_timeline.cpp +++ b/tests/test_animation_timeline.cpp @@ -87,9 +87,60 @@ void test_timeline_basic() { } } +void test_timeline_advanced() { + std::cout << "Testing Timeline Advanced (delay, repeat, merge)..." + << std::endl; + + lvgl::Object screen(lv_screen_active(), lvgl::Object::Ownership::Unmanaged); + lvgl::Button btn1(screen); + + { + lvgl::AnimationTimeline timeline; + timeline.set_delay(500); + timeline.set_repeat_count(2); + timeline.set_repeat_delay(100); + + if (timeline.get_delay() == 500 && timeline.get_repeat_count() == 2 && + timeline.get_repeat_delay() == 100) { + std::cout << "PASS: Setting/getting delay and repeat works." << std::endl; + } else { + std::cerr << "FAIL: Delay or repeat mismatch." << std::endl; + exit(1); + } + } + + { + lvgl::AnimationTimeline t1; + lvgl::AnimationTimeline t2; + + lvgl::Animation a1(btn1); + a1.set_values(0, 100).set_duration(100).set_exec_cb( + static_cast( + [](void* var, int32_t val) {})); + + t1.add(a1, 0); + t2.add(a1, 100); + + uint32_t pt1 = t1.get_playtime(); + t1.merge(t2, 50); + + // pt1 was 100. t2 adds an anim starting at 100 with duration 100 -> 200. + // + extra_delay 50 -> 250. + if (t1.get_playtime() == 250) { + std::cout << "PASS: Timeline merge works." << std::endl; + } else { + std::cerr << "FAIL: Merged playtime mismatch: " << t1.get_playtime() + << " (expected 250)." << std::endl; + exit(1); + } + } +} + int main() { lv_init(); lvgl::Display display = lvgl::Display::create(800, 480); test_timeline_basic(); + test_timeline_advanced(); + std::cout << "All AnimationTimeline tests passed!" << std::endl; return 0; } diff --git a/tests/test_lottie.cpp b/tests/test_lottie.cpp index fa81ef02..871d0261 100644 --- a/tests/test_lottie.cpp +++ b/tests/test_lottie.cpp @@ -14,21 +14,18 @@ void test_lottie_creation() { // Test Create lvgl::Lottie lottie = lvgl::Lottie::create(screen); - // Test Buffer Setting (mock buffer) - static uint32_t buf[100 * 100]; - lottie.set_buffer(100, 100, buf); + // Test Buffer Setting with DrawBuf + lvgl::DrawBuf db(100, 100); + lottie.set_draw_buf(db); - // Test Src Setting (mock data) - // Note: In a real test, this would need valid JSON data to not crash LVGL if - // it parses immediately. lv_lottie_set_src_data usually parses. We might skip - // specific src tests if we don't have valid Lottie data handy. However, we - // can check basic API existence. + // Test Auto-Buffer Create + lvgl::Lottie lottie2 = lvgl::Lottie::create(screen, 128, 128); - // Test Anim Access - // lvgl::Animation anim = lottie.anim(); // This might return null if no src - // is set. + if (lottie2.raw()) { + std::cout << "Lottie auto-buffer creation passed." << std::endl; + } - std::cout << "Lottie creation passed." << std::endl; + std::cout << "Lottie basic tests passed." << std::endl; #else std::cout << "Lottie disabled, skipping test." << std::endl; #endif diff --git a/widgets/lottie.cpp b/widgets/lottie.cpp index 58cd5a92..0c270841 100644 --- a/widgets/lottie.cpp +++ b/widgets/lottie.cpp @@ -23,16 +23,39 @@ void Lottie::set_draw_buf(lv_draw_buf_t* draw_buf) { lv_lottie_set_draw_buf(raw(), draw_buf); } +void Lottie::set_draw_buf(const DrawBuf& draw_buf) { + lv_lottie_set_draw_buf(raw(), draw_buf.raw()); +} + Animation Lottie::anim() { lv_anim_t* a = lv_lottie_get_anim(raw()); - // Animation wrapper doesn't own the lv_anim_t pointer here, - // as it belongs to the Lottie widget text. - // Ideally, Animation wrapper should handle non-owning pointers too. - // Checking Animation ctor... Assumes explicit control. - // For now, we return a wrapped animation. Be careful about lifetime. return Animation(a); } +Lottie Lottie::create(Object& parent, int32_t w, int32_t h) { + Lottie l = create(parent); + // Allocate a draw buffer. Note: For now, we don't manage the DrawBuf + // lifetime here in a special way because lv_lottie_set_draw_buf + // doesn't take ownership. + // Actually, we should probably return a wrapper that owns the buffer + // or use the Canvas-style buffer management. + // LVGL v9's lv_draw_buf_create allocates the buffer on the heap. + lv_draw_buf_t* db = lv_draw_buf_create(w, h, LV_COLOR_FORMAT_ARGB8888, 0); + lv_lottie_set_draw_buf(l.raw(), db); + // Mark for automatic destruction when widget is deleted? + // lv_lottie doesn't have a hook for this. + // Let's use lv_obj_add_event_cb to cleanup. + lv_obj_add_event_cb( + l.raw(), + [](lv_event_t* e) { + lv_draw_buf_t* db = (lv_draw_buf_t*)lv_event_get_user_data(e); + if (db) lv_draw_buf_destroy(db); + }, + LV_EVENT_DELETE, db); + + return l; +} + } // namespace lvgl #endif // LV_USE_LOTTIE diff --git a/widgets/lottie.h b/widgets/lottie.h index 0f9cc843..7d6b43fa 100644 --- a/widgets/lottie.h +++ b/widgets/lottie.h @@ -7,6 +7,7 @@ #if LV_USE_LOTTIE #include "../../lvgl/src/widgets/lottie/lv_lottie.h" +#include "../draw/draw.h" #include "../misc/animation.h" namespace lvgl { @@ -47,6 +48,12 @@ class Lottie : public Widget { */ void set_draw_buf(lv_draw_buf_t* draw_buf); + /** + * @brief Set a draw buffer for the animation (RAII version). + * @param draw_buf The DrawBuf wrapper. + */ + void set_draw_buf(const DrawBuf& draw_buf); + /** * @brief Get the underlying animation controller. * @return A C++ Animation wrapper for the internal lv_anim_t. @@ -59,6 +66,15 @@ class Lottie : public Widget { * @return A Lottie object. */ static Lottie create(Object& parent); + + /** + * @brief Create a Lottie widget and automatically allocate a draw buffer. + * @param parent The parent object. + * @param w Width of the animation. + * @param h Height of the animation. + * @return A Lottie object. + */ + static Lottie create(Object& parent, int32_t w, int32_t h); }; } // namespace lvgl