| 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 | 
|---|