diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-11-14 14:17:38 +0100 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2018-12-12 03:44:11 +0000 |
commit | 33177b0456f50a1f3eae7a37b4ecc897aaf7125e (patch) | |
tree | 07d059e3a9ed411c4b6e5a3db5909cc9dee64cb9 /src/gui/painting/qdrawhelper.cpp | |
parent | db0616097f8a1658a6acf5798ead495999b24b87 (diff) |
Add a qt_memfill24 implementation
This function gets called from qt_rectfill_quint24, which is used by the
RGB666, ARGB6666_Premultiplied, ARGB8555_Premultiplied, and RGB888
formats.
Together-with: Thiago Macieira <thiago.macieira@intel.com>
Change-Id: Iba4b5c183776497d8ee1fffd1564585fdee835c2
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/gui/painting/qdrawhelper.cpp')
-rw-r--r-- | src/gui/painting/qdrawhelper.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 59b46b84ef..95d14a4500 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -55,6 +55,7 @@ #endif #include <private/qguiapplication_p.h> #include <private/qrgba64_p.h> +#include <qendian.h> #include <qloggingcategory.h> #include <qmath.h> @@ -6267,6 +6268,42 @@ void qt_memfill64(quint64 *dest, quint64 color, qsizetype count) } #endif +void qt_memfill24(quint24 *dest, quint24 color, qsizetype count) +{ + const quint32 v = color; + quint24 *end = dest + count; + + // prolog: align dest to 32bit + while ((quintptr(dest) & 0x3) && dest < end) { + *dest++ = v; + } + if (dest >= end) + return; + + const uint val1 = qFromBigEndian((v << 8) | (v >> 16)); + const uint val2 = qFromBigEndian((v << 16) | (v >> 8)); + const uint val3 = qFromBigEndian((v << 24) | (v >> 0)); + + for ( ; dest <= (end - 4); dest += 4) { + quint32 *dst = reinterpret_cast<quint32 *>(dest); + dst[0] = val1; + dst[1] = val2; + dst[2] = val3; + } + + // less than 4px left + switch (end - dest) { + case 3: + *dest++ = v; + Q_FALLTHROUGH(); + case 2: + *dest++ = v; + Q_FALLTHROUGH(); + case 1: + *dest++ = v; + } +} + void qt_memfill16(quint16 *dest, quint16 value, qsizetype count) { const int align = quintptr(dest) & 0x3; |