OLD | NEW |
1 #include "Test.h" | 1 #include "Test.h" |
2 #include "SkColor.h" | 2 #include "SkColor.h" |
3 | 3 |
4 #define ASSERT(x) REPORTER_ASSERT(r, x) | 4 #define ASSERT(x) REPORTER_ASSERT(r, x) |
5 | 5 |
| 6 static uint8_t double_to_u8(double d) { |
| 7 SkASSERT(d >= 0); |
| 8 SkASSERT(d < 256); |
| 9 return uint8_t(d); |
| 10 } |
| 11 |
6 // All algorithms we're testing have this interface. | 12 // All algorithms we're testing have this interface. |
7 // We want a single channel blend, src over dst, assuming src is premultiplied b
y srcAlpha. | 13 // We want a single channel blend, src over dst, assuming src is premultiplied b
y srcAlpha. |
8 typedef uint8_t(*Blend)(uint8_t dst, uint8_t src, uint8_t srcAlpha); | 14 typedef uint8_t(*Blend)(uint8_t dst, uint8_t src, uint8_t srcAlpha); |
9 | 15 |
10 // This is our golden algorithm. | 16 // This is our golden algorithm. |
11 static uint8_t blend_double_round(uint8_t dst, uint8_t src, uint8_t srcAlpha) { | 17 static uint8_t blend_double_round(uint8_t dst, uint8_t src, uint8_t srcAlpha) { |
12 SkASSERT(src <= srcAlpha); | 18 SkASSERT(src <= srcAlpha); |
13 return SkToU8(0.5 + src + dst * (255.0 - srcAlpha) / 255.0); | 19 return double_to_u8(0.5 + src + dst * (255.0 - srcAlpha) / 255.0); |
14 } | 20 } |
15 | 21 |
16 static uint8_t abs_diff(uint8_t a, uint8_t b) { | 22 static uint8_t abs_diff(uint8_t a, uint8_t b) { |
17 const int diff = a - b; | 23 const int diff = a - b; |
18 return diff > 0 ? diff : -diff; | 24 return diff > 0 ? diff : -diff; |
19 } | 25 } |
20 | 26 |
21 static void test(skiatest::Reporter* r, int maxDiff, Blend algorithm, | 27 static void test(skiatest::Reporter* r, int maxDiff, Blend algorithm, |
22 uint8_t dst, uint8_t src, uint8_t alpha) { | 28 uint8_t dst, uint8_t src, uint8_t alpha) { |
23 const uint8_t golden = blend_double_round(dst, src, alpha); | 29 const uint8_t golden = blend_double_round(dst, src, alpha); |
(...skipping 21 matching lines...) Expand all Loading... |
45 SkASSERT(maxDiff >= 0); | 51 SkASSERT(maxDiff >= 0); |
46 | 52 |
47 for (unsigned alpha = 0; alpha < 256; alpha++) { | 53 for (unsigned alpha = 0; alpha < 256; alpha++) { |
48 for (unsigned src = 0; src <= alpha; src++) { | 54 for (unsigned src = 0; src <= alpha; src++) { |
49 test(r, maxDiff, algorithm, dst, src, alpha); | 55 test(r, maxDiff, algorithm, dst, src, alpha); |
50 } | 56 } |
51 } | 57 } |
52 } | 58 } |
53 | 59 |
54 static uint8_t blend_double_trunc(uint8_t dst, uint8_t src, uint8_t srcAlpha) { | 60 static uint8_t blend_double_trunc(uint8_t dst, uint8_t src, uint8_t srcAlpha) { |
55 return SkToU8(src + dst * (255.0 - srcAlpha) / 255.0); | 61 return double_to_u8(src + dst * (255.0 - srcAlpha) / 255.0); |
56 } | 62 } |
57 | 63 |
58 static uint8_t blend_float_trunc(uint8_t dst, uint8_t src, uint8_t srcAlpha) { | 64 static uint8_t blend_float_trunc(uint8_t dst, uint8_t src, uint8_t srcAlpha) { |
59 return SkToU8(src + dst * (255.0f - srcAlpha) / 255.0f); | 65 return double_to_u8(src + dst * (255.0f - srcAlpha) / 255.0f); |
60 } | 66 } |
61 | 67 |
62 static uint8_t blend_float_round(uint8_t dst, uint8_t src, uint8_t srcAlpha) { | 68 static uint8_t blend_float_round(uint8_t dst, uint8_t src, uint8_t srcAlpha) { |
63 return SkToU8(0.5f + src + dst * (255.0f - srcAlpha) / 255.0f); | 69 return double_to_u8(0.5f + src + dst * (255.0f - srcAlpha) / 255.0f); |
64 } | 70 } |
65 | 71 |
66 static uint8_t blend_255_trunc(uint8_t dst, uint8_t src, uint8_t srcAlpha) { | 72 static uint8_t blend_255_trunc(uint8_t dst, uint8_t src, uint8_t srcAlpha) { |
67 const uint16_t invAlpha = 255 - srcAlpha; | 73 const uint16_t invAlpha = 255 - srcAlpha; |
68 const uint16_t product = dst * invAlpha; | 74 const uint16_t product = dst * invAlpha; |
69 return src + (product >> 8); | 75 return src + (product >> 8); |
70 } | 76 } |
71 | 77 |
72 static uint8_t blend_255_round(uint8_t dst, uint8_t src, uint8_t srcAlpha) { | 78 static uint8_t blend_255_round(uint8_t dst, uint8_t src, uint8_t srcAlpha) { |
73 const uint16_t invAlpha = 255 - srcAlpha; | 79 const uint16_t invAlpha = 255 - srcAlpha; |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 // blend_perfect | 249 // blend_perfect |
244 // GOOD ENOUGH | 250 // GOOD ENOUGH |
245 // blend_double_trunc | 251 // blend_double_trunc |
246 // blend_float_trunc | 252 // blend_float_trunc |
247 // blend_256_round | 253 // blend_256_round |
248 // blend_256_round_alt | 254 // blend_256_round_alt |
249 // NOT GOOD ENOUGH | 255 // NOT GOOD ENOUGH |
250 // all others | 256 // all others |
251 // | 257 // |
252 // Algorithms that make sense to use in Skia: blend_256_round, blend_256_round_
alt, blend_perfect | 258 // Algorithms that make sense to use in Skia: blend_256_round, blend_256_round_
alt, blend_perfect |
OLD | NEW |