Bug#333542: [Issue N89425] QImageIO::setGamma doesn't work on PNG

2005-10-21 Thread Christopher Martin
On October 21, 2005 09:49, Charles Samuels wrote:
> The following patches actually fix the problem, so that Konqueror has
> correct gamma images according to
> http://www.w3.org/Graphics/PNG/all_seven.html, and that setGamma(0.0)
> will actually work.

Thanks. I've checked the patches into our packaging repository - so good so 
far - and they will be part of the next upload (could be a while...) unless 
a problem with them is discovered.

Cheers,
Christopher Martin


pgpc0hd8EROwp.pgp
Description: PGP signature


Bug#333542: [Issue N89425] QImageIO::setGamma doesn't work on PNG

2005-10-21 Thread Charles Samuels

Ok, this is the actual correct patch.

-Charles
--- ../moo/qt-x11-free-3.3.5/src/kernel/qpngio.cpp	2005-09-02 13:43:05.0 +0100
+++ src/kernel/qpngio.cpp	2005-10-21 14:57:52.0 +0100
@@ -110,12 +110,20 @@
 static
 void setup_qt( QImage& image, png_structp png_ptr, png_infop info_ptr, float screen_gamma=0.0 )
 {
-if ( screen_gamma != 0.0 && png_get_valid(png_ptr, info_ptr, PNG_INFO_gAMA) ) {
-	double file_gamma;
-	png_get_gAMA(png_ptr, info_ptr, &file_gamma);
-	png_set_gamma( png_ptr, screen_gamma, file_gamma );
-}
-
+if ( screen_gamma  < 0.0 )
+	// PNG docs say this is a good guess for a PC monitor
+// in a dark room
+	screen_gamma = 2.2;
+if ( png_get_valid(png_ptr, info_ptr, PNG_INFO_gAMA) ) {
+	// the file has a gAMA attribute
+ 	double file_gamma;
+	if ( png_get_gAMA(png_ptr, info_ptr, &file_gamma))
+	png_set_gamma( png_ptr, screen_gamma, file_gamma );
+} else {
+	// no file gamma, use a reasonable default
+	png_set_gamma( png_ptr, screen_gamma, 0.0 ); 
+ }
+
 png_uint_32 width;
 png_uint_32 height;
 int bit_depth;


Bug#333542: [Issue N89425] QImageIO::setGamma doesn't work on PNG

2005-10-21 Thread Charles Samuels
Christopher Martin wrote, on Friday 2005 October 21 1:42 pm:
> On October 12, 2005 13:44, Christopher Martin wrote:
> > Anyway, could you confirm that 28_qtc_png-gamma-fix.dpatch is the source
> > of your problem? If so, then we'll probably just drop it from the
> > package.
>
> If you need a hand in rebuilding the package without
> 28_qtc_png-gamma-fix.dpatch, or can provide a hint on how to test the
> effects of this patch (since I'd like to verify or have you verify that it
> is causing the gamma correction issues you report before removing it from
> the package), let us know.


I can confirm that 28_qtc_png-gamma-fix.dpatch causes the bug I reported.

I can also confirm that Qt is just broken as there's no way to set it to 
reasonable values.  I should also note to TrollTech that I sent them a patch 
which does this all /correctly/ a several years ago, before 
QImageIO::setGamma even existed.

The following patches actually fix the problem, so that Konqueror has correct 
gamma images according to http://www.w3.org/Graphics/PNG/all_seven.html, and 
that setGamma(0.0) will actually work.

-Charles
--- ../moo/qt-x11-free-3.3.5/src/kernel/qimage.cpp	2005-09-02 13:43:01.0 +0100
+++ src/kernel/qimage.cpp	2005-10-21 14:36:27.0 +0100
@@ -3783,7 +3783,7 @@
 d = new QImageIOData();
 d->parameters = 0;
 d->quality = -1; // default quality of the current format
-d->gamma=0.0f;
+d->gamma=-1.0f;
 iostat = 0;
 iodev  = 0;
 }
@@ -4187,7 +4187,9 @@
 modify the image. Setting to 0.0 will disable gamma correction
 (i.e. any specification in the file will be ignored).
 
-The default value is 0.0.
+Setting to a negative number will use reasonable defaults
+
+The default value is -1.0.
 
 \sa gamma()
 */
--- ../moo/qt-x11-free-3.3.5/src/kernel/qpngio.cpp	2005-09-02 13:43:05.0 +0100
+++ src/kernel/qpngio.cpp	2005-10-21 14:44:28.0 +0100
@@ -110,6 +110,20 @@
 static
 void setup_qt( QImage& image, png_structp png_ptr, png_infop info_ptr, float screen_gamma=0.0 )
 {
+if ( screen_gamma  < 0.0 )
+	// PNG docs say this is a good guess for a PC monitor
+// in a dark room
+	screen_gamma = 2.2;
+if ( png_get_valid(png_ptr, info_ptr, PNG_INFO_gAMA) ) {
+	// the file has a gAMA attribute
+ 	double file_gamma;
+	if ( png_get_gAMA(png_ptr, info_ptr, &file_gamma))
+	png_set_gamma( png_ptr, screen_gamma, file_gamma );
+} else {
+	// no file gamma, use a reasonable default
+	png_set_gamma( png_ptr, screen_gamma, 0.0 ); 
+ }
+
 if ( screen_gamma != 0.0 && png_get_valid(png_ptr, info_ptr, PNG_INFO_gAMA) ) {
 	double file_gamma;
 	png_get_gAMA(png_ptr, info_ptr, &file_gamma);