Add reveal animation

This commit is contained in:
Vojtech Bocek
2014-07-21 20:42:23 +02:00
parent f2b656f494
commit 74e768a75c
4 changed files with 50 additions and 6 deletions

View File

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

View File

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

View File

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

View File

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