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
parent
58437fb125
commit
185f9e0758
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue