For completion, qt3 should also serialize long long in, but that's a more intrusive change, and it's not really needed to keep existing things compiling. Obviously, this code is totally different and 64 bits capable in qt4. this fixes the build of kdepim3 post 64 bits time_t. problem noticed by sthen@.
211 lines
6.9 KiB
Plaintext
211 lines
6.9 KiB
Plaintext
$OpenBSD: patch-src_kernel_qpngio_cpp,v 1.4 2013/04/29 10:44:43 espie Exp $
|
|
--- src/kernel/qpngio.cpp.orig Fri Feb 2 15:01:15 2007
|
|
+++ src/kernel/qpngio.cpp Sat Apr 27 10:56:50 2013
|
|
@@ -43,6 +43,7 @@
|
|
#include "qiodevice.h"
|
|
|
|
#include <png.h>
|
|
+#include <zlib.h>
|
|
|
|
|
|
#ifdef Q_OS_TEMP
|
|
@@ -123,9 +124,24 @@ void setup_qt( QImage& image, png_structp png_ptr, png
|
|
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
|
|
0, 0, 0);
|
|
|
|
+ png_colorp info_ptr_palette = NULL;
|
|
+ int info_ptr_num_palette = 0;
|
|
+ if (png_get_valid(png_ptr, info_ptr, PNG_INFO_PLTE)) {
|
|
+ png_get_PLTE(png_ptr, info_ptr, &info_ptr_palette, &info_ptr_num_palette);
|
|
+ }
|
|
+
|
|
+ png_bytep info_ptr_trans_alpha = NULL;
|
|
+ int info_ptr_num_trans = 0;
|
|
+ png_color_16p info_ptr_trans_color = NULL;
|
|
+
|
|
+ if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
|
|
+ png_get_tRNS(png_ptr, info_ptr, &info_ptr_trans_alpha, &info_ptr_num_trans, &info_ptr_trans_color);
|
|
+ }
|
|
+
|
|
+
|
|
if ( color_type == PNG_COLOR_TYPE_GRAY ) {
|
|
// Black & White or 8-bit grayscale
|
|
- if ( bit_depth == 1 && info_ptr->channels == 1 ) {
|
|
+ if ( bit_depth == 1 && png_get_channels(png_ptr, info_ptr) == 1 ) {
|
|
png_set_invert_mono( png_ptr );
|
|
png_read_update_info( png_ptr, info_ptr );
|
|
if (!image.create( width, height, 1, 2, QImage::BigEndian ))
|
|
@@ -159,7 +175,7 @@ void setup_qt( QImage& image, png_structp png_ptr, png
|
|
image.setColor( i, qRgba(c,c,c,0xff) );
|
|
}
|
|
if ( png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS) ) {
|
|
- const int g = info_ptr->trans_values.gray;
|
|
+ const int g = info_ptr_trans_color->gray;
|
|
if (g < ncols) {
|
|
image.setAlphaBuffer(TRUE);
|
|
image.setColor(g, image.color(g) & RGB_MASK);
|
|
@@ -168,7 +184,7 @@ void setup_qt( QImage& image, png_structp png_ptr, png
|
|
}
|
|
} else if ( color_type == PNG_COLOR_TYPE_PALETTE
|
|
&& png_get_valid(png_ptr, info_ptr, PNG_INFO_PLTE)
|
|
- && info_ptr->num_palette <= 256 )
|
|
+ && info_ptr_num_palette <= 256 )
|
|
{
|
|
// 1-bit and 8-bit color
|
|
if ( bit_depth != 1 )
|
|
@@ -176,28 +192,28 @@ void setup_qt( QImage& image, png_structp png_ptr, png
|
|
png_read_update_info( png_ptr, info_ptr );
|
|
png_get_IHDR(png_ptr, info_ptr,
|
|
&width, &height, &bit_depth, &color_type, 0, 0, 0);
|
|
- if (!image.create(width, height, bit_depth, info_ptr->num_palette,
|
|
+ if (!image.create(width, height, bit_depth, info_ptr_num_palette,
|
|
QImage::BigEndian))
|
|
return;
|
|
int i = 0;
|
|
if ( png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS) ) {
|
|
image.setAlphaBuffer( TRUE );
|
|
- while ( i < info_ptr->num_trans ) {
|
|
+ while ( i < info_ptr_num_trans ) {
|
|
image.setColor(i, qRgba(
|
|
- info_ptr->palette[i].red,
|
|
- info_ptr->palette[i].green,
|
|
- info_ptr->palette[i].blue,
|
|
- info_ptr->trans[i]
|
|
+ info_ptr_palette[i].red,
|
|
+ info_ptr_palette[i].green,
|
|
+ info_ptr_palette[i].blue,
|
|
+ info_ptr_trans_alpha[i]
|
|
)
|
|
);
|
|
i++;
|
|
}
|
|
}
|
|
- while ( i < info_ptr->num_palette ) {
|
|
+ while ( i < info_ptr_num_palette ) {
|
|
image.setColor(i, qRgba(
|
|
- info_ptr->palette[i].red,
|
|
- info_ptr->palette[i].green,
|
|
- info_ptr->palette[i].blue,
|
|
+ info_ptr_palette[i].red,
|
|
+ info_ptr_palette[i].green,
|
|
+ info_ptr_palette[i].blue,
|
|
0xff
|
|
)
|
|
);
|
|
@@ -284,7 +300,7 @@ void read_png_image(QImageIO* iio)
|
|
return;
|
|
}
|
|
|
|
- if (setjmp(png_ptr->jmpbuf)) {
|
|
+ if (setjmp(png_jmpbuf(png_ptr))) {
|
|
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
|
|
iio->setStatus(-4);
|
|
return;
|
|
@@ -469,7 +485,7 @@ bool QPNGImageWriter::writeImage(const QImage& image,
|
|
return FALSE;
|
|
}
|
|
|
|
- if (setjmp(png_ptr->jmpbuf)) {
|
|
+ if (setjmp(png_jmpbuf(png_ptr))) {
|
|
png_destroy_write_struct(&png_ptr, &info_ptr);
|
|
return FALSE;
|
|
}
|
|
@@ -491,10 +507,15 @@ bool QPNGImageWriter::writeImage(const QImage& image,
|
|
|
|
png_set_write_fn(png_ptr, (void*)this, qpiw_write_fn, qpiw_flush_fn);
|
|
|
|
+/*
|
|
+according to png.h, channels is only used on read, not writes, so we
|
|
+should be able to comment this out.
|
|
+
|
|
info_ptr->channels =
|
|
(image.depth() == 32)
|
|
? (image.hasAlphaBuffer() ? 4 : 3)
|
|
: 1;
|
|
+*/
|
|
|
|
png_set_IHDR(png_ptr, info_ptr, image.width(), image.height(),
|
|
image.depth() == 1 ? 1 : 8 /* per channel */,
|
|
@@ -504,11 +525,12 @@ bool QPNGImageWriter::writeImage(const QImage& image,
|
|
: PNG_COLOR_TYPE_RGB
|
|
: PNG_COLOR_TYPE_PALETTE, 0, 0, 0);
|
|
|
|
+ png_color_8 sig_bit;
|
|
+ sig_bit.red = 8;
|
|
+ sig_bit.green = 8;
|
|
+ sig_bit.blue = 8;
|
|
+ png_set_sBIT(png_ptr, info_ptr, &sig_bit);
|
|
|
|
- //png_set_sBIT(png_ptr, info_ptr, 8);
|
|
- info_ptr->sig_bit.red = 8;
|
|
- info_ptr->sig_bit.green = 8;
|
|
- info_ptr->sig_bit.blue = 8;
|
|
|
|
if (image.depth() == 1 && image.bitOrder() == QImage::LittleEndian)
|
|
png_set_packswap(png_ptr);
|
|
@@ -522,11 +544,14 @@ bool QPNGImageWriter::writeImage(const QImage& image,
|
|
png_set_PLTE(png_ptr, info_ptr, palette, num_palette);
|
|
int* trans = new int[num_palette];
|
|
int num_trans = 0;
|
|
+ png_colorp info_ptr_palette = NULL;
|
|
+ int tmp;
|
|
+ png_get_PLTE(png_ptr, info_ptr, &info_ptr_palette, &tmp);
|
|
for (int i=0; i<num_palette; i++) {
|
|
QRgb rgb=image.color(i);
|
|
- info_ptr->palette[i].red = qRed(rgb);
|
|
- info_ptr->palette[i].green = qGreen(rgb);
|
|
- info_ptr->palette[i].blue = qBlue(rgb);
|
|
+ info_ptr_palette[i].red = qRed(rgb);
|
|
+ info_ptr_palette[i].green = qGreen(rgb);
|
|
+ info_ptr_palette[i].blue = qBlue(rgb);
|
|
if (image.hasAlphaBuffer()) {
|
|
trans[i] = rgb >> 24;
|
|
if (trans[i] < 255) {
|
|
@@ -534,6 +559,7 @@ bool QPNGImageWriter::writeImage(const QImage& image,
|
|
}
|
|
}
|
|
}
|
|
+ png_set_PLTE(png_ptr, info_ptr, info_ptr_palette, num_palette);
|
|
if (num_trans) {
|
|
copy_trans = new png_byte[num_trans];
|
|
for (int i=0; i<num_trans; i++)
|
|
@@ -544,7 +570,10 @@ bool QPNGImageWriter::writeImage(const QImage& image,
|
|
}
|
|
|
|
if ( image.hasAlphaBuffer() ) {
|
|
- info_ptr->sig_bit.alpha = 8;
|
|
+ png_color_8p sig_bit;
|
|
+ png_get_sBIT(png_ptr, info_ptr, &sig_bit);
|
|
+ sig_bit->alpha = 8;
|
|
+ png_set_sBIT(png_ptr, info_ptr, sig_bit);
|
|
}
|
|
|
|
// Swap ARGB to RGBA (normal PNG format) before saving on
|
|
@@ -1030,7 +1059,7 @@ int QPNGFormat::decode(QImage& img, QImageConsumer* co
|
|
return -1;
|
|
}
|
|
|
|
- if (setjmp((png_ptr)->jmpbuf)) {
|
|
+ if (setjmp(png_jmpbuf(png_ptr))) {
|
|
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
|
|
image = 0;
|
|
return -1;
|
|
@@ -1057,7 +1086,7 @@ int QPNGFormat::decode(QImage& img, QImageConsumer* co
|
|
|
|
if ( !png_ptr ) return 0;
|
|
|
|
- if (setjmp(png_ptr->jmpbuf)) {
|
|
+ if (setjmp(png_jmpbuf(png_ptr))) {
|
|
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
|
|
image = 0;
|
|
state = MovieStart;
|
|
@@ -1117,7 +1146,7 @@ void QPNGFormat::end(png_structp png, png_infop info)
|
|
consumer->frameDone(QPoint(offx,offy),r);
|
|
consumer->end();
|
|
state = FrameStart;
|
|
- unused_data = (int)png->buffer_size; // Since libpng doesn't tell us
|
|
+ unused_data = png_process_data_pause(png, 0);
|
|
}
|
|
|
|
#ifdef PNG_USER_CHUNKS_SUPPORTED
|