static void _render_button(GRAPHICS_CONTROLLER *gc, BD_IG_BUTTON *button, BD_PG_PALETTE *palette, int state) { BD_PG_OBJECT *object = NULL; BD_OVERLAY ov; object = _find_object_for_button(gc->igs, button, state); if (!object) { TRACE("_render_button(#%d): object (state %d) not found\n", button->id, state); return; } ov.pts = -1; ov.plane = 1; /* IG */ ov.x = button->x_pos; ov.y = button->y_pos; ov.w = object->width; ov.h = object->height; ov.img = object->img; ov.palette = palette->entry; if (gc->overlay_proc) { gc->overlay_proc(gc->overlay_proc_handle, &ov); } }
static int _mouse_move(GRAPHICS_CONTROLLER *gc, unsigned x, unsigned y, GC_NAV_CMDS *cmds) { PG_DISPLAY_SET *s = gc->igs; BD_IG_PAGE *page = 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 new_btn_id = 0xffff; unsigned ii; gc->valid_mouse_position = 0; page = _find_page(&s->ics->interactive_composition, page_id); if (!page) { ERROR("_mouse_move(): unknown page #%d (have %d pages)\n", page_id, s->ics->interactive_composition.num_pages); return -1; } 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 = _find_button_bog(bog, valid_id); if (!button) continue; if (x < button->x_pos || y < button->y_pos) continue; /* Check for SELECTED state object (button that can be selected) */ BD_PG_OBJECT *object = _find_object_for_button(s, button, BTN_SELECTED); if (!object) continue; if (x >= button->x_pos + object->width || y >= button->y_pos + object->height) continue; /* mouse is over button */ /* is button already selected? */ if (button->id == cur_btn_id) { gc->valid_mouse_position = 1; return 0; } new_btn_id = button->id; break; } if (new_btn_id != 0xffff) { bd_psr_write(gc->regs, PSR_SELECTED_BUTTON_ID, new_btn_id); _render_page(gc, -1, cmds); gc->valid_mouse_position = 1; } return gc->valid_mouse_position; }
static void _render_button(GRAPHICS_CONTROLLER *gc, BD_IG_BUTTON *button, BD_PG_PALETTE *palette, int state, BOG_DATA *bog_data) { BD_PG_OBJECT *object = _find_object_for_button(gc->igs, button, state, bog_data); if (!object) { GC_TRACE("_render_button(#%d): object (state %d) not found\n", button->id, state); _clear_bog_area(gc, bog_data); 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; } /* new object is smaller than already drawn one ? -> need to render background */ if (bog_data->w > object->width || bog_data->h > object->height) { /* make sure we won't wipe other buttons */ unsigned ii, skip = 0; for (ii = 0; &gc->bog_data[ii] != bog_data; ii++) { if (_areas_overlap(bog_data, &gc->bog_data[ii])) skip = 1; /* FIXME: clean non-overlapping area */ } GC_TRACE("object size changed, %sclearing background at %d,%d %dx%d\n", skip ? " ** NOT ** " : "", bog_data->x, bog_data->y, bog_data->w, bog_data->h); if (!skip) { _clear_bog_area(gc, bog_data); } } 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); bog_data->x = button->x_pos; 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; }