libbluray | branch: master | hpi1 <[email protected]> | Thu Dec 8 15:45:17 2011 +0200| [97fbd5e2d72befa30b87f07fd61ce431b5c17488] | committer: hpi1
Optimized HDMV menu drawing: do not redraw already visible objects > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=97fbd5e2d72befa30b87f07fd61ce431b5c17488 --- ChangeLog | 1 + src/libbluray/decoders/graphics_controller.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 0 deletions(-) diff --git a/ChangeLog b/ChangeLog index 006e4b9..258be26 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,5 @@ ????-??-??: + - Optimized HDMV menu rendering - Support for sound effects in HDMV menus - Fixes to HDMV menu decoding - Distribute BD-J code diff --git a/src/libbluray/decoders/graphics_controller.c b/src/libbluray/decoders/graphics_controller.c index 118c5ac..b141635 100644 --- a/src/libbluray/decoders/graphics_controller.c +++ b/src/libbluray/decoders/graphics_controller.c @@ -43,6 +43,7 @@ typedef struct { uint16_t enabled_button; /* enabled button id */ uint16_t x, y, w, h; /* button rect on overlay plane (if drawn) */ + int visible_object_id; /* id of currently visible object */ int animate_indx; /* currently showing object index of animated button, < 0 for static buttons */ } BOG_DATA; @@ -342,6 +343,7 @@ static void _reset_page_state(GRAPHICS_CONTROLLER *gc) for (ii = 0; ii < page->num_bogs; ii++) { gc->bog_data[ii].enabled_button = page->bog[ii].default_valid_button_id_ref; gc->bog_data[ii].animate_indx = 0; + gc->bog_data[ii].visible_object_id = -1; } } @@ -437,6 +439,7 @@ static void _clear_bog_area(GRAPHICS_CONTROLLER *gc, BOG_DATA *bog_data) _clear_osd_area(gc, BD_OVERLAY_IG, bog_data->x, bog_data->y, bog_data->w, bog_data->h); bog_data->x = bog_data->y = bog_data->w = bog_data->h = 0; + bog_data->visible_object_id = -1; gc->ig_dirty = 1; } @@ -655,6 +658,22 @@ static void _render_button(GRAPHICS_CONTROLLER *gc, BD_IG_BUTTON *button, BD_PG_ return; } + /* object already rendered ? */ + if (bog_data->visible_object_id == object->id && + bog_data->x == button->x_pos && bog_data->y == button->y_pos && + bog_data->w == object->width && bog_data->h == object->height) { + + GC_TRACE("skipping already rendered button #%d (object #%d at %d,%d %dx%d)\n", + button->id, object->id, + button->x_pos, button->y_pos, object->width, object->height); + + return; + } + + GC_TRACE("render button #%d using object #%d at %d,%d %dx%d\n", + button->id, object->id, + button->x_pos, button->y_pos, object->width, object->height); + _render_object(gc, -1, BD_OVERLAY_IG, button->x_pos, button->y_pos, object, palette); @@ -663,6 +682,7 @@ static void _render_button(GRAPHICS_CONTROLLER *gc, BD_IG_BUTTON *button, BD_PG_ bog_data->y = button->y_pos; bog_data->w = object->width; bog_data->h = object->height; + bog_data->visible_object_id = object->id; gc->ig_drawn = 1; gc->ig_dirty = 1; _______________________________________________ libbluray-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libbluray-devel
