Merge pull request #858 from lakkatv/lakka

(Lakka) Better way to prevent offscreen drawing
This commit is contained in:
Twinaphex 2014-08-08 17:07:03 +02:00
commit 64e2a8134b
3 changed files with 32 additions and 27 deletions

View File

@ -173,6 +173,7 @@ static void lakka_open_submenu(void)
{
int i, j, k;
add_tween(DELAY, -HSPACING * (menu_active_category+1), &all_categories_x, &inOutQuad, NULL);
add_tween(DELAY, 1.0, &arrow_alpha, &inOutQuad, NULL);
// Reset contextual menu style
lakka_reset_submenu();
@ -221,6 +222,7 @@ static void lakka_close_submenu(void)
{
int i, j, k;
add_tween(DELAY, -HSPACING * menu_active_category, &all_categories_x, &inOutQuad, NULL);
add_tween(DELAY, 0.0, &arrow_alpha, &inOutQuad, NULL);
for (i = 0; i < num_categories; i++)
{

View File

@ -49,6 +49,7 @@ int num_categories = 0;
int menu_active_category = 0;
float all_categories_x = 0;
float global_alpha = 0;
float arrow_alpha = 0;
float HSPACING;
float VSPACING;
float C_ACTIVE_ZOOM;
@ -302,22 +303,24 @@ static void update_tweens(float dt)
static void lakka_draw_text(const char *str, float x, float y, float scale, float alpha)
{
if (alpha > global_alpha)
alpha = global_alpha;
if (alpha == 0)
return;
gl_t *gl = (gl_t*)driver.video_data;
if (!gl)
return;
if (x < -ICON_SIZE || x > gl->win_width + ICON_SIZE || y < -ICON_SIZE || y > gl->win_height + ICON_SIZE)
return;
gl_set_viewport(gl, gl->win_width, gl->win_height, false, false);
struct font_params params = {0};
params.x = x / gl->win_width;
params.y = 1.0f - y / gl->win_height;
if (alpha > global_alpha)
alpha = global_alpha;
// Workaround https://github.com/libretro/RetroArch/blob/master/gfx/fonts/gl_raster_font.c#L216
if (alpha < 0.05)
alpha = 0.05;
params.scale = scale;
params.color = FONT_COLOR_RGBA(255, 255, 255, (uint8_t)(255 * alpha));
params.full_screen = true;
@ -365,6 +368,17 @@ void lakka_draw_icon(GLuint texture, float x, float y, float alpha, float rotati
if (alpha > global_alpha)
alpha = global_alpha;
if (alpha == 0)
return;
gl_t *gl = (gl_t*)driver.video_data;
if (!gl)
return;
if (x < -ICON_SIZE || x > gl->win_width + ICON_SIZE || y < -ICON_SIZE || y > gl->win_height + ICON_SIZE)
return;
GLfloat color[] = {
1.0f, 1.0f, 1.0f, alpha,
1.0f, 1.0f, 1.0f, alpha,
@ -372,11 +386,6 @@ void lakka_draw_icon(GLuint texture, float x, float y, float alpha, float rotati
1.0f, 1.0f, 1.0f, alpha,
};
gl_t *gl = (gl_t*)driver.video_data;
if (!gl)
return;
glViewport(x, gl->win_height - y, ICON_SIZE, ICON_SIZE);
glEnable(GL_BLEND);
@ -477,9 +486,8 @@ static void lakka_draw_items(int i)
if (!item)
continue;
if (i == menu_active_category &&
j > active_category->active_item - 5 &&
j < active_category->active_item + 10) // performance improvement
if (i >= menu_active_category - 1 &&
i <= menu_active_category + 1) // performance improvement
{
lakka_draw_icon(category->item_icon,
MARGIN_LEFT + HSPACING*(i+1) + all_categories_x - ICON_SIZE/2.0,
@ -545,20 +553,14 @@ static void lakka_frame(void)
lakka_draw_categories();
if (depth == 0)
{
if (active_category)
lakka_draw_text(active_category->name, TITLE_MARGIN_LEFT, TITLE_MARGIN_TOP, 1, 1.0);
}
else
{
if (active_item)
lakka_draw_text(active_item->name, TITLE_MARGIN_LEFT, TITLE_MARGIN_TOP, 1, 1.0);
if (depth == 0 && active_category)
lakka_draw_text(active_category->name, TITLE_MARGIN_LEFT, TITLE_MARGIN_TOP, 1, 1.0);
else if (active_item)
lakka_draw_text(active_item->name, TITLE_MARGIN_LEFT, TITLE_MARGIN_TOP, 1, 1.0);
lakka_draw_icon(textures[TEXTURE_ARROW].id,
MARGIN_LEFT + HSPACING*(menu_active_category+1) + all_categories_x + ICON_SIZE/2.0,
MARGIN_TOP + VSPACING*ACTIVE_ITEM_FACTOR + ICON_SIZE/2.0, 1, 0, I_ACTIVE_ZOOM);
}
lakka_draw_icon(textures[TEXTURE_ARROW].id,
MARGIN_LEFT + HSPACING*(menu_active_category+1) + all_categories_x + ICON_SIZE/2.0,
MARGIN_TOP + VSPACING*ACTIVE_ITEM_FACTOR + ICON_SIZE/2.0, arrow_alpha, 0, I_ACTIVE_ZOOM);
gl_set_viewport(gl, gl->win_width, gl->win_height, false, false);
}

View File

@ -29,6 +29,7 @@ extern int num_categories;
extern float all_categories_x;
extern int menu_active_category;
extern float global_alpha;
extern float arrow_alpha;
extern float HSPACING;
extern float VSPACING;
extern float C_ACTIVE_ZOOM;