@@ -2951,23 +2951,68 @@ float dt_dev_exposure_get_exposure(dt_develop_t *dev)
29512951 return instance && instance -> get_exposure && instance -> module -> enabled ? instance -> get_exposure (instance -> module ) : 0.0f ;
29522952}
29532953
2954+ static dt_iop_module_t * _find_preferred_enabled_instance (const dt_iop_module_so_t * module ,
2955+ const gboolean prefer_expanded ,
2956+ const gboolean prefer_unmasked ,
2957+ const gboolean prefer_first )
2958+ {
2959+ dt_iop_module_t * best_mod = NULL ;
2960+ int best_score = -1 ;
2961+
2962+ for (GList * iop_mods = g_list_last (darktable .develop -> iop );
2963+ iop_mods ;
2964+ iop_mods = g_list_previous (iop_mods ))
2965+ {
2966+ dt_iop_module_t * mod = iop_mods -> data ;
2967+
2968+ if (mod -> so == module && mod -> iop_order != INT_MAX )
2969+ {
2970+ if (!mod -> enabled )
2971+ continue ;
2972+
2973+ const gboolean no_mask = mod -> blend_params -> mask_mode == DEVELOP_MASK_DISABLED
2974+ || mod -> blend_params -> mask_mode == DEVELOP_MASK_ENABLED ;
2975+
2976+ const int score = (mod -> expanded && prefer_expanded ? 8 : 0 )
2977+ + (no_mask && prefer_unmasked ? 2 : 0 );
2978+
2979+ if (score + (prefer_first ? 1 : 0 ) > best_score )
2980+ {
2981+ best_score = score ;
2982+ best_mod = mod ;
2983+ }
2984+ }
2985+ }
2986+
2987+ return best_mod ;
2988+ }
2989+
29542990float dt_dev_exposure_get_effective_exposure (dt_develop_t * dev )
29552991{
29562992 if (dt_view_get_current () != DT_VIEW_DARKROOM ) return 0.0f ;
29572993
29582994 // The proxy function pointers are only set if an exposure module has been initialized.
29592995 if (!dev -> proxy .exposure .get_effective_exposure ) return 0.0f ;
29602996
2961- for (GList * l = dev -> iop ; l ; l = g_list_next (l ))
2962- {
2963- dt_iop_module_t * module = (dt_iop_module_t * )l -> data ;
2997+ const dt_iop_module_so_t * exposure_so = NULL ;
29642998
2965- if (module -> enabled && dt_iop_module_is (module -> so , "exposure" ))
2999+ for (const GList * modules = darktable .iop ; modules ; modules = g_list_next (modules ))
3000+ {
3001+ const dt_iop_module_so_t * module_so = modules -> data ;
3002+ if (dt_iop_module_is (module_so , "exposure" ))
29663003 {
2967- return dev -> proxy .exposure .get_effective_exposure (module );
3004+ exposure_so = module_so ;
3005+ break ;
29683006 }
29693007 }
29703008
3009+ if (exposure_so )
3010+ {
3011+ dt_iop_module_t * preferred_exposure_instance = _find_preferred_enabled_instance (exposure_so , FALSE, TRUE, TRUE);
3012+ if (preferred_exposure_instance )
3013+ return dev -> proxy .exposure .get_effective_exposure (preferred_exposure_instance );
3014+ }
3015+
29713016 return 0.0f ;
29723017}
29733018
0 commit comments