📄 qdrawhelper.cpp
字号:
for (int i = 0; i < length; ++i) dest[i] = color + BYTE_MUL(dest[i], qAlpha(~color)); }}static void QT_FASTCALL comp_func_SourceOver(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]; dest[i] = s + BYTE_MUL(dest[i], qAlpha(~s)); } } else { for (int i = 0; i < length; ++i) { uint s = BYTE_MUL(src[i], const_alpha); dest[i] = s + BYTE_MUL(dest[i], qAlpha(~s)); } }}/* result = d + s * dia dest = (d + s * dia) * ca + d * cia = d + s * dia * ca*/static void QT_FASTCALL comp_func_solid_DestinationOver(uint *dest, int length, uint color, uint const_alpha){ if (const_alpha != 255) color = BYTE_MUL(color, const_alpha); for (int i = 0; i < length; ++i) { uint d = dest[i]; dest[i] = d + BYTE_MUL(color, qAlpha(~d)); }}static void QT_FASTCALL comp_func_DestinationOver(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]; dest[i] = d + BYTE_MUL(src[i], qAlpha(~d)); } } else { for (int i = 0; i < length; ++i) { uint d = dest[i]; uint s = BYTE_MUL(src[i], const_alpha); dest[i] = d + BYTE_MUL(s, qAlpha(~d)); } }}/* result = s * da dest = s * da * ca + d * cia*/static void QT_FASTCALL comp_func_solid_SourceIn(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); uint 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_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 CompositionFunctionSolid functionForModeSolid_C[] = { comp_func_solid_SourceOver, comp_func_solid_DestinationOver, comp_func_solid_Clear, comp_func_solid_Source, 0, comp_func_solid_SourceIn, comp_func_solid_DestinationIn, comp_func_solid_SourceOut, comp_func_solid_DestinationOut, comp_func_solid_SourceAtop, comp_func_solid_DestinationAtop, comp_func_solid_XOR};static const CompositionFunctionSolid *functionForModeSolid = functionForModeSolid_C;static const CompositionFunction functionForMode_C[] = { comp_func_SourceOver, comp_func_DestinationOver, comp_func_Clear, comp_func_Source, 0, comp_func_SourceIn, comp_func_DestinationIn, comp_func_SourceOut, comp_func_DestinationOut, comp_func_SourceAtop, comp_func_DestinationAtop, comp_func_XOR};static const CompositionFunction *functionForMode = functionForMode_C;static TextureBlendType getBlendType(const QSpanData *data){ TextureBlendType ft; if (data->txop <= QPainterPrivate::TxTranslate) if (data->texture.type == TextureData::Tiled) ft = BlendTiled; else ft = BlendUntransformed; else if (data->bilinear) if (data->texture.type == TextureData::Tiled) ft = BlendTransformedBilinearTiled; else ft = BlendTransformedBilinear; else if (data->texture.type == TextureData::Tiled) ft = BlendTransformedTiled; else ft = BlendTransformed; return ft;}static inline Operator getOperator(const QSpanData *data){ Operator op; bool solidSource = false; switch(data->type) { case QSpanData::Solid: solidSource = (qAlpha(data->solid.color) == 255); break; case QSpanData::LinearGradient: solidSource = !data->gradient.alphaColor; getLinearGradientValues(&op.linear, data); op.src_fetch = fetchLinearGradient; break; case QSpanData::RadialGradient: solidSource = !data->gradient.alphaColor; getRadialGradientValues(&op.radial, data); op.src_fetch = fetchRadialGradient; break; case QSpanData::ConicalGradient: solidSource = !data->gradient.alphaColor; op.src_fetch = fetchConicalGradient; break; case QSpanData::Texture: op.src_fetch = sourceFetch[getBlendType(data)][data->texture.format]; solidSource = data->texture.format != QImage::Format_ARGB32_Premultiplied && data->texture.format != QImage::Format_ARGB32 && data->texture.format != QImage::Format_Indexed8; default: break; } op.mode = data->rasterBuffer->compositionMode; if (op.mode == QPainter::CompositionMode_SourceOver && solidSource) op.mode = QPainter::CompositionMode_Source; op.dest_fetch = destFetchProc[data->rasterBuffer->format]; if (op.mode == QPainter::CompositionMode_Source) { switch (data->rasterBuffer->format) { case QImage::Format_RGB32: case QImage::Format_ARGB32_Premultiplied: // this one sets up the pointer correctly so we save one copy op.dest_fetch = destFetchProc[QImage::Format_ARGB32_Premultiplied]; break; default: op.dest_fetch = 0; } } op.dest_store = destStoreProc[data->rasterBuffer->format]; op.funcSolid = functionForModeSolid[op.mode]; op.func = functionForMode[op.mode]; return op;}// -------------------- blend methods ---------------------static void blend_color_generic(int count, const QSpan *spans, void *userData){ QSpanData *data = reinterpret_cast<QSpanData *>(userData);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -