Get rid of blend_color_rgb16
The generic functions are better optimized anyway, and it this old method appears to have old bugs. Fixes: QTBUG-20681 Change-Id: I60e4cc5f6cd90c851e90106ac9badfc6c249cd9f Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
This commit is contained in:
parent
c23e8cb582
commit
2cf2f99ab1
@ -2975,83 +2975,6 @@ void blend_color_generic_rgb64(int count, const QSpan *spans, void *userData)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void blend_color_rgb16(int count, const QSpan *spans, void *userData)
|
|
||||||
{
|
|
||||||
QSpanData *data = reinterpret_cast<QSpanData *>(userData);
|
|
||||||
|
|
||||||
/*
|
|
||||||
We duplicate a little logic from getOperator() and calculate the
|
|
||||||
composition mode directly. This allows blend_color_rgb16 to be used
|
|
||||||
from qt_gradient_quint16 with minimal overhead.
|
|
||||||
*/
|
|
||||||
QPainter::CompositionMode mode = data->rasterBuffer->compositionMode;
|
|
||||||
if (mode == QPainter::CompositionMode_SourceOver && data->solidColor.isOpaque())
|
|
||||||
mode = QPainter::CompositionMode_Source;
|
|
||||||
|
|
||||||
if (mode == QPainter::CompositionMode_Source) {
|
|
||||||
// inline for performance
|
|
||||||
ushort c = data->solidColor.toRgb16();
|
|
||||||
for (; count--; spans++) {
|
|
||||||
if (!spans->len)
|
|
||||||
continue;
|
|
||||||
ushort *target = ((ushort *)data->rasterBuffer->scanLine(spans->y)) + spans->x;
|
|
||||||
if (spans->coverage == 255) {
|
|
||||||
qt_memfill(target, c, spans->len);
|
|
||||||
} else {
|
|
||||||
ushort color = BYTE_MUL_RGB16(c, spans->coverage);
|
|
||||||
int ialpha = 255 - spans->coverage;
|
|
||||||
const ushort *end = target + spans->len;
|
|
||||||
while (target < end) {
|
|
||||||
*target = color + BYTE_MUL_RGB16(*target, ialpha);
|
|
||||||
++target;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mode == QPainter::CompositionMode_SourceOver) {
|
|
||||||
for (; count--; spans++) {
|
|
||||||
if (!spans->len)
|
|
||||||
continue;
|
|
||||||
uint color = BYTE_MUL(data->solidColor.toArgb32(), spans->coverage);
|
|
||||||
int ialpha = qAlpha(~color);
|
|
||||||
ushort c = qConvertRgb32To16(color);
|
|
||||||
ushort *target = ((ushort *)data->rasterBuffer->scanLine(spans->y)) + spans->x;
|
|
||||||
int len = spans->len;
|
|
||||||
bool pre = (((quintptr)target) & 0x3) != 0;
|
|
||||||
bool post = false;
|
|
||||||
if (pre) {
|
|
||||||
// skip to word boundary
|
|
||||||
*target = c + BYTE_MUL_RGB16(*target, ialpha);
|
|
||||||
++target;
|
|
||||||
--len;
|
|
||||||
}
|
|
||||||
if (len & 0x1) {
|
|
||||||
post = true;
|
|
||||||
--len;
|
|
||||||
}
|
|
||||||
uint *target32 = (uint*)target;
|
|
||||||
uint c32 = c | (c<<16);
|
|
||||||
len >>= 1;
|
|
||||||
uint salpha = (ialpha+1) >> 3; // calculate here rather than in loop
|
|
||||||
while (len--) {
|
|
||||||
// blend full words
|
|
||||||
*target32 = c32 + BYTE_MUL_RGB16_32(*target32, salpha);
|
|
||||||
++target32;
|
|
||||||
target += 2;
|
|
||||||
}
|
|
||||||
if (post) {
|
|
||||||
// one last pixel beyond a full word
|
|
||||||
*target = c + BYTE_MUL_RGB16(*target, ialpha);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
blend_color_generic(count, spans, userData);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void handleSpans(int count, const QSpan *spans, const QSpanData *data, T &handler)
|
void handleSpans(int count, const QSpan *spans, const QSpanData *data, T &handler)
|
||||||
{
|
{
|
||||||
@ -3909,10 +3832,6 @@ void qBlendGradient(int count, const QSpan *spans, void *userData)
|
|||||||
data->type == QSpanData::LinearGradient &&
|
data->type == QSpanData::LinearGradient &&
|
||||||
data->gradient.linear.end.x == data->gradient.linear.origin.x;
|
data->gradient.linear.end.x == data->gradient.linear.origin.x;
|
||||||
switch (data->rasterBuffer->format) {
|
switch (data->rasterBuffer->format) {
|
||||||
case QImage::Format_RGB16:
|
|
||||||
if (isVerticalGradient)
|
|
||||||
return blend_vertical_gradient<blend_color_rgb16>(count, spans, userData);
|
|
||||||
return blend_src_generic(count, spans, userData);
|
|
||||||
case QImage::Format_RGB32:
|
case QImage::Format_RGB32:
|
||||||
case QImage::Format_ARGB32_Premultiplied:
|
case QImage::Format_ARGB32_Premultiplied:
|
||||||
if (isVerticalGradient)
|
if (isVerticalGradient)
|
||||||
@ -4842,7 +4761,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
|
|||||||
},
|
},
|
||||||
// Format_RGB16
|
// Format_RGB16
|
||||||
{
|
{
|
||||||
blend_color_rgb16,
|
blend_color_generic,
|
||||||
qt_bitmapblit_quint16,
|
qt_bitmapblit_quint16,
|
||||||
qt_alphamapblit_quint16,
|
qt_alphamapblit_quint16,
|
||||||
qt_alphargbblit_generic,
|
qt_alphargbblit_generic,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user