void set_visible_area(int min_x, int max_x, int min_y, int max_y) { if ( Machine->visible_area.min_x == min_x && Machine->visible_area.max_x == max_x && Machine->visible_area.min_y == min_y && Machine->visible_area.max_y == max_y) return; /* "dirty" the area for the next display update */ visible_area_changed = 1; /* bounds check */ if (!(Machine->drv->video_attributes & VIDEO_TYPE_VECTOR) && scrbitmap[0]) if ((min_x < 0) || (min_y < 0) || (max_x >= scrbitmap[0]->width) || (max_y >= scrbitmap[0]->height)) { fatalerror("set_visible_area(%d,%d,%d,%d) out of bounds; bitmap dimensions are (%d,%d)", min_x, min_y, max_x, max_y, scrbitmap[0]->width, scrbitmap[0]->height); } /* set the new values in the Machine struct */ Machine->visible_area.min_x = min_x; Machine->visible_area.max_x = max_x; Machine->visible_area.min_y = min_y; Machine->visible_area.max_y = max_y; /* vector games always use the whole bitmap */ if (Machine->drv->video_attributes & VIDEO_TYPE_VECTOR) { Machine->absolute_visible_area.min_x = 0; Machine->absolute_visible_area.max_x = scrbitmap[0]->width - 1; Machine->absolute_visible_area.min_y = 0; Machine->absolute_visible_area.max_y = scrbitmap[0]->height - 1; } /* raster games need to use the visible area */ else Machine->absolute_visible_area = Machine->visible_area; /* recompute scanline timing */ cpu_compute_scanline_timing(); /* set UI visible area */ ui_set_visible_area(Machine->absolute_visible_area.min_x, Machine->absolute_visible_area.min_y, Machine->absolute_visible_area.max_x, Machine->absolute_visible_area.max_y); }
void osd_update_video_and_audio(mame_display *display) { int i; double time_limit; double current_time; int cpunum; /* if the visible area has changed, update it */ if (display->changed_flags & GAME_VISIBLE_AREA_CHANGED) { ui_set_visible_area(display->game_visible_area.min_x, display->game_visible_area.min_y, display->game_visible_area.max_x, display->game_visible_area.max_y); } /* is this the first update? if so, eat it */ if (!seen_first_update) { seen_first_update = TRUE; return; } /* if we have already aborted or completed, our work is done */ if ((state == STATE_ABORTED) || (state == STATE_DONE)) return; /* have we hit the time limit? */ current_time = timer_get_time(); time_limit = (current_testcase.time_limit != 0.0) ? current_testcase.time_limit : TIME_IN_SEC(600); if (current_time > time_limit) { state = STATE_ABORTED; report_message(MSG_FAILURE, "Time limit of %.2f seconds exceeded", time_limit); return; } /* update the runtime hash */ if (0) { for (cpunum = 0; cpunum < cpu_gettotalcpu(); cpunum++) { runtime_hash *= 57; runtime_hash ^= cpunum_get_reg(cpunum, REG_PC); /* TODO - Add more registers? */ } } for (i = 0; i < sizeof(commands) / sizeof(commands[i]); i++) { if (current_command->command_type == commands[i].command_type) { commands[i].proc(); break; } } /* if we are ready for the next command, advance to it */ if (state == STATE_READY) { /* if we are at the end, and we are dumping screenshots, and we didn't * just dump a screenshot, dump one now */ if ((test_flags & MESSTEST_ALWAYS_DUMP_SCREENSHOT) && (current_command[0].command_type != MESSTEST_COMMAND_SCREENSHOT) && (current_command[1].command_type == MESSTEST_COMMAND_END)) { dump_screenshot(TRUE); } current_command++; } }