From fb8fded52343a69439c6559feb96747c6d03a1af Mon Sep 17 00:00:00 2001 From: havoc Date: Thu, 20 May 2004 20:33:00 +0000 Subject: [PATCH] Tomaz made cl_avidemo screenshot saving use no mallocs git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@4204 d7cf8633-e32d-0410-b094-e92efae38249 --- cl_screen.c | 16 +++++++++++++--- gl_backend.c | 4 ++-- gl_backend.h | 2 +- image.c | 7 ++----- image.h | 2 +- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/cl_screen.c b/cl_screen.c index 51ef1353..27b06ab5 100644 --- a/cl_screen.c +++ b/cl_screen.c @@ -661,6 +661,7 @@ void SCR_ScreenShot_f (void) char filename[MAX_QPATH]; qbyte *buffer1; qbyte *buffer2; + qbyte *buffer3; qboolean jpeg = (scr_screenshot_jpeg.integer != 0); sprintf (base, "screenshots/%s", scr_screenshot_name.string); @@ -688,14 +689,16 @@ void SCR_ScreenShot_f (void) buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3); buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3); + buffer3 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3 + 18); - if (SCR_ScreenShot (filename, buffer1, buffer2, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg)) + if (SCR_ScreenShot (filename, buffer1, buffer2, buffer3, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg)) Con_Printf("Wrote %s\n", filename); else Con_Printf("unable to write %s\n", filename); Mem_Free (buffer1); Mem_Free (buffer2); + Mem_Free (buffer3); shotnumber++; } @@ -706,6 +709,7 @@ void SCR_CaptureAVIDemo(void) { static qbyte *avi_buffer1 = NULL; static qbyte *avi_buffer2 = NULL; + static qbyte *avi_buffer3 = NULL; char filename[32]; qboolean jpeg = (scr_screenshot_jpeg.integer != 0); @@ -715,6 +719,7 @@ void SCR_CaptureAVIDemo(void) { avi_buffer1 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3); avi_buffer2 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3); + avi_buffer3 = Mem_Alloc(tempmempool, vid.realwidth * vid.realheight * 3 + 18); } } else @@ -723,8 +728,10 @@ void SCR_CaptureAVIDemo(void) { Mem_Free (avi_buffer1); Mem_Free (avi_buffer2); + Mem_Free (avi_buffer3); avi_buffer1 = NULL; avi_buffer2 = NULL; + avi_buffer3 = NULL; } cl_avidemo_frame = 0; return; @@ -735,7 +742,7 @@ void SCR_CaptureAVIDemo(void) else sprintf(filename, "video/dp%06d.tga", cl_avidemo_frame); - if (SCR_ScreenShot(filename, avi_buffer1, avi_buffer2, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg)) + if (SCR_ScreenShot(filename, avi_buffer1, avi_buffer2, avi_buffer3, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg)) cl_avidemo_frame++; else { @@ -781,6 +788,7 @@ static void R_Envmap_f (void) char filename[256], basename[256]; qbyte *buffer1; qbyte *buffer2; + qbyte *buffer3; if (Cmd_Argc() != 3) { @@ -813,6 +821,7 @@ static void R_Envmap_f (void) buffer1 = Mem_Alloc(tempmempool, size * size * 3); buffer2 = Mem_Alloc(tempmempool, size * size * 3); + buffer3 = Mem_Alloc(tempmempool, size * size * 3 + 18); for (j = 0;j < 12;j++) { @@ -822,11 +831,12 @@ static void R_Envmap_f (void) R_Mesh_Start(); R_RenderView(); R_Mesh_Finish(); - SCR_ScreenShot(filename, buffer1, buffer2, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, envmapinfo[j].flipx, envmapinfo[j].flipy, envmapinfo[j].flipdiagonaly, false); + SCR_ScreenShot(filename, buffer1, buffer2, buffer3, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, envmapinfo[j].flipx, envmapinfo[j].flipy, envmapinfo[j].flipdiagonaly, false); } Mem_Free (buffer1); Mem_Free (buffer2); + Mem_Free (buffer3); envmap = false; } diff --git a/gl_backend.c b/gl_backend.c index 49ef7342..889aa0ef 100644 --- a/gl_backend.c +++ b/gl_backend.c @@ -1190,7 +1190,7 @@ void R_Mesh_Draw_ShowTris(int numverts, int numtriangles, const int *elements) ============================================================================== */ -qboolean SCR_ScreenShot(char *filename, qbyte *buffer1, qbyte *buffer2, int x, int y, int width, int height, qboolean flipx, qboolean flipy, qboolean flipdiagonal, qboolean jpeg) +qboolean SCR_ScreenShot(char *filename, qbyte *buffer1, qbyte *buffer2, qbyte *buffer3, int x, int y, int width, int height, qboolean flipx, qboolean flipy, qboolean flipdiagonal, qboolean jpeg) { int indices[3] = {0,1,2}; qboolean ret; @@ -1206,7 +1206,7 @@ qboolean SCR_ScreenShot(char *filename, qbyte *buffer1, qbyte *buffer2, int x, i if (jpeg) ret = JPEG_SaveImage_preflipped (filename, width, height, buffer2); else - ret = Image_WriteTGARGB_preflipped (filename, width, height, buffer2); + ret = Image_WriteTGARGB_preflipped (filename, width, height, buffer2, buffer3); return ret; } diff --git a/gl_backend.h b/gl_backend.h index c8b7a580..3549566a 100644 --- a/gl_backend.h +++ b/gl_backend.h @@ -80,7 +80,7 @@ void R_Mesh_Draw(int numverts, int numtriangles, const int *elements); void R_Mesh_Draw_ShowTris(int numverts, int numtriangles, const int *elements); // saves a section of the rendered frame to a .tga or .jpg file -qboolean SCR_ScreenShot(char *filename, qbyte *buffer1, qbyte *buffer2, int x, int y, int width, int height, qboolean flipx, qboolean flipy, qboolean flipdiagonal, qboolean jpeg); +qboolean SCR_ScreenShot(char *filename, qbyte *buffer1, qbyte *buffer2, qbyte *buffer3, int x, int y, int width, int height, qboolean flipx, qboolean flipy, qboolean flipdiagonal, qboolean jpeg); // used by R_Envmap_f and internally in backend, clears the frame void R_ClearScreen(void); // invoke refresh of frame diff --git a/image.c b/image.c index f7cf892d..6b5dd6a1 100644 --- a/image.c +++ b/image.c @@ -853,14 +853,12 @@ rtexture_t *loadtextureimagebumpasnmap (rtexturepool_t *pool, const char *filena return rt; } -qboolean Image_WriteTGARGB_preflipped (const char *filename, int width, int height, const qbyte *data) +qboolean Image_WriteTGARGB_preflipped (const char *filename, int width, int height, const qbyte *data, qbyte *buffer) { qboolean ret; - qbyte *buffer, *out; + qbyte *out; const qbyte *in, *end; - buffer = Mem_Alloc(tempmempool, width*height*3 + 18); - memset (buffer, 0, 18); buffer[2] = 2; // uncompressed type buffer[12] = (width >> 0) & 0xFF; @@ -881,7 +879,6 @@ qboolean Image_WriteTGARGB_preflipped (const char *filename, int width, int heig } ret = FS_WriteFile (filename, buffer, width*height*3 + 18 ); - Mem_Free(buffer); return ret; } diff --git a/image.h b/image.h index e3f144cb..6ff4b735 100644 --- a/image.h +++ b/image.h @@ -37,7 +37,7 @@ rtexture_t *loadtextureimagewithmaskandnmap (rtexturepool_t *pool, const char *f rtexture_t *loadtextureimagebumpasnmap (rtexturepool_t *pool, const char *filename, int matchwidth, int matchheight, qboolean complain, int flags, float bumpscale); // writes a RGB TGA that is already upside down (which TGA wants) -qboolean Image_WriteTGARGB_preflipped (const char *filename, int width, int height, const qbyte *data); +qboolean Image_WriteTGARGB_preflipped (const char *filename, int width, int height, const qbyte *data, qbyte *buffer); // writes a RGB TGA void Image_WriteTGARGB (const char *filename, int width, int height, const qbyte *data); -- 2.39.2