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);