Add reveal animation
This commit is contained in:
@@ -84,6 +84,15 @@ static int impl_open(struct framebuffer *fb)
|
||||
fb->vi.vmode = FB_VMODE_NONINTERLACED;
|
||||
fb->vi.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE;
|
||||
|
||||
// mmap and memset to 0 before setting the vi to prevent screen flickering during init
|
||||
px_type *mapped = mmap(0, fb->fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb->fd, 0);
|
||||
|
||||
if (mapped == MAP_FAILED)
|
||||
return -1;
|
||||
|
||||
memset(mapped, 0, fb->fi.smem_len);
|
||||
munmap(mapped, fb->fi.smem_len);
|
||||
|
||||
if (ioctl(fb->fd, FBIOPUT_VSCREENINFO, &fb->vi) < 0)
|
||||
{
|
||||
ERROR("failed to set fb0 vi info");
|
||||
@@ -93,7 +102,7 @@ static int impl_open(struct framebuffer *fb)
|
||||
if (ioctl(fb->fd, FBIOGET_FSCREENINFO, &fb->fi) < 0)
|
||||
return -1;
|
||||
|
||||
px_type *mapped = mmap(0, fb->fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb->fd, 0);
|
||||
mapped = mmap(0, fb->fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb->fd, 0);
|
||||
|
||||
if (mapped == MAP_FAILED)
|
||||
return -1;
|
||||
|
||||
@@ -88,6 +88,14 @@ static void list_block(char *path, int rec)
|
||||
closedir(d);
|
||||
}
|
||||
|
||||
static void reveal_rect_alpha_step(void *data, float interpolated)
|
||||
{
|
||||
fb_rect *r = data;
|
||||
interpolated = 1.f - interpolated;
|
||||
r->color = (r->color & ~(0xFF << 24)) | (((int)(0xFF*interpolated)) << 24);
|
||||
fb_request_draw();
|
||||
}
|
||||
|
||||
int multirom_ui(struct multirom_status *s, struct multirom_rom **to_boot)
|
||||
{
|
||||
if(multirom_init_fb(s->rotation) < 0)
|
||||
@@ -135,10 +143,19 @@ int multirom_ui(struct multirom_status *s, struct multirom_rom **to_boot)
|
||||
multirom_set_brightness(s->brightness);
|
||||
|
||||
fb_freeze(0);
|
||||
fb_force_draw();
|
||||
|
||||
if(s->auto_boot_rom && s->auto_boot_seconds > 0)
|
||||
multirom_ui_auto_boot();
|
||||
else
|
||||
{
|
||||
fb_rect *r = fb_add_rect_lvl(1000, 0, 0, fb_width, fb_height, BLACK);
|
||||
call_anim *a = call_anim_create(r, reveal_rect_alpha_step, 500, INTERPOLATOR_ACCELERATE);
|
||||
a->on_finished_call = fb_remove_item;
|
||||
a->on_finished_data = r;
|
||||
call_anim_add(a);
|
||||
}
|
||||
|
||||
fb_request_draw();
|
||||
|
||||
while(1)
|
||||
{
|
||||
@@ -432,7 +449,7 @@ static void multirom_ui_auto_boot_tick(void *data)
|
||||
}
|
||||
else
|
||||
{
|
||||
snprintf(buff, sizeof(buff), "Booting in %d second%s.", d->seconds, d->seconds != 1 ? "s" : "");
|
||||
snprintf(buff, sizeof(buff), "ROM: %s\n\nBooting in %d second%s.", mrom_status->auto_boot_rom->name, d->seconds, d->seconds != 1 ? "s" : "");
|
||||
ncard_set_text(d->b, buff);
|
||||
ncard_show(d->b, 0);
|
||||
|
||||
@@ -454,10 +471,11 @@ void multirom_ui_auto_boot(void)
|
||||
|
||||
ncard_set_pos(b, NCARD_POS_CENTER);
|
||||
ncard_set_cancelable(b, 1);
|
||||
ncard_set_title(b, mrom_status->auto_boot_rom->name);
|
||||
ncard_set_title(b, "Auto-boot");
|
||||
ncard_add_btn(b, BTN_NEGATIVE, "Cancel", ncard_hide_callback, NULL);
|
||||
ncard_add_btn(b, BTN_POSITIVE, "Boot now", multirom_ui_auto_boot_now, d);
|
||||
ncard_set_on_hidden(b, multirom_ui_auto_boot_hidden, d);
|
||||
ncard_set_from_black(b, 1);
|
||||
|
||||
multirom_ui_auto_boot_tick(d);
|
||||
}
|
||||
|
||||
@@ -91,6 +91,11 @@ void ncard_set_on_hidden(ncard_builder *b, ncard_callback callback, void *data)
|
||||
b->on_hidden_data = data;
|
||||
}
|
||||
|
||||
void ncard_set_from_black(ncard_builder *b, int from_black)
|
||||
{
|
||||
b->reveal_from_black = from_black;
|
||||
}
|
||||
|
||||
static int ncard_calc_pos(ncard_builder* b, int max_y)
|
||||
{
|
||||
if(b->pos == NCARD_POS_AUTO)
|
||||
@@ -131,6 +136,7 @@ struct ncard
|
||||
int cancelable;
|
||||
ncard_callback on_hidden_call;
|
||||
void *on_hidden_data;
|
||||
int reveal_from_black;
|
||||
} ncard = {
|
||||
.bg = NULL,
|
||||
.shadow = NULL,
|
||||
@@ -144,6 +150,7 @@ struct ncard
|
||||
.cancelable = 0,
|
||||
.on_hidden_call = NULL,
|
||||
.on_hidden_data = NULL,
|
||||
.reveal_from_black = 0,
|
||||
};
|
||||
|
||||
static int ncard_touch_handler(touch_event *ev, void *data)
|
||||
@@ -214,7 +221,11 @@ static void ncard_move_step(void *data, float interpolated)
|
||||
interpolated = 1.f;
|
||||
if(c->hiding)
|
||||
interpolated = 1.f - interpolated;
|
||||
c->alpha_bg->color = (c->alpha_bg->color & ~(0xFF << 24)) | (((int)(0xCC*interpolated)) << 24);
|
||||
|
||||
if(!c->hiding && c->reveal_from_black)
|
||||
c->alpha_bg->color = (c->alpha_bg->color & ~(0xFF << 24)) | ((0xFF - (int)(0x33*interpolated)) << 24);
|
||||
else
|
||||
c->alpha_bg->color = (c->alpha_bg->color & ~(0xFF << 24)) | (((int)(0xCC*interpolated)) << 24);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -328,7 +339,10 @@ void ncard_show(ncard_builder *b, int destroy_builder)
|
||||
if(ncard.pos != NCARD_POS_CENTER)
|
||||
ncard.targetH *= 1.3;
|
||||
else if(!ncard.alpha_bg)
|
||||
ncard.alpha_bg = fb_add_rect_lvl(LEVEL_NCARD_SHADOW + lvl_offset - 1, 0, 0, fb_width, fb_height, 0x00000000);
|
||||
{
|
||||
ncard.alpha_bg = fb_add_rect_lvl(LEVEL_NCARD_SHADOW + lvl_offset - 1, 0, 0, fb_width, fb_height,
|
||||
b->reveal_from_black ? BLACK : 0x00000000);
|
||||
}
|
||||
|
||||
if(items_h >= ncard.bg->h)
|
||||
{
|
||||
@@ -377,6 +391,7 @@ void ncard_show(ncard_builder *b, int destroy_builder)
|
||||
ncard.cancelable = b->cancelable;
|
||||
ncard.on_hidden_call = b->on_hidden_call;
|
||||
ncard.on_hidden_data = b->on_hidden_data;
|
||||
ncard.reveal_from_black = b->reveal_from_black;
|
||||
|
||||
item_anim *a = item_anim_create(ncard.bg, 400, interpolator);
|
||||
switch(ncard.pos)
|
||||
|
||||
@@ -55,6 +55,7 @@ typedef struct
|
||||
int cancelable;
|
||||
ncard_callback on_hidden_call;
|
||||
void *on_hidden_data;
|
||||
int reveal_from_black;
|
||||
} ncard_builder;
|
||||
|
||||
ncard_builder *ncard_create_builder(void);
|
||||
@@ -65,6 +66,7 @@ void ncard_set_cancelable(ncard_builder *b, int cancelable);
|
||||
void ncard_avoid_item(ncard_builder *b, void *item);
|
||||
void ncard_add_btn(ncard_builder *b, int btn_type, const char *text, ncard_callback callback, void *callback_data);
|
||||
void ncard_set_on_hidden(ncard_builder *b, ncard_callback callback, void *data);
|
||||
void ncard_set_from_black(ncard_builder *b, int from_black);
|
||||
|
||||
void ncard_set_top_offset(int offset);
|
||||
void ncard_show(ncard_builder *b, int destroy_builder);
|
||||
|
||||
Reference in New Issue
Block a user