/*
 * Copyright 2025 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "src/codec/SkCodecColorProfileRust.h"

#include "rust/icc/FFI.rs.h"

namespace SkCodecs {

std::unique_ptr<ColorProfile> MakeICCProfileWithRust(
        sk_sp<const SkData> data) {
    if (data) {
        rust_icc::IccProfile rust_profile;

        if (rust_icc::parse_icc_profile(
                    rust::Slice<const uint8_t>(data->bytes(), data->size()), rust_profile)) {
                // Move the Rust profile to the heap so that its Vec<u8> data
                // (grid tables, curve tables) outlives this function.  The
                // skcms_ICCProfile we build below contains raw pointers into
                // that data.
                auto retained = std::shared_ptr<rust_icc::IccProfile>(
                        new rust_icc::IccProfile(std::move(rust_profile)));

                skcms_ICCProfile profile;
                if (!rust_icc::ToSkcmsIccProfile(*retained, &profile)) {
                    return nullptr;
                }
                auto result = std::unique_ptr<ColorProfile>(
                        new ColorProfile(profile, std::move(data)));
                result->fRetainedData = retained;
                return result;
        }
    }
    return nullptr;
}

}  // namespace SkCodecs
