Re: Screenshots?

Search this archive.

From: Johannes Zellner (johannes@zellner.org)
Date: Thu 09 Nov 2000 - 19:21:20 IST


On Thu, Nov 09, 2000 at 09:39:06AM -0600, Remenic wrote:
> Hi there,
> 
> Has anyone written code before that makes a screenshot of the current 
> physicalscreen, and saves it to a file(png, or anything)?

yes. I've. Here's a snipped, hope it helps. It writes a ppm.
It was written for an 8bit visual, but I think you get the
idea. P6 can do any number of colors, you can use the third
line of the P6 header to specify the color depth.
Basically a P6 file looks like this:

P6       (ppm format)
200 200  (width, height)
255      (color depth)
pixel1.red pixel1.green pixel1.blue pixel2.red ...

This was a quick hack and I used it only for debugging. If
you don't understand parts of the code, don't hestitate to
ask me!

void
VGAGL_write_dump_file(void)
{
    FILE* fp;
    unsigned char* buf;
    unsigned char* bufptr;
    int x, y, index;
    char thisfile[0xff];
    static int thisfileno = 0;
    if (!VGAGL_dump_file) {
	return;
    }
    sprintf(thisfile, "%s%05d.ppm", VGAGL_dump_file, thisfileno++);
    fp = fopen(thisfile, "w");
    if (!fp) {
	free(VGAGL_dump_file);
	VGAGL_dump_file = 0;
    }
    fprintf(fp, "P6\n");
    fprintf(fp, "%d %d\n", modeinfo->width, modeinfo->height);
    fprintf(fp, "255\n");
    buf = gp_alloc(modeinfo->width * modeinfo->height * 3, "vgagl->buf");
    bufptr = buf;
    for (y = 0; y < modeinfo->height; y++) {
	for (x = 0; x < modeinfo->width; x++) {
	    index = gl_getpixel(x, y);
	    while (index < 0) {
		/* this is a kludge, as gl_getpixel() seems to 
		 * return pixels > 128 as the negative complement */
		index += 256;
	    }
	    *bufptr++ = VGAGL_palette[index][0];
	    *bufptr++ = VGAGL_palette[index][1];
	    *bufptr++ = VGAGL_palette[index][2];
	}
    }
    fwrite(buf, 3, modeinfo->width * modeinfo->height, fp);
    fclose(fp);
}

-- 
   Johannes

------------------------------------------------------------------
Unsubscribe:  To:   listbot@svgalib.org
              Body: unsubscribe linux-svgalib


This archive was generated by hypermail 2.1.4 : Wed 21 Jan 2004 - 22:10:23 IST