]> git.jsancho.org Git - lugaru.git/commitdiff
Implemented screenshots without DevIL...now DevIL is totally unrequired.
authorRyan C. Gordon <icculus@icculus.org>
Sat, 6 Aug 2005 19:38:02 +0000 (19:38 +0000)
committerRyan C. Gordon <icculus@icculus.org>
Sat, 6 Aug 2005 19:38:02 +0000 (19:38 +0000)
Source/GameTick.cpp
Source/MacCompatibility.h
Source/OpenGL_Windows.cpp

index 853c5ca73494709a566634564dcdf90ed4c1c1e5..eeb0619b95c88764d37c4ceeb4784c51777cb3ed 100644 (file)
@@ -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"*/);
index 932d0a0fdfa7b85d237048f125a4e898f01bb68b..d1096ae609b28c5f058b74d249059a4f686164ba 100644 (file)
@@ -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)
 {
index 8ce1a4ce34e88a150d2c357054a4601a096d30e6..77f0c305162f129d027c723b9238c3f55c2d5cd3 100644 (file)
@@ -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