[Scummvm-git-logs] scummvm master -> f3486a162de5661bf11711a3ee6e7f56871554ff

bluegr noreply at scummvm.org
Fri Dec 29 16:00:58 UTC 2023


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
f3486a162d GRAPHICS: Add fast paths for scaleBlit when dstW == srcW


Commit: f3486a162de5661bf11711a3ee6e7f56871554ff
    https://github.com/scummvm/scummvm/commit/f3486a162de5661bf11711a3ee6e7f56871554ff
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2023-12-29T18:00:54+02:00

Commit Message:
GRAPHICS: Add fast paths for scaleBlit when dstW == srcW

Changed paths:
    graphics/blit/blit-scale.cpp


diff --git a/graphics/blit/blit-scale.cpp b/graphics/blit/blit-scale.cpp
index c58593be505..45e7223d2f9 100644
--- a/graphics/blit/blit-scale.cpp
+++ b/graphics/blit/blit-scale.cpp
@@ -35,12 +35,31 @@ namespace Graphics {
 
 namespace {
 
+static void scaleVertical(byte *dst, const byte *src,
+                          const uint dstPitch, const uint srcPitch,
+                          const uint w, const uint dstH, const uint srcH,
+                          const byte flip, const uint bytesPerPixel) {
+	const bool flipy = flip & FLIP_V;
+
+	const int dstIncY = (flipy ? -static_cast<int>(dstPitch) : static_cast<int>(dstPitch));
+
+	if (flipy) {
+		dst += (dstH - 1) * dstPitch;
+	}
+
+	for (uint y = 0; y < dstH; y++) {
+		const byte *srcP = src + ((y * srcH) / dstH) * srcPitch;
+		memcpy(dst, srcP, w * bytesPerPixel);
+		dst += dstIncY;
+	}
+}
+
 template <typename Size>
-void scaleNN(byte *dst, const byte *src,
+static void scaleNN(byte *dst, const byte *src,
 			   const uint dstPitch, const uint srcPitch,
 			   const uint dstW, const uint dstH,
 			   const uint srcW, const uint srcH,
-			   int *scaleCacheX, const byte flip) {
+			   const byte flip) {
 	const bool flipx = flip & FLIP_H;
 	const bool flipy = flip & FLIP_V;
 
@@ -55,6 +74,11 @@ void scaleNN(byte *dst, const byte *src,
 		dst += (dstH - 1) * dstPitch;
 	}
 
+	int *scaleCacheX = new int[dstW];
+	for (uint x = 0; x < dstW; x++) {
+		scaleCacheX[x] = (x * srcW) / dstW;
+	}
+
 	for (uint y = 0; y < dstH; y++) {
 		const Size *srcP = (const Size *)(src + ((y * srcH) / dstH) * srcPitch);
 		Size *dst1 = (Size *)dst;
@@ -65,6 +89,8 @@ void scaleNN(byte *dst, const byte *src,
 		}
 		dst += dstIncY;
 	}
+
+	delete[] scaleCacheX;
 }
 
 } // End of anonymous namespace
@@ -75,30 +101,29 @@ bool scaleBlit(byte *dst, const byte *src,
 			   const uint srcW, const uint srcH,
 			   const Graphics::PixelFormat &fmt,
 						   const byte flip) {
-
-	int *scaleCacheX = new int[dstW];
-	for (uint x = 0; x < dstW; x++) {
-		scaleCacheX[x] = (x * srcW) / dstW;
+	if (dstW == srcW && !(flip & FLIP_H)) {
+		if (dstH == srcH && !(flip & FLIP_V))
+			copyBlit(dst, src, dstPitch, srcPitch, dstW, dstH, fmt.bytesPerPixel);
+		else
+			scaleVertical(dst, src, dstPitch, srcPitch, dstW, dstH, srcH, flip, fmt.bytesPerPixel);
+		return true;
 	}
 
 	switch (fmt.bytesPerPixel) {
 	case 1:
-		scaleNN<uint8>(dst, src, dstPitch, srcPitch, dstW,  dstH, srcW, srcH, scaleCacheX, flip);
-		break;
+		scaleNN<uint8>(dst, src, dstPitch, srcPitch, dstW,  dstH, srcW, srcH, flip);
+		return true;
 	case 2:
-		scaleNN<uint16>(dst, src, dstPitch, srcPitch, dstW,  dstH, srcW, srcH, scaleCacheX, flip);
-		break;
+		scaleNN<uint16>(dst, src, dstPitch, srcPitch, dstW,  dstH, srcW, srcH, flip);
+		return true;
 	case 4:
-		scaleNN<uint32>(dst, src, dstPitch, srcPitch, dstW,  dstH, srcW, srcH, scaleCacheX, flip);
-		break;
+		scaleNN<uint32>(dst, src, dstPitch, srcPitch, dstW,  dstH, srcW, srcH, flip);
+		return true;
 	default:
-		delete[] scaleCacheX;
-		return false;
+		break;
 	}
 
-	delete[] scaleCacheX;
-
-	return true;
+	return false;
 }
 
 /*




More information about the Scummvm-git-logs mailing list