[Scummvm-git-logs] scummvm master -> 3d469682fc26831a11f702b3179a167f5bc23d26

bluegr bluegr at gmail.com
Sun Mar 31 23:29:31 CEST 2019


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

Summary:
2215e0cb51 GRAPHICS: Add 32bit versions of interpolate* functions
c6ee138b74 GRAPHICS: Fix typo of qlowBits
3d57c13af0 GRAPHICS: Add dummy specializations for some interpolate* functions
0246ca8da0 GRAPHICS: Change Edge filter to use shared interpolation functions
e3357083d7 GRAPHICS: Change another interpolation function in Edge filter.
c2ddab7dd2 GRAPHICS: Fix braces in two interpolate functions
c666ecd41d GRAPHICS: Respect alpha and rgba formats in interpolation and conversion
627fbaf8a0 GRAPHICS: Return value in dummy functions
3d469682fc GRAPHICS: Add a PixelType to ColorMasks.


Commit: 2215e0cb51b1783cce07d8b590ca9015d8f4a8b0
    https://github.com/scummvm/scummvm/commit/2215e0cb51b1783cce07d8b590ca9015d8f4a8b0
Author: Eric Culp (eculperic at gmail.com)
Date: 2019-04-01T00:29:23+03:00

Commit Message:
GRAPHICS: Add 32bit versions of interpolate* functions

Changed paths:
    graphics/colormasks.h
    graphics/scaler/intern.h


diff --git a/graphics/colormasks.h b/graphics/colormasks.h
index eebfc13..4ad31a8 100644
--- a/graphics/colormasks.h
+++ b/graphics/colormasks.h
@@ -59,8 +59,8 @@ The meaning of these is masks is the following:
  To be specific: They pack the masks for two 16 bit pixels at once. The pixels
  are split into "high" and "low" bits, which are then separately interpolated
  and finally re-composed. That way, 2x2 pixels or even 4x2 pixels can
- be interpolated in one go.
-
+ be interpolated in one go. They are also included in 888 and 8888 to make
+ the same functions compatible when interpolating 2 32-bit pixels.
 */
 
 
@@ -239,7 +239,18 @@ struct ColorMasks<888> {
 		kGreenMask = ((1 << kGreenBits) - 1) << kGreenShift,
 		kBlueMask  = ((1 << kBlueBits) - 1) << kBlueShift,
 
-		kRedBlueMask = kRedMask | kBlueMask
+		kRedBlueMask = kRedMask | kBlueMask,
+
+		kLowBits    = (1 << kRedShift) | (1 << kGreenShift) | (1 << kBlueShift),
+		kLow2Bits   = (3 << kRedShift) | (3 << kGreenShift) | (3 << kBlueShift),
+		kLow3Bits   = (7 << kRedShift) | (7 << kGreenShift) | (7 << kBlueShift),
+		kLow4Bits   = (15 << kRedShift) | (15 << kGreenShift) | (15 << kBlueShift),
+
+		kLowBitsMask = kLowBits,
+		// Prevent mask from including padding byte
+		kHighBitsMask = (~kLowBits) & (kRedMask | kBlueMask | kGreenMask),
+		qLowBitsMask = kLow2Bits,
+		qHighBitsMask = (~kLowBits) & (kRedMask | kBlueMask | kGreenMask)
 	};
 };
 
@@ -263,7 +274,17 @@ struct ColorMasks<8888> {
 		kGreenMask = ((1 << kGreenBits) - 1) << kGreenShift,
 		kBlueMask  = ((1 << kBlueBits) - 1) << kBlueShift,
 
-		kRedBlueMask = kRedMask | kBlueMask
+		kRedBlueMask = kRedMask | kBlueMask,
+
+		kLowBits    = (1 << kRedShift) | (1 << kGreenShift) | (1 << kBlueShift) | (1 << kAlphaShift),
+		kLow2Bits   = (3 << kRedShift) | (3 << kGreenShift) | (3 << kBlueShift) | (3 << kAlphaShift),
+		kLow3Bits   = (7 << kRedShift) | (7 << kGreenShift) | (7 << kBlueShift) | (7 << kAlphaShift),
+		kLow4Bits   = (15 << kRedShift) | (15 << kGreenShift) | (15 << kBlueShift) | (15 << kAlphaShift),
+
+		kLowBitsMask = kLowBits,
+		kHighBitsMask = ~kLowBits,
+		qLowBitsMask = kLow2Bits,
+		qHighBitsMask = ~kLow2Bits
 	};
 };
 
diff --git a/graphics/scaler/intern.h b/graphics/scaler/intern.h
index 213b69b..8ec7249 100644
--- a/graphics/scaler/intern.h
+++ b/graphics/scaler/intern.h
@@ -31,9 +31,15 @@
  * Interpolate two 16 bit pixel *pairs* at once with equal weights 1.
  * In particular, p1 and p2 can contain two pixels each in the upper
  * and lower halves.
