From e8d0182cd58f37071fde2c8deba1eb0d9ccd75a3 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 24 Sep 2012 01:08:20 +0200 Subject: [PATCH] SDL: Take advantage that each ScalerPluginObject can use a scale factor of 1. --- .../surfacesdl/surfacesdl-graphics.cpp | 46 ++++++++----------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp index 3c30b3dd34f..abfa6d7d82e 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp @@ -1191,19 +1191,6 @@ void SurfaceSdlGraphicsManager::updateScreen() { internUpdateScreen(); } -/** - * Simple blit function. Copies a rectangle from one surface to another. - * - * @param byteWidth The width of the region to copy in bytes. - */ -static void blitSurface(byte *srcPtr, int srcPitch, byte *dstPtr, int dstPitch, int byteWidth, int height) { - while (height--) { - memcpy(dstPtr, srcPtr, byteWidth); - dstPtr += dstPitch; - srcPtr += srcPitch; - } -} - void SurfaceSdlGraphicsManager::internUpdateScreen() { SDL_Surface *srcSurf, *origSurf; int height, width; @@ -1258,18 +1245,20 @@ void SurfaceSdlGraphicsManager::internUpdateScreen() { _forceRedraw = true; } + int oldScaleFactor; if (!_overlayVisible) { origSurf = _screen; srcSurf = _tmpscreen; width = _videoMode.screenWidth; height = _videoMode.screenHeight; - scale1 = _videoMode.scaleFactor; + oldScaleFactor = scale1 = _videoMode.scaleFactor; } else { origSurf = _overlayscreen; srcSurf = _tmpscreen2; width = _videoMode.overlayWidth; height = _videoMode.overlayHeight; scale1 = 1; + oldScaleFactor = _scalerPlugin->setFactor(1); } // Add the area covered by the mouse cursor to the list of dirty rects if @@ -1345,17 +1334,13 @@ void SurfaceSdlGraphicsManager::internUpdateScreen() { if (_videoMode.aspectRatioCorrection && !_overlayVisible) dst_y = real2Aspect(dst_y); - if (_overlayVisible) { - blitSurface((byte *)srcSurf->pixels + (r->x + _maxExtraPixels) * 2 + (r->y + _maxExtraPixels) * srcPitch, srcPitch, - (byte *)_hwScreen->pixels + dst_x * 2 + dst_y * dstPitch, dstPitch, dst_w * 2, dst_h); + if (_useOldSrc && !_overlayVisible) { + // scale into _destbuffer instead of _hwScreen to avoid AR problems + _scalerPlugin->scale((byte *)srcSurf->pixels + (r->x + _maxExtraPixels) * 2 + (r->y + _maxExtraPixels) * srcPitch, srcPitch, + (byte *)_destbuffer->pixels + dst_x * 2 + orig_dst_y * scale1 * _destbuffer->pitch, _destbuffer->pitch, r->w, dst_h, r->x, r->y); } else { - if (_useOldSrc) { - // scale into _destbuffer instead of _hwScreen to avoid AR problems - _scalerPlugin->scale((byte *)srcSurf->pixels + (r->x + _maxExtraPixels) * 2 + (r->y + _maxExtraPixels) * srcPitch, srcPitch, - (byte *)_destbuffer->pixels + dst_x * 2 + orig_dst_y * scale1 * _destbuffer->pitch, _destbuffer->pitch, r->w, dst_h, r->x, r->y); - } else - _scalerPlugin->scale((byte *)srcSurf->pixels + (r->x + _maxExtraPixels) * 2 + (r->y + _maxExtraPixels) * srcPitch, srcPitch, - (byte *)_hwScreen->pixels + dst_x * 2 + dst_y * dstPitch, dstPitch, r->w, dst_h, r->x, r->y); + _scalerPlugin->scale((byte *)srcSurf->pixels + (r->x + _maxExtraPixels) * 2 + (r->y + _maxExtraPixels) * srcPitch, srcPitch, + (byte *)_hwScreen->pixels + dst_x * 2 + dst_y * dstPitch, dstPitch, r->w, dst_h, r->x, r->y); } } @@ -1494,6 +1479,9 @@ void SurfaceSdlGraphicsManager::internUpdateScreen() { } } + // Set up the old scale factor + _scalerPlugin->setFactor(oldScaleFactor); + _numDirtyRects = 0; _forceRedraw = false; _cursorNeedsRedraw = false; @@ -2241,10 +2229,12 @@ void SurfaceSdlGraphicsManager::blitCursor() { _normalPlugin->setFactor(oldFactor); } } else { - blitSurface( - (byte *)_mouseOrigSurface->pixels + _mouseOrigSurface->pitch * _maxExtraPixels + _maxExtraPixels * _mouseOrigSurface->format->BytesPerPixel, - _mouseOrigSurface->pitch, (byte *)_mouseSurface->pixels, _mouseSurface->pitch, - _mouseCurState.w * 2, _mouseCurState.h); + int oldScaleFactor = _scalerPlugin->setFactor(1); + _scalerPlugin->scale( + (byte *)_mouseOrigSurface->pixels + _mouseOrigSurface->pitch * _maxExtraPixels + _maxExtraPixels * _mouseOrigSurface->format->BytesPerPixel, + _mouseOrigSurface->pitch, (byte *)_mouseSurface->pixels, _mouseSurface->pitch, + _mouseCurState.w, _mouseCurState.h, 0, 0); + _scalerPlugin->setFactor(oldScaleFactor); } #endif