Add automatically generated mipmaps to smallest mipmap level to improve tiny image quality
This commit is contained in:
parent
e20ae17759
commit
5d1b7678f0
2 changed files with 5 additions and 2 deletions
|
|
@ -101,6 +101,8 @@ sk_sp<SkImage> ImageResourceDisplay::load_frame_with_codec(const std::unique_ptr
|
||||||
if(!ogImage)
|
if(!ogImage)
|
||||||
throw std::runtime_error("Could not scale image.");
|
throw std::runtime_error("Could not scale image.");
|
||||||
}
|
}
|
||||||
|
if(mipmapLevel == get_smallest_mipmap_level())
|
||||||
|
return ogImage->withDefaultMipmaps();
|
||||||
return ogImage;
|
return ogImage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -205,7 +207,7 @@ void ImageResourceDisplay::draw(SkCanvas* canvas, const DrawData& drawData, cons
|
||||||
if(drawData.main->takingScreenshot) {
|
if(drawData.main->takingScreenshot) {
|
||||||
if(closestMipmapLevel == mipmapLevel) {
|
if(closestMipmapLevel == mipmapLevel) {
|
||||||
if(closestMipmapLevel == get_smallest_mipmap_level())
|
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
|
else
|
||||||
canvas->drawImageRect(frame.mipmapLevels[closestMipmapLevel], imRect, {SkFilterMode::kLinear, SkMipmapMode::kNone});
|
canvas->drawImageRect(frame.mipmapLevels[closestMipmapLevel], imRect, {SkFilterMode::kLinear, SkMipmapMode::kNone});
|
||||||
}
|
}
|
||||||
|
|
@ -221,7 +223,7 @@ void ImageResourceDisplay::draw(SkCanvas* canvas, const DrawData& drawData, cons
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(closestMipmapLevel == get_smallest_mipmap_level())
|
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
|
else
|
||||||
canvas->drawImageRect(frame.mipmapLevels[closestMipmapLevel], imRect, {SkFilterMode::kLinear, SkMipmapMode::kNone});
|
canvas->drawImageRect(frame.mipmapLevels[closestMipmapLevel], imRect, {SkFilterMode::kLinear, SkMipmapMode::kNone});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
// 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;
|
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
|
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;
|
float duration = -1.0f;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue