blob: 788e9465e4e7e56857e9f0788fe2d022d60267ba [file]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SKIA_EXT_SKCMS_EXT_H_
#define SKIA_EXT_SKCMS_EXT_H_
#include <array>
#include "third_party/skia/include/private/base/SkAPI.h"
#include "third_party/skia/modules/skcms/skcms.h"
// Functionality that is currently not provided by skcms, but may eventually
// be rolled into skcms.
namespace skcms {
// A vector that represents an RGB triple.
struct SK_API Vector3 {
std::array<float, 3> vals;
};
// Perform the specified matrix-vector multiplication and return the result.
SK_API Vector3 Matrix3x3_apply(const skcms_Matrix3x3& m, const Vector3& v);
// Return the result of `m` inverted and multiplied by `v`. If `succeeded`
// is non-nullptr then set it to false if `m` is uninvertible. If `succeeded`
// is nullptr, then CHECK that `m` is invertible.
SK_API Vector3 Matrix3x3_apply_inverse(const skcms_Matrix3x3& m,
const Vector3& v,
bool* succeeded = nullptr);
// Invert and apply the specified matrix. If `succeeded` is non-nullptr, then
// set it to false if `m` is uninvertible. If `succeeded` is nullptr, then
// CHECK that `m` is invertible.
SK_API skcms_Matrix3x3 Matrix3x3_invert(const skcms_Matrix3x3& m,
bool* succeeded = nullptr);
// Apply the specified transfer function to the specified vector. This only
// handles sRGB-ish functions, and has slightly different precision compared
// with skcms_TransferFunction_eval. See https://crbug.com/331320414.
SK_API Vector3 TransferFunction_apply(const skcms_TransferFunction& trfn,
const Vector3& v);
// Invert and apply the specified transfer function. If `succeeded` is
// non-nullptr, then set it to false if `trfn` is uninvertible. If `succeeded`
// is nullptr, then CHECK that `trfn` is invertible.
SK_API Vector3
TransferFunction_apply_inverse(const skcms_TransferFunction& trfn,
const Vector3& v,
bool* succeeded = nullptr);
SK_API bool Equal(const skcms_TransferFunction& a,
const skcms_TransferFunction& b);
SK_API bool Equal(const skcms_Matrix3x3& a, const skcms_Matrix3x3& b);
} // namespace skcms
#endif // SKIA_EXT_SKCMS_EXT_H_