]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/imagpng.cpp
wxMac uses wxStandardPathsCF to mean wxStandardPaths in its wxBase
[wxWidgets.git] / src / common / imagpng.cpp
index 250fac506acf6d28c269c35c0d0d6689b403ef6b..54c3ac8819c0a61afbf4de00cb55aefb6baf18b6 100644 (file)
@@ -175,28 +175,16 @@ void PNGLINKAGEMODE wx_PNG_stream_writer( png_structp png_ptr, png_bytep data,
 // from pngerror.c
 // so that the libpng doesn't send anything on stderr
 void
-PNGLINKAGEMODE wx_png_error(png_structp png_ptr, png_const_charp message)
+PNGLINKAGEMODE wx_png_error(png_structp WXUNUSED(png_ptr), png_const_charp message)
 {
-    wxPNGInfoStruct *info = WX_PNG_INFO(png_ptr);
-    if (info->verbose)
-        wxLogError( wxString::FromAscii(message) );
-
-#ifdef USE_FAR_KEYWORD
-    {
-       jmp_buf jmpbuf;
-       png_memcpy(jmpbuf,info->jmpbuf,sizeof(jmp_buf));
-       longjmp(jmpbuf, 1);
-    }
-#else
-    longjmp(info->jmpbuf, 1);
-#endif
+    wxLogFatalError( wxString::FromAscii(message) );
 }
 
 void
 PNGLINKAGEMODE wx_png_warning(png_structp png_ptr, png_const_charp message)
 {
-    wxPNGInfoStruct *info = WX_PNG_INFO(png_ptr);
-    if (info->verbose)
+    wxPNGInfoStruct *info = png_ptr ? WX_PNG_INFO(png_ptr) : NULL;
+    if ( !info || info->verbose )
         wxLogWarning( wxString::FromAscii(message) );
 }
 
@@ -321,7 +309,7 @@ bool wxPNGHandler::DoCanRead( wxInputStream& stream )
     unsigned char hdr[4];
 
     if ( !stream.Read(hdr, WXSIZEOF(hdr)) )
-        return FALSE;
+        return false;
 
     return memcmp(hdr, "\211PNG", WXSIZEOF(hdr)) == 0;
 }
@@ -531,15 +519,16 @@ wxPNGHandler::LoadFile(wxImage *image,
 
     image->Destroy();
 
-    png_structp png_ptr = png_create_read_struct( PNG_LIBPNG_VER_STRING,
-        (voidp) NULL,
-        (png_error_ptr) NULL,
-        (png_error_ptr) NULL );
+    png_structp png_ptr = png_create_read_struct
+                          (
+                            PNG_LIBPNG_VER_STRING,
+                            (voidp) NULL,
+                            wx_png_error,
+                            wx_png_warning
+                          );
     if (!png_ptr)
         goto error;
 
-    png_set_error_fn(png_ptr, (png_voidp)NULL, wx_png_error, wx_png_warning);
-
     // NB: please see the comment near wxPNGInfoStruct declaration for
     //     explanation why this line is mandatory
     png_set_read_fn( png_ptr, &wxinfo, wx_PNG_stream_reader);
@@ -570,7 +559,7 @@ wxPNGHandler::LoadFile(wxImage *image,
         png_set_expand( png_ptr );
     png_set_filler( png_ptr, 0xff, PNG_FILLER_AFTER );
 
-    image->Create( (int)width, (int)height );
+    image->Create((int)width, (int)height, (bool) false /* no need to init pixels */);
 
     if (!image->Ok())
         goto error;
@@ -600,7 +589,7 @@ wxPNGHandler::LoadFile(wxImage *image,
         free( lines[i] );
     free( lines );
 
-    return TRUE;
+    return true;
 
 error:
     if (verbose)
@@ -626,7 +615,7 @@ error:
         else
             png_destroy_read_struct( &png_ptr, (png_infopp) NULL, (png_infopp) NULL );
     }
-    return FALSE;
+    return false;
 }
 
 // ----------------------------------------------------------------------------
@@ -640,23 +629,27 @@ bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos
     wxinfo.verbose = verbose;
     wxinfo.stream.out = &stream;
 
-    png_structp png_ptr = png_create_write_struct( PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+    png_structp png_ptr = png_create_write_struct
+                          (
+                            PNG_LIBPNG_VER_STRING,
+                            NULL,
+                            wx_png_error,
+                            wx_png_warning
+                          );
     if (!png_ptr)
     {
         if (verbose)
            wxLogError(_("Couldn't save PNG image."));
-        return FALSE;
+        return false;
     }
 
-    png_set_error_fn(png_ptr, (png_voidp)NULL, wx_png_error, wx_png_warning);
-
     png_infop info_ptr = png_create_info_struct(png_ptr);
     if (info_ptr == NULL)
     {
         png_destroy_write_struct( &png_ptr, (png_infopp)NULL );
         if (verbose)
            wxLogError(_("Couldn't save PNG image."));
-        return FALSE;
+        return false;
     }
 
     if (setjmp(wxinfo.jmpbuf))
@@ -664,7 +657,7 @@ bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos
         png_destroy_write_struct( &png_ptr, (png_infopp)NULL );
         if (verbose)
            wxLogError(_("Couldn't save PNG image."));
-        return FALSE;
+        return false;
     }
 
     // NB: please see the comment near wxPNGInfoStruct declaration for
@@ -689,7 +682,7 @@ bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos
     if (!data)
     {
         png_destroy_write_struct( &png_ptr, (png_infopp)NULL );
-        return FALSE;
+        return false;
     }
 
     for (int y = 0; y < image->GetHeight(); y++)
@@ -700,7 +693,11 @@ bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos
             data[(x << 2) + 0] = *ptr++;
             data[(x << 2) + 1] = *ptr++;
             data[(x << 2) + 2] = *ptr++;
-            if (( !image->HasMask() ) || \
+            if ( image->HasAlpha() )
+            {
+                data[(x << 2) + 3] = image->GetAlpha(x, y);
+            }
+            else if (( !image->HasMask() ) || \
                 (data[(x << 2) + 0] != image->GetMaskRed()) || \
                 (data[(x << 2) + 1] != image->GetMaskGreen()) || \
                 (data[(x << 2) + 2] != image->GetMaskBlue()))
@@ -720,7 +717,7 @@ bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos
     png_write_end( png_ptr, info_ptr );
     png_destroy_write_struct( &png_ptr, (png_infopp)&info_ptr );
 
-    return TRUE;
+    return true;
 }
 
 #ifdef __VISUALC__