std::optional<MatrixRec> MatrixRec::apply(const SkStageRec& rec, const SkMatrix& postInv) const {
SkMatrix total = fPendingLocalMatrix; if (!fCTMApplied) {
total = SkMatrix::Concat(fCTM, total);
} if (!total.invert(&total)) { return {};
}
total = SkMatrix::Concat(postInv, total); if (!fCTMApplied) {
rec.fPipeline->append(SkRasterPipelineOp::seed_shader);
} // appendMatrix is a no-op if total worked out to identity.
rec.fPipeline->appendMatrix(rec.fAlloc, total); return MatrixRec{fCTM,
fTotalLocalMatrix, /*pendingLocalMatrix=*/SkMatrix::I(),
fTotalMatrixIsValid, /*ctmApplied=*/true};
}
MatrixRec MatrixRec::applied() const { // We mark the CTM as "not applied" because we *never* apply the CTM for FPs. Their starting // coords are local, not device, coords. return MatrixRec{fCTM,
fTotalLocalMatrix, /*pendingLocalMatrix=*/SkMatrix::I(),
fTotalMatrixIsValid, /*ctmApplied=*/false};
}
MatrixRec MatrixRec::concat(const SkMatrix& m) const { return {fCTM,
SkShaderBase::ConcatLocalMatrices(fTotalLocalMatrix, m),
SkShaderBase::ConcatLocalMatrices(fPendingLocalMatrix, m),
fTotalMatrixIsValid,
fCTMApplied};
}
bool SkShaderBase::asLuminanceColor(SkColor4f* colorPtr) const {
SkColor4f storage; if (nullptr == colorPtr) {
colorPtr = &storage;
} if (this->onAsLuminanceColor(colorPtr)) {
colorPtr->fA = 1.0f; // we only return opaque returntrue;
} returnfalse;
}
SkShaderBase::Context* SkShaderBase::makeContext(const ContextRec& rec, SkArenaAlloc* alloc) const { #ifdef SK_ENABLE_LEGACY_SHADERCONTEXT // We always fall back to raster pipeline when perspective is present. auto totalMatrix = rec.fMatrixRec.totalMatrix(); if (totalMatrix.hasPerspective() || !totalMatrix.invert(nullptr)) { return nullptr;
}
SkShaderBase::Context::Context(const SkShaderBase& shader, const ContextRec& rec)
: fShader(shader) { // We should never use a context with perspective.
SkASSERT(!rec.fMatrixRec.totalMatrix().hasPerspective());
// Because the context parameters must be valid at this point, we know that the matrix is // invertible.
SkAssertResult(rec.fMatrixRec.totalInverse(&fTotalInverse));
fPaintAlpha = rec.fPaintAlpha;
}
SkShaderBase::Context::~Context() {}
bool SkShaderBase::ContextRec::isLegacyCompatible(SkColorSpace* shaderColorSpace) const { // In legacy pipelines, shaders always produce premul (or opaque) and the destination is also // always premul (or opaque). (And those "or opaque" caveats won't make any difference here.)
SkAlphaType shaderAT = kPremul_SkAlphaType, dstAT = kPremul_SkAlphaType; return 0 ==
SkColorSpaceXformSteps{shaderColorSpace, shaderAT, fDstColorSpace, dstAT}.flags.mask();
}
// need a cheap way to invert the alpha channel of a shader (i.e. 1 - a)
sk_sp<SkShader> SkShaderBase::makeInvertAlpha() const { return this->makeWithColorFilter(SkColorFilters::Blend(0xFFFFFFFF, SkBlendMode::kSrcOut));
}
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.