OLD | NEW |
1 #include "SkConfig8888.h" | 1 #include "SkConfig8888.h" |
2 #include "SkMathPriv.h" | 2 #include "SkMathPriv.h" |
| 3 #include "SkUnPreMultiply.h" |
3 | 4 |
4 namespace { | 5 namespace { |
5 | 6 |
6 template <int A_IDX, int R_IDX, int G_IDX, int B_IDX> | 7 template <int A_IDX, int R_IDX, int G_IDX, int B_IDX> |
7 inline uint32_t pack_config8888(uint32_t a, uint32_t r, | 8 inline uint32_t pack_config8888(uint32_t a, uint32_t r, |
8 uint32_t g, uint32_t b) { | 9 uint32_t g, uint32_t b) { |
9 #ifdef SK_CPU_LENDIAN | 10 #ifdef SK_CPU_LENDIAN |
10 return (a << (A_IDX * 8)) | (r << (R_IDX * 8)) | | 11 return (a << (A_IDX * 8)) | (r << (R_IDX * 8)) | |
11 (g << (G_IDX * 8)) | (b << (B_IDX * 8)); | 12 (g << (G_IDX * 8)) | (b << (B_IDX * 8)); |
12 #else | 13 #else |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 * and an is_premul bool as params to another template function. Then IN_CFG is | 51 * and an is_premul bool as params to another template function. Then IN_CFG is |
51 * expanded via another function call. | 52 * expanded via another function call. |
52 */ | 53 */ |
53 | 54 |
54 template <bool OUT_PM, int OUT_A_IDX, int OUT_R_IDX, int OUT_G_IDX, int OUT_B_ID
X, | 55 template <bool OUT_PM, int OUT_A_IDX, int OUT_R_IDX, int OUT_G_IDX, int OUT_B_ID
X, |
55 bool IN_PM, int IN_A_IDX, int IN_R_IDX, int IN_G_IDX, int IN_B_IDX
> | 56 bool IN_PM, int IN_A_IDX, int IN_R_IDX, int IN_G_IDX, int IN_B_IDX
> |
56 inline uint32_t convert_pixel(uint32_t pixel) { | 57 inline uint32_t convert_pixel(uint32_t pixel) { |
57 uint32_t a, r, g, b; | 58 uint32_t a, r, g, b; |
58 unpack_config8888<IN_A_IDX, IN_R_IDX, IN_G_IDX, IN_B_IDX>(pixel, &a, &r, &g,
&b); | 59 unpack_config8888<IN_A_IDX, IN_R_IDX, IN_G_IDX, IN_B_IDX>(pixel, &a, &r, &g,
&b); |
59 if (IN_PM && !OUT_PM) { | 60 if (IN_PM && !OUT_PM) { |
60 // We're doing the explicit divide to match WebKit layout | 61 // Using SkUnPreMultiply::ApplyScale is faster than (value * 0xff) / a. |
61 // test expectations. We can modify and rebaseline if there | |
62 // it can be shown that there is a more performant way to | |
63 // unpremul. | |
64 if (a) { | 62 if (a) { |
65 r = r * 0xff / a; | 63 SkUnPreMultiply::Scale scale = SkUnPreMultiply::GetScale(a); |
66 g = g * 0xff / a; | 64 r = SkUnPreMultiply::ApplyScale(scale, r); |
67 b = b * 0xff / a; | 65 g = SkUnPreMultiply::ApplyScale(scale, g); |
| 66 b = SkUnPreMultiply::ApplyScale(scale, b); |
68 } else { | 67 } else { |
69 return 0; | 68 return 0; |
70 } | 69 } |
71 } else if (!IN_PM && OUT_PM) { | 70 } else if (!IN_PM && OUT_PM) { |
72 // This matches WebKit's conversion which we are replacing. | 71 // This matches SkUnPreMultiply conversion which we are replacing. |
73 // We can consider alternative rounding rules for performance. | 72 r = SkMulDiv255Round(r, a); |
74 r = SkMulDiv255Ceiling(r, a); | 73 g = SkMulDiv255Round(g, a); |
75 g = SkMulDiv255Ceiling(g, a); | 74 b = SkMulDiv255Round(b, a); |
76 b = SkMulDiv255Ceiling(b, a); | |
77 } | 75 } |
78 return pack_config8888<OUT_A_IDX, OUT_R_IDX, OUT_G_IDX, OUT_B_IDX>(a, r, g,
b); | 76 return pack_config8888<OUT_A_IDX, OUT_R_IDX, OUT_G_IDX, OUT_B_IDX>(a, r, g,
b); |
79 } | 77 } |
80 | 78 |
81 template <bool OUT_PM, int OUT_A_IDX, int OUT_R_IDX, int OUT_G_IDX, int OUT_B_ID
X, SkCanvas::Config8888 IN_CFG> | 79 template <bool OUT_PM, int OUT_A_IDX, int OUT_R_IDX, int OUT_G_IDX, int OUT_B_ID
X, SkCanvas::Config8888 IN_CFG> |
82 inline uint32_t convert_pixel(uint32_t pixel) { | 80 inline uint32_t convert_pixel(uint32_t pixel) { |
83 switch(IN_CFG) { | 81 switch(IN_CFG) { |
84 case SkCanvas::kNative_Premul_Config8888: | 82 case SkCanvas::kNative_Premul_Config8888: |
85 return convert_pixel<OUT_PM, OUT_A_IDX, OUT_R_IDX, OUT_G
_IDX, OUT_B_IDX, | 83 return convert_pixel<OUT_PM, OUT_A_IDX, OUT_R_IDX, OUT_G
_IDX, OUT_B_IDX, |
86 true, SK_NATIVE_A_IDX, SK_NATIVE_R_IDX, SK_NA
TIVE_G_IDX, SK_NATIVE_B_IDX>(pixel); | 84 true, SK_NATIVE_A_IDX, SK_NATIVE_R_IDX, SK_NA
TIVE_G_IDX, SK_NATIVE_B_IDX>(pixel); |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 case SkCanvas::kBGRA_Unpremul_Config8888: | 271 case SkCanvas::kBGRA_Unpremul_Config8888: |
274 return pack_config8888<3, 2, 1, 0>(a, r, g, b); | 272 return pack_config8888<3, 2, 1, 0>(a, r, g, b); |
275 case SkCanvas::kRGBA_Premul_Config8888: | 273 case SkCanvas::kRGBA_Premul_Config8888: |
276 case SkCanvas::kRGBA_Unpremul_Config8888: | 274 case SkCanvas::kRGBA_Unpremul_Config8888: |
277 return pack_config8888<3, 0, 1, 2>(a, r, g, b); | 275 return pack_config8888<3, 0, 1, 2>(a, r, g, b); |
278 default: | 276 default: |
279 SkDEBUGFAIL("Unexpected config8888"); | 277 SkDEBUGFAIL("Unexpected config8888"); |
280 return 0; | 278 return 0; |
281 } | 279 } |
282 } | 280 } |
OLD | NEW |