Blob Blame History Raw
This patch is from netbsd pkgsrc

ftp://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/x11/fbdesk/patches

--- src/FbTk/ImagePNG.cc
+++ src/FbTk/ImagePNG.cc
@@ -76,6 +76,8 @@ ImagePNG::~ImagePNG() {
 }
 
 PixmapWithMask *ImagePNG::load(const std::string &filename, int screen_num) const {
+    int pixel_depth;
+    int rowbytes;
     if (filename.empty())
         return 0;
 #ifdef DEBUG
@@ -102,7 +104,7 @@ PixmapWithMask *ImagePNG::load(const std
         return 0;
     }
 
-    if (setjmp(png.png()->jmpbuf)) {
+    if (setjmp(png_jmpbuf(png.png()))) {
         fclose(fp);
         return 0;
     }
@@ -115,12 +117,14 @@ PixmapWithMask *ImagePNG::load(const std
     png_get_IHDR(png.png(), png.info(), &w, &h,
                  &bit_depth, &color_type,
                  &interlace_type, 0, 0);
+    pixel_depth = bit_depth * png_get_channels(png.png(), png.info());
+    rowbytes = png_get_rowbytes(png.png(), png.info());
 #ifdef DEBUG    
-    cerr<<png.info()->width<<", "<<png.info()->height<<endl;
-    cerr<<"bit_depth = "<<(int)png.info()->bit_depth<<endl;
-    cerr<<"bytes per pixel = "<<((int)png.info()->bit_depth>>3)<<endl;
-    cerr<<"pixel depth = "<<(int)png.info()->pixel_depth<<endl;
-    cerr<<"rowbytes = "<<png.info()->rowbytes<<endl;
+    cerr<<png_get_image_width(png.png(), png.info())<<", "<<png_get_image_height(png.png(), png.info())<<endl;
+    cerr<<"bit_depth = "<<(int)png_get_bit_depth(png.png(),png.info())<<endl;
+    cerr<<"bytes per pixel = "<<((int)png_get_bit_depth(png.png(), png.info())>>3)<<endl;
+    cerr<<"pixel depth = "<<pixel_depth<<endl;
+    cerr<<"rowbytes = "<<rowbytes<<endl;
     cerr<<"Color type = ";
     switch (color_type) {
     case PNG_COLOR_TYPE_GRAY:
@@ -146,7 +150,7 @@ PixmapWithMask *ImagePNG::load(const std
     // convert to rgb
     if (color_type == PNG_COLOR_TYPE_PALETTE && bit_depth <= 8) {
         png_set_expand(png.png());
-        png.info()->pixel_depth = 8;
+        pixel_depth = 8;
     }
     // convert to rgb
     if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) {
@@ -158,7 +162,7 @@ PixmapWithMask *ImagePNG::load(const std
     if (color_type == PNG_COLOR_TYPE_GRAY ||
         color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
         png_set_gray_to_rgb(png.png());
-        png.info()->pixel_depth = 8;
+        pixel_depth = 8;
         color_type = PNG_COLOR_TYPE_RGB;
     }
 
@@ -170,23 +174,23 @@ PixmapWithMask *ImagePNG::load(const std
     // expand to 4 bytes
     if (bit_depth == 8 && color_type == PNG_COLOR_TYPE_RGB) {
         png_set_filler(png.png(), 0, PNG_FILLER_AFTER);
-        png.info()->rowbytes = png.info()->width * 4;
-        png.info()->pixel_depth = 32;
+        rowbytes = png_get_image_width(png.png(), png.info()) * 4;
+        pixel_depth = 32;
     }
     
-    if (png.info()->pixel_depth == 4 ||
-        png.info()->pixel_depth == 8)
+    if (pixel_depth == 4 ||
+        pixel_depth == 8)
         return 0;
 
     // create memory to hold rows
-    png_bytep *row_pointers = new (nothrow) png_bytep[png.info()->height];
+    png_bytep *row_pointers = new (nothrow) png_bytep[png_get_image_height(png.png(), png.info())];
     if (row_pointers == 0) {
         fclose(fp);
         return 0;
     }
 
-    for (unsigned int row = 0; row < png.info()->height; ++row) {
-        row_pointers[row] = new png_byte[png.info()->rowbytes];
+    for (unsigned int row = 0; row < png_get_image_height(png.png(), png.info()); ++row) {
+        row_pointers[row] = new png_byte[rowbytes];
     }
 
     // get transparent pixel
@@ -214,31 +218,31 @@ PixmapWithMask *ImagePNG::load(const std
     fclose(fp);
 
     // clear linear memory
-    char *data = new char[png.info()->rowbytes * png.info()->height];
-    for (int offset=0, y = 0; y < png.info()->height; y++) {
-        for (int x = 0; x < png.info()->rowbytes; x++, offset++) {
+    char *data = new char[rowbytes * png_get_image_height(png.png(), png.info())];
+    for (int offset=0, y = 0; y < png_get_image_height(png.png(), png.info()); y++) {
+        for (int x = 0; x < rowbytes; x++, offset++) {
             data[offset] = row_pointers[y][x];
         }
     }
 
-    FbTk::Surface *srf = new (nothrow) FbTk::Surface(png.info()->width, png.info()->height,
-                                                     png.info()->pixel_depth);
+    FbTk::Surface *srf = new (nothrow) FbTk::Surface(png_get_image_width(png.png(), png.info()), png_get_image_height(png.png(), png.info()),
+                                                     pixel_depth);
 
     if (srf == 0)
         return 0;
 
 
     // finaly copy data to surface
-    switch (png.info()->pixel_depth) {
+    switch (pixel_depth) {
     case 16:
         convert16to32(data, *srf);
         break;
     case 24:
     case 32:
-        memcpy(srf->data(), data, png.info()->height * png.info()->rowbytes);
+        memcpy(srf->data(), data, png_get_image_height(png.png(), png.info()) * rowbytes);
         break;
     default:
-        cerr<<"ImagePNG: Can't convert from "<<(int)png.info()->pixel_depth<<" to 32bpp."<<endl;
+        cerr<<"ImagePNG: Can't convert from "<<pixel_depth<<" to 32bpp."<<endl;
         break;
     }
     
@@ -264,9 +268,9 @@ PixmapWithMask *ImagePNG::load(const std
         long i = 0x44332211;
         unsigned char* a = (unsigned char*) &i;
         bool big_endian = (*a != 0x11);
-        int alphacolor = ((png.info()->channels != 4) ? 0xFF000000 : 0);
+        int alphacolor = ((png_get_channels(png.png(), png.info()) != 4) ? 0xFF000000 : 0);
         if (big_endian) {
-            int shift = ((png.info()->channels == 4) ? 0 : 8);
+            int shift = ((png_get_channels(png.png(), png.info()) == 4) ? 0 : 8);
             alphacolor = (0xFF >> shift);    
         }
         screen_surf.setColorKey(alphacolor, true);