From 45ac7c962b4c196bba796c1dc7fc345f84c4b74e Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Thu, 25 Feb 2016 13:31:15 +0100 Subject: Merge convert from routines These four methods do not need to be separate, the compiler can figure generate the optimal version from the template arguments. Change-Id: I45b30a9c2f2ce4da46c47f2e6e1fbd7561213c4a Reviewed-by: Gunnar Sletta --- src/gui/painting/qdrawhelper.cpp | 152 ++++++++++++++++----------------------- 1 file changed, 60 insertions(+), 92 deletions(-) diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 112dbd4738..933ff407e2 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -135,10 +135,20 @@ template<> Q_DECL_CONSTEXPR uint blueShift Q_DECL_CONSTEXPR uint blueShift() { return 8; } template<> Q_DECL_CONSTEXPR uint blueShift() { return 8; } template<> Q_DECL_CONSTEXPR uint blueShift() { return 0; } +template<> Q_DECL_CONSTEXPR uint alphaWidth() { return 0; } +template<> Q_DECL_CONSTEXPR uint alphaWidth() { return 0; } +template<> Q_DECL_CONSTEXPR uint alphaWidth() { return 0; } +template<> Q_DECL_CONSTEXPR uint alphaWidth() { return 0; } +template<> Q_DECL_CONSTEXPR uint alphaWidth() { return 0; } template<> Q_DECL_CONSTEXPR uint alphaWidth() { return 4; } template<> Q_DECL_CONSTEXPR uint alphaWidth() { return 8; } template<> Q_DECL_CONSTEXPR uint alphaWidth() { return 8; } template<> Q_DECL_CONSTEXPR uint alphaWidth() { return 6; } +template<> Q_DECL_CONSTEXPR uint alphaShift() { return 0; } +template<> Q_DECL_CONSTEXPR uint alphaShift() { return 0; } +template<> Q_DECL_CONSTEXPR uint alphaShift() { return 0; } +template<> Q_DECL_CONSTEXPR uint alphaShift() { return 0; } +template<> Q_DECL_CONSTEXPR uint alphaShift() { return 0; } template<> Q_DECL_CONSTEXPR uint alphaShift() { return 12; } template<> Q_DECL_CONSTEXPR uint alphaShift() { return 0; } template<> Q_DECL_CONSTEXPR uint alphaShift() { return 0; } @@ -286,92 +296,50 @@ static const QRgba64 *QT_FASTCALL convertARGBPMToARGB64PM(QRgba64 *buffer, const return buffer; } -template +template static const uint *QT_FASTCALL convertRGBFromARGB32PM(uint *buffer, const uint *src, int count, const QPixelLayout *, const QRgb *) { - Q_CONSTEXPR uint redMask = ((1 << redWidth()) - 1); - Q_CONSTEXPR uint greenMask = ((1 << greenWidth()) - 1); - Q_CONSTEXPR uint blueMask = ((1 << blueWidth()) - 1); - - Q_CONSTEXPR uchar redRightShift = 24 - redWidth(); - Q_CONSTEXPR uchar greenRightShift = 16 - greenWidth(); - Q_CONSTEXPR uchar blueRightShift = 8 - blueWidth(); - - for (int i = 0; i < count; ++i) { - const uint color = qUnpremultiply(src[i]); - const uint red = ((color >> redRightShift) & redMask) << redShift(); - const uint green = ((color >> greenRightShift) & greenMask) << greenShift(); - const uint blue = ((color >> blueRightShift) & blueMask) << blueShift(); - buffer[i] = red | green | blue; - } - return buffer; -} - -template -static const uint *QT_FASTCALL convertRGBFromRGB32(uint *buffer, const uint *src, int count, - const QPixelLayout *, const QRgb *) -{ - Q_CONSTEXPR uint redMask = ((1 << redWidth()) - 1); - Q_CONSTEXPR uint greenMask = ((1 << greenWidth()) - 1); - Q_CONSTEXPR uint blueMask = ((1 << blueWidth()) - 1); + Q_CONSTEXPR uint rMask = ((1 << redWidth()) - 1); + Q_CONSTEXPR uint gMask = ((1 << greenWidth()) - 1); + Q_CONSTEXPR uint bMask = ((1 << blueWidth()) - 1); - Q_CONSTEXPR uchar redRightShift = 24 - redWidth(); - Q_CONSTEXPR uchar greenRightShift = 16 - greenWidth(); - Q_CONSTEXPR uchar blueRightShift = 8 - blueWidth(); + Q_CONSTEXPR uchar rRightShift = 24 - redWidth(); + Q_CONSTEXPR uchar gRightShift = 16 - greenWidth(); + Q_CONSTEXPR uchar bRightShift = 8 - blueWidth(); for (int i = 0; i < count; ++i) { - const uint red = ((src[i] >> redRightShift) & redMask) << redShift(); - const uint green = ((src[i] >> greenRightShift) & greenMask) << greenShift(); - const uint blue = ((src[i] >> blueRightShift) & blueMask) << blueShift(); - buffer[i] = red | green | blue; + const uint c = fromRGB ? src[i] : qUnpremultiply(src[i]); + const uint r = ((c >> rRightShift) & rMask) << redShift(); + const uint g = ((c >> gRightShift) & gMask) << greenShift(); + const uint b = ((c >> bRightShift) & bMask) << blueShift(); + buffer[i] = r | g | b; } return buffer; } -template -static const uint *QT_FASTCALL convertARGBPMFromRGB32(uint *buffer, const uint *src, int count, - const QPixelLayout *, const QRgb *) -{ - Q_CONSTEXPR uint alphaMask = ((1 << alphaWidth()) - 1); - Q_CONSTEXPR uint redMask = ((1 << redWidth()) - 1); - Q_CONSTEXPR uint greenMask = ((1 << greenWidth()) - 1); - Q_CONSTEXPR uint blueMask = ((1 << blueWidth()) - 1); - - Q_CONSTEXPR uchar redRightShift = 24 - redWidth(); - Q_CONSTEXPR uchar greenRightShift = 16 - greenWidth(); - Q_CONSTEXPR uchar blueRightShift = 8 - blueWidth(); - - for (int i = 0; i < count; ++i) { - Q_CONSTEXPR uint alpha = (0xff & alphaMask) << alphaShift(); - const uint red = ((src[i] >> redRightShift) & redMask) << redShift(); - const uint green = ((src[i] >> greenRightShift) & greenMask) << greenShift(); - const uint blue = ((src[i] >> blueRightShift) & blueMask) << blueShift(); - buffer[i] = alpha | red | green | blue; - } - return buffer; -} - -template +template static const uint *QT_FASTCALL convertARGBPMFromARGB32PM(uint *buffer, const uint *src, int count, const QPixelLayout *, const QRgb *) { - Q_CONSTEXPR uint alphaMask = ((1 << alphaWidth()) - 1); - Q_CONSTEXPR uint redMask = ((1 << redWidth()) - 1); - Q_CONSTEXPR uint greenMask = ((1 << greenWidth()) - 1); - Q_CONSTEXPR uint blueMask = ((1 << blueWidth()) - 1); + Q_CONSTEXPR uint aMask = ((1 << alphaWidth()) - 1); + Q_CONSTEXPR uint rMask = ((1 << redWidth()) - 1); + Q_CONSTEXPR uint gMask = ((1 << greenWidth()) - 1); + Q_CONSTEXPR uint bMask = ((1 << blueWidth()) - 1); - Q_CONSTEXPR uchar alphaRightShift = 32 - alphaWidth(); - Q_CONSTEXPR uchar redRightShift = 24 - redWidth(); - Q_CONSTEXPR uchar greenRightShift = 16 - greenWidth(); - Q_CONSTEXPR uchar blueRightShift = 8 - blueWidth(); + Q_CONSTEXPR uchar aRightShift = 32 - alphaWidth(); + Q_CONSTEXPR uchar rRightShift = 24 - redWidth(); + Q_CONSTEXPR uchar gRightShift = 16 - greenWidth(); + Q_CONSTEXPR uchar bRightShift = 8 - blueWidth(); + Q_CONSTEXPR uint aOpaque = (0xff & aMask) << alphaShift(); for (int i = 0; i < count; ++i) { - const uint alpha = ((src[i] >> alphaRightShift) & alphaMask) << alphaShift(); - const uint red = ((src[i] >> redRightShift) & redMask) << redShift(); - const uint green = ((src[i] >> greenRightShift) & greenMask) << greenShift(); - const uint blue = ((src[i] >> blueRightShift) & blueMask) << blueShift(); - buffer[i] = alpha | red | green | blue; + const uint c = src[i]; + const uint a = fromRGB ? aOpaque : (((c >> aRightShift) & aMask) << alphaShift()); + const uint r = ((c >> rRightShift) & rMask) << redShift(); + const uint g = ((c >> gRightShift) & gMask) << greenShift(); + const uint b = ((c >> bRightShift) & bMask) << blueShift(); + buffer[i] = a | r | g | b; } return buffer; } @@ -387,8 +355,8 @@ template Q_DECL_CONSTEXPR static inline QPixelLayout pixe 0, 0, false, bitsPerPixel(), convertToRGB32, - convertRGBFromARGB32PM, - convertRGBFromRGB32, + convertRGBFromARGB32PM, + convertRGBFromARGB32PM, convertToRGB64 }; } @@ -402,8 +370,8 @@ template Q_DECL_CONSTEXPR static inline QPixelLayout pixe uchar(alphaWidth()), uchar(alphaShift()), true, bitsPerPixel(), convertARGBPMToARGB32PM, - convertARGBPMFromARGB32PM, - convertARGBPMFromRGB32, + convertARGBPMFromARGB32PM, + convertARGBPMFromARGB32PM, convertARGBPMToARGB64PM }; } @@ -881,56 +849,56 @@ QPixelLayout qPixelLayouts[QImage::NImageFormats] = { #else { 5, 11, 6, 5, 5, 0, 0, 0, false, QPixelLayout::BPP16, convertToRGB32, - convertRGBFromARGB32PM, - convertRGBFromRGB32, + convertRGBFromARGB32PM, + convertRGBFromARGB32PM, convertToRGB64, }, { 5, 19, 6, 13, 5, 8, 8, 0, true, QPixelLayout::BPP24, convertARGBPMToARGB32PM, - convertARGBPMFromARGB32PM, - convertARGBPMFromRGB32, + convertARGBPMFromARGB32PM, + convertARGBPMFromARGB32PM, convertARGBPMToARGB64PM, }, { 6, 12, 6, 6, 6, 0, 0, 0, false, QPixelLayout::BPP24, convertToRGB32, - convertRGBFromARGB32PM, - convertRGBFromRGB32, + convertRGBFromARGB32PM, + convertRGBFromARGB32PM, convertToRGB64, }, { 6, 12, 6, 6, 6, 0, 6, 18, true, QPixelLayout::BPP24, convertARGBPMToARGB32PM, - convertARGBPMFromARGB32PM, - convertARGBPMFromRGB32, + convertARGBPMFromARGB32PM, + convertARGBPMFromARGB32PM, convertARGBPMToARGB64PM, }, { 5, 10, 5, 5, 5, 0, 0, 0, false, QPixelLayout::BPP16, convertToRGB32, - convertRGBFromARGB32PM, - convertRGBFromRGB32, + convertRGBFromARGB32PM, + convertRGBFromARGB32PM, convertToRGB64, }, { 5, 18, 5, 13, 5, 8, 8, 0, true, QPixelLayout::BPP24, convertARGBPMToARGB32PM, - convertARGBPMFromARGB32PM, - convertARGBPMFromRGB32, + convertARGBPMFromARGB32PM, + convertARGBPMFromARGB32PM, convertARGBPMToARGB64PM, }, { 8, 16, 8, 8, 8, 0, 0, 0, false, QPixelLayout::BPP24, convertToRGB32, - convertRGBFromARGB32PM, - convertRGBFromRGB32, + convertRGBFromARGB32PM, + convertRGBFromARGB32PM, convertToRGB64, }, { 4, 8, 4, 4, 4, 0, 0, 0, false, QPixelLayout::BPP16, convertToRGB32, - convertRGBFromARGB32PM, - convertRGBFromRGB32, + convertRGBFromARGB32PM, + convertRGBFromARGB32PM, convertToRGB64, }, { 4, 8, 4, 4, 4, 0, 4, 12, true, QPixelLayout::BPP16, convertARGBPMToARGB32PM, - convertARGBPMFromARGB32PM, - convertARGBPMFromRGB32, + convertARGBPMFromARGB32PM, + convertARGBPMFromARGB32PM, convertARGBPMToARGB64PM, }, #endif -- cgit v1.2.3