ref: 7064c581f9159b45529e49c7cbeeb779f5bc0452
parent: 91c079724e36fdcf6a8a00262ff12f678ee50a22
author: Konstantinn Bonnet <qu7uux@gmail.com>
date: Sat Mar 11 06:54:15 EST 2017
screenshots: use writeimage(2) instead of pcx
--- a/dat.h
+++ b/dat.h
@@ -35,3 +35,5 @@
Spktvol = 255
};
#define Spktatt 1.0
+
+extern int dumpwin;
--- a/screen.c
+++ b/screen.c
@@ -44,10 +44,6 @@
qboolean block_drawing;
-static int writepcx;
-
-void SCR_ScreenShot_f (void);
-
/*
===============================================================================
@@ -288,13 +284,12 @@
vid.recalc_refdef = 1;
}
-//============================================================================
+static void
+screenshot(void)
+{ + dumpwin++;
+}
-/*
-==================
-SCR_Init
-==================
-*/
void SCR_Init (void)
{Cvar_RegisterVariable (&scr_fov);
@@ -305,11 +300,7 @@
Cvar_RegisterVariable (&scr_showpause);
Cvar_RegisterVariable (&scr_centertime);
Cvar_RegisterVariable (&scr_printspeed);
-
-//
-// register our commands
-//
- Cmd_AddCommand ("screenshot",SCR_ScreenShot_f);+ Cmd_AddCommand("screenshot", screenshot); Cmd_AddCommand ("sizeup",SCR_SizeUp_f); Cmd_AddCommand ("sizedown",SCR_SizeDown_f);@@ -496,111 +487,6 @@
}
}
-
-/*
-==============================================================================
-
- SCREEN SHOTS
-
-==============================================================================
-*/
-
-void
-SCR_ScreenShot_f(void)
-{ - writepcx++;
-}
-
-static void
-pcxout(char *path, byte *src, int dx, int dy, int xlen, byte *pal)
-{- int i, j;
- uchar *buf, *p;
-
- if((buf = Hunk_TempAlloc(dx * dy * 2 + 1000)) == nil){- Con_Printf("writepcx: not enough memory\n");- return;
- }
- p = buf;
-
- /* pcx header */
- memset(p, 0, 128);
- p[0] = 0x0a;
- p[1] = 5; /* version: 24bit pcx */
- p[2] = 1;
- p[3] = 8; /* bits per pixel */
- p[8] = dx - 1;
- p[9] = dx - 1 >> 8;
- p[10] = dy - 1;
- p[11] = dy - 1 >> 8;
- p[12] = dx; /* HDpi and VDpi */
- p[13] = dx >> 8;
- p[14] = dy;
- p[15] = dy >> 8;
- p[65] = 1; /* number of color planes */
- p[66] = dx; /* scanline length */
- p[67] = dx >> 8;
- p[68] = 2; /* palette type: not-greyscale greyscale */
-
- p = buf + 128;
- for(i=0; i<dy; i++){- for(j=0; j<dx; j++){- if((*src & 0xc0) != 0xc0)
- *p++ = *src++;
- else{- *p++ = 0xc1;
- *p++ = *src++;
- }
- }
- src += xlen - dx;
- }
-
- /* palette */
- *p++ = 0x0c;
- for(i=0; i<3*256; i++)
- *p++ = *pal++;
-
- USED(path);
- /*COM_WriteFile(path, buf, p - buf);*/
-}
-
-static void
-dopcx(void)
-{- int i;
- char pcxname[12], checkname[Nfspath];
-
- writepcx = 0;
-
- /* find a file name to save it to */
- strcpy(pcxname, "quake00.pcx");
- for(i=0; i<100; i++){- pcxname[5] = i / 10 + '0';
- pcxname[6] = i % 10 + '0';
- sprint(checkname, "%s/%s", fsdir, pcxname);
- if(access(checkname, AEXIST) == -1)
- break;
- }
- if(i == 100){- Con_Printf("dopcx: no free slots\n"); - return;
- }
-
- /* save the pcx file */
- D_EnableBackBufferAccess();
- pcxout(pcxname, vid.buffer, vid.width, vid.height, vid.rowbytes,
- host_basepal);
- /* for adapters that can't stay mapped in for linear writes all the
- * time */
- D_DisableBackBufferAccess();
-
- Con_Printf("Wrote %s\n", pcxname);-}
-
-
-//=============================================================================
-
-
/*
===============
SCR_BeginLoadingPlaque
@@ -885,10 +771,6 @@
}
V_UpdatePalette ();
-
- /* needs to be done before vid.buffer is transformed in st3_fixup */
- if(writepcx)
- dopcx();
//
// update one of three areas
--- a/vid.c
+++ b/vid.c
@@ -7,6 +7,7 @@
viddef_t vid; /* global video state */
int resized;
+int dumpwin;
Point center; /* of window */
int d_con_indirect;
void (*vid_menudrawfn)(void);
@@ -191,6 +192,31 @@
freeimage(fbim);
}
+/* only exists to allow taking tear-free screenshots ingame... */
+static int
+writebit(void)
+{+ int n, fd;
+ char *s;
+
+ for(n=0, s=nil; n<100; n++){+ s = va("%s/quake%02d.bit", fsdir, n);+ if(access(s, AEXIST) == -1)
+ break;
+ }
+ if(n == 100){+ werrstr("at static file limit");+ return -1;
+ }
+ if(fd = create(s, OWRITE, 0644), fd < 0)
+ return -1;
+ n = writeimage(fd, fbim, 0);
+ close(fd);
+ if(n >= 0)
+ Con_Printf("Wrote %s\n", s);+ return n;
+}
+
/* flush given rectangles from view buffer to the screen */
void
VID_Update(vrect_t *rects)
@@ -217,6 +243,11 @@
loadimage(fbim, fbim->r, framebuf, vid.height * vid.rowbytes);
draw(screen, screen->r, fbim, nil, ZP);
flushimage(display, 1);
+ if(dumpwin){+ if(writebit() < 0)
+ Con_Printf("writebit: %r\n");+ dumpwin = 0;
+ }
}
/* direct drawing of the "accessing disk" icon */
--
⑨