From: Ryan C. Gordon Date: Sat, 6 Aug 2005 19:38:02 +0000 (+0000) Subject: Implemented screenshots without DevIL...now DevIL is totally unrequired. X-Git-Url: https://git.jsancho.org/?a=commitdiff_plain;h=d9bff07d8752bf235679170c94faf3501ccd7627;p=lugaru.git Implemented screenshots without DevIL...now DevIL is totally unrequired. --- diff --git a/Source/GameTick.cpp b/Source/GameTick.cpp index 853c5ca..eeb0619 100644 --- a/Source/GameTick.cpp +++ b/Source/GameTick.cpp @@ -213,7 +213,7 @@ void Screenshot (void) char temp[1024]; time_t t = time(NULL); struct tm *tme = localtime(&t); - sprintf(temp, "Screenshots\\Screenshot_%04d_%02d_%02d--%02d_%02d_%02d.png", tme->tm_year + 1900, tme->tm_mon + 1, tme->tm_mday, tme->tm_hour, tme->tm_min, tme->tm_sec); + sprintf(temp, "Screenshots/Screenshot_%04d_%02d_%02d--%02d_%02d_%02d.png", tme->tm_year + 1900, tme->tm_mon + 1, tme->tm_mday, tme->tm_hour, tme->tm_min, tme->tm_sec); mkdir("Screenshots", S_IRWXU); ScreenShot(temp/*"Screenshots\\Screenshot.png"*/); diff --git a/Source/MacCompatibility.h b/Source/MacCompatibility.h index 932d0a0..d1096ae 100644 --- a/Source/MacCompatibility.h +++ b/Source/MacCompatibility.h @@ -85,7 +85,7 @@ typedef unsigned int uintptr_t; // fix file names to use '/' instead of ':' char* ConvertFileName( const char* orgfilename); -#define fopen( a, b) fopen( ConvertFileName( a), b); +#define fopen( a, b) fopen( ConvertFileName( a), b) /* inline float abs( float f) { diff --git a/Source/OpenGL_Windows.cpp b/Source/OpenGL_Windows.cpp index 8ce1a4c..77f0c30 100644 --- a/Source/OpenGL_Windows.cpp +++ b/Source/OpenGL_Windows.cpp @@ -25,6 +25,8 @@ static bool load_image(const char * fname, TGAImageRec & tex); static bool load_png(const char * fname, TGAImageRec & tex); static bool load_jpg(const char * fname, TGAImageRec & tex); + static bool save_image(const char * fname); + static bool save_png(const char * fname); #endif // ADDED GWC @@ -2204,7 +2206,7 @@ int main (void) free(f); #else - STUBBED("Non-DevIL screenshot"); + save_image(fname); #endif } @@ -2246,7 +2248,7 @@ static bool load_jpg(const char *file_name, TGAImageRec &tex) struct my_error_mgr jerr; JSAMPROW buffer[1]; /* Output row buffer */ int row_stride; /* physical row width in output buffer */ - FILE *infile = fopen(file_name, "rb") + FILE *infile = fopen(file_name, "rb"); if (infile == NULL) return false; @@ -2286,6 +2288,7 @@ static bool load_jpg(const char *file_name, TGAImageRec &tex) return true; } + /* stolen from public domain example.c code in libpng distribution. */ static bool load_png(const char *file_name, TGAImageRec &tex) { @@ -2370,53 +2373,95 @@ static bool load_png(const char *file_name, TGAImageRec &tex) retval = true; png_done: - png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL); - fclose(fp); - return (retval); + png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL); + if (fp) + fclose(fp); + return (retval); } -#if 0 -void save_png(char *file_name /* , ... other image information ... */) + +static bool save_image(const char *file_name) { - FILE *fp; - png_structp png_ptr; - png_infop info_ptr; - - /* open the file */ - fp = fopen(file_name, "wb"); - if (fp == NULL) - return (ERROR); - - png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (png_ptr == NULL) - { - fclose(fp); - return (ERROR); - } - - info_ptr = png_create_info_struct(png_ptr); - if (info_ptr == NULL) - { - fclose(fp); - png_destroy_write_struct(&png_ptr, png_infopp_NULL); - return (ERROR); - } - - if (setjmp(png_jmpbuf(png_ptr))) - { - /* If we get here, we had a problem reading the file */ - fclose(fp); - png_destroy_write_struct(&png_ptr, &info_ptr); - return (ERROR); - } - - png_init_io(png_ptr, fp); - png_write_png(png_ptr, info_ptr, png_transforms, png_voidp_NULL); - png_destroy_write_struct(&png_ptr, &info_ptr); - fclose(fp); - return (OK); + char *ptr = strrchr(file_name, '.'); + if (ptr) + { + if (stricmp(ptr+1, "png") == 0) + return save_png(file_name); + } + + STUBBED("Unsupported image type"); + return false; +} + + +static bool save_png(const char *file_name) +{ + FILE *fp = NULL; + png_structp png_ptr = NULL; + png_infop info_ptr = NULL; + bool retval = false; + + fp = fopen(file_name, "wb"); + if (fp == NULL) + return false; + + png_bytep *row_pointers = new png_bytep[kContextHeight]; + png_bytep screenshot = new png_byte[kContextWidth * kContextHeight * 3]; + if ((!screenshot) || (!row_pointers)) + goto save_png_done; + + glGetError(); + glReadPixels(0, 0, kContextWidth, kContextHeight, + GL_RGB, GL_UNSIGNED_BYTE, screenshot); + if (glGetError() != GL_NO_ERROR) + goto save_png_done; + + for (int i = 0; i < kContextHeight; i++) + row_pointers[i] = screenshot + ((kContextWidth * ((kContextHeight-1) - i)) * 3); + + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (png_ptr == NULL) + goto save_png_done; + + info_ptr = png_create_info_struct(png_ptr); + if (info_ptr == NULL) + goto save_png_done; + + if (setjmp(png_jmpbuf(png_ptr))) + goto save_png_done; + + png_init_io(png_ptr, fp); + + if (setjmp(png_jmpbuf(png_ptr))) + goto save_png_done; + + png_set_IHDR(png_ptr, info_ptr, kContextWidth, kContextHeight, + 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + + png_write_info(png_ptr, info_ptr); + + if (setjmp(png_jmpbuf(png_ptr))) + goto save_png_done; + + png_write_image(png_ptr, row_pointers); + + if (setjmp(png_jmpbuf(png_ptr))) + goto save_png_done; + + png_write_end(png_ptr, NULL); + retval = true; + +save_png_done: + png_destroy_write_struct(&png_ptr, &info_ptr); + delete[] screenshot; + delete[] row_pointers; + if (fp) + fclose(fp); + if (!retval) + unlink(ConvertFileName(file_name)); + return retval; } -#endif #endif