diff options
author | あく <alleteam@gmail.com> | 2021-07-07 11:57:49 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-07 11:57:49 +0300 |
commit | a7283280eff93f22c8fc1b65573ae0a6447e94bf (patch) | |
tree | 89501b407baf96f3070de9e893ab1be467201d16 /applications/dolphin | |
parent | 607e873404d746c692c38482f03c54ed3edce26c (diff) |
GUI: Icons and IconsAnimation refactoring. Switch assets to new Icon Api (#566)
* GUI: Icons and IconsAnimation refactoring. Switch assets to new Icon API.
* Gui: icon and animation draw now do not accept null pointer
* Format Sources
* Fix no debug build
* Furi: stricter checks in memmgr
Diffstat (limited to 'applications/dolphin')
-rw-r--r-- | applications/dolphin/dolphin.c | 31 | ||||
-rw-r--r-- | applications/dolphin/dolphin_i.h | 5 | ||||
-rw-r--r-- | applications/dolphin/dolphin_views.c | 26 | ||||
-rw-r--r-- | applications/dolphin/dolphin_views.h | 2 | ||||
-rw-r--r-- | applications/dolphin/passport/passport.c | 32 | ||||
-rw-r--r-- | applications/dolphin/scenes/assets/items.c | 16 | ||||
-rw-r--r-- | applications/dolphin/scenes/scene.h | 6 | ||||
-rw-r--r-- | applications/dolphin/scenes/scene_gfx.c | 28 |
8 files changed, 74 insertions, 72 deletions
diff --git a/applications/dolphin/dolphin.c b/applications/dolphin/dolphin.c index 2d221601..de2ee320 100644 --- a/applications/dolphin/dolphin.c +++ b/applications/dolphin/dolphin.c @@ -2,6 +2,8 @@ #include <stdlib.h> #include "applications.h" +const Icon* idle_scenes[] = {&A_Wink_128x64, &A_WatchingTV_128x64}; + static void dolphin_switch_to_app(Dolphin* dolphin, const FlipperApplication* flipper_app) { furi_assert(dolphin); furi_assert(flipper_app); @@ -15,11 +17,12 @@ static void dolphin_switch_to_app(Dolphin* dolphin, const FlipperApplication* fl } // temporary main screen animation managment -void dolphin_scene_handler_set_scene(Dolphin* dolphin, IconName icon) { +void dolphin_scene_handler_set_scene(Dolphin* dolphin, const Icon* icon_data) { with_view_model( dolphin->idle_view_main, (DolphinViewMainModel * model) { - model->animation = assets_icons_get(icon); - icon_start_animation(model->animation); + if(model->animation) icon_animation_free(model->animation); + model->animation = icon_animation_alloc(icon_data); + icon_animation_start(model->animation); return true; }); } @@ -27,10 +30,11 @@ void dolphin_scene_handler_set_scene(Dolphin* dolphin, IconName icon) { void dolphin_scene_handler_switch_scene(Dolphin* dolphin) { with_view_model( dolphin->idle_view_main, (DolphinViewMainModel * model) { - if(icon_is_last_frame(model->animation)) { - model->animation = assets_icons_get(idle_scenes[model->scene_num]); - icon_start_animation(model->animation); - model->scene_num = random() % sizeof(idle_scenes); + if(icon_animation_is_last_frame(model->animation)) { + if(model->animation) icon_animation_free(model->animation); + model->animation = icon_animation_alloc(idle_scenes[model->scene_num]); + icon_animation_start(model->animation); + model->scene_num = random() % COUNT_OF(idle_scenes); } return true; }); @@ -183,7 +187,7 @@ static void lock_menu_callback(void* context, uint8_t index) { static void lock_icon_callback(Canvas* canvas, void* context) { furi_assert(context); Dolphin* dolphin = context; - canvas_draw_icon(canvas, 0, 0, dolphin->lock_icon); + canvas_draw_icon_animation(canvas, 0, 0, dolphin->lock_icon); } bool dolphin_view_lockmenu_input(InputEvent* event, void* context) { @@ -206,7 +210,8 @@ bool dolphin_view_lockmenu_input(InputEvent* event, void* context) { view_dispatcher_switch_to_view(dolphin->idle_view_dispatcher, DolphinViewIdleMain); if(random() % 100 > 50) - dolphin_scene_handler_set_scene(dolphin, idle_scenes[random() % sizeof(idle_scenes)]); + dolphin_scene_handler_set_scene( + dolphin, idle_scenes[random() % COUNT_OF(idle_scenes)]); } view_commit_model(dolphin->view_lockmenu, true); @@ -331,14 +336,14 @@ Dolphin* dolphin_alloc() { dolphin->idle_view_dispatcher, DolphinViewHwMismatch, dolphin->view_hw_mismatch); // Lock icon - dolphin->lock_icon = assets_icons_get(I_Lock_8x8); + dolphin->lock_icon = icon_animation_alloc(&I_Lock_8x8); dolphin->lock_viewport = view_port_alloc(); - view_port_set_width(dolphin->lock_viewport, icon_get_width(dolphin->lock_icon)); + view_port_set_width(dolphin->lock_viewport, icon_animation_get_width(dolphin->lock_icon)); view_port_draw_callback_set(dolphin->lock_viewport, lock_icon_callback, dolphin); view_port_enabled_set(dolphin->lock_viewport, false); // Main screen animation - dolphin_scene_handler_set_scene(dolphin, idle_scenes[random() % sizeof(idle_scenes)]); + dolphin_scene_handler_set_scene(dolphin, idle_scenes[random() % COUNT_OF(idle_scenes)]); view_dispatcher_attach_to_gui( dolphin->idle_view_dispatcher, dolphin->gui, ViewDispatcherTypeWindow); @@ -352,7 +357,7 @@ void dolphin_free(Dolphin* dolphin) { gui_remove_view_port(dolphin->gui, dolphin->lock_viewport); view_port_free(dolphin->lock_viewport); - icon_free(dolphin->lock_icon); + icon_animation_free(dolphin->lock_icon); osTimerDelete(dolphin->timeout_timer); diff --git a/applications/dolphin/dolphin_i.h b/applications/dolphin/dolphin_i.h index 2e700363..ccddf802 100644 --- a/applications/dolphin/dolphin_i.h +++ b/applications/dolphin/dolphin_i.h @@ -51,7 +51,7 @@ struct Dolphin { View* view_hw_mismatch; View* view_lockmenu; ViewPort* lock_viewport; - Icon* lock_icon; + IconAnimation* lock_icon; bool locked; uint8_t lock_count; @@ -59,9 +59,6 @@ struct Dolphin { osTimerId_t timeout_timer; }; -// Temporary -const IconName idle_scenes[] = {A_Wink_128x64, A_WatchingTV_128x64}; - Dolphin* dolphin_alloc(); void dolphin_free(Dolphin* dolphin); diff --git a/applications/dolphin/dolphin_views.c b/applications/dolphin/dolphin_views.c index 44022e6c..387a9f8e 100644 --- a/applications/dolphin/dolphin_views.c +++ b/applications/dolphin/dolphin_views.c @@ -17,19 +17,19 @@ void dolphin_view_first_start_draw(Canvas* canvas, void* model) { uint8_t height = canvas_height(canvas); const char* my_name = api_hal_version_get_name_ptr(); if(m->page == 0) { - canvas_draw_icon_name(canvas, 0, height - 48, I_DolphinFirstStart0_70x53); + canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart0_70x53); elements_multiline_text_framed(canvas, 75, 20, "Hey m8,\npress > to\ncontinue"); } else if(m->page == 1) { - canvas_draw_icon_name(canvas, 0, height - 48, I_DolphinFirstStart1_59x53); + canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart1_59x53); elements_multiline_text_framed(canvas, 64, 20, "First Of All,\n... >"); } else if(m->page == 2) { - canvas_draw_icon_name(canvas, 0, height - 48, I_DolphinFirstStart2_59x51); + canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart2_59x51); elements_multiline_text_framed(canvas, 64, 20, "Thank you\nfor your\nsupport! >"); } else if(m->page == 3) { - canvas_draw_icon_name(canvas, width - 57, height - 48, I_DolphinFirstStart3_57x48); + canvas_draw_icon(canvas, width - 57, height - 48, &I_DolphinFirstStart3_57x48); elements_multiline_text_framed(canvas, 0, 20, "Kickstarter\ncampaign\nwas INSANE! >"); } else if(m->page == 4) { - canvas_draw_icon_name(canvas, width - 67, height - 50, I_DolphinFirstStart4_67x53); + canvas_draw_icon(canvas, width - 67, height - 50, &I_DolphinFirstStart4_67x53); elements_multiline_text_framed(canvas, 0, 17, "Now\nallow me\nto introduce\nmyself >"); } else if(m->page == 5) { char buf[64]; @@ -40,18 +40,18 @@ void dolphin_view_first_start_draw(Canvas* canvas, void* model) { "I am", my_name ? my_name : "Unknown", ",\ncyberdolphin\nliving in your\npocket >"); - canvas_draw_icon_name(canvas, 0, height - 48, I_DolphinFirstStart5_45x53); + canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart5_45x53); elements_multiline_text_framed(canvas, 60, 17, buf); } else if(m->page == 6) { - canvas_draw_icon_name(canvas, 0, height - 48, I_DolphinFirstStart6_58x54); + canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart6_58x54); elements_multiline_text_framed( canvas, 63, 17, "I can grow\nsmart'n'cool\nif you use me\noften >"); } else if(m->page == 7) { - canvas_draw_icon_name(canvas, width - 61, height - 48, I_DolphinFirstStart7_61x51); + canvas_draw_icon(canvas, width - 61, height - 48, &I_DolphinFirstStart7_61x51); elements_multiline_text_framed( canvas, 0, 17, "As long as\nyou read, write\nand emulate >"); } else if(m->page == 8) { - canvas_draw_icon_name(canvas, width - 56, height - 48, I_DolphinFirstStart8_56x51); + canvas_draw_icon(canvas, width - 56, height - 48, &I_DolphinFirstStart8_56x51); elements_multiline_text_framed( canvas, 0, 17, "You can check\nmy level and\nmood in the\nPassport menu"); } @@ -61,13 +61,13 @@ void dolphin_view_idle_main_draw(Canvas* canvas, void* model) { canvas_clear(canvas); DolphinViewMainModel* m = model; if(m->animation) { - canvas_draw_icon(canvas, 0, -3, m->animation); + canvas_draw_icon_animation(canvas, 0, -3, m->animation); } if(m->hint_timeout > 0) { m->hint_timeout--; if(m->locked) { - canvas_draw_icon_name(canvas, 13, 5, I_LockPopup_100x49); + canvas_draw_icon(canvas, 13, 5, &I_LockPopup_100x49); elements_multiline_text(canvas, 65, 20, "To unlock\npress:"); } else { canvas_set_font(canvas, FontPrimary); @@ -80,8 +80,8 @@ void dolphin_view_lockmenu_draw(Canvas* canvas, void* model) { DolphinViewLockMenuModel* m = model; canvas_clear(canvas); canvas_set_color(canvas, ColorBlack); - canvas_draw_icon_name(canvas, m->door_left_x, 0, I_DoorLeft_70x55); - canvas_draw_icon_name(canvas, m->door_right_x, 0, I_DoorRight_70x55); + canvas_draw_icon(canvas, m->door_left_x, 0, &I_DoorLeft_70x55); + canvas_draw_icon(canvas, m->door_right_x, 0, &I_DoorRight_70x55); canvas_set_font(canvas, FontSecondary); if(m->locked) { diff --git a/applications/dolphin/dolphin_views.h b/applications/dolphin/dolphin_views.h index da162063..8987d829 100644 --- a/applications/dolphin/dolphin_views.h +++ b/applications/dolphin/dolphin_views.h @@ -45,7 +45,7 @@ typedef struct { } DolphinViewLockMenuModel; typedef struct { - Icon* animation; + IconAnimation* animation; uint8_t scene_num; uint8_t hint_timeout; bool locked; diff --git a/applications/dolphin/passport/passport.c b/applications/dolphin/passport/passport.c index c5803bee..53b97ba0 100644 --- a/applications/dolphin/passport/passport.c +++ b/applications/dolphin/passport/passport.c @@ -23,19 +23,19 @@ typedef struct { // Moods, corresponding to butthurt level. (temp, unclear about max level) static const char* mood_strings[MOODS_TOTAL] = {[0] = "Happy", [1] = "Ok", [2] = "Bad"}; -static const IconName portrait_happy[BUTTHURT_MAX] = { - I_passport_happy1_43x45, - I_passport_happy2_43x45, - I_passport_happy3_43x45}; -static const IconName portrait_ok[BUTTHURT_MAX] = { - I_passport_okay1_43x45, - I_passport_okay2_43x45, - I_passport_okay3_43x45}; -static const IconName portrait_bad[BUTTHURT_MAX] = { - I_passport_bad1_43x45, - I_passport_bad2_43x45, - I_passport_bad3_43x45}; -static const IconName* portraits[MOODS_TOTAL] = {portrait_happy, portrait_ok, portrait_bad}; +static const Icon* portrait_happy[BUTTHURT_MAX] = { + &I_passport_happy1_43x45, + &I_passport_happy2_43x45, + &I_passport_happy3_43x45}; +static const Icon* portrait_ok[BUTTHURT_MAX] = { + &I_passport_okay1_43x45, + &I_passport_okay2_43x45, + &I_passport_okay3_43x45}; +static const Icon* portrait_bad[BUTTHURT_MAX] = { + &I_passport_bad1_43x45, + &I_passport_bad2_43x45, + &I_passport_bad3_43x45}; +static const Icon** portraits[MOODS_TOTAL] = {portrait_happy, portrait_ok, portrait_bad}; static void input_callback(InputEvent* input_event, void* ctx) { osMessageQueueId_t event_queue = ctx; @@ -61,8 +61,8 @@ static void render_callback(Canvas* canvas, void* ctx) { canvas_clear(canvas); // multipass - canvas_draw_icon_name(canvas, 0, 0, I_PassportLeft_6x47); - canvas_draw_icon_name(canvas, 0, 47, I_PassportBottom_128x17); + canvas_draw_icon(canvas, 0, 0, &I_PassportLeft_6x47); + canvas_draw_icon(canvas, 0, 47, &I_PassportBottom_128x17); canvas_draw_line(canvas, 6, 0, 125, 0); canvas_draw_line(canvas, 127, 2, 127, 47); canvas_draw_dot(canvas, 126, 1); @@ -75,7 +75,7 @@ static void render_callback(Canvas* canvas, void* ctx) { canvas_draw_line(canvas, 53, 5, 55, 7); // portrait - canvas_draw_icon_name(canvas, 10, 9, portraits[butthurt][portrait_level]); + canvas_draw_icon(canvas, 10, 9, portraits[butthurt][portrait_level]); canvas_draw_line(canvas, 59, 18, 124, 18); canvas_draw_line(canvas, 59, 31, 124, 31); canvas_draw_line(canvas, 59, 44, 124, 44); diff --git a/applications/dolphin/scenes/assets/items.c b/applications/dolphin/scenes/assets/items.c index 4426d3a3..b23e0b1d 100644 --- a/applications/dolphin/scenes/assets/items.c +++ b/applications/dolphin/scenes/assets/items.c @@ -7,7 +7,7 @@ const Item TV = { .timeout = 10, .x = 160, .y = 34, - .icon = I_TV_20x24, + .icon = &I_TV_20x24, .action_name = "Use", .draw = draw_tv, .callback = smash_tv}; @@ -17,7 +17,7 @@ const Item Painting = { .timeout = 20, .x = 160, .y = 10, - .icon = I_Home_painting_17x20, + .icon = &I_Home_painting_17x20, .action_name = "Inspect", .draw = NULL, .callback = inspect_painting}; @@ -27,7 +27,7 @@ const Item Sofa = { .timeout = 100, .x = 250, .y = 34, - .icon = I_Sofa_40x13, + .icon = &I_Sofa_40x13, .action_name = "Sit", .draw = NULL, .callback = sofa_sit}; @@ -37,7 +37,7 @@ const Item PC = { .timeout = 100, .x = 400, .y = 10, - .icon = I_PC_22x29, + .icon = &I_PC_22x29, .action_name = "Use", .draw = NULL, .callback = pc_callback}; @@ -111,8 +111,8 @@ void smash_tv(Canvas* canvas, void* state) { SceneState* s = state; s->player_flipped = true; canvas_set_bitmap_mode(canvas, true); - canvas_draw_icon_name( - canvas, ((TV.x - 5) - s->player_global.x) * PARALLAX(TV.layer), TV.y - 2, I_FX_Bang_32x6); + canvas_draw_icon( + canvas, ((TV.x - 5) - s->player_global.x) * PARALLAX(TV.layer), TV.y - 2, &I_FX_Bang_32x6); canvas_set_bitmap_mode(canvas, false); if(s->action_timeout < TV.timeout - 2) { elements_multiline_text_framed(canvas, 80, 24, "Bang!"); @@ -124,8 +124,8 @@ void sofa_sit(Canvas* canvas, void* state) { SceneState* s = state; // temp fix pos s->player_global.x = 154; - s->dolphin_gfx = A_FX_Sitting_40x27; - s->dolphin_gfx_b = I_FX_SittingB_40x27; + s->dolphin_gfx = &A_FX_Sitting_40x27; + s->dolphin_gfx_b = &I_FX_SittingB_40x27; } void inspect_painting(Canvas* canvas, void* state) { diff --git a/applications/dolphin/scenes/scene.h b/applications/dolphin/scenes/scene.h index a1b4c1d4..a803eeed 100644 --- a/applications/dolphin/scenes/scene.h +++ b/applications/dolphin/scenes/scene.h @@ -66,7 +66,7 @@ typedef struct { uint16_t timeout; int32_t x; int32_t y; - IconName icon; + const Icon* icon; char action_name[16]; void (*draw)(Canvas* canvas, void* model); void (*callback)(Canvas* canvas, void* model); @@ -79,8 +79,8 @@ typedef struct { Vec2 player_v; Vec2 screen; - IconName dolphin_gfx; - IconName dolphin_gfx_b; // temp + const Icon* dolphin_gfx; + const Icon* dolphin_gfx_b; // temp bool player_flipped; bool use_pending; diff --git a/applications/dolphin/scenes/scene_gfx.c b/applications/dolphin/scenes/scene_gfx.c index f07c2efd..0d279345 100644 --- a/applications/dolphin/scenes/scene_gfx.c +++ b/applications/dolphin/scenes/scene_gfx.c @@ -104,37 +104,37 @@ void dolphin_scene_render_dolphin(SceneState* state, Canvas* canvas) { furi_assert(canvas); if(state->scene_zoom == SCENE_ZOOM) { - state->dolphin_gfx = I_DolphinExcited_64x63; + state->dolphin_gfx = &I_DolphinExcited_64x63; } else if(state->action == SLEEP && state->player_global.x == 154) { // 2do - sofa x pos getter - state->dolphin_gfx = A_FX_Sitting_40x27; - state->dolphin_gfx_b = I_FX_SittingB_40x27; + state->dolphin_gfx = &A_FX_Sitting_40x27; + state->dolphin_gfx_b = &I_FX_SittingB_40x27; } else if(state->action != INTERACT) { if(state->player_v.x < 0 || state->player_flipped) { if(state->player_anim == 0) { - state->dolphin_gfx = I_WalkL1_32x32; - state->dolphin_gfx_b = I_WalkLB1_32x32; + state->dolphin_gfx = &I_WalkL1_32x32; + state->dolphin_gfx_b = &I_WalkLB1_32x32; } else { - state->dolphin_gfx = I_WalkL2_32x32; - state->dolphin_gfx_b = I_WalkLB2_32x32; + state->dolphin_gfx = &I_WalkL2_32x32; + state->dolphin_gfx_b = &I_WalkLB2_32x32; } } else if(state->player_v.x > 0 || !state->player_flipped) { if(state->player_anim == 0) { - state->dolphin_gfx = I_WalkR1_32x32; - state->dolphin_gfx_b = I_WalkRB1_32x32; + state->dolphin_gfx = &I_WalkR1_32x32; + state->dolphin_gfx_b = &I_WalkRB1_32x32; } else { - state->dolphin_gfx = I_WalkR2_32x32; - state->dolphin_gfx_b = I_WalkRB2_32x32; + state->dolphin_gfx = &I_WalkR2_32x32; + state->dolphin_gfx_b = &I_WalkRB2_32x32; } } } canvas_set_bitmap_mode(canvas, true); canvas_set_color(canvas, ColorWhite); - canvas_draw_icon_name(canvas, state->player.x, state->player.y, state->dolphin_gfx_b); + canvas_draw_icon(canvas, state->player.x, state->player.y, state->dolphin_gfx_b); canvas_set_color(canvas, ColorBlack); - canvas_draw_icon_name(canvas, state->player.x, state->player.y, state->dolphin_gfx); + canvas_draw_icon(canvas, state->player.x, state->player.y, state->dolphin_gfx); canvas_set_bitmap_mode(canvas, false); } @@ -158,7 +158,7 @@ void dolphin_scene_render(SceneState* state, Canvas* canvas, uint32_t t) { if(current_scene[i]->draw) current_scene[i]->draw(canvas, state); if(l == current_scene[i]->layer) { - canvas_draw_icon_name( + canvas_draw_icon( canvas, item_pos * PARALLAX(l), current_scene[i]->y, |