diff options
author | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2015-02-24 15:29:20 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2015-03-04 22:41:26 +0000 |
commit | f4a8dceb6739144df0cd898759fa798044a0258c (patch) | |
tree | 1e4c1f27f88b7eb5185533116c24694fb7b8c461 /src | |
parent | 1a0dfd93bb18be6dd455397c5adfdb4f417cee53 (diff) |
Remove non-templated pixellayout methods
Removes the non-templated pixellayout methods that were used for
non-c++11 builds, and instead initialize with the templated ones
verbatim.
These versions are faster, and using only those removes duplicate code.
Change-Id: I91a7d9122d2601ad282287a2f5ed6b88877d52fb
Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/painting/qdrawhelper.cpp | 220 |
1 files changed, 38 insertions, 182 deletions
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 20fd41e0ae..04857fb0d6 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -69,8 +69,6 @@ enum { // must be multiple of 4 for easier SIMD implementations static const int buffer_size = 2048; -#ifdef Q_COMPILER_CONSTEXPR - template<QImage::Format> Q_DECL_CONSTEXPR uint redWidth(); template<QImage::Format> Q_DECL_CONSTEXPR uint redShift(); template<QImage::Format> Q_DECL_CONSTEXPR uint greenWidth(); @@ -310,6 +308,8 @@ static const uint *QT_FASTCALL convertARGBPMFromARGB32PM(uint *buffer, const uin return buffer; } +#ifdef Q_COMPILER_CONSTEXPR + template<QImage::Format Format> Q_DECL_CONSTEXPR static inline QPixelLayout pixelLayoutRGB() { return QPixelLayout{ @@ -338,177 +338,6 @@ template<QImage::Format Format> Q_DECL_CONSTEXPR static inline QPixelLayout pixe }; } -#else // CONSTEXPR - -static const uint *QT_FASTCALL convertToARGB32PM(uint *buffer, const uint *src, int count, - const QPixelLayout *layout, const QRgb *) -{ - Q_ASSERT(layout->redWidth >= 4); - Q_ASSERT(layout->greenWidth >= 4); - Q_ASSERT(layout->blueWidth >= 4); - Q_ASSERT(layout->alphaWidth >= 4); - - const uint redMask = ((1 << layout->redWidth) - 1); - const uint greenMask = ((1 << layout->greenWidth) - 1); - const uint blueMask = ((1 << layout->blueWidth) - 1); - - const uchar redLeftShift = 8 - layout->redWidth; - const uchar greenLeftShift = 8 - layout->greenWidth; - const uchar blueLeftShift = 8 - layout->blueWidth; - - const uchar redRightShift = 2 * layout->redWidth - 8; - const uchar greenRightShift = 2 * layout->greenWidth - 8; - const uchar blueRightShift = 2 * layout->blueWidth - 8; - - const uint alphaMask = ((1 << layout->alphaWidth) - 1); - const uchar alphaLeftShift = 8 - layout->alphaWidth; - const uchar alphaRightShift = 2 * layout->alphaWidth - 8; - - if (layout->premultiplied) { - for (int i = 0; i < count; ++i) { - uint alpha = (src[i] >> layout->alphaShift) & alphaMask; - uint red = (src[i] >> layout->redShift) & redMask; - uint green = (src[i] >> layout->greenShift) & greenMask; - uint blue = (src[i] >> layout->blueShift) & blueMask; - - alpha = (alpha << alphaLeftShift) | (alpha >> alphaRightShift); - red = qMin(alpha, (red << redLeftShift) | (red >> redRightShift)); - green = qMin(alpha, (green << greenLeftShift) | (green >> greenRightShift)); - blue = qMin(alpha, (blue << blueLeftShift) | (blue >> blueRightShift)); - buffer[i] = (alpha << 24) | (red << 16) | (green << 8) | blue; - } - } else { - for (int i = 0; i < count; ++i) { - uint alpha = (src[i] >> layout->alphaShift) & alphaMask; - uint red = (src[i] >> layout->redShift) & redMask; - uint green = (src[i] >> layout->greenShift) & greenMask; - uint blue = (src[i] >> layout->blueShift) & blueMask; - - alpha = (alpha << alphaLeftShift) | (alpha >> alphaRightShift); - red = (red << redLeftShift) | (red >> redRightShift); - green = (green << greenLeftShift) | (green >> greenRightShift); - blue = (blue << blueLeftShift) | (blue >> blueRightShift); - buffer[i] = qPremultiply((alpha << 24) | (red << 16) | (green << 8) | blue); - } - } - return buffer; -} - -static const uint *QT_FASTCALL convertToRGB32(uint *buffer, const uint *src, int count, - const QPixelLayout *layout, const QRgb *) -{ - Q_ASSERT(layout->redWidth >= 4); - Q_ASSERT(layout->greenWidth >= 4); - Q_ASSERT(layout->blueWidth >= 4); - Q_ASSERT(layout->alphaWidth == 0); - - const uint redMask = ((1 << layout->redWidth) - 1); - const uint greenMask = ((1 << layout->greenWidth) - 1); - const uint blueMask = ((1 << layout->blueWidth) - 1); - - const uchar redLeftShift = 8 - layout->redWidth; - const uchar greenLeftShift = 8 - layout->greenWidth; - const uchar blueLeftShift = 8 - layout->blueWidth; - - const uchar redRightShift = 2 * layout->redWidth - 8; - const uchar greenRightShift = 2 * layout->greenWidth - 8; - const uchar blueRightShift = 2 * layout->blueWidth - 8; - - for (int i = 0; i < count; ++i) { - uint red = (src[i] >> layout->redShift) & redMask; - uint green = (src[i] >> layout->greenShift) & greenMask; - uint blue = (src[i] >> layout->blueShift) & blueMask; - - red = (red << redLeftShift) | (red >> redRightShift); - green = (green << greenLeftShift) | (green >> greenRightShift); - blue = (blue << blueLeftShift) | (blue >> blueRightShift); - buffer[i] = 0xff000000 | (red << 16) | (green << 8) | blue; - } - return buffer; -} - -static const uint *QT_FASTCALL convertFromARGB32PM(uint *buffer, const uint *src, int count, - const QPixelLayout *layout, const QRgb *) -{ - Q_ASSERT(layout->redWidth <= 8); - Q_ASSERT(layout->greenWidth <= 8); - Q_ASSERT(layout->blueWidth <= 8); - Q_ASSERT(layout->alphaWidth <= 8); - - const uint redMask = (1 << layout->redWidth) - 1; - const uint greenMask = (1 << layout->greenWidth) - 1; - const uint blueMask = (1 << layout->blueWidth) - 1; - const uint alphaMask = (1 << layout->alphaWidth) - 1; - - const uchar redRightShift = 24 - layout->redWidth; - const uchar greenRightShift = 16 - layout->greenWidth; - const uchar blueRightShift = 8 - layout->blueWidth; - const uchar alphaRightShift = 32 - layout->alphaWidth; - - if (!layout->premultiplied) { - for (int i = 0; i < count; ++i) - buffer[i] = qUnpremultiply(src[i]); - src = buffer; - } - for (int i = 0; i < count; ++i) { - uint red = ((src[i] >> redRightShift) & redMask) << layout->redShift; - uint green = ((src[i] >> greenRightShift) & greenMask) << layout->greenShift; - uint blue = ((src[i] >> blueRightShift) & blueMask) << layout->blueShift; - uint alpha = ((src[i] >> alphaRightShift) & alphaMask) << layout->alphaShift; - buffer[i] = red | green | blue | alpha; - } - return buffer; -} - -static const uint *QT_FASTCALL convertFromRGB32(uint *buffer, const uint *src, int count, - const QPixelLayout *layout, const QRgb *) -{ - Q_ASSERT(layout->redWidth <= 8); - Q_ASSERT(layout->greenWidth <= 8); - Q_ASSERT(layout->blueWidth <= 8); - - const uint redMask = (1 << layout->redWidth) - 1; - const uint greenMask = (1 << layout->greenWidth) - 1; - const uint blueMask = (1 << layout->blueWidth) - 1; - const uint alphaMask = (1 << layout->alphaWidth) - 1; - - const uchar redRightShift = 24 - layout->redWidth; - const uchar greenRightShift = 16 - layout->greenWidth; - const uchar blueRightShift = 8 - layout->blueWidth; - - for (int i = 0; i < count; ++i) { - uint red = ((src[i] >> redRightShift) & redMask) << layout->redShift; - uint green = ((src[i] >> greenRightShift) & greenMask) << layout->greenShift; - uint blue = ((src[i] >> blueRightShift) & blueMask) << layout->blueShift; - uint alpha = (0xff & alphaMask) << layout->alphaShift; - buffer[i] = red | green | blue | alpha; - } - return buffer; -} - -static const uint *QT_FASTCALL convertRGB16ToRGB32(uint *buffer, const uint *src, int count, - const QPixelLayout *, const QRgb *) -{ - for (int i = 0; i < count; ++i) - buffer[i] = qConvertRgb16To32(src[i]); - return buffer; -} - -static const uint *QT_FASTCALL convertRGB16FromRGB32(uint *buffer, const uint *src, int count, - const QPixelLayout *, const QRgb *) -{ - for (int i = 0; i < count; ++i) - buffer[i] = qConvertRgb32To16(src[i]); - return buffer; -} - -static const uint *QT_FASTCALL convertRGB16FromARGB32PM(uint *buffer, const uint *src, int count, - const QPixelLayout *, const QRgb *) -{ - for (int i = 0; i < count; ++i) - buffer[i] = qConvertRgb32To16(qUnpremultiply(src[i])); - return buffer; -} #endif // To convert in place, let 'dest' and 'src' be the same. @@ -851,15 +680,42 @@ QPixelLayout qPixelLayouts[QImage::NImageFormats] = { pixelLayoutRGB<QImage::Format_RGB444>(), pixelLayoutARGBPM<QImage::Format_ARGB4444_Premultiplied>(), #else - { 5, 11, 6, 5, 5, 0, 0, 0, false, QPixelLayout::BPP16, convertRGB16ToRGB32, convertRGB16FromARGB32PM, convertRGB16FromRGB32 }, // Format_RGB16 - { 5, 19, 6, 13, 5, 8, 8, 0, true, QPixelLayout::BPP24, convertToARGB32PM, convertFromARGB32PM, convertFromRGB32 }, // Format_ARGB8565_Premultiplied - { 6, 12, 6, 6, 6, 0, 0, 0, false, QPixelLayout::BPP24, convertToRGB32, convertFromARGB32PM, convertFromRGB32 }, // Format_RGB666 - { 6, 12, 6, 6, 6, 0, 6, 18, true, QPixelLayout::BPP24, convertToARGB32PM, convertFromARGB32PM, convertFromRGB32 }, // Format_ARGB6666_Premultiplied - { 5, 10, 5, 5, 5, 0, 0, 0, false, QPixelLayout::BPP16, convertToRGB32, convertFromARGB32PM, convertFromRGB32 }, // Format_RGB555 - { 5, 18, 5, 13, 5, 8, 8, 0, true, QPixelLayout::BPP24, convertToARGB32PM, convertFromARGB32PM, convertFromRGB32 }, // Format_ARGB8555_Premultiplied - { 8, 16, 8, 8, 8, 0, 0, 0, false, QPixelLayout::BPP24, convertToRGB32, convertFromARGB32PM, convertFromRGB32 }, // Format_RGB888 - { 4, 8, 4, 4, 4, 0, 0, 0, false, QPixelLayout::BPP16, convertToRGB32, convertFromARGB32PM, convertFromRGB32 }, // Format_RGB444 - { 4, 8, 4, 4, 4, 0, 4, 12, true, QPixelLayout::BPP16, convertToARGB32PM, convertFromARGB32PM, convertFromRGB32 }, // Format_ARGB4444_Premultiplied + { 5, 11, 6, 5, 5, 0, 0, 0, false, QPixelLayout::BPP16, + convertToRGB32<QImage::Format_RGB16>, + convertRGBFromARGB32PM<QImage::Format_RGB16>, + convertRGBFromRGB32<QImage::Format_RGB16>}, + { 5, 19, 6, 13, 5, 8, 8, 0, true, QPixelLayout::BPP24, + convertARGBPMToARGB32PM<QImage::Format_ARGB8565_Premultiplied>, + convertARGBPMFromARGB32PM<QImage::Format_ARGB8565_Premultiplied>, + convertARGBPMFromRGB32<QImage::Format_ARGB8565_Premultiplied>}, + { 6, 12, 6, 6, 6, 0, 0, 0, false, QPixelLayout::BPP24, + convertToRGB32<QImage::Format_RGB666>, + convertRGBFromARGB32PM<QImage::Format_RGB666>, + convertRGBFromRGB32<QImage::Format_RGB666>}, + { 6, 12, 6, 6, 6, 0, 6, 18, true, QPixelLayout::BPP24, + convertARGBPMToARGB32PM<QImage::Format_ARGB6666_Premultiplied>, + convertARGBPMFromARGB32PM<QImage::Format_ARGB6666_Premultiplied>, + convertARGBPMFromRGB32<QImage::Format_ARGB6666_Premultiplied>}, + { 5, 10, 5, 5, 5, 0, 0, 0, false, QPixelLayout::BPP16, + convertToRGB32<QImage::Format_RGB555>, + convertRGBFromARGB32PM<QImage::Format_RGB555>, + convertRGBFromRGB32<QImage::Format_RGB555> }, + { 5, 18, 5, 13, 5, 8, 8, 0, true, QPixelLayout::BPP24, + convertARGBPMToARGB32PM<QImage::Format_ARGB8555_Premultiplied>, + convertARGBPMFromARGB32PM<QImage::Format_ARGB8555_Premultiplied>, + convertARGBPMFromRGB32<QImage::Format_ARGB8555_Premultiplied>}, + { 8, 16, 8, 8, 8, 0, 0, 0, false, QPixelLayout::BPP24, + convertToRGB32<QImage::Format_RGB888>, + convertRGBFromARGB32PM<QImage::Format_RGB888>, + convertRGBFromRGB32<QImage::Format_RGB888>}, + { 4, 8, 4, 4, 4, 0, 0, 0, false, QPixelLayout::BPP16, + convertToRGB32<QImage::Format_RGB444>, + convertRGBFromARGB32PM<QImage::Format_RGB444>, + convertRGBFromRGB32<QImage::Format_RGB444>}, + { 4, 8, 4, 4, 4, 0, 4, 12, true, QPixelLayout::BPP16, + convertARGBPMToARGB32PM<QImage::Format_ARGB4444_Premultiplied>, + convertARGBPMFromARGB32PM<QImage::Format_ARGB4444_Premultiplied>, + convertARGBPMFromRGB32<QImage::Format_ARGB4444_Premultiplied>}, #endif #if Q_BYTE_ORDER == Q_BIG_ENDIAN { 8, 24, 8, 16, 8, 8, 0, 0, false, QPixelLayout::BPP32, convertRGBA8888PMToARGB32PM, convertRGBXFromARGB32PM, convertRGBXFromRGB32 }, // Format_RGBX8888 |