| Index: tests/ColorSpaceTest.cpp
|
| diff --git a/tests/ColorSpaceTest.cpp b/tests/ColorSpaceTest.cpp
|
| index e5ecbc83462c610b66d7e03bfbef35b168548737..5ae5a648a0cc20c81af505cd4a27096fe147685b 100644
|
| --- a/tests/ColorSpaceTest.cpp
|
| +++ b/tests/ColorSpaceTest.cpp
|
| @@ -12,15 +12,50 @@
|
|
|
| #include "png.h"
|
|
|
| +static bool almost_equal(float a, float b) {
|
| + return SkTAbs(a - b) < 0.001f;
|
| +}
|
| +
|
| +static void test_space(skiatest::Reporter* r, SkColorSpace* space,
|
| + const float red[], const float green[], const float blue[],
|
| + const float expectedGammas[]) {
|
| +#ifdef SK_DEBUG
|
| + const SkColorSpace::SkGammas& gammas = space->gammas();
|
| + REPORTER_ASSERT(r, almost_equal(expectedGammas[0], gammas.red()));
|
| + REPORTER_ASSERT(r, almost_equal(expectedGammas[1], gammas.green()));
|
| + REPORTER_ASSERT(r, almost_equal(expectedGammas[2], gammas.blue()));
|
| +#endif
|
| +
|
| + SkMatrix44 mat = space->xyz();
|
| + const float src[] = {
|
| + 1, 0, 0, 1,
|
| + 0, 1, 0, 1,
|
| + 0, 0, 1, 1,
|
| + };
|
| + float dst[4];
|
| + for (int i = 0; i < 3; ++i) {
|
| + mat.mapScalars(&src[i*4], dst);
|
| + REPORTER_ASSERT(r, almost_equal(red[i], dst[0]));
|
| + REPORTER_ASSERT(r, almost_equal(green[i], dst[1]));
|
| + REPORTER_ASSERT(r, almost_equal(blue[i], dst[2]));
|
| + }
|
| +}
|
| +
|
| +DEF_TEST(ColorSpace_sRGB, r) {
|
| + const float srgb_r[] = { 0.4358f, 0.2224f, 0.0139f };
|
| + const float srgb_g[] = { 0.3853f, 0.7170f, 0.0971f };
|
| + const float srgb_b[] = { 0.1430f, 0.0606f, 0.7139f };
|
| + const float srgb_gamma[] = { 2.2f, 2.2f, 2.2f };
|
| + test_space(r, SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named).get(),
|
| + srgb_r, srgb_g, srgb_b, srgb_gamma);
|
| +
|
| +}
|
| +
|
| static SkStreamAsset* resource(const char path[]) {
|
| SkString fullPath = GetResourcePath(path);
|
| return SkStream::NewFromFile(fullPath.c_str());
|
| }
|
|
|
| -static bool almost_equal(float a, float b) {
|
| - return SkTAbs(a - b) < 0.001f;
|
| -}
|
| -
|
| DEF_TEST(ColorSpaceParsePngICCProfile, r) {
|
| SkAutoTDelete<SkStream> stream(resource("color_wheel_with_profile.png"));
|
| REPORTER_ASSERT(r, nullptr != stream);
|
| @@ -35,27 +70,11 @@ DEF_TEST(ColorSpaceParsePngICCProfile, r) {
|
| SkColorSpace* colorSpace = codec->getColorSpace();
|
| REPORTER_ASSERT(r, nullptr != colorSpace);
|
|
|
| - // The color profile that we have extracted has represents gamma with a lookup table.
|
| - // So we expect the gamma value to be zero.
|
| -#ifdef SK_DEBUG
|
| - const SkColorSpace::SkGammas& gammas = colorSpace->gammas();
|
| - REPORTER_ASSERT(r, 0.0f == gammas.red());
|
| - REPORTER_ASSERT(r, 0.0f == gammas.green());
|
| - REPORTER_ASSERT(r, 0.0f == gammas.blue());
|
| -#endif
|
| -
|
| - // These nine values were extracted from the color profile in isolation (before
|
| - // we embedded it in the png). Here we check that we still extract the same values.
|
| - SkFloat3x3 xyz = colorSpace->xyz();
|
| - REPORTER_ASSERT(r, almost_equal(0.436066f, xyz.fMat[0]));
|
| - REPORTER_ASSERT(r, almost_equal(0.222488f, xyz.fMat[1]));
|
| - REPORTER_ASSERT(r, almost_equal(0.013916f, xyz.fMat[2]));
|
| - REPORTER_ASSERT(r, almost_equal(0.385147f, xyz.fMat[3]));
|
| - REPORTER_ASSERT(r, almost_equal(0.716873f, xyz.fMat[4]));
|
| - REPORTER_ASSERT(r, almost_equal(0.0970764f, xyz.fMat[5]));
|
| - REPORTER_ASSERT(r, almost_equal(0.143066f, xyz.fMat[6]));
|
| - REPORTER_ASSERT(r, almost_equal(0.0606079f, xyz.fMat[7]));
|
| - REPORTER_ASSERT(r, almost_equal(0.714096f, xyz.fMat[8]));
|
| + const float red[] = { 0.436066f, 0.222488f, 0.013916f };
|
| + const float green[] = { 0.385147f, 0.716873f, 0.0970764f };
|
| + const float blue[] = { 0.143066f, 0.0606079f, 0.714096f };
|
| + const float gamma[] = { 0, 0, 0 }; // table-based gamma returns 0 from this its float-getter
|
| + test_space(r, colorSpace, red, green, blue, gamma);
|
| #endif
|
| }
|
|
|
| @@ -75,26 +94,9 @@ DEF_TEST(ColorSpaceParseJpegICCProfile, r) {
|
| SkColorSpace* colorSpace = codec->getColorSpace();
|
| REPORTER_ASSERT(r, nullptr != colorSpace);
|
|
|
| - // It's important to use almost equal here. This profile sets gamma as
|
| - // 563 / 256, which actually comes out to about 2.19922.
|
| -#ifdef SK_DEBUG
|
| - const SkColorSpace::SkGammas& gammas = colorSpace->gammas();
|
| - REPORTER_ASSERT(r, almost_equal(2.2f, gammas.red()));
|
| - REPORTER_ASSERT(r, almost_equal(2.2f, gammas.green()));
|
| - REPORTER_ASSERT(r, almost_equal(2.2f, gammas.blue()));
|
| -#endif
|
| -
|
| - // These nine values were extracted from the color profile. Until we know any
|
| - // better, we'll assume these are the right values and test that we continue
|
| - // to extract them properly.
|
| - SkFloat3x3 xyz = colorSpace->xyz();
|
| - REPORTER_ASSERT(r, almost_equal(0.385117f, xyz.fMat[0]));
|
| - REPORTER_ASSERT(r, almost_equal(0.716904f, xyz.fMat[1]));
|
| - REPORTER_ASSERT(r, almost_equal(0.0970612f, xyz.fMat[2]));
|
| - REPORTER_ASSERT(r, almost_equal(0.143051f, xyz.fMat[3]));
|
| - REPORTER_ASSERT(r, almost_equal(0.0606079f, xyz.fMat[4]));
|
| - REPORTER_ASSERT(r, almost_equal(0.713913f, xyz.fMat[5]));
|
| - REPORTER_ASSERT(r, almost_equal(0.436035f, xyz.fMat[6]));
|
| - REPORTER_ASSERT(r, almost_equal(0.222488f, xyz.fMat[7]));
|
| - REPORTER_ASSERT(r, almost_equal(0.013916f, xyz.fMat[8]));
|
| + const float red[] = { 0.385117f, 0.716904f, 0.0970612f };
|
| + const float green[] = { 0.143051f, 0.0606079f, 0.713913f };
|
| + const float blue[] = { 0.436035f, 0.222488f, 0.013916f };
|
| + const float gamma[] = { 2.2f, 2.2f, 2.2f };
|
| + test_space(r, colorSpace, red, green, blue, gamma);
|
| }
|
|
|