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
This commit is contained in:
あく
2021-07-07 11:57:49 +03:00
committed by GitHub
parent 607e873404
commit a7283280ef
82 changed files with 1093 additions and 1053 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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) {

View File

@@ -45,7 +45,7 @@ typedef struct {
} DolphinViewLockMenuModel;
typedef struct {
Icon* animation;
IconAnimation* animation;
uint8_t scene_num;
uint8_t hint_timeout;
bool locked;

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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,