enum SrcColorOpacity { // The src color is known to be opaque (alpha == 255)
kOpaque_SrcColorOpacity = 0, // The src color is known to be fully transparent (color == 0)
kTransparentBlack_SrcColorOpacity = 1, // The src alpha is known to be fully transparent (alpha == 0)
kTransparentAlpha_SrcColorOpacity = 2, // The src color opacity is unknown
kUnknown_SrcColorOpacity = 3
};
switch (src) { case SkBlendModeCoeff::kDA: case SkBlendModeCoeff::kDC: case SkBlendModeCoeff::kIDA: case SkBlendModeCoeff::kIDC: returnfalse; default: break;
}
switch (dst) { case SkBlendModeCoeff::kZero: returntrue; case SkBlendModeCoeff::kISA: return kOpaque_SrcColorOpacity == opacityType; case SkBlendModeCoeff::kSA: return kTransparentBlack_SrcColorOpacity == opacityType ||
kTransparentAlpha_SrcColorOpacity == opacityType; case SkBlendModeCoeff::kSC: return kTransparentBlack_SrcColorOpacity == opacityType; default: returnfalse;
}
}
bool SkPaintPriv::Overwrites(const SkPaint* paint, ShaderOverrideOpacity overrideOpacity) { if (!paint) { // No paint means we default to SRC_OVER, so we overwrite iff our shader-override // is opaque, or we don't have one. return overrideOpacity != kNotOpaque_ShaderOverrideOpacity;
}
constauto bm = paint->asBlendMode(); if (!bm) { returnfalse; // don't know for sure, so we play it safe and return false.
} return blend_mode_is_opaque(bm.value(), opacityType);
}
bool SkPaintPriv::ShouldDither(const SkPaint& p, SkColorType dstCT) { // The paint dither flag can veto. if (!p.isDither()) { returnfalse;
}
if (dstCT == kUnknown_SkColorType) { returnfalse;
}
// We always dither 565 or 4444 when requested. if (dstCT == kRGB_565_SkColorType || dstCT == kARGB_4444_SkColorType) { returntrue;
}
// Otherwise, dither is only needed for non-const paints. return p.getImageFilter() || p.getMaskFilter() ||
(p.getShader() && !as_SB(p.getShader())->isConstant());
}
// return true if the paint is just a single color (i.e. not a shader). If its // a shader, then we can't compute a const luminance for it :( staticbool just_a_color(const SkPaint& paint, SkColor4f* color) {
SkColor4f c = paint.getColor4f();
constauto* shader = as_SB(paint.getShader()); if (shader && !shader->asLuminanceColor(&c)) { returnfalse;
} if (paint.getColorFilter()) { // TODO: This colorspace is meaningless, replace it with something else
SkColorSpace* cs = nullptr;
c = paint.getColorFilter()->filterColor4f(c, cs, cs);
} if (color) {
*color = c;
} returntrue;
}
void SkPaintPriv::RemoveColorFilter(SkPaint* p, SkColorSpace* dstCS) { if (SkColorFilter* filter = p->getColorFilter()) { if (SkShader* shader = p->getShader()) { // SkColorFilterShader will modulate the shader color by paint alpha // before applying the filter, so we'll reset it to opaque.
p->setShader(SkColorFilterShader::Make(sk_ref_sp(shader),
p->getAlphaf(),
sk_ref_sp(filter)));
p->setAlphaf(1.0f);
} else {
p->setColor(filter->filterColor4f(p->getColor4f(), sk_srgb_singleton(), dstCS), dstCS);
}
p->setColorFilter(nullptr);
}
}
// SkPaint originally defined flags, some of which now apply to SkFont. These are renames // of those flags, split into categories depending on which objects they (now) apply to.
/* To save space/time, we analyze the paint, and write a truncated version of it if there are not tricky elements like shaders, etc.
*/ void SkPaintPriv::Flatten(const SkPaint& paint, SkWriteBuffer& buffer) {
uint8_t flatFlags = 0;
if (!(flatFlags & kHasEffects_FlatFlag)) { // This is a simple SkPaint without any effects, so clear all the effect-related fields.
paint.setPathEffect(nullptr);
paint.setShader(nullptr);
paint.setMaskFilter(nullptr);
paint.setColorFilter(nullptr);
paint.setImageFilter(nullptr);
} elseif (buffer.isVersionLT(SkPicturePriv::kSkBlenderInSkPaint)) { // This paint predates the introduction of user blend functions (via SkBlender).
paint.setPathEffect(buffer.readPathEffect());
paint.setShader(buffer.readShader());
paint.setMaskFilter(buffer.readMaskFilter());
paint.setColorFilter(buffer.readColorFilter());
(void)buffer.read32(); // was drawLooper (now deprecated)
paint.setImageFilter(buffer.readImageFilter());
} else {
paint.setPathEffect(buffer.readPathEffect());
paint.setShader(buffer.readShader());
paint.setMaskFilter(buffer.readMaskFilter());
paint.setColorFilter(buffer.readColorFilter());
paint.setImageFilter(buffer.readImageFilter());
paint.setBlender(buffer.readBlender());
}
if (!buffer.validate(safe.ok())) {
paint.reset();
} return paint;
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.