From b68dbf9eec6d059a88e57d3318ca721c4dec4624 Mon Sep 17 00:00:00 2001 From: Cameron Cawley Date: Wed, 1 Jul 2020 16:24:52 +0100 Subject: [PATCH] GRAPHICS: Ensure that _bufferedOutput is resized when the scale factor changes --- graphics/scaler/edge.cpp | 4 ++-- graphics/scaler/hq.cpp | 4 ++-- graphics/scaler/normal.cpp | 4 ++-- graphics/scaler/scalebit.cpp | 4 ++-- graphics/scalerplugin.cpp | 18 ++++++++++++++++-- graphics/scalerplugin.h | 4 +++- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/graphics/scaler/edge.cpp b/graphics/scaler/edge.cpp index 580026e4270..28851816ffb 100644 --- a/graphics/scaler/edge.cpp +++ b/graphics/scaler/edge.cpp @@ -3604,13 +3604,13 @@ void EdgePlugin::internScale(const uint8 *srcPtr, uint32 srcPitch, uint EdgePlugin::increaseFactor() { if (_factor == 2) - ++_factor; + setFactor(_factor + 1); return _factor; } uint EdgePlugin::decreaseFactor() { if (_factor == 3) - --_factor; + setFactor(_factor - 1); return _factor; } diff --git a/graphics/scaler/hq.cpp b/graphics/scaler/hq.cpp index da254fb0758..68419979ae1 100644 --- a/graphics/scaler/hq.cpp +++ b/graphics/scaler/hq.cpp @@ -5067,13 +5067,13 @@ void HQPlugin::scaleIntern(const uint8 *srcPtr, uint32 srcPitch, uint HQPlugin::increaseFactor() { if (_factor < 3) - ++_factor; + setFactor(_factor + 1); return _factor; } uint HQPlugin::decreaseFactor() { if (_factor > 2) - --_factor; + setFactor(_factor - 1); return _factor; } diff --git a/graphics/scaler/normal.cpp b/graphics/scaler/normal.cpp index 358e0e54225..a627a819be3 100644 --- a/graphics/scaler/normal.cpp +++ b/graphics/scaler/normal.cpp @@ -205,7 +205,7 @@ void NormalPlugin::scaleIntern(const uint8 *srcPtr, uint32 srcPitch, uint NormalPlugin::increaseFactor() { #ifdef USE_SCALERS if (_factor < 4) - ++_factor; + setFactor(_factor + 1); #endif return _factor; } @@ -213,7 +213,7 @@ uint NormalPlugin::increaseFactor() { uint NormalPlugin::decreaseFactor() { #ifdef USE_SCALERS if (_factor > 1) - --_factor; + setFactor(_factor - 1); #endif return _factor; } diff --git a/graphics/scaler/scalebit.cpp b/graphics/scaler/scalebit.cpp index e7b74c5edc6..eecceef6e89 100644 --- a/graphics/scaler/scalebit.cpp +++ b/graphics/scaler/scalebit.cpp @@ -369,13 +369,13 @@ void AdvMamePlugin::scaleIntern(const uint8 *srcPtr, uint32 srcPitch, uint AdvMamePlugin::increaseFactor() { if (_factor < 4) - ++_factor; + setFactor(_factor + 1); return _factor; } uint AdvMamePlugin::decreaseFactor() { if (_factor > 2) - --_factor; + setFactor(_factor - 1); return _factor; } diff --git a/graphics/scalerplugin.cpp b/graphics/scalerplugin.cpp index 9f677dfb821..a5b7c692350 100644 --- a/graphics/scalerplugin.cpp +++ b/graphics/scalerplugin.cpp @@ -60,7 +60,7 @@ void ScalerPluginObject::scale(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstP } } -SourceScaler::SourceScaler() : _oldSrc(NULL), _enable(false) { +SourceScaler::SourceScaler() : _width(0), _height(0), _oldSrc(NULL), _enable(false) { } SourceScaler::~SourceScaler() { @@ -77,13 +77,27 @@ void SourceScaler::setSource(const byte *src, uint pitch, int width, int height, if (_oldSrc != NULL) delete[] _oldSrc; + _width = width; + _height = height; _padding = padding; + // Give _oldSrc same pitch int size = (height + padding * 2) * pitch; _oldSrc = new byte[size]; memset(_oldSrc, 0, size); - _bufferedOutput.create(width * _factor, height * _factor, _format); + _bufferedOutput.create(_width * _factor, _height * _factor, _format); +} + +uint SourceScaler::setFactor(uint factor) { + uint oldFactor = _factor; + _factor = factor; + + if (factor != oldFactor && _width != 0 && _height != 0) { + _bufferedOutput.create(_width * _factor, _height * _factor, _format); + } + + return oldFactor; } void SourceScaler::scaleIntern(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, diff --git a/graphics/scalerplugin.h b/graphics/scalerplugin.h index e44eaaab530..44b446f3643 100644 --- a/graphics/scalerplugin.h +++ b/graphics/scalerplugin.h @@ -167,6 +167,8 @@ public: virtual void enableSource(bool enable) final { _enable = enable; } + virtual uint setFactor(uint factor) final; + protected: virtual void scaleIntern(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, @@ -186,7 +188,7 @@ protected: private: - int _padding; + int _width, _height, _padding; bool _enable; byte *_oldSrc; Graphics::Surface _bufferedOutput;