bool SkBlendMode_ShouldPreScaleCoverage(SkBlendMode mode, bool rgb_coverage) { // The most important things we do here are: // 1) never pre-scale with rgb coverage if the blend mode involves a source-alpha term; // 2) always pre-scale Plus. // // When we pre-scale with rgb coverage, we scale each of source r,g,b, with a distinct value, // and source alpha with one of those three values. This process destructively updates the // source-alpha term, so we can't evaluate blend modes that need its original value. // // Plus always requires pre-scaling as a specific quirk of its implementation in // SkRasterPipeline. This lets us put the clamp inside the blend mode itself rather // than as a separate stage that'd come after the lerp. // // This function is a finer-grained breakdown of SkBlendMode_SupportsCoverageAsAlpha(). switch (mode) { case SkBlendMode::kDst: // d --> no sa term, ok! case SkBlendMode::kDstOver: // d + s*inv(da) --> no sa term, ok! case SkBlendMode::kPlus: // clamp(s+d) --> no sa term, ok! returntrue;
case SkBlendMode::kDstOut: // d * inv(sa) case SkBlendMode::kSrcATop: // s*da + d*inv(sa) case SkBlendMode::kSrcOver: // s + d*inv(sa) case SkBlendMode::kXor: // s*inv(da) + d*inv(sa) return !rgb_coverage;
default: break;
} returnfalse;
}
// Users of this function may want to switch to the rgb-coverage aware version above. bool SkBlendMode_SupportsCoverageAsAlpha(SkBlendMode mode) { return SkBlendMode_ShouldPreScaleCoverage(mode, false);
}
constchar* SkBlendMode_Name(SkBlendMode bm) { switch (bm) { case SkBlendMode::kClear: return"Clear"; case SkBlendMode::kSrc: return"Src"; case SkBlendMode::kDst: return"Dst"; case SkBlendMode::kSrcOver: return"SrcOver"; case SkBlendMode::kDstOver: return"DstOver"; case SkBlendMode::kSrcIn: return"SrcIn"; case SkBlendMode::kDstIn: return"DstIn"; case SkBlendMode::kSrcOut: return"SrcOut"; case SkBlendMode::kDstOut: return"DstOut"; case SkBlendMode::kSrcATop: return"SrcATop"; case SkBlendMode::kDstATop: return"DstATop"; case SkBlendMode::kXor: return"Xor"; case SkBlendMode::kPlus: return"Plus"; case SkBlendMode::kModulate: return"Modulate"; case SkBlendMode::kScreen: return"Screen";
case SkBlendMode::kOverlay: return"Overlay"; case SkBlendMode::kDarken: return"Darken"; case SkBlendMode::kLighten: return"Lighten"; case SkBlendMode::kColorDodge: return"ColorDodge"; case SkBlendMode::kColorBurn: return"ColorBurn"; case SkBlendMode::kHardLight: return"HardLight"; case SkBlendMode::kSoftLight: return"SoftLight"; case SkBlendMode::kDifference: return"Difference"; case SkBlendMode::kExclusion: return"Exclusion"; case SkBlendMode::kMultiply: return"Multiply";
case SkBlendMode::kHue: return"Hue"; case SkBlendMode::kSaturation: return"Saturation"; case SkBlendMode::kColor: return"Color"; case SkBlendMode::kLuminosity: return"Luminosity";
}
SkUNREACHABLE;
}
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.