#ifndef COLOR_MOD_COLOR_GAMMA_H_
#define COLOR_MOD_COLOR_GAMMA_H_
struct dc_transfer_func;
struct dc_gamma;
struct dc_transfer_func_distributed_points;
struct dc_rgb_fixed;
enum dc_transfer_func_predefined;
union regamma_flags {
unsigned int raw;
struct {
unsigned int gammaRampArray :1;
unsigned int gammaFromEdid :1;
unsigned int gammaFromEdidEx :1;
unsigned int gammaFromUser :1;
unsigned int coeffFromUser :1;
unsigned int coeffFromEdid :1;
unsigned int applyDegamma :1;
unsigned int gammaPredefinedSRGB :1;
unsigned int gammaPredefinedPQ :1;
unsigned int gammaPredefinedPQ2084Interim :1;
unsigned int gammaPredefined36 :1;
unsigned int gammaPredefinedReset :1;
} bits;
};
struct regamma_ramp {
unsigned short gamma[256*3];
};
struct regamma_coeff {
int gamma[3];
int A0[3];
int A1[3];
int A2[3];
int A3[3];
};
struct regamma_lut {
union regamma_flags flags;
union {
struct regamma_ramp ramp;
struct regamma_coeff coeff;
};
};
void setup_x_points_distribution(void);
void precompute_pq(void);
void precompute_de_pq(void);
bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf,
const struct dc_gamma *ramp, bool mapUserRamp, bool canRomBeUsed);
bool mod_color_calculate_degamma_params(struct dc_transfer_func *output_tf,
const struct dc_gamma *ramp, bool mapUserRamp);
bool mod_color_calculate_curve(enum dc_transfer_func_predefined trans,
struct dc_transfer_func_distributed_points *points,
uint32_t sdr_ref_white_level);
bool mod_color_calculate_degamma_curve(enum dc_transfer_func_predefined trans,
struct dc_transfer_func_distributed_points *points);
bool calculate_user_regamma_coeff(struct dc_transfer_func *output_tf,
const struct regamma_lut *regamma);
bool calculate_user_regamma_ramp(struct dc_transfer_func *output_tf,
const struct regamma_lut *regamma);
#endif