/* ================== SCR_ScreenShot_f ================== */ void SCR_ScreenShot_f (void) { int i; char pcxname[80]; char checkname[MAX_OSPATH]; // // find a file name to save it to // #if defined (__APPLE__) || defined (MACOSX) qboolean success = false; strcpy(pcxname,"quake00.png"); #else strcpy(pcxname,"quake00.pcx"); #endif /* __APPLE__ || MACOSX */ for (i=0 ; i<=99 ; i++) { pcxname[5] = i/10 + '0'; pcxname[6] = i%10 + '0'; #if defined (__APPLE__) || defined (MACOSX) snprintf (checkname, MAX_OSPATH, "%s/%s", com_gamedir, pcxname); #else sprintf (checkname, "%s/%s", com_gamedir, pcxname); #endif /* __APPLE__ || MACOSX */ if (Sys_FileTime(checkname) == -1) break; // file doesn't exist } if (i==100) { #if defined (__APPLE__) || defined (MACOSX) Con_Printf ("SCR_ScreenShot_f: Couldn't create a PNG file\n"); #else Con_Printf ("SCR_ScreenShot_f: Couldn't create a PCX file\n"); #endif /* __APPLE__ || MACOSX */ return; } // // save the pcx file // D_EnableBackBufferAccess (); // enable direct drawing of console to back // buffer #if defined (__APPLE__) || defined (MACOSX) success = WritePNGFile (checkname, vid.buffer, vid.width, vid.height, vid.rowbytes, host_basepal); D_DisableBackBufferAccess (); // for adapters that can't stay mapped in // for linear writes all the time if (success == true) { Con_Printf ("Wrote %s\n", pcxname); } #else WritePCXfile (pcxname, vid.buffer, vid.width, vid.height, vid.rowbytes, host_basepal); D_DisableBackBufferAccess (); // for adapters that can't stay mapped in // for linear writes all the time Con_Printf ("Wrote %s\n", pcxname); #endif /* __APPLE__ ||ÊMACOSX */ }
/* ================== SCR_ScreenShot_f ================== */ void SCR_ScreenShot_f (void) { int i; char pcxname[80]; char checkname[MAX_OSPATH]; sprintf (checkname, "%s/shots", com_gamedir); Sys_mkdir (checkname); // // find a file name to save it to // strcpy(pcxname,"shots/hexen00.pcx"); for (i=0 ; i<=99 ; i++) { pcxname[11] = i/10 + '0'; pcxname[12] = i%10 + '0'; sprintf (checkname, "%s/%s", com_gamedir, pcxname); if (Sys_FileTime(checkname) == -1) break; // file doesn't exist } if (i==100) { Con_Printf ("SCR_ScreenShot_f: Couldn't create a PCX file\n"); return; } // // save the pcx file // D_EnableBackBufferAccess (); // enable direct drawing of console to back // buffer WritePCXfile (pcxname, vid.buffer, vid.width, vid.height, vid.rowbytes, host_basepal); D_DisableBackBufferAccess (); // for adapters that can't stay mapped in // for linear writes all the time Con_Printf ("Wrote %s\n", pcxname); }
/* SCR_ScreenShot_f */ void SCR_ScreenShot_f (void) { char pcxname[MAX_OSPATH]; // find a file name to save it to if (!COM_NextFilename (pcxname, "qf", ".pcx")) { Con_Printf ("SCR_ScreenShot_f: Couldn't create a PCX"); return; } // enable direct drawing of console to back buffer D_EnableBackBufferAccess (); // save the pcx file WritePCXfile (pcxname, vid.buffer, vid.width, vid.height, vid.rowbytes, host_basepal, false, false); // for adapters that can't stay mapped in for linear writes all the time D_DisableBackBufferAccess (); Con_Printf ("Wrote %s\n", pcxname); }
/* ================== SCR_RSShot_f ================== */ void SCR_RSShot_f (void) { int x, y; unsigned char *src, *dest; char pcxname[80]; #if 0 int i; char checkname[MAX_OSPATH]; #endif unsigned char *newbuf; //, *srcbuf; // int srcrowbytes; int w, h; int dx, dy, dex, dey, nx; int r, b, g; int count; float fracw, frach; char st[80]; time_t now; if (CL_IsUploading()) return; // already one pending if (cls.state < ca_onserver) return; // gotta be connected if (!scr_allowsnap.value) { MSG_WriteByte (&cls.netchan.message, clc_stringcmd); SZ_Print (&cls.netchan.message, "snap\n"); Con_Printf("Refusing remote screen shot request.\n"); return; } Con_Printf("Remote screen shot requested.\n"); #if 0 // // find a file name to save it to // strcpy(pcxname,"mquake00.pcx"); for (i=0 ; i<=99 ; i++) { pcxname[6] = i/10 + '0'; pcxname[7] = i%10 + '0'; #if defined (__APPLE__) || defined (MACOSX) snprintf (checkname, MAX_OSPATH, "%s/%s", com_gamedir, pcxname); #else sprintf (checkname, "%s/%s", com_gamedir, pcxname); #endif /* __APPLE__ || MACOSX */ if (Sys_FileTime(checkname) == -1) break; // file doesn't exist } if (i==100) { Con_Printf ("SCR_ScreenShot_f: Couldn't create a PCX"); return; } #endif // // save the pcx file // D_EnableBackBufferAccess (); // enable direct drawing of console to back // buffer w = (vid.width < RSSHOT_WIDTH) ? vid.width : RSSHOT_WIDTH; h = (vid.height < RSSHOT_HEIGHT) ? vid.height : RSSHOT_HEIGHT; fracw = (float)vid.width / (float)w; frach = (float)vid.height / (float)h; newbuf = malloc(w*h); for (y = 0; y < h; y++) { dest = newbuf + (w * y); for (x = 0; x < w; x++) { r = g = b = 0; dx = x * fracw; dex = (x + 1) * fracw; if (dex == dx) dex++; // at least one dy = y * frach; dey = (y + 1) * frach; if (dey == dy) dey++; // at least one count = 0; for (/* */; dy < dey; dy++) { src = vid.buffer + (vid.rowbytes * dy) + dx; for (nx = dx; nx < dex; nx++) { r += host_basepal[*src * 3]; g += host_basepal[*src * 3+1]; b += host_basepal[*src * 3+2]; src++; count++; } } r /= count; g /= count; b /= count; *dest++ = MipColor(r, g, b); } } time(&now); strcpy(st, ctime(&now)); st[strlen(st) - 1] = 0; SCR_DrawStringToSnap (st, newbuf, w - ((int) strlen(st))*8, 0, w); strncpy(st, cls.servername, sizeof(st)); st[sizeof(st) - 1] = 0; SCR_DrawStringToSnap (st, newbuf, w - ((int) strlen(st))*8, 10, w); strncpy(st, name.string, sizeof(st)); st[sizeof(st) - 1] = 0; SCR_DrawStringToSnap (st, newbuf, w - ((int) strlen(st))*8, 20, w); WritePCXfile (pcxname, newbuf, w, h, w, host_basepal, true); free(newbuf); D_DisableBackBufferAccess (); // for adapters that can't stay mapped in // for linear writes all the time // Con_Printf ("Wrote %s\n", pcxname); Con_Printf ("Sending shot to server...\n"); }
/* ================== SCR_UpdateScreen This is called every frame, and can also be called explicitly to flush text to the screen. WARNING: be very careful calling this from elsewhere, because the refresh needs almost the entire 256k of stack space! ================== */ void SCR_UpdateScreen (void) { static float oldscr_viewsize; vrect_t vrect; if (scr_skipupdate || block_drawing) return; if (scr_disabled_for_loading) return; #ifdef _WIN32 { // don't suck up any cpu if minimized extern int Minimized; if (Minimized) return; } #endif scr_copytop = 0; scr_copyeverything = 0; if (!scr_initialized || !con_initialized) return; // not initialized yet if (scr_viewsize.value != oldscr_viewsize) { oldscr_viewsize = scr_viewsize.value; vid.recalc_refdef = 1; } // // check for vid changes // if (oldfov != scr_fov.value) { oldfov = scr_fov.value; vid.recalc_refdef = true; } if (oldscreensize != scr_viewsize.value) { oldscreensize = scr_viewsize.value; vid.recalc_refdef = true; } if (oldsbar != cl_sbar.value) { oldsbar = cl_sbar.value; vid.recalc_refdef = true; } if (vid.recalc_refdef) { // something changed, so reorder the screen SCR_CalcRefdef (); } // // do 3D refresh drawing, and then update the screen // D_EnableBackBufferAccess (); // of all overlay stuff if drawing directly if (scr_fullupdate++ < vid.numpages) { // clear the entire screen scr_copyeverything = 1; Draw_TileClear (0,0,vid.width,vid.height); Sbar_Changed (); } pconupdate = NULL; SCR_SetUpToDrawConsole (); SCR_EraseCenterString (); D_DisableBackBufferAccess (); // for adapters that can't stay mapped in // for linear writes all the time VID_LockBuffer (); V_RenderView (); VID_UnlockBuffer (); D_EnableBackBufferAccess (); // of all overlay stuff if drawing directly if (scr_drawdialog) { Sbar_Draw (); Draw_FadeScreen (); SCR_DrawNotifyString (); scr_copyeverything = true; } else if (cl.intermission == 1 && key_dest == key_game) { Sbar_IntermissionOverlay (); } else if (cl.intermission == 2 && key_dest == key_game) { Sbar_FinaleOverlay (); SCR_CheckDrawCenterString (); } else { SCR_DrawRam (); SCR_DrawNet (); SCR_DrawTurtle (); SCR_DrawPause (); SCR_DrawFPS (); SCR_CheckDrawCenterString (); Sbar_Draw (); SCR_DrawConsole (); M_Draw (); } D_DisableBackBufferAccess (); // for adapters that can't stay mapped in // for linear writes all the time if (pconupdate) { D_UpdateRects (pconupdate); } V_UpdatePalette (); // // update one of three areas // if (scr_copyeverything) { vrect.x = 0; vrect.y = 0; vrect.width = vid.width; vrect.height = vid.height; vrect.pnext = 0; VID_Update (&vrect); } else if (scr_copytop) { vrect.x = 0; vrect.y = 0; vrect.width = vid.width; vrect.height = vid.height - sb_lines; vrect.pnext = 0; VID_Update (&vrect); } else { vrect.x = scr_vrect.x; vrect.y = scr_vrect.y; vrect.width = scr_vrect.width; vrect.height = scr_vrect.height; vrect.pnext = 0; VID_Update (&vrect); } }
/* ================== SCR_UpdateScreen This is called every frame, and can also be called explicitly to flush text to the screen. WARNING: be very careful calling this from elsewhere, because the refresh needs almost the entire 256k of stack space! ================== */ void SCR_UpdateScreen (void) { static float oldscr_viewsize; static float oldlcd_x; vrect_t vrect; if (scr_skipupdate) return; scr_copytop = 0; scr_copyeverything = 0; if (scr_disabled_for_loading) { if (realtime - scr_disabled_time > 60) { scr_disabled_for_loading = false; total_loading_size = 0; loading_stage = 0; Con_Printf ("load failed.\n"); } else return; } if (cls.state == ca_dedicated) return; // stdout only if (!scr_initialized || !con_initialized) return; // not initialized yet if (scr_viewsize.value != oldscr_viewsize) { oldscr_viewsize = scr_viewsize.value; vid.recalc_refdef = 1; } // // check for vid changes // if (oldfov != scr_fov.value) { oldfov = scr_fov.value; vid.recalc_refdef = true; } if (oldlcd_x != lcd_x.value) { oldlcd_x = lcd_x.value; vid.recalc_refdef = true; } if (oldscreensize != scr_viewsize.value) { oldscreensize = scr_viewsize.value; vid.recalc_refdef = true; } if (vid.recalc_refdef) { // something changed, so reorder the screen SCR_CalcRefdef (); } // // do 3D refresh drawing, and then update the screen // D_EnableBackBufferAccess (); // of all overlay stuff if drawing directly if (scr_needfull && (!plaquemessage || plaquemessage[0] == 0 || !SCR_CheckDrawCenterString2())) scr_fullupdate = 0; if (scr_fullupdate++ < vid.numpages) { // clear the entire screen scr_copyeverything = 1; Draw_TileClear (0,0,vid.width,vid.height); SB_Changed(); } else if (scr_topupdate++ < vid.numpages) { scr_copyeverything = 1; Draw_TileClear (0,0,vid.width,100); SB_Changed(); } pconupdate = NULL; SCR_SetUpToDrawConsole (); //SCR_EraseCenterString (); D_DisableBackBufferAccess (); // for adapters that can't stay mapped in // for linear writes all the time if (cl.intermission < 1 || cl.intermission > 12) { VID_LockBuffer (); V_RenderView (); VID_UnlockBuffer (); } D_EnableBackBufferAccess (); // of all overlay stuff if drawing directly if (scr_drawdialog) { SB_Draw(); Draw_FadeScreen (); SCR_DrawNotifyString (); scr_copyeverything = true; } else if (scr_drawloading) { SB_Draw(); Draw_FadeScreen (); SCR_DrawLoading (); } else if (cl.intermission >= 1 && cl.intermission <= 12) { SB_IntermissionOverlay(); if (cl.intermission < 12) { SCR_DrawConsole(); M_Draw(); } } /* else if (cl.intermission == 2 && key_dest == key_game) { SB_FinaleOverlay(); SCR_CheckDrawCenterString(); } else if (cl.intermission == 3 && key_dest == key_game) { SCR_CheckDrawCenterString (); }*/ else { SCR_DrawRam(); SCR_DrawNet(); SCR_DrawTurtle(); SCR_DrawPause(); SCR_CheckDrawCenterString(); SB_Draw(); Plaque_Draw(plaquemessage,0); SCR_DrawConsole(); M_Draw(); if (errormessage) Plaque_Draw(errormessage,1); if (info_up) { UpdateInfoMessage(); Info_Plaque_Draw(infomessage); } } if (loading_stage) SCR_DrawLoading(); D_DisableBackBufferAccess (); // for adapters that can't stay mapped in // for linear writes all the time if (pconupdate) { D_UpdateRects (pconupdate); } V_UpdatePalette (); // // update one of three areas // if (scr_copyeverything) { vrect.x = 0; vrect.y = 0; vrect.width = vid.width; vrect.height = vid.height; vrect.pnext = 0; VID_Update (&vrect); } else if (scr_copytop) { vrect.x = 0; vrect.y = 0; vrect.width = vid.width; vrect.height = vid.height - sb_lines; vrect.pnext = 0; VID_Update (&vrect); } else { vrect.x = scr_vrect.x; vrect.y = scr_vrect.y; vrect.width = scr_vrect.width; vrect.height = scr_vrect.height; vrect.pnext = 0; VID_Update (&vrect); } }
/* ================== SCR_UpdateScreen This is called every frame, and can also be called explicitly to flush text to the screen. WARNING: be very careful calling this from elsewhere, because the refresh needs almost the entire 256k of stack space! ================== */ void SCR_UpdateScreen(void) { static float oldscr_viewsize; vrect_t vrect; if (scr_skipupdate || block_drawing) return; scr_copytop = 0; scr_copyeverything = 0; if (scr_disabled_for_loading) { /* * FIXME - this really needs to be fixed properly. * Simply starting a new game and typing "changelevel foo" will hang * the engine for 15s (was 60s!) if foo.bsp does not exist. */ if (realtime - scr_disabled_time > 15) { scr_disabled_for_loading = false; Con_Printf("load failed.\n"); } else return; } if (cls.state == ca_dedicated) return; // stdout only if (!scr_initialized || !con_initialized) return; // not initialized yet if (scr_viewsize.value != oldscr_viewsize) { oldscr_viewsize = scr_viewsize.value; vid.recalc_refdef = 1; } // // check for vid changes // if (oldfov != scr_fov.value) { oldfov = scr_fov.value; vid.recalc_refdef = true; } if (oldscreensize != scr_viewsize.value) { oldscreensize = scr_viewsize.value; vid.recalc_refdef = true; } if (vid.recalc_refdef) { // something changed, so reorder the screen SCR_CalcRefdef(); } // // do 3D refresh drawing, and then update the screen // D_EnableBackBufferAccess(); // of all overlay stuff if drawing directly if (scr_fullupdate++ < vid.numpages) { // clear the entire screen scr_copyeverything = 1; Draw_TileClear(0, 0, vid.width, vid.height); Sbar_Changed(); } pconupdate = NULL; SCR_SetUpToDrawConsole(); SCR_EraseCenterString(); D_DisableBackBufferAccess(); // for adapters that can't stay mapped in // for linear writes all the time VID_LockBuffer(); V_RenderView(); VID_UnlockBuffer(); D_EnableBackBufferAccess(); // of all overlay stuff if drawing directly if (scr_drawdialog) { Sbar_Draw(); Draw_FadeScreen(); SCR_DrawNotifyString(); scr_copyeverything = true; } else if (scr_drawloading) { SCR_DrawLoading(); Sbar_Draw(); } else if (cl.intermission == 1 && key_dest == key_game) { Sbar_IntermissionOverlay(); } else if (cl.intermission == 2 && key_dest == key_game) { Sbar_FinaleOverlay(); SCR_CheckDrawCenterString(); } else if (cl.intermission == 3 && key_dest == key_game) { SCR_CheckDrawCenterString(); } else { SCR_DrawRam(); SCR_DrawNet(); SCR_DrawTurtle(); SCR_DrawPause(); SCR_CheckDrawCenterString(); Sbar_Draw(); SCR_DrawConsole(); M_Draw(); } D_DisableBackBufferAccess(); // for adapters that can't stay mapped in // for linear writes all the time if (pconupdate) { D_UpdateRects(pconupdate); } V_UpdatePalette(); // // update one of three areas // if (scr_copyeverything) { vrect.x = 0; vrect.y = 0; vrect.width = vid.width; vrect.height = vid.height; vrect.pnext = 0; VID_Update(&vrect); } else if (scr_copytop) { vrect.x = 0; vrect.y = 0; vrect.width = vid.width; vrect.height = vid.height - sb_lines; vrect.pnext = 0; VID_Update(&vrect); } else { vrect.x = scr_vrect.x; vrect.y = scr_vrect.y; vrect.width = scr_vrect.width; vrect.height = scr_vrect.height; vrect.pnext = 0; VID_Update(&vrect); } }
/* SCR_RSShot_f */ void SCR_RSShot_f (void) { int x, y; unsigned char *src, *dest; char pcxname[80]; unsigned char *newbuf; int w, h; int dx, dy, dex, dey, nx; int r, b, g; int count; float fracw, frach; char st[80]; time_t now; if (CL_IsUploading ()) return; // already one pending if (cls.state < ca_onserver) return; // gotta be connected Con_Printf ("Remote screen shot requested.\n"); snprintf (pcxname, sizeof (pcxname), "rss.pcx"); // // save the pcx file // D_EnableBackBufferAccess (); // enable direct drawing of console // to back // buffer w = (vid.width < RSSHOT_WIDTH) ? vid.width : RSSHOT_WIDTH; h = (vid.height < RSSHOT_HEIGHT) ? vid.height : RSSHOT_HEIGHT; fracw = (float) vid.width / (float) w; frach = (float) vid.height / (float) h; newbuf = calloc (1, w * h); for (y = 0; y < h; y++) { dest = newbuf + (w * y); for (x = 0; x < w; x++) { r = g = b = 0; dx = x * fracw; dex = (x + 1) * fracw; if (dex == dx) dex++; // at least one dy = y * frach; dey = (y + 1) * frach; if (dey == dy) dey++; // at least one count = 0; for ( /* */ ; dy < dey; dy++) { src = vid.buffer + (vid.rowbytes * dy) + dx; for (nx = dx; nx < dex; nx++) { r += host_basepal[*src * 3]; g += host_basepal[*src * 3 + 1]; b += host_basepal[*src * 3 + 2]; src++; count++; } } r /= count; g /= count; b /= count; *dest++ = MipColor (r, g, b); } } time (&now); strcpy (st, ctime (&now)); st[strlen (st) - 1] = 0; SCR_DrawStringToSnap (st, newbuf, w - strlen (st) * 8, 0, w); strncpy (st, cls.servername, sizeof (st)); st[sizeof (st) - 1] = 0; SCR_DrawStringToSnap (st, newbuf, w - strlen (st) * 8, 10, w); strncpy (st, name->string, sizeof (st)); st[sizeof (st) - 1] = 0; SCR_DrawStringToSnap (st, newbuf, w - strlen (st) * 8, 20, w); WritePCXfile (pcxname, newbuf, w, h, w, host_basepal, true, false); free (newbuf); D_DisableBackBufferAccess (); // for adapters that can't stay // mapped in // for linear writes all the time Con_Printf ("Wrote %s\n", pcxname); Con_Printf ("Sending shot to server...\n"); }