static int _render_page(GRAPHICS_CONTROLLER *gc, unsigned activated_button_id, GC_NAV_CMDS *cmds) { PG_DISPLAY_SET *s = gc->igs; BD_IG_PAGE *page = NULL; BD_PG_PALETTE *palette = NULL; unsigned page_id = bd_psr_read(gc->regs, PSR_MENU_PAGE_ID); unsigned ii; unsigned selected_button_id = bd_psr_read(gc->regs, PSR_SELECTED_BUTTON_ID); if (s->ics->interactive_composition.ui_model == IG_UI_MODEL_POPUP && !gc->popup_visible) { if (gc->ig_open) { GC_TRACE("_render_page(): popup menu not visible\n"); _close_osd(gc, BD_OVERLAY_IG); return 1; } return 0; } page = _find_page(&s->ics->interactive_composition, page_id); if (!page) { GC_ERROR("_render_page: unknown page id %d (have %d pages)\n", page_id, s->ics->interactive_composition.num_pages); return -1; } palette = _find_palette(s, page->palette_id_ref); if (!palette) { GC_ERROR("_render_page: unknown palette id %d (have %d palettes)\n", page->palette_id_ref, s->num_palette); return -1; } GC_TRACE("rendering page #%d using palette #%d. page has %d bogs\n", page->id, page->palette_id_ref, page->num_bogs); if (!gc->ig_open) { _open_osd(gc, BD_OVERLAY_IG, s->ics->video_descriptor.video_width, s->ics->video_descriptor.video_height); } for (ii = 0; ii < page->num_bogs; ii++) { BD_IG_BOG *bog = &page->bog[ii]; unsigned valid_id = gc->bog_data[ii].enabled_button; BD_IG_BUTTON *button; button = _find_button_bog(bog, valid_id); if (!button) { GC_TRACE("_render_page(): bog %d: button %d not found\n", ii, valid_id); // render background _clear_bog_area(gc, &gc->bog_data[ii]); } else if (button->id == activated_button_id) { GC_TRACE(" button #%d activated\n", button->id); _render_button(gc, button, palette, BTN_ACTIVATED, &gc->bog_data[ii]); } else if (button->id == selected_button_id) { if (button->auto_action_flag && !gc->auto_action_triggered) { if (cmds) { GC_TRACE(" auto-activate #%d\n", button->id); cmds->num_nav_cmds = button->num_nav_cmds; cmds->nav_cmds = button->nav_cmds; gc->auto_action_triggered = 1; } else { GC_ERROR(" auto-activate #%d not triggered (!cmds)\n", button->id); } _render_button(gc, button, palette, BTN_ACTIVATED, &gc->bog_data[ii]); } else { _render_button(gc, button, palette, BTN_SELECTED, &gc->bog_data[ii]); } } else { _render_button(gc, button, palette, BTN_NORMAL, &gc->bog_data[ii]); } } if (gc->ig_dirty) { _flush_osd(gc, BD_OVERLAY_IG, -1); gc->ig_dirty = 0; return 1; } return 0; }
static void _render_page(GRAPHICS_CONTROLLER *gc, unsigned activated_button_id, GC_NAV_CMDS *cmds) { PG_DISPLAY_SET *s = gc->igs; BD_IG_PAGE *page = NULL; BD_PG_PALETTE *palette = NULL; unsigned page_id = bd_psr_read(gc->regs, PSR_MENU_PAGE_ID); unsigned ii; unsigned selected_button_id = bd_psr_read(gc->regs, PSR_SELECTED_BUTTON_ID); if (s->ics->interactive_composition.ui_model == IG_UI_MODEL_POPUP && !gc->popup_visible) { TRACE("_render_page(): popup menu not visible\n"); _gc_clear_osd(gc, 1); return; } page = _find_page(&s->ics->interactive_composition, page_id); if (!page) { ERROR("_render_page: unknown page id %d (have %d pages)\n", page_id, s->ics->interactive_composition.num_pages); return; } palette = _find_palette(s, page->palette_id_ref); if (!palette) { ERROR("_render_page: unknown palette id %d (have %d palettes)\n", page->palette_id_ref, s->num_palette); return; } TRACE("rendering page #%d using palette #%d. page has %d bogs\n", page->id, page->palette_id_ref, page->num_bogs); if (selected_button_id == 0xffff) { selected_button_id = page->default_selected_button_id_ref; } for (ii = 0; ii < page->num_bogs; ii++) { BD_IG_BOG *bog = &page->bog[ii]; unsigned valid_id = gc->enabled_button[ii]; BD_IG_BUTTON *button; button = _find_button_bog(bog, valid_id); if (!button) { TRACE("_render_page(): bog %d: button %d not found\n", ii, valid_id); } else if (button->id == activated_button_id) { _render_button(gc, button, palette, BTN_ACTIVATED); } else if (button->id == selected_button_id) { _render_button(gc, button, palette, BTN_SELECTED); bd_psr_write(gc->regs, PSR_SELECTED_BUTTON_ID, selected_button_id); if (button->auto_action_flag) { cmds->num_nav_cmds = button->num_nav_cmds; cmds->nav_cmds = button->nav_cmds; } } else { _render_button(gc, button, palette, BTN_NORMAL); } } }