/** ***************************************************************************** * Function: setup_adjustments * @note prepare to setup the values * * @see * ***************************************************************************** */ static void setup_adjustments(const struct opp_grph_csc_adjustment *adjust, struct dc_csc_adjustments *adjustments) { if (adjust->adjust_divider != 0) { adjustments->brightness = dal_fixed31_32_from_fraction(adjust->grph_bright, adjust->adjust_divider); adjustments->contrast = dal_fixed31_32_from_fraction(adjust->grph_cont, adjust->adjust_divider); adjustments->saturation = dal_fixed31_32_from_fraction(adjust->grph_sat, adjust->adjust_divider); } else { adjustments->brightness = dal_fixed31_32_from_fraction(adjust->grph_bright, 1); adjustments->contrast = dal_fixed31_32_from_fraction(adjust->grph_cont, 1); adjustments->saturation = dal_fixed31_32_from_fraction(adjust->grph_sat, 1); } /* convert degrees into radians */ adjustments->hue = dal_fixed31_32_mul( dal_fixed31_32_from_fraction(adjust->grph_hue, 180), dal_fixed31_32_pi); }
void calculate_adjustments( const struct fixed31_32 *ideal_matrix, const struct dc_csc_adjustments *adjustments, struct fixed31_32 *matrix) { calculate_adjustments_common(ideal_matrix, adjustments, matrix); matrix[3] = dal_fixed31_32_add( ideal_matrix[3], dal_fixed31_32_mul( adjustments->brightness, dal_fixed31_32_from_fraction(86, 100))); }
/* * initialize_color_float_adj_reference_values * This initialize display color adjust input from API to HW range for later * calculation use. This is shared by all the display color adjustment. * @param : * @return None */ static void initialize_color_float_adj_reference_values( const struct opp_grph_csc_adjustment *adjust, struct fixed31_32 *grph_cont, struct fixed31_32 *grph_sat, struct fixed31_32 *grph_bright, struct fixed31_32 *sin_grph_hue, struct fixed31_32 *cos_grph_hue) { /* Hue adjustment could be negative. -45 ~ +45 */ struct fixed31_32 hue = dal_fixed31_32_mul( dal_fixed31_32_from_fraction(adjust->grph_hue, 180), dal_fixed31_32_pi); *sin_grph_hue = dal_fixed31_32_sin(hue); *cos_grph_hue = dal_fixed31_32_cos(hue); if (adjust->adjust_divider) { *grph_cont = dal_fixed31_32_from_fraction( adjust->grph_cont, adjust->adjust_divider); *grph_sat = dal_fixed31_32_from_fraction( adjust->grph_sat, adjust->adjust_divider); *grph_bright = dal_fixed31_32_from_fraction( adjust->grph_bright, adjust->adjust_divider); } else { *grph_cont = dal_fixed31_32_from_int(adjust->grph_cont); *grph_sat = dal_fixed31_32_from_int(adjust->grph_sat); *grph_bright = dal_fixed31_32_from_int(adjust->grph_bright); } }
enum ds_return dal_grph_colors_group_get_color_gamut( struct grph_colors_group *grph_colors_adj, struct display_path *disp_path, const struct ds_gamut_reference_data *ref, struct ds_get_gamut_data *data) { enum ds_return ret; uint32_t display_index; struct adj_container *adj_container = NULL; struct adjustment_info *temperature_src = NULL; const struct display_characteristics *disp_char = NULL; struct color_characteristic color_charact = {{0 } }; struct gamut_data gamut_data; enum adjustment_id adj_id; struct fixed31_32 result; if (!disp_path) return DS_ERROR; display_index = dal_display_path_get_display_index( disp_path); adj_container = dal_ds_dispatch_get_adj_container_for_path( grph_colors_adj->ds, display_index); if (!adj_container) return DS_ERROR; if (!dal_hw_sequencer_is_support_custom_gamut_adj( grph_colors_adj->hws, disp_path, HW_GRAPHIC_SURFACE)) return DS_ERROR; dal_memset(&gamut_data, 0, sizeof(gamut_data)); if (!dal_ds_translate_gamut_reference( ref, &adj_id)) return DS_ERROR; if (adj_id == ADJ_ID_GAMUT_DESTINATION) { temperature_src = dal_adj_info_set_get_adj_info( &adj_container->adj_info_set, ADJ_ID_TEMPERATURE_SOURCE); if (temperature_src != NULL && temperature_src->adj_data.ranged.cur == COLOR_TEMPERATURE_SOURCE_EDID) { disp_char = dal_adj_container_get_disp_character( adj_container); if (!disp_char) return DS_ERROR; if (!dal_gamut_space_convert_edid_format_color_charact( disp_char->color_characteristics, &color_charact)) return DS_ERROR; gamut_data.option.bits.CUSTOM_GAMUT_SPACE = 1; gamut_data.option.bits.CUSTOM_WHITE_POINT = 1; result = dal_fixed31_32_mul( dal_fixed31_32_from_int( (int64_t)GAMUT_DIVIDER), color_charact.red_x); gamut_data.gamut.custom.red_x = dal_fixed31_32_floor(result); result = dal_fixed31_32_mul( dal_fixed31_32_from_int( (int64_t)GAMUT_DIVIDER), color_charact.red_y); gamut_data.gamut.custom.red_y = dal_fixed31_32_floor(result); result = dal_fixed31_32_mul( dal_fixed31_32_from_int( (int64_t)GAMUT_DIVIDER), color_charact.blue_x); gamut_data.gamut.custom.blue_x = dal_fixed31_32_floor(result); result = dal_fixed31_32_mul( dal_fixed31_32_from_int( (int64_t)GAMUT_DIVIDER), color_charact.blue_y); gamut_data.gamut.custom.blue_y = dal_fixed31_32_floor(result); result = dal_fixed31_32_mul( dal_fixed31_32_from_int( (int64_t)GAMUT_DIVIDER), color_charact.green_x); gamut_data.gamut.custom.green_x = dal_fixed31_32_floor(result); result = dal_fixed31_32_mul( dal_fixed31_32_from_int( (int64_t)GAMUT_DIVIDER), color_charact.green_y); gamut_data.gamut.custom.green_y = dal_fixed31_32_floor(result); result = dal_fixed31_32_mul( dal_fixed31_32_from_int( (int64_t)GAMUT_DIVIDER), color_charact.white_x); gamut_data.white_point.custom.white_x = dal_fixed31_32_floor(result); result = dal_fixed31_32_mul( dal_fixed31_32_from_int( (int64_t)GAMUT_DIVIDER), color_charact.white_y); gamut_data.white_point.custom.white_y = dal_fixed31_32_floor(result); ret = DS_SUCCESS; } } if (ret != DS_SUCCESS) if (!dal_adj_container_get_gamut( adj_container, adj_id, &gamut_data)) return DS_ERROR; if (!dal_ds_translate_internal_gamut_to_external_parameter( &gamut_data, &data->gamut)) return DS_ERROR; return ret; }
static void calculate_adjustments_common( const struct fixed31_32 *ideal_matrix, const struct dc_csc_adjustments *adjustments, struct fixed31_32 *matrix) { const struct fixed31_32 sin_hue = dal_fixed31_32_sin(adjustments->hue); const struct fixed31_32 cos_hue = dal_fixed31_32_cos(adjustments->hue); const struct fixed31_32 multiplier = dal_fixed31_32_mul( adjustments->contrast, adjustments->saturation); matrix[0] = dal_fixed31_32_mul( ideal_matrix[0], adjustments->contrast); matrix[1] = dal_fixed31_32_mul( ideal_matrix[1], adjustments->contrast); matrix[2] = dal_fixed31_32_mul( ideal_matrix[2], adjustments->contrast); matrix[4] = dal_fixed31_32_mul( multiplier, dal_fixed31_32_add( dal_fixed31_32_mul( ideal_matrix[8], sin_hue), dal_fixed31_32_mul( ideal_matrix[4], cos_hue))); matrix[5] = dal_fixed31_32_mul( multiplier, dal_fixed31_32_add( dal_fixed31_32_mul( ideal_matrix[9], sin_hue), dal_fixed31_32_mul( ideal_matrix[5], cos_hue))); matrix[6] = dal_fixed31_32_mul( multiplier, dal_fixed31_32_add( dal_fixed31_32_mul( ideal_matrix[10], sin_hue), dal_fixed31_32_mul( ideal_matrix[6], cos_hue))); matrix[7] = ideal_matrix[7]; matrix[8] = dal_fixed31_32_mul( multiplier, dal_fixed31_32_sub( dal_fixed31_32_mul( ideal_matrix[8], cos_hue), dal_fixed31_32_mul( ideal_matrix[4], sin_hue))); matrix[9] = dal_fixed31_32_mul( multiplier, dal_fixed31_32_sub( dal_fixed31_32_mul( ideal_matrix[9], cos_hue), dal_fixed31_32_mul( ideal_matrix[5], sin_hue))); matrix[10] = dal_fixed31_32_mul( multiplier, dal_fixed31_32_sub( dal_fixed31_32_mul( ideal_matrix[10], cos_hue), dal_fixed31_32_mul( ideal_matrix[6], sin_hue))); matrix[11] = ideal_matrix[11]; }
/** ***************************************************************************** * Function: dal_transform_wide_gamut_set_rgb_adjustment_legacy * * @param [in] const struct opp_grph_csc_adjustment *adjust * * @return * void * * @note calculate and program color adjustments for sRGB color space * * @see * ***************************************************************************** */ static void set_rgb_adjustment_legacy( struct dce110_opp *opp110, const struct opp_grph_csc_adjustment *adjust) { const struct fixed31_32 k1 = dal_fixed31_32_from_fraction(701000, 1000000); const struct fixed31_32 k2 = dal_fixed31_32_from_fraction(236568, 1000000); const struct fixed31_32 k3 = dal_fixed31_32_from_fraction(-587000, 1000000); const struct fixed31_32 k4 = dal_fixed31_32_from_fraction(464432, 1000000); const struct fixed31_32 k5 = dal_fixed31_32_from_fraction(-114000, 1000000); const struct fixed31_32 k6 = dal_fixed31_32_from_fraction(-701000, 1000000); const struct fixed31_32 k7 = dal_fixed31_32_from_fraction(-299000, 1000000); const struct fixed31_32 k8 = dal_fixed31_32_from_fraction(-292569, 1000000); const struct fixed31_32 k9 = dal_fixed31_32_from_fraction(413000, 1000000); const struct fixed31_32 k10 = dal_fixed31_32_from_fraction(-92482, 1000000); const struct fixed31_32 k11 = dal_fixed31_32_from_fraction(-114000, 1000000); const struct fixed31_32 k12 = dal_fixed31_32_from_fraction(385051, 1000000); const struct fixed31_32 k13 = dal_fixed31_32_from_fraction(-299000, 1000000); const struct fixed31_32 k14 = dal_fixed31_32_from_fraction(886000, 1000000); const struct fixed31_32 k15 = dal_fixed31_32_from_fraction(-587000, 1000000); const struct fixed31_32 k16 = dal_fixed31_32_from_fraction(-741914, 1000000); const struct fixed31_32 k17 = dal_fixed31_32_from_fraction(886000, 1000000); const struct fixed31_32 k18 = dal_fixed31_32_from_fraction(-144086, 1000000); const struct fixed31_32 luma_r = dal_fixed31_32_from_fraction(299, 1000); const struct fixed31_32 luma_g = dal_fixed31_32_from_fraction(587, 1000); const struct fixed31_32 luma_b = dal_fixed31_32_from_fraction(114, 1000); struct out_csc_color_matrix tbl_entry; struct fixed31_32 matrix[OUTPUT_CSC_MATRIX_SIZE]; struct fixed31_32 grph_cont; struct fixed31_32 grph_sat; struct fixed31_32 grph_bright; struct fixed31_32 sin_grph_hue; struct fixed31_32 cos_grph_hue; initialize_color_float_adj_reference_values( adjust, &grph_cont, &grph_sat, &grph_bright, &sin_grph_hue, &cos_grph_hue); /* COEF_1_1 = GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K1 + * Sin(GrphHue) * K2)) */ /* (Cos(GrphHue) * K1 + Sin(GrphHue) * K2) */ matrix[0] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k1), dal_fixed31_32_mul(sin_grph_hue, k2)); /* GrphSat * (Cos(GrphHue) * K1 + Sin(GrphHue) * K2 */ matrix[0] = dal_fixed31_32_mul(grph_sat, matrix[0]); /* (LumaR + GrphSat * (Cos(GrphHue) * K1 + Sin(GrphHue) * K2)) */ matrix[0] = dal_fixed31_32_add(luma_r, matrix[0]); /* GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K1 + Sin(GrphHue) * * K2)) */ matrix[0] = dal_fixed31_32_mul(grph_cont, matrix[0]); /* COEF_1_2 = GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K3 + * Sin(GrphHue) * K4)) */ /* (Cos(GrphHue) * K3 + Sin(GrphHue) * K4) */ matrix[1] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k3), dal_fixed31_32_mul(sin_grph_hue, k4)); /* GrphSat * (Cos(GrphHue) * K3 + Sin(GrphHue) * K4) */ matrix[1] = dal_fixed31_32_mul(grph_sat, matrix[1]); /* (LumaG + GrphSat * (Cos(GrphHue) * K3 + Sin(GrphHue) * K4)) */ matrix[1] = dal_fixed31_32_add(luma_g, matrix[1]); /* GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K3 + Sin(GrphHue) * * K4)) */ matrix[1] = dal_fixed31_32_mul(grph_cont, matrix[1]); /* COEF_1_3 = GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K5 + * Sin(GrphHue) * K6)) */ /* (Cos(GrphHue) * K5 + Sin(GrphHue) * K6) */ matrix[2] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k5), dal_fixed31_32_mul(sin_grph_hue, k6)); /* GrphSat * (Cos(GrphHue) * K5 + Sin(GrphHue) * K6) */ matrix[2] = dal_fixed31_32_mul(grph_sat, matrix[2]); /* LumaB + GrphSat * (Cos(GrphHue) * K5 + Sin(GrphHue) * K6) */ matrix[2] = dal_fixed31_32_add(luma_b, matrix[2]); /* GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K5 + Sin(GrphHue) * * K6)) */ matrix[2] = dal_fixed31_32_mul(grph_cont, matrix[2]); /* COEF_1_4 = GrphBright */ matrix[3] = grph_bright; /* COEF_2_1 = GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K7 + * Sin(GrphHue) * K8)) */ /* (Cos(GrphHue) * K7 + Sin(GrphHue) * K8) */ matrix[4] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k7), dal_fixed31_32_mul(sin_grph_hue, k8)); /* GrphSat * (Cos(GrphHue) * K7 + Sin(GrphHue) * K8) */ matrix[4] = dal_fixed31_32_mul(grph_sat, matrix[4]); /* (LumaR + GrphSat * (Cos(GrphHue) * K7 + Sin(GrphHue) * K8)) */ matrix[4] = dal_fixed31_32_add(luma_r, matrix[4]); /* GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K7 + Sin(GrphHue) * * K8)) */ matrix[4] = dal_fixed31_32_mul(grph_cont, matrix[4]); /* COEF_2_2 = GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K9 + * Sin(GrphHue) * K10)) */ /* (Cos(GrphHue) * K9 + Sin(GrphHue) * K10)) */ matrix[5] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k9), dal_fixed31_32_mul(sin_grph_hue, k10)); /* GrphSat * (Cos(GrphHue) * K9 + Sin(GrphHue) * K10)) */ matrix[5] = dal_fixed31_32_mul(grph_sat, matrix[5]); /* (LumaG + GrphSat * (Cos(GrphHue) * K9 + Sin(GrphHue) * K10)) */ matrix[5] = dal_fixed31_32_add(luma_g, matrix[5]); /* GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K9 + Sin(GrphHue) * * K10)) */ matrix[5] = dal_fixed31_32_mul(grph_cont, matrix[5]); /* COEF_2_3 = GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K11 + * Sin(GrphHue) * K12)) */ /* (Cos(GrphHue) * K11 + Sin(GrphHue) * K12)) */ matrix[6] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k11), dal_fixed31_32_mul(sin_grph_hue, k12)); /* GrphSat * (Cos(GrphHue) * K11 + Sin(GrphHue) * K12)) */ matrix[6] = dal_fixed31_32_mul(grph_sat, matrix[6]); /* (LumaB + GrphSat * (Cos(GrphHue) * K11 + Sin(GrphHue) * K12)) */ matrix[6] = dal_fixed31_32_add(luma_b, matrix[6]); /* GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K11 + Sin(GrphHue) * * K12)) */ matrix[6] = dal_fixed31_32_mul(grph_cont, matrix[6]); /* COEF_2_4 = GrphBright */ matrix[7] = grph_bright; /* COEF_3_1 = GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K13 + * Sin(GrphHue) * K14)) */ /* (Cos(GrphHue) * K13 + Sin(GrphHue) * K14)) */ matrix[8] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k13), dal_fixed31_32_mul(sin_grph_hue, k14)); /* GrphSat * (Cos(GrphHue) * K13 + Sin(GrphHue) * K14)) */ matrix[8] = dal_fixed31_32_mul(grph_sat, matrix[8]); /* (LumaR + GrphSat * (Cos(GrphHue) * K13 + Sin(GrphHue) * K14)) */ matrix[8] = dal_fixed31_32_add(luma_r, matrix[8]); /* GrphCont * (LumaR + GrphSat * (Cos(GrphHue) * K13 + Sin(GrphHue) * * K14)) */ matrix[8] = dal_fixed31_32_mul(grph_cont, matrix[8]); /* COEF_3_2 = GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K15 + * Sin(GrphHue) * K16)) */ /* GrphSat * (Cos(GrphHue) * K15 + Sin(GrphHue) * K16) */ matrix[9] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k15), dal_fixed31_32_mul(sin_grph_hue, k16)); /* (LumaG + GrphSat * (Cos(GrphHue) * K15 + Sin(GrphHue) * K16)) */ matrix[9] = dal_fixed31_32_mul(grph_sat, matrix[9]); /* (LumaG + GrphSat * (Cos(GrphHue) * K15 + Sin(GrphHue) * K16)) */ matrix[9] = dal_fixed31_32_add(luma_g, matrix[9]); /* GrphCont * (LumaG + GrphSat * (Cos(GrphHue) * K15 + Sin(GrphHue) * * K16)) */ matrix[9] = dal_fixed31_32_mul(grph_cont, matrix[9]); /* COEF_3_3 = GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K17 + * Sin(GrphHue) * K18)) */ /* (Cos(GrphHue) * K17 + Sin(GrphHue) * K18)) */ matrix[10] = dal_fixed31_32_add( dal_fixed31_32_mul(cos_grph_hue, k17), dal_fixed31_32_mul(sin_grph_hue, k18)); /* GrphSat * (Cos(GrphHue) * K17 + Sin(GrphHue) * K18)) */ matrix[10] = dal_fixed31_32_mul(grph_sat, matrix[10]); /* (LumaB + GrphSat * (Cos(GrphHue) * K17 + Sin(GrphHue) * K18)) */ matrix[10] = dal_fixed31_32_add(luma_b, matrix[10]); /* GrphCont * (LumaB + GrphSat * (Cos(GrphHue) * K17 + Sin(GrphHue) * * K18)) */ matrix[10] = dal_fixed31_32_mul(grph_cont, matrix[10]); /* COEF_3_4 = GrphBright */ matrix[11] = grph_bright; tbl_entry.color_space = adjust->c_space; convert_float_matrix(tbl_entry.regval, matrix, OUTPUT_CSC_MATRIX_SIZE); program_color_matrix( opp110, &tbl_entry, adjust->color_adjust_option); }