📄 qdrawhelper.cpp
字号:
comp_func_Screen_impl(dest, src, length, FullCoverage()); else comp_func_Screen_impl(dest, src, length, PartialCoverage(const_alpha));}/* if 2.Dca < Da Dca' = 2.Sca.Dca + Sca.(1 - Da) + Dca.(1 - Sa) otherwise Dca' = Sa.Da - 2.(Da - Dca).(Sa - Sca) + Sca.(1 - Da) + Dca.(1 - Sa)*/static inline int overlay_op(int dst, int src, int da, int sa){ const int temp = src * (255 - da) + dst * (255 - sa); if (2 * dst < da) return (2 * src * dst + temp) >> 8; else return (sa * da - 2 * (da - dst) * (sa - src) + temp) >> 8;}template <typename T>static inline void comp_func_solid_Overlay_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) overlay_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_Overlay(uint *dest, int length, uint color, uint const_alpha){ if (const_alpha == 255) comp_func_solid_Overlay_impl(dest, length, color, FullCoverage()); else comp_func_solid_Overlay_impl(dest, length, color, PartialCoverage(const_alpha));}template <typename T>static inline void comp_func_Overlay_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) overlay_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_Overlay(uint *dest, const uint *src, int length, uint const_alpha){ if (const_alpha == 255) comp_func_Overlay_impl(dest, src, length, FullCoverage()); else comp_func_Overlay_impl(dest, src, length, PartialCoverage(const_alpha));}/* Dca' = min(Sca.Da, Dca.Sa) + Sca.(1 - Da) + Dca.(1 - Sa) Da' = Sa + Da - Sa.Da*/static inline int darken_op(int dst, int src, int da, int sa){ return (qMin(src * da, dst * sa) + src * (255 - da) + dst * (255 - sa)) >> 8;}template <typename T>static inline void comp_func_solid_Darken_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) darken_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_Darken(uint *dest, int length, uint color, uint const_alpha){ if (const_alpha == 255) comp_func_solid_Darken_impl(dest, length, color, FullCoverage()); else comp_func_solid_Darken_impl(dest, length, color, PartialCoverage(const_alpha));}template <typename T>static inline void comp_func_Darken_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) darken_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_Darken(uint *dest, const uint *src, int length, uint const_alpha){ if (const_alpha == 255) comp_func_Darken_impl(dest, src, length, FullCoverage()); else comp_func_Darken_impl(dest, src, length, PartialCoverage(const_alpha));}/* Dca' = max(Sca.Da, Dca.Sa) + Sca.(1 - Da) + Dca.(1 - Sa) Da' = Sa + Da - Sa.Da*/static inline int lighten_op(int dst, int src, int da, int sa){ return (qMax(src * da, dst * sa) + src * (255 - da) + dst * (255 - sa)) >> 8;}template <typename T>static inline void comp_func_solid_Lighten_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) lighten_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_Lighten(uint *dest, int length, uint color, uint const_alpha){ if (const_alpha == 255) comp_func_solid_Lighten_impl(dest, length, color, FullCoverage()); else comp_func_solid_Lighten_impl(dest, length, color, PartialCoverage(const_alpha));}template <typename T>static inline void comp_func_Lighten_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) lighten_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_Lighten(uint *dest, const uint *src, int length, uint const_alpha){ if (const_alpha == 255) comp_func_Lighten_impl(dest, src, length, FullCoverage()); else comp_func_Lighten_impl(dest, src, length, PartialCoverage(const_alpha));}/* if Sca.Da + Dca.Sa >= Sa.Da Dca' = Sa.Da + Sca.(1 - Da) + Dca.(1 - Sa) otherwise Dca' = Dca.Sa/(1-Sca/Sa) + Sca.(1 - Da) + Dca.(1 - Sa)*/static inline int color_dodge_op(int dst, int src, int da, int sa){ const int sa_da = sa * da; const int dst_sa = dst * sa; const int src_da = src * da; const int temp = src * (255 - da) + dst * (255 - sa); if (src_da + dst_sa >= sa_da) return (sa_da + temp) >> 8; else return (255 * dst_sa / (255 - 255 * src / sa) + temp) >> 8;}template <typename T>static inline void comp_func_solid_ColorDodge_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) color_dodge_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_ColorDodge(uint *dest, int length, uint color, uint const_alpha){ if (const_alpha == 255) comp_func_solid_ColorDodge_impl(dest, length, color, FullCoverage()); else comp_func_solid_ColorDodge_impl(dest, length, color, PartialCoverage(const_alpha));}template <typename T>static inline void comp_func_ColorDodge_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) color_dodge_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_ColorDodge(uint *dest, const uint *src, int length, uint const_alpha){ if (const_alpha == 255) comp_func_ColorDodge_impl(dest, src, length, FullCoverage()); else comp_func_ColorDodge_impl(dest, src, length, PartialCoverage(const_alpha));}/* if Sca.Da + Dca.Sa <= Sa.Da Dca' = Sca.(1 - Da) + Dca.(1 - Sa) otherwise Dca' = Sa.(Sca.Da + Dca.Sa - Sa.Da)/Sca + Sca.(1 - Da) + Dca.(1 - Sa)*/static inline int color_burn_op(int dst, int src, int da, int sa){ const int src_da = src * da; const int dst_sa = dst * sa; const int sa_da = sa * da; const int temp = src * (255 - da) + dst * (255 - sa); if (src == 0 || src_da + dst_sa <= sa_da) return temp >> 8; else return (sa * (src_da + dst_sa - sa_da) / src + temp) >> 8;}template <typename T>static inline void comp_func_solid_ColorBurn_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) color_burn_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_ColorBurn(uint *dest, int length, uint color, uint const_alpha){ if (const_alpha == 255) comp_func_solid_ColorBurn_impl(dest, length, color, FullCoverage()); else comp_func_solid_ColorBurn_impl(dest, length, color, PartialCoverage(const_alpha));}template <typename T>static inline void comp_func_ColorBurn_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) color_burn_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_ColorBurn(uint *dest, const uint *src, int length, uint const_alpha){ if (const_alpha == 255) comp_func_ColorBurn_impl(dest, src, length, FullCoverage()); else comp_func_ColorBurn_impl(dest, src, length, PartialCoverage(const_alpha));}/* if 2.Sca < Sa Dca' = 2.Sca.Dca + Sca.(1 - Da) + Dca.(1 - Sa) otherwise Dca' = Sa.Da - 2.(Da - Dca).(Sa - Sca) + Sca.(1 - Da) + Dca.(1 - Sa)*/static inline uint hardlight_op(int dst, int src, int da, int sa){ const uint temp = src * (255 - da) + dst * (255 - sa); if (2 * src < sa) return (2 * src * dst + temp) >> 8; else return (sa * da - 2 * (da - dst) * (sa - src) + temp) >> 8;}template <typename T>static inline void comp_func_solid_HardLight_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) hardlight_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_HardLight(uint *dest, int length, uint color, uint const_alpha){ if (const_alpha == 255) comp_func_solid_HardLight_impl(dest, length, color, FullCoverage()); else comp_f
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -