@@ -2116,6 +2116,30 @@ 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+ const struct pl_raw_primaries * best = NULL ;
2124+ for (enum pl_color_primaries prim = 1 ; prim < PL_COLOR_PRIM_COUNT ; prim ++ ) {
2125+ if (!primaries_map [prim ])
2126+ continue ;
2127+ const struct pl_raw_primaries * raw = pl_raw_primaries_get (prim );
2128+ if (pl_raw_primaries_similar (raw , gamut )) {
2129+ container = prim ;
2130+ best = raw ;
2131+ break ;
2132+ }
2133+ if (pl_primaries_superset (raw , gamut ) &&
2134+ (!best || pl_primaries_superset (best , raw )))
2135+ {
2136+ container = prim ;
2137+ best = raw ;
2138+ }
2139+ }
2140+ return container ;
2141+ }
2142+
21192143static void color_manager_done (void * data , struct wp_color_manager_v1 * color_manager )
21202144{
21212145}
@@ -2184,7 +2208,7 @@ static void info_done(void *data, struct wp_image_description_info_v1 *image_des
21842208 MP_VERBOSE (wl , "Preferred surface feedback received:\n" );
21852209 log_color_space (wl -> log , wd );
21862210 if (!wd -> csp .primaries ) {
2187- wd -> csp .primaries = mp_get_best_prim_container ( & wd -> raw_prim );
2211+ wd -> csp .primaries = get_best_supported_prim_container ( wl -> primaries_map , & wd -> raw_prim );
21882212 MP_VERBOSE (wl , "Setting best primary container from raw primaries: %s\n" ,
21892213 m_opt_choice_str (pl_csp_prim_names , wd -> csp .primaries ));
21902214 }
0 commit comments