/*
 * this code is auto generated. do not edit. change the sources in tools/introspection/ instead.
 *
 * the parse tree:
 *
 * typedef
 *   struct dt_iop_colorbalancergb_params_t
 *     float
 *     shadows_Y 
 *       description: lift luminance
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     shadows_C 
 *       description: lift chroma
 *       default: 0.0
 *       range: 0.0 .. 1.0
 * 
 *     float
 *     shadows_H 
 *       description: lift hue
 *       default: 0.0
 *       range: 0.0 .. 360.0
 * 
 *     float
 *     midtones_Y 
 *       description: power luminance
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     midtones_C 
 *       description: power chroma
 *       default: 0.0
 *       range: 0.0 .. 1.0
 * 
 *     float
 *     midtones_H 
 *       description: power hue
 *       default: 0.0
 *       range: 0.0 .. 360.0
 * 
 *     float
 *     highlights_Y 
 *       description: gain luminance
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     highlights_C 
 *       description: gain chroma
 *       default: 0.0
 *       range: 0.0 .. 1.0
 * 
 *     float
 *     highlights_H 
 *       description: gain hue
 *       default: 0.0
 *       range: 0.0 .. 360.0
 * 
 *     float
 *     global_Y 
 *       description: offset luminance
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     global_C 
 *       description: offset chroma
 *       default: 0.0
 *       range: 0.0 .. 1.0
 * 
 *     float
 *     global_H 
 *       description: offset hue
 *       default: 0.0
 *       range: 0.0 .. 360.0
 * 
 *     float
 *     shadows_weight 
 *       description: shadows fall-off
 *       default: 1.0
 *       range: 0.0 .. 3.0
 * 
 *     float
 *     white_fulcrum 
 *       description: white fulcrum
 *       default: 0.0
 *       range: -16.0 .. 16.0
 * 
 *     float
 *     highlights_weight 
 *       description: highlights fall-off
 *       default: 1.0
 *       range: 0.0 .. 3.0
 * 
 *     float
 *     chroma_shadows 
 *       description: chroma shadows
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     chroma_highlights 
 *       description: chroma highlights
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     chroma_global 
 *       description: chroma global
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     chroma_midtones 
 *       description: chroma mid-tones
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     saturation_global 
 *       description: saturation global
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     saturation_highlights 
 *       description: saturation highlights
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     saturation_midtones 
 *       description: saturation mid-tones
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     saturation_shadows 
 *       description: saturation shadows
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     hue_angle 
 *       description: hue shift
 *       default: 0.0
 *       range: -180. .. 180.
 * 
 *     float
 *     brilliance_global 
 *       description: brilliance global
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     brilliance_highlights 
 *       description: brilliance highlights
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     brilliance_midtones 
 *       description: brilliance mid-tones
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     brilliance_shadows 
 *       description: brilliance shadows
 *       default: 0.0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     mask_grey_fulcrum 
 *       description: mask middle-gray fulcrum
 *       default: 0.1845
 *       range: 0.0 .. 1.0
 * 
 *     float
 *     vibrance 
 *       description: global vibrance
 *       default: 0
 *       range: -1.0 .. 1.0
 * 
 *     float
 *     grey_fulcrum 
 *       description: contrast gray fulcrum
 *       default: 0.1845
 *       range: 0.0 .. 1.0
 * 
 *     float
 *     contrast 
 *       description: contrast
 *       default: 0.
 *       range: -1.0 .. 1.0
 * 
 *     enum dt_iop_colorbalancrgb_saturation_t
 *       DT_COLORBALANCE_SATURATION_JZAZBZ : JzAzBz (2021)
 *       DT_COLORBALANCE_SATURATION_DTUCS : darktable UCS (2022)
 *     saturation_formula 
 *       description: saturation formula
 *       default: 1
 * 
 * dt_iop_colorbalancergb_params_t
 *
 */

#include "/build/darktable/src/darktable-4.0.1/src/iop/colorbalancergb.c"