+ *
+ * This also works for 32 bit pixels.
  */
 template<typename ColorMask>
 static inline uint32 interpolate32_1_1(uint32 p1, uint32 p2) {
+	// Clear the low bit of each channel,
+	// divide each channel by 2,
+	// add the two pixels together,
+	// add 1 to each channel if the lowbits would have added to 2
 	return (((p1 & ColorMask::kHighBitsMask) >> 1) +
 	        ((p2 & ColorMask::kHighBitsMask) >> 1) +
 	         (p1 & p2 & ColorMask::kLowBitsMask));
@@ -43,17 +49,181 @@ static inline uint32 interpolate32_1_1(uint32 p1, uint32 p2) {
  * Interpolate two 16 bit pixel *pairs* at once with weights 3 resp. 1.
  * In particular, p1 and p2 can contain two pixels/each in the upper
  * and lower halves.
+ *
+ * This also works for 32 bit pixels.
  */
 template<typename ColorMask>
 static inline uint32 interpolate32_3_1(uint32 p1, uint32 p2) {
+	// Clear the 2 lowest bits of each channel,
+	// divide each channel by 4, multiply p1 by 3
+	// add the two pixels together,
 	uint32 x = ((p1 & ColorMask::qhighBits) >> 2) * 3 + ((p2 & ColorMask::qhighBits) >> 2);
+	// Get 2 lowest bits of each channel,
+	// multiply p1 by 3, add them together, then divide by 4
 	uint32 y = ((p1 & ColorMask::qlowBits) * 3 + (p2 & ColorMask::qlowBits)) >> 2;
 
+	// Use only the low bits of the second result to add to the first result
 	y &= ColorMask::qlowBits;
 	return x + y;
 }
 
 /**
+ * Interpolate two 32 bit pixels with weights 5 and 3 and 1, i.e., (5*p1+3*p2)/8.
+ * @see interpolate_32_3_1 for similar method
+ */
+template<typename ColorMask>
+static inline uint32 interpolate32_5_3(uint32 p1, uint32 p2) {
+	uint32 x = ((p1 & ~ColorMask::kLow3Bits) >> 3) * 5 + ((p2 & ~ColorMask::kLow3Bits) >> 3) * 3;
+	uint32 y = ((p1 & ColorMask::kLow3Bits) * 5 + (p2 & ColorMask::kLow3Bits) * 3) >> 3;
+
+	y &= ColorMask::kLow3Bits;
+	return x + y;
+}
+
+/**
+ * Interpolate two 32 bit pixels with weights 7 and 1, i.e., (7*p1+p2)/8.
+ *
+ * @see interpolate32_3_1 for similar method
+ */
+template<typename ColorMask>
+static inline uint32 interpolate32_7_1(uint32 p1, uint32 p2) {
+	uint32 x = ((p1 & ~ColorMask::kLow3Bits) >> 3) * 7 + ((p2 & ~ColorMask::kLow3Bits) >> 3);
+	uint32 y = ((p1 & ColorMask::kLow3Bits) * 7 + (p2 & ColorMask::kLow3Bits)) >> 3;
+
+	y &= ColorMask::kLow3Bits;
+	return x + y;
+}
+
+/**
+ * Interpolate three 32 bit pixels with weights 2, 1, and 1, i.e., (2*p1+p2+p3)/4.
+ *
+ * @see interpolate32_3_1 for similar method
+ */
+template<typename ColorMask>
+static inline uint32 interpolate32_2_1_1(uint32 p1, uint32 p2, uint32 p3) {
+	uint32 x = ((p1 & ColorMask::qHighBitsMask) >> 1)
+		              + ((p2 & ColorMask::qHighBitsMask) >> 2)
+		              + ((p3 & ColorMask::qHighBitsMask) >> 2);
+	uint32 y = ((p1 & ColorMask::qLowBitsMask) <<  1)
+			          +  (p2 & ColorMask::qLowBitsMask)
+			          +  (p2 & ColorMask::qLowBitsMask);
+	y >>= 2;
+	y &= ColorMask::qLowBits;
+	return x + y;
+}
+
+/**
+ * Interpolate three 32 bit pixels with weights 5, 2, and 1, i.e., (5*p1+2*p2+p3)/8.
+ *
+ * @see interpolate32_3_1 for similar method
+ */
+template<typename ColorMask>
+static inline uint32 interpolate32_5_2_1(uint32 p1, uint32 p2, uint32 p3) {
+	uint32 x = ((p1 & ~ColorMask::kLow3Bits) >> 3) * 5
+		              + ((p2 & ~ColorMask::kLow3Bits) >> 3) * 2
+		              + ((p3 & ~ColorMask::kLow3Bits) >> 3);
+	uint32 y = (p1 & ColorMask::kLow3Bits) * 5
+			          + (p2 & ColorMask::kLow3Bits) * 2
+			          + (p2 & ColorMask::kLow3Bits);
+	y >>= 3;
+	y &= ColorMask::kLow3Bits;
+	return x + y;
+}
+
+/**
+ * Interpolate three 32 bit pixels with weights 6, 1, and 1, i.e., (6*p1+p2+p3)/8.
+ *
+ * @see interpolate32_3_1 for similar method
+ */
+template<typename ColorMask>
+static inline uint32 interpolate32_6_1_1(uint32 p1, uint32 p2, uint32 p3) {
+	uint32 x = ((p1 & ~ColorMask::kLow3Bits) >> 3) * 6
+		              + ((p2 & ~ColorMask::kLow3Bits) >> 3)
+		              + ((p3 & ~ColorMask::kLow3Bits) >> 3);
+	uint32 y = (p1 & ColorMask::kLow3Bits) * 6
+			          + (p2 & ColorMask::kLow3Bits)
+			          + (p2 & ColorMask::kLow3Bits);
+	y >>= 3;
+	y &= ColorMask::kLow3Bits;
+	return x + y;
+}
+
+/**
+ * Interpolate three 32 bit pixels with weights 2, 3, and 3, i.e., (2*p1+3*(p2+p3))/8.
+ *
+ * @see interpolate32_3_1 for similar method
+ */
+template<typename ColorMask>
+static inline uint32 interpolate32_2_3_3(uint32 p1, uint32 p2, uint32 p3) {
+	uint32 x = ((p1 & ~ColorMask::kLow3Bits) >> 2)
+		              + (((p2 & ~ColorMask::kLow3Bits) >> 3)
+		              + ((p3 & ~ColorMask::kLow3Bits) >> 3)) * 3;
+	uint32 y = (p1 & ColorMask::kLow3Bits) * 2
+			          + ((p2 & ColorMask::kLow3Bits)
+			          + (p2 & ColorMask::kLow3Bits)) * 3;
+	y >>= 3;
+	y &= ColorMask::kLow3Bits;
+	return x + y;
+}
+
+/**
+ * Interpolate three 32 bit pixels with weights 2, 7, and 7, i.e., (2*p1+7*(p2+p3))/16.
+ *
+ * @see interpolate32_3_1 for similar method
+ */
+template<typename ColorMask>
+static inline uint32 interpolate32_2_7_7(uint32 p1, uint32 p2, uint32 p3) {
+	uint32 x = ((p1 & ~ColorMask::kLow4Bits) >> 3)
+		              + (((p2 & ~ColorMask::kLow4Bits) >> 4)
+		              +  ((p3 & ~ColorMask::kLow4Bits) >> 4)) * 7;
+	uint32 y = (p1 & ColorMask::kLow4Bits) * 2
+			          + ((p2 & ColorMask::kLow4Bits)
+			          + (p2 & ColorMask::kLow4Bits)) * 7;
+	y >>= 4;
+	y &= ColorMask::kLow4Bits;
+	return x + y;
+}
+
+/**
+ * Interpolate three 32 bit pixels with weights 14, 1, and 1, i.e., (14*p1+p2+p3)/16.
+ *
+ * @see interpolate32_3_1 for similar method
+ */
+template<typename ColorMask>
+static inline uint32 interpolate32_14_1_1(uint32 p1, uint32 p2, uint32 p3) {
+	uint32 x = ((p1 & ~ColorMask::kLow4Bits) >> 4) * 14
+		              + ((p2 & ~ColorMask::kLow4Bits) >> 4)
+		              + ((p3 & ~ColorMask::kLow4Bits) >> 4);
+	uint32 y = (p1 & ColorMask::kLow4Bits) * 14;
+			          + (p2 & ColorMask::kLow4Bits)
+			          + (p2 & ColorMask::kLow4Bits);
+	y >>= 4;
+	y &= ColorMask::kLow4Bits;
+	return x + y;
+}
+
+/**
+ * Interpolate four 32 bit pixels with weights 1, 1, 1, and 1, i.e., (p1+p2+p3+p4)/4.
+ *
+ * @see interpolate32_3_1 for similar method
+ */
+template<typename ColorMask>
+static inline uint32 interpolate32_1_1_1_1(uint32 p1, uint32 p2, uint32 p3, uint32 p4) {
+	uint32 x = ((p1 & ~ColorMask::kLow2Bits) >> 2)
+		              + ((p2 & ~ColorMask::kLow2Bits) >> 2)
+		              + ((p3 & ~ColorMask::kLow2Bits) >> 2)
+		              + ((p4 & ~ColorMask::kLow2Bits) >> 2);
+	uint32 y = (p1 & ColorMask::kLow2Bits)
+			          + (p2 & ColorMask::kLow2Bits)
+			          + (p3 & ColorMask::kLow2Bits)
+			          + (p4 & ColorMask::kLow2Bits);
+	y >>= 2;
+	y &= ColorMask::kLow2Bits;
+	return x + y;
+}
+
+
+/**
  * Interpolate two 16 bit pixels with weights 1 and 1, i.e., (p1+p2)/2.
  * See <http://www.slack.net/~ant/info/rgb_mixing.html> for details on how this works.
  */


Commit: c6ee138b74cf738d3aeabaa2176355ece81712f8
    https://github.com/scummvm/scummvm/commit/c6ee138b74cf738d3aeabaa2176355ece81712f8
Author: Eric Culp (eculperic at gmail.com)
Date: 2019-04-01T00:29:23+03:00

Commit Message:
GRAPHICS: Fix typo of qlowBits

Changed paths:
    graphics/colormasks.h


diff --git a/graphics/colormasks.h b/graphics/colormasks.h
index 4ad31a8..41d73b4 100644
--- a/graphics/colormasks.h
+++ b/graphics/colormasks.h
@@ -249,8 +249,8 @@ struct ColorMasks<888> {
 		kLowBitsMask = kLowBits,
 		// Prevent mask from including padding byte
 		kHighBitsMask = (~kLowBits) & (kRedMask | kBlueMask | kGreenMask),
-		qLowBitsMask = kLow2Bits,
-		qHighBitsMask = (~kLowBits) & (kRedMask | kBlueMask | kGreenMask)
+		qlowBits = kLow2Bits,
+		qhighBits = (~kLowBits) & (kRedMask | kBlueMask | kGreenMask)
 	};
 };
 
@@ -283,8 +283,8 @@ struct ColorMasks<8888> {
 
 		kLowBitsMask = kLowBits,
 		kHighBitsMask = ~kLowBits,
-		qLowBitsMask = kLow2Bits,
-		qHighBitsMask = ~kLow2Bits
+		qlowBits = kLow2Bits,
+		qhighBits = ~kLow2Bits
 	};
 };
 


