mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2025-02-18 04:45:39 +00:00
Moved back the wide SVG images size compensation from TextureData to ImageComponent.
This commit is contained in:
parent
5d78412b9d
commit
01d410867c
|
@ -74,9 +74,12 @@ void ImageComponent::resize(bool rasterize)
|
||||||
glm::vec2 resizeScale {mTargetSize.x / mSize.x, mTargetSize.y / mSize.y};
|
glm::vec2 resizeScale {mTargetSize.x / mSize.x, mTargetSize.y / mSize.y};
|
||||||
|
|
||||||
if (resizeScale.x < resizeScale.y) {
|
if (resizeScale.x < resizeScale.y) {
|
||||||
// This will be mTargetSize.x. We can't exceed it, nor be lower than it.
|
// SVG rasterization is determined by height and rasterization is done in terms of
|
||||||
|
// pixels. If rounding is off enough in the rasterization step (for images with
|
||||||
|
// extreme aspect ratios), it can cause cutoff when the aspect ratio breaks.
|
||||||
|
// So we always make sure to round accordingly to avoid such issues.
|
||||||
mSize.x *= resizeScale.x;
|
mSize.x *= resizeScale.x;
|
||||||
mSize.y = std::min(mSize.y * resizeScale.x, mTargetSize.y);
|
mSize.y = floorf(std::min(mSize.y * resizeScale.x, mTargetSize.y));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// This will be mTargetSize.y(). We can't exceed it.
|
// This will be mTargetSize.y(). We can't exceed it.
|
||||||
|
|
|
@ -108,31 +108,22 @@ bool TextureData::initSVGFromMemory(const std::string& fileData)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rasterize) {
|
if (rasterize) {
|
||||||
float height {static_cast<float>(mHeight)};
|
|
||||||
const float aspectW {svgImage->width / static_cast<float>(mWidth)};
|
const float aspectW {svgImage->width / static_cast<float>(mWidth)};
|
||||||
const float aspectH {svgImage->height / static_cast<float>(mHeight)};
|
const float aspectH {svgImage->height / static_cast<float>(mHeight)};
|
||||||
|
|
||||||
if (mScalableNonAspect && aspectW != aspectH) {
|
// If the size property has been used to override the aspect ratio of the SVG image,
|
||||||
// If the size property has been used to override the aspect ratio of the SVG image,
|
// then we need to rasterize at a lower resolution and let the GPU scale the texture.
|
||||||
// then we need to rasterize at a lower resolution and let the GPU scale the texture.
|
// This is necessary as the rasterization always maintains the image aspect ratio.
|
||||||
// This is necessary as the rasterization always maintains the image aspect ratio.
|
if (mScalableNonAspect && aspectW != aspectH)
|
||||||
mWidth = static_cast<int>(std::round(svgImage->width / aspectH));
|
mWidth = static_cast<int>(std::round(svgImage->width / aspectH));
|
||||||
}
|
|
||||||
else {
|
|
||||||
// For very wide and short images we need to check that the target width is enough
|
|
||||||
// to fit the rasterized image, if not we'll decrease the height as needed.
|
|
||||||
const float requiredWidth {height * (svgImage->width / svgImage->height)};
|
|
||||||
if (std::round(requiredWidth) > static_cast<float>(mWidth))
|
|
||||||
height = std::floor(height * (static_cast<float>(mWidth) / requiredWidth));
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<unsigned char> tempVector;
|
std::vector<unsigned char> tempVector;
|
||||||
tempVector.reserve(mWidth * mHeight * 4);
|
tempVector.reserve(mWidth * mHeight * 4);
|
||||||
|
|
||||||
NSVGrasterizer* rast {nsvgCreateRasterizer()};
|
NSVGrasterizer* rast {nsvgCreateRasterizer()};
|
||||||
|
|
||||||
nsvgRasterize(rast, svgImage, 0, 0, height / svgImage->height, tempVector.data(), mWidth,
|
nsvgRasterize(rast, svgImage, 0, 0, static_cast<float>(mHeight) / svgImage->height,
|
||||||
mHeight, mWidth * 4);
|
tempVector.data(), mWidth, mHeight, mWidth * 4);
|
||||||
|
|
||||||
nsvgDeleteRasterizer(rast);
|
nsvgDeleteRasterizer(rast);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue