From 95f6babd5e2ccc66bf7e97f74f804ddac4cf2fef Mon Sep 17 00:00:00 2001 From: Kae <80987908+Novaenia@users.noreply.github.com> Date: Fri, 3 May 2024 08:53:44 +1000 Subject: [PATCH] scaling functions now warn instead of crashing with negative scales --- source/core/StarImageProcessing.cpp | 21 ++++++++++++++++----- source/core/StarImageProcessing.hpp | 6 +++--- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/source/core/StarImageProcessing.cpp b/source/core/StarImageProcessing.cpp index b803470..6d2c51d 100644 --- a/source/core/StarImageProcessing.cpp +++ b/source/core/StarImageProcessing.cpp @@ -6,12 +6,15 @@ #include "StarImage.hpp" #include "StarStringView.hpp" #include "StarEncode.hpp" -//#include "StarTime.hpp" -//#include "StarLogging.hpp" +#include "StarLogging.hpp" namespace Star { -Image scaleNearest(Image const& srcImage, Vec2F const& scale) { +Image scaleNearest(Image const& srcImage, Vec2F scale) { + if (scale[0] < 0.0f || scale[1] < 0.0f) { + Logger::warn("Negative scale in scaleNearest({})", scale); + scale = scale.piecewiseMax(Vec2F::filled(0.f)); + } Vec2U srcSize = srcImage.size(); Vec2U destSize = Vec2U::round(vmult(Vec2F(srcSize), scale)); destSize[0] = max(destSize[0], 1u); @@ -26,7 +29,11 @@ Image scaleNearest(Image const& srcImage, Vec2F const& scale) { return destImage; } -Image scaleBilinear(Image const& srcImage, Vec2F const& scale) { +Image scaleBilinear(Image const& srcImage, Vec2F scale) { + if (scale[0] < 0.0f || scale[1] < 0.0f) { + Logger::warn("Negative scale in scaleBilinear({})", scale); + scale = scale.piecewiseMax(Vec2F::filled(0.f)); + } Vec2U srcSize = srcImage.size(); Vec2U destSize = Vec2U::round(vmult(Vec2F(srcSize), scale)); destSize[0] = max(destSize[0], 1u); @@ -50,7 +57,11 @@ Image scaleBilinear(Image const& srcImage, Vec2F const& scale) { return destImage; } -Image scaleBicubic(Image const& srcImage, Vec2F const& scale) { +Image scaleBicubic(Image const& srcImage, Vec2F scale) { + if (scale[0] < 0.0f || scale[1] < 0.0f) { + Logger::warn("Negative scale in scaleBicubic({})", scale); + scale = scale.piecewiseMax(Vec2F::filled(0.f)); + } Vec2U srcSize = srcImage.size(); Vec2U destSize = Vec2U::round(vmult(Vec2F(srcSize), scale)); destSize[0] = max(destSize[0], 1u); diff --git a/source/core/StarImageProcessing.hpp b/source/core/StarImageProcessing.hpp index 8316d18..4022d38 100644 --- a/source/core/StarImageProcessing.hpp +++ b/source/core/StarImageProcessing.hpp @@ -10,9 +10,9 @@ STAR_CLASS(Image); STAR_EXCEPTION(ImageOperationException, StarException); -Image scaleNearest(Image const& srcImage, Vec2F const& scale); -Image scaleBilinear(Image const& srcImage, Vec2F const& scale); -Image scaleBicubic(Image const& srcImage, Vec2F const& scale); +Image scaleNearest(Image const& srcImage, Vec2F scale); +Image scaleBilinear(Image const& srcImage, Vec2F scale); +Image scaleBicubic(Image const& srcImage, Vec2F scale); StringList colorDirectivesFromConfig(JsonArray const& directives); String paletteSwapDirectivesFromConfig(Json const& swaps);