| Index: src/core/SkColorSpace_ICC.cpp
|
| diff --git a/src/core/SkColorSpace_ICC.cpp b/src/core/SkColorSpace_ICC.cpp
|
| index 4ef9f2b0a83146e3a39818e4e388640b5953913a..b33e6b5ba19bad70d7c32352fb403f1f71bdbf25 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);
|
|
|