📄 qdrawhelper.cpp
字号:
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 + -