📄 qdrawhelper.cpp
字号:
uint buffer[buffer_size]; Operator op = getOperator(data); if (!op.funcSolid) return; while (count--) { int x = spans->x; int length = spans->len; while (length) { int l = qMin(buffer_size, length); uint *dest = op.dest_fetch ? op.dest_fetch(buffer, data->rasterBuffer, x, spans->y, l) : buffer; op.funcSolid(dest, l, data->solid.color, spans->coverage); if (op.dest_store) op.dest_store(data->rasterBuffer, x, spans->y, dest, l); length -= l; x += l; } ++spans; }}static void blend_color_argb(int count, const QSpan *spans, void *userData){ QSpanData *data = reinterpret_cast<QSpanData *>(userData); Operator op = getOperator(data); if (!op.funcSolid) return; if (op.mode == QPainter::CompositionMode_Source) { // inline for performance while (count--) { uint *target = ((uint *)data->rasterBuffer->scanLine(spans->y)) + spans->x; if (spans->coverage == 255) { QT_MEMFILL_UINT(target, spans->len, data->solid.color); } else { uint c = BYTE_MUL(data->solid.color, spans->coverage); int ialpha = 255 - spans->coverage; for (int i = 0; i < spans->len; ++i) target[i] = c + BYTE_MUL(target[i], ialpha); } ++spans; } return; } while (count--) { uint *target = ((uint *)data->rasterBuffer->scanLine(spans->y)) + spans->x; op.funcSolid(target, spans->len, data->solid.color, spans->coverage); ++spans; }}#ifdef Q_WS_QWSstatic inline uint BYTE_MUL_RGB16(uint x, uint a) { a += 1; uint t = (((x & 0x07e0)*a) >> 8) & 0x07e0; t |= (((x & 0xf81f)*(a>>2)) >> 6) & 0xf81f; return t;}static void blend_color_rgb16(int count, const QSpan *spans, void *userData){ QSpanData *data = reinterpret_cast<QSpanData *>(userData); Operator op = getOperator(data); if (!op.funcSolid) return; if (op.mode == QPainter::CompositionMode_Source) { // inline for performance ushort c = qConvertRgb32To16(data->solid.color); while (count--) { ushort *target = ((ushort *)data->rasterBuffer->scanLine(spans->y)) + spans->x; if (spans->coverage == 255) { QT_MEMFILL_USHORT(target, spans->len, c); } 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; } } ++spans; } return; } Q_ASSERT(op.mode == QPainter::CompositionMode_SourceOver); while (count--) { uint color = BYTE_MUL(data->solid.color, spans->coverage); int ialpha = qAlpha(~color); ushort c = qConvertRgb32To16(color); ushort *target = ((ushort *)data->rasterBuffer->scanLine(spans->y)) + spans->x; const ushort *end = target + spans->len; while (target < end) { *target = c + BYTE_MUL_RGB16(*target, ialpha); ++target; } ++spans; }}#endifstatic void blend_src_generic(int count, const QSpan *spans, void *userData){ QSpanData *data = reinterpret_cast<QSpanData *>(userData); uint buffer[buffer_size]; uint src_buffer[buffer_size]; Operator op = getOperator(data); if (!op.func) return; while (count--) { int x = spans->x; int length = spans->len; while (length) { int l = qMin(buffer_size, length); uint *dest = op.dest_fetch ? op.dest_fetch(buffer, data->rasterBuffer, x, spans->y, l) : buffer; const uint *src = op.src_fetch(src_buffer, &op, data, spans->y, x, l); op.func(dest, src, l, spans->coverage); if (op.dest_store) op.dest_store(data->rasterBuffer, x, spans->y, dest, l); x += l; length -= l; } ++spans; }}static void blend_src_argb(int count, const QSpan *spans, void *userData){ QSpanData *data = reinterpret_cast<QSpanData *>(userData); uint src_buffer[buffer_size]; Operator op = getOperator(data); if (!op.func) return; while (count--) { uint *target = ((uint *)data->rasterBuffer->scanLine(spans->y)); int x = spans->x; int length = spans->len; while (length) { int l = qMin(length, buffer_size); const uint *src = op.src_fetch(src_buffer, &op, data, spans->y, x, l); op.func(target + x, src, l, spans->coverage); x += l; length -= l; } ++spans; }}static void blend_untransformed_generic(int count, const QSpan *spans, void *userData){ QSpanData *data = reinterpret_cast<QSpanData *>(userData); uint buffer[buffer_size]; uint src_buffer[buffer_size]; Operator op = getOperator(data); if (!op.func) return; const int image_width = data->texture.width; const int image_height = data->texture.height; int xoff = qRound(data->dx); int yoff = qRound(data->dy); while (count--) { int x = spans->x; int length = spans->len; int sx = xoff + x; int sy = yoff + spans->y; if (sy >= 0 && sy < image_height && sx < image_width) { if (sx < 0) { x -= sx; length += sx; sx = 0; } if (sx + length > image_width) length = image_width - sx; if (length > 0) { while (length) { int l = qMin(buffer_size, length); uint *dest = op.dest_fetch ? op.dest_fetch(buffer, data->rasterBuffer, x, spans->y, l) : buffer; const uint *src = op.src_fetch(src_buffer, &op, data, sy, sx, l); op.func(dest, src, l, spans->coverage); if (op.dest_store) op.dest_store(data->rasterBuffer, x, spans->y, dest, l); x += l; length -= l; } } } ++spans; }}static void blend_untransformed_argb(int count, const QSpan *spans, void *userData){ QSpanData *data = reinterpret_cast<QSpanData *>(userData); if (data->texture.format != QImage::Format_ARGB32_Premultiplied && data->texture.format != QImage::Format_RGB32) { blend_untransformed_generic(count, spans, userData); return; } Operator op = getOperator(data); if (!op.func) return; const int image_width = data->texture.width; const int image_height = data->texture.height; int xoff = qRound(data->dx); int yoff = qRound(data->dy); while (count--) { int x = spans->x; int length = spans->len; int sx = xoff + x; int sy = yoff + spans->y; if (sy >= 0 && sy < image_height && sx < image_width) { if (sx < 0) { x -= sx; length += sx; sx = 0; } if (sx + length > image_width) length = image_width - sx; if (length > 0) { uint *dest = ((uint *)data->rasterBuffer->scanLine(spans->y)) + x; const uint *src = (uint *)data->texture.scanLine(sy) + sx; op.func(dest, src, length, spans->coverage); } } ++spans; }}#ifdef Q_WS_QWSstatic void blend_untransformed_rgb16(int count, const QSpan *spans, void *userData){ QSpanData *data = reinterpret_cast<QSpanData *>(userData); if (data->texture.format != QImage::Format_RGB16 && data->texture.format != QImage::Format_ARGB32_Premultiplied) { blend_untransformed_generic(count, spans, userData); return; } Operator op = getOperator(data); if (!op.func) return; const int image_width = data->texture.width; const int image_height = data->texture.height; int xoff = qRound(data->dx); int yoff = qRound(data->dy); if (data->texture.format == QImage::Format_ARGB32_Premultiplied) { while (count--) { int x = spans->x; int length = spans->len; int sx = xoff + x; int sy = yoff + spans->y; if (sy >= 0 && sy < image_height && sx < image_width) { if (sx < 0) { x -= sx; length += sx; sx = 0; } if (sx + length > image_width) length = image_width - sx; if (length > 0) { ushort *dest = ((ushort *)data->rasterBuffer->scanLine(spans->y)) + x; const uint *src = (uint *)data->texture.scanLine(sy) + sx; if (spans->coverage == 255) { for (int i = 0; i < length; ++i) { uint s = src[i]; int alpha = qAlpha(s); s = qConvertRgb32To16(s); if (alpha != 255) s += BYTE_MUL_RGB16(dest[i], 255 - alpha); dest[i] = s; } } else { for (int i = 0; i < length; ++i) { uint s = src[i]; MASK(s, spans->coverage); int alpha = qAlpha(s); s = qConvertRgb32To16(s); if (alpha != 255) s += BYTE_MUL_RGB16(dest[i], 255 - alpha); dest[i] = qConvertRgb32To16(s); } } } } ++spans; } return; } // texture is RGB16 while (count--) { int x = spans->x; int length = spans->len; int sx = xoff + x; int sy = yoff + spans->y; if (sy >= 0 && sy < image_height && sx < image_width) { if (sx < 0) { x -= sx; length += sx; sx = 0; } if (sx + length > image_width) length = image_width - sx; if (length > 0) { ushort *dest = ((ushort *)data->rasterBuffer->scanLine(spans->y)) + x; const ushort *src = (ushort *)data->texture.scanLine(sy) + sx; if (spans->coverage == 255) { memcpy(dest, src, length*sizeof(quint16)); } else { int ialpha = 255 - spans->coverage; for (int i = 0; i < length; ++i) dest[i] = qConvertRgb32To16(INTERPOLATE_PIXEL_255(qConvertRgb16To32(src[i]), spans->coverage, qConvertRgb16To32(dest[i]), ialpha)); } } } ++spans; }}#endifstatic void blend_tiled_generic(int count, const QSpan *spans, void *userData){ QSpanData *data = reinterpret_cast<QSpanData *>(userData); uint buffer[buffer_size]; uint src_buffer[buffer_size]; Operator op = getOperator(data); if (!op.func) return; const int image_width = data->texture.width; const int image_height = data->texture.height; int xoff = qRound(data->dx) % image_width; int yoff = qRound(data->dy) % image_height; if (xoff < 0) xoff += image_width; if (yoff < 0) yoff += image_height; while (count--) { int x = spans->x; int length = spans->len; int sx = (xoff + spans->x) % image_width; int sy = (spans->y + yoff) % image_height; if (sx < 0) sx += image_width; if (sy < 0) sy += image_height; while (length) { int l = qMin(image_width - sx, length); if (buffer_size < l) l = buffer_size; uint *dest = op.dest_fetch ? op.dest_fetch(buffer, data->rasterBuffer, x, spans->y, l) : buffer; const uint *src = op.src_fetch(src_buffer, &op, data, sy, sx, l); op.func(dest, src, l, spans->coverage); if (op.dest_store) op.dest_store(data->rasterBuffer, x, spans->y, dest, l); x += l; length -= l; sx = 0; } ++spans; }}static void blend_tiled_argb(int count, const QSpan *spans, void *userData){ QSpanData *data = reinterpret_cast<QSpanData *>(userData); if (data->texture.format != QImage::Format_ARGB32_Premultiplied && data->texture.format != QImage::Format_RGB32) { blend_tiled_generic(count, spans, userData); return; } Operator op = getOperator(data);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -