aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkColorSpaceXform.cpp
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-01-12 21:03:17 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-01-12 21:03:28 +0000
commit25b60833e7c3dd25f2317b3f0e7af07f04b5beba (patch)
tree557ce5ae781109521da3b18b44824fe00b01ea08 /src/core/SkColorSpaceXform.cpp
parent9e937af9bd0ef211ffcaca1bae3a6a74581c5992 (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.cpp241
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));
}