aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--graphics/scaler/intern.h43
1 files changed, 33 insertions, 10 deletions
diff --git a/graphics/scaler/intern.h b/graphics/scaler/intern.h
index 8ec7249263..4a832801ea 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.
*