#ifdef __cplusplus
extern "C"
{
#endif

#include <string.h>
#include "common/introspection.h"

static dt_introspection_field_t introspection_linear[34+1]
#if !( defined(__cplusplus) && !defined(__clang__) && defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) <= 406) )
= {
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"shadows_Y", (char*)"shadows_Y", N_((char*)"lift luminance"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->shadows_Y), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, shadows_Y), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"shadows_C", (char*)"shadows_C", N_((char*)"lift chroma"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->shadows_C), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, shadows_C), NULL },
    /*Min*/ 0.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"shadows_H", (char*)"shadows_H", N_((char*)"lift hue"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->shadows_H), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, shadows_H), NULL },
    /*Min*/ 0.0, /*Max*/ 360.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"midtones_Y", (char*)"midtones_Y", N_((char*)"power luminance"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->midtones_Y), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, midtones_Y), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"midtones_C", (char*)"midtones_C", N_((char*)"power chroma"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->midtones_C), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, midtones_C), NULL },
    /*Min*/ 0.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"midtones_H", (char*)"midtones_H", N_((char*)"power hue"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->midtones_H), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, midtones_H), NULL },
    /*Min*/ 0.0, /*Max*/ 360.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"highlights_Y", (char*)"highlights_Y", N_((char*)"gain luminance"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->highlights_Y), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, highlights_Y), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"highlights_C", (char*)"highlights_C", N_((char*)"gain chroma"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->highlights_C), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, highlights_C), NULL },
    /*Min*/ 0.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"highlights_H", (char*)"highlights_H", N_((char*)"gain hue"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->highlights_H), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, highlights_H), NULL },
    /*Min*/ 0.0, /*Max*/ 360.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"global_Y", (char*)"global_Y", N_((char*)"offset luminance"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->global_Y), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, global_Y), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"global_C", (char*)"global_C", N_((char*)"offset chroma"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->global_C), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, global_C), NULL },
    /*Min*/ 0.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"global_H", (char*)"global_H", N_((char*)"offset hue"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->global_H), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, global_H), NULL },
    /*Min*/ 0.0, /*Max*/ 360.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"shadows_weight", (char*)"shadows_weight", N_((char*)"shadows fall-off"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->shadows_weight), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, shadows_weight), NULL },
    /*Min*/ 0.0, /*Max*/ 3.0, /*Default*/ 1.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"white_fulcrum", (char*)"white_fulcrum", N_((char*)"white fulcrum"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->white_fulcrum), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, white_fulcrum), NULL },
    /*Min*/ -16.0, /*Max*/ 16.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"highlights_weight", (char*)"highlights_weight", N_((char*)"highlights fall-off"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->highlights_weight), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, highlights_weight), NULL },
    /*Min*/ 0.0, /*Max*/ 3.0, /*Default*/ 1.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"chroma_shadows", (char*)"chroma_shadows", N_((char*)"chroma shadows"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->chroma_shadows), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, chroma_shadows), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"chroma_highlights", (char*)"chroma_highlights", N_((char*)"chroma highlights"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->chroma_highlights), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, chroma_highlights), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"chroma_global", (char*)"chroma_global", N_((char*)"chroma global"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->chroma_global), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, chroma_global), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"chroma_midtones", (char*)"chroma_midtones", N_((char*)"chroma mid-tones"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->chroma_midtones), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, chroma_midtones), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"saturation_global", (char*)"saturation_global", N_((char*)"saturation global"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->saturation_global), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, saturation_global), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"saturation_highlights", (char*)"saturation_highlights", N_((char*)"saturation highlights"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->saturation_highlights), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, saturation_highlights), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"saturation_midtones", (char*)"saturation_midtones", N_((char*)"saturation mid-tones"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->saturation_midtones), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, saturation_midtones), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"saturation_shadows", (char*)"saturation_shadows", N_((char*)"saturation shadows"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->saturation_shadows), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, saturation_shadows), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"hue_angle", (char*)"hue_angle", N_((char*)"hue shift"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->hue_angle), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, hue_angle), NULL },
    /*Min*/ -180., /*Max*/ 180., /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"brilliance_global", (char*)"brilliance_global", N_((char*)"brilliance global"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->brilliance_global), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, brilliance_global), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"brilliance_highlights", (char*)"brilliance_highlights", N_((char*)"brilliance highlights"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->brilliance_highlights), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, brilliance_highlights), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"brilliance_midtones", (char*)"brilliance_midtones", N_((char*)"brilliance mid-tones"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->brilliance_midtones), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, brilliance_midtones), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"brilliance_shadows", (char*)"brilliance_shadows", N_((char*)"brilliance shadows"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->brilliance_shadows), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, brilliance_shadows), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"mask_grey_fulcrum", (char*)"mask_grey_fulcrum", N_((char*)"mask middle-gray fulcrum"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->mask_grey_fulcrum), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, mask_grey_fulcrum), NULL },
    /*Min*/ 0.0, /*Max*/ 1.0, /*Default*/ 0.1845
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"vibrance", (char*)"vibrance", N_((char*)"global vibrance"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->vibrance), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, vibrance), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"grey_fulcrum", (char*)"grey_fulcrum", N_((char*)"contrast gray fulcrum"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->grey_fulcrum), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, grey_fulcrum), NULL },
    /*Min*/ 0.0, /*Max*/ 1.0, /*Default*/ 0.1845
  }
},
{
  .Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"contrast", (char*)"contrast", N_((char*)"contrast"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->contrast), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, contrast), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.
  }
},
{
  .Enum = {
    { DT_INTROSPECTION_TYPE_ENUM, (char*)"dt_iop_colorbalancrgb_saturation_t", (char*)"saturation_formula", (char*)"saturation_formula", N_((char*)"saturation formula"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->saturation_formula), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, saturation_formula), NULL },
    /*entries*/ 2, /*values*/ NULL, /*Default*/ 1
  }
},
{
  .Struct = {
    { DT_INTROSPECTION_TYPE_STRUCT, (char*)"dt_iop_colorbalancergb_params_t", (char*)"", (char*)"", (char*)"", sizeof(dt_iop_colorbalancergb_params_t), 0, NULL },
    /*entries*/ 33, /*fields*/ NULL
  }
},
  { .header = {DT_INTROSPECTION_TYPE_NONE, NULL, NULL, NULL, NULL, 0, 0, NULL} }
}
#endif
;

