diff options
Diffstat (limited to 'src/gui/painting')
28 files changed, 522 insertions, 486 deletions
diff --git a/src/gui/painting/qcolor.h b/src/gui/painting/qcolor.h index 0c5ebcbda9..f7a9e9db59 100644 --- a/src/gui/painting/qcolor.h +++ b/src/gui/painting/qcolor.h @@ -129,10 +129,10 @@ public: void setGreenF(qreal green); void setBlueF(qreal blue); - void getRgb(int *r, int *g, int *b, int *a = Q_NULLPTR) const; + void getRgb(int *r, int *g, int *b, int *a = nullptr) const; void setRgb(int r, int g, int b, int a = 255); - void getRgbF(qreal *r, qreal *g, qreal *b, qreal *a = Q_NULLPTR) const; + void getRgbF(qreal *r, qreal *g, qreal *b, qreal *a = nullptr) const; void setRgbF(qreal r, qreal g, qreal b, qreal a = 1.0); QRgba64 rgba64() const Q_DECL_NOTHROW; @@ -156,10 +156,10 @@ public: qreal hsvSaturationF() const Q_DECL_NOTHROW; qreal valueF() const Q_DECL_NOTHROW; - void getHsv(int *h, int *s, int *v, int *a = Q_NULLPTR) const; + void getHsv(int *h, int *s, int *v, int *a = nullptr) const; void setHsv(int h, int s, int v, int a = 255); - void getHsvF(qreal *h, qreal *s, qreal *v, qreal *a = Q_NULLPTR) const; + void getHsvF(qreal *h, qreal *s, qreal *v, qreal *a = nullptr) const; void setHsvF(qreal h, qreal s, qreal v, qreal a = 1.0); int cyan() const Q_DECL_NOTHROW; @@ -172,10 +172,10 @@ public: qreal yellowF() const Q_DECL_NOTHROW; qreal blackF() const Q_DECL_NOTHROW; - void getCmyk(int *c, int *m, int *y, int *k, int *a = Q_NULLPTR); + void getCmyk(int *c, int *m, int *y, int *k, int *a = nullptr); void setCmyk(int c, int m, int y, int k, int a = 255); - void getCmykF(qreal *c, qreal *m, qreal *y, qreal *k, qreal *a = Q_NULLPTR); + void getCmykF(qreal *c, qreal *m, qreal *y, qreal *k, qreal *a = nullptr); void setCmykF(qreal c, qreal m, qreal y, qreal k, qreal a = 1.0); int hslHue() const Q_DECL_NOTHROW; // 0 <= hue < 360 @@ -186,10 +186,10 @@ public: qreal hslSaturationF() const Q_DECL_NOTHROW; qreal lightnessF() const Q_DECL_NOTHROW; - void getHsl(int *h, int *s, int *l, int *a = Q_NULLPTR) const; + void getHsl(int *h, int *s, int *l, int *a = nullptr) const; void setHsl(int h, int s, int l, int a = 255); - void getHslF(qreal *h, qreal *s, qreal *l, qreal *a = Q_NULLPTR) const; + void getHslF(qreal *h, qreal *s, qreal *l, qreal *a = nullptr) const; void setHslF(qreal h, qreal s, qreal l, qreal a = 1.0); QColor toRgb() const Q_DECL_NOTHROW; diff --git a/src/gui/painting/qcompositionfunctions.cpp b/src/gui/painting/qcompositionfunctions.cpp index ee05f810f1..339a9749b8 100644 --- a/src/gui/painting/qcompositionfunctions.cpp +++ b/src/gui/painting/qcompositionfunctions.cpp @@ -38,16 +38,11 @@ ****************************************************************************/ #include <qglobal.h> -#include <private/qdrawhelper_p.h> -#include <private/qrgba64_p.h> +#include "qdrawhelper_p.h" +#include "qrgba64_p.h" QT_BEGIN_NAMESPACE -# define PRELOAD_INIT(x) -# define PRELOAD_INIT2(x,y) -# define PRELOAD_COND(x) -# define PRELOAD_COND2(x,y) - /* The constant alpha factor describes an alpha factor that gets applied to the result of the composition operation combining it with the destination. @@ -69,24 +64,6 @@ QT_BEGIN_NAMESPACE where the source is an array of pixels. */ -/* - result = 0 - d = d * cia -*/ -#define comp_func_Clear_impl(dest, length, const_alpha)\ -{\ - if (const_alpha == 255) {\ - QT_MEMFILL_UINT(dest, length, 0);\ - } else {\ - int ialpha = 255 - const_alpha;\ - PRELOAD_INIT(dest)\ - for (int i = 0; i < length; ++i) {\ - PRELOAD_COND(dest)\ - dest[i] = BYTE_MUL(dest[i], ialpha);\ - }\ - }\ -} - #if defined __SSE2__ # define LOAD(ptr) _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr)) #ifdef Q_PROCESSOR_X86_64 @@ -117,38 +94,41 @@ QT_BEGIN_NAMESPACE # define INVALPHA(c) (65535 - ALPHA(c)) #endif + +/* + result = 0 + d = d * cia +*/ void QT_FASTCALL comp_func_solid_Clear(uint *dest, int length, uint, uint const_alpha) { - comp_func_Clear_impl(dest, length, const_alpha); + if (const_alpha == 255) { + qt_memfill32(dest, 0, length); + } else { + uint ialpha = 255 - const_alpha; + for (int i = 0; i < length; ++i) + dest[i] = BYTE_MUL(dest[i], ialpha); + } } void QT_FASTCALL comp_func_solid_Clear_rgb64(QRgba64 *dest, int length, QRgba64, uint const_alpha) { - if (const_alpha == 255) + if (const_alpha == 255) { qt_memfill64((quint64*)dest, 0, length); - else { - int ialpha = 255 - const_alpha; - for (int i = 0; i < length; ++i) { + } else { + uint ialpha = 255 - const_alpha; + for (int i = 0; i < length; ++i) STORE(&dest[i], multiplyAlpha255(LOAD(&dest[i]), ialpha)); - } } } void QT_FASTCALL comp_func_Clear(uint *dest, const uint *, int length, uint const_alpha) { - comp_func_Clear_impl(dest, length, const_alpha); + comp_func_solid_Clear(dest, length, 0, const_alpha); } void QT_FASTCALL comp_func_Clear_rgb64(QRgba64 *dest, const QRgba64 *, int length, uint const_alpha) { - if (const_alpha == 255) - qt_memfill64((quint64*)dest, 0, length); - else { - int ialpha = 255 - const_alpha; - for (int i = 0; i < length; ++i) { - STORE(&dest[i], multiplyAlpha255(LOAD(&dest[i]), ialpha)); - } - } + comp_func_solid_Clear_rgb64(dest, length, QRgba64(), const_alpha); } /* @@ -158,13 +138,11 @@ void QT_FASTCALL comp_func_Clear_rgb64(QRgba64 *dest, const QRgba64 *, int lengt void QT_FASTCALL comp_func_solid_Source(uint *dest, int length, uint color, uint const_alpha) { if (const_alpha == 255) { - QT_MEMFILL_UINT(dest, length, color); + qt_memfill32(dest, color, length); } else { - int ialpha = 255 - const_alpha; + uint ialpha = 255 - const_alpha; color = BYTE_MUL(color, const_alpha); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) dest[i] = color + BYTE_MUL(dest[i], ialpha); } } @@ -175,7 +153,7 @@ void QT_FASTCALL comp_func_solid_Source_rgb64(QRgba64 *dest, int length, QRgba64 if (const_alpha == 255) qt_memfill64((quint64*)dest, color, length); else { - int ialpha = 255 - const_alpha; + uint ialpha = 255 - const_alpha; auto c = multiplyAlpha255(CONVERT(color), const_alpha); for (int i = 0; i < length; ++i) { STORE(&dest[i], ADD(c, multiplyAlpha255(LOAD(&dest[i]), ialpha))); @@ -186,12 +164,10 @@ void QT_FASTCALL comp_func_solid_Source_rgb64(QRgba64 *dest, int length, QRgba64 void QT_FASTCALL comp_func_Source(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha) { if (const_alpha == 255) { - ::memcpy(dest, src, length * sizeof(uint)); + ::memcpy(dest, src, size_t(length) * sizeof(uint)); } else { - int ialpha = 255 - const_alpha; - PRELOAD_INIT2(dest, src) + uint ialpha = 255 - const_alpha; for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) dest[i] = INTERPOLATE_PIXEL_255(src[i], const_alpha, dest[i], ialpha); } } @@ -200,9 +176,9 @@ void QT_FASTCALL comp_func_Source(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL void QT_FASTCALL comp_func_Source_rgb64(QRgba64 *Q_DECL_RESTRICT dest, const QRgba64 *Q_DECL_RESTRICT src, int length, uint const_alpha) { if (const_alpha == 255) - ::memcpy(dest, src, length * sizeof(quint64)); + ::memcpy(dest, src, size_t(length) * sizeof(quint64)); else { - int ialpha = 255 - const_alpha; + uint ialpha = 255 - const_alpha; for (int i = 0; i < length; ++i) { STORE(&dest[i], interpolate255(LOAD(&src[i]), const_alpha, LOAD(&dest[i]), ialpha)); } @@ -234,13 +210,11 @@ void QT_FASTCALL comp_func_Destination_rgb64(QRgba64 *, const QRgba64 *, int, ui void QT_FASTCALL comp_func_solid_SourceOver(uint *dest, int length, uint color, uint const_alpha) { if ((const_alpha & qAlpha(color)) == 255) { - QT_MEMFILL_UINT(dest, length, color); + qt_memfill32(dest, color, length); } else { if (const_alpha != 255) color = BYTE_MUL(color, const_alpha); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) dest[i] = color + BYTE_MUL(dest[i], qAlpha(~color)); } } @@ -263,10 +237,8 @@ void QT_FASTCALL comp_func_solid_SourceOver_rgb64(QRgba64 *dest, int length, QRg void QT_FASTCALL comp_func_SourceOver(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha) { - PRELOAD_INIT2(dest, src) if (const_alpha == 255) { for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint s = src[i]; if (s >= 0xff000000) dest[i] = s; @@ -275,7 +247,6 @@ void QT_FASTCALL comp_func_SourceOver(uint *Q_DECL_RESTRICT dest, const uint *Q_ } } else { for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint s = BYTE_MUL(src[i], const_alpha); dest[i] = s + BYTE_MUL(dest[i], qAlpha(~s)); } @@ -309,9 +280,7 @@ void QT_FASTCALL comp_func_solid_DestinationOver(uint *dest, int length, uint co { if (const_alpha != 255) color = BYTE_MUL(color, const_alpha); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; dest[i] = d + BYTE_MUL(color, qAlpha(~d)); } @@ -330,16 +299,13 @@ void QT_FASTCALL comp_func_solid_DestinationOver_rgb64(QRgba64 *dest, int length void QT_FASTCALL comp_func_DestinationOver(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha) { - PRELOAD_INIT2(dest, src) if (const_alpha == 255) { for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; dest[i] = d + BYTE_MUL(src[i], qAlpha(~d)); } } else { for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = BYTE_MUL(src[i], const_alpha); dest[i] = d + BYTE_MUL(s, qAlpha(~d)); @@ -369,17 +335,14 @@ void QT_FASTCALL comp_func_DestinationOver_rgb64(QRgba64 *Q_DECL_RESTRICT dest, */ void QT_FASTCALL comp_func_solid_SourceIn(uint *dest, int length, uint color, uint const_alpha) { - PRELOAD_INIT(dest) if (const_alpha == 255) { for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) dest[i] = BYTE_MUL(color, qAlpha(dest[i])); } } else { color = BYTE_MUL(color, const_alpha); uint cia = 255 - const_alpha; for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; dest[i] = INTERPOLATE_PIXEL_255(color, qAlpha(d), d, cia); } @@ -389,32 +352,30 @@ void QT_FASTCALL comp_func_solid_SourceIn(uint *dest, int length, uint color, ui void QT_FASTCALL comp_func_solid_SourceIn_rgb64(QRgba64 *dest, int length, QRgba64 color, uint const_alpha) { if (const_alpha == 255) { + auto c = CONVERT(color); for (int i = 0; i < length; ++i) { - dest[i] = multiplyAlpha65535(color, dest[i].alpha()); + STORE(&dest[i], multiplyAlpha65535(c, dest[i].alpha())); } } else { uint ca = const_alpha * 257; - uint cia = 65535 - ca; - color = multiplyAlpha65535(color, ca); + auto cia = CONST(65535 - ca); + auto c = multiplyAlpha65535(CONVERT(color), ca); for (int i = 0; i < length; ++i) { - QRgba64 d = dest[i]; - dest[i] = interpolate65535(color, d.alpha(), d, cia); + auto d = LOAD(&dest[i]); + STORE(&dest[i], interpolate65535(c, ALPHA(d), d, cia)); } } } void QT_FASTCALL comp_func_SourceIn(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha) { - PRELOAD_INIT2(dest, src) if (const_alpha == 255) { for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) dest[i] = BYTE_MUL(src[i], qAlpha(dest[i])); } } else { uint cia = 255 - const_alpha; for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = BYTE_MUL(src[i], const_alpha); dest[i] = INTERPOLATE_PIXEL_255(s, qAlpha(d), d, cia); @@ -450,9 +411,7 @@ void QT_FASTCALL comp_func_solid_DestinationIn(uint *dest, int length, uint colo if (const_alpha != 255) { a = BYTE_MUL(a, const_alpha) + 255 - const_alpha; } - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) dest[i] = BYTE_MUL(dest[i], a); } } @@ -470,16 +429,13 @@ void QT_FASTCALL comp_func_solid_DestinationIn_rgb64(QRgba64 *dest, int length, void QT_FASTCALL comp_func_DestinationIn(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha) { - PRELOAD_INIT2(dest, src) if (const_alpha == 255) { for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) dest[i] = BYTE_MUL(dest[i], qAlpha(src[i])); } } else { - int cia = 255 - const_alpha; + uint cia = 255 - const_alpha; for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint a = BYTE_MUL(qAlpha(src[i]), const_alpha) + cia; dest[i] = BYTE_MUL(dest[i], a); } @@ -490,14 +446,14 @@ void QT_FASTCALL comp_func_DestinationIn_rgb64(QRgba64 *Q_DECL_RESTRICT dest, co { if (const_alpha == 255) { for (int i = 0; i < length; ++i) { - dest[i] = multiplyAlpha65535(dest[i], src[i].alpha()); + STORE(&dest[i], multiplyAlpha65535(LOAD(&dest[i]), src[i].alpha())); } } else { uint ca = const_alpha * 257; uint cia = 65535 - ca; for (int i = 0; i < length; ++i) { uint a = qt_div_65535(src[i].alpha() * ca) + cia; - dest[i] = multiplyAlpha65535(dest[i], a); + STORE(&dest[i], multiplyAlpha65535(LOAD(&dest[i]), a)); } } } @@ -509,17 +465,14 @@ void QT_FASTCALL comp_func_DestinationIn_rgb64(QRgba64 *Q_DECL_RESTRICT dest, co void QT_FASTCALL comp_func_solid_SourceOut(uint *dest, int length, uint color, uint const_alpha) { - PRELOAD_INIT(dest) if (const_alpha == 255) { for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) dest[i] = BYTE_MUL(color, qAlpha(~dest[i])); } } else { color = BYTE_MUL(color, const_alpha); - int cia = 255 - const_alpha; + uint cia = 255 - const_alpha; for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; dest[i] = INTERPOLATE_PIXEL_255(color, qAlpha(~d), d, cia); } @@ -545,16 +498,13 @@ void QT_FASTCALL comp_func_solid_SourceOut_rgb64(QRgba64 *dest, int length, QRgb void QT_FASTCALL comp_func_SourceOut(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha) { - PRELOAD_INIT2(dest, src) if (const_alpha == 255) { for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) dest[i] = BYTE_MUL(src[i], qAlpha(~dest[i])); } } else { - int cia = 255 - const_alpha; + uint cia = 255 - const_alpha; for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint s = BYTE_MUL(src[i], const_alpha); uint d = dest[i]; dest[i] = INTERPOLATE_PIXEL_255(s, qAlpha(~d), d, cia); @@ -589,9 +539,7 @@ void QT_FASTCALL comp_func_solid_DestinationOut(uint *dest, int length, uint col uint a = qAlpha(~color); if (const_alpha != 255) a = BYTE_MUL(a, const_alpha) + 255 - const_alpha; - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) dest[i] = BYTE_MUL(dest[i], a); } } @@ -609,16 +557,13 @@ void QT_FASTCALL comp_func_solid_DestinationOut_rgb64(QRgba64 *dest, int length, void QT_FASTCALL comp_func_DestinationOut(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha) { - PRELOAD_INIT2(dest, src) if (const_alpha == 255) { for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) dest[i] = BYTE_MUL(dest[i], qAlpha(~src[i])); } } else { - int cia = 255 - const_alpha; + uint cia = 255 - const_alpha; for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint sia = BYTE_MUL(qAlpha(~src[i]), const_alpha) + cia; dest[i] = BYTE_MUL(dest[i], sia); } @@ -653,9 +598,7 @@ void QT_FASTCALL comp_func_solid_SourceAtop(uint *dest, int length, uint color, color = BYTE_MUL(color, const_alpha); } uint sia = qAlpha(~color); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) dest[i] = INTERPOLATE_PIXEL_255(color, qAlpha(dest[i]), dest[i], sia); } } @@ -672,17 +615,14 @@ void QT_FASTCALL comp_func_solid_SourceAtop_rgb64(QRgba64 *dest, int length, QRg void QT_FASTCALL comp_func_SourceAtop(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha) { - PRELOAD_INIT2(dest, src) if (const_alpha == 255) { for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint s = src[i]; uint d = dest[i]; dest[i] = INTERPOLATE_PIXEL_255(s, qAlpha(d), d, qAlpha(~s)); } } else { for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint s = BYTE_MUL(src[i], const_alpha); uint d = dest[i]; dest[i] = INTERPOLATE_PIXEL_255(s, qAlpha(d), d, qAlpha(~s)); @@ -719,9 +659,7 @@ void QT_FASTCALL comp_func_solid_DestinationAtop(uint *dest, int length, uint co color = BYTE_MUL(color, const_alpha); a = qAlpha(color) + 255 - const_alpha; } - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; dest[i] = INTERPOLATE_PIXEL_255(d, a, color, qAlpha(~d)); } @@ -742,18 +680,15 @@ void QT_FASTCALL comp_func_solid_DestinationAtop_rgb64(QRgba64 *dest, int length void QT_FASTCALL comp_func_DestinationAtop(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha) { - PRELOAD_INIT2(dest, src) if (const_alpha == 255) { for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint s = src[i]; uint d = dest[i]; dest[i] = INTERPOLATE_PIXEL_255(d, qAlpha(s), s, qAlpha(~d)); } } else { - int cia = 255 - const_alpha; + uint cia = 255 - const_alpha; for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint s = BYTE_MUL(src[i], const_alpha); uint d = dest[i]; uint a = qAlpha(s) + cia; @@ -771,8 +706,8 @@ void QT_FASTCALL comp_func_DestinationAtop_rgb64(QRgba64 *Q_DECL_RESTRICT dest, dest[i] = interpolate65535(d, s.alpha(), s, 65535 - d.alpha()); } } else { - int ca = const_alpha * 257; - int cia = 65535 - ca; + uint ca = const_alpha * 257; + uint cia = 65535 - ca; for (int i = 0; i < length; ++i) { QRgba64 s = multiplyAlpha65535(src[i], ca); QRgba64 d = dest[i]; @@ -794,9 +729,7 @@ void QT_FASTCALL comp_func_solid_XOR(uint *dest, int length, uint color, uint co color = BYTE_MUL(color, const_alpha); uint sia = qAlpha(~color); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; dest[i] = INTERPOLATE_PIXEL_255(color, qAlpha(~d), d, sia); } @@ -806,26 +739,24 @@ void QT_FASTCALL comp_func_solid_XOR_rgb64(QRgba64 *dest, int length, QRgba64 co { if (const_alpha != 255) color = multiplyAlpha255(color, const_alpha); - uint sia = 65535 - color.alpha(); + auto s = CONVERT(color); + auto sia = CONST(65535 - color.alpha()); for (int i = 0; i < length; ++i) { - QRgba64 d = dest[i]; - dest[i] = interpolate65535(color, 65535 - d.alpha(), d, sia); + auto d = LOAD(&dest[i]); + STORE(&dest[i], interpolate65535(s, INVALPHA(d), d, sia)); } } void QT_FASTCALL comp_func_XOR(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, uint const_alpha) { - PRELOAD_INIT2(dest, src) if (const_alpha == 255) { for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = src[i]; dest[i] = INTERPOLATE_PIXEL_255(s, qAlpha(~d), d, qAlpha(~s)); } } else { for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = BYTE_MUL(src[i], const_alpha); dest[i] = INTERPOLATE_PIXEL_255(s, qAlpha(~d), d, qAlpha(~s)); @@ -837,15 +768,15 @@ void QT_FASTCALL comp_func_XOR_rgb64(QRgba64 *Q_DECL_RESTRICT dest, const QRgba6 { if (const_alpha == 255) { for (int i = 0; i < length; ++i) { - QRgba64 d = dest[i]; - QRgba64 s = src[i]; - dest[i] = interpolate65535(s, 65535 - d.alpha(), d, 65535 - s.alpha()); + auto d = LOAD(&dest[i]); + auto s = LOAD(&src[i]); + STORE(&dest[i], interpolate65535(s, INVALPHA(d), d, INVALPHA(s))); } } else { for (int i = 0; i < length; ++i) { - QRgba64 d = dest[i]; - QRgba64 s = multiplyAlpha255(src[i], const_alpha); - dest[i] = interpolate65535(s, 65535 - d.alpha(), d, 65535 - s.alpha()); + auto d = LOAD(&dest[i]); + auto s = multiplyAlpha255(LOAD(&src[i]), const_alpha); + STORE(&dest[i], interpolate65535(s, INVALPHA(d), d, INVALPHA(s))); } } } @@ -901,9 +832,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_solid_Plus_impl(uint *dest, int { uint s = color; - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; d = comp_func_Plus_one_pixel(d, s); coverage.store(&dest[i], d); @@ -940,9 +869,7 @@ void QT_FASTCALL comp_func_solid_Plus_rgb64(QRgba64 *dest, int length, QRgba64 c template <typename T> Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Plus_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage) { - PRELOAD_INIT2(dest, src) for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = src[i]; @@ -1001,9 +928,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_solid_Multiply_impl(uint *dest, int sg = qGreen(color); int sb = qBlue(color); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; int da = qAlpha(d); @@ -1060,9 +985,7 @@ void QT_FASTCALL comp_func_solid_Multiply_rgb64(QRgba64 *dest, int length, QRgba template <typename T> Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Multiply_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage) { - PRELOAD_INIT2(dest, src) for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = src[i]; @@ -1129,9 +1052,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_solid_Screen_impl(uint *dest, i int sg = qGreen(color); int sb = qBlue(color); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; int da = qAlpha(d); @@ -1188,9 +1109,7 @@ void QT_FASTCALL comp_func_solid_Screen_rgb64(QRgba64 *dest, int length, QRgba64 template <typename T> Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Screen_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage) { - PRELOAD_INIT2(dest, src) for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = src[i]; @@ -1277,9 +1196,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_solid_Overlay_impl(uint *dest, int sg = qGreen(color); int sb = qBlue(color); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; int da = qAlpha(d); @@ -1336,9 +1253,7 @@ void QT_FASTCALL comp_func_solid_Overlay_rgb64(QRgba64 *dest, int length, QRgba6 template <typename T> Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Overlay_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage) { - PRELOAD_INIT2(dest, src) for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = src[i]; @@ -1415,9 +1330,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_solid_Darken_impl(uint *dest, i int sg = qGreen(color); int sb = qBlue(color); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; int da = qAlpha(d); @@ -1474,9 +1387,7 @@ void QT_FASTCALL comp_func_solid_Darken_rgb64(QRgba64 *dest, int length, QRgba64 template <typename T> Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Darken_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage) { - PRELOAD_INIT2(dest, src) for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = src[i]; @@ -1553,9 +1464,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_solid_Lighten_impl(uint *dest, int sg = qGreen(color); int sb = qBlue(color); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; int da = qAlpha(d); @@ -1612,9 +1521,7 @@ void QT_FASTCALL comp_func_solid_Lighten_rgb64(QRgba64 *dest, int length, QRgba6 template <typename T> Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Lighten_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage) { - PRELOAD_INIT2(dest, src) for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = src[i]; @@ -1709,9 +1616,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_solid_ColorDodge_impl(uint *des int sg = qGreen(color); int sb = qBlue(color); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; int da = qAlpha(d); @@ -1768,9 +1673,7 @@ void QT_FASTCALL comp_func_solid_ColorDodge_rgb64(QRgba64 *dest, int length, QRg template <typename T> Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_ColorDodge_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage) { - PRELOAD_INIT2(dest, src) for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = src[i]; @@ -1865,9 +1768,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_solid_ColorBurn_impl(uint *dest int sg = qGreen(color); int sb = qBlue(color); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; int da = qAlpha(d); @@ -1924,9 +1825,7 @@ void QT_FASTCALL comp_func_solid_ColorBurn_rgb64(QRgba64 *dest, int length, QRgb template <typename T> Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_ColorBurn_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage) { - PRELOAD_INIT2(dest, src) for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = src[i]; @@ -2015,9 +1914,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_solid_HardLight_impl(uint *dest int sg = qGreen(color); int sb = qBlue(color); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; int da = qAlpha(d); @@ -2074,9 +1971,7 @@ void QT_FASTCALL comp_func_solid_HardLight_rgb64(QRgba64 *dest, int length, QRgb template <typename T> Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_HardLight_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage) { - PRELOAD_INIT2(dest, src) for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = src[i]; @@ -2178,9 +2073,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_solid_SoftLight_impl(uint *dest int sg = qGreen(color); int sb = qBlue(color); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; int da = qAlpha(d); @@ -2237,9 +2130,7 @@ void QT_FASTCALL comp_func_solid_SoftLight_rgb64(QRgba64 *dest, int length, QRgb template <typename T> Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_SoftLight_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage) { - PRELOAD_INIT2(dest, src) for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = src[i]; @@ -2316,9 +2207,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_solid_Difference_impl(uint *des int sg = qGreen(color); int sb = qBlue(color); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; int da = qAlpha(d); @@ -2375,9 +2264,7 @@ void QT_FASTCALL comp_func_solid_Difference_rgb64(QRgba64 *dest, int length, QRg template <typename T> Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Difference_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage) { - PRELOAD_INIT2(dest, src) for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = src[i]; @@ -2443,9 +2330,7 @@ Q_STATIC_TEMPLATE_FUNCTION inline void QT_FASTCALL comp_func_solid_Exclusion_imp int sg = qGreen(color); int sb = qBlue(color); - PRELOAD_INIT(dest) for (int i = 0; i < length; ++i) { - PRELOAD_COND(dest) uint d = dest[i]; int da = qAlpha(d); @@ -2503,9 +2388,7 @@ void QT_FASTCALL comp_func_solid_Exclusion_rgb64(QRgba64 *dest, int length, QRgb template <typename T> Q_STATIC_TEMPLATE_FUNCTION inline void comp_func_Exclusion_impl(uint *Q_DECL_RESTRICT dest, const uint *Q_DECL_RESTRICT src, int length, const T &coverage) { - PRELOAD_INIT2(dest, src) for (int i = 0; i < length; ++i) { - PRELOAD_COND2(dest, src) uint d = dest[i]; uint s = src[i]; diff --git a/src/gui/painting/qcoregraphics.mm b/src/gui/painting/qcoregraphics.mm index e1601d87dc..2249859c43 100644 --- a/src/gui/painting/qcoregraphics.mm +++ b/src/gui/painting/qcoregraphics.mm @@ -293,103 +293,6 @@ QBrush qt_mac_toQBrush(const NSColor *color, QPalette::ColorGroup colorGroup) } #endif -// ---------------------- Color Management ---------------------- - -static CGColorSpaceRef m_genericColorSpace = 0; -static QHash<uint32_t, CGColorSpaceRef> m_displayColorSpaceHash; -static bool m_postRoutineRegistered = false; - -static void qt_mac_cleanUpMacColorSpaces() -{ - if (m_genericColorSpace) { - CFRelease(m_genericColorSpace); - m_genericColorSpace = 0; - } - QHash<uint32_t, CGColorSpaceRef>::const_iterator it = m_displayColorSpaceHash.constBegin(); - while (it != m_displayColorSpaceHash.constEnd()) { - if (it.value()) - CFRelease(it.value()); - ++it; - } - m_displayColorSpaceHash.clear(); -} - -static CGColorSpaceRef qt_mac_displayColorSpace(const QWindow *window) -{ - CGColorSpaceRef colorSpace = 0; - uint32_t displayID = 0; - -#ifdef Q_OS_MACOS - if (window == 0) { - displayID = CGMainDisplayID(); - } else { - displayID = CGMainDisplayID(); - /* - ### get correct display - const QRect &qrect = window->geometry(); - CGRect rect = CGRectMake(qrect.x(), qrect.y(), qrect.width(), qrect.height()); - CGDisplayCount throwAway; - CGDisplayErr dErr = CGGetDisplaysWithRect(rect, 1, &displayID, &throwAway); - if (dErr != kCGErrorSuccess) - return macDisplayColorSpace(0); // fall back on main display - */ - } - if ((colorSpace = m_displayColorSpaceHash.value(displayID))) - return colorSpace; - - colorSpace = CGDisplayCopyColorSpace(displayID); -#else - Q_UNUSED(window); -#endif - - if (colorSpace == 0) - colorSpace = CGColorSpaceCreateDeviceRGB(); - - m_displayColorSpaceHash.insert(displayID, colorSpace); - if (!m_postRoutineRegistered) { - m_postRoutineRegistered = true; - qAddPostRoutine(qt_mac_cleanUpMacColorSpaces); - } - return colorSpace; -} - -CGColorSpaceRef qt_mac_colorSpaceForDeviceType(const QPaintDevice *paintDevice) -{ - Q_UNUSED(paintDevice); - - // FIXME: Move logic into each paint device once Qt has support for color spaces - return qt_mac_displayColorSpace(0); - - // The following code seems to take care of QWidget, but in reality doesn't, as - // qt_mac_displayColorSpace ignores the argument and always uses the main display. -#if 0 - bool isWidget = (paintDevice->devType() == QInternal::Widget); - return qt_mac_displayColorSpace(isWidget ? static_cast<const QWidget *>(paintDevice)->window() : 0); -#endif -} - -CGColorSpaceRef qt_mac_genericColorSpace() -{ -#if 0 - if (!m_genericColorSpace) { - if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_4) { - m_genericColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); - } else - { - m_genericColorSpace = CGColorSpaceCreateDeviceRGB(); - } - if (!m_postRoutineRegistered) { - m_postRoutineRegistered = true; - qAddPostRoutine(QCoreGraphicsPaintEngine::cleanUpMacColorSpaces); - } - } - return m_genericColorSpace; -#else - // Just return the main display colorspace for the moment. - return qt_mac_displayColorSpace(0); -#endif -} - // ---------------------- Geometry Helpers ---------------------- void qt_mac_clip_cg(CGContextRef hd, const QRegion &rgn, CGAffineTransform *orig_xform) @@ -459,12 +362,13 @@ QMacCGContext::QMacCGContext(QPaintDevice *paintDevice) : context(0) if (!image) return; // Context type not supported. - CGColorSpaceRef colorspace = qt_mac_colorSpaceForDeviceType(paintDevice); + CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB); uint flags = kCGImageAlphaPremultipliedFirst; flags |= kCGBitmapByteOrder32Host; context = CGBitmapContextCreate(image->bits(), image->width(), image->height(), - 8, image->bytesPerLine(), colorspace, flags); + 8, image->bytesPerLine(), colorSpace, flags); + CFRelease(colorSpace); CGContextTranslateCTM(context, 0, image->height()); const qreal devicePixelRatio = paintDevice->devicePixelRatioF(); CGContextScaleCTM(context, devicePixelRatio, devicePixelRatio); @@ -492,7 +396,7 @@ QMacCGContext::QMacCGContext(QPainter *painter) : context(0) devType == QInternal::Pixmap || devType == QInternal::Image)) { - CGColorSpaceRef colorspace = qt_mac_colorSpaceForDeviceType(paintEngine->paintDevice()); + CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB); uint flags = kCGImageAlphaPremultipliedFirst; #ifdef kCGBitmapByteOrder32Host //only needed because CGImage.h added symbols in the minor version flags |= kCGBitmapByteOrder32Host; @@ -500,7 +404,8 @@ QMacCGContext::QMacCGContext(QPainter *painter) : context(0) const QImage *image = static_cast<const QImage *>(paintEngine->paintDevice()); context = CGBitmapContextCreate((void *)image->bits(), image->width(), image->height(), - 8, image->bytesPerLine(), colorspace, flags); + 8, image->bytesPerLine(), colorSpace, flags); + CFRelease(colorSpace); // Invert y axis CGContextTranslateCTM(context, 0, image->height()); diff --git a/src/gui/painting/qcoregraphics_p.h b/src/gui/painting/qcoregraphics_p.h index 6b6a1e800e..de721c94aa 100644 --- a/src/gui/painting/qcoregraphics_p.h +++ b/src/gui/painting/qcoregraphics_p.h @@ -75,9 +75,6 @@ Q_GUI_EXPORT QImage qt_mac_toQImage(CGImageRef image); Q_GUI_EXPORT void qt_mac_drawCGImage(CGContextRef inContext, const CGRect *inBounds, CGImageRef inImage); -Q_GUI_EXPORT CGColorSpaceRef qt_mac_genericColorSpace(); -Q_GUI_EXPORT CGColorSpaceRef qt_mac_colorSpaceForDeviceType(const QPaintDevice *paintDevice); - Q_GUI_EXPORT void qt_mac_clip_cg(CGContextRef hd, const QRegion &rgn, CGAffineTransform *orig_xform); #ifdef HAVE_APPKIT diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 6bfdc940ac..6ddfcdfaf4 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -6399,12 +6399,19 @@ static void qInitDrawhelperFunctions() qBlendFunctions[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] = qt_blend_argb32_on_argb32_avx2; qBlendFunctions[QImage::Format_RGBA8888_Premultiplied][QImage::Format_RGBA8888_Premultiplied] = qt_blend_argb32_on_argb32_avx2; + extern void QT_FASTCALL comp_func_Source_avx2(uint *destPixels, const uint *srcPixels, int length, uint const_alpha); + extern void QT_FASTCALL comp_func_Source_rgb64_avx2(QRgba64 *destPixels, const QRgba64 *srcPixels, int length, uint const_alpha); extern void QT_FASTCALL comp_func_SourceOver_avx2(uint *destPixels, const uint *srcPixels, int length, uint const_alpha); + extern void QT_FASTCALL comp_func_SourceOver_rgb64_avx2(QRgba64 *destPixels, const QRgba64 *srcPixels, int length, uint const_alpha); extern void QT_FASTCALL comp_func_solid_SourceOver_avx2(uint *destPixels, int length, uint color, uint const_alpha); - extern void QT_FASTCALL comp_func_Source_avx2(uint *destPixels, const uint *srcPixels, int length, uint const_alpha); + extern void QT_FASTCALL comp_func_solid_SourceOver_rgb64_avx2(QRgba64 *destPixels, int length, QRgba64 color, uint const_alpha); + + qt_functionForMode_C[QPainter::CompositionMode_Source] = comp_func_Source_avx2; + qt_functionForMode64_C[QPainter::CompositionMode_Source] = comp_func_Source_rgb64_avx2; qt_functionForMode_C[QPainter::CompositionMode_SourceOver] = comp_func_SourceOver_avx2; + qt_functionForMode64_C[QPainter::CompositionMode_SourceOver] = comp_func_SourceOver_rgb64_avx2; qt_functionForModeSolid_C[QPainter::CompositionMode_SourceOver] = comp_func_solid_SourceOver_avx2; - qt_functionForMode_C[QPainter::CompositionMode_Source] = comp_func_Source_avx2; + qt_functionForModeSolid64_C[QPainter::CompositionMode_SourceOver] = comp_func_solid_SourceOver_rgb64_avx2; extern void QT_FASTCALL fetchTransformedBilinearARGB32PM_simple_upscale_helper_avx2(uint *b, uint *end, const QTextureData &image, int &fx, int &fy, int fdx, int /*fdy*/); @@ -6444,7 +6451,7 @@ static void qInitDrawhelperFunctions() sourceFetchUntransformed[QImage::Format_RGB888] = qt_fetchUntransformed_888_neon; -#if defined(Q_PROCESSOR_ARM_64) && Q_BYTE_ORDER == Q_LITTLE_ENDIAN +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN extern const uint *QT_FASTCALL convertARGB32ToARGB32PM_neon(uint *buffer, const uint *src, int count, const QVector<QRgb> *, QDitherInfo *); extern const uint *QT_FASTCALL convertRGBA8888ToARGB32PM_neon(uint *buffer, const uint *src, int count, diff --git a/src/gui/painting/qdrawhelper_avx2.cpp b/src/gui/painting/qdrawhelper_avx2.cpp index 2619539788..cf89f408b5 100644 --- a/src/gui/painting/qdrawhelper_avx2.cpp +++ b/src/gui/painting/qdrawhelper_avx2.cpp @@ -39,6 +39,7 @@ #include "qdrawhelper_p.h" #include "qdrawingprimitive_sse2_p.h" +#include "qrgba64_p.h" #if defined(QT_COMPILER_SUPPORTS_AVX2) @@ -73,6 +74,25 @@ inline static void BYTE_MUL_AVX2(__m256i &pixelVector, const __m256i &alphaChann pixelVector = _mm256_or_si256(pixelVectorAG, pixelVectorRB); } +inline static void BYTE_MUL_RGB64_AVX2(__m256i &pixelVector, const __m256i &alphaChannel, const __m256i &colorMask, const __m256i &half) +{ + __m256i pixelVectorAG = _mm256_srli_epi32(pixelVector, 16); + __m256i pixelVectorRB = _mm256_and_si256(pixelVector, colorMask); + + pixelVectorAG = _mm256_mullo_epi32(pixelVectorAG, alphaChannel); + pixelVectorRB = _mm256_mullo_epi32(pixelVectorRB, alphaChannel); + + pixelVectorRB = _mm256_add_epi32(pixelVectorRB, _mm256_srli_epi32(pixelVectorRB, 16)); + pixelVectorAG = _mm256_add_epi32(pixelVectorAG, _mm256_srli_epi32(pixelVectorAG, 16)); + pixelVectorRB = _mm256_add_epi32(pixelVectorRB, half); + pixelVectorAG = _mm256_add_epi32(pixelVectorAG, half); + + pixelVectorRB = _mm256_srli_epi32(pixelVectorRB, 16); + pixelVectorAG = _mm256_andnot_si256(colorMask, pixelVectorAG); + + pixelVector = _mm256_or_si256(pixelVectorAG, pixelVectorRB); +} + // See INTERPOLATE_PIXEL_255_SSE2 for details. inline static void INTERPOLATE_PIXEL_255_AVX2(const __m256i &srcVector, __m256i &dstVector, const __m256i &alphaChannel, const __m256i &oneMinusAlphaChannel, const __m256i &colorMask, const __m256i &half) { @@ -96,6 +116,29 @@ inline static void INTERPOLATE_PIXEL_255_AVX2(const __m256i &srcVector, __m256i dstVector = _mm256_or_si256(finalAG, finalRB); } +inline static void INTERPOLATE_PIXEL_RGB64_AVX2(const __m256i &srcVector, __m256i &dstVector, const __m256i &alphaChannel, const __m256i &oneMinusAlphaChannel, const __m256i &colorMask, const __m256i &half) +{ + const __m256i srcVectorAG = _mm256_srli_epi32(srcVector, 16); + const __m256i dstVectorAG = _mm256_srli_epi32(dstVector, 16); + const __m256i srcVectorRB = _mm256_and_si256(srcVector, colorMask); + const __m256i dstVectorRB = _mm256_and_si256(dstVector, colorMask); + const __m256i srcVectorAGalpha = _mm256_mullo_epi32(srcVectorAG, alphaChannel); + const __m256i srcVectorRBalpha = _mm256_mullo_epi32(srcVectorRB, alphaChannel); + const __m256i dstVectorAGoneMinusAlpha = _mm256_mullo_epi32(dstVectorAG, oneMinusAlphaChannel); + const __m256i dstVectorRBoneMinusAlpha = _mm256_mullo_epi32(dstVectorRB, oneMinusAlphaChannel); + __m256i finalAG = _mm256_add_epi32(srcVectorAGalpha, dstVectorAGoneMinusAlpha); + __m256i finalRB = _mm256_add_epi32(srcVectorRBalpha, dstVectorRBoneMinusAlpha); + finalAG = _mm256_add_epi32(finalAG, _mm256_srli_epi32(finalAG, 16)); + finalRB = _mm256_add_epi32(finalRB, _mm256_srli_epi32(finalRB, 16)); + finalAG = _mm256_add_epi32(finalAG, half); + finalRB = _mm256_add_epi32(finalRB, half); + finalAG = _mm256_andnot_si256(colorMask, finalAG); + finalRB = _mm256_srli_epi32(finalRB, 16); + + dstVector = _mm256_or_si256(finalAG, finalRB); +} + + // See BLEND_SOURCE_OVER_ARGB32_SSE2 for details. inline static void BLEND_SOURCE_OVER_ARGB32_AVX2(quint32 *dst, const quint32 *src, const int length) { @@ -288,6 +331,64 @@ void QT_FASTCALL comp_func_SourceOver_avx2(uint *destPixels, const uint *srcPixe BLEND_SOURCE_OVER_ARGB32_WITH_CONST_ALPHA_AVX2(dst, src, length, const_alpha); } +void QT_FASTCALL comp_func_SourceOver_rgb64_avx2(QRgba64 *dst, const QRgba64 *src, int length, uint const_alpha) +{ + Q_ASSERT(const_alpha < 256); // const_alpha is in [0-255] + const __m256i half = _mm256_set1_epi32(0x8000); + const __m256i one = _mm256_set1_epi32(0xffff); + const __m256i colorMask = _mm256_set1_epi32(0x0000ffff); + __m256i alphaMask = _mm256_set1_epi32(0xff000000); + alphaMask = _mm256_unpacklo_epi8(alphaMask, alphaMask); + const __m256i alphaShuffleMask = _mm256_set_epi8(char(0xff),char(0xff),15,14,char(0xff),char(0xff),15,14,char(0xff),char(0xff),7,6,char(0xff),char(0xff),7,6, + char(0xff),char(0xff),15,14,char(0xff),char(0xff),15,14,char(0xff),char(0xff),7,6,char(0xff),char(0xff),7,6); + + if (const_alpha == 255) { + int x = 0; + for (; x < length && (quintptr(dst + x) & 31); ++x) + blend_pixel(dst[x], src[x]); + for (; x < length - 3; x += 4) { + const __m256i srcVector = _mm256_lddqu_si256((const __m256i *)&src[x]); + if (!_mm256_testz_si256(srcVector, alphaMask)) { + // Not all transparent + if (_mm256_testc_si256(srcVector, alphaMask)) { + // All opaque + _mm256_store_si256((__m256i *)&dst[x], srcVector); + } else { + __m256i alphaChannel = _mm256_shuffle_epi8(srcVector, alphaShuffleMask); + alphaChannel = _mm256_sub_epi32(one, alphaChannel); + __m256i dstVector = _mm256_load_si256((__m256i *)&dst[x]); + BYTE_MUL_RGB64_AVX2(dstVector, alphaChannel, colorMask, half); + dstVector = _mm256_add_epi16(dstVector, srcVector); + _mm256_store_si256((__m256i *)&dst[x], dstVector); + } + } + } + SIMD_EPILOGUE(x, length, 3) + blend_pixel(dst[x], src[x]); + } else { + const __m256i constAlphaVector = _mm256_set1_epi32(const_alpha | (const_alpha << 8)); + int x = 0; + for (; x < length && (quintptr(dst + x) & 31); ++x) + blend_pixel(dst[x], src[x], const_alpha); + for (; x < length - 3; x += 4) { + __m256i srcVector = _mm256_lddqu_si256((const __m256i *)&src[x]); + if (!_mm256_testz_si256(srcVector, alphaMask)) { + // Not all transparent + BYTE_MUL_RGB64_AVX2(srcVector, constAlphaVector, colorMask, half); + + __m256i alphaChannel = _mm256_shuffle_epi8(srcVector, alphaShuffleMask); + alphaChannel = _mm256_sub_epi32(one, alphaChannel); + __m256i dstVector = _mm256_load_si256((__m256i *)&dst[x]); + BYTE_MUL_RGB64_AVX2(dstVector, alphaChannel, colorMask, half); + dstVector = _mm256_add_epi16(dstVector, srcVector); + _mm256_store_si256((__m256i *)&dst[x], dstVector); + } + } + SIMD_EPILOGUE(x, length, 3) + blend_pixel(dst[x], src[x], const_alpha); + } +} + void QT_FASTCALL comp_func_Source_avx2(uint *dst, const uint *src, int length, uint const_alpha) { if (const_alpha == 255) { @@ -319,6 +420,39 @@ void QT_FASTCALL comp_func_Source_avx2(uint *dst, const uint *src, int length, u } } +void QT_FASTCALL comp_func_Source_rgb64_avx2(QRgba64 *dst, const QRgba64 *src, int length, uint const_alpha) +{ + Q_ASSERT(const_alpha < 256); // const_alpha is in [0-255] + if (const_alpha == 255) { + ::memcpy(dst, src, length * sizeof(QRgba64)); + } else { + const uint ca = const_alpha | (const_alpha << 8); // adjust to [0-65535] + const uint cia = 65535 - const_alpha; + + int x = 0; + + // 1) prologue, align on 32 bytes + for (; x < length && (quintptr(dst + x) & 31); ++x) + dst[x] = interpolate65535(src[x], ca, dst[x], cia); + + // 2) interpolate pixels with AVX2 + const __m256i half = _mm256_set1_epi32(0x8000); + const __m256i colorMask = _mm256_set1_epi32(0x0000ffff); + const __m256i constAlphaVector = _mm256_set1_epi32(ca); + const __m256i oneMinusConstAlpha = _mm256_set1_epi32(cia); + for (; x < length - 3; x += 4) { + const __m256i srcVector = _mm256_lddqu_si256((const __m256i *)&src[x]); + __m256i dstVector = _mm256_load_si256((__m256i *)&dst[x]); + INTERPOLATE_PIXEL_RGB64_AVX2(srcVector, dstVector, constAlphaVector, oneMinusConstAlpha, colorMask, half); + _mm256_store_si256((__m256i *)&dst[x], dstVector); + } + + // 3) Epilogue + SIMD_EPILOGUE(x, length, 3) + dst[x] = interpolate65535(src[x], ca, dst[x], cia); + } +} + void QT_FASTCALL comp_func_solid_SourceOver_avx2(uint *destPixels, int length, uint color, uint const_alpha) { if ((const_alpha & qAlpha(color)) == 255) { @@ -350,6 +484,37 @@ void QT_FASTCALL comp_func_solid_SourceOver_avx2(uint *destPixels, int length, u } } +void QT_FASTCALL comp_func_solid_SourceOver_rgb64_avx2(QRgba64 *destPixels, int length, QRgba64 color, uint const_alpha) +{ + Q_ASSERT(const_alpha < 256); // const_alpha is in [0-255] + if (const_alpha == 255 && color.isOpaque()) { + qt_memfill64((quint64*)destPixels, color, length); + } else { + if (const_alpha != 255) + color = multiplyAlpha255(color, const_alpha); + + const uint minusAlphaOfColor = ~ushort(color.alpha()); + int x = 0; + quint64 *dst = (quint64 *) destPixels; + const __m256i colorVector = _mm256_set1_epi64x(color); + const __m256i colorMask = _mm256_set1_epi32(0x0000ffff); + const __m256i half = _mm256_set1_epi32(0x8000); + const __m256i minusAlphaOfColorVector = _mm256_set1_epi32(minusAlphaOfColor); + + for (; x < length && (quintptr(dst + x) & 31); ++x) + destPixels[x] = color + multiplyAlpha65535(destPixels[x], minusAlphaOfColor); + + for (; x < length - 3; x += 4) { + __m256i dstVector = _mm256_load_si256((__m256i *)&dst[x]); + BYTE_MUL_RGB64_AVX2(dstVector, minusAlphaOfColorVector, colorMask, half); + dstVector = _mm256_add_epi16(colorVector, dstVector); + _mm256_store_si256((__m256i *)&dst[x], dstVector); + } + SIMD_EPILOGUE(x, length, 3) + destPixels[x] = color + multiplyAlpha65535(destPixels[x], minusAlphaOfColor); + } +} + #define interpolate_4_pixels_16_avx2(tlr1, tlr2, blr1, blr2, distx, disty, colorMask, v_256, b) \ { \ /* Correct for later unpack */ \ diff --git a/src/gui/painting/qdrawhelper_neon.cpp b/src/gui/painting/qdrawhelper_neon.cpp index 4cbac009d8..e126f4b670 100644 --- a/src/gui/painting/qdrawhelper_neon.cpp +++ b/src/gui/painting/qdrawhelper_neon.cpp @@ -1080,23 +1080,41 @@ const uint * QT_FASTCALL qt_fetchUntransformed_888_neon(uint *buffer, const Oper return buffer; } -#if defined(Q_PROCESSOR_ARM_64) && Q_BYTE_ORDER == Q_LITTLE_ENDIAN +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN template<bool RGBA> static inline void convertARGBToARGB32PM_neon(uint *buffer, const uint *src, int count) { int i = 0; +#if defined(Q_PROCESSOR_ARM_64) const uint8x16_t rgbaMask = { 2, 1, 0, 3, 6, 5, 4, 7, 10, 9, 8, 11, 14, 13, 12, 15}; +#else + const uint8x8_t rgbaMask = { 2, 1, 0, 3, 6, 5, 4, 7 }; +#endif const uint8x8_t shuffleMask = { 3, 3, 3, 3, 7, 7, 7, 7}; const uint32x4_t blendMask = vdupq_n_u32(0xff000000); for (; i < count - 3; i += 4) { uint32x4_t srcVector = vld1q_u32(src + i); uint32x4_t alphaVector = vshrq_n_u32(srcVector, 24); +#if defined(Q_PROCESSOR_ARM_64) uint32_t alphaSum = vaddvq_u32(alphaVector); +#else + // no vaddvq_u32 + uint32x2_t tmp = vpadd_u32(vget_low_u32(alphaVector), vget_high_u32(alphaVector)); + uint32_t alphaSum = vget_lane_u32(vpadd_u32(tmp, tmp), 0); +#endif if (alphaSum) { if (alphaSum != 255 * 4) { - if (RGBA) + if (RGBA) { +#if defined(Q_PROCESSOR_ARM_64) srcVector = vreinterpretq_u32_u8(vqtbl1q_u8(vreinterpretq_u8_u32(srcVector), rgbaMask)); +#else + // no vqtbl1q_u8 + const uint8x8_t low = vtbl1_u8(vreinterpret_u8_u32(vget_low_u32(srcVector)), rgbaMask); + const uint8x8_t high = vtbl1_u8(vreinterpret_u8_u32(vget_high_u32(srcVector)), rgbaMask); + srcVector = vcombine_u32(vreinterpret_u32_u8(low), vreinterpret_u32_u8(high)); +#endif + } const uint8x8_t s1 = vreinterpret_u8_u32(vget_low_u32(srcVector)); const uint8x8_t s2 = vreinterpret_u8_u32(vget_high_u32(srcVector)); const uint8x8_t alpha1 = vtbl1_u8(s1, shuffleMask); @@ -1110,10 +1128,19 @@ static inline void convertARGBToARGB32PM_neon(uint *buffer, const uint *src, int const uint32x4_t d = vbslq_u32(blendMask, srcVector, vreinterpretq_u32_u8(vcombine_u8(d1, d2))); vst1q_u32(buffer + i, d); } else { - if (RGBA) - vst1q_u32(buffer + i, vreinterpretq_u32_u8(vqtbl1q_u8(vreinterpretq_u8_u32(srcVector), rgbaMask))); - else if (buffer != src) + if (RGBA) { +#if defined(Q_PROCESSOR_ARM_64) + srcVector = vreinterpretq_u32_u8(vqtbl1q_u8(vreinterpretq_u8_u32(srcVector), rgbaMask)); +#else + // no vqtbl1q_u8 + const uint8x8_t low = vtbl1_u8(vreinterpret_u8_u32(vget_low_u32(srcVector)), rgbaMask); + const uint8x8_t high = vtbl1_u8(vreinterpret_u8_u32(vget_high_u32(srcVector)), rgbaMask); + srcVector = vcombine_u32(vreinterpret_u32_u8(low), vreinterpret_u32_u8(high)); +#endif + vst1q_u32(buffer + i, srcVector); + } else if (buffer != src) { vst1q_u32(buffer + i, srcVector); + } } } else { vst1q_u32(buffer + i, vdupq_n_u32(0)); @@ -1139,7 +1166,8 @@ const uint *QT_FASTCALL convertRGBA8888ToARGB32PM_neon(uint *buffer, const uint convertARGBToARGB32PM_neon<true>(buffer, src, count); return buffer; } -#endif + +#endif // Q_BYTE_ORDER == Q_LITTLE_ENDIAN QT_END_NAMESPACE diff --git a/src/gui/painting/qdrawhelper_p.h b/src/gui/painting/qdrawhelper_p.h index df9f762314..4c2fe87355 100644 --- a/src/gui/painting/qdrawhelper_p.h +++ b/src/gui/painting/qdrawhelper_p.h @@ -1160,23 +1160,23 @@ const uint qt_bayer_matrix[16][16] = { #if Q_PROCESSOR_WORDSIZE == 8 // 64-bit versions -#define AMIX(mask) (qMin(((qint64(s)&mask) + (qint64(d)&mask)), qint64(mask))) -#define MIX(mask) (qMin(((qint64(s)&mask) + (qint64(d)&mask)), qint64(mask))) +#define AMIX(mask) (qMin(((quint64(s)&mask) + (quint64(d)&mask)), quint64(mask))) +#define MIX(mask) (qMin(((quint64(s)&mask) + (quint64(d)&mask)), quint64(mask))) #else // 32 bits // The mask for alpha can overflow over 32 bits -#define AMIX(mask) quint32(qMin(((qint64(s)&mask) + (qint64(d)&mask)), qint64(mask))) +#define AMIX(mask) quint32(qMin(((quint64(s)&mask) + (quint64(d)&mask)), quint64(mask))) #define MIX(mask) (qMin(((quint32(s)&mask) + (quint32(d)&mask)), quint32(mask))) #endif -inline int comp_func_Plus_one_pixel_const_alpha(uint d, const uint s, const uint const_alpha, const uint one_minus_const_alpha) +inline uint comp_func_Plus_one_pixel_const_alpha(uint d, const uint s, const uint const_alpha, const uint one_minus_const_alpha) { - const int result = (AMIX(AMASK) | MIX(RMASK) | MIX(GMASK) | MIX(BMASK)); + const uint result = uint(AMIX(AMASK) | MIX(RMASK) | MIX(GMASK) | MIX(BMASK)); return INTERPOLATE_PIXEL_255(result, const_alpha, d, one_minus_const_alpha); } -inline int comp_func_Plus_one_pixel(uint d, const uint s) +inline uint comp_func_Plus_one_pixel(uint d, const uint s) { - const int result = (AMIX(AMASK) | MIX(RMASK) | MIX(GMASK) | MIX(BMASK)); + const uint result = uint(AMIX(AMASK) | MIX(RMASK) | MIX(GMASK) | MIX(BMASK)); return result; } diff --git a/src/gui/painting/qmatrix.h b/src/gui/painting/qmatrix.h index 15e0ab5be1..74ecef767e 100644 --- a/src/gui/painting/qmatrix.h +++ b/src/gui/painting/qmatrix.h @@ -108,7 +108,7 @@ public: bool isInvertible() const { return !qFuzzyIsNull(_m11*_m22 - _m12*_m21); } qreal determinant() const { return _m11*_m22 - _m12*_m21; } - Q_REQUIRED_RESULT QMatrix inverted(bool *invertible = Q_NULLPTR) const; + Q_REQUIRED_RESULT QMatrix inverted(bool *invertible = nullptr) const; bool operator==(const QMatrix &) const; bool operator!=(const QMatrix &) const; diff --git a/src/gui/painting/qpaintengine_blitter_p.h b/src/gui/painting/qpaintengine_blitter_p.h index 40f5347b26..fb5dfe2318 100644 --- a/src/gui/painting/qpaintengine_blitter_p.h +++ b/src/gui/painting/qpaintengine_blitter_p.h @@ -67,48 +67,48 @@ class Q_GUI_EXPORT QBlitterPaintEngine : public QRasterPaintEngine public: QBlitterPaintEngine(QBlittablePlatformPixmap *p); - virtual QPaintEngine::Type type() const Q_DECL_OVERRIDE + virtual QPaintEngine::Type type() const override { return Blitter; } - virtual bool begin(QPaintDevice *pdev) Q_DECL_OVERRIDE; - virtual bool end() Q_DECL_OVERRIDE; + virtual bool begin(QPaintDevice *pdev) override; + virtual bool end() override; // Call down into QBlittable - void fill(const QVectorPath &path, const QBrush &brush) Q_DECL_OVERRIDE; - void fillRect(const QRectF &rect, const QBrush &brush) Q_DECL_OVERRIDE; - void fillRect(const QRectF &rect, const QColor &color) Q_DECL_OVERRIDE; - void drawRects(const QRect *rects, int rectCount) Q_DECL_OVERRIDE; - void drawRects(const QRectF *rects, int rectCount) Q_DECL_OVERRIDE; - void drawPixmap(const QPointF &p, const QPixmap &pm) Q_DECL_OVERRIDE; - void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) Q_DECL_OVERRIDE; + void fill(const QVectorPath &path, const QBrush &brush) override; + void fillRect(const QRectF &rect, const QBrush &brush) override; + void fillRect(const QRectF &rect, const QColor &color) override; + void drawRects(const QRect *rects, int rectCount) override; + void drawRects(const QRectF *rects, int rectCount) override; + void drawPixmap(const QPointF &p, const QPixmap &pm) override; + void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) override; // State tracking - void setState(QPainterState *s) Q_DECL_OVERRIDE; - virtual void clipEnabledChanged() Q_DECL_OVERRIDE; - virtual void penChanged() Q_DECL_OVERRIDE; - virtual void brushChanged() Q_DECL_OVERRIDE; - virtual void opacityChanged() Q_DECL_OVERRIDE; - virtual void compositionModeChanged() Q_DECL_OVERRIDE; - virtual void renderHintsChanged() Q_DECL_OVERRIDE; - virtual void transformChanged() Q_DECL_OVERRIDE; + void setState(QPainterState *s) override; + virtual void clipEnabledChanged() override; + virtual void penChanged() override; + virtual void brushChanged() override; + virtual void opacityChanged() override; + virtual void compositionModeChanged() override; + virtual void renderHintsChanged() override; + virtual void transformChanged() override; // Override to lock the QBlittable before using raster - void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) Q_DECL_OVERRIDE; - void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode) Q_DECL_OVERRIDE; - void fillPath(const QPainterPath &path, QSpanData *fillData) Q_DECL_OVERRIDE; - void fillPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) Q_DECL_OVERRIDE; - void drawEllipse(const QRectF &rect) Q_DECL_OVERRIDE; - void drawImage(const QPointF &p, const QImage &img) Q_DECL_OVERRIDE; + void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) override; + void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode) override; + void fillPath(const QPainterPath &path, QSpanData *fillData) override; + void fillPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) override; + void drawEllipse(const QRectF &rect) override; + void drawImage(const QPointF &p, const QImage &img) override; void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr, - Qt::ImageConversionFlags flags = Qt::AutoColor) Q_DECL_OVERRIDE; - void drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &sr) Q_DECL_OVERRIDE; - void drawTextItem(const QPointF &p, const QTextItem &textItem) Q_DECL_OVERRIDE; - void drawPoints(const QPointF *points, int pointCount) Q_DECL_OVERRIDE; - void drawPoints(const QPoint *points, int pointCount) Q_DECL_OVERRIDE; - void stroke(const QVectorPath &path, const QPen &pen) Q_DECL_OVERRIDE; - void drawStaticTextItem(QStaticTextItem *) Q_DECL_OVERRIDE; + Qt::ImageConversionFlags flags = Qt::AutoColor) override; + void drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &sr) override; + void drawTextItem(const QPointF &p, const QTextItem &textItem) override; + void drawPoints(const QPointF *points, int pointCount) override; + void drawPoints(const QPoint *points, int pointCount) override; + void stroke(const QVectorPath &path, const QPen &pen) override; + void drawStaticTextItem(QStaticTextItem *) override; bool drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs, const QFixedPoint *positions, - QFontEngine *fontEngine) Q_DECL_OVERRIDE; + QFontEngine *fontEngine) override; }; QT_END_NAMESPACE diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index 1637a933b1..0e3163eefb 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -3782,8 +3782,8 @@ void QClipData::initialize() } } else if (hasRegionClip) { - const QVector<QRect> rects = clipRegion.rects(); - const int numRects = rects.size(); + const auto rects = clipRegion.begin(); + const int numRects = clipRegion.rectCount(); { // resize const int maxSpans = (ymax - ymin) * numRects; @@ -3797,8 +3797,8 @@ void QClipData::initialize() int firstInBand = 0; count = 0; while (firstInBand < numRects) { - const int currMinY = rects.at(firstInBand).y(); - const int currMaxY = currMinY + rects.at(firstInBand).height(); + const int currMinY = rects[firstInBand].y(); + const int currMaxY = currMinY + rects[firstInBand].height(); while (y < currMinY) { m_clipLines[y].spans = 0; @@ -3807,7 +3807,7 @@ void QClipData::initialize() } int lastInBand = firstInBand; - while (lastInBand + 1 < numRects && rects.at(lastInBand+1).top() == y) + while (lastInBand + 1 < numRects && rects[lastInBand+1].top() == y) ++lastInBand; while (y < currMaxY) { @@ -3816,7 +3816,7 @@ void QClipData::initialize() m_clipLines[y].count = lastInBand - firstInBand + 1; for (int r = firstInBand; r <= lastInBand; ++r) { - const QRect &currRect = rects.at(r); + const QRect &currRect = rects[r]; QSpan *span = m_spans + count; span->x = currRect.x(); span->len = currRect.width(); diff --git a/src/gui/painting/qpaintengine_raster_p.h b/src/gui/painting/qpaintengine_raster_p.h index e2e0f821e3..8c6f668d9d 100644 --- a/src/gui/painting/qpaintengine_raster_p.h +++ b/src/gui/painting/qpaintengine_raster_p.h @@ -135,20 +135,20 @@ public: QRasterPaintEngine(QPaintDevice *device); ~QRasterPaintEngine(); - bool begin(QPaintDevice *device) Q_DECL_OVERRIDE; - bool end() Q_DECL_OVERRIDE; - - void penChanged() Q_DECL_OVERRIDE; - void brushChanged() Q_DECL_OVERRIDE; - void brushOriginChanged() Q_DECL_OVERRIDE; - void opacityChanged() Q_DECL_OVERRIDE; - void compositionModeChanged() Q_DECL_OVERRIDE; - void renderHintsChanged() Q_DECL_OVERRIDE; - void transformChanged() Q_DECL_OVERRIDE; - void clipEnabledChanged() Q_DECL_OVERRIDE; - - void setState(QPainterState *s) Q_DECL_OVERRIDE; - QPainterState *createState(QPainterState *orig) const Q_DECL_OVERRIDE; + bool begin(QPaintDevice *device) override; + bool end() override; + + void penChanged() override; + void brushChanged() override; + void brushOriginChanged() override; + void opacityChanged() override; + void compositionModeChanged() override; + void renderHintsChanged() override; + void transformChanged() override; + void clipEnabledChanged() override; + + void setState(QPainterState *s) override; + QPainterState *createState(QPainterState *orig) const override; inline QRasterPaintEngineState *state() { return static_cast<QRasterPaintEngineState *>(QPaintEngineEx::state()); } @@ -164,40 +164,40 @@ public: virtual void fillPath(const QPainterPath &path, QSpanData *fillData); virtual void fillPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode); - void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) Q_DECL_OVERRIDE; - void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode) Q_DECL_OVERRIDE; + void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) override; + void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode) override; - void drawEllipse(const QRectF &rect) Q_DECL_OVERRIDE; + void drawEllipse(const QRectF &rect) override; - void fillRect(const QRectF &rect, const QBrush &brush) Q_DECL_OVERRIDE; - void fillRect(const QRectF &rect, const QColor &color) Q_DECL_OVERRIDE; + void fillRect(const QRectF &rect, const QBrush &brush) override; + void fillRect(const QRectF &rect, const QColor &color) override; - void drawRects(const QRect *rects, int rectCount) Q_DECL_OVERRIDE; - void drawRects(const QRectF *rects, int rectCount) Q_DECL_OVERRIDE; + void drawRects(const QRect *rects, int rectCount) override; + void drawRects(const QRectF *rects, int rectCount) override; - void drawPixmap(const QPointF &p, const QPixmap &pm) Q_DECL_OVERRIDE; - void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) Q_DECL_OVERRIDE; - void drawImage(const QPointF &p, const QImage &img) Q_DECL_OVERRIDE; + void drawPixmap(const QPointF &p, const QPixmap &pm) override; + void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) override; + void drawImage(const QPointF &p, const QImage &img) override; void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr, - Qt::ImageConversionFlags flags = Qt::AutoColor) Q_DECL_OVERRIDE; - void drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &sr) Q_DECL_OVERRIDE; - void drawTextItem(const QPointF &p, const QTextItem &textItem) Q_DECL_OVERRIDE; + Qt::ImageConversionFlags flags = Qt::AutoColor) override; + void drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &sr) override; + void drawTextItem(const QPointF &p, const QTextItem &textItem) override; - void drawLines(const QLine *line, int lineCount) Q_DECL_OVERRIDE; - void drawLines(const QLineF *line, int lineCount) Q_DECL_OVERRIDE; + void drawLines(const QLine *line, int lineCount) override; + void drawLines(const QLineF *line, int lineCount) override; - void drawPoints(const QPointF *points, int pointCount) Q_DECL_OVERRIDE; - void drawPoints(const QPoint *points, int pointCount) Q_DECL_OVERRIDE; + void drawPoints(const QPointF *points, int pointCount) override; + void drawPoints(const QPoint *points, int pointCount) override; - void stroke(const QVectorPath &path, const QPen &pen) Q_DECL_OVERRIDE; - void fill(const QVectorPath &path, const QBrush &brush) Q_DECL_OVERRIDE; + void stroke(const QVectorPath &path, const QPen &pen) override; + void fill(const QVectorPath &path, const QBrush &brush) override; - void clip(const QVectorPath &path, Qt::ClipOperation op) Q_DECL_OVERRIDE; - void clip(const QRect &rect, Qt::ClipOperation op) Q_DECL_OVERRIDE; - void clip(const QRegion ®ion, Qt::ClipOperation op) Q_DECL_OVERRIDE; + void clip(const QVectorPath &path, Qt::ClipOperation op) override; + void clip(const QRect &rect, Qt::ClipOperation op) override; + void clip(const QRegion ®ion, Qt::ClipOperation op) override; inline const QClipData *clipData() const; - void drawStaticTextItem(QStaticTextItem *textItem) Q_DECL_OVERRIDE; + void drawStaticTextItem(QStaticTextItem *textItem) override; virtual bool drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs, const QFixedPoint *positions, QFontEngine *fontEngine); @@ -227,12 +227,12 @@ public: QRasterBuffer *rasterBuffer(); void alphaPenBlt(const void* src, int bpl, int depth, int rx,int ry,int w,int h, bool useGammaCorrection); - Type type() const Q_DECL_OVERRIDE { return Raster; } + Type type() const override { return Raster; } - QPoint coordinateOffset() const Q_DECL_OVERRIDE; + QPoint coordinateOffset() const override; - bool requiresPretransformedGlyphPositions(QFontEngine *fontEngine, const QTransform &m) const Q_DECL_OVERRIDE; - bool shouldDrawCachedGlyphs(QFontEngine *fontEngine, const QTransform &m) const Q_DECL_OVERRIDE; + bool requiresPretransformedGlyphPositions(QFontEngine *fontEngine, const QTransform &m) const override; + bool shouldDrawCachedGlyphs(QFontEngine *fontEngine, const QTransform &m) const override; protected: QRasterPaintEngine(QRasterPaintEnginePrivate &d, QPaintDevice *); diff --git a/src/gui/painting/qpaintengineex.cpp b/src/gui/painting/qpaintengineex.cpp index 812cb8c02d..0643a7cbb6 100644 --- a/src/gui/painting/qpaintengineex.cpp +++ b/src/gui/painting/qpaintengineex.cpp @@ -619,18 +619,17 @@ void QPaintEngineEx::clip(const QRect &r, Qt::ClipOperation op) void QPaintEngineEx::clip(const QRegion ®ion, Qt::ClipOperation op) { - if (region.rectCount() == 1) - clip(region.boundingRect(), op); - - QVector<QRect> rects = region.rects(); - if (rects.size() <= 32) { + const auto rectsInRegion = region.rectCount(); + if (rectsInRegion == 1) { + clip(*region.begin(), op); + } else if (rectsInRegion <= 32) { qreal pts[2*32*4]; int pos = 0; - for (QVector<QRect>::const_iterator i = rects.constBegin(); i != rects.constEnd(); ++i) { - qreal x1 = i->x(); - qreal y1 = i->y(); - qreal x2 = i->x() + i->width(); - qreal y2 = i->y() + i->height(); + for (QRect r : region) { + qreal x1 = r.x(); + qreal y1 = r.y(); + qreal x2 = r.x() + r.width(); + qreal y2 = r.y() + r.height(); pts[pos++] = x1; pts[pos++] = y1; @@ -644,19 +643,19 @@ void QPaintEngineEx::clip(const QRegion ®ion, Qt::ClipOperation op) pts[pos++] = x1; pts[pos++] = y2; } - QVectorPath vp(pts, rects.size() * 4, qpaintengineex_rect4_types_32); + QVectorPath vp(pts, rectsInRegion * 4, qpaintengineex_rect4_types_32); clip(vp, op); } else { - QVarLengthArray<qreal> pts(rects.size() * 2 * 4); - QVarLengthArray<QPainterPath::ElementType> types(rects.size() * 4); + QVarLengthArray<qreal> pts(rectsInRegion * 2 * 4); + QVarLengthArray<QPainterPath::ElementType> types(rectsInRegion * 4); int ppos = 0; int tpos = 0; - for (QVector<QRect>::const_iterator i = rects.constBegin(); i != rects.constEnd(); ++i) { - qreal x1 = i->x(); - qreal y1 = i->y(); - qreal x2 = i->x() + i->width(); - qreal y2 = i->y() + i->height(); + for (QRect r : region) { + qreal x1 = r.x(); + qreal y1 = r.y(); + qreal x2 = r.x() + r.width(); + qreal y2 = r.y() + r.height(); pts[ppos++] = x1; pts[ppos++] = y1; @@ -676,7 +675,7 @@ void QPaintEngineEx::clip(const QRegion ®ion, Qt::ClipOperation op) types[tpos++] = QPainterPath::LineToElement; } - QVectorPath vp(pts.data(), rects.size() * 4, types.data()); + QVectorPath vp(pts.data(), rectsInRegion * 4, types.data()); clip(vp, op); } diff --git a/src/gui/painting/qpaintengineex_p.h b/src/gui/painting/qpaintengineex_p.h index 7c2c98140f..b2f8b64029 100644 --- a/src/gui/painting/qpaintengineex_p.h +++ b/src/gui/painting/qpaintengineex_p.h @@ -103,36 +103,36 @@ public: virtual void drawRoundedRect(const QRectF &rect, qreal xrad, qreal yrad, Qt::SizeMode mode); - virtual void drawRects(const QRect *rects, int rectCount) Q_DECL_OVERRIDE; - virtual void drawRects(const QRectF *rects, int rectCount) Q_DECL_OVERRIDE; + virtual void drawRects(const QRect *rects, int rectCount) override; + virtual void drawRects(const QRectF *rects, int rectCount) override; - virtual void drawLines(const QLine *lines, int lineCount) Q_DECL_OVERRIDE; - virtual void drawLines(const QLineF *lines, int lineCount) Q_DECL_OVERRIDE; + virtual void drawLines(const QLine *lines, int lineCount) override; + virtual void drawLines(const QLineF *lines, int lineCount) override; - virtual void drawEllipse(const QRectF &r) Q_DECL_OVERRIDE; - virtual void drawEllipse(const QRect &r) Q_DECL_OVERRIDE; + virtual void drawEllipse(const QRectF &r) override; + virtual void drawEllipse(const QRect &r) override; - virtual void drawPath(const QPainterPath &path) Q_DECL_OVERRIDE; + virtual void drawPath(const QPainterPath &path) override; - virtual void drawPoints(const QPointF *points, int pointCount) Q_DECL_OVERRIDE; - virtual void drawPoints(const QPoint *points, int pointCount) Q_DECL_OVERRIDE; + virtual void drawPoints(const QPointF *points, int pointCount) override; + virtual void drawPoints(const QPoint *points, int pointCount) override; - virtual void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) Q_DECL_OVERRIDE; - virtual void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode) Q_DECL_OVERRIDE; + virtual void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) override; + virtual void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode) override; - virtual void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) Q_DECL_OVERRIDE = 0; + virtual void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) override = 0; virtual void drawPixmap(const QPointF &pos, const QPixmap &pm); virtual void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr, - Qt::ImageConversionFlags flags = Qt::AutoColor) Q_DECL_OVERRIDE = 0; + Qt::ImageConversionFlags flags = Qt::AutoColor) override = 0; virtual void drawImage(const QPointF &pos, const QImage &image); - virtual void drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s) Q_DECL_OVERRIDE; + virtual void drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s) override; virtual void drawPixmapFragments(const QPainter::PixmapFragment *fragments, int fragmentCount, const QPixmap &pixmap, QFlags<QPainter::PixmapFragmentHint> hints); - virtual void updateState(const QPaintEngineState &state) Q_DECL_OVERRIDE; + virtual void updateState(const QPaintEngineState &state) override; virtual void drawStaticTextItem(QStaticTextItem *); diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index 6e84a3f384..ec1b4c1310 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -4256,7 +4256,7 @@ void QPainter::drawEllipse(const QRectF &r) } /*! - \fn QPainter::drawEllipse(const QRect &rectangle) + \fn void QPainter::drawEllipse(const QRect &rectangle) \overload @@ -4298,7 +4298,7 @@ void QPainter::drawEllipse(const QRect &r) } /*! - \fn QPainter::drawEllipse(int x, int y, int width, int height) + \fn void QPainter::drawEllipse(int x, int y, int width, int height) \overload @@ -4309,7 +4309,7 @@ void QPainter::drawEllipse(const QRect &r) /*! \since 4.4 - \fn QPainter::drawEllipse(const QPointF ¢er, qreal rx, qreal ry) + \fn void QPainter::drawEllipse(const QPointF ¢er, qreal rx, qreal ry) \overload @@ -4319,7 +4319,7 @@ void QPainter::drawEllipse(const QRect &r) /*! \since 4.4 - \fn QPainter::drawEllipse(const QPoint ¢er, int rx, int ry) + \fn void QPainter::drawEllipse(const QPoint ¢er, int rx, int ry) \overload @@ -5744,7 +5744,7 @@ void QPainter::drawStaticText(const QPointF &topLeftPosition, const QStaticText if (d->extended == 0 || !d->state->matrix.isAffine() || !fe->supportsTransformation(d->state->matrix)) { - staticText_d->paintText(topLeftPosition, this); + staticText_d->paintText(topLeftPosition, this, pen().color()); return; } @@ -5816,11 +5816,16 @@ void QPainter::drawStaticText(const QPointF &topLeftPosition, const QStaticText QPen oldPen = d->state->pen; QColor currentColor = oldPen.color(); + static const QColor bodyIndicator(0, 0, 0, 0); for (int i=0; i<staticText_d->itemCount; ++i) { QStaticTextItem *item = staticText_d->items + i; - if (item->color.isValid() && currentColor != item->color) { - setPen(item->color); - currentColor = item->color; + if (item->color.isValid() && currentColor != item->color + && item->color != bodyIndicator) { + setPen(item->color); + currentColor = item->color; + } else if (item->color == bodyIndicator) { + setPen(oldPen); + currentColor = oldPen.color(); } d->extended->drawStaticTextItem(item); @@ -5850,7 +5855,7 @@ void QPainter::drawText(const QPointF &p, const QString &str, int tf, int justif if (!d->engine || str.isEmpty() || pen().style() == Qt::NoPen) return; -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +#if QT_DEPRECATED_SINCE(5, 11) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0) if (tf & Qt::TextBypassShaping) { // Skip complex shaping, shape using glyph advances only int len = str.length(); @@ -6737,7 +6742,7 @@ void QPainter::drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPo } /*! - \fn QPainter::drawTiledPixmap(const QRect &rectangle, const QPixmap &pixmap, + \fn void QPainter::drawTiledPixmap(const QRect &rectangle, const QPixmap &pixmap, const QPoint &position = QPoint()) \overload @@ -7478,7 +7483,7 @@ start_lengthVariant: if (!expandtabs) { text[offset] = QLatin1Char(' '); } else if (!tabarraylen && !tabstops) { - tabstops = qRound(fm.width(QLatin1Char('x'))*8); + tabstops = qRound(fm.horizontalAdvance(QLatin1Char('x'))*8); } } else if (chr == QChar(ushort(0x9c))) { // string with multiple length variants diff --git a/src/gui/painting/qpainter.h b/src/gui/painting/qpainter.h index 64d15d5296..12a9c720a8 100644 --- a/src/gui/painting/qpainter.h +++ b/src/gui/painting/qpainter.h @@ -416,9 +416,9 @@ public: void drawText(const QPointF &p, const QString &str, int tf, int justificationPadding); - void drawText(const QRectF &r, int flags, const QString &text, QRectF *br = Q_NULLPTR); - void drawText(const QRect &r, int flags, const QString &text, QRect *br = Q_NULLPTR); - inline void drawText(int x, int y, int w, int h, int flags, const QString &text, QRect *br = Q_NULLPTR); + void drawText(const QRectF &r, int flags, const QString &text, QRectF *br = nullptr); + void drawText(const QRect &r, int flags, const QString &text, QRect *br = nullptr); + inline void drawText(int x, int y, int w, int h, int flags, const QString &text, QRect *br = nullptr); void drawText(const QRectF &r, const QString &text, const QTextOption &o = QTextOption()); @@ -461,7 +461,7 @@ public: static void setRedirected(const QPaintDevice *device, QPaintDevice *replacement, const QPoint& offset = QPoint()); - static QPaintDevice *redirected(const QPaintDevice *device, QPoint *offset = Q_NULLPTR); + static QPaintDevice *redirected(const QPaintDevice *device, QPoint *offset = nullptr); static void restoreRedirected(const QPaintDevice *device); void beginNativePainting(); diff --git a/src/gui/painting/qpdf_p.h b/src/gui/painting/qpdf_p.h index f5bb4e17a8..5a909f2ede 100644 --- a/src/gui/painting/qpdf_p.h +++ b/src/gui/painting/qpdf_p.h @@ -186,28 +186,28 @@ public: void setPdfVersion(PdfVersion version); // reimplementations QPaintEngine - bool begin(QPaintDevice *pdev) Q_DECL_OVERRIDE; - bool end() Q_DECL_OVERRIDE; + bool begin(QPaintDevice *pdev) override; + bool end() override; - void drawPoints(const QPointF *points, int pointCount) Q_DECL_OVERRIDE; - void drawLines(const QLineF *lines, int lineCount) Q_DECL_OVERRIDE; - void drawRects(const QRectF *rects, int rectCount) Q_DECL_OVERRIDE; - void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) Q_DECL_OVERRIDE; - void drawPath (const QPainterPath & path) Q_DECL_OVERRIDE; + void drawPoints(const QPointF *points, int pointCount) override; + void drawLines(const QLineF *lines, int lineCount) override; + void drawRects(const QRectF *rects, int rectCount) override; + void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) override; + void drawPath (const QPainterPath & path) override; - void drawTextItem(const QPointF &p, const QTextItem &textItem) Q_DECL_OVERRIDE; + void drawTextItem(const QPointF &p, const QTextItem &textItem) override; - void drawPixmap (const QRectF & rectangle, const QPixmap & pixmap, const QRectF & sr) Q_DECL_OVERRIDE; + void drawPixmap (const QRectF & rectangle, const QPixmap & pixmap, const QRectF & sr) override; void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr, - Qt::ImageConversionFlags flags = Qt::AutoColor) Q_DECL_OVERRIDE; - void drawTiledPixmap (const QRectF & rectangle, const QPixmap & pixmap, const QPointF & point) Q_DECL_OVERRIDE; + Qt::ImageConversionFlags flags = Qt::AutoColor) override; + void drawTiledPixmap (const QRectF & rectangle, const QPixmap & pixmap, const QPointF & point) override; void drawHyperlink(const QRectF &r, const QUrl &url); - void updateState(const QPaintEngineState &state) Q_DECL_OVERRIDE; + void updateState(const QPaintEngineState &state) override; int metric(QPaintDevice::PaintDeviceMetric metricType) const; - Type type() const Q_DECL_OVERRIDE; + Type type() const override; // end reimplementations QPaintEngine // Printer stuff... diff --git a/src/gui/painting/qpdfwriter.cpp b/src/gui/painting/qpdfwriter.cpp index 5af465edeb..2f24c7efcb 100644 --- a/src/gui/painting/qpdfwriter.cpp +++ b/src/gui/painting/qpdfwriter.cpp @@ -79,7 +79,7 @@ public: virtual ~QPdfPagedPaintDevicePrivate() {} - bool setPageLayout(const QPageLayout &newPageLayout) Q_DECL_OVERRIDE + bool setPageLayout(const QPageLayout &newPageLayout) override { // Try to set the paint engine page layout pd->engine->setPageLayout(newPageLayout); @@ -88,7 +88,7 @@ public: return m_pageLayout.isEquivalentTo(newPageLayout); } - bool setPageSize(const QPageSize &pageSize) Q_DECL_OVERRIDE + bool setPageSize(const QPageSize &pageSize) override { // Try to set the paint engine page size pd->engine->setPageSize(pageSize); @@ -97,7 +97,7 @@ public: return m_pageLayout.pageSize().isEquivalentTo(pageSize); } - bool setPageOrientation(QPageLayout::Orientation orientation) Q_DECL_OVERRIDE + bool setPageOrientation(QPageLayout::Orientation orientation) override { // Set the print engine value pd->engine->setPageOrientation(orientation); @@ -106,12 +106,12 @@ public: return m_pageLayout.orientation() == orientation; } - bool setPageMargins(const QMarginsF &margins) Q_DECL_OVERRIDE + bool setPageMargins(const QMarginsF &margins) override { return setPageMargins(margins, pageLayout().units()); } - bool setPageMargins(const QMarginsF &margins, QPageLayout::Unit units) Q_DECL_OVERRIDE + bool setPageMargins(const QMarginsF &margins, QPageLayout::Unit units) override { // Try to set engine margins pd->engine->setPageMargins(margins, units); @@ -120,7 +120,7 @@ public: return m_pageLayout.margins() == margins && m_pageLayout.units() == units; } - QPageLayout pageLayout() const Q_DECL_OVERRIDE + QPageLayout pageLayout() const override { return pd->engine->pageLayout(); } diff --git a/src/gui/painting/qpen.h b/src/gui/painting/qpen.h index d8d99ba800..03abfb3d7d 100644 --- a/src/gui/painting/qpen.h +++ b/src/gui/painting/qpen.h @@ -72,7 +72,7 @@ public: QPen &operator=(const QPen &pen) Q_DECL_NOTHROW; #ifdef Q_COMPILER_RVALUE_REFS QPen(QPen &&other) Q_DECL_NOTHROW - : d(other.d) { other.d = Q_NULLPTR; } + : d(other.d) { other.d = nullptr; } QPen &operator=(QPen &&other) Q_DECL_NOTHROW { qSwap(d, other.d); return *this; } #endif diff --git a/src/gui/painting/qplatformbackingstore.cpp b/src/gui/painting/qplatformbackingstore.cpp index 8ab22beb31..09c23fdfa1 100644 --- a/src/gui/painting/qplatformbackingstore.cpp +++ b/src/gui/painting/qplatformbackingstore.cpp @@ -704,7 +704,7 @@ void QPlatformBackingStore::endPaint() */ QPlatformGraphicsBuffer *QPlatformBackingStore::graphicsBuffer() const { - return Q_NULLPTR; + return nullptr; } /*! diff --git a/src/gui/painting/qregion.cpp b/src/gui/painting/qregion.cpp index 3fb6f925b3..77718ce747 100644 --- a/src/gui/painting/qregion.cpp +++ b/src/gui/painting/qregion.cpp @@ -81,8 +81,9 @@ QT_BEGIN_NAMESPACE contains() a QPoint or QRect. The bounding rectangle can be found with boundingRect(). - Iteration over the region (with begin(), end()) gives a decomposition of - the region into rectangles. The same sequence of rectangles is returned by rects(). + Iteration over the region (with begin(), end(), or C++11 + ranged-for loops) gives a decomposition of the region into + rectangles. Example of using complex regions: \snippet code/src_gui_painting_qregion.cpp 0 @@ -447,19 +448,20 @@ QDebug operator<<(QDebug s, const QRegion &r) } else if (r.isEmpty()) { s << "empty"; } else { - const QVector<QRect> rects = r.rects(); - const int count = rects.size(); + const int count = r.rectCount(); if (count > 1) s << "size=" << count << ", bounds=("; QtDebugUtils::formatQRect(s, r.boundingRect()); if (count > 1) { s << ") - ["; - for (int i = 0; i < count; ++i) { - if (i) + bool first = true; + for (const QRect &rect : r) { + if (!first) s << ", "; s << '('; - QtDebugUtils::formatQRect(s, rects.at(i)); + QtDebugUtils::formatQRect(s, rect); s << ')'; + first = false; } s << ']'; } @@ -740,7 +742,7 @@ bool QRegion::intersects(const QRegion ®ion) const #if !defined (Q_OS_UNIX) && !defined (Q_OS_WIN) || defined(Q_CLANG_QDOC) -/*! +/* \overload \since 4.4 */ @@ -754,7 +756,8 @@ QRegion QRegion::intersect(const QRect &r) const \fn int QRegion::rectCount() const \since 4.6 - Returns the number of rectangles that will be returned in rects(). + Returns the number of rectangles that this region is composed of. + Same as \c{end() - begin()}. */ /*! @@ -916,20 +919,28 @@ QRegion QRegion::intersect(const QRect &r) const gives a rectangle that is QRect::isNull(). */ +#if QT_DEPRECATED_SINCE(5, 11) /*! \fn QVector<QRect> QRegion::rects() const + \obsolete + + Use begin() and end() instead. Returns an array of non-overlapping rectangles that make up the region. The union of all the rectangles is equal to the original region. */ +#endif /*! \typedef QRegion::const_iterator \since 5.8 - An iterator over the QRects that make up the region. + An iterator over the non-overlapping rectangles that make up the + region. + + The union of all the rectangles is equal to the original region. QRegion does not offer mutable iterators. @@ -940,7 +951,10 @@ QRegion QRegion::intersect(const QRect &r) const \typedef QRegion::const_reverse_iterator \since 5.8 - A reverse iterator over the QRects that make up the region. + A reverse iterator over the non-overlapping rectangles that make up the + region. + + The union of all the rectangles is equal to the original region. QRegion does not offer mutable iterators. @@ -952,8 +966,9 @@ QRegion QRegion::intersect(const QRect &r) const \since 5.8 Returns a const_iterator pointing to the beginning of the range of - rectangles that make up this range, in the order in which rects() - returns them. + non-overlapping rectangles that make up the region. + + The union of all the rectangles is equal to the original region. \sa rbegin(), cbegin(), end() */ @@ -969,9 +984,10 @@ QRegion QRegion::intersect(const QRect &r) const \fn QRegion::end() const \since 5.8 - Returns a const_iterator pointing to one past the end of the range of - rectangles that make up this range, in the order in which rects() - returns them. + Returns a const_iterator pointing to one past the end of + non-overlapping rectangles that make up the region. + + The union of all the rectangles is equal to the original region. \sa rend(), cend(), begin() */ @@ -987,9 +1003,10 @@ QRegion QRegion::intersect(const QRect &r) const \fn QRegion::rbegin() const \since 5.8 - Returns a const_reverse_iterator pointing to the beginning of the range of - rectangles that make up this range, in the reverse order in which rects() - returns them. + Returns a const_reverse_iterator pointing to the beginning of the + range of non-overlapping rectangles that make up the region. + + The union of all the rectangles is equal to the original region. \sa begin(), crbegin(), rend() */ @@ -1005,9 +1022,10 @@ QRegion QRegion::intersect(const QRect &r) const \fn QRegion::rend() const \since 5.8 - Returns a const_reverse_iterator pointing to one past the end of the range of - rectangles that make up this range, in the reverse order in which rects() - returns them. + Returns a const_reverse_iterator pointing to one past the end of + the range of non-overlapping rectangles that make up the region. + + The union of all the rectangles is equal to the original region. \sa end(), crend(), rbegin() */ @@ -2281,7 +2299,14 @@ static void miRegionOp(QRegionPrivate &dest, dest.vectorize(); - QVector<QRect> oldRects = dest.rects; + /* + * The following calls are going to detach dest.rects. Since dest might be + * aliasing *reg1 and/or *reg2, and we could have active iterators on + * reg1->rects and reg2->rects (if the regions have more than 1 rectangle), + * take a copy of dest.rects to keep those iteractors valid. + */ + const QVector<QRect> destRectsCopy = dest.rects; + Q_UNUSED(destRectsCopy); dest.numRects = 0; @@ -3613,7 +3638,7 @@ static void PtsToRegion(int numFullPtBlocks, int iCurPtBlock, } if (rowSize) { - QPoint *next = i ? &pts[2] : (numFullPtBlocks && iCurPtBlock ? CurPtBlock->next->pts : Q_NULLPTR); + QPoint *next = i ? &pts[2] : (numFullPtBlocks && iCurPtBlock ? CurPtBlock->next->pts : nullptr); if (!next || next->y() != pts[0].y()) { flushRow(row.data(), pts[0].y(), rowSize, reg, &lastRow, &extendTo, &needsExtend); @@ -4340,6 +4365,7 @@ bool qt_region_strictContains(const QRegion ®ion, const QRect &rect) && rect.top() >= r1.top() && rect.bottom() <= r1.bottom()); } +#if QT_DEPRECATED_SINCE(5, 11) QVector<QRect> QRegion::rects() const { if (d->qt_rgn) { @@ -4351,6 +4377,7 @@ QVector<QRect> QRegion::rects() const return QVector<QRect>(); } } +#endif QRegion::const_iterator QRegion::begin() const Q_DECL_NOTHROW { diff --git a/src/gui/painting/qregion.h b/src/gui/painting/qregion.h index 8dd7649447..9fe6ed5675 100644 --- a/src/gui/painting/qregion.h +++ b/src/gui/painting/qregion.h @@ -122,7 +122,10 @@ public: bool intersects(const QRect &r) const; QRect boundingRect() const Q_DECL_NOTHROW; +#if QT_DEPRECATED_SINCE(5, 11) + QT_DEPRECATED_X("Use begin()/end() instead") QVector<QRect> rects() const; +#endif void setRects(const QRect *rect, int num); int rectCount() const Q_DECL_NOTHROW; #ifdef Q_COMPILER_MANGLES_RETURN_TYPE diff --git a/src/gui/painting/qrgba64.qdoc b/src/gui/painting/qrgba64.qdoc index 064f018210..26c78a5dcd 100644 --- a/src/gui/painting/qrgba64.qdoc +++ b/src/gui/painting/qrgba64.qdoc @@ -105,7 +105,7 @@ */ /*! - \fn QRgba64::setRed(quint16 red) + \fn void QRgba64::setRed(quint16 red) Sets the red color component of this color to \a red. @@ -121,7 +121,7 @@ */ /*! - \fn QRgba64::setGreen(quint16 green) + \fn void QRgba64::setGreen(quint16 green) Sets the green color component of this color to \a green. @@ -137,7 +137,7 @@ */ /*! - \fn QRgba64::setBlue(quint16 blue) + \fn void QRgba64::setBlue(quint16 blue) Sets the blue color component of this color to \a blue. @@ -153,7 +153,7 @@ */ /*! - \fn QRgba64::setAlpha(quint16 alpha) + \fn void QRgba64::setAlpha(quint16 alpha) Sets the alpha of this color to \a alpha. diff --git a/src/gui/painting/qrgba64_p.h b/src/gui/painting/qrgba64_p.h index 7776a5b08a..adceda2210 100644 --- a/src/gui/painting/qrgba64_p.h +++ b/src/gui/painting/qrgba64_p.h @@ -299,6 +299,21 @@ inline QRgba64 rgbBlend(QRgba64 d, QRgba64 s, uint rgbAlpha) return blend; } +static Q_ALWAYS_INLINE void blend_pixel(QRgba64 &dst, QRgba64 src) +{ + if (src.isOpaque()) + dst = src; + else if (!src.isTransparent()) + dst = src + multiplyAlpha65535(dst, 65535 - src.alpha()); +} + +static Q_ALWAYS_INLINE void blend_pixel(QRgba64 &dst, QRgba64 src, const int const_alpha) +{ + if (!src.isTransparent()) { + src = multiplyAlpha255(src, const_alpha); + dst = src + multiplyAlpha65535(dst, 65535 - src.alpha()); + } +} QT_END_NAMESPACE diff --git a/src/gui/painting/qt_mips_asm_dsp_p.h b/src/gui/painting/qt_mips_asm_dsp_p.h index 1393a35667..172910ea1c 100644 --- a/src/gui/painting/qt_mips_asm_dsp_p.h +++ b/src/gui/painting/qt_mips_asm_dsp_p.h @@ -55,6 +55,7 @@ #pragma qt_sync_stop_processing #endif +#ifndef Q_CLANG_QDOC #define zero $0 #define AT $1 #define v0 $2 @@ -88,6 +89,7 @@ #define fp $30 #define s8 $30 #define ra $31 +#endif /* * LEAF_MIPS32R2 - declare leaf_mips32r2 routine diff --git a/src/gui/painting/qtextureglyphcache_p.h b/src/gui/painting/qtextureglyphcache_p.h index 25253b496a..3da28872b1 100644 --- a/src/gui/painting/qtextureglyphcache_p.h +++ b/src/gui/painting/qtextureglyphcache_p.h @@ -169,9 +169,9 @@ public: : QTextureGlyphCache(format, matrix) { } ~QImageTextureGlyphCache(); - virtual void createTextureData(int width, int height) Q_DECL_OVERRIDE; - virtual void resizeTextureData(int width, int height) Q_DECL_OVERRIDE; - virtual void fillTexture(const Coord &c, glyph_t glyph, QFixed subPixelPosition) Q_DECL_OVERRIDE; + virtual void createTextureData(int width, int height) override; + virtual void resizeTextureData(int width, int height) override; + virtual void fillTexture(const Coord &c, glyph_t glyph, QFixed subPixelPosition) override; inline const QImage &image() const { return m_image; } diff --git a/src/gui/painting/qtransform.cpp b/src/gui/painting/qtransform.cpp index 7f06915444..7a53c44bc4 100644 --- a/src/gui/painting/qtransform.cpp +++ b/src/gui/painting/qtransform.cpp @@ -265,7 +265,7 @@ QTransform::QTransform() , m_13(0), m_23(0), m_33(1) , m_type(TxNone) , m_dirty(TxNone) - , d(Q_NULLPTR) + , d(nullptr) { } @@ -284,7 +284,7 @@ QTransform::QTransform(qreal h11, qreal h12, qreal h13, , m_13(h13), m_23(h23), m_33(h33) , m_type(TxNone) , m_dirty(TxProject) - , d(Q_NULLPTR) + , d(nullptr) { } @@ -301,7 +301,7 @@ QTransform::QTransform(qreal h11, qreal h12, qreal h21, , m_13(0), m_23(0), m_33(1) , m_type(TxNone) , m_dirty(TxShear) - , d(Q_NULLPTR) + , d(nullptr) { } @@ -317,7 +317,7 @@ QTransform::QTransform(const QMatrix &mtx) m_13(0), m_23(0), m_33(1) , m_type(TxNone) , m_dirty(TxShear) - , d(Q_NULLPTR) + , d(nullptr) { } diff --git a/src/gui/painting/qtransform.h b/src/gui/painting/qtransform.h index 06ae611861..79835b36e2 100644 --- a/src/gui/painting/qtransform.h +++ b/src/gui/painting/qtransform.h @@ -116,7 +116,7 @@ public: qreal m21, qreal m22, qreal m23, qreal m31, qreal m32, qreal m33); - Q_REQUIRED_RESULT QTransform inverted(bool *invertible = Q_NULLPTR) const; + Q_REQUIRED_RESULT QTransform inverted(bool *invertible = nullptr) const; Q_REQUIRED_RESULT QTransform adjoint() const; Q_REQUIRED_RESULT QTransform transposed() const; @@ -173,7 +173,7 @@ private: , m_13(h13), m_23(h23), m_33(h33) , m_type(TxNone) , m_dirty(TxProject) - , d(Q_NULLPTR) + , d(nullptr) { } inline QTransform(bool) @@ -181,7 +181,7 @@ private: , m_13(0), m_23(0), m_33(1) , m_type(TxNone) , m_dirty(TxNone) - , d(Q_NULLPTR) + , d(nullptr) { } inline TransformationType inline_type() const; |