X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscreen%2Fscreen-dump.cxx;h=ecea865933dae8f7a7e363bd0e5f8620f4261bde;hb=5f804cb0eb126ab7162855dad14d20eb381309c6;hp=4be5096068fdbb202c8b00064491ca8c77233dfd;hpb=5173d709e090b953eaf800cbcd1bf897de332a12;p=simgear.git diff --git a/simgear/screen/screen-dump.cxx b/simgear/screen/screen-dump.cxx index 4be50960..ecea8659 100644 --- a/simgear/screen/screen-dump.cxx +++ b/simgear/screen/screen-dump.cxx @@ -2,82 +2,83 @@ // // Contributed by Richard Kaszeta , started October 1999. // -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. // -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. +// Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ #ifdef HAVE_CONFIG_H -# include +# include #endif -#ifdef HAVE_WINDOWS_H -# include +#ifdef WIN32 +# include #endif #include #include #include -#include -#include +#include + +#include +#include #include "screen-dump.hxx" -#define RGB 3 // 3 bytes of color info per pixel +#define RGB3 3 // 3 bytes of color info per pixel #define RGBA 4 // 4 bytes of color+alpha info -void my_glWritePPMFile(const char *filename, GLubyte *buffer, int win_width, int win_height, int mode) +bool sg_glWritePPMFile(const char *filename, GLubyte *buffer, int win_width, int win_height, int mode) { int i, j, k, q; unsigned char *ibuffer; FILE *fp; int pixelSize = mode==GL_RGBA?4:3; - ibuffer = (unsigned char *) malloc(win_width*win_height*RGB); + ibuffer = (unsigned char *) malloc(win_width*win_height*RGB3); + + if ( (fp = fopen(filename, "wb")) == NULL ) { + free(ibuffer); + printf("Warning: cannot open %s\n", filename); + return false; + } - fp = fopen(filename, "wb"); fprintf(fp, "P6\n# CREATOR: glReadPixel()\n%d %d\n%d\n", win_width, win_height, UCHAR_MAX); q = 0; for (i = 0; i < win_height; i++) for (j = 0; j < win_width; j++) - for (k = 0; k < RGB; k++) + for (k = 0; k < RGB3; k++) ibuffer[q++] = (unsigned char) *(buffer + (pixelSize*((win_height-1-i)*win_width+j)+k)); - fwrite(ibuffer, sizeof(unsigned char), RGB*win_width*win_height, fp); + fwrite(ibuffer, sizeof(unsigned char), RGB3*win_width*win_height, fp); fclose(fp); free(ibuffer); - printf("wrote file (%d x %d pixels, %d bytes)\n", - win_width, win_height, RGB*win_width*win_height); + printf("wrote file '%s' (%d x %d pixels, %d bytes)\n", + filename, win_width, win_height, RGB3*win_width*win_height); + return true; } -// dump the screen buffer to a ppm file -void my_glDumpWindow(const char *filename, int win_width, int win_height) { - GLubyte *buffer; - - buffer = (GLubyte *) malloc(win_width*win_height*RGBA); - - // read window contents from color buffer with glReadPixels - glFinish(); - glReadPixels(0, 0, win_width, win_height, - GL_RGBA, GL_UNSIGNED_BYTE, buffer); - my_glWritePPMFile( filename, buffer, win_width, win_height, GL_RGBA ); - free(buffer); +// dump the screen buffer to a png file, returns true on success +bool sg_glDumpWindow(const char *filename, int win_width, int win_height) { + osg::ref_ptr img(new osg::Image); + img->readPixels(0,0, win_width, win_height, GL_RGB, GL_UNSIGNED_BYTE); + return osgDB::writeImageFile(*img, filename); }