Commit: 3d57c13af02dcd054c625f2adbd4347e20516814
    https://github.com/scummvm/scummvm/commit/3d57c13af02dcd054c625f2adbd4347e20516814
Author: Eric Culp (eculperic at gmail.com)
Date: 2019-04-01T00:29:23+03:00

Commit Message:
GRAPHICS: Add dummy specializations for some interpolate* functions

They use ColorMask values not present in 2-byte ColorMasks. Since they
should never be used on 2-byte pixel data, the dummy implementations
assert(0) and should be removed by any optimizing compiler since no
code path can ever reach them.

Changed paths:
    graphics/scaler/intern.h


diff --git a/graphics/scaler/intern.h b/graphics/scaler/intern.h
index 8ec7249..4a83280 100644
--- a/graphics/scaler/intern.h
+++ b/graphics/scaler/intern.h
@@ -101,14 +101,14 @@ static inline uint32 interpolate32_7_1(uint32 p1, uint32 p2) {
  */
 template<typename ColorMask>
 static inline uint32 interpolate32_2_1_1(uint32 p1, uint32 p2, uint32 p3) {
-	uint32 x = ((p1 & ColorMask::qHighBitsMask) >> 1)
-		              + ((p2 & ColorMask::qHighBitsMask) >> 2)
-		              + ((p3 & ColorMask::qHighBitsMask) >> 2);
-	uint32 y = ((p1 & ColorMask::qLowBitsMask) <<  1)
-			          +  (p2 & ColorMask::qLowBitsMask)
-			          +  (p2 & ColorMask::qLowBitsMask);
+	uint32 x = ((p1 & ColorMask::qhighBits) >> 1)
+		              + ((p2 & ColorMask::qhighBits) >> 2)
+		              + ((p3 & ColorMask::qhighBits) >> 2);
+	uint32 y = ((p1 & ColorMask::qlowBits) <<  1)
+			          +  (p2 & ColorMask::qlowBits)
+			          +  (p2 & ColorMask::qlowBits);
 	y >>= 2;
-	y &= ColorMask::qLowBits;
+	y &= ColorMask::qlowBits;
 	return x + y;
 }
 
@@ -172,7 +172,7 @@ static inline uint32 interpolate32_2_3_3(uint32 p1, uint32 p2, uint32 p3) {
  * @see interpolate32_3_1 for similar method
  */
 template<typename ColorMask>
-static inline uint32 interpolate32_2_7_7(uint32 p1, uint32 p2, uint32 p3) {
+inline uint32 interpolate32_2_7_7(uint32 p1, uint32 p2, uint32 p3) {
 	uint32 x = ((p1 & ~ColorMask::kLow4Bits) >> 3)
 		              + (((p2 & ~ColorMask::kLow4Bits) >> 4)
 		              +  ((p3 & ~ColorMask::kLow4Bits) >> 4)) * 7;
@@ -184,17 +184,28 @@ static inline uint32 interpolate32_2_7_7(uint32 p1, uint32 p2, uint32 p3) {
 	return x + y;
 }
 
+// Dummy specializations.
+template<>
+inline uint32 interpolate32_2_7_7<Graphics::ColorMasks<555> >(uint32 p1, uint32 p2, uint32 p3) {
+	assert(0);
+}
+
+template<>
+inline uint32 interpolate32_2_7_7<Graphics::ColorMasks<565> >(uint32 p1, uint32 p2, uint32 p3) {
+	assert(0);
+}
+
 /**
  * Interpolate three 32 bit pixels with weights 14, 1, and 1, i.e., (14*p1+p2+p3)/16.
  *
  * @see interpolate32_3_1 for similar method
  */
 template<typename ColorMask>
-static inline uint32 interpolate32_14_1_1(uint32 p1, uint32 p2, uint32 p3) {
+inline uint32 interpolate32_14_1_1(uint32 p1, uint32 p2, uint32 p3) {
 	uint32 x = ((p1 & ~ColorMask::kLow4Bits) >> 4) * 14
 		              + ((p2 & ~ColorMask::kLow4Bits) >> 4)
 		              + ((p3 & ~ColorMask::kLow4Bits) >> 4);
-	uint32 y = (p1 & ColorMask::kLow4Bits) * 14;
+	uint32 y = (p1 & ColorMask::kLow4Bits) * 14
 			          + (p2 & ColorMask::kLow4Bits)
 			          + (p2 & ColorMask::kLow4Bits);
 	y >>= 4;
@@ -202,6 +213,18 @@ static inline uint32 interpolate32_14_1_1(uint32 p1, uint32 p2, uint32 p3) {
 	return x + y;
 }
 
+
+// Dummy specializations.
+template<>
+inline uint32 interpolate32_14_1_1<Graphics::ColorMasks<555> >(uint32 p1, uint32 p2, uint32 p3) {
+	assert(0);
+}
+
+template<>
+inline uint32 interpolate32_14_1_1<Graphics::ColorMasks<565> >(uint32 p1, uint32 p2, uint32 p3) {
+	assert(0);
+}
+
 /**
  * Interpolate four 32 bit pixels with weights 1, 1, 1, and 1, i.e., (p1+p2+p3+p4)/4.
  *


Commit: 0246ca8da096bac291612d636985878985e350b7
    https://github.com/scummvm/scummvm/commit/0246ca8da096bac291612d636985878985e350b7
Author: Eric Culp (eculperic at gmail.com)
Date: 2019-04-01T00:29:23+03:00

Commit Message:
GRAPHICS: Change Edge filter to use shared interpolation functions

Changed paths:
    graphics/scaler/intern.h


diff --git a/graphics/scaler/intern.h b/graphics/scaler/intern.h
index 4a83280..b1219fb 100644
--- a/graphics/scaler/intern.h
+++ b/graphics/scaler/intern.h
@@ -226,6 +226,33 @@ inline uint32 interpolate32_14_1_1<Graphics::ColorMasks<565> >(uint32 p1, uint32
 }
 
 /**
+ * Interpolate three 32 bit pixels with weights 1, 1, and 1, i.e., (p1+p2+p3)/3.
+ */
+
+template<typename ColorMask>
+uint32 interpolate32_1_1_1(uint32 pixel1, uint32 pixel2, uint32 pixel3)
+{
+	uint32 rsum, gsum, bsum;
+
+	rsum =  (pixel1 & ColorMask::kRedMask);
+	rsum += (pixel2 & ColorMask::kRedMask);
+	rsum += (pixel3 & ColorMask::kRedMask);
+	rsum /= 3;
+
+	gsum =  (pixel1 & ColorMask::kGreenMask);
+	gsum += (pixel2 & ColorMask::kGreenMask);
+	gsum += (pixel3 & ColorMask::kGreenMask);
+	gsum /= 3;
+
+	bsum =  (pixel1 & ColorMask::kBlueMask);
+	bsum += (pixel2 & ColorMask::kBlueMask);
+	bsum += (pixel3 & ColorMask::kBlueMask);
+	bsum /= 3;
+
+	return (rsum & ColorMask::kRedMask) | (gsum & ColorMask::kGreenMask) | (bsum & ColorMask::kBlueMask);
+}
+
+/**
  * Interpolate four 32 bit pixels with weights 1, 1, 1, and 1, i.e., (p1+p2+p3+p4)/4.
  *
  * @see interpolate32_3_1 for similar method
@@ -361,6 +388,33 @@ static inline unsigned interpolate16_14_1_1(unsigned p1, unsigned p2, unsigned p
 }
 
 /**
+ * Interpolate three 16 bit pixels with weights 1, 1, and 1, i.e., (p1+p2+p3)/3.
+ */
+template<typename ColorMask>
+uint16 interpolate16_1_1_1(uint16 pixel1, uint16 pixel2, uint16 pixel3)
+{
+	uint32 rsum;
+	uint16 gsum, bsum;
+
+	rsum =  (pixel1 & ColorMask::kRedMask);
+	rsum += (pixel2 & ColorMask::kRedMask);
+	rsum += (pixel3 & ColorMask::kRedMask);
+	rsum /= 3;
+
+	gsum =  (pixel1 & ColorMask::kGreenMask);
+	gsum += (pixel2 & ColorMask::kGreenMask);
+	gsum += (pixel3 & ColorMask::kGreenMask);
+	gsum /= 3;
+
+	bsum =  (pixel1 & ColorMask::kBlueMask);
+	bsum += (pixel2 & ColorMask::kBlueMask);
+	bsum += (pixel3 & ColorMask::kBlueMask);
+	bsum /= 3;
+
+	return (rsum & ColorMask::kRedMask) | (gsum & ColorMask::kGreenMask) | (bsum & ColorMask::kBlueMask);
+}
+
+/**
  * Interpolate four 16 bit pixels with weights 1, 1, 1, and 1, i.e., (p1+p2+p3+p4)/4.
  */
 template<typename ColorMask>


Commit: e3357083d75c4a02da936b2fae71d5240c7db4a1
    https://github.com/scummvm/scummvm/commit/e3357083d75c4a02da936b2fae71d5240c7db4a1
Author: Eric Culp (eculperic at gmail.com)
Date: 2019-04-01T00:29:23+03:00

Commit Message:
GRAPHICS: Change another interpolation function in Edge filter.

A 2 to 1 interpolation was causing errors. It is fixed, renamed, and
moved to the common interpolation file.

Changed paths:
    graphics/scaler/intern.h


diff --git a/graphics/scaler/intern.h b/graphics/scaler/intern.h
index b1219fb..72f3232 100644
--- a/graphics/scaler/intern.h
+++ b/graphics/scaler/intern.h
@@ -68,6 +68,29 @@ static inline uint32 interpolate32_3_1(uint32 p1, uint32 p2) {
 }
 
 /**
+ * Interpolate two 32 bit pixels with weights 2 and 1 and 1, i.e., (2*p1+p2)/3.
+ */
+template<typename ColorMask>
+uint32 interpolate32_2_1(uint32 pixel1, uint32 pixel2)
+{
+	uint32 rsum, gsum, bsum;
+
+	rsum =  (pixel1 & ColorMask::kRedMask) << 1;
+	rsum += (pixel2 & ColorMask::kRedMask);
+	rsum /= 3;
+
+	gsum =  (pixel1 & ColorMask::kGreenMask) << 1;
+	gsum += (pixel2 & ColorMask::kGreenMask);
+	gsum /= 3;
+
+	bsum =  (pixel1 & ColorMask::kBlueMask) << 1;
+	bsum += (pixel2 & ColorMask::kBlueMask);
+	bsum /= 3;
+
+	return (rsum & ColorMask::kRedMask) | (gsum & ColorMask::kGreenMask) | (bsum & ColorMask::kBlueMask);
+}
+
+/**
  * Interpolate two 32 bit pixels with weights 5 and 3 and 1, i.e., (5*p1+3*p2)/8.
  * @see interpolate_32_3_1 for similar method
  */
@@ -294,6 +317,30 @@ static inline unsigned interpolate16_3_1(unsigned p1, unsigned p2) {
 }
 
 /**
+ * Interpolate two 16 bit pixels with weights 2 and 1, i.e., (2*p1+p2)/3.
+ */
+template<typename ColorMask>
+uint16 interpolate16_2_1(uint16 pixel1, uint16 pixel2)
+{
+	uint32 rsum;
+	uint16 gsum, bsum;
+
+	rsum =  (pixel1 & ColorMask::kRedMask) << 1;
+	rsum += (pixel2 & ColorMask::kRedMask);
+	rsum /= 3;
+
+	gsum =  (pixel1 & ColorMask::kGreenMask) << 1;
+	gsum += (pixel2 & ColorMask::kGreenMask);
+	gsum /= 3;
+
+	bsum =  (pixel1 & ColorMask::kBlueMask) << 1;
+	bsum += (pixel2 & ColorMask::kBlueMask);
+	bsum /= 3;
+
+	return (rsum & ColorMask::kRedMask) | (gsum & ColorMask::kGreenMask) | (bsum & ColorMask::kBlueMask);
+}
+
+/**
  * Interpolate two 16 bit pixels with weights 5 and 3 and 1, i.e., (5*p1+3*p2)/8.
  */
 template<typename ColorMask>


Commit: c2ddab7dd2f7778bac14be2479b9ca5ea995eca0
    https://github.com/scummvm/scummvm/commit/c2ddab7dd2f7778bac14be2479b9ca5ea995eca0
Author: Eric Culp (eculperic at gmail.com)
Date: 2019-04-01T00:29:23+03:00

Commit Message:
GRAPHICS: Fix braces in two interpolate functions

Changed paths:
    graphics/scaler/intern.h


diff --git a/graphics/scaler/intern.h b/graphics/scaler/intern.h
index 72f3232..60f88eb 100644
--- a/graphics/scaler/intern.h
+++ b/graphics/scaler/intern.h
@@ -71,8 +71,7 @@ static inline uint32 interpolate32_3_1(uint32 p1, uint32 p2) {
  * Interpolate two 32 bit pixels with weights 2 and 1 and 1, i.e., (2*p1+p2)/3.
  */
 template<typename ColorMask>
-uint32 interpolate32_2_1(uint32 pixel1, uint32 pixel2)
-{
+uint32 interpolate32_2_1(uint32 pixel1, uint32 pixel2) {
 	uint32 rsum, gsum, bsum;
 
 	rsum =  (pixel1 & ColorMask::kRedMask) << 1;
@@ -320,8 +319,7 @@ static inline unsigned interpolate16_3_1(unsigned p1, unsigned p2) {
  * Interpolate two 16 bit pixels with weights 2 and 1, i.e., (2*p1+p2)/3.
  */
 template<typename ColorMask>
-uint16 interpolate16_2_1(uint16 pixel1, uint16 pixel2)
-{
+uint16 interpolate16_2_1(uint16 pixel1, uint16 pixel2) {
 	uint32 rsum;
 	uint16 gsum, bsum;
 


Commit: c666ecd41dc24554e10bb1d2c48276c5685c8cb3
    https://github.com/scummvm/scummvm/commit/c666ecd41dc24554e10bb1d2c48276c5685c8cb3
Author: Eric Culp (eculperic at gmail.com)
Date: 2019-04-01T00:29:23+03:00

Commit Message:
GRAPHICS: Respect alpha and rgba formats in interpolation and conversion

Changed paths:
    graphics/scaler/intern.h


diff --git a/graphics/scaler/intern.h b/graphics/scaler/intern.h
index 60f88eb..d32dd29 100644
--- a/graphics/scaler/intern.h
+++ b/graphics/scaler/intern.h
@@ -72,21 +72,29 @@ static inline uint32 interpolate32_3_1(uint32 p1, uint32 p2) {
  */
 template<typename ColorMask>
 uint32 interpolate32_2_1(uint32 pixel1, uint32 pixel2) {
-	uint32 rsum, gsum, bsum;
+	uint32 rsum, gsum, bsum, asum;
 
-	rsum =  (pixel1 & ColorMask::kRedMask) << 1;
-	rsum += (pixel2 & ColorMask::kRedMask);
+	rsum =  ((pixel1 & ColorMask::kRedMask) >> ColorMask::kRedShift) << 1;
+	rsum += ((pixel2 & ColorMask::kRedMask) >> ColorMask::kRedShift);
 	rsum /= 3;
+	rsum <<= ColorMask::kRedShift;
 
-	gsum =  (pixel1 & ColorMask::kGreenMask) << 1;
-	gsum += (pixel2 & ColorMask::kGreenMask);
+	gsum =  ((pixel1 & ColorMask::kGreenMask) >> ColorMask::kGreenShift) << 1;
+	gsum += ((pixel2 & ColorMask::kGreenMask) >> ColorMask::kGreenShift);
 	gsum /= 3;
+	gsum <<= ColorMask::kGreenShift;
 
-	bsum =  (pixel1 & ColorMask::kBlueMask) << 1;
-	bsum += (pixel2 & ColorMask::kBlueMask);
+	bsum =  ((pixel1 & ColorMask::kBlueMask) >> ColorMask::kBlueShift) << 1;
+	bsum += ((pixel2 & ColorMask::kBlueMask) >> ColorMask::kBlueShift);
 	bsum /= 3;
+	bsum <<= ColorMask::kBlueShift;
 
-	return (rsum & ColorMask::kRedMask) | (gsum & ColorMask::kGreenMask) | (bsum & ColorMask::kBlueMask);
+	asum =  ((pixel1 & ColorMask::kAlphaMask) >> ColorMask::kAlphaShift) << 1;
+	asum += ((pixel2 & ColorMask::kAlphaMask) >> ColorMask::kAlphaShift);
+	asum /= 3;
+	asum <<= ColorMask::kAlphaShift;
+
+	return (rsum & ColorMask::kRedMask) | (gsum & ColorMask::kGreenMask) | (bsum & ColorMask::kBlueMask) | (asum & ColorMask::kAlphaMask);
 }
 
 /**
@@ -252,24 +260,26 @@ inline uint32 interpolate32_14_1_1<Graphics::ColorMasks<565> >(uint32 p1, uint32
  */
 
 template<typename ColorMask>
-uint32 interpolate32_1_1_1(uint32 pixel1, uint32 pixel2, uint32 pixel3)
-{
+uint32 interpolate32_1_1_1(uint32 pixel1, uint32 pixel2, uint32 pixel3) {
 	uint32 rsum, gsum, bsum;
 
-	rsum =  (pixel1 & ColorMask::kRedMask);
-	rsum += (pixel2 & ColorMask::kRedMask);
-	rsum += (pixel3 & ColorMask::kRedMask);
+	rsum =  ((pixel1 & ColorMask::kRedMask) >> ColorMask::kRedShift);
+	rsum += ((pixel2 & ColorMask::kRedMask) >> ColorMask::kRedShift);
+	rsum += ((pixel3 & ColorMask::kRedMask) >> ColorMask::kRedShift);
 	rsum /= 3;
+	rsum <<= ColorMask::kRedShift;
 
-	gsum =  (pixel1 & ColorMask::kGreenMask);
-	gsum += (pixel2 & ColorMask::kGreenMask);
-	gsum += (pixel3 & ColorMask::kGreenMask);
+	gsum =  ((pixel1 & ColorMask::kGreenMask) >> ColorMask::kGreenShift);
+	gsum += ((pixel2 & ColorMask::kGreenMask) >> ColorMask::kGreenShift);
+	gsum += ((pixel3 & ColorMask::kGreenMask) >> ColorMask::kGreenShift);
 	gsum /= 3;
+	gsum <<= ColorMask::kGreenShift;
 
-	bsum =  (pixel1 & ColorMask::kBlueMask);
-	bsum += (pixel2 & ColorMask::kBlueMask);
-	bsum += (pixel3 & ColorMask::kBlueMask);
+	bsum =  ((pixel1 & ColorMask::kBlueMask) >> ColorMask::kBlueShift);
+	bsum += ((pixel2 & ColorMask::kBlueMask) >> ColorMask::kBlueShift);
+	bsum += ((pixel3 & ColorMask::kBlueMask) >> ColorMask::kBlueShift);
 	bsum /= 3;
+	bsum <<= ColorMask::kBlueShift;
 
 	return (rsum & ColorMask::kRedMask) | (gsum & ColorMask::kGreenMask) | (bsum & ColorMask::kBlueMask);
 }


Commit: 627fbaf8a04b08cd99b3ffd333e6e74f126485e9
    https://github.com/scummvm/scummvm/commit/627fbaf8a04b08cd99b3ffd333e6e74f126485e9
Author: Eric Culp (eculperic at gmail.com)
Date: 2019-04-01T00:29:23+03:00

Commit Message:
GRAPHICS: Return value in dummy functions

Changed paths:
    graphics/scaler/intern.h


diff --git a/graphics/scaler/intern.h b/graphics/scaler/intern.h
index d32dd29..dbe68a8 100644
--- a/graphics/scaler/intern.h
+++ b/graphics/scaler/intern.h
@@ -218,11 +218,13 @@ inline uint32 interpolate32_2_7_7(uint32 p1, uint32 p2, uint32 p3) {
 template<>
 inline uint32 interpolate32_2_7_7<Graphics::ColorMasks<555> >(uint32 p1, uint32 p2, uint32 p3) {
 	assert(0);
+	return 0;
 }
 
 template<>
 inline uint32 interpolate32_2_7_7<Graphics::ColorMasks<565> >(uint32 p1, uint32 p2, uint32 p3) {
 	assert(0);
+	return 0;
 }
 
 /**
@@ -248,11 +250,13 @@ inline uint32 interpolate32_14_1_1(uint32 p1, uint32 p2, uint32 p3) {
 template<>
 inline uint32 interpolate32_14_1_1<Graphics::ColorMasks<555> >(uint32 p1, uint32 p2, uint32 p3) {
 	assert(0);
+	return 0;
 }
 
 template<>
 inline uint32 interpolate32_14_1_1<Graphics::ColorMasks<565> >(uint32 p1, uint32 p2, uint32 p3) {
 	assert(0);
+	return 0;
 }
 
 /**


Commit: 3d469682fc26831a11f702b3179a167f5bc23d26
    https://github.com/scummvm/scummvm/commit/3d469682fc26831a11f702b3179a167f5bc23d26
Author: Johannes Schickel (lordhoto at scummvm.org)
Date: 2019-04-01T00:29:23+03:00

Commit Message:
GRAPHICS: Add a PixelType to ColorMasks.

This PixelType is the underlying type (uint16/uint32) of a pixel specified by
ColorMasks.

Changed paths:
    graphics/colormasks.h


diff --git a/graphics/colormasks.h b/graphics/colormasks.h
index 41d73b4..27e6b16 100644
--- a/graphics/colormasks.h
+++ b/graphics/colormasks.h
@@ -96,6 +96,8 @@ struct ColorMasks<565> {
 		kLow2Bits   = (3 << kRedShift) | (3 << kGreenShift) | (3 << kBlueShift),
 		kLow3Bits   = (7 << kRedShift) | (7 << kGreenShift) | (7 << kBlueShift)
 	};
+
+	typedef uint16 PixelType;
 };
 
 template<>
@@ -138,6 +140,8 @@ struct ColorMasks<555> {
 		kLow2Bits   = (3 << kRedShift) | (3 << kGreenShift) | (3 << kBlueShift),
 		kLow3Bits   = (7 << kRedShift) | (7 << kGreenShift) | (7 << kBlueShift)
 	};
+
+	typedef uint16 PixelType;
 };
 
 template<>
@@ -162,6 +166,8 @@ struct ColorMasks<1555> {
 
 		kRedBlueMask = kRedMask | kBlueMask
 	};
+
+	typedef uint16 PixelType;
 };
 
 template<>
@@ -186,6 +192,8 @@ struct ColorMasks<5551> {
 
 		kRedBlueMask = kRedMask | kBlueMask
 	};
+
+	typedef uint16 PixelType;
 };
 
 template<>
@@ -217,6 +225,8 @@ struct ColorMasks<4444> {
 
 		kRedBlueMask = kRedMask | kBlueMask
 	};
+
+	typedef uint16 PixelType;
 };
 
 template<>
@@ -252,6 +262,8 @@ struct ColorMasks<888> {
 		qlowBits = kLow2Bits,
 		qhighBits = (~kLowBits) & (kRedMask | kBlueMask | kGreenMask)
 	};
+
+	typedef uint32 PixelType;
 };
 
 template<>
@@ -286,6 +298,8 @@ struct ColorMasks<8888> {
 		qlowBits = kLow2Bits,
 		qhighBits = ~kLow2Bits
 	};
+
+	typedef uint32 PixelType;
 };
 
 #ifdef __WII__
@@ -312,6 +326,8 @@ struct ColorMasks<3444> {
 
 		kRedBlueMask = kRedMask | kBlueMask
 	};
+
+	typedef uint16 PixelType;
 };
 #endif
 





More information about the Scummvm-git-logs mailing list