[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