@@ -2116,6 +2116,33 @@ static void supported_primaries_named(void *data, struct wp_color_manager_v1 *co
21162116 wl -> primaries_map [pl_primaries ] = primaries ;
21172117}
21182118
2119+ static enum pl_color_primaries get_best_supported_prim_container (const int primaries_map [PL_COLOR_PRIM_COUNT ],
2120+ const struct pl_raw_primaries * gamut )
2121+ {
2122+ enum pl_color_primaries container = PL_COLOR_PRIM_UNKNOWN ;
2123+ enum pl_color_primaries widest = PL_COLOR_PRIM_UNKNOWN ;
2124+ const struct pl_raw_primaries * best = NULL ;
2125+ const struct pl_raw_primaries * widest_raw = NULL ;
2126+ for (enum pl_color_primaries prim = 1 ; prim < PL_COLOR_PRIM_COUNT ; prim ++ ) {
2127+ if (!primaries_map [prim ])
2128+ continue ;
2129+ const struct pl_raw_primaries * raw = pl_raw_primaries_get (prim );
2130+ if (pl_raw_primaries_similar (raw , gamut ))
2131+ return prim ;
2132+ if (pl_primaries_superset (raw , gamut ) &&
2133+ (!best || pl_primaries_superset (best , raw )))
2134+ {
2135+ container = prim ;
2136+ best = raw ;
2137+ }
2138+ if (!widest_raw || pl_primaries_superset (raw , widest_raw )) {
2139+ widest = prim ;
2140+ widest_raw = raw ;
2141+ }
2142+ }
2143+ return container != PL_COLOR_PRIM_UNKNOWN ? container : widest ;
2144+ }
2145+
21192146static void color_manager_done (void * data , struct wp_color_manager_v1 * color_manager )
21202147{
21212148}
@@ -2184,7 +2211,7 @@ static void info_done(void *data, struct wp_image_description_info_v1 *image_des
21842211 MP_VERBOSE (wl , "Preferred surface feedback received:\n" );
21852212 log_color_space (wl -> log , wd );
21862213 if (!wd -> csp .primaries ) {
2187- wd -> csp .primaries = mp_get_best_prim_container ( & wd -> raw_prim );
2214+ wd -> csp .primaries = get_best_supported_prim_container ( wl -> primaries_map , & wd -> raw_prim );
21882215 MP_VERBOSE (wl , "Setting best primary container from raw primaries: %s\n" ,
21892216 m_opt_choice_str (pl_csp_prim_names , wd -> csp .primaries ));
21902217 }
0 commit comments