void video_manager::record_frame() { // ignore if nothing to do if (m_mngfile == NULL && m_avifile == NULL) return; // start the profiler and get the current time g_profiler.start(PROFILER_MOVIE_REC); attotime curtime = machine().time(); // create the bitmap create_snapshot_bitmap(NULL); // loop until we hit the right time while (m_movie_next_frame_time <= curtime) { // handle an AVI recording if (m_avifile != NULL) { // write the next frame avi_error avierr = avi_append_video_frame(m_avifile, m_snap_bitmap); if (avierr != AVIERR_NONE) { g_profiler.stop(); return end_recording(); } } // handle a MNG recording if (m_mngfile != NULL) { // set up the text fields in the movie info png_info pnginfo = { 0 }; if (m_movie_frame == 0) { astring text1(emulator_info::get_appname(), " ", build_version); astring text2(machine().system().manufacturer, " ", machine().system().description); png_add_text(&pnginfo, "Software", text1); png_add_text(&pnginfo, "System", text2); } // write the next frame const rgb_t *palette = (machine().palette != NULL) ? palette_entry_list_adjusted(machine().palette) : NULL; png_error error = mng_capture_frame(*m_mngfile, &pnginfo, m_snap_bitmap, machine().total_colors(), palette); png_free(&pnginfo); if (error != PNGERR_NONE) { g_profiler.stop(); return end_recording(); } } // advance time m_movie_next_frame_time += m_movie_frame_period; m_movie_frame++; } g_profiler.stop(); }
UINT32 toobin_state::screen_update_toobin(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap_ind8 &priority_bitmap = machine().priority_bitmap; const rgb_t *palette = palette_entry_list_adjusted(machine().palette); atarimo_rect_list rectlist; bitmap_ind16 *mobitmap; int x, y; /* draw the playfield */ priority_bitmap.fill(0, cliprect); m_playfield_tilemap->draw(m_pfbitmap, cliprect, 0, 0); m_playfield_tilemap->draw(m_pfbitmap, cliprect, 1, 1); m_playfield_tilemap->draw(m_pfbitmap, cliprect, 2, 2); m_playfield_tilemap->draw(m_pfbitmap, cliprect, 3, 3); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT32 *dest = &bitmap.pix32(y); UINT16 *mo = &mobitmap->pix16(y); UINT16 *pf = &m_pfbitmap.pix16(y); UINT8 *pri = &priority_bitmap.pix8(y); for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT16 pix = pf[x]; if (mo[x]) { /* not verified: logic is all controlled in a PAL factors: LBPRI1-0, LBPIX3, ANPIX1-0, PFPIX3, PFPRI1-0, (~LBPIX3 & ~LBPIX2 & ~LBPIX1 & ~LBPIX0) */ /* only draw if not high priority PF */ if (!pri[x] || !(pix & 8)) pix = mo[x]; /* erase behind ourselves */ mo[x] = 0; } dest[x] = palette[pix]; } } /* add the alpha on top */ m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); return 0; }
UINT32 toobin_state::screen_update_toobin(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { // start drawing m_mob->draw_async(cliprect); /* draw the playfield */ bitmap_ind8 &priority_bitmap = screen.priority(); priority_bitmap.fill(0, cliprect); m_playfield_tilemap->draw(screen, m_pfbitmap, cliprect, 0, 0); m_playfield_tilemap->draw(screen, m_pfbitmap, cliprect, 1, 1); m_playfield_tilemap->draw(screen, m_pfbitmap, cliprect, 2, 2); m_playfield_tilemap->draw(screen, m_pfbitmap, cliprect, 3, 3); /* draw and merge the MO */ bitmap_ind16 &mobitmap = m_mob->bitmap(); const rgb_t *palette = palette_entry_list_adjusted(machine().palette); for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT32 *dest = &bitmap.pix32(y); UINT16 *mo = &mobitmap.pix16(y); UINT16 *pf = &m_pfbitmap.pix16(y); UINT8 *pri = &priority_bitmap.pix8(y); for (int x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT16 pix = pf[x]; if (mo[x] != 0xffff) { /* not verified: logic is all controlled in a PAL factors: LBPRI1-0, LBPIX3, ANPIX1-0, PFPIX3, PFPRI1-0, (~LBPIX3 & ~LBPIX2 & ~LBPIX1 & ~LBPIX0) */ /* only draw if not high priority PF */ if (!pri[x] || !(pix & 8)) pix = mo[x]; } dest[x] = palette[pix]; } } /* add the alpha on top */ m_alpha_tilemap->draw(screen, bitmap, cliprect, 0, 0); return 0; }
void video_manager::save_snapshot(screen_device *screen, emu_file &file) { // validate assert(!m_snap_native || screen != NULL); // create the bitmap to pass in create_snapshot_bitmap(screen); // add two text entries describing the image astring text1(emulator_info::get_appname(), " ", build_version); astring text2(machine().system().manufacturer, " ", machine().system().description); png_info pnginfo = { 0 }; png_add_text(&pnginfo, "Software", text1); png_add_text(&pnginfo, "System", text2); // now do the actual work const rgb_t *palette = (machine().palette != NULL) ? palette_entry_list_adjusted(machine().palette) : NULL; png_error error = png_write_bitmap(file, &pnginfo, m_snap_bitmap, machine().total_colors(), palette); if (error != PNGERR_NONE) mame_printf_error("Error generating PNG for snapshot: png_error = %d\n", error); // free any data allocated png_free(&pnginfo); }