blob: 6edff75e5773dd23f1dad011179fee5a3395391f [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "skia/ext/skcolorspace_primaries.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace skia {
namespace {
constexpr float kEpsilon = 0.0001;
TEST(SkiaUtils, PrimariesD65) {
// DCI P3 (D65)
const auto p3 = SkNamedPrimariesExt::kP3;
skcms_Matrix3x3 matrix;
EXPECT_TRUE(p3.toXYZD50(&matrix));
const auto primaries_from_matrix = GetD65PrimariesFromToXYZD50Matrix(matrix);
// The retrieved primaries from the matrix should be the same as the original
// primaries, because the original primaries had a D65 white point.
EXPECT_NEAR(p3.fRX, primaries_from_matrix.fRX, kEpsilon);
EXPECT_NEAR(p3.fRY, primaries_from_matrix.fRY, kEpsilon);
EXPECT_NEAR(p3.fGX, primaries_from_matrix.fGX, kEpsilon);
EXPECT_NEAR(p3.fGY, primaries_from_matrix.fGY, kEpsilon);
EXPECT_NEAR(p3.fBX, primaries_from_matrix.fBX, kEpsilon);
EXPECT_NEAR(p3.fBY, primaries_from_matrix.fBY, kEpsilon);
EXPECT_NEAR(p3.fWX, primaries_from_matrix.fWX, kEpsilon);
EXPECT_NEAR(p3.fWY, primaries_from_matrix.fWY, kEpsilon);
}
TEST(SkiaUtils, PrimariesD50) {
// ProPhoto (which has a D50 white point)
const auto pro_photo = SkNamedPrimariesExt::kProPhotoRGB;
// Convert primaries to a matrix.
skcms_Matrix3x3 pro_photo_matrix;
EXPECT_TRUE(pro_photo.toXYZD50(&pro_photo_matrix));
// The convert the matrix back to primaries with a D65 white point.
const auto d65 = GetD65PrimariesFromToXYZD50Matrix(pro_photo_matrix);
// And then convert the D65 primaries to a matrix.
skcms_Matrix3x3 d65_matrix;
EXPECT_TRUE(d65.toXYZD50(&d65_matrix));
// The two matrices should be the same, but the primaries will not be.
EXPECT_FALSE(pro_photo == d65);
for (size_t i = 0; i < 3; ++i) {
for (size_t j = 0; j < 3; ++j) {
EXPECT_NEAR(pro_photo_matrix.vals[i][j], d65_matrix.vals[i][j], kEpsilon);
}
}
}
} // namespace
} // namespace skia