Tomaz made cl_avidemo screenshot saving use no mallocs
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Thu, 20 May 2004 20:33:00 +0000 (20:33 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Thu, 20 May 2004 20:33:00 +0000 (20:33 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@4204 d7cf8633-e32d-0410-b094-e92efae38249

cl_screen.c
gl_backend.c
gl_backend.h
image.c
image.h

index 51ef135..27b06ab 100644 (file)
@@ -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;
 }
index 49ef734..889aa0e 100644 (file)
@@ -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;
 }
index c8b7a58..3549566 100644 (file)
@@ -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 f7cf892..6b5dd6a 100644 (file)
--- 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 e3f144c..6ff4b73 100644 (file)
--- 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);