Skip to content

Commit 15b7b4b

Browse files
committed
agx: Added _find_preferred_enabled_instance to develop.c (to be moved) to find 'best' exposure instance to read data from
1 parent b78586e commit 15b7b4b

File tree

1 file changed

+50
-5
lines changed

1 file changed

+50
-5
lines changed

src/develop/develop.c

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
29542990
float 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

Comments
 (0)