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

📄 qdrawhelper.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
static void QT_FASTCALL comp_func_SourceIn(uint *dest, const uint *src, int length, uint const_alpha){    if (const_alpha == 255) {        for (int i = 0; i < length; ++i)            dest[i] = BYTE_MUL(src[i], qAlpha(dest[i]));    } else {        uint cia = 255 - const_alpha;        for (int i = 0; i < length; ++i) {            uint d = dest[i];            uint s = BYTE_MUL(src[i], const_alpha);            dest[i] = INTERPOLATE_PIXEL_255(s, qAlpha(d), d, cia);        }    }}/*  result = d * sa  dest = d * sa * ca + d * cia       = d * (sa * ca + cia)*/static void QT_FASTCALL comp_func_solid_DestinationIn(uint *dest, int length, uint color, uint const_alpha){    uint a = qAlpha(color);    if (const_alpha != 255) {        a = BYTE_MUL(a, const_alpha) + 255 - const_alpha;    }    for (int i = 0; i < length; ++i) {        dest[i] = BYTE_MUL(dest[i], a);    }}static void QT_FASTCALL comp_func_DestinationIn(uint *dest, const uint *src, int length, uint const_alpha){    if (const_alpha == 255) {        for (int i = 0; i < length; ++i)            dest[i] = BYTE_MUL(dest[i], qAlpha(src[i]));    } else {        int cia = 255 - const_alpha;        for (int i = 0; i < length; ++i) {            uint a = BYTE_MUL(qAlpha(src[i]), const_alpha) + cia;            dest[i] = BYTE_MUL(dest[i], a);        }    }}/*  result = s * dia  dest = s * dia * ca + d * cia*/static void QT_FASTCALL comp_func_solid_SourceOut(uint *dest, int length, uint color, uint const_alpha){    if (const_alpha == 255) {        for (int i = 0; i < length; ++i)            dest[i] = BYTE_MUL(color, qAlpha(~dest[i]));    } else {        color = BYTE_MUL(color, const_alpha);        int cia = 255 - const_alpha;        for (int i = 0; i < length; ++i) {            uint d = dest[i];            dest[i] = INTERPOLATE_PIXEL_255(color, qAlpha(~d), d, cia);        }    }}static void QT_FASTCALL comp_func_SourceOut(uint *dest, const uint *src, int length, uint const_alpha){    if (const_alpha == 255) {        for (int i = 0; i < length; ++i)            dest[i] = BYTE_MUL(src[i], qAlpha(~dest[i]));    } else {        int cia = 255 - const_alpha;        for (int i = 0; i < length; ++i) {            uint s = BYTE_MUL(src[i], const_alpha);            uint d = dest[i];            dest[i] = INTERPOLATE_PIXEL_255(s, qAlpha(~d), d, cia);        }    }}/*  result = d * sia  dest = d * sia * ca + d * cia       = d * (sia * ca + cia)*/static void QT_FASTCALL comp_func_solid_DestinationOut(uint *dest, int length, uint color, uint const_alpha){    uint a = qAlpha(~color);    if (const_alpha != 255)        a = BYTE_MUL(a, const_alpha) + 255 - const_alpha;    for (int i = 0; i < length; ++i)        dest[i] = BYTE_MUL(dest[i], a);}static void QT_FASTCALL comp_func_DestinationOut(uint *dest, const uint *src, int length, uint const_alpha){    if (const_alpha == 255) {        for (int i = 0; i < length; ++i)            dest[i] = BYTE_MUL(dest[i], qAlpha(~src[i]));    } else {        int cia = 255 - const_alpha;        for (int i = 0; i < length; ++i) {            uint sia = BYTE_MUL(qAlpha(~src[i]), const_alpha) + cia;            dest[i] = BYTE_MUL(dest[i], sia);        }    }}/*  result = s*da + d*sia  dest = s*da*ca + d*sia*ca + d *cia       = s*ca * da + d * (sia*ca + cia)       = s*ca * da + d * (1 - sa*ca)*/static void QT_FASTCALL comp_func_solid_SourceAtop(uint *dest, int length, uint color, uint const_alpha){    if (const_alpha != 255) {        color = BYTE_MUL(color, const_alpha);    }    uint sia = qAlpha(~color);    for (int i = 0; i < length; ++i)        dest[i] = INTERPOLATE_PIXEL_255(color, qAlpha(dest[i]), dest[i], sia);}static void QT_FASTCALL comp_func_SourceAtop(uint *dest, const uint *src, int length, uint const_alpha){    if (const_alpha == 255) {        for (int i = 0; i < length; ++i) {            uint s = src[i];            uint d = dest[i];            dest[i] = INTERPOLATE_PIXEL_255(s, qAlpha(d), d, qAlpha(~s));        }    } else {        for (int i = 0; i < length; ++i) {            uint s = BYTE_MUL(src[i], const_alpha);            uint d = dest[i];            dest[i] = INTERPOLATE_PIXEL_255(s, qAlpha(d), d, qAlpha(~s));        }    }}/*  result = d*sa + s*dia  dest = d*sa*ca + s*dia*ca + d *cia       = s*ca * dia + d * (sa*ca + cia)*/static void QT_FASTCALL comp_func_solid_DestinationAtop(uint *dest, int length, uint color, uint const_alpha){    uint a = qAlpha(color);    if (const_alpha != 255) {        color = BYTE_MUL(color, const_alpha);        a = qAlpha(color) + 255 - const_alpha;    }    for (int i = 0; i < length; ++i) {        uint d = dest[i];        dest[i] = INTERPOLATE_PIXEL_255(d, a, color, qAlpha(~d));    }}static void QT_FASTCALL comp_func_DestinationAtop(uint *dest, const uint *src, int length, uint const_alpha){    if (const_alpha == 255) {        for (int i = 0; i < length; ++i) {            uint s = src[i];            uint d = dest[i];            dest[i] = INTERPOLATE_PIXEL_255(d, qAlpha(s), s, qAlpha(~d));        }    } else {        int cia = 255 - const_alpha;        for (int i = 0; i < length; ++i) {            uint s = BYTE_MUL(src[i], const_alpha);            uint d = dest[i];            uint a = qAlpha(s) + cia;            dest[i] = INTERPOLATE_PIXEL_255(d, a, s, qAlpha(~d));        }    }}/*  result = d*sia + s*dia  dest = d*sia*ca + s*dia*ca + d *cia       = s*ca * dia + d * (sia*ca + cia)       = s*ca * dia + d * (1 - sa*ca)*/static void QT_FASTCALL comp_func_solid_XOR(uint *dest, int length, uint color, uint const_alpha){    if (const_alpha != 255)        color = BYTE_MUL(color, const_alpha);    uint sia = qAlpha(~color);    for (int i = 0; i < length; ++i) {        uint d = dest[i];        dest[i] = INTERPOLATE_PIXEL_255(color, qAlpha(~d), d, sia);    }}static void QT_FASTCALL comp_func_XOR(uint *dest, const uint *src, int length, uint const_alpha){    if (const_alpha == 255) {        for (int i = 0; i < length; ++i) {            uint d = dest[i];            uint s = src[i];            dest[i] = INTERPOLATE_PIXEL_255(s, qAlpha(~d), d, qAlpha(~s));        }    } else {        for (int i = 0; i < length; ++i) {            uint d = dest[i];            uint s = BYTE_MUL(src[i], const_alpha);            dest[i] = INTERPOLATE_PIXEL_255(s, qAlpha(~d), d, qAlpha(~s));        }    }}static const uint AMASK = 0xff000000;static const uint RMASK = 0x00ff0000;static const uint GMASK = 0x0000ff00;static const uint BMASK = 0x000000ff;struct FullCoverage {    inline void store(uint *dest, const uint src) const    {        *dest = src;    }};struct PartialCoverage {    inline PartialCoverage(uint const_alpha)        : ca(const_alpha)        , ica(255 - const_alpha)    {    }    inline void store(uint *dest, const uint src) const    {        *dest = INTERPOLATE_PIXEL_255(src, ca, *dest, ica);    }private:    const uint ca;    const uint ica;};static inline int mix_alpha(int da, int sa){    return 255 - ((255 - sa) * (255 - da) >> 8);}/*    Dca' = Sca.Da + Dca.Sa + Sca.(1 - Da) + Dca.(1 - Sa)         = Sca + Dca*/template <typename T>static inline void comp_func_solid_Plus_impl(uint *dest, int length, uint color, const T &coverage){    uint s = color;    for (int i = 0; i < length; ++i) {        uint d = dest[i];#define MIX(mask) (qMin(((qint64(s)&mask) + (qint64(d)&mask)), qint64(mask)))        d = (MIX(AMASK) | MIX(RMASK) | MIX(GMASK) | MIX(BMASK));#undef MIX        coverage.store(&dest[i], d);    }}void QT_FASTCALL comp_func_solid_Plus(uint *dest, int length, uint color, uint const_alpha){    if (const_alpha == 255)        comp_func_solid_Plus_impl(dest, length, color, FullCoverage());    else        comp_func_solid_Plus_impl(dest, length, color, PartialCoverage(const_alpha));}template <typename T>static inline void comp_func_Plus_impl(uint *dest, const uint *src, int length, const T &coverage){    for (int i = 0; i < length; ++i) {        uint d = dest[i];        uint s = src[i];#define MIX(mask) (qMin(((qint64(s)&mask) + (qint64(d)&mask)), qint64(mask)))        d = (MIX(AMASK) | MIX(RMASK) | MIX(GMASK) | MIX(BMASK));#undef MIX        coverage.store(&dest[i], d);    }}void QT_FASTCALL comp_func_Plus(uint *dest, const uint *src, int length, uint const_alpha){    if (const_alpha == 255)        comp_func_Plus_impl(dest, src, length, FullCoverage());    else        comp_func_Plus_impl(dest, src, length, PartialCoverage(const_alpha));}/*    Dca' = Sca.Dca + Sca.(1 - Da) + Dca.(1 - Sa)*/static inline int multiply_op(int dst, int src, int da, int sa){    return (src * dst + src * (255 - da) + dst * (255 - sa)) >> 8;}template <typename T>static inline void comp_func_solid_Multiply_impl(uint *dest, int length, uint color, const T &coverage){    int sa = qAlpha(color);    int sr = qRed(color);    int sg = qGreen(color);    int sb = qBlue(color);    for (int i = 0; i < length; ++i) {        uint d = dest[i];        int da = qAlpha(d);#define OP(a, b) multiply_op(a, b, da, sa)        int r = OP(  qRed(d), sr);        int b = OP( qBlue(d), sb);        int g = OP(qGreen(d), sg);        int a = mix_alpha(da, sa);#undef OP        coverage.store(&dest[i], qRgba(r, g, b, a));    }}void QT_FASTCALL comp_func_solid_Multiply(uint *dest, int length, uint color, uint const_alpha){    if (const_alpha == 255)        comp_func_solid_Multiply_impl(dest, length, color, FullCoverage());    else        comp_func_solid_Multiply_impl(dest, length, color, PartialCoverage(const_alpha));}template <typename T>static inline void comp_func_Multiply_impl(uint *dest, const uint *src, int length, const T &coverage){    for (int i = 0; i < length; ++i) {        uint d = dest[i];        uint s = src[i];        int da = qAlpha(d);        int sa = qAlpha(s);#define OP(a, b) multiply_op(a, b, da, sa)        int r = OP(  qRed(d),   qRed(s));        int b = OP( qBlue(d),  qBlue(s));        int g = OP(qGreen(d), qGreen(s));        int a = mix_alpha(da, sa);#undef OP        coverage.store(&dest[i], qRgba(r, g, b, a));    }}void QT_FASTCALL comp_func_Multiply(uint *dest, const uint *src, int length, uint const_alpha){    if (const_alpha == 255)        comp_func_Multiply_impl(dest, src, length, FullCoverage());    else        comp_func_Multiply_impl(dest, src, length, PartialCoverage(const_alpha));}/*    Dca' = (Sca.Da + Dca.Sa - Sca.Dca) + Sca.(1 - Da) + Dca.(1 - Sa)         = Sca + Dca - Sca.Dca*/template <typename T>static inline void comp_func_solid_Screen_impl(uint *dest, int length, uint color, const T &coverage){    int sa = qAlpha(color);    int sr = qRed(color);    int sg = qGreen(color);    int sb = qBlue(color);    for (int i = 0; i < length; ++i) {        uint d = dest[i];        int da = qAlpha(d);#define OP(a, b) 255 - (((255-a) * (255-b)) >> 8)        int r = OP(  qRed(d), sr);        int b = OP( qBlue(d), sb);        int g = OP(qGreen(d), sg);        int a = mix_alpha(da, sa);#undef OP        coverage.store(&dest[i], qRgba(r, g, b, a));    }}void QT_FASTCALL comp_func_solid_Screen(uint *dest, int length, uint color, uint const_alpha){    if (const_alpha == 255)        comp_func_solid_Screen_impl(dest, length, color, FullCoverage());    else        comp_func_solid_Screen_impl(dest, length, color, PartialCoverage(const_alpha));}template <typename T>static inline void comp_func_Screen_impl(uint *dest, const uint *src, int length, const T &coverage){    for (int i = 0; i < length; ++i) {        uint d = dest[i];        uint s = src[i];        int da = qAlpha(d);        int sa = qAlpha(s);#define OP(a, b) 255 - (((255-a) * (255-b)) >> 8)        int r = OP(  qRed(d),   qRed(s));        int b = OP( qBlue(d),  qBlue(s));        int g = OP(qGreen(d), qGreen(s));        int a = mix_alpha(da, sa);#undef OP        coverage.store(&dest[i], qRgba(r, g, b, a));    }}void QT_FASTCALL comp_func_Screen(uint *dest, const uint *src, int length, uint const_alpha){    if (const_alpha == 255)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -