scummvm/graphics/scalerplugin.cpp
Eric Culp 4c967c5fbc GRAPHICS,SDL: Revision to scaler API
oldSrcScale() is now unified with scale(). Use enableSource(bool enable)
to switch functionality. Partial screen updates are also posible because
of this.

initialize() had its prototype changes although it is functionally the
same.

setSource() no longer has a type parameter, removing support for
multiple source surfaces. They weren't useful anyway.

useOldSrc() was renamed to useOldSource() to conform to the names of
other functions.
2021-03-15 16:48:40 +02:00

67 lines
2.1 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "graphics/scalerplugin.h"
SourceScaler::SourceScaler() : _oldSrc(NULL), _enable(false) {
}
SourceScaler::~SourceScaler() {
if (_oldSrc != NULL)
delete[] _oldSrc;
}
void SourceScaler::setSource(const byte *src, uint pitch, int width, int height, int padding) {
if (_oldSrc != NULL)
delete[] _oldSrc;
_padding = padding;
// Give _oldSrc same pitch
int size = (height + padding * 2) * pitch;
_oldSrc = new byte[size];
memset(_oldSrc, 0, size);
}
void SourceScaler::scale(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr,
uint32 dstPitch, int width, int height, int x, int y) {
if (!_enable) {
// Do not pass _oldSrc, do not update _oldSrc
internScale(srcPtr, srcPitch,
dstPtr, dstPitch,
NULL, 0,
width, height);
return;
}
int offset = (_padding + x) * _format.bytesPerPixel + (_padding + y) * srcPitch;
// Call user defined scale function
internScale(srcPtr, srcPitch,
dstPtr, dstPitch,
_oldSrc + offset, srcPitch,
width, height);
// Update old src
byte *oldSrc = _oldSrc + offset;
while (height--) {
memcpy(oldSrc, srcPtr, width * _format.bytesPerPixel);
oldSrc += srcPitch;
srcPtr += srcPitch;
}
}