diff options
author | Matt Sarett <msarett@google.com> | 2016-10-11 16:57:50 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2016-10-11 21:59:09 +0000 |
commit | df44fc5f2bb282557df291e20dbd26c070533aa6 (patch) | |
tree | 294b40001d8928e59771848e12efb70956922b58 /src/core/SkColorSpace_ICC.cpp | |
parent | 3eb71216d2fb70114417ae8ee9b0c5f5dc650704 (diff) |
Add SkColorSpaceTransferFn to SkColorSpace
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=3178
Change-Id: I354342d4469cee0e25a7b0d189e925e431da623c
Reviewed-on: https://skia-review.googlesource.com/3178
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Matt Sarett <msarett@google.com>
Diffstat (limited to 'src/core/SkColorSpace_ICC.cpp')
-rw-r--r-- | src/core/SkColorSpace_ICC.cpp | 83 |
1 files changed, 28 insertions, 55 deletions
diff --git a/src/core/SkColorSpace_ICC.cpp b/src/core/SkColorSpace_ICC.cpp index 4ef9f2b0a8..b33e6b5ba1 100644 --- a/src/core/SkColorSpace_ICC.cpp +++ b/src/core/SkColorSpace_ICC.cpp @@ -274,8 +274,8 @@ static float read_big_endian_16_dot_16(const uint8_t buf[4]) { * * @return kNone_Type on failure, otherwise the type of the gamma tag. */ -static SkGammas::Type parse_gamma(SkGammas::Data* outData, SkGammas::Params* outParams, - size_t* outTagBytes, const uint8_t* src, size_t len) { +static SkGammas::Type parse_gamma(SkGammas::Data* outData, SkColorSpaceTransferFn* outParams, + size_t* outTagBytes, const uint8_t* src, size_t len) { if (len < 12) { SkColorSpacePrintf("gamma tag is too small (%d bytes)", len); return SkGammas::Type::kNone_Type; @@ -478,56 +478,29 @@ static SkGammas::Type parse_gamma(SkGammas::Data* outData, SkGammas::Params* out return SkGammas::Type::kNone_Type; } - // Recognize and simplify a very common parametric representation of sRGB gamma. - if (color_space_almost_equal(0.9479f, a) && - color_space_almost_equal(0.0521f, b) && - color_space_almost_equal(0.0000f, c) && - color_space_almost_equal(0.0405f, d) && - color_space_almost_equal(0.0774f, e) && - color_space_almost_equal(0.0000f, f) && - color_space_almost_equal(2.4000f, g)) { - outData->fNamed = kSRGB_SkGammaNamed; - return SkGammas::Type::kNamed_Type; - } + outParams->fG = g; + outParams->fA = a; + outParams->fB = b; + outParams->fC = c; + outParams->fD = d; + outParams->fE = e; + outParams->fF = f; - // Fail on invalid gammas. - if (SkScalarIsNaN(d)) { + if (!is_valid_transfer_fn(*outParams)) { return SkGammas::Type::kNone_Type; } - if (d <= 0.0f) { - // Y = (aX + b)^g + c for always - if (0.0f == a || 0.0f == g) { - SkColorSpacePrintf("A or G is zero, constant gamma function " - "is nonsense"); - return SkGammas::Type::kNone_Type; - } - } - - if (d >= 1.0f) { - // Y = eX + f for always - if (0.0f == e) { - SkColorSpacePrintf("E is zero, constant gamma function is " - "nonsense"); - return SkGammas::Type::kNone_Type; - } + if (is_almost_srgb(*outParams)) { + outData->fNamed = kSRGB_SkGammaNamed; + return SkGammas::Type::kNamed_Type; } - if ((0.0f == a || 0.0f == g) && 0.0f == e) { - SkColorSpacePrintf("A or G, and E are zero, constant gamma function " - "is nonsense"); - return SkGammas::Type::kNone_Type; + if (is_almost_2dot2(*outParams)) { + outData->fNamed = k2Dot2Curve_SkGammaNamed; + return SkGammas::Type::kNamed_Type; } *outTagBytes = tagBytes; - - outParams->fG = g; - outParams->fA = a; - outParams->fB = b; - outParams->fC = c; - outParams->fD = d; - outParams->fE = e; - outParams->fF = f; return SkGammas::Type::kParam_Type; } default: @@ -547,7 +520,7 @@ static size_t gamma_alloc_size(SkGammas::Type type, const SkGammas::Data& data) case SkGammas::Type::kTable_Type: return sizeof(float) * data.fTable.fSize; case SkGammas::Type::kParam_Type: - return sizeof(SkGammas::Params); + return sizeof(SkColorSpaceTransferFn); default: SkASSERT(false); return 0; @@ -584,7 +557,7 @@ static void handle_invalid_gamma(SkGammas::Type* type, SkGammas::Data* data) { * @return Additional bytes of memory that are being used by this gamma curve. */ static size_t load_gammas(void* memory, size_t offset, SkGammas::Type type, - SkGammas::Data* data, const SkGammas::Params& params, + SkGammas::Data* data, const SkColorSpaceTransferFn& params, const uint8_t* src) { void* storage = SkTAddOffset<void>(memory, offset + sizeof(SkGammas)); @@ -606,8 +579,8 @@ static size_t load_gammas(void* memory, size_t offset, SkGammas::Type type, } case SkGammas::Type::kParam_Type: data->fTable.fOffset = offset; - memcpy(storage, ¶ms, sizeof(SkGammas::Params)); - return sizeof(SkGammas::Params); + memcpy(storage, ¶ms, sizeof(SkColorSpaceTransferFn)); + return sizeof(SkColorSpaceTransferFn); default: SkASSERT(false); return 0; @@ -785,7 +758,7 @@ static bool load_a2b0(sk_sp<SkColorLookUpTable>* colorLUT, SkGammaNamed* gammaNa size_t tagLen = len - offsetToMCurves; SkGammas::Data rData; - SkGammas::Params rParams; + SkColorSpaceTransferFn rParams; // On an invalid first gamma, tagBytes remains set as zero. This causes the two // subsequent to be treated as identical (which is what we want). @@ -820,17 +793,17 @@ static bool load_a2b0(sk_sp<SkColorLookUpTable>* colorLUT, SkGammaNamed* gammaNa const uint8_t* gTagPtr = rTagPtr + alignedTagBytes; tagLen = tagLen > alignedTagBytes ? tagLen - alignedTagBytes : 0; SkGammas::Data gData; - SkGammas::Params gParams; + SkColorSpaceTransferFn gParams; tagBytes = 0; SkGammas::Type gType = parse_gamma(&gData, &gParams, &tagBytes, gTagPtr, - tagLen); + tagLen); handle_invalid_gamma(&gType, &gData); alignedTagBytes = SkAlign4(tagBytes); const uint8_t* bTagPtr = gTagPtr + alignedTagBytes; tagLen = tagLen > alignedTagBytes ? tagLen - alignedTagBytes : 0; SkGammas::Data bData; - SkGammas::Params bParams; + SkColorSpaceTransferFn bParams; SkGammas::Type bType = parse_gamma(&bData, &bParams, &tagBytes, bTagPtr, tagLen); handle_invalid_gamma(&bType, &bData); @@ -993,7 +966,7 @@ sk_sp<SkColorSpace> SkColorSpace::NewICC(const void* input, size_t len) { if (r && g && b) { if (tag_equals(r, g, base) && tag_equals(g, b, base)) { SkGammas::Data data; - SkGammas::Params params; + SkColorSpaceTransferFn params; SkGammas::Type type = parse_gamma(&data, ¶ms, &tagBytes, r->addr(base), r->fLength); handle_invalid_gamma(&type, &data); @@ -1019,19 +992,19 @@ sk_sp<SkColorSpace> SkColorSpace::NewICC(const void* input, size_t len) { } } else { SkGammas::Data rData; - SkGammas::Params rParams; + SkColorSpaceTransferFn rParams; SkGammas::Type rType = parse_gamma(&rData, &rParams, &tagBytes, r->addr(base), r->fLength); handle_invalid_gamma(&rType, &rData); SkGammas::Data gData; - SkGammas::Params gParams; + SkColorSpaceTransferFn gParams; SkGammas::Type gType = parse_gamma(&gData, &gParams, &tagBytes, g->addr(base), g->fLength); handle_invalid_gamma(&gType, &gData); SkGammas::Data bData; - SkGammas::Params bParams; + SkColorSpaceTransferFn bParams; SkGammas::Type bType = parse_gamma(&bData, &bParams, &tagBytes, b->addr(base), b->fLength); handle_invalid_gamma(&bType, &bData); |