static dt_introspection_t introspection = {
  8,
  5,
  "dt_iop_colorbalancergb_params_t",
  sizeof(dt_iop_colorbalancergb_params_t),
  &introspection_linear[34-1],
  sizeof(dt_iop_module_t),
  G_STRUCT_OFFSET(dt_iop_module_t, default_params)
};

dt_introspection_field_t* get_introspection_linear()
{
  return introspection_linear;
}

dt_introspection_t* get_introspection()
{
  return &introspection;
}

int introspection_init(struct dt_iop_module_so_t *self, int api_version)
{
  // here we check that the generated code matches the api at compile time and also at runtime
  if(introspection.api_version != DT_INTROSPECTION_VERSION || api_version != DT_INTROSPECTION_VERSION)
    return 1;

#if defined(__cplusplus) && !defined(__clang__) && defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) <= 406)
  introspection_linear[0].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"shadows_Y", (char*)"shadows_Y", N_((char*)"lift luminance"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->shadows_Y), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, shadows_Y), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[1].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"shadows_C", (char*)"shadows_C", N_((char*)"lift chroma"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->shadows_C), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, shadows_C), NULL },
    /*Min*/ 0.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[2].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"shadows_H", (char*)"shadows_H", N_((char*)"lift hue"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->shadows_H), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, shadows_H), NULL },
    /*Min*/ 0.0, /*Max*/ 360.0, /*Default*/ 0.0
  };
  introspection_linear[3].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"midtones_Y", (char*)"midtones_Y", N_((char*)"power luminance"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->midtones_Y), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, midtones_Y), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[4].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"midtones_C", (char*)"midtones_C", N_((char*)"power chroma"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->midtones_C), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, midtones_C), NULL },
    /*Min*/ 0.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[5].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"midtones_H", (char*)"midtones_H", N_((char*)"power hue"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->midtones_H), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, midtones_H), NULL },
    /*Min*/ 0.0, /*Max*/ 360.0, /*Default*/ 0.0
  };
  introspection_linear[6].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"highlights_Y", (char*)"highlights_Y", N_((char*)"gain luminance"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->highlights_Y), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, highlights_Y), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[7].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"highlights_C", (char*)"highlights_C", N_((char*)"gain chroma"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->highlights_C), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, highlights_C), NULL },
    /*Min*/ 0.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[8].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"highlights_H", (char*)"highlights_H", N_((char*)"gain hue"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->highlights_H), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, highlights_H), NULL },
    /*Min*/ 0.0, /*Max*/ 360.0, /*Default*/ 0.0
  };
  introspection_linear[9].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"global_Y", (char*)"global_Y", N_((char*)"offset luminance"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->global_Y), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, global_Y), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[10].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"global_C", (char*)"global_C", N_((char*)"offset chroma"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->global_C), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, global_C), NULL },
    /*Min*/ 0.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[11].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"global_H", (char*)"global_H", N_((char*)"offset hue"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->global_H), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, global_H), NULL },
    /*Min*/ 0.0, /*Max*/ 360.0, /*Default*/ 0.0
  };
  introspection_linear[12].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"shadows_weight", (char*)"shadows_weight", N_((char*)"shadows fall-off"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->shadows_weight), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, shadows_weight), NULL },
    /*Min*/ 0.0, /*Max*/ 3.0, /*Default*/ 1.0
  };
  introspection_linear[13].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"white_fulcrum", (char*)"white_fulcrum", N_((char*)"white fulcrum"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->white_fulcrum), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, white_fulcrum), NULL },
    /*Min*/ -16.0, /*Max*/ 16.0, /*Default*/ 0.0
  };
  introspection_linear[14].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"highlights_weight", (char*)"highlights_weight", N_((char*)"highlights fall-off"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->highlights_weight), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, highlights_weight), NULL },
    /*Min*/ 0.0, /*Max*/ 3.0, /*Default*/ 1.0
  };
  introspection_linear[15].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"chroma_shadows", (char*)"chroma_shadows", N_((char*)"chroma shadows"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->chroma_shadows), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, chroma_shadows), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[16].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"chroma_highlights", (char*)"chroma_highlights", N_((char*)"chroma highlights"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->chroma_highlights), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, chroma_highlights), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[17].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"chroma_global", (char*)"chroma_global", N_((char*)"chroma global"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->chroma_global), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, chroma_global), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[18].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"chroma_midtones", (char*)"chroma_midtones", N_((char*)"chroma mid-tones"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->chroma_midtones), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, chroma_midtones), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[19].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"saturation_global", (char*)"saturation_global", N_((char*)"saturation global"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->saturation_global), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, saturation_global), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[20].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"saturation_highlights", (char*)"saturation_highlights", N_((char*)"saturation highlights"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->saturation_highlights), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, saturation_highlights), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[21].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"saturation_midtones", (char*)"saturation_midtones", N_((char*)"saturation mid-tones"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->saturation_midtones), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, saturation_midtones), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[22].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"saturation_shadows", (char*)"saturation_shadows", N_((char*)"saturation shadows"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->saturation_shadows), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, saturation_shadows), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[23].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"hue_angle", (char*)"hue_angle", N_((char*)"hue shift"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->hue_angle), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, hue_angle), NULL },
    /*Min*/ -180., /*Max*/ 180., /*Default*/ 0.0
  };
  introspection_linear[24].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"brilliance_global", (char*)"brilliance_global", N_((char*)"brilliance global"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->brilliance_global), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, brilliance_global), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[25].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"brilliance_highlights", (char*)"brilliance_highlights", N_((char*)"brilliance highlights"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->brilliance_highlights), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, brilliance_highlights), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[26].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"brilliance_midtones", (char*)"brilliance_midtones", N_((char*)"brilliance mid-tones"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->brilliance_midtones), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, brilliance_midtones), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[27].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"brilliance_shadows", (char*)"brilliance_shadows", N_((char*)"brilliance shadows"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->brilliance_shadows), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, brilliance_shadows), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.0
  };
  introspection_linear[28].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"mask_grey_fulcrum", (char*)"mask_grey_fulcrum", N_((char*)"mask middle-gray fulcrum"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->mask_grey_fulcrum), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, mask_grey_fulcrum), NULL },
    /*Min*/ 0.0, /*Max*/ 1.0, /*Default*/ 0.1845
  };
  introspection_linear[29].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"vibrance", (char*)"vibrance", N_((char*)"global vibrance"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->vibrance), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, vibrance), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0
  };
  introspection_linear[30].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"grey_fulcrum", (char*)"grey_fulcrum", N_((char*)"contrast gray fulcrum"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->grey_fulcrum), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, grey_fulcrum), NULL },
    /*Min*/ 0.0, /*Max*/ 1.0, /*Default*/ 0.1845
  };
  introspection_linear[31].Float = {
    { DT_INTROSPECTION_TYPE_FLOAT, (char*)"float", (char*)"contrast", (char*)"contrast", N_((char*)"contrast"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->contrast), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, contrast), NULL },
    /*Min*/ -1.0, /*Max*/ 1.0, /*Default*/ 0.
  };
  introspection_linear[32].Enum = {
    { DT_INTROSPECTION_TYPE_ENUM, (char*)"dt_iop_colorbalancrgb_saturation_t", (char*)"saturation_formula", (char*)"saturation_formula", N_((char*)"saturation formula"), sizeof(((dt_iop_colorbalancergb_params_t*)NULL)->saturation_formula), G_STRUCT_OFFSET(dt_iop_colorbalancergb_params_t, saturation_formula), NULL },
    /*entries*/ 2, /*values*/ NULL, /*Default*/ 1
  };
  introspection_linear[33].Struct = {
    { DT_INTROSPECTION_TYPE_STRUCT, (char*)"dt_iop_colorbalancergb_params_t", (char*)"", (char*)"", (char*)"", sizeof(dt_iop_colorbalancergb_params_t), 0, NULL },
    /*entries*/ 33, /*fields*/ NULL
  };
  introspection_linear[34].header = {DT_INTROSPECTION_TYPE_NONE, NULL, NULL, NULL, NULL, 0, 0, NULL};
