⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qdrawhelper.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    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 + -