> 
> 
> On Mon, 3 Jul 2000 [EMAIL PROTECTED] wrote:
> >     I've been struggling to get an output of my screen graphics for
> > the last 2 months. I just need a picture in jpg/png ( a screenshot). How
> > do I do this?
> > 
> >     I am running at 1024x768 at 256 colors (mode 12)
> > 
> >     I can dump a 1024x768 byte memory tofile which I fill with
> > gl_getbox(0,0,1024,768,memory_dump_pointer)
> >     
> >     I can also get a color table of 768 bytes with
> > gl_getpalette(color_table_pointer)
> >     
> >     I save these dumps to file and use netpbm's
> > raw2gif -s 1024 768 -p color_table_file memory_dump_file > out.gif
> 
> Check that the raw files are really correct:
> Try clearing the screen and only drawing a single pixel of color 3 at
> (1,1) and then dump to file and check that the file is all zeros, except
> for a 3 in the 1025th byte.
> Set the palettet to something, and see if the color table file after you
> run your program has the values you programmed.
> 
> 
> -- 
> Matan Ziv-Av.                         [EMAIL PROTECTED]


I've attached a section of code that should do what you want (dumps a
section of the physical screen to a PNG file). I've had to change a few
lines to simplify it. If you have any problems with it look at the bit
that sets the PNG palette and the gl_getbox, everything else is 'as was'
in the working section of code from which it was lifted.

You will need to compile this against libpng 0.81 and the latest version
of zlib.

Regards
Sergio



/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
void print_screen(int x1, int y1, int x2, int y2)
{
        FILE    *fp;

        png_struct
                *png_ptr;

        png_info
                *info_ptr;


static  int     cnt = 0;
        char    fname[256];

        int     xlen, ylen;


        xlen = x2 - x1 + 1;
        ylen = y2 - y1 + 1;


        sprintf(fname, "scrn%04.4d.png", cnt++);


        fp = fopen(fname, "wb");

        if (fp == NULL)
        {       report_error("error %d returned while trying to open PNG file '%s' for 
writing\n",
                        errno, fname);
                abort();
        }

        // allocate the necessary structures
        png_ptr = (png_struct *)malloc(sizeof(png_struct));

        if (png_ptr == NULL)
        {       report_error("could not allocate png_struct\n");
                abort();
        }

        info_ptr = (png_info *)malloc(sizeof(png_info));

        if (info_ptr == NULL)
        {       report_error("could not allocate png_info\n");
                abort();
        }

        // set error handling
        if (setjmp(png_ptr->jmpbuf))
        {       report_error("error returned by png library\n");
                abort();
        }

        // initialize the structures
        png_info_init(info_ptr);
        png_write_init(png_ptr);

        // set up the output control
        png_init_io(png_ptr, fp);

        // set the file information here
        info_ptr->width      = xlen;
        info_ptr->height     = ylen;
        info_ptr->bit_depth  = 8;
        info_ptr->color_type = PNG_COLOR_TYPE_PALETTE;

//----------------------

        // set the palette
        info_ptr->valid |= PNG_INFO_PLTE;
        info_ptr->palette = (png_color *)malloc(256 * sizeof (png_color));
        info_ptr->num_palette = 256;


        int     xred, xgreen, xblue;
        int     adj;
        int     bits_per_colour;

        bits_per_colour = 6;

        adj = 8 - bits_per_colour;


        for (int j=0; j<256; j++)
        {
                vga_getpalette(0, &xred, &xgreen, &xblue);

                info_ptr->palette[j].red   = xred   << adj;
                info_ptr->palette[j].green = xgreen << adj;
                info_ptr->palette[j].blue  = xblue  << adj;
        }

        // write the file information
        png_write_info(png_ptr, info_ptr);


        char *dst;

        dst = (char *) malloc(xlen);

        for ( ; y1<=y2; y1++)
        {
                gl_getbox(0, y1, 1024, y1, dst);

                // Write a row at a time.
                png_write_rows(png_ptr, &dst, 1);
        }

        free dst;

//----------------------

        // write the rest of the file
        png_write_end(png_ptr, NULL);

        // clean up after the write, and free any memory allocated
        png_write_destroy(png_ptr);

        if (info_ptr->palette)
        {       // a palette was used, so free it
                free(info_ptr->palette);
        }

        // free the structures
        free(png_ptr);
        free(info_ptr);

        if (fclose(fp) == -1)
        {       report_error("error %d returned while trying to close PNG file\n",
                        errno);
                abort();
        }
}


Reply via email to