summaryrefslogtreecommitdiff
path: root/source/gl_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/gl_main.c')
-rw-r--r--source/gl_main.c129
1 files changed, 49 insertions, 80 deletions
diff --git a/source/gl_main.c b/source/gl_main.c
index 2a8c2f6..c4cb998 100644
--- a/source/gl_main.c
+++ b/source/gl_main.c
@@ -534,34 +534,59 @@ void R_EndFrame( void ) {
*/
#if USE_TGA || USE_JPG || USE_PNG
-static char *screenshot_path( char *buffer, const char *ext ) {
- int i;
- size_t len;
+static void make_screenshot( const char *ext, img_save_t func, GLenum format, int param ) {
+ char buffer[MAX_OSPATH];
+ byte *pixels;
+ qerror_t ret;
+ qhandle_t f;
+ int i;
if( Cmd_Argc() > 1 ) {
- len = Q_concat( buffer, MAX_OSPATH, SCREENSHOTS_DIRECTORY "/", Cmd_Argv( 1 ), ext, NULL );
- if( len >= MAX_OSPATH ) {
- Com_EPrintf( "Oversize filename specified.\n" );
- return NULL;
+ f = FS_EasyOpenFile( buffer, sizeof( buffer ), FS_MODE_WRITE,
+ SCREENSHOTS_DIRECTORY "/", Cmd_Argv( 1 ), ext );
+ if( !f ) {
+ return;
}
- return buffer;
- }
-//
-// find a file name to save it to
-//
- for( i = 0; i < 1000; i++ ) {
- Q_snprintf( buffer, MAX_OSPATH, SCREENSHOTS_DIRECTORY"/quake%03d%s", i, ext );
- if( FS_LoadFileEx( buffer, NULL, FS_PATH_GAME, TAG_FREE ) == INVALID_LENGTH ) {
- return buffer; // file doesn't exist
+ } else {
+ // find a file name to save it to
+ for( i = 0; i < 1000; i++ ) {
+ Q_snprintf( buffer, sizeof( buffer ), SCREENSHOTS_DIRECTORY "/quake%03d%s", i, ext );
+ ret = FS_FOpenFile( buffer, &f, FS_MODE_WRITE|FS_FLAG_EXCL );
+ if( f ) {
+ break;
+ }
+ if( ret != Q_ERR_EXIST ) {
+ Com_EPrintf( "Couldn't exclusively open %s for writing: %s\n",
+ buffer, Q_ErrorString( ret ) );
+ return;
+ }
+ }
+
+ if( i == 1000 ) {
+ Com_EPrintf( "All screenshot slots are full.\n" );
+ return;
}
}
- Com_Printf( "All screenshot slots are full.\n" );
- return NULL;
+ pixels = FS_AllocTempMem( gl_config.vidWidth * gl_config.vidHeight * 3 );
+
+ qglReadPixels( 0, 0, gl_config.vidWidth, gl_config.vidHeight, format,
+ GL_UNSIGNED_BYTE, pixels );
+
+ ret = func( f, buffer, pixels, gl_config.vidWidth, gl_config.vidHeight, param );
+
+ FS_FreeFile( pixels );
+
+ FS_FCloseFile( f );
+
+ if( ret < 0 ) {
+ Com_EPrintf( "Couldn't write %s: %s\n", buffer, Q_ErrorString( ret ) );
+ } else {
+ Com_Printf( "Wrote %s\n", buffer );
+ }
}
#endif
-
/*
==================
GL_ScreenShot_f
@@ -569,31 +594,11 @@ GL_ScreenShot_f
*/
static void GL_ScreenShot_f( void ) {
#if USE_TGA
- char buffer[MAX_OSPATH];
- byte *bgr;
- qboolean ret;
-
if( Cmd_Argc() > 2 ) {
Com_Printf( "Usage: %s [name]\n", Cmd_Argv( 0 ) );
return;
}
-
- if( !screenshot_path( buffer, ".tga" ) ) {
- return;
- }
-
- bgr = FS_AllocTempMem( gl_config.vidWidth * gl_config.vidHeight * 3 );
-
- qglReadPixels( 0, 0, gl_config.vidWidth, gl_config.vidHeight, GL_BGR,
- GL_UNSIGNED_BYTE, bgr );
-
- ret = IMG_WriteTGA( buffer, bgr, gl_config.vidWidth, gl_config.vidHeight );
-
- FS_FreeFile( bgr );
-
- if( ret ) {
- Com_Printf( "Wrote %s\n", buffer );
- }
+ make_screenshot( ".tga", IMG_SaveTGA, GL_BGR, 0 );
#else
Com_Printf( "Couldn't create screenshot due to no TGA support linked in.\n" );
#endif
@@ -601,75 +606,39 @@ static void GL_ScreenShot_f( void ) {
#if USE_JPG
static void GL_ScreenShotJPG_f( void ) {
- char buffer[MAX_OSPATH];
- byte *rgb;
- int quality;
- qboolean ret;
+ int quality;
if( Cmd_Argc() > 3 ) {
Com_Printf( "Usage: %s [name] [quality]\n", Cmd_Argv( 0 ) );
return;
}
- if( !screenshot_path( buffer, ".jpg" ) ) {
- return;
- }
-
- rgb = FS_AllocTempMem( gl_config.vidWidth * gl_config.vidHeight * 3 );
-
- qglReadPixels( 0, 0, gl_config.vidWidth, gl_config.vidHeight, GL_RGB,
- GL_UNSIGNED_BYTE, rgb );
-
if( Cmd_Argc() > 2 ) {
quality = atoi( Cmd_Argv( 2 ) );
} else {
quality = gl_screenshot_quality->integer;
}
- ret = IMG_WriteJPG( buffer, rgb, gl_config.vidWidth, gl_config.vidHeight, quality );
-
- FS_FreeFile( rgb );
-
- if( ret ) {
- Com_Printf( "Wrote %s\n", buffer );
- }
+ make_screenshot( ".jpg", IMG_SaveJPG, GL_RGB, quality );
}
#endif
#if USE_PNG
static void GL_ScreenShotPNG_f( void ) {
- char buffer[MAX_OSPATH];
- byte *rgb;
- int compression;
- qboolean ret;
+ int compression;
if( Cmd_Argc() > 3 ) {
Com_Printf( "Usage: %s [name] [compression]\n", Cmd_Argv( 0 ) );
return;
}
- if( !screenshot_path( buffer, ".png" ) ) {
- return;
- }
-
- rgb = FS_AllocTempMem( gl_config.vidWidth * gl_config.vidHeight * 3 );
-
- qglReadPixels( 0, 0, gl_config.vidWidth, gl_config.vidHeight, GL_RGB,
- GL_UNSIGNED_BYTE, rgb );
-
if( Cmd_Argc() > 2 ) {
compression = atoi( Cmd_Argv( 2 ) );
} else {
compression = gl_screenshot_compression->integer;
}
- ret = IMG_WritePNG( buffer, rgb, gl_config.vidWidth, gl_config.vidHeight, compression );
-
- FS_FreeFile( rgb );
-
- if( ret ) {
- Com_Printf( "Wrote %s\n", buffer );
- }
+ make_screenshot( ".png", IMG_SavePNG, GL_RGB, compression );
}
#endif