#endif

  for(int i = 0; i <= 34; i++)
    introspection_linear[i].header.so = self;

  static dt_introspection_type_enum_tuple_t f32[] = { 
    { "DT_COLORBALANCE_SATURATION_JZAZBZ", DT_COLORBALANCE_SATURATION_JZAZBZ, N_((char*)"JzAzBz (2021)") },
    { "DT_COLORBALANCE_SATURATION_DTUCS", DT_COLORBALANCE_SATURATION_DTUCS, N_((char*)"darktable UCS (2022)") },
    { NULL, 0 },
  };
  static dt_introspection_field_t *f33[] = {
    &introspection_linear[0],
    &introspection_linear[1],
    &introspection_linear[2],
    &introspection_linear[3],
    &introspection_linear[4],
    &introspection_linear[5],
    &introspection_linear[6],
    &introspection_linear[7],
    &introspection_linear[8],
    &introspection_linear[9],
    &introspection_linear[10],
    &introspection_linear[11],
    &introspection_linear[12],
    &introspection_linear[13],
    &introspection_linear[14],
    &introspection_linear[15],
    &introspection_linear[16],
    &introspection_linear[17],
    &introspection_linear[18],
    &introspection_linear[19],
    &introspection_linear[20],
    &introspection_linear[21],
    &introspection_linear[22],
    &introspection_linear[23],
    &introspection_linear[24],
    &introspection_linear[25],
    &introspection_linear[26],
    &introspection_linear[27],
    &introspection_linear[28],
    &introspection_linear[29],
    &introspection_linear[30],
    &introspection_linear[31],
    &introspection_linear[32],
    NULL
  };

  introspection_linear[32].Enum.values = f32;
  introspection_linear[33].Struct.fields = f33;

  return 0;
}

void * get_p(const void * param, const char * name)
{
  dt_iop_colorbalancergb_params_t * p = (dt_iop_colorbalancergb_params_t*)param;
  if(!strcmp(name, "shadows_Y"))
    return &(p->shadows_Y);
  else if(!strcmp(name, "shadows_C"))
    return &(p->shadows_C);
  else if(!strcmp(name, "shadows_H"))
    return &(p->shadows_H);
  else if(!strcmp(name, "midtones_Y"))
    return &(p->midtones_Y);
  else if(!strcmp(name, "midtones_C"))
    return &(p->midtones_C);
  else if(!strcmp(name, "midtones_H"))
    return &(p->midtones_H);
  else if(!strcmp(name, "highlights_Y"))
    return &(p->highlights_Y);
  else if(!strcmp(name, "highlights_C"))
    return &(p->highlights_C);
  else if(!strcmp(name, "highlights_H"))
    return &(p->highlights_H);
  else if(!strcmp(name, "global_Y"))
    return &(p->global_Y);
  else if(!strcmp(name, "global_C"))
    return &(p->global_C);
  else if(!strcmp(name, "global_H"))
    return &(p->global_H);
  else if(!strcmp(name, "shadows_weight"))
    return &(p->shadows_weight);
  else if(!strcmp(name, "white_fulcrum"))
    return &(p->white_fulcrum);
  else if(!strcmp(name, "highlights_weight"))
    return &(p->highlights_weight);
  else if(!strcmp(name, "chroma_shadows"))
    return &(p->chroma_shadows);
  else if(!strcmp(name, "chroma_highlights"))
    return &(p->chroma_highlights);
  else if(!strcmp(name, "chroma_global"))
    return &(p->chroma_global);
  else if(!strcmp(name, "chroma_midtones"))
    return &(p->chroma_midtones);
  else if(!strcmp(name, "saturation_global"))
    return &(p->saturation_global);
  else if(!strcmp(name, "saturation_highlights"))
    return &(p->saturation_highlights);
  else if(!strcmp(name, "saturation_midtones"))
    return &(p->saturation_midtones);
  else if(!strcmp(name, "saturation_shadows"))
    return &(p->saturation_shadows);
  else if(!strcmp(name, "hue_angle"))
    return &(p->hue_angle);
  else if(!strcmp(name, "brilliance_global"))
    return &(p->brilliance_global);
  else if(!strcmp(name, "brilliance_highlights"))
    return &(p->brilliance_highlights);
  else if(!strcmp(name, "brilliance_midtones"))
    return &(p->brilliance_midtones);
  else if(!strcmp(name, "brilliance_shadows"))
    return &(p->brilliance_shadows);
  else if(!strcmp(name, "mask_grey_fulcrum"))
    return &(p->mask_grey_fulcrum);
  else if(!strcmp(name, "vibrance"))
    return &(p->vibrance);
  else if(!strcmp(name, "grey_fulcrum"))
    return &(p->grey_fulcrum);
  else if(!strcmp(name, "contrast"))
    return &(p->contrast);
  else if(!strcmp(name, "saturation_formula"))
    return &(p->saturation_formula);
  else
    return NULL;
}

dt_introspection_field_t * get_f(const char * name)
{
  if(!strcmp(name, "shadows_Y"))
    return &(introspection_linear[0]);
  else if(!strcmp(name, "shadows_C"))
    return &(introspection_linear[1]);
  else if(!strcmp(name, "shadows_H"))
    return &(introspection_linear[2]);
  else if(!strcmp(name, "midtones_Y"))
    return &(introspection_linear[3]);
  else if(!strcmp(name, "midtones_C"))
    return &(introspection_linear[4]);
  else if(!strcmp(name, "midtones_H"))
    return &(introspection_linear[5]);
  else if(!strcmp(name, "highlights_Y"))
    return &(introspection_linear[6]);
  else if(!strcmp(name, "highlights_C"))
    return &(introspection_linear[7]);
  else if(!strcmp(name, "highlights_H"))
    return &(introspection_linear[8]);
  else if(!strcmp(name, "global_Y"))
    return &(introspection_linear[9]);
  else if(!strcmp(name, "global_C"))
    return &(introspection_linear[10]);
  else if(!strcmp(name, "global_H"))
    return &(introspection_linear[11]);
  else if(!strcmp(name, "shadows_weight"))
    return &(introspection_linear[12]);
  else if(!strcmp(name, "white_fulcrum"))
    return &(introspection_linear[13]);
  else if(!strcmp(name, "highlights_weight"))
    return &(introspection_linear[14]);
  else if(!strcmp(name, "chroma_shadows"))
    return &(introspection_linear[15]);
  else if(!strcmp(name, "chroma_highlights"))
    return &(introspection_linear[16]);
  else if(!strcmp(name, "chroma_global"))
    return &(introspection_linear[17]);
  else if(!strcmp(name, "chroma_midtones"))
    return &(introspection_linear[18]);
  else if(!strcmp(name, "saturation_global"))
    return &(introspection_linear[19]);
  else if(!strcmp(name, "saturation_highlights"))
    return &(introspection_linear[20]);
  else if(!strcmp(name, "saturation_midtones"))
    return &(introspection_linear[21]);
  else if(!strcmp(name, "saturation_shadows"))
    return &(introspection_linear[22]);
  else if(!strcmp(name, "hue_angle"))
    return &(introspection_linear[23]);
  else if(!strcmp(name, "brilliance_global"))
    return &(introspection_linear[24]);
  else if(!strcmp(name, "brilliance_highlights"))
    return &(introspection_linear[25]);
  else if(!strcmp(name, "brilliance_midtones"))
    return &(introspection_linear[26]);
  else if(!strcmp(name, "brilliance_shadows"))
    return &(introspection_linear[27]);
  else if(!strcmp(name, "mask_grey_fulcrum"))
    return &(introspection_linear[28]);
  else if(!strcmp(name, "vibrance"))
    return &(introspection_linear[29]);
  else if(!strcmp(name, "grey_fulcrum"))
    return &(introspection_linear[30]);
  else if(!strcmp(name, "contrast"))
    return &(introspection_linear[31]);
  else if(!strcmp(name, "saturation_formula"))
    return &(introspection_linear[32]);
  else
    return NULL;
}

#ifdef __cplusplus
}
#endif

