diff options
author | Simon Hausmann <simon.hausmann@theqtcompany.com> | 2015-12-08 07:09:26 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@theqtcompany.com> | 2015-12-08 07:09:47 +0100 |
commit | 3ec31ef9c5acd57a4a59c0d5f5e20b8d9a19bfa1 (patch) | |
tree | 8b55dd13dbc2a33fe7c857f622e10b817386bdb3 /src/gui/image | |
parent | 6f87f2d23fb50d8183ea173fe423b7e1a24c0e2e (diff) | |
parent | 4ad8798de428b44fe4c56e1ca111940068056c57 (diff) |
Merge remote-tracking branch 'origin/5.6' into dev
Change-Id: I2532c7f7db5e6cc3ef09753d886279816dd662b2
Diffstat (limited to 'src/gui/image')
-rw-r--r-- | src/gui/image/qicon.cpp | 9 | ||||
-rw-r--r-- | src/gui/image/qimage.cpp | 30 | ||||
-rw-r--r-- | src/gui/image/qimage_conversions.cpp | 13 | ||||
-rw-r--r-- | src/gui/image/qimage_p.h | 2 |
4 files changed, 39 insertions, 15 deletions
diff --git a/src/gui/image/qicon.cpp b/src/gui/image/qicon.cpp index 6090f42ba7..ca77b73033 100644 --- a/src/gui/image/qicon.cpp +++ b/src/gui/image/qicon.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. +** Copyright (C) 2015 Olivier Goffart <ogoffart@woboq.com> ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtGui module of the Qt Toolkit. @@ -1420,15 +1421,15 @@ QString qt_findAtNxFile(const QString &baseFileName, qreal targetDevicePixelRati if (disableNxImageLoading) return baseFileName; - QString atNx = QLatin1String("@%1x"); int dotIndex = baseFileName.lastIndexOf(QLatin1Char('.')); if (dotIndex == -1) /* no dot */ dotIndex = baseFileName.size(); /* append */ + QString atNxfileName = baseFileName; + atNxfileName.insert(dotIndex, QLatin1String("@2x")); // Check for @Nx, ..., @3x, @2x file versions, - for (int n = qCeil(targetDevicePixelRatio); n > 1; --n) { - QString atNxfileName = baseFileName; - atNxfileName.insert(dotIndex, atNx.arg(n)); + for (int n = qMin(qCeil(targetDevicePixelRatio), 9); n > 1; --n) { + atNxfileName[dotIndex + 1] = QLatin1Char('0' + n); if (QFile::exists(atNxfileName)) { if (sourceDevicePixelRatio) *sourceDevicePixelRatio = n; diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index 798002224a..a992ad6fea 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -2380,17 +2380,25 @@ QColor QImage::pixelColor(int x, int y) const return QColor(); } + QRgba64 c; const uchar * s = constScanLine(y); switch (d->format) { case Format_BGR30: case Format_A2BGR30_Premultiplied: - return QColor(qConvertA2rgb30ToRgb64<PixelOrderBGR>(reinterpret_cast<const quint32 *>(s)[x])); + c = qConvertA2rgb30ToRgb64<PixelOrderBGR>(reinterpret_cast<const quint32 *>(s)[x]); + break; case Format_RGB30: case Format_A2RGB30_Premultiplied: - return QColor(qConvertA2rgb30ToRgb64<PixelOrderRGB>(reinterpret_cast<const quint32 *>(s)[x])); + c = qConvertA2rgb30ToRgb64<PixelOrderRGB>(reinterpret_cast<const quint32 *>(s)[x]); + break; default: - return QColor(pixel(x, y)); + c = QRgba64::fromArgb32(pixel(x, y)); + break; } + // QColor is always unpremultiplied + if (hasAlphaChannel() && qPixelLayouts[d->format].premultiplied) + c = c.unpremultiplied(); + return QColor(c); } /*! @@ -2421,6 +2429,12 @@ void QImage::setPixelColor(int x, int y, const QColor &color) qWarning("QImage::setPixelColor: coordinate (%d,%d) out of range", x, y); return; } + // QColor is always unpremultiplied + QRgba64 c = color.rgba64(); + if (!hasAlphaChannel()) + c.setAlpha(65535); + else if (qPixelLayouts[d->format].premultiplied) + c = c.premultiplied(); // detach is called from within scanLine uchar * s = scanLine(y); switch (d->format) { @@ -2430,19 +2444,19 @@ void QImage::setPixelColor(int x, int y, const QColor &color) qWarning("QImage::setPixelColor: called on monochrome or indexed format"); return; case Format_BGR30: - ((uint *)s)[x] = qConvertRgb64ToRgb30<PixelOrderBGR>(color.rgba64()) | 0xc0000000; + ((uint *)s)[x] = qConvertRgb64ToRgb30<PixelOrderBGR>(c) | 0xc0000000; return; case Format_A2BGR30_Premultiplied: - ((uint *)s)[x] = qConvertRgb64ToRgb30<PixelOrderBGR>(color.rgba64()); + ((uint *)s)[x] = qConvertRgb64ToRgb30<PixelOrderBGR>(c); return; case Format_RGB30: - ((uint *)s)[x] = qConvertRgb64ToRgb30<PixelOrderRGB>(color.rgba64()) | 0xc0000000; + ((uint *)s)[x] = qConvertRgb64ToRgb30<PixelOrderRGB>(c) | 0xc0000000; return; case Format_A2RGB30_Premultiplied: - ((uint *)s)[x] = qConvertRgb64ToRgb30<PixelOrderRGB>(color.rgba64()); + ((uint *)s)[x] = qConvertRgb64ToRgb30<PixelOrderRGB>(c); return; default: - setPixel(x, y, color.rgba()); + setPixel(x, y, c.toArgb32()); return; } } diff --git a/src/gui/image/qimage_conversions.cpp b/src/gui/image/qimage_conversions.cpp index 7d1fb23b15..cbdcf49da7 100644 --- a/src/gui/image/qimage_conversions.cpp +++ b/src/gui/image/qimage_conversions.cpp @@ -2920,7 +2920,7 @@ InPlace_Image_Converter qimage_inplace_converter_map[QImage::NImageFormats][QIma } // Format_Grayscale8 }; -void qInitImageConversions() +static void qInitImageConversions() { #if defined(__SSE2__) && defined(QT_COMPILER_SUPPORTS_SSSE3) if (qCpuHasFeature(SSSE3)) { @@ -2967,4 +2967,15 @@ void qInitImageConversions() #endif } +class QImageConversionsInitializer { +public: + QImageConversionsInitializer() + { + qInitImageConversions(); + } +}; + +// Ensure initialization if this object file is linked. +static QImageConversionsInitializer qImageConversionsInitializer; + QT_END_NAMESPACE diff --git a/src/gui/image/qimage_p.h b/src/gui/image/qimage_p.h index feeab60abd..3badda0864 100644 --- a/src/gui/image/qimage_p.h +++ b/src/gui/image/qimage_p.h @@ -111,8 +111,6 @@ bool convert_generic_inplace(QImageData *data, QImage::Format dst_format, Qt::Im void dither_to_Mono(QImageData *dst, const QImageData *src, Qt::ImageConversionFlags flags, bool fromalpha); -void qInitImageConversions(); - const uchar *qt_get_bitflip_array(); Q_GUI_EXPORT void qGamma_correct_back_to_linear_cs(QImage *image); |