summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@theqtcompany.com>2016-02-10 10:46:00 +0100
committerAllan Sandfeld Jensen <allan.jensen@theqtcompany.com>2016-02-11 09:29:17 +0000
commit58f19cf8d51e06f1781f3142e6d872e5feb0690e (patch)
tree30e6ae841e3e4d22f17e6aa43f19f4a89f681747 /src
parente4af63c68fa91d126ee3f8489058b14c9ee127a3 (diff)
Improve interpretation of undefined alpha-channels
Libtiff does not process the alpha-channel if its definition is not specified. However to match how Qt used to save TIFF images and how tested image viewers interpret them, we need to treat unspecified alpha channels as unpremultiplied. Task-number: QTBUG-50902 Change-Id: Id72218ed5bf702b54ffa3b5b47d6230facbfa0c4 Reviewed-by: aavit <eirik.aavitsland@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/imageformats/tiff/qtiffhandler.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/plugins/imageformats/tiff/qtiffhandler.cpp b/src/plugins/imageformats/tiff/qtiffhandler.cpp
index a6b87af..875ab16 100644
--- a/src/plugins/imageformats/tiff/qtiffhandler.cpp
+++ b/src/plugins/imageformats/tiff/qtiffhandler.cpp
@@ -251,8 +251,19 @@ bool QTiffHandlerPrivate::openForRead(QIODevice *device)
format = QImage::Format_Indexed8;
else if (samplesPerPixel < 4)
format = QImage::Format_RGB32;
- else
- format = QImage::Format_ARGB32_Premultiplied;
+ else {
+ uint16 count;
+ uint16 *extrasamples;
+ // If there is any definition of the alpha-channel, libtiff will return premultiplied
+ // data to us. If there is none, libtiff will not touch it and we assume it to be
+ // non-premultiplied, matching behavior of tested image editors, and how older Qt
+ // versions used to save it.
+ bool gotField = TIFFGetField(tiff, TIFFTAG_EXTRASAMPLES, &count, &extrasamples);
+ if (!gotField || !count || extrasamples[0] == EXTRASAMPLE_UNSPECIFIED)
+ format = QImage::Format_ARGB32;
+ else
+ format = QImage::Format_ARGB32_Premultiplied;
+ }
headersRead = true;
return true;