/* ================== CL_SnapShot_f save screenshots into root dir ================== */ void CL_SnapShot_f( void ) { int i; string checkname; if( gl_overview->integer == 1 ) { // special case for write overview image and script file Q_snprintf( cls.shotname, sizeof( cls.shotname ), "overviews/%s.bmp", clgame.mapname ); cls.scrshot_action = scrshot_mapshot; // build new frame for mapshot } else { FS_AllowDirectPaths( true ); // scan for a free filename for( i = 0; i < 9999; i++ ) { if( !CL_SnapshotGetName( i, checkname )) return; // no namespace if( !FS_FileExists( checkname, false )) break; } FS_AllowDirectPaths( false ); Q_strncpy( cls.shotname, checkname, sizeof( cls.shotname )); cls.scrshot_action = scrshot_snapshot; // build new frame for screenshot } cls.envshot_vieworg = NULL; // no custom view cls.envshot_viewsize = 0; }
void Key_EnumCmds_f( void ) { file_t *f; FS_AllowDirectPaths( true ); if( FS_FileExists( "../help.txt", false )) { Msg( "help.txt already exist\n" ); FS_AllowDirectPaths( false ); return; } f = FS_Open( "../help.txt", "w", false ); if( f ) { FS_Printf( f, "//=======================================================================\n"); FS_Printf( f, "//\t\t\tCopyright XashXT Group %s ©\n", Q_timestamp( TIME_YEAR_ONLY )); FS_Printf( f, "//\t\thelp.txt - xash commands and console variables\n"); FS_Printf( f, "//=======================================================================\n"); FS_Printf( f, "\n\n\t\t\tconsole variables\n\n"); Cvar_LookupVars( 0, NULL, f, Cmd_WriteHelp ); FS_Printf( f, "\n\n\t\t\tconsole commands\n\n"); Cmd_LookupCmds( NULL, f, Cmd_WriteHelp ); FS_Printf( f, "\n\n"); FS_Close( f ); Msg( "help.txt created\n" ); } else MsgDev( D_ERROR, "Couldn't write help.txt.\n"); FS_AllowDirectPaths( false ); }
/* ================== CL_SnapshotGetName ================== */ qboolean CL_SnapshotGetName( int lastnum, char *filename ) { int a, b, c, d; if( lastnum < 0 || lastnum > 9999 ) { MsgDev( D_ERROR, "unable to write snapshot\n" ); FS_AllowDirectPaths( false ); return false; } a = lastnum / 1000; lastnum -= a * 1000; b = lastnum / 100; lastnum -= b * 100; c = lastnum / 10; lastnum -= c * 10; d = lastnum; Q_sprintf( filename, "../%s_%i%i%i%i.bmp", clgame.mapname, a, b, c, d ); return true; }
qboolean VID_ScreenShot( const char *filename, int shot_type ) { rgbdata_t *r_shot; uint flags = IMAGE_FLIP_Y; int width = 0, height = 0; qboolean result; r_shot = Mem_Alloc( r_temppool, sizeof( rgbdata_t )); r_shot->width = (glState.width + 3) & ~3; r_shot->height = (glState.height + 3) & ~3; r_shot->flags = IMAGE_HAS_COLOR | IMAGE_HAS_ALPHA; r_shot->type = PF_RGBA_32; r_shot->size = r_shot->width * r_shot->height * PFDesc[r_shot->type].bpp; r_shot->palette = NULL; r_shot->buffer = Mem_Alloc( r_temppool, r_shot->size ); // get screen frame pglPixelStorei(GL_PACK_ALIGNMENT, 1); // PANDORA, just in case pglReadPixels( 0, 0, r_shot->width, r_shot->height, GL_RGBA, GL_UNSIGNED_BYTE, r_shot->buffer ); switch( shot_type ) { case VID_SCREENSHOT: if( !gl_overview->integer ) VID_ImageAdjustGamma( r_shot->buffer, r_shot->width, r_shot->height ); // scrshot gamma break; case VID_SNAPSHOT: if( !gl_overview->integer ) VID_ImageAdjustGamma( r_shot->buffer, r_shot->width, r_shot->height ); // scrshot gamma FS_AllowDirectPaths( true ); break; case VID_LEVELSHOT: flags |= IMAGE_RESAMPLE; if( glState.wideScreen ) { height = 480; width = 800; } else { height = 480; width = 640; } break; case VID_MINISHOT: flags |= IMAGE_RESAMPLE; height = 200; width = 320; break; case VID_MAPSHOT: V_WriteOverviewScript(); // store overview script too flags |= IMAGE_RESAMPLE|IMAGE_QUANTIZE; // GoldSrc request overviews in 8-bit format height = 768; width = 1024; break; } Image_Process( &r_shot, width, height, 0.0f, flags, NULL ); // write image result = FS_SaveImage( filename, r_shot ); host.write_to_clipboard = false; // disable write to clipboard FS_AllowDirectPaths( false ); // always reset after store screenshot FS_FreeImage( r_shot ); return result; }