blob: 01de0600135476e8fa38fd8659d809dd2a4fcc21 [file] [log] [blame]
/*
* Copyright 2025 Advanced Micro Devices, Inc.
* SPDX-License-Identifier: MIT
*
*----------------------------------------------------------------------
* File Name : cvd_api_funcs.c
* Purpose : Color Vision Deficiency functions
* Author : Vladimir Lachine (vlachine@amd.com)
* Date : January 21, 2020
* Version : 1.0
*----------------------------------------------------------------------
*
*/
#ifndef GM_SIM
#pragma code_seg("PAGED3PC")
#pragma data_seg("PAGED3PD")
#pragma const_seg("PAGED3PR")
#endif
#include "cvd_api_funcs.h"
void cvd_api_set_def(struct s_cvd_api_opts *ptr_api_cvd_opts)
{
int nk;
ptr_api_cvd_opts->mode = ECM_NONE;
for (nk = 0; nk < 3; nk++)
ptr_api_cvd_opts->gain[nk] = 0.0;
cs_set_opts_def(&ptr_api_cvd_opts->cs_opts);
ptr_api_cvd_opts->en_merge_3dlut = 0;
ptr_api_cvd_opts->num_pnts_3dlut = 17;
ptr_api_cvd_opts->bitwidth_3dlut = 12;
ptr_api_cvd_opts->ptr_3dlut_rgb = 0;
}
int cvd_api_gen_map(struct s_cvd_api_opts *ptr_api_cvd_opts, struct s_cvd_map *ptr_cvd_map)
{
int nk;
cvd_set_def(ptr_cvd_map);
ptr_cvd_map->mode = ptr_api_cvd_opts->mode;
for (nk = 0; nk < 3; nk++)
ptr_cvd_map->gain[nk] = ptr_api_cvd_opts->gain[nk];
cs_init(&ptr_api_cvd_opts->cs_opts, &ptr_cvd_map->color_space);
return 0;
}
int cvd_api_gen_3dlut(struct s_cvd_api_opts *ptr_api_cvd_opts, struct s_cvd_map *ptr_cvd_map)
{
int index = 0;
int nir, nig, nib;
int value_max;
if (ptr_api_cvd_opts->ptr_3dlut_rgb == 0)
return -1; /* something wrong */
value_max = (1 << ptr_api_cvd_opts->bitwidth_3dlut) - 1;
for (nir = 0; nir < ptr_api_cvd_opts->num_pnts_3dlut; nir++)
for (nig = 0; nig < ptr_api_cvd_opts->num_pnts_3dlut; nig++)
for (nib = 0; nib < ptr_api_cvd_opts->num_pnts_3dlut; nib++) {
unsigned short rgb[3];
MATFLOAT rgb_inp[3], rgb_out[3];
rgb[0] = ptr_api_cvd_opts->en_merge_3dlut ? ptr_api_cvd_opts->ptr_3dlut_rgb[index + 0] :
(nir * value_max) / (ptr_api_cvd_opts->num_pnts_3dlut - 1);
rgb[1] = ptr_api_cvd_opts->en_merge_3dlut ? ptr_api_cvd_opts->ptr_3dlut_rgb[index + 1] :
(nig * value_max) / (ptr_api_cvd_opts->num_pnts_3dlut - 1);
rgb[2] = ptr_api_cvd_opts->en_merge_3dlut ? ptr_api_cvd_opts->ptr_3dlut_rgb[index + 2] :
(nib * value_max) / (ptr_api_cvd_opts->num_pnts_3dlut - 1);
cs_short2flt_rgb(rgb, rgb_inp, value_max);
cvd_rgb_to_rgb(ptr_cvd_map, rgb_inp, rgb_out);
cs_flt2short_rgb(rgb_out, &ptr_api_cvd_opts->ptr_3dlut_rgb[index], value_max);
index += 3;
}
return 0;
}