Add automatically generated mipmaps to smallest mipmap level to improve tiny image quality

This commit is contained in:
Yousef Khadadeh 2026-02-20 00:01:28 +03:00
parent e20ae17759
commit 5d1b7678f0
2 changed files with 5 additions and 2 deletions

View file

@ -101,6 +101,8 @@ sk_sp<SkImage> ImageResourceDisplay::load_frame_with_codec(const std::unique_ptr
if(!ogImage)
throw std::runtime_error("Could not scale image.");
}
if(mipmapLevel == get_smallest_mipmap_level())
return ogImage->withDefaultMipmaps();
return ogImage;
}
@ -205,7 +207,7 @@ void ImageResourceDisplay::draw(SkCanvas* canvas, const DrawData& drawData, cons
if(drawData.main->takingScreenshot) {
if(closestMipmapLevel == mipmapLevel) {
if(closestMipmapLevel == get_smallest_mipmap_level())
canvas->drawImageRect(frame.smallestMipmapLevel, imRect, {SkFilterMode::kLinear, SkMipmapMode::kNone});
canvas->drawImageRect(frame.smallestMipmapLevel, imRect, {SkFilterMode::kLinear, SkMipmapMode::kLinear});
else
canvas->drawImageRect(frame.mipmapLevels[closestMipmapLevel], imRect, {SkFilterMode::kLinear, SkMipmapMode::kNone});
}
@ -221,7 +223,7 @@ void ImageResourceDisplay::draw(SkCanvas* canvas, const DrawData& drawData, cons
}
else {
if(closestMipmapLevel == get_smallest_mipmap_level())
canvas->drawImageRect(frame.smallestMipmapLevel, imRect, {SkFilterMode::kLinear, SkMipmapMode::kNone});
canvas->drawImageRect(frame.smallestMipmapLevel, imRect, {SkFilterMode::kLinear, SkMipmapMode::kLinear});
else
canvas->drawImageRect(frame.mipmapLevels[closestMipmapLevel], imRect, {SkFilterMode::kLinear, SkMipmapMode::kNone});
}

View file

@ -28,6 +28,7 @@ class ImageResourceDisplay : public ResourceDisplay {
// Mipmap level calculation is done using the smaller dimension, not the bigger one, to ensure that the dimensions are never invalid
std::vector<sk_sp<SkImage>> mipmapLevels;
sk_sp<SkImage> smallestMipmapLevel; // Smaller dimension of this should be around SMALLEST_MIPMAP_RESOLUTION pixels. Is always allocated and used when cachedMipmapLevel is unavailable or when the image is viewed from far away
// Has auto generated mipmaps
float duration = -1.0f;
};