Merge the qt_memfill{,_template} functions

We had two copies of the Duff's Device implementation, one in the .cpp
and one in the header. One of the two implementations had a protection
against zero counts, the other didn't. So move the .cpp implementation
to the header and use it in the functions that were declared there.

Fixes: QTBUG-16104
Patch-By: Allan Sandfeld Jensen <allan.jensen@qt.io>
Change-Id: Iba4b5c183776497d8ee1fffd156456cc3502946e
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
bb10
Thiago Macieira 2018-11-05 13:12:16 -08:00
parent 58437fb125
commit 185f9e0758
2 changed files with 28 additions and 62 deletions

View File

@ -6244,36 +6244,13 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
},
};
#if defined(Q_CC_MSVC) && !defined(_MIPS_)
template <class T>
inline void qt_memfill_template(T *dest, T color, int count)
void qt_memfill64(quint64 *dest, quint64 color, int count)
{
while (count--)
*dest++ = color;
qt_memfill_template<quint64>(dest, color, count);
}
#else
template <class T>
inline void qt_memfill_template(T *dest, T color, int count)
{
int n = (count + 7) / 8;
switch (count & 0x07)
{
case 0: do { *dest++ = color; Q_FALLTHROUGH();
case 7: *dest++ = color; Q_FALLTHROUGH();
case 6: *dest++ = color; Q_FALLTHROUGH();
case 5: *dest++ = color; Q_FALLTHROUGH();
case 4: *dest++ = color; Q_FALLTHROUGH();
case 3: *dest++ = color; Q_FALLTHROUGH();
case 2: *dest++ = color; Q_FALLTHROUGH();
case 1: *dest++ = color;
} while (--n > 0);
}
}
template <>
inline void qt_memfill_template(quint16 *dest, quint16 value, int count)
#if !defined(__SSE2__)
void qt_memfill16(quint16 *dest, quint16 value, int count)
{
if (count < 3) {
switch (count) {
@ -6294,18 +6271,6 @@ inline void qt_memfill_template(quint16 *dest, quint16 value, int count)
dest[count - 1] = value;
}
#endif
void qt_memfill64(quint64 *dest, quint64 color, int count)
{
qt_memfill_template<quint64>(dest, color, count);
}
#if !defined(__SSE2__)
void qt_memfill16(quint16 *dest, quint16 color, int count)
{
qt_memfill_template<quint16>(dest, color, count);
}
#endif
#if !defined(__SSE2__) && !defined(__ARM_NEON__) && !defined(__MIPS_DSP__)
void qt_memfill32(quint32 *dest, quint32 color, int count)
{

View File

@ -884,8 +884,30 @@ inline quint24::operator uint() const
return data[2] | (data[1] << 8) | (data[0] << 16);
}
template <class T> static
void qt_memfill(T *dest, T value, int count);
template <class T> inline void qt_memfill_template(T *dest, T color, int count)
{
if (!count)
return;
qsizetype n = (count + 7) / 8;
switch (count & 0x07)
{
case 0: do { *dest++ = color; Q_FALLTHROUGH();
case 7: *dest++ = color; Q_FALLTHROUGH();
case 6: *dest++ = color; Q_FALLTHROUGH();
case 5: *dest++ = color; Q_FALLTHROUGH();
case 4: *dest++ = color; Q_FALLTHROUGH();
case 3: *dest++ = color; Q_FALLTHROUGH();
case 2: *dest++ = color; Q_FALLTHROUGH();
case 1: *dest++ = color;
} while (--n > 0);
}
}
template <class T> inline void qt_memfill(T *dest, T value, int count)
{
qt_memfill_template(dest, value, count);
}
template<> inline void qt_memfill(quint64 *dest, quint64 color, int count)
{
@ -907,27 +929,6 @@ template<> inline void qt_memfill(quint8 *dest, quint8 color, int count)
memset(dest, color, count);
}
template <class T>
inline void qt_memfill(T *dest, T value, int count)
{
if (!count)
return;
int n = (count + 7) / 8;
switch (count & 0x07)
{
case 0: do { *dest++ = value; Q_FALLTHROUGH();
case 7: *dest++ = value; Q_FALLTHROUGH();
case 6: *dest++ = value; Q_FALLTHROUGH();
case 5: *dest++ = value; Q_FALLTHROUGH();
case 4: *dest++ = value; Q_FALLTHROUGH();
case 3: *dest++ = value; Q_FALLTHROUGH();
case 2: *dest++ = value; Q_FALLTHROUGH();
case 1: *dest++ = value;
} while (--n > 0);
}
}
template <class T> static
inline void qt_rectfill(T *dest, T value,
int x, int y, int width, int height, qsizetype stride)