// Try to load from the base image, or from the cache static sk_sp<const SkMipmap> try_load_mips(const SkImage_Base* image) {
sk_sp<const SkMipmap> mips = image->refMips(); if (!mips) {
mips.reset(SkMipmapCache::FindAndRef(SkBitmapCacheDesc::Make(image)));
} if (!mips) {
mips.reset(SkMipmapCache::AddAndRef(image));
} return mips;
}
auto load_upper_from_base = [&]() { // only do this once if (fBaseStorage.getPixels() == nullptr) { auto dContext = as_IB(image)->directContext();
(void)image->getROPixels(dContext, &fBaseStorage);
fUpper.reset(fBaseStorage.info(), fBaseStorage.getPixels(), fBaseStorage.rowBytes());
}
};
// Nearest mode uses this level, so we round to pick the nearest. In linear mode we use this // level as the lower of the two to interpolate between, so we take the floor. int levelNum = resolvedMode == SkMipmapMode::kNearest ? sk_float_round2int(level)
: sk_float_floor2int(level); float lowerWeight = level - levelNum; // fract(level)
SkASSERT(levelNum >= 0);
if (levelNum == 0) {
load_upper_from_base();
} // load fCurrMip if needed if (levelNum > 0 || (resolvedMode == SkMipmapMode::kLinear && lowerWeight > 0)) {
fCurrMip = try_load_mips(image); if (!fCurrMip) {
load_upper_from_base();
resolvedMode = SkMipmapMode::kNone;
} else {
SkMipmap::Level levelRec;
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.