diff options
author | Matt Sarett <msarett@google.com> | 2017-01-12 21:03:17 +0000 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-01-12 21:03:28 +0000 |
commit | 25b60833e7c3dd25f2317b3f0e7af07f04b5beba (patch) | |
tree | 557ce5ae781109521da3b18b44824fe00b01ea08 /src/core/SkColorSpaceXform.cpp | |
parent | 9e937af9bd0ef211ffcaca1bae3a6a74581c5992 (diff) |
Revert "Use RasterPipeline to support full precision on 16-bit RGBA pngs"
This reverts commit bb2339da39ab3ee59121acd911920dafcd4a2f72.
Reason for revert: Breaks MSAN
Original change's description:
> Use RasterPipeline to support full precision on 16-bit RGBA pngs
>
> TODO: Support more precision on 16-bit RGB pngs
>
> BUG=skia:
>
> CQ_INCLUDE_TRYBOTS=skia.primary:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD
>
> Change-Id: I89dfef3b4887b9c4895c17309933883ab90ffa4d
> Reviewed-on: https://skia-review.googlesource.com/6260
> Reviewed-by: Mike Reed <reed@google.com>
> Reviewed-by: Leon Scroggins <scroggo@google.com>
> Reviewed-by: Mike Klein <mtklein@chromium.org>
> Commit-Queue: Matt Sarett <msarett@google.com>
>
TBR=mtklein@chromium.org,mtklein@google.com,msarett@google.com,scroggo@google.com,reed@google.com,reviews@skia.org
BUG=skia:
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
Change-Id: I47579c20af033a75883e2b35567cb9c690ce54b0
Reviewed-on: https://skia-review.googlesource.com/6975
Commit-Queue: Matt Sarett <msarett@google.com>
Reviewed-by: Matt Sarett <msarett@google.com>
Diffstat (limited to 'src/core/SkColorSpaceXform.cpp')
-rw-r--r-- | src/core/SkColorSpaceXform.cpp | 241 |
1 files changed, 147 insertions, 94 deletions
diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp index bdb3784681..b73a3cf198 100644 --- a/src/core/SkColorSpaceXform.cpp +++ b/src/core/SkColorSpaceXform.cpp @@ -327,14 +327,110 @@ std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(SkColorSpace* srcSpace switch (csm) { case kNone_ColorSpaceMatch: - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kNone_ColorSpaceMatch>(srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + switch (dstSpaceXYZ->gammaNamed()) { + case kSRGB_SkGammaNamed: + if (srcSpaceXYZ->gammaIsLinear()) { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kLinear_SrcGamma, kSRGB_DstGamma, kNone_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } else { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kTable_SrcGamma, kSRGB_DstGamma, kNone_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } + case k2Dot2Curve_SkGammaNamed: + if (srcSpaceXYZ->gammaIsLinear()) { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kLinear_SrcGamma, k2Dot2_DstGamma, kNone_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } else { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kTable_SrcGamma, k2Dot2_DstGamma, kNone_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } + case kLinear_SkGammaNamed: + if (srcSpaceXYZ->gammaIsLinear()) { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kLinear_SrcGamma, kLinear_DstGamma, kNone_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } else { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kTable_SrcGamma, kLinear_DstGamma, kNone_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } + default: + if (srcSpaceXYZ->gammaIsLinear()) { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kLinear_SrcGamma, kTable_DstGamma, kNone_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } else { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kTable_SrcGamma, kTable_DstGamma, kNone_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } + } case kGamut_ColorSpaceMatch: - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kGamut_ColorSpaceMatch>(srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + switch (dstSpaceXYZ->gammaNamed()) { + case kSRGB_SkGammaNamed: + if (srcSpaceXYZ->gammaIsLinear()) { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kLinear_SrcGamma, kSRGB_DstGamma, kGamut_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } else { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kTable_SrcGamma, kSRGB_DstGamma, kGamut_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } + case k2Dot2Curve_SkGammaNamed: + if (srcSpaceXYZ->gammaIsLinear()) { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kLinear_SrcGamma, k2Dot2_DstGamma, kGamut_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } else { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kTable_SrcGamma, k2Dot2_DstGamma, kGamut_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } + case kLinear_SkGammaNamed: + if (srcSpaceXYZ->gammaIsLinear()) { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kLinear_SrcGamma, kLinear_DstGamma, kGamut_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } else { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kTable_SrcGamma, kLinear_DstGamma, kGamut_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } + default: + if (srcSpaceXYZ->gammaIsLinear()) { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kLinear_SrcGamma, kTable_DstGamma, kGamut_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } else { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kTable_SrcGamma, kTable_DstGamma, kGamut_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } + } case kFull_ColorSpaceMatch: - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kFull_ColorSpaceMatch>(srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + switch (dstSpaceXYZ->gammaNamed()) { + case kSRGB_SkGammaNamed: + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kTable_SrcGamma, kSRGB_DstGamma, kFull_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + case k2Dot2Curve_SkGammaNamed: + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kTable_SrcGamma, k2Dot2_DstGamma, kFull_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + case kLinear_SkGammaNamed: + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kLinear_SrcGamma, kLinear_DstGamma, kFull_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + default: + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kTable_SrcGamma, kTable_DstGamma, kFull_ColorSpaceMatch> + (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + } default: SkASSERT(false); return nullptr; @@ -969,8 +1065,8 @@ static AI int num_tables(SkColorSpace_XYZ* space) { } } -template <ColorSpaceMatch kCSM> -SkColorSpaceXform_XYZ<kCSM> +template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM> +SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> ::SkColorSpaceXform_XYZ(SkColorSpace_XYZ* srcSpace, const SkMatrix44& srcToDst, SkColorSpace_XYZ* dstSpace) { @@ -997,29 +1093,6 @@ SkColorSpaceXform_XYZ<kCSM> const int numDstTables = num_tables(dstSpace); dstSpace->toDstGammaTables(fDstGammaTables, &fDstStorage, numDstTables); - - if (srcSpace->gammaIsLinear()) { - fSrcGamma = kLinear_SrcGamma; - } else if (kSRGB_SkGammaNamed == srcSpace->gammaNamed()) { - fSrcGamma = kSRGB_SrcGamma; - } else { - fSrcGamma = kTable_SrcGamma; - } - - switch (dstSpace->gammaNamed()) { - case kSRGB_SkGammaNamed: - fDstGamma = kSRGB_DstGamma; - break; - case k2Dot2Curve_SkGammaNamed: - fDstGamma = k2Dot2_DstGamma; - break; - case kLinear_SkGammaNamed: - fDstGamma = kLinear_DstGamma; - break; - default: - fDstGamma = kTable_DstGamma; - break; - } } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1046,28 +1119,27 @@ static AI bool apply_set_alpha(void* dst, const void* src, int len, SkAlphaType } } -template <DstFormat kDst, ColorSpaceMatch kCSM> +template <SrcGamma kSrc, DstFormat kDst, ColorSpaceMatch kCSM> static AI bool apply_set_src(void* dst, const void* src, int len, SkAlphaType alphaType, const float* const srcTables[3], const float matrix[13], const uint8_t* const dstTables[3], - SkColorSpaceXform::ColorFormat srcColorFormat, - SrcGamma srcGamma) { + SkColorSpaceXform::ColorFormat srcColorFormat) { switch (srcColorFormat) { case SkColorSpaceXform::kRGBA_8888_ColorFormat: - switch (srcGamma) { + switch (kSrc) { case kLinear_SrcGamma: return apply_set_alpha<kRGBA_8888_Linear_SrcFormat, kDst, kCSM> (dst, src, len, alphaType, nullptr, matrix, dstTables); - default: + case kTable_SrcGamma: return apply_set_alpha<kRGBA_8888_Table_SrcFormat, kDst, kCSM> (dst, src, len, alphaType, srcTables, matrix, dstTables); } case SkColorSpaceXform::kBGRA_8888_ColorFormat: - switch (srcGamma) { + switch (kSrc) { case kLinear_SrcGamma: return apply_set_alpha<kBGRA_8888_Linear_SrcFormat, kDst, kCSM> (dst, src, len, alphaType, nullptr, matrix, dstTables); - default: + case kTable_SrcGamma: return apply_set_alpha<kBGRA_8888_Table_SrcFormat, kDst, kCSM> (dst, src, len, alphaType, srcTables, matrix, dstTables); } @@ -1078,8 +1150,8 @@ static AI bool apply_set_src(void* dst, const void* src, int len, SkAlphaType al #undef AI -template <ColorSpaceMatch kCSM> -bool SkColorSpaceXform_XYZ<kCSM> +template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM> +bool SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> ::onApply(ColorFormat dstColorFormat, void* dst, ColorFormat srcColorFormat, const void* src, int len, SkAlphaType alphaType) const { @@ -1104,55 +1176,55 @@ bool SkColorSpaceXform_XYZ<kCSM> } } - if (kRGBA_F32_ColorFormat == dstColorFormat || kRGBA_U16_BE_ColorFormat == srcColorFormat) { + if (kRGBA_F32_ColorFormat == dstColorFormat) { return this->applyPipeline(dstColorFormat, dst, srcColorFormat, src, len, alphaType); } switch (dstColorFormat) { case kRGBA_8888_ColorFormat: - switch (fDstGamma) { + switch (kDst) { case kLinear_DstGamma: - return apply_set_src<kRGBA_8888_Linear_DstFormat, kCSM> + return apply_set_src<kSrc, kRGBA_8888_Linear_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr, - srcColorFormat, fSrcGamma); + srcColorFormat); case kSRGB_DstGamma: - return apply_set_src<kRGBA_8888_SRGB_DstFormat, kCSM> + return apply_set_src<kSrc, kRGBA_8888_SRGB_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr, - srcColorFormat, fSrcGamma); + srcColorFormat); case k2Dot2_DstGamma: - return apply_set_src<kRGBA_8888_2Dot2_DstFormat, kCSM> + return apply_set_src<kSrc, kRGBA_8888_2Dot2_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr, - srcColorFormat, fSrcGamma); + srcColorFormat); case kTable_DstGamma: - return apply_set_src<kRGBA_8888_Table_DstFormat, kCSM> + return apply_set_src<kSrc, kRGBA_8888_Table_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, fDstGammaTables, - srcColorFormat, fSrcGamma); + srcColorFormat); } case kBGRA_8888_ColorFormat: - switch (fDstGamma) { + switch (kDst) { case kLinear_DstGamma: - return apply_set_src<kBGRA_8888_Linear_DstFormat, kCSM> + return apply_set_src<kSrc, kBGRA_8888_Linear_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr, - srcColorFormat, fSrcGamma); + srcColorFormat); case kSRGB_DstGamma: - return apply_set_src<kBGRA_8888_SRGB_DstFormat, kCSM> + return apply_set_src<kSrc, kBGRA_8888_SRGB_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr, - srcColorFormat, fSrcGamma); + srcColorFormat); case k2Dot2_DstGamma: - return apply_set_src<kBGRA_8888_2Dot2_DstFormat, kCSM> + return apply_set_src<kSrc, kBGRA_8888_2Dot2_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr, - srcColorFormat, fSrcGamma); + srcColorFormat); case kTable_DstGamma: - return apply_set_src<kBGRA_8888_Table_DstFormat, kCSM> + return apply_set_src<kSrc, kBGRA_8888_Table_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, fDstGammaTables, - srcColorFormat, fSrcGamma); + srcColorFormat); } case kRGBA_F16_ColorFormat: - switch (fDstGamma) { + switch (kDst) { case kLinear_DstGamma: - return apply_set_src<kF16_Linear_DstFormat, kCSM> + return apply_set_src<kSrc, kF16_Linear_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr, - srcColorFormat, fSrcGamma); + srcColorFormat); default: return false; } @@ -1170,8 +1242,8 @@ bool SkColorSpaceXform::apply(ColorFormat dstColorFormat, void* dst, ColorFormat /////////////////////////////////////////////////////////////////////////////////////////////////// -template <ColorSpaceMatch kCSM> -bool SkColorSpaceXform_XYZ<kCSM> +template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM> +bool SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> ::applyPipeline(ColorFormat dstColorFormat, void* dst, ColorFormat srcColorFormat, const void* src, int len, SkAlphaType alphaType) const { SkRasterPipeline pipeline; @@ -1179,10 +1251,10 @@ bool SkColorSpaceXform_XYZ<kCSM> LoadTablesContext loadTables; switch (srcColorFormat) { case kRGBA_8888_ColorFormat: - if (kLinear_SrcGamma == fSrcGamma) { + if (kLinear_SrcGamma == kSrc) { pipeline.append(SkRasterPipeline::load_8888, &src); } else { - loadTables.fSrc = src; + loadTables.fSrc = (const uint32_t*) src; loadTables.fR = fSrcGammaTables[0]; loadTables.fG = fSrcGammaTables[1]; loadTables.fB = fSrcGammaTables[2]; @@ -1191,10 +1263,10 @@ bool SkColorSpaceXform_XYZ<kCSM> break; case kBGRA_8888_ColorFormat: - if (kLinear_SrcGamma == fSrcGamma) { + if (kLinear_SrcGamma == kSrc) { pipeline.append(SkRasterPipeline::load_8888, &src); } else { - loadTables.fSrc = src; + loadTables.fSrc = (const uint32_t*) src; loadTables.fR = fSrcGammaTables[2]; loadTables.fG = fSrcGammaTables[1]; loadTables.fB = fSrcGammaTables[0]; @@ -1203,24 +1275,6 @@ bool SkColorSpaceXform_XYZ<kCSM> pipeline.append(SkRasterPipeline::swap_rb); break; - case kRGBA_U16_BE_ColorFormat: - switch (fSrcGamma) { - case kLinear_SrcGamma: - pipeline.append(SkRasterPipeline::load_u16_be, &src); - break; - case kSRGB_SrcGamma: - pipeline.append(SkRasterPipeline::load_u16_be, &src); - pipeline.append_from_srgb(kUnpremul_SkAlphaType); - break; - case kTable_SrcGamma: - loadTables.fSrc = src; - loadTables.fR = fSrcGammaTables[0]; - loadTables.fG = fSrcGammaTables[1]; - loadTables.fB = fSrcGammaTables[2]; - pipeline.append(SkRasterPipeline::load_tables_u16_be, &loadTables); - break; - } - break; default: return false; } @@ -1242,7 +1296,7 @@ bool SkColorSpaceXform_XYZ<kCSM> } StoreTablesContext storeTables; - switch (fDstGamma) { + switch (kDst) { case kSRGB_DstGamma: pipeline.append(SkRasterPipeline::to_srgb); break; @@ -1255,7 +1309,7 @@ bool SkColorSpaceXform_XYZ<kCSM> switch (dstColorFormat) { case kRGBA_8888_ColorFormat: - if (kTable_DstGamma == fDstGamma) { + if (kTable_DstGamma == kDst) { storeTables.fDst = (uint32_t*) dst; storeTables.fR = fDstGammaTables[0]; storeTables.fG = fDstGammaTables[1]; @@ -1267,7 +1321,7 @@ bool SkColorSpaceXform_XYZ<kCSM> } break; case kBGRA_8888_ColorFormat: - if (kTable_DstGamma == fDstGamma) { + if (kTable_DstGamma == kDst) { storeTables.fDst = (uint32_t*) dst; storeTables.fR = fDstGammaTables[2]; storeTables.fG = fDstGammaTables[1]; @@ -1281,19 +1335,17 @@ bool SkColorSpaceXform_XYZ<kCSM> } break; case kRGBA_F16_ColorFormat: - if (kLinear_DstGamma != fDstGamma) { + if (kLinear_DstGamma != kDst) { return false; } pipeline.append(SkRasterPipeline::store_f16, &dst); break; case kRGBA_F32_ColorFormat: - if (kLinear_DstGamma != fDstGamma) { + if (kLinear_DstGamma != kDst) { return false; } pipeline.append(SkRasterPipeline::store_f32, &dst); break; - default: - return false; } pipeline.run(0, 0, len); @@ -1304,5 +1356,6 @@ bool SkColorSpaceXform_XYZ<kCSM> std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(SkColorSpace_XYZ* space) { return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kNone_ColorSpaceMatch>(space, SkMatrix::I(), space)); + <kTable_SrcGamma, kTable_DstGamma, kNone_ColorSpaceMatch> + (space, SkMatrix::I(), space)); } |