Chromium Code Reviews| Index: src/core/SkColorSpaceXform.cpp |
| diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp |
| index 0faff88286d592a3a660b4abaf4d2d3c7e7fe5bf..745191dcd4f981b18b12f805ca8e402dab755b3a 100644 |
| --- a/src/core/SkColorSpaceXform.cpp |
| +++ b/src/core/SkColorSpaceXform.cpp |
| @@ -37,10 +37,16 @@ std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(const sk_sp<SkColorSpa |
| return nullptr; |
| } |
| - if (SkColorSpace::k2Dot2Curve_GammaNamed == srcSpace->gammaNamed() && |
| - SkColorSpace::k2Dot2Curve_GammaNamed == dstSpace->gammaNamed()) |
| + if (SkColorSpace::k2Dot2Curve_GammaNamed == dstSpace->gammaNamed() && |
| + 0.0f == srcToDst.getFloat(3, 0) && |
|
mtklein_C
2016/06/16 13:27:40
So the idea is that the Q terms are so uncommon th
msarett
2016/06/16 15:46:11
Well not right now, I may consider templating them
|
| + 0.0f == srcToDst.getFloat(3, 1) && |
| + 0.0f == srcToDst.getFloat(3, 2)) |
| { |
| - return std::unique_ptr<SkColorSpaceXform>(new Sk2Dot2Xform(srcToDst)); |
| + if (SkColorSpace::kSRGB_GammaNamed == srcSpace->gammaNamed()) { |
| + return std::unique_ptr<SkColorSpaceXform>(new SkSRGBTo2Dot2Xform(srcToDst)); |
| + } else if (SkColorSpace::k2Dot2Curve_GammaNamed == srcSpace->gammaNamed()) { |
| + return std::unique_ptr<SkColorSpaceXform>(new Sk2Dot2To2Dot2Xform(srcToDst)); |
| + } |
| } |
| return std::unique_ptr<SkColorSpaceXform>( |
| @@ -49,33 +55,59 @@ std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(const sk_sp<SkColorSpa |
| /////////////////////////////////////////////////////////////////////////////////////////////////// |
| -Sk2Dot2Xform::Sk2Dot2Xform(const SkMatrix44& srcToDst) |
| -{ |
| - // Build row major 4x4 matrix: |
| +static void build_src_to_dst(float srcToDstArray[12], const SkMatrix44& srcToDstMatrix) { |
| + // Build the following row major matrix: |
| // rX gX bX 0 |
| // rY gY bY 0 |
| // rZ gZ bZ 0 |
| - // rQ gQ bQ 0 |
| - fSrcToDst[0] = srcToDst.getFloat(0, 0); |
| - fSrcToDst[1] = srcToDst.getFloat(0, 1); |
| - fSrcToDst[2] = srcToDst.getFloat(0, 2); |
| - fSrcToDst[3] = 0.0f; |
| - fSrcToDst[4] = srcToDst.getFloat(1, 0); |
| - fSrcToDst[5] = srcToDst.getFloat(1, 1); |
| - fSrcToDst[6] = srcToDst.getFloat(1, 2); |
| - fSrcToDst[7] = 0.0f; |
| - fSrcToDst[8] = srcToDst.getFloat(2, 0); |
| - fSrcToDst[9] = srcToDst.getFloat(2, 1); |
| - fSrcToDst[10] = srcToDst.getFloat(2, 2); |
| - fSrcToDst[11] = 0.0f; |
| - fSrcToDst[12] = srcToDst.getFloat(3, 0); |
| - fSrcToDst[13] = srcToDst.getFloat(3, 1); |
| - fSrcToDst[14] = srcToDst.getFloat(3, 2); |
| - fSrcToDst[15] = 0.0f; |
| + // Swap R and B if necessary to make sure that we output SkPMColor order. |
| +#ifdef SK_PMCOLOR_IS_BGRA |
| + srcToDstArray[0] = srcToDstMatrix.getFloat(0, 2); |
| + srcToDstArray[1] = srcToDstMatrix.getFloat(0, 1); |
| + srcToDstArray[2] = srcToDstMatrix.getFloat(0, 0); |
| + srcToDstArray[3] = 0.0f; |
| + srcToDstArray[4] = srcToDstMatrix.getFloat(1, 2); |
| + srcToDstArray[5] = srcToDstMatrix.getFloat(1, 1); |
| + srcToDstArray[6] = srcToDstMatrix.getFloat(1, 0); |
| + srcToDstArray[7] = 0.0f; |
| + srcToDstArray[8] = srcToDstMatrix.getFloat(2, 2); |
| + srcToDstArray[9] = srcToDstMatrix.getFloat(2, 1); |
| + srcToDstArray[10] = srcToDstMatrix.getFloat(2, 0); |
| + srcToDstArray[11] = 0.0f; |
| +#else |
| + srcToDstArray[0] = srcToDstMatrix.getFloat(0, 0); |
| + srcToDstArray[1] = srcToDstMatrix.getFloat(0, 1); |
| + srcToDstArray[2] = srcToDstMatrix.getFloat(0, 2); |
| + srcToDstArray[3] = 0.0f; |
| + srcToDstArray[4] = srcToDstMatrix.getFloat(1, 0); |
| + srcToDstArray[5] = srcToDstMatrix.getFloat(1, 1); |
| + srcToDstArray[6] = srcToDstMatrix.getFloat(1, 2); |
| + srcToDstArray[7] = 0.0f; |
| + srcToDstArray[8] = srcToDstMatrix.getFloat(2, 0); |
| + srcToDstArray[9] = srcToDstMatrix.getFloat(2, 1); |
| + srcToDstArray[10] = srcToDstMatrix.getFloat(2, 2); |
| + srcToDstArray[11] = 0.0f; |
| +#endif |
| +} |
| + |
| +SkSRGBTo2Dot2Xform::SkSRGBTo2Dot2Xform(const SkMatrix44& srcToDst) |
| +{ |
| + build_src_to_dst(fSrcToDst, srcToDst); |
| +} |
| + |
| +void SkSRGBTo2Dot2Xform::xform_RGB1_8888(uint32_t* dst, const uint32_t* src, uint32_t len) const { |
| + SkOpts::color_xform_RGB1_srgb_to_2dot2(dst, src, len, fSrcToDst); |
| +} |
| + |
| +/////////////////////////////////////////////////////////////////////////////////////////////////// |
| + |
| +Sk2Dot2To2Dot2Xform::Sk2Dot2To2Dot2Xform(const SkMatrix44& srcToDst) |
| +{ |
| + build_src_to_dst(fSrcToDst, srcToDst); |
| } |
| -void Sk2Dot2Xform::xform_RGBA_8888(uint32_t* dst, const uint32_t* src, uint32_t len) const { |
| - SkOpts::color_xform_2Dot2_RGBA_to_8888(dst, src, len, fSrcToDst); |
| +void Sk2Dot2To2Dot2Xform::xform_RGB1_8888(uint32_t* dst, const uint32_t* src, uint32_t len) const { |
| + SkOpts::color_xform_RGB1_2dot2_to_2dot2(dst, src, len, fSrcToDst); |
| } |
| /////////////////////////////////////////////////////////////////////////////////////////////////// |
| @@ -142,7 +174,7 @@ SkDefaultXform::SkDefaultXform(const sk_sp<SkGammas>& srcGammas, const SkMatrix4 |
| , fDstGammas(dstGammas) |
| {} |
| -void SkDefaultXform::xform_RGBA_8888(uint32_t* dst, const uint32_t* src, uint32_t len) const { |
| +void SkDefaultXform::xform_RGB1_8888(uint32_t* dst, const uint32_t* src, uint32_t len) const { |
| while (len-- > 0) { |
| // Convert to linear. |
| // FIXME (msarett): |