This patch is from netbsd pkgsrc ftp://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/x11/fbdesk/patches --- a/src/FbTk/ImagePNG.cc +++ b/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);