libbluray | branch: master | hpi1 <[email protected]> | Mon Nov 15 16:19:48 2010 +0200| [3fe2b52a61cc1ebea2be0471189e27d6617a21a7] | committer: hpi1
Implemented GC_CTRL_ENABLE_BUTTON and GC_CTRL_DISABLE_BUTTON > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=3fe2b52a61cc1ebea2be0471189e27d6617a21a7 --- src/libbluray/decoders/graphics_controller.c | 48 +++++++++++++++++++++++++- 1 files changed, 47 insertions(+), 1 deletions(-) diff --git a/src/libbluray/decoders/graphics_controller.c b/src/libbluray/decoders/graphics_controller.c index 6e09247..1f791b3 100644 --- a/src/libbluray/decoders/graphics_controller.c +++ b/src/libbluray/decoders/graphics_controller.c @@ -556,6 +556,49 @@ static void _set_button_page(GRAPHICS_CONTROLLER *gc, uint32_t param, GC_NAV_CMD _render_page(gc, 0xffff, cmds); } +static void _enable_button(GRAPHICS_CONTROLLER *gc, uint32_t button_id, unsigned enable) +{ + PG_DISPLAY_SET *s = gc->igs; + BD_IG_PAGE *page = NULL; + BD_IG_BUTTON *button = NULL; + unsigned page_id = bd_psr_read(gc->regs, PSR_MENU_PAGE_ID); + unsigned cur_btn_id = bd_psr_read(gc->regs, PSR_SELECTED_BUTTON_ID); + unsigned bog_idx = 0; + + TRACE("_enable_button(#%d, %s)\n", button_id, enable ? "enable" : "disable"); + + page = _find_page(&s->ics->interactive_composition, page_id); + if (!page) { + TRACE("_enable_button(): unknown page #%d (have %d pages)\n", + page_id, s->ics->interactive_composition.num_pages); + return; + } + + /* find correct button overlap group */ + button = _find_button_page(page, button_id, &bog_idx); + if (!button) { + TRACE("_enable_button(): unknown button #%d (page #%d)\n", button_id, page_id); + return; + } + + if (enable) { + if (gc->enabled_button[bog_idx] == cur_btn_id) { + /* selected button goes to disabled state */ + bd_psr_write(gc->regs, PSR_SELECTED_BUTTON_ID, 0x10000|button_id); + } + gc->enabled_button[bog_idx] = button_id; + + } else { + if (gc->enabled_button[bog_idx] == button_id) { + gc->enabled_button[bog_idx] = 0xffff; + } + + if (cur_btn_id == button_id) { + bd_psr_write(gc->regs, PSR_SELECTED_BUTTON_ID, 0xffff); + } + } +} + void gc_run(GRAPHICS_CONTROLLER *gc, gc_ctrl_e ctrl, uint32_t param, GC_NAV_CMDS *cmds) { if (cmds) { @@ -612,8 +655,11 @@ void gc_run(GRAPHICS_CONTROLLER *gc, gc_ctrl_e ctrl, uint32_t param, GC_NAV_CMDS break; case GC_CTRL_ENABLE_BUTTON: + _enable_button(gc, param, 1); + break; + case GC_CTRL_DISABLE_BUTTON: - ERROR("run_gc(): unhandled case %d\n", ctrl); + _enable_button(gc, param, 0); break; } } _______________________________________________ libbluray-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libbluray-devel
