| Index: src/core/SkColorSpaceXform.cpp
|
| diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp
|
| index 599adc90f959609062c6d9955ec01b0560428321..b1dda348177f0599cdc796e11c55bbe1e9d8e4e6 100644
|
| --- a/src/core/SkColorSpaceXform.cpp
|
| +++ b/src/core/SkColorSpaceXform.cpp
|
| @@ -908,8 +908,23 @@ static inline void store_f16_1(void* dst, const uint32_t* src,
|
| }
|
|
|
| template <SwapRB kSwapRB>
|
| +static inline void store_f32(void* dst, const uint32_t* src,
|
| + Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f& da,
|
| + const uint8_t* const[3]) {
|
| + Sk4f_store4(dst, dr, dg, db, da);
|
| +}
|
| +
|
| +template <SwapRB kSwapRB>
|
| +static inline void store_f32_1(void* dst, const uint32_t* src,
|
| + Sk4f& rgba, const Sk4f& a,
|
| + const uint8_t* const[3]) {
|
| + rgba = Sk4f(rgba[0], rgba[1], rgba[2], a[3]);
|
| + rgba.store((float*) dst);
|
| +}
|
| +
|
| +template <SwapRB kSwapRB>
|
| static inline void store_f16_opaque(void* dst, const uint32_t* src,
|
| - Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f& da,
|
| + Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&,
|
| const uint8_t* const[3]) {
|
| Sk4h_store4(dst, SkFloatToHalf_finite_ftz(dr),
|
| SkFloatToHalf_finite_ftz(dg),
|
| @@ -919,7 +934,7 @@ static inline void store_f16_opaque(void* dst, const uint32_t* src,
|
|
|
| template <SwapRB kSwapRB>
|
| static inline void store_f16_1_opaque(void* dst, const uint32_t* src,
|
| - Sk4f& rgba, const Sk4f& a,
|
| + Sk4f& rgba, const Sk4f&,
|
| const uint8_t* const[3]) {
|
| uint64_t tmp;
|
| SkFloatToHalf_finite_ftz(rgba).store(&tmp);
|
| @@ -1089,6 +1104,7 @@ enum DstFormat {
|
| k8888_2Dot2_DstFormat,
|
| k8888_Table_DstFormat,
|
| kF16_Linear_DstFormat,
|
| + kF32_Linear_DstFormat,
|
| };
|
|
|
| template <SrcFormat kSrc,
|
| @@ -1101,9 +1117,12 @@ static void color_xform_RGBA(void* dst, const uint32_t* src, int len,
|
| const uint8_t* const dstTables[3]) {
|
| LoadFn load;
|
| Load1Fn load_1;
|
| + static constexpr bool loadAlpha = (kPremul_SkAlphaType == kAlphaType) ||
|
| + (kF16_Linear_DstFormat == kDst) ||
|
| + (kF32_Linear_DstFormat == kDst);
|
| switch (kSrc) {
|
| case kRGBA_8888_Linear_SrcFormat:
|
| - if (kPremul_SkAlphaType == kAlphaType || kF16_Linear_DstFormat == kDst) {
|
| + if (loadAlpha) {
|
| load = load_rgba_linear;
|
| load_1 = load_rgba_linear_1;
|
| } else {
|
| @@ -1112,7 +1131,7 @@ static void color_xform_RGBA(void* dst, const uint32_t* src, int len,
|
| }
|
| break;
|
| case kRGBA_8888_Table_SrcFormat:
|
| - if (kPremul_SkAlphaType == kAlphaType || kF16_Linear_DstFormat == kDst) {
|
| + if (loadAlpha) {
|
| load = load_rgba_from_tables;
|
| load_1 = load_rgba_from_tables_1;
|
| } else {
|
| @@ -1153,6 +1172,11 @@ static void color_xform_RGBA(void* dst, const uint32_t* src, int len,
|
| store_f16_1<kSwapRB>;
|
| sizeOfDstPixel = 8;
|
| break;
|
| + case kF32_Linear_DstFormat:
|
| + store = store_f32<kSwapRB>;
|
| + store_1 = store_f32_1<kSwapRB>;
|
| + sizeOfDstPixel = 16;
|
| + break;
|
| }
|
|
|
| do_color_xform<kAlphaType, kCSM>
|
| @@ -1245,7 +1269,7 @@ static inline void apply_set_src(void* dst, const uint32_t* src, int len, SkAlph
|
|
|
| template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM>
|
| void SkColorSpaceXform_Base<kSrc, kDst, kCSM>
|
| -::apply(void* dst, const uint32_t* src, int len, SkColorType dstColorType, SkAlphaType alphaType)
|
| +::apply(void* dst, const uint32_t* src, int len, ColorFormat dstColorFormat, SkAlphaType alphaType)
|
| const
|
| {
|
| if (kFull_ColorSpaceMatch == kCSM) {
|
| @@ -1255,13 +1279,14 @@ const
|
| // linear space.
|
| break;
|
| default:
|
| - switch (dstColorType) {
|
| - case kRGBA_8888_SkColorType:
|
| + switch (dstColorFormat) {
|
| + case kRGBA_8888_ColorFormat:
|
| return (void) memcpy(dst, src, len * sizeof(uint32_t));
|
| - case kBGRA_8888_SkColorType:
|
| + case kBGRA_8888_ColorFormat:
|
| return SkOpts::RGBA_to_BGRA((uint32_t*) dst, src, len);
|
| - case kRGBA_F16_SkColorType:
|
| - // There's still work to do to xform to linear F16.
|
| + case kRGBA_F16_ColorFormat:
|
| + case kRGBA_F32_ColorFormat:
|
| + // There's still work to do to xform to linear floats.
|
| break;
|
| default:
|
| SkASSERT(false);
|
| @@ -1283,8 +1308,8 @@ const
|
| src = (const uint32_t*) storage.get();
|
| }
|
|
|
| - switch (dstColorType) {
|
| - case kRGBA_8888_SkColorType:
|
| + switch (dstColorFormat) {
|
| + case kRGBA_8888_ColorFormat:
|
| switch (kDst) {
|
| case kLinear_DstGamma:
|
| return apply_set_src<kSrc, k8888_Linear_DstFormat, kCSM, kNo_SwapRB>
|
| @@ -1299,7 +1324,7 @@ const
|
| return apply_set_src<kSrc, k8888_Table_DstFormat, kCSM, kNo_SwapRB>
|
| (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, fDstGammaTables);
|
| }
|
| - case kBGRA_8888_SkColorType:
|
| + case kBGRA_8888_ColorFormat:
|
| switch (kDst) {
|
| case kLinear_DstGamma:
|
| return apply_set_src<kSrc, k8888_Linear_DstFormat, kCSM, kYes_SwapRB>
|
| @@ -1314,7 +1339,7 @@ const
|
| return apply_set_src<kSrc, k8888_Table_DstFormat, kCSM, kYes_SwapRB>
|
| (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, fDstGammaTables);
|
| }
|
| - case kRGBA_F16_SkColorType:
|
| + case kRGBA_F16_ColorFormat:
|
| switch (kDst) {
|
| case kLinear_DstGamma:
|
| return apply_set_src<kSrc, kF16_Linear_DstFormat, kCSM, kNo_SwapRB>
|
| @@ -1323,6 +1348,15 @@ const
|
| SkASSERT(false);
|
| return;
|
| }
|
| + case kRGBA_F32_ColorFormat:
|
| + switch (kDst) {
|
| + case kLinear_DstGamma:
|
| + return apply_set_src<kSrc, kF32_Linear_DstFormat, kCSM, kNo_SwapRB>
|
| + (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr);
|
| + default:
|
| + SkASSERT(false);
|
| + return;
|
| + }
|
| default:
|
| SkASSERT(false);
|
| return;
|
|
|