Beispiel #1
0
static void deflicker_histogram_source_callback(GtkWidget *combo, gpointer user_data)
{
  dt_iop_module_t *self = (dt_iop_module_t *)user_data;

  if(self->dt->gui->reset) return;

  if(!dt_image_is_raw(&self->dev->image_storage)) return;

  dt_iop_exposure_gui_data_t *g = (dt_iop_exposure_gui_data_t *)self->gui_data;
  dt_iop_exposure_params_t *p = (dt_iop_exposure_params_t *)self->params;

  const dt_iop_exposure_deflicker_histogram_source_t new_mode
      = GPOINTER_TO_UINT(g_list_nth_data(g->deflicker_histogram_sources, dt_bauhaus_combobox_get(combo)));

  switch(new_mode)
  {
    case DEFLICKER_HISTOGRAM_SOURCE_SOURCEFILE:
      p->deflicker_histogram_source = DEFLICKER_HISTOGRAM_SOURCE_SOURCEFILE;
      deflicker_prepare_histogram(self, &g->deflicker_histogram, &g->deflicker_histogram_stats);
      break;
    case DEFLICKER_HISTOGRAM_SOURCE_THUMBNAIL:
    default:
      p->deflicker_histogram_source = DEFLICKER_HISTOGRAM_SOURCE_THUMBNAIL;
      free(g->deflicker_histogram);
      g->deflicker_histogram = NULL;
      break;
  }

  dt_dev_add_history_item(darktable.develop, self, TRUE);
}
Beispiel #2
0
void gui_update(struct dt_iop_module_t *self)
{
  dt_iop_exposure_gui_data_t *g = (dt_iop_exposure_gui_data_t *)self->gui_data;
  dt_iop_exposure_params_t *p = (dt_iop_exposure_params_t *)self->params;

  if(!dt_image_is_raw(&self->dev->image_storage))
  {
    gtk_widget_hide(GTK_WIDGET(g->mode));
    p->mode = EXPOSURE_MODE_MANUAL;
    dt_dev_add_history_item(darktable.develop, self, TRUE);
  } else
  {
    gtk_widget_show(GTK_WIDGET(g->mode));
  }

  dt_bauhaus_combobox_set(g->mode, g_list_index(g->modes, GUINT_TO_POINTER(p->mode)));

  dt_bauhaus_slider_set(g->black, p->black);
  dt_bauhaus_slider_set_soft(g->exposure, p->exposure);

  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->autoexp), FALSE);
  dt_bauhaus_slider_set(g->autoexpp, 0.01);
  gtk_widget_set_sensitive(GTK_WIDGET(g->autoexpp), FALSE);

  dt_bauhaus_slider_set(g->deflicker_percentile, p->deflicker_percentile);
  dt_bauhaus_slider_set(g->deflicker_target_level, p->deflicker_target_level);
  dt_bauhaus_combobox_set(g->deflicker_histogram_source, g_list_index(g->deflicker_histogram_sources, GUINT_TO_POINTER(p->deflicker_histogram_source)));

  self->request_color_pick = DT_REQUEST_COLORPICK_OFF;

  free(g->deflicker_histogram);
  g->deflicker_histogram = NULL;

  g->reprocess_on_next_expose = FALSE;

  gtk_label_set_text(g->deflicker_used_EC, "");
  g->deflicker_computed_exposure = NAN;

  switch(p->mode)
  {
    case EXPOSURE_MODE_DEFLICKER:
      autoexp_disable(self);
      gtk_widget_hide(GTK_WIDGET(g->vbox_manual));
      gtk_widget_show(GTK_WIDGET(g->vbox_deflicker));

      if(p->deflicker_histogram_source == DEFLICKER_HISTOGRAM_SOURCE_SOURCEFILE)
        deflicker_prepare_histogram(self, &g->deflicker_histogram,
                                    &g->deflicker_histogram_stats);
      break;
    case EXPOSURE_MODE_MANUAL:
    default:
      gtk_widget_hide(GTK_WIDGET(g->vbox_deflicker));
      gtk_widget_show(GTK_WIDGET(g->vbox_manual));
      break;
  }
}
Beispiel #3
0
static void
mode_callback(GtkWidget *combo, gpointer user_data)
{
  dt_iop_module_t *self = (dt_iop_module_t *)user_data;

  if(darktable.gui->reset) return;

  dt_iop_exposure_gui_data_t *g = (dt_iop_exposure_gui_data_t *)self->gui_data;
  dt_iop_exposure_params_t *p = (dt_iop_exposure_params_t *)self->params;

  const dt_iop_exposure_mode_t new_mode = GPOINTER_TO_UINT(g_list_nth_data(g->modes, dt_bauhaus_combobox_get(combo)));

  free(g->deflicker_histogram);
  g->deflicker_histogram = NULL;

  switch(new_mode)
  {
    case EXPOSURE_MODE_DEFLICKER:
      autoexp_disable(self);
      if(!dt_image_is_raw(&self->dev->image_storage))
      {
        dt_bauhaus_combobox_set(g->mode, g_list_index(g->modes, GUINT_TO_POINTER(EXPOSURE_MODE_MANUAL)));
        gtk_widget_hide(GTK_WIDGET(g->mode));
        break;
      }
      p->mode = EXPOSURE_MODE_DEFLICKER;
      gtk_widget_hide(GTK_WIDGET(g->vbox_manual));
      gtk_widget_show(GTK_WIDGET(g->vbox_deflicker));
      if(p->deflicker_histogram_source == DEFLICKER_HISTOGRAM_SOURCE_SOURCEFILE)
        deflicker_prepare_histogram(self, &g->deflicker_histogram,
                                    &g->deflicker_histogram_stats);
      break;
    case EXPOSURE_MODE_MANUAL:
    default:
      p->mode = EXPOSURE_MODE_MANUAL;
      gtk_widget_hide(GTK_WIDGET(g->vbox_deflicker));
      gtk_widget_show(GTK_WIDGET(g->vbox_manual));
      break;
  }

  dt_dev_add_history_item(darktable.develop, self, TRUE);
}
Beispiel #4
0
void commit_params(struct dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pixelpipe_t *pipe,
                   dt_dev_pixelpipe_iop_t *piece)
{
  dt_iop_exposure_params_t *p = (dt_iop_exposure_params_t *)p1;
  dt_iop_exposure_data_t *d = (dt_iop_exposure_data_t *)piece->data;
  dt_iop_exposure_gui_data_t *g = (dt_iop_exposure_gui_data_t *)self->gui_data;

  d->black = p->black;
  d->exposure = p->exposure;

  piece->request_histogram &= ~(DT_REQUEST_ON);
  piece->request_histogram |= (DT_REQUEST_ONLY_IN_GUI);

  d->deflicker_percentile = p->deflicker_percentile;
  d->deflicker_target_level = p->deflicker_target_level;

  if(p->mode == EXPOSURE_MODE_DEFLICKER && dt_image_is_raw(&self->dev->image_storage))
  {
    if(p->deflicker_histogram_source == DEFLICKER_HISTOGRAM_SOURCE_SOURCEFILE)
    {
      if(g)
      {
        // histogram is precomputed and cached
        compute_correction(self, piece, g->deflicker_histogram, &g->deflicker_histogram_stats, &d->exposure);
      }
      else
      {
        uint32_t *histogram = NULL;
        dt_dev_histogram_stats_t histogram_stats;
        deflicker_prepare_histogram(self, &histogram, &histogram_stats);
        compute_correction(self, piece, histogram, &histogram_stats, &d->exposure);
        free(histogram);
      }
      d->mode = EXPOSURE_MODE_MANUAL;
    }
    else
    {
      if(p->deflicker_histogram_source == DEFLICKER_HISTOGRAM_SOURCE_THUMBNAIL)
      {
        d->mode = EXPOSURE_MODE_DEFLICKER;

        piece->request_histogram |= (DT_REQUEST_ON);

        if(!self->dev->gui_attached) piece->request_histogram &= ~(DT_REQUEST_ONLY_IN_GUI);

        piece->histogram_params.bins_count = 16384;

        /*
         * in principle, we do not need/want histogram in FULL pipe
         * because we will use histogram from preview pipe there,
         * but it might happen that for some reasons we do not have
         * histogram of preview pipe yet - e.g. on first pipe run
         * (just after setting mode to automatic)
         */

        d->exposure = NAN;

        // commit_params_late() will compute exposure later
      }
    }
  }
  else
  {
    d->mode = EXPOSURE_MODE_MANUAL;
  }
}
Beispiel #5
0
void commit_params (struct dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
{
  dt_iop_exposure_params_t *p = (dt_iop_exposure_params_t *)p1;
  dt_iop_exposure_data_t *d = (dt_iop_exposure_data_t *)piece->data;
  dt_iop_exposure_gui_data_t *g = (dt_iop_exposure_gui_data_t *)self->gui_data;

  d->black = p->black;
  d->exposure = p->exposure;

  self->request_histogram        &= ~(DT_REQUEST_ON);
  self->request_histogram        |=  (DT_REQUEST_ONLY_IN_GUI);
  self->request_histogram_source  =  (DT_DEV_PIXELPIPE_PREVIEW);

  if(self->dev->gui_attached)
  {
    g->reprocess_on_next_expose = FALSE;
  }

  gboolean histogram_is_good = ((self->histogram_stats.bins_count == 16384)
                                && (self->histogram != NULL));

  d->deflicker_percentile = p->deflicker_percentile;
  d->deflicker_target_level = p->deflicker_target_level;

  if(p->mode == EXPOSURE_MODE_DEFLICKER && dt_image_is_raw(&self->dev->image_storage))
  {
    if(p->deflicker_histogram_source == DEFLICKER_HISTOGRAM_SOURCE_SOURCEFILE)
    {
      if(self->dev->gui_attached)
      {
        // histogram is precomputed and cached
        compute_correction(self, piece, g->deflicker_histogram, &g->deflicker_histogram_stats, &d->exposure);
      }
      else
      {
        uint32_t *histogram = NULL;
        dt_dev_histogram_stats_t histogram_stats;
        deflicker_prepare_histogram(self, &histogram, &histogram_stats);
        compute_correction(self, piece, histogram, &histogram_stats, &d->exposure);
        free(histogram);
      }
      d->mode = EXPOSURE_MODE_MANUAL;
    }
    else
    {
      if(p->deflicker_histogram_source == DEFLICKER_HISTOGRAM_SOURCE_THUMBNAIL)
      {
        self->request_histogram |=  (DT_REQUEST_ON);

        gboolean failed = !histogram_is_good;

        if(self->dev->gui_attached && histogram_is_good)
        {
          /*
           * if in GUI, user might zoomed main view => we would get histogram of
           * only part of image, so if in GUI we must always use histogram of
           * preview pipe, which is always full-size and have biggest size
           */
          d->mode = EXPOSURE_MODE_DEFLICKER;
          commit_params_late(self, piece);
          d->mode = EXPOSURE_MODE_MANUAL;

          if(isnan(d->exposure))
            failed = TRUE;
        }
        else if(failed || !(self->dev->gui_attached && histogram_is_good))
        {
          d->mode = EXPOSURE_MODE_DEFLICKER;
          //commit_params_late() will compute correct d->exposure later
          self->request_histogram        &= ~(DT_REQUEST_ONLY_IN_GUI);
          self->request_histogram_source  =  (DT_DEV_PIXELPIPE_ANY);

          if(failed && self->dev->gui_attached)
          {
            /*
             * but sadly we do not yet have a histogram to do so, so this time
             * we process asif not in gui, and in expose() immediately
             * reprocess, thus everything works as expected
             */
            g->reprocess_on_next_expose = TRUE;
          }
        }
      }
    }
  }
  else
  {
    d->mode = EXPOSURE_MODE_MANUAL;
  }
}