void
gimp_brightness_contrast_config_set_node (GimpBrightnessContrastConfig *config,
                                          GeglNode                     *node)
{
  gdouble brightness;
  gdouble contrast;

  g_return_if_fail (GIMP_IS_BRIGHTNESS_CONTRAST_CONFIG (config));
  g_return_if_fail (GEGL_IS_NODE (node));

  brightness = config->brightness / 2.0;
  contrast   = (config->contrast < 0 ?
                (config->contrast + 1.0) :
                config->contrast * 4.0 + 1.0);

  gegl_node_set (node,
                 "brightness", brightness,
                 "contrast",   contrast,
                 NULL);
}
GimpLevelsConfig *
gimp_brightness_contrast_config_to_levels_config (GimpBrightnessContrastConfig *config)
{
  GimpLevelsConfig *levels;
  gdouble           brightness;
  gdouble           slant;
  gdouble           value;

  g_return_val_if_fail (GIMP_IS_BRIGHTNESS_CONTRAST_CONFIG (config), NULL);

  levels = g_object_new (GIMP_TYPE_LEVELS_CONFIG, NULL);

  brightness = config->brightness / 2.0;
  slant = tan ((config->contrast + 1) * G_PI_4);

  if (config->brightness >= 0)
    {
      value = -0.5 * slant + brightness * slant + 0.5;

      if (value < 0.0)
        {
          value = 0.0;

          /* this slightly convoluted math follows by inverting the
           * calculation of the brightness/contrast LUT in base/lut-funcs.h */

          levels->low_input[GIMP_HISTOGRAM_VALUE] =
            (- brightness * slant + 0.5 * slant - 0.5) / (slant - brightness * slant);
        }

      levels->low_output[GIMP_HISTOGRAM_VALUE] = value;

      value = 0.5 * slant + 0.5;

      if (value > 1.0)
        {
          value = 1.0;

          levels->high_input[GIMP_HISTOGRAM_VALUE] =
            (- brightness * slant + 0.5 * slant + 0.5) / (slant - brightness * slant);
        }

      levels->high_output[GIMP_HISTOGRAM_VALUE] = value;
    }
  else
    {
      value = 0.5 - 0.5 * slant;

      if (value < 0.0)
        {
          value = 0.0;

          levels->low_input[GIMP_HISTOGRAM_VALUE] =
            (0.5 * slant - 0.5) / (slant + brightness * slant);
        }

      levels->low_output[GIMP_HISTOGRAM_VALUE] = value;

      value = slant * brightness + slant * 0.5 + 0.5;

      if (value > 1.0)
        {
          value = 1.0;

          levels->high_input[GIMP_HISTOGRAM_VALUE] =
            (0.5 * slant + 0.5) / (slant + brightness * slant);
        }

      levels->high_output[GIMP_HISTOGRAM_VALUE] = value;
    }

  return levels;
}