[gimp] app: move layer mode enums and gimp-layer-modes.[ch] to operations/



commit 2950fecf0758ce1e65e131869972d1e90a2c8a9c
Author: Michael Natterer <mitch gimp org>
Date:   Sun Feb 5 15:59:29 2017 +0100

    app: move layer mode enums and gimp-layer-modes.[ch] to operations/
    
    and to operations/layer-modes/, respectively.
    
    Add gimp_layer_modes_init() which asserts on the correct order of the
    GimpLayerModeInfo array, and switch to accessing the array directly in
    gimp_layer_mode_info().

 app/core/Makefile.am                               |    2 -
 app/core/core-enums.c                              |  218 ----
 app/core/core-enums.h                              |  109 --
 app/core/gimp-layer-modes.c                        |  574 ----------
 app/gegl/gimp-gegl-nodes.c                         |    2 +-
 app/operations/gimp-operations.c                   |    3 +
 app/operations/layer-modes/Makefile.am             |    2 +
 app/operations/layer-modes/gimp-layer-modes.c      | 1175 ++++++++++++++++++++
 .../layer-modes}/gimp-layer-modes.h                |   17 +
 .../layer-modes/gimpoperationlayermode.c           |  570 +----------
 .../layer-modes/gimpoperationlayermode.h           |   20 -
 app/operations/operations-enums.c                  |  218 ++++
 app/operations/operations-enums.h                  |  116 ++-
 app/paint/gimpbrushcore.c                          |    3 +-
 app/paint/gimpink.c                                |    3 +-
 app/paint/gimppaintcore-loops.c                    |    3 +-
 app/paint/gimppaintcore.c                          |    3 +-
 app/widgets/gimplayermodebox.c                     |    2 +-
 app/widgets/gimplayermodecombobox.c                |    2 +-
 tools/pdbgen/enums.pl                              |   48 +-
 20 files changed, 1566 insertions(+), 1524 deletions(-)
---
diff --git a/app/core/Makefile.am b/app/core/Makefile.am
index 3a28eb4..20f439f 100644
--- a/app/core/Makefile.am
+++ b/app/core/Makefile.am
@@ -44,8 +44,6 @@ libappcore_a_sources = \
        gimp-gradients.h                        \
        gimp-gui.c                              \
        gimp-gui.h                              \
-       gimp-layer-modes.c                      \
-       gimp-layer-modes.h                      \
        gimp-memsize.c                          \
        gimp-memsize.h                          \
        gimp-modules.c                          \
diff --git a/app/core/core-enums.c b/app/core/core-enums.c
index c76109f..25c04c9 100644
--- a/app/core/core-enums.c
+++ b/app/core/core-enums.c
@@ -285,224 +285,6 @@ gimp_histogram_channel_get_type (void)
 }
 
 GType
-gimp_layer_mode_get_type (void)
-{
-  static const GEnumValue values[] =
-  {
-    { GIMP_LAYER_MODE_NORMAL, "GIMP_LAYER_MODE_NORMAL", "normal" },
-    { GIMP_LAYER_MODE_DISSOLVE, "GIMP_LAYER_MODE_DISSOLVE", "dissolve" },
-    { GIMP_LAYER_MODE_BEHIND, "GIMP_LAYER_MODE_BEHIND", "behind" },
-    { GIMP_LAYER_MODE_MULTIPLY_LEGACY, "GIMP_LAYER_MODE_MULTIPLY_LEGACY", "multiply-legacy" },
-    { GIMP_LAYER_MODE_SCREEN_LEGACY, "GIMP_LAYER_MODE_SCREEN_LEGACY", "screen-legacy" },
-    { GIMP_LAYER_MODE_OVERLAY_LEGACY, "GIMP_LAYER_MODE_OVERLAY_LEGACY", "overlay-legacy" },
-    { GIMP_LAYER_MODE_DIFFERENCE_LEGACY, "GIMP_LAYER_MODE_DIFFERENCE_LEGACY", "difference-legacy" },
-    { GIMP_LAYER_MODE_ADDITION_LEGACY, "GIMP_LAYER_MODE_ADDITION_LEGACY", "addition-legacy" },
-    { GIMP_LAYER_MODE_SUBTRACT_LEGACY, "GIMP_LAYER_MODE_SUBTRACT_LEGACY", "subtract-legacy" },
-    { GIMP_LAYER_MODE_DARKEN_ONLY_LEGACY, "GIMP_LAYER_MODE_DARKEN_ONLY_LEGACY", "darken-only-legacy" },
-    { GIMP_LAYER_MODE_LIGHTEN_ONLY_LEGACY, "GIMP_LAYER_MODE_LIGHTEN_ONLY_LEGACY", "lighten-only-legacy" },
-    { GIMP_LAYER_MODE_HSV_HUE_LEGACY, "GIMP_LAYER_MODE_HSV_HUE_LEGACY", "hsv-hue-legacy" },
-    { GIMP_LAYER_MODE_HSV_SATURATION_LEGACY, "GIMP_LAYER_MODE_HSV_SATURATION_LEGACY", 
"hsv-saturation-legacy" },
-    { GIMP_LAYER_MODE_HSV_COLOR_LEGACY, "GIMP_LAYER_MODE_HSV_COLOR_LEGACY", "hsv-color-legacy" },
-    { GIMP_LAYER_MODE_HSV_VALUE_LEGACY, "GIMP_LAYER_MODE_HSV_VALUE_LEGACY", "hsv-value-legacy" },
-    { GIMP_LAYER_MODE_DIVIDE_LEGACY, "GIMP_LAYER_MODE_DIVIDE_LEGACY", "divide-legacy" },
-    { GIMP_LAYER_MODE_DODGE_LEGACY, "GIMP_LAYER_MODE_DODGE_LEGACY", "dodge-legacy" },
-    { GIMP_LAYER_MODE_BURN_LEGACY, "GIMP_LAYER_MODE_BURN_LEGACY", "burn-legacy" },
-    { GIMP_LAYER_MODE_HARDLIGHT_LEGACY, "GIMP_LAYER_MODE_HARDLIGHT_LEGACY", "hardlight-legacy" },
-    { GIMP_LAYER_MODE_SOFTLIGHT_LEGACY, "GIMP_LAYER_MODE_SOFTLIGHT_LEGACY", "softlight-legacy" },
-    { GIMP_LAYER_MODE_GRAIN_EXTRACT_LEGACY, "GIMP_LAYER_MODE_GRAIN_EXTRACT_LEGACY", "grain-extract-legacy" },
-    { GIMP_LAYER_MODE_GRAIN_MERGE_LEGACY, "GIMP_LAYER_MODE_GRAIN_MERGE_LEGACY", "grain-merge-legacy" },
-    { GIMP_LAYER_MODE_COLOR_ERASE, "GIMP_LAYER_MODE_COLOR_ERASE", "color-erase" },
-    { GIMP_LAYER_MODE_OVERLAY, "GIMP_LAYER_MODE_OVERLAY", "overlay" },
-    { GIMP_LAYER_MODE_LCH_HUE, "GIMP_LAYER_MODE_LCH_HUE", "lch-hue" },
-    { GIMP_LAYER_MODE_LCH_CHROMA, "GIMP_LAYER_MODE_LCH_CHROMA", "lch-chroma" },
-    { GIMP_LAYER_MODE_LCH_COLOR, "GIMP_LAYER_MODE_LCH_COLOR", "lch-color" },
-    { GIMP_LAYER_MODE_LCH_LIGHTNESS, "GIMP_LAYER_MODE_LCH_LIGHTNESS", "lch-lightness" },
-    { GIMP_LAYER_MODE_NORMAL_LINEAR, "GIMP_LAYER_MODE_NORMAL_LINEAR", "normal-linear" },
-    { GIMP_LAYER_MODE_BEHIND_LINEAR, "GIMP_LAYER_MODE_BEHIND_LINEAR", "behind-linear" },
-    { GIMP_LAYER_MODE_MULTIPLY, "GIMP_LAYER_MODE_MULTIPLY", "multiply" },
-    { GIMP_LAYER_MODE_MULTIPLY_LINEAR, "GIMP_LAYER_MODE_MULTIPLY_LINEAR", "multiply-linear" },
-    { GIMP_LAYER_MODE_SCREEN, "GIMP_LAYER_MODE_SCREEN", "screen" },
-    { GIMP_LAYER_MODE_SCREEN_LINEAR, "GIMP_LAYER_MODE_SCREEN_LINEAR", "screen-linear" },
-    { GIMP_LAYER_MODE_OVERLAY_LINEAR, "GIMP_LAYER_MODE_OVERLAY_LINEAR", "overlay-linear" },
-    { GIMP_LAYER_MODE_DIFFERENCE, "GIMP_LAYER_MODE_DIFFERENCE", "difference" },
-    { GIMP_LAYER_MODE_DIFFERENCE_LINEAR, "GIMP_LAYER_MODE_DIFFERENCE_LINEAR", "difference-linear" },
-    { GIMP_LAYER_MODE_ADDITION, "GIMP_LAYER_MODE_ADDITION", "addition" },
-    { GIMP_LAYER_MODE_ADDITION_LINEAR, "GIMP_LAYER_MODE_ADDITION_LINEAR", "addition-linear" },
-    { GIMP_LAYER_MODE_SUBTRACT, "GIMP_LAYER_MODE_SUBTRACT", "subtract" },
-    { GIMP_LAYER_MODE_SUBTRACT_LINEAR, "GIMP_LAYER_MODE_SUBTRACT_LINEAR", "subtract-linear" },
-    { GIMP_LAYER_MODE_DARKEN_ONLY, "GIMP_LAYER_MODE_DARKEN_ONLY", "darken-only" },
-    { GIMP_LAYER_MODE_LIGHTEN_ONLY, "GIMP_LAYER_MODE_LIGHTEN_ONLY", "lighten-only" },
-    { GIMP_LAYER_MODE_HSV_HUE, "GIMP_LAYER_MODE_HSV_HUE", "hsv-hue" },
-    { GIMP_LAYER_MODE_HSV_SATURATION, "GIMP_LAYER_MODE_HSV_SATURATION", "hsv-saturation" },
-    { GIMP_LAYER_MODE_HSV_COLOR, "GIMP_LAYER_MODE_HSV_COLOR", "hsv-color" },
-    { GIMP_LAYER_MODE_HSV_VALUE, "GIMP_LAYER_MODE_HSV_VALUE", "hsv-value" },
-    { GIMP_LAYER_MODE_DIVIDE, "GIMP_LAYER_MODE_DIVIDE", "divide" },
-    { GIMP_LAYER_MODE_DIVIDE_LINEAR, "GIMP_LAYER_MODE_DIVIDE_LINEAR", "divide-linear" },
-    { GIMP_LAYER_MODE_DODGE, "GIMP_LAYER_MODE_DODGE", "dodge" },
-    { GIMP_LAYER_MODE_DODGE_LINEAR, "GIMP_LAYER_MODE_DODGE_LINEAR", "dodge-linear" },
-    { GIMP_LAYER_MODE_BURN, "GIMP_LAYER_MODE_BURN", "burn" },
-    { GIMP_LAYER_MODE_BURN_LINEAR, "GIMP_LAYER_MODE_BURN_LINEAR", "burn-linear" },
-    { GIMP_LAYER_MODE_HARDLIGHT, "GIMP_LAYER_MODE_HARDLIGHT", "hardlight" },
-    { GIMP_LAYER_MODE_HARDLIGHT_LINEAR, "GIMP_LAYER_MODE_HARDLIGHT_LINEAR", "hardlight-linear" },
-    { GIMP_LAYER_MODE_SOFTLIGHT, "GIMP_LAYER_MODE_SOFTLIGHT", "softlight" },
-    { GIMP_LAYER_MODE_SOFTLIGHT_LINEAR, "GIMP_LAYER_MODE_SOFTLIGHT_LINEAR", "softlight-linear" },
-    { GIMP_LAYER_MODE_GRAIN_EXTRACT, "GIMP_LAYER_MODE_GRAIN_EXTRACT", "grain-extract" },
-    { GIMP_LAYER_MODE_GRAIN_EXTRACT_LINEAR, "GIMP_LAYER_MODE_GRAIN_EXTRACT_LINEAR", "grain-extract-linear" },
-    { GIMP_LAYER_MODE_GRAIN_MERGE, "GIMP_LAYER_MODE_GRAIN_MERGE", "grain-merge" },
-    { GIMP_LAYER_MODE_GRAIN_MERGE_LINEAR, "GIMP_LAYER_MODE_GRAIN_MERGE_LINEAR", "grain-merge-linear" },
-    { GIMP_LAYER_MODE_VIVID_LIGHT, "GIMP_LAYER_MODE_VIVID_LIGHT", "vivid-light" },
-    { GIMP_LAYER_MODE_VIVID_LIGHT_LINEAR, "GIMP_LAYER_MODE_VIVID_LIGHT_LINEAR", "vivid-light-linear" },
-    { GIMP_LAYER_MODE_PIN_LIGHT, "GIMP_LAYER_MODE_PIN_LIGHT", "pin-light" },
-    { GIMP_LAYER_MODE_PIN_LIGHT_LINEAR, "GIMP_LAYER_MODE_PIN_LIGHT_LINEAR", "pin-light-linear" },
-    { GIMP_LAYER_MODE_LINEAR_LIGHT, "GIMP_LAYER_MODE_LINEAR_LIGHT", "linear-light" },
-    { GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR, "GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR", "linear-light-linear" },
-    { GIMP_LAYER_MODE_HARD_MIX, "GIMP_LAYER_MODE_HARD_MIX", "hard-mix" },
-    { GIMP_LAYER_MODE_HARD_MIX_LINEAR, "GIMP_LAYER_MODE_HARD_MIX_LINEAR", "hard-mix-linear" },
-    { GIMP_LAYER_MODE_EXCLUSION, "GIMP_LAYER_MODE_EXCLUSION", "exclusion" },
-    { GIMP_LAYER_MODE_EXCLUSION_LINEAR, "GIMP_LAYER_MODE_EXCLUSION_LINEAR", "exclusion-linear" },
-    { GIMP_LAYER_MODE_LINEAR_BURN, "GIMP_LAYER_MODE_LINEAR_BURN", "linear-burn" },
-    { GIMP_LAYER_MODE_LINEAR_BURN_LINEAR, "GIMP_LAYER_MODE_LINEAR_BURN_LINEAR", "linear-burn-linear" },
-    { GIMP_LAYER_MODE_LUMA_DARKEN_ONLY, "GIMP_LAYER_MODE_LUMA_DARKEN_ONLY", "luma-darken-only" },
-    { GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY, "GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY", 
"luminance-darken-only" },
-    { GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY, "GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY", "luma-lighten-only" },
-    { GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY, "GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY", 
"luminance-lighten-only" },
-    { GIMP_LAYER_MODE_ERASE, "GIMP_LAYER_MODE_ERASE", "erase" },
-    { GIMP_LAYER_MODE_REPLACE, "GIMP_LAYER_MODE_REPLACE", "replace" },
-    { GIMP_LAYER_MODE_ANTI_ERASE, "GIMP_LAYER_MODE_ANTI_ERASE", "anti-erase" },
-    { 0, NULL, NULL }
-  };
-
-  static const GimpEnumDesc descs[] =
-  {
-    { GIMP_LAYER_MODE_NORMAL, NC_("layer-mode", "Normal"), NULL },
-    { GIMP_LAYER_MODE_DISSOLVE, NC_("layer-mode", "Dissolve"), NULL },
-    { GIMP_LAYER_MODE_BEHIND, NC_("layer-mode", "Behind"), NULL },
-    { GIMP_LAYER_MODE_MULTIPLY_LEGACY, NC_("layer-mode", "Multiply (legacy)"), NULL },
-    { GIMP_LAYER_MODE_SCREEN_LEGACY, NC_("layer-mode", "Screen (legacy)"), NULL },
-    { GIMP_LAYER_MODE_OVERLAY_LEGACY, NC_("layer-mode", "Old broken Overlay"), NULL },
-    { GIMP_LAYER_MODE_DIFFERENCE_LEGACY, NC_("layer-mode", "Difference (legacy)"), NULL },
-    { GIMP_LAYER_MODE_ADDITION_LEGACY, NC_("layer-mode", "Addition (legacy)"), NULL },
-    { GIMP_LAYER_MODE_SUBTRACT_LEGACY, NC_("layer-mode", "Subtract (legacy)"), NULL },
-    { GIMP_LAYER_MODE_DARKEN_ONLY_LEGACY, NC_("layer-mode", "Darken only (legacy)"), NULL },
-    { GIMP_LAYER_MODE_LIGHTEN_ONLY_LEGACY, NC_("layer-mode", "Lighten only (legacy)"), NULL },
-    { GIMP_LAYER_MODE_HSV_HUE_LEGACY, NC_("layer-mode", "Hue (HSV) (legacy)"), NULL },
-    { GIMP_LAYER_MODE_HSV_SATURATION_LEGACY, NC_("layer-mode", "Saturation (HSV) (legacy)"), NULL },
-    { GIMP_LAYER_MODE_HSV_COLOR_LEGACY, NC_("layer-mode", "Color (HSV) (legacy)"), NULL },
-    { GIMP_LAYER_MODE_HSV_VALUE_LEGACY, NC_("layer-mode", "Value (HSV) (legacy)"), NULL },
-    { GIMP_LAYER_MODE_DIVIDE_LEGACY, NC_("layer-mode", "Divide (legacy)"), NULL },
-    { GIMP_LAYER_MODE_DODGE_LEGACY, NC_("layer-mode", "Dodge (legacy)"), NULL },
-    { GIMP_LAYER_MODE_BURN_LEGACY, NC_("layer-mode", "Burn (legacy)"), NULL },
-    { GIMP_LAYER_MODE_HARDLIGHT_LEGACY, NC_("layer-mode", "Hard light (legacy)"), NULL },
-    { GIMP_LAYER_MODE_SOFTLIGHT_LEGACY, NC_("layer-mode", "Soft light (legacy)"), NULL },
-    { GIMP_LAYER_MODE_GRAIN_EXTRACT_LEGACY, NC_("layer-mode", "Grain extract (legacy)"), NULL },
-    { GIMP_LAYER_MODE_GRAIN_MERGE_LEGACY, NC_("layer-mode", "Grain merge (legacy)"), NULL },
-    { GIMP_LAYER_MODE_COLOR_ERASE, NC_("layer-mode", "Color erase"), NULL },
-    { GIMP_LAYER_MODE_OVERLAY, NC_("layer-mode", "Overlay"), NULL },
-    { GIMP_LAYER_MODE_LCH_HUE, NC_("layer-mode", "Hue (LCH)"), NULL },
-    { GIMP_LAYER_MODE_LCH_CHROMA, NC_("layer-mode", "Chroma (LCH)"), NULL },
-    { GIMP_LAYER_MODE_LCH_COLOR, NC_("layer-mode", "Color (LCH)"), NULL },
-    { GIMP_LAYER_MODE_LCH_LIGHTNESS, NC_("layer-mode", "Lightness (LCH)"), NULL },
-    { GIMP_LAYER_MODE_NORMAL_LINEAR, NC_("layer-mode", "Normal (linear)"), NULL },
-    { GIMP_LAYER_MODE_BEHIND_LINEAR, NC_("layer-mode", "Behind (linear)"), NULL },
-    { GIMP_LAYER_MODE_MULTIPLY, NC_("layer-mode", "Multiply"), NULL },
-    { GIMP_LAYER_MODE_MULTIPLY_LINEAR, NC_("layer-mode", "Multiply (linear)"), NULL },
-    { GIMP_LAYER_MODE_SCREEN, NC_("layer-mode", "Screen"), NULL },
-    { GIMP_LAYER_MODE_SCREEN_LINEAR, NC_("layer-mode", "Screen (linear)"), NULL },
-    { GIMP_LAYER_MODE_OVERLAY_LINEAR, NC_("layer-mode", "Overlay (linear)"), NULL },
-    { GIMP_LAYER_MODE_DIFFERENCE, NC_("layer-mode", "Difference"), NULL },
-    { GIMP_LAYER_MODE_DIFFERENCE_LINEAR, NC_("layer-mode", "Difference (linear)"), NULL },
-    { GIMP_LAYER_MODE_ADDITION, NC_("layer-mode", "Addition"), NULL },
-    { GIMP_LAYER_MODE_ADDITION_LINEAR, NC_("layer-mode", "Addition (linear)"), NULL },
-    { GIMP_LAYER_MODE_SUBTRACT, NC_("layer-mode", "Subtract"), NULL },
-    { GIMP_LAYER_MODE_SUBTRACT_LINEAR, NC_("layer-mode", "Subtract (linear)"), NULL },
-    { GIMP_LAYER_MODE_DARKEN_ONLY, NC_("layer-mode", "Darken only"), NULL },
-    { GIMP_LAYER_MODE_LIGHTEN_ONLY, NC_("layer-mode", "Lighten only"), NULL },
-    { GIMP_LAYER_MODE_HSV_HUE, NC_("layer-mode", "Hue (HSV)"), NULL },
-    { GIMP_LAYER_MODE_HSV_SATURATION, NC_("layer-mode", "Saturation (HSV)"), NULL },
-    { GIMP_LAYER_MODE_HSV_COLOR, NC_("layer-mode", "Color (HSV)"), NULL },
-    { GIMP_LAYER_MODE_HSV_VALUE, NC_("layer-mode", "Value (HSV)"), NULL },
-    { GIMP_LAYER_MODE_DIVIDE, NC_("layer-mode", "Divide"), NULL },
-    { GIMP_LAYER_MODE_DIVIDE_LINEAR, NC_("layer-mode", "Divide (linear)"), NULL },
-    { GIMP_LAYER_MODE_DODGE, NC_("layer-mode", "Dodge"), NULL },
-    { GIMP_LAYER_MODE_DODGE_LINEAR, NC_("layer-mode", "Dodge (linear)"), NULL },
-    { GIMP_LAYER_MODE_BURN, NC_("layer-mode", "Burn"), NULL },
-    { GIMP_LAYER_MODE_BURN_LINEAR, NC_("layer-mode", "Burn (linear)"), NULL },
-    { GIMP_LAYER_MODE_HARDLIGHT, NC_("layer-mode", "Hard light"), NULL },
-    { GIMP_LAYER_MODE_HARDLIGHT_LINEAR, NC_("layer-mode", "Hard light (linear)"), NULL },
-    { GIMP_LAYER_MODE_SOFTLIGHT, NC_("layer-mode", "Soft light"), NULL },
-    { GIMP_LAYER_MODE_SOFTLIGHT_LINEAR, NC_("layer-mode", "Soft light (linear)"), NULL },
-    { GIMP_LAYER_MODE_GRAIN_EXTRACT, NC_("layer-mode", "Grain extract"), NULL },
-    { GIMP_LAYER_MODE_GRAIN_EXTRACT_LINEAR, NC_("layer-mode", "Grain extract (linear)"), NULL },
-    { GIMP_LAYER_MODE_GRAIN_MERGE, NC_("layer-mode", "Grain merge"), NULL },
-    { GIMP_LAYER_MODE_GRAIN_MERGE_LINEAR, NC_("layer-mode", "Grain merge (linear)"), NULL },
-    { GIMP_LAYER_MODE_VIVID_LIGHT, NC_("layer-mode", "Vivid light"), NULL },
-    { GIMP_LAYER_MODE_VIVID_LIGHT_LINEAR, NC_("layer-mode", "Vivid light (linear)"), NULL },
-    { GIMP_LAYER_MODE_PIN_LIGHT, NC_("layer-mode", "Pin light"), NULL },
-    { GIMP_LAYER_MODE_PIN_LIGHT_LINEAR, NC_("layer-mode", "Pin light (linear)"), NULL },
-    { GIMP_LAYER_MODE_LINEAR_LIGHT, NC_("layer-mode", "Linear light"), NULL },
-    { GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR, NC_("layer-mode", "Linear light (linear)"), NULL },
-    { GIMP_LAYER_MODE_HARD_MIX, NC_("layer-mode", "Hard mix"), NULL },
-    { GIMP_LAYER_MODE_HARD_MIX_LINEAR, NC_("layer-mode", "Hard mix (linear)"), NULL },
-    { GIMP_LAYER_MODE_EXCLUSION, NC_("layer-mode", "Exclusion"), NULL },
-    { GIMP_LAYER_MODE_EXCLUSION_LINEAR, NC_("layer-mode", "Exclusion (linear)"), NULL },
-    { GIMP_LAYER_MODE_LINEAR_BURN, NC_("layer-mode", "Linear burn"), NULL },
-    { GIMP_LAYER_MODE_LINEAR_BURN_LINEAR, NC_("layer-mode", "Linear burn (linear)"), NULL },
-    { GIMP_LAYER_MODE_LUMA_DARKEN_ONLY, NC_("layer-mode", "Luma darken only"), NULL },
-    { GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY, NC_("layer-mode", "Luminance darken only"), NULL },
-    { GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY, NC_("layer-mode", "Luma lighten only"), NULL },
-    { GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY, NC_("layer-mode", "Luminance lighten only"), NULL },
-    { GIMP_LAYER_MODE_ERASE, NC_("layer-mode", "Erase"), NULL },
-    { GIMP_LAYER_MODE_REPLACE, NC_("layer-mode", "Replace"), NULL },
-    { GIMP_LAYER_MODE_ANTI_ERASE, NC_("layer-mode", "Anti erase"), NULL },
-    { 0, NULL, NULL }
-  };
-
-  static GType type = 0;
-
-  if (G_UNLIKELY (! type))
-    {
-      type = g_enum_register_static ("GimpLayerMode", values);
-      gimp_type_set_translation_context (type, "layer-mode");
-      gimp_enum_set_value_descriptions (type, descs);
-    }
-
-  return type;
-}
-
-GType
-gimp_layer_mode_group_get_type (void)
-{
-  static const GEnumValue values[] =
-  {
-    { GIMP_LAYER_MODE_GROUP_DEFAULT, "GIMP_LAYER_MODE_GROUP_DEFAULT", "default" },
-    { GIMP_LAYER_MODE_GROUP_LINEAR, "GIMP_LAYER_MODE_GROUP_LINEAR", "linear" },
-    { GIMP_LAYER_MODE_GROUP_PERCEPTUAL, "GIMP_LAYER_MODE_GROUP_PERCEPTUAL", "perceptual" },
-    { GIMP_LAYER_MODE_GROUP_LEGACY, "GIMP_LAYER_MODE_GROUP_LEGACY", "legacy" },
-    { 0, NULL, NULL }
-  };
-
-  static const GimpEnumDesc descs[] =
-  {
-    { GIMP_LAYER_MODE_GROUP_DEFAULT, NC_("layer-mode-group", "Default"), NULL },
-    { GIMP_LAYER_MODE_GROUP_LINEAR, NC_("layer-mode-group", "Linear light"), NULL },
-    { GIMP_LAYER_MODE_GROUP_PERCEPTUAL, NC_("layer-mode-group", "Perceptual"), NULL },
-    { GIMP_LAYER_MODE_GROUP_LEGACY, NC_("layer-mode-group", "Legacy"), NULL },
-    { 0, NULL, NULL }
-  };
-
-  static GType type = 0;
-
-  if (G_UNLIKELY (! type))
-    {
-      type = g_enum_register_static ("GimpLayerModeGroup", values);
-      gimp_type_set_translation_context (type, "layer-mode-group");
-      gimp_enum_set_value_descriptions (type, descs);
-    }
-
-  return type;
-}
-
-GType
 gimp_matting_engine_get_type (void)
 {
   static const GEnumValue values[] =
diff --git a/app/core/core-enums.h b/app/core/core-enums.h
index 75b59a1..44b2e75 100644
--- a/app/core/core-enums.h
+++ b/app/core/core-enums.h
@@ -148,115 +148,6 @@ typedef enum
 } GimpHistogramChannel;
 
 
-#define GIMP_TYPE_LAYER_MODE (gimp_layer_mode_get_type ())
-
-GType gimp_layer_mode_get_type (void) G_GNUC_CONST;
-
-typedef enum
-{
-  /*  Modes that exist since ancient times  */
-  GIMP_LAYER_MODE_NORMAL,                /*< desc="Normal"                   >*/
-  GIMP_LAYER_MODE_DISSOLVE,              /*< desc="Dissolve"                 >*/
-  GIMP_LAYER_MODE_BEHIND,                /*< desc="Behind"                   >*/
-  GIMP_LAYER_MODE_MULTIPLY_LEGACY,       /*< desc="Multiply (legacy)"        >*/
-  GIMP_LAYER_MODE_SCREEN_LEGACY,         /*< desc="Screen (legacy)"          >*/
-  GIMP_LAYER_MODE_OVERLAY_LEGACY,        /*< desc="Old broken Overlay"       >*/
-  GIMP_LAYER_MODE_DIFFERENCE_LEGACY,     /*< desc="Difference (legacy)"      >*/
-  GIMP_LAYER_MODE_ADDITION_LEGACY,       /*< desc="Addition (legacy)"        >*/
-  GIMP_LAYER_MODE_SUBTRACT_LEGACY,       /*< desc="Subtract (legacy)"        >*/
-  GIMP_LAYER_MODE_DARKEN_ONLY_LEGACY,    /*< desc="Darken only (legacy)"     >*/
-  GIMP_LAYER_MODE_LIGHTEN_ONLY_LEGACY,   /*< desc="Lighten only (legacy)"    >*/
-  GIMP_LAYER_MODE_HSV_HUE_LEGACY,        /*< desc="Hue (HSV) (legacy)"       >*/
-  GIMP_LAYER_MODE_HSV_SATURATION_LEGACY, /*< desc="Saturation (HSV) (legacy)">*/
-  GIMP_LAYER_MODE_HSV_COLOR_LEGACY,      /*< desc="Color (HSV) (legacy)"     >*/
-  GIMP_LAYER_MODE_HSV_VALUE_LEGACY,      /*< desc="Value (HSV) (legacy)"     >*/
-  GIMP_LAYER_MODE_DIVIDE_LEGACY,         /*< desc="Divide (legacy)"          >*/
-  GIMP_LAYER_MODE_DODGE_LEGACY,          /*< desc="Dodge (legacy)"           >*/
-  GIMP_LAYER_MODE_BURN_LEGACY,           /*< desc="Burn (legacy)"            >*/
-  GIMP_LAYER_MODE_HARDLIGHT_LEGACY,      /*< desc="Hard light (legacy)"      >*/
-  GIMP_LAYER_MODE_SOFTLIGHT_LEGACY,      /*< desc="Soft light (legacy)"      >*/
-  GIMP_LAYER_MODE_GRAIN_EXTRACT_LEGACY,  /*< desc="Grain extract (legacy)"   >*/
-  GIMP_LAYER_MODE_GRAIN_MERGE_LEGACY,    /*< desc="Grain merge (legacy)"     >*/
-  GIMP_LAYER_MODE_COLOR_ERASE,           /*< desc="Color erase"              >*/
-
-  /*  Since 2.8  */
-  GIMP_LAYER_MODE_OVERLAY,               /*< desc="Overlay"                  >*/
-  GIMP_LAYER_MODE_LCH_HUE,               /*< desc="Hue (LCH)"                >*/
-  GIMP_LAYER_MODE_LCH_CHROMA,            /*< desc="Chroma (LCH)"             >*/
-  GIMP_LAYER_MODE_LCH_COLOR,             /*< desc="Color (LCH)"              >*/
-  GIMP_LAYER_MODE_LCH_LIGHTNESS,         /*< desc="Lightness (LCH)"          >*/
-
-  /*  Since 2.10  */
-  GIMP_LAYER_MODE_NORMAL_LINEAR,         /*< desc="Normal (linear)"          >*/
-  GIMP_LAYER_MODE_BEHIND_LINEAR,         /*< desc="Behind (linear)"          >*/
-  GIMP_LAYER_MODE_MULTIPLY,              /*< desc="Multiply"                 >*/
-  GIMP_LAYER_MODE_MULTIPLY_LINEAR,       /*< desc="Multiply (linear)"        >*/
-  GIMP_LAYER_MODE_SCREEN,                /*< desc="Screen"                   >*/
-  GIMP_LAYER_MODE_SCREEN_LINEAR,         /*< desc="Screen (linear)"          >*/
-  GIMP_LAYER_MODE_OVERLAY_LINEAR,        /*< desc="Overlay (linear)"         >*/
-  GIMP_LAYER_MODE_DIFFERENCE,            /*< desc="Difference"               >*/
-  GIMP_LAYER_MODE_DIFFERENCE_LINEAR,     /*< desc="Difference (linear)"      >*/
-  GIMP_LAYER_MODE_ADDITION,              /*< desc="Addition"                 >*/
-  GIMP_LAYER_MODE_ADDITION_LINEAR,       /*< desc="Addition (linear)"        >*/
-  GIMP_LAYER_MODE_SUBTRACT,              /*< desc="Subtract"                 >*/
-  GIMP_LAYER_MODE_SUBTRACT_LINEAR,       /*< desc="Subtract (linear)"        >*/
-  GIMP_LAYER_MODE_DARKEN_ONLY,           /*< desc="Darken only"              >*/
-  GIMP_LAYER_MODE_LIGHTEN_ONLY,          /*< desc="Lighten only"             >*/
-  GIMP_LAYER_MODE_HSV_HUE,               /*< desc="Hue (HSV)"                >*/
-  GIMP_LAYER_MODE_HSV_SATURATION,        /*< desc="Saturation (HSV)"         >*/
-  GIMP_LAYER_MODE_HSV_COLOR,             /*< desc="Color (HSV)"              >*/
-  GIMP_LAYER_MODE_HSV_VALUE,             /*< desc="Value (HSV)"              >*/
-  GIMP_LAYER_MODE_DIVIDE,                /*< desc="Divide"                   >*/
-  GIMP_LAYER_MODE_DIVIDE_LINEAR,         /*< desc="Divide (linear)"          >*/
-  GIMP_LAYER_MODE_DODGE,                 /*< desc="Dodge"                    >*/
-  GIMP_LAYER_MODE_DODGE_LINEAR,          /*< desc="Dodge (linear)"           >*/
-  GIMP_LAYER_MODE_BURN,                  /*< desc="Burn"                     >*/
-  GIMP_LAYER_MODE_BURN_LINEAR,           /*< desc="Burn (linear)"            >*/
-  GIMP_LAYER_MODE_HARDLIGHT,             /*< desc="Hard light"               >*/
-  GIMP_LAYER_MODE_HARDLIGHT_LINEAR,      /*< desc="Hard light (linear)"      >*/
-  GIMP_LAYER_MODE_SOFTLIGHT,             /*< desc="Soft light"               >*/
-  GIMP_LAYER_MODE_SOFTLIGHT_LINEAR,      /*< desc="Soft light (linear)"      >*/
-  GIMP_LAYER_MODE_GRAIN_EXTRACT,         /*< desc="Grain extract"            >*/
-  GIMP_LAYER_MODE_GRAIN_EXTRACT_LINEAR,  /*< desc="Grain extract (linear)"   >*/
-  GIMP_LAYER_MODE_GRAIN_MERGE,           /*< desc="Grain merge"              >*/
-  GIMP_LAYER_MODE_GRAIN_MERGE_LINEAR,    /*< desc="Grain merge (linear)"     >*/
-  GIMP_LAYER_MODE_VIVID_LIGHT,           /*< desc="Vivid light"              >*/
-  GIMP_LAYER_MODE_VIVID_LIGHT_LINEAR,    /*< desc="Vivid light (linear)"     >*/
-  GIMP_LAYER_MODE_PIN_LIGHT,             /*< desc="Pin light"                >*/
-  GIMP_LAYER_MODE_PIN_LIGHT_LINEAR,      /*< desc="Pin light (linear)"       >*/
-  GIMP_LAYER_MODE_LINEAR_LIGHT,          /*< desc="Linear light"             >*/
-  GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR,   /*< desc="Linear light (linear)"    >*/
-  GIMP_LAYER_MODE_HARD_MIX,              /*< desc="Hard mix"                 >*/
-  GIMP_LAYER_MODE_HARD_MIX_LINEAR,       /*< desc="Hard mix (linear)"        >*/
-  GIMP_LAYER_MODE_EXCLUSION,             /*< desc="Exclusion"                >*/
-  GIMP_LAYER_MODE_EXCLUSION_LINEAR,      /*< desc="Exclusion (linear)"       >*/
-  GIMP_LAYER_MODE_LINEAR_BURN,           /*< desc="Linear burn"              >*/
-  GIMP_LAYER_MODE_LINEAR_BURN_LINEAR,    /*< desc="Linear burn (linear)"     >*/
-  GIMP_LAYER_MODE_LUMA_DARKEN_ONLY,      /*< desc="Luma darken only"         >*/
-  GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY, /*< desc="Luminance darken only"    >*/
-  GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY,     /*< desc="Luma lighten only"        >*/
-  GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY,/*< desc="Luminance lighten only"   >*/
-
-  /*  Internal modes, not available to the PDB  */
-  GIMP_LAYER_MODE_ERASE      = 1000,     /*< pdb-skip, desc="Erase"          >*/
-  GIMP_LAYER_MODE_REPLACE    = 1001,     /*< pdb-skip, desc="Replace"        >*/
-  GIMP_LAYER_MODE_ANTI_ERASE = 1002      /*< pdb-skip, desc="Anti erase"     >*/
-} GimpLayerMode;
-
-
-#define GIMP_TYPE_LAYER_MODE_GROUP (gimp_layer_mode_group_get_type ())
-
-GType gimp_layer_mode_group_get_type (void) G_GNUC_CONST;
-
-typedef enum  /*< pdb-skip >*/
-{
-  GIMP_LAYER_MODE_GROUP_DEFAULT,     /*< desc="Default"      >*/
-  GIMP_LAYER_MODE_GROUP_LINEAR,      /*< desc="Linear light" >*/
-  GIMP_LAYER_MODE_GROUP_PERCEPTUAL,  /*< desc="Perceptual"   >*/
-  GIMP_LAYER_MODE_GROUP_LEGACY,      /*< desc="Legacy"       >*/
-} GimpLayerModeGroup;
-
-
 #define GIMP_TYPE_MATTING_ENGINE (gimp_matting_engine_get_type ())
 
 GType gimp_matting_engine_get_type (void) G_GNUC_CONST;
diff --git a/app/gegl/gimp-gegl-nodes.c b/app/gegl/gimp-gegl-nodes.c
index 548ed80..86fa66f 100644
--- a/app/gegl/gimp-gegl-nodes.c
+++ b/app/gegl/gimp-gegl-nodes.c
@@ -24,7 +24,7 @@
 
 #include "gimp-gegl-types.h"
 
-#include "core/gimp-layer-modes.h"
+#include "operations/layer-modes/gimp-layer-modes.h"
 
 #include "gimp-gegl-nodes.h"
 #include "gimp-gegl-utils.h"
diff --git a/app/operations/gimp-operations.c b/app/operations/gimp-operations.c
index fc26091..9f40021 100644
--- a/app/operations/gimp-operations.c
+++ b/app/operations/gimp-operations.c
@@ -84,6 +84,7 @@
 #include "layer-modes-legacy/gimpoperationsoftlightlegacy.h"
 #include "layer-modes-legacy/gimpoperationsubtractlegacy.h"
 
+#include "layer-modes/gimp-layer-modes.h"
 #include "layer-modes/gimpoperationantierase.h"
 #include "layer-modes/gimpoperationbehind.h"
 #include "layer-modes/gimpoperationerase.h"
@@ -96,6 +97,8 @@
 void
 gimp_operations_init (void)
 {
+  gimp_layer_modes_init ();
+
   g_type_class_ref (GIMP_TYPE_OPERATION_BLEND);
   g_type_class_ref (GIMP_TYPE_OPERATION_BORDER);
   g_type_class_ref (GIMP_TYPE_OPERATION_CAGE_COEF_CALC);
diff --git a/app/operations/layer-modes/Makefile.am b/app/operations/layer-modes/Makefile.am
index 2764580..59d4117 100644
--- a/app/operations/layer-modes/Makefile.am
+++ b/app/operations/layer-modes/Makefile.am
@@ -19,6 +19,8 @@ noinst_LIBRARIES = \
        libapplayermodes.a
 
 libapplayermodes_generic_a_sources = \
+       gimp-layer-modes.c              \
+       gimp-layer-modes.h              \
        gimpoperationlayermode.c        \
        gimpoperationlayermode.h        \
        gimplayermodefunctions.c        \
diff --git a/app/operations/layer-modes/gimp-layer-modes.c b/app/operations/layer-modes/gimp-layer-modes.c
new file mode 100644
index 0000000..2ae01c7
--- /dev/null
+++ b/app/operations/layer-modes/gimp-layer-modes.c
@@ -0,0 +1,1175 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimp-layer-modes.c
+ * Copyright (C) 2017 Michael Natterer <mitch gimp org>
+ *                    Øyvind Kolås <pippin gimp org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <glib-object.h>
+
+#include "../operations-types.h"
+
+#include "gimp-layer-modes.h"
+
+
+/*  static variables  */
+
+static GimpLayerModeInfo layer_mode_infos[]=
+{
+  { GIMP_LAYER_MODE_NORMAL,
+    "gimp:normal",
+    0,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
+  },
+
+  { GIMP_LAYER_MODE_DISSOLVE,
+    "gimp:dissolve",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_OVER,
+  },
+
+  { GIMP_LAYER_MODE_BEHIND,
+    "gimp:behind",
+    0,
+    GIMP_LAYER_COMPOSITE_DST_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_MULTIPLY_LEGACY,
+    "gimp:multiply-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_SCREEN_LEGACY,
+    "gimp:screen-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_OVERLAY_LEGACY,
+    "gimp:overlay-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_DIFFERENCE_LEGACY,
+    "gimp:difference-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_ADDITION_LEGACY,
+    "gimp:addition-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_SUBTRACT_LEGACY,
+    "gimp:subtract-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_DARKEN_ONLY_LEGACY,
+    "gimp:darken-only-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_LIGHTEN_ONLY_LEGACY,
+    "gimp:lighten-only-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_HSV_HUE_LEGACY,
+    "gimp:hsv-hue-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_HSV_SATURATION_LEGACY,
+    "gimp:hsv-saturation-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_HSV_COLOR_LEGACY,
+    "gimp:hsv-color-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_HSV_VALUE_LEGACY,
+    "gimp:hsv-value-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_DIVIDE_LEGACY,
+    "gimp:divide-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_DODGE_LEGACY,
+    "gimp:dodge-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_BURN_LEGACY,
+    "gimp:burn-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_HARDLIGHT_LEGACY,
+    "gimp:hardlight-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_SOFTLIGHT_LEGACY,
+    "gimp:softlight-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_GRAIN_EXTRACT_LEGACY,
+    "gimp:grain-extract-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_GRAIN_MERGE_LEGACY,
+    "gimp:grain-merge-legacy",
+    GIMP_LAYER_MODE_FLAG_LEGACY,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_COLOR_ERASE,
+    "gimp:color-erase",
+    0,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+  },
+
+  { GIMP_LAYER_MODE_OVERLAY,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_LCH_HUE,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_LAB
+  },
+
+  { GIMP_LAYER_MODE_LCH_CHROMA,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_LAB
+  },
+
+  { GIMP_LAYER_MODE_LCH_COLOR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_LAB
+  },
+
+  { GIMP_LAYER_MODE_LCH_LIGHTNESS,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_LAB
+  },
+
+  { GIMP_LAYER_MODE_NORMAL_LINEAR,
+    "gimp:normal",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+  },
+
+  { GIMP_LAYER_MODE_BEHIND_LINEAR,
+    "gimp:behind",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+  },
+
+  { GIMP_LAYER_MODE_MULTIPLY,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_MULTIPLY_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_SCREEN,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_SCREEN_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_OVERLAY_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_DIFFERENCE,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_DIFFERENCE_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_ADDITION,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_ADDITION_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_SUBTRACT,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_SUBTRACT_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_DARKEN_ONLY,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_LIGHTEN_ONLY,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_HSV_HUE,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_HSV_SATURATION,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_HSV_COLOR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_HSV_VALUE,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_DIVIDE,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_DIVIDE_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_DODGE,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_DODGE_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_BURN,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_BURN_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_HARDLIGHT,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_HARDLIGHT_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_SOFTLIGHT,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_SOFTLIGHT_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_GRAIN_EXTRACT,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_GRAIN_EXTRACT_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_GRAIN_MERGE,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_GRAIN_MERGE_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_VIVID_LIGHT,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_VIVID_LIGHT_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_PIN_LIGHT,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_PIN_LIGHT_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_LINEAR_LIGHT,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_HARD_MIX,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_HARD_MIX_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_EXCLUSION,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_EXCLUSION_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_LINEAR_BURN,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_LINEAR_BURN_LINEAR,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_LUMA_DARKEN_ONLY,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
+  },
+
+  { GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY,
+    "gimp:layer-mode",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
+    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
+  },
+
+  { GIMP_LAYER_MODE_ERASE,
+    "gimp:erase",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+    GIMP_LAYER_COMPOSITE_SRC_ATOP
+  },
+
+  { GIMP_LAYER_MODE_REPLACE,
+    "gimp:replace",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+  },
+
+  { GIMP_LAYER_MODE_ANTI_ERASE,
+    "gimp:anti-erase",
+    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
+  }
+};
+
+static const GimpLayerMode layer_mode_group_default[] =
+{
+  GIMP_LAYER_MODE_NORMAL,
+  GIMP_LAYER_MODE_DISSOLVE,
+
+  GIMP_LAYER_MODE_LIGHTEN_ONLY,
+  GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY,
+  GIMP_LAYER_MODE_SCREEN,
+  GIMP_LAYER_MODE_DODGE,
+  GIMP_LAYER_MODE_ADDITION,
+
+  GIMP_LAYER_MODE_DARKEN_ONLY,
+  GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY,
+  GIMP_LAYER_MODE_MULTIPLY,
+  GIMP_LAYER_MODE_BURN,
+
+  GIMP_LAYER_MODE_OVERLAY,
+  GIMP_LAYER_MODE_SOFTLIGHT,
+  GIMP_LAYER_MODE_HARDLIGHT,
+  GIMP_LAYER_MODE_VIVID_LIGHT,
+  GIMP_LAYER_MODE_PIN_LIGHT,
+  GIMP_LAYER_MODE_LINEAR_LIGHT,
+  GIMP_LAYER_MODE_HARD_MIX,
+
+  GIMP_LAYER_MODE_DIFFERENCE,
+  GIMP_LAYER_MODE_SUBTRACT,
+  GIMP_LAYER_MODE_GRAIN_EXTRACT,
+  GIMP_LAYER_MODE_GRAIN_MERGE,
+  GIMP_LAYER_MODE_DIVIDE,
+
+  GIMP_LAYER_MODE_LCH_HUE,
+  GIMP_LAYER_MODE_LCH_CHROMA,
+  GIMP_LAYER_MODE_LCH_COLOR,
+  GIMP_LAYER_MODE_LCH_LIGHTNESS,
+
+  GIMP_LAYER_MODE_EXCLUSION,
+  GIMP_LAYER_MODE_LINEAR_BURN
+};
+
+static const GimpLayerMode layer_mode_group_linear[] =
+{
+  GIMP_LAYER_MODE_NORMAL_LINEAR,
+  GIMP_LAYER_MODE_DISSOLVE,
+
+  GIMP_LAYER_MODE_LIGHTEN_ONLY,
+  GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY,
+  GIMP_LAYER_MODE_SCREEN_LINEAR,
+  GIMP_LAYER_MODE_DODGE_LINEAR,
+  GIMP_LAYER_MODE_ADDITION_LINEAR,
+
+  GIMP_LAYER_MODE_DARKEN_ONLY,
+  GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY,
+  GIMP_LAYER_MODE_MULTIPLY_LINEAR,
+  GIMP_LAYER_MODE_BURN_LINEAR,
+
+  GIMP_LAYER_MODE_OVERLAY_LINEAR,
+  GIMP_LAYER_MODE_SOFTLIGHT_LINEAR,
+  GIMP_LAYER_MODE_HARDLIGHT_LINEAR,
+  GIMP_LAYER_MODE_VIVID_LIGHT_LINEAR,
+  GIMP_LAYER_MODE_PIN_LIGHT_LINEAR,
+  GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR,
+  GIMP_LAYER_MODE_HARD_MIX_LINEAR,
+
+  GIMP_LAYER_MODE_DIFFERENCE_LINEAR,
+  GIMP_LAYER_MODE_SUBTRACT_LINEAR,
+  GIMP_LAYER_MODE_GRAIN_EXTRACT_LINEAR,
+  GIMP_LAYER_MODE_GRAIN_MERGE_LINEAR,
+  GIMP_LAYER_MODE_DIVIDE_LINEAR,
+
+  GIMP_LAYER_MODE_EXCLUSION_LINEAR,
+  GIMP_LAYER_MODE_LINEAR_BURN_LINEAR
+};
+
+static const GimpLayerMode layer_mode_group_perceptual[] =
+{
+  GIMP_LAYER_MODE_NORMAL,
+  GIMP_LAYER_MODE_DISSOLVE,
+
+  GIMP_LAYER_MODE_LIGHTEN_ONLY,
+  GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY,
+  GIMP_LAYER_MODE_SCREEN,
+  GIMP_LAYER_MODE_DODGE,
+  GIMP_LAYER_MODE_ADDITION,
+
+  GIMP_LAYER_MODE_DARKEN_ONLY,
+  GIMP_LAYER_MODE_LUMA_DARKEN_ONLY,
+  GIMP_LAYER_MODE_MULTIPLY,
+  GIMP_LAYER_MODE_BURN,
+
+  GIMP_LAYER_MODE_OVERLAY,
+  GIMP_LAYER_MODE_SOFTLIGHT,
+  GIMP_LAYER_MODE_HARDLIGHT,
+  GIMP_LAYER_MODE_VIVID_LIGHT,
+  GIMP_LAYER_MODE_PIN_LIGHT,
+  GIMP_LAYER_MODE_LINEAR_LIGHT,
+  GIMP_LAYER_MODE_HARD_MIX,
+
+  GIMP_LAYER_MODE_DIFFERENCE,
+  GIMP_LAYER_MODE_SUBTRACT,
+  GIMP_LAYER_MODE_GRAIN_EXTRACT,
+  GIMP_LAYER_MODE_GRAIN_MERGE,
+  GIMP_LAYER_MODE_DIVIDE,
+
+  GIMP_LAYER_MODE_HSV_HUE,
+  GIMP_LAYER_MODE_HSV_SATURATION,
+  GIMP_LAYER_MODE_HSV_COLOR,
+  GIMP_LAYER_MODE_HSV_VALUE,
+
+  GIMP_LAYER_MODE_LCH_HUE,
+  GIMP_LAYER_MODE_LCH_CHROMA,
+  GIMP_LAYER_MODE_LCH_COLOR,
+  GIMP_LAYER_MODE_LCH_LIGHTNESS,
+
+  GIMP_LAYER_MODE_EXCLUSION,
+  GIMP_LAYER_MODE_LINEAR_BURN
+};
+
+static const GimpLayerMode layer_mode_group_legacy[] =
+{
+  GIMP_LAYER_MODE_NORMAL,
+  GIMP_LAYER_MODE_DISSOLVE,
+
+  GIMP_LAYER_MODE_LIGHTEN_ONLY_LEGACY,
+  GIMP_LAYER_MODE_SCREEN_LEGACY,
+  GIMP_LAYER_MODE_DODGE_LEGACY,
+  GIMP_LAYER_MODE_ADDITION_LEGACY,
+
+  GIMP_LAYER_MODE_DARKEN_ONLY_LEGACY,
+  GIMP_LAYER_MODE_MULTIPLY_LEGACY,
+  GIMP_LAYER_MODE_BURN_LEGACY,
+
+  GIMP_LAYER_MODE_SOFTLIGHT_LEGACY,
+  GIMP_LAYER_MODE_HARDLIGHT_LEGACY,
+
+  GIMP_LAYER_MODE_DIFFERENCE_LEGACY,
+  GIMP_LAYER_MODE_SUBTRACT_LEGACY,
+  GIMP_LAYER_MODE_GRAIN_EXTRACT_LEGACY,
+  GIMP_LAYER_MODE_GRAIN_MERGE_LEGACY,
+  GIMP_LAYER_MODE_DIVIDE_LEGACY,
+
+  GIMP_LAYER_MODE_HSV_HUE_LEGACY,
+  GIMP_LAYER_MODE_HSV_SATURATION_LEGACY,
+  GIMP_LAYER_MODE_HSV_COLOR_LEGACY,
+  GIMP_LAYER_MODE_HSV_VALUE_LEGACY
+};
+
+static const GimpLayerMode layer_mode_groups[][4] =
+{
+  {
+    GIMP_LAYER_MODE_NORMAL,
+    GIMP_LAYER_MODE_NORMAL_LINEAR,
+    GIMP_LAYER_MODE_NORMAL,
+    GIMP_LAYER_MODE_NORMAL
+  },
+
+  {
+    GIMP_LAYER_MODE_DISSOLVE,
+    GIMP_LAYER_MODE_DISSOLVE,
+    GIMP_LAYER_MODE_DISSOLVE,
+    GIMP_LAYER_MODE_DISSOLVE
+  },
+
+  {
+    GIMP_LAYER_MODE_BEHIND,
+    GIMP_LAYER_MODE_BEHIND_LINEAR,
+    GIMP_LAYER_MODE_BEHIND,
+    GIMP_LAYER_MODE_BEHIND
+  },
+
+  {
+    GIMP_LAYER_MODE_MULTIPLY,
+    GIMP_LAYER_MODE_MULTIPLY_LINEAR,
+    GIMP_LAYER_MODE_MULTIPLY,
+    GIMP_LAYER_MODE_MULTIPLY_LEGACY
+  },
+
+  {
+    GIMP_LAYER_MODE_SCREEN,
+    GIMP_LAYER_MODE_SCREEN_LINEAR,
+    GIMP_LAYER_MODE_SCREEN,
+    GIMP_LAYER_MODE_SCREEN_LEGACY
+  },
+
+  {
+    GIMP_LAYER_MODE_OVERLAY,
+    GIMP_LAYER_MODE_OVERLAY_LINEAR,
+    GIMP_LAYER_MODE_OVERLAY,
+    -1
+  },
+
+  {
+    GIMP_LAYER_MODE_DIFFERENCE,
+    GIMP_LAYER_MODE_DIFFERENCE_LINEAR,
+    GIMP_LAYER_MODE_DIFFERENCE,
+    GIMP_LAYER_MODE_DIFFERENCE_LEGACY
+  },
+
+  {
+    GIMP_LAYER_MODE_ADDITION,
+    GIMP_LAYER_MODE_ADDITION_LINEAR,
+    GIMP_LAYER_MODE_ADDITION,
+    GIMP_LAYER_MODE_ADDITION_LEGACY
+  },
+
+  {
+    GIMP_LAYER_MODE_SUBTRACT,
+    GIMP_LAYER_MODE_SUBTRACT_LINEAR,
+    GIMP_LAYER_MODE_SUBTRACT,
+    GIMP_LAYER_MODE_SUBTRACT_LEGACY
+  },
+
+  {
+    GIMP_LAYER_MODE_DARKEN_ONLY,
+    GIMP_LAYER_MODE_DARKEN_ONLY,
+    GIMP_LAYER_MODE_DARKEN_ONLY,
+    GIMP_LAYER_MODE_DARKEN_ONLY_LEGACY
+  },
+
+  {
+    GIMP_LAYER_MODE_LIGHTEN_ONLY,
+    GIMP_LAYER_MODE_LIGHTEN_ONLY,
+    GIMP_LAYER_MODE_LIGHTEN_ONLY,
+    GIMP_LAYER_MODE_LIGHTEN_ONLY_LEGACY
+  },
+
+  {
+    -1,
+    -1,
+    GIMP_LAYER_MODE_HSV_HUE,
+    GIMP_LAYER_MODE_HSV_HUE_LEGACY
+  },
+
+  {
+    -1,
+    -1,
+    GIMP_LAYER_MODE_HSV_SATURATION,
+    GIMP_LAYER_MODE_HSV_SATURATION_LEGACY
+  },
+
+  {
+    -1,
+    -1,
+    GIMP_LAYER_MODE_HSV_COLOR,
+    GIMP_LAYER_MODE_HSV_COLOR_LEGACY
+  },
+
+  {
+    -1,
+    -1,
+    GIMP_LAYER_MODE_HSV_VALUE,
+    GIMP_LAYER_MODE_HSV_VALUE_LEGACY
+  },
+
+  {
+    GIMP_LAYER_MODE_DIVIDE,
+    GIMP_LAYER_MODE_DIVIDE_LINEAR,
+    GIMP_LAYER_MODE_DIVIDE,
+    GIMP_LAYER_MODE_DIVIDE_LEGACY
+  },
+
+  {
+    GIMP_LAYER_MODE_DODGE,
+    GIMP_LAYER_MODE_DODGE_LINEAR,
+    GIMP_LAYER_MODE_DODGE,
+    GIMP_LAYER_MODE_DODGE_LEGACY
+  },
+
+  {
+    GIMP_LAYER_MODE_BURN,
+    GIMP_LAYER_MODE_BURN_LINEAR,
+    GIMP_LAYER_MODE_BURN,
+    GIMP_LAYER_MODE_BURN_LEGACY
+  },
+
+  {
+    GIMP_LAYER_MODE_HARDLIGHT,
+    GIMP_LAYER_MODE_HARDLIGHT_LINEAR,
+    GIMP_LAYER_MODE_HARDLIGHT,
+    GIMP_LAYER_MODE_HARDLIGHT_LEGACY
+  },
+
+  {
+    GIMP_LAYER_MODE_SOFTLIGHT,
+    GIMP_LAYER_MODE_SOFTLIGHT_LINEAR,
+    GIMP_LAYER_MODE_SOFTLIGHT,
+    GIMP_LAYER_MODE_SOFTLIGHT_LEGACY
+  },
+
+  {
+    GIMP_LAYER_MODE_GRAIN_EXTRACT,
+    GIMP_LAYER_MODE_GRAIN_EXTRACT_LINEAR,
+    GIMP_LAYER_MODE_GRAIN_EXTRACT,
+    GIMP_LAYER_MODE_GRAIN_EXTRACT_LEGACY
+  },
+
+  {
+    GIMP_LAYER_MODE_GRAIN_MERGE,
+    GIMP_LAYER_MODE_GRAIN_MERGE_LINEAR,
+    GIMP_LAYER_MODE_GRAIN_MERGE,
+    GIMP_LAYER_MODE_GRAIN_MERGE_LEGACY
+  },
+
+  {
+    GIMP_LAYER_MODE_COLOR_ERASE,
+    -1,
+    GIMP_LAYER_MODE_COLOR_ERASE,
+    -1,
+  },
+
+  {
+    GIMP_LAYER_MODE_VIVID_LIGHT,
+    GIMP_LAYER_MODE_VIVID_LIGHT_LINEAR,
+    GIMP_LAYER_MODE_VIVID_LIGHT,
+    -1
+  },
+
+  {
+    GIMP_LAYER_MODE_PIN_LIGHT,
+    GIMP_LAYER_MODE_PIN_LIGHT_LINEAR,
+    GIMP_LAYER_MODE_PIN_LIGHT,
+    -1
+  },
+
+  {
+    GIMP_LAYER_MODE_LINEAR_LIGHT,
+    GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR,
+    GIMP_LAYER_MODE_LINEAR_LIGHT,
+    -1
+  },
+
+  {
+    GIMP_LAYER_MODE_HARD_MIX,
+    GIMP_LAYER_MODE_HARD_MIX_LINEAR,
+    GIMP_LAYER_MODE_HARD_MIX,
+    -1
+  },
+
+  {
+    GIMP_LAYER_MODE_EXCLUSION,
+    GIMP_LAYER_MODE_EXCLUSION_LINEAR,
+    GIMP_LAYER_MODE_EXCLUSION,
+    -1
+  },
+
+  {
+    GIMP_LAYER_MODE_LINEAR_BURN,
+    GIMP_LAYER_MODE_LINEAR_BURN_LINEAR,
+    GIMP_LAYER_MODE_LINEAR_BURN,
+    -1
+  },
+
+  {
+    GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY,
+    GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY,
+    GIMP_LAYER_MODE_LUMA_DARKEN_ONLY,
+    -1
+  },
+
+  {
+    GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY,
+    GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY,
+    GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY,
+    -1
+  },
+
+  {
+    GIMP_LAYER_MODE_ERASE,
+    GIMP_LAYER_MODE_ERASE,
+    -1,
+    -1
+  },
+
+  {
+    GIMP_LAYER_MODE_REPLACE,
+    GIMP_LAYER_MODE_REPLACE,
+    -1,
+    -1
+  },
+
+  {
+    GIMP_LAYER_MODE_ANTI_ERASE,
+    GIMP_LAYER_MODE_ANTI_ERASE,
+    -1,
+    -1
+  },
+};
+
+
+/*  public functions  */
+
+void
+gimp_layer_modes_init (void)
+{
+  gint i;
+
+  for (i = 0; i < G_N_ELEMENTS (layer_mode_infos); i++)
+    {
+      g_assert ((GimpLayerMode) i == layer_mode_infos[i].layer_mode);
+    }
+}
+
+const GimpLayerModeInfo *
+gimp_layer_mode_info (GimpLayerMode mode)
+{
+  g_return_val_if_fail (mode < G_N_ELEMENTS (layer_mode_infos),
+                        &layer_mode_infos[0]);
+
+  return &layer_mode_infos[mode];
+}
+
+gboolean
+gimp_layer_mode_is_legacy (GimpLayerMode  mode)
+{
+  const GimpLayerModeInfo *info = gimp_layer_mode_info (mode);
+  if (!info)
+    return FALSE;
+  return (info->flags & GIMP_LAYER_MODE_FLAG_LEGACY) != 0;
+}
+
+gboolean
+gimp_layer_mode_wants_linear_data (GimpLayerMode  mode)
+{
+  const GimpLayerModeInfo *info = gimp_layer_mode_info (mode);
+  if (!info)
+    return FALSE;
+  return (info->flags & GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA) != 0;
+}
+
+GimpLayerColorSpace
+gimp_layer_mode_get_blend_space (GimpLayerMode  mode)
+{
+  const GimpLayerModeInfo *info = gimp_layer_mode_info (mode);
+  if (!info)
+    return GIMP_LAYER_COLOR_SPACE_RGB_LINEAR;
+  return info->blend_space;
+}
+
+GimpLayerColorSpace
+gimp_layer_mode_get_composite_space (GimpLayerMode  mode)
+{
+  const GimpLayerModeInfo *info = gimp_layer_mode_info (mode);
+  if (!info)
+    return GIMP_LAYER_COLOR_SPACE_RGB_LINEAR;
+  return info->composite_space;
+}
+
+GimpLayerCompositeMode
+gimp_layer_mode_get_composite_mode (GimpLayerMode  mode)
+{
+  const GimpLayerModeInfo *info = gimp_layer_mode_info (mode);
+  if (!info)
+    return GIMP_LAYER_COMPOSITE_SRC_OVER;
+  return info->composite_mode;
+}
+
+const gchar *
+gimp_layer_mode_get_operation (GimpLayerMode  mode)
+{
+  const GimpLayerModeInfo *info = gimp_layer_mode_info (mode);
+  if (!info)
+    return "gimp:layer-mode";
+  return info->op_name;
+}
+
+static gboolean
+is_mode_in_array (const GimpLayerMode *modes,
+                  gint                 n_modes,
+                  GimpLayerMode        mode)
+{
+  gint i;
+
+  for (i = 0; i < n_modes; i++)
+    if (modes[i] == mode)
+      return TRUE;
+
+  return FALSE;
+}
+
+GimpLayerModeGroup
+gimp_layer_mode_get_group (GimpLayerMode  mode)
+{
+  if (is_mode_in_array (layer_mode_group_default,
+                        G_N_ELEMENTS (layer_mode_group_default), mode))
+    {
+      return GIMP_LAYER_MODE_GROUP_DEFAULT;
+    }
+  else if (is_mode_in_array (layer_mode_group_linear,
+                             G_N_ELEMENTS (layer_mode_group_linear), mode))
+    {
+      return GIMP_LAYER_MODE_GROUP_LINEAR;
+    }
+  else if (is_mode_in_array (layer_mode_group_perceptual,
+                             G_N_ELEMENTS (layer_mode_group_perceptual), mode))
+    {
+      return GIMP_LAYER_MODE_GROUP_PERCEPTUAL;
+    }
+  else if (is_mode_in_array (layer_mode_group_legacy,
+                             G_N_ELEMENTS (layer_mode_group_legacy), mode))
+    {
+      return GIMP_LAYER_MODE_GROUP_LEGACY;
+    }
+
+  return GIMP_LAYER_MODE_GROUP_DEFAULT;
+}
+
+const GimpLayerMode *
+gimp_layer_mode_get_group_array (GimpLayerModeGroup  group,
+                                 gint               *n_modes)
+{
+  g_return_val_if_fail (n_modes != NULL, NULL);
+
+  switch (group)
+    {
+    case GIMP_LAYER_MODE_GROUP_DEFAULT:
+      *n_modes = G_N_ELEMENTS (layer_mode_group_default);
+      return layer_mode_group_default;
+
+    case GIMP_LAYER_MODE_GROUP_LINEAR:
+      *n_modes = G_N_ELEMENTS (layer_mode_group_linear);
+      return layer_mode_group_linear;
+
+    case GIMP_LAYER_MODE_GROUP_PERCEPTUAL:
+      *n_modes = G_N_ELEMENTS (layer_mode_group_perceptual);
+      return layer_mode_group_perceptual;
+
+    case GIMP_LAYER_MODE_GROUP_LEGACY:
+      *n_modes = G_N_ELEMENTS (layer_mode_group_legacy);
+      return layer_mode_group_legacy;
+
+    default:
+      g_return_val_if_reached (NULL);
+    }
+}
+
+gboolean
+gimp_layer_mode_get_for_group (GimpLayerMode       old_mode,
+                               GimpLayerModeGroup  new_group,
+                               GimpLayerMode      *new_mode)
+{
+  gint i;
+
+  g_return_val_if_fail (new_mode != NULL, FALSE);
+
+  for (i = 0; i < G_N_ELEMENTS (layer_mode_groups); i++)
+    {
+      if (is_mode_in_array (layer_mode_groups[i], 4, old_mode))
+        {
+          *new_mode = layer_mode_groups[i][new_group];
+
+          if (*new_mode != -1)
+            return TRUE;
+
+          return FALSE;
+        }
+    }
+
+  *new_mode = -1;
+
+  return FALSE;
+}
diff --git a/app/core/gimp-layer-modes.h b/app/operations/layer-modes/gimp-layer-modes.h
similarity index 81%
rename from app/core/gimp-layer-modes.h
rename to app/operations/layer-modes/gimp-layer-modes.h
index dbd04df..fb3df8c 100644
--- a/app/core/gimp-layer-modes.h
+++ b/app/operations/layer-modes/gimp-layer-modes.h
@@ -23,6 +23,23 @@
 #define __GIMP_LAYER_MODES_H__
 
 
+typedef struct _GimpLayerModeInfo GimpLayerModeInfo;
+
+struct _GimpLayerModeInfo
+{
+  GimpLayerMode          layer_mode;
+  gchar                 *op_name;
+  GimpLayerModeFlags     flags;
+  GimpLayerCompositeMode composite_mode;
+  GimpLayerColorSpace    composite_space;
+  GimpLayerColorSpace    blend_space;
+};
+
+
+void                     gimp_layer_modes_init               (void);
+
+const GimpLayerModeInfo *gimp_layer_mode_info                (GimpLayerMode       mode);
+
 gboolean                 gimp_layer_mode_is_legacy           (GimpLayerMode       mode);
 gboolean                 gimp_layer_mode_wants_linear_data   (GimpLayerMode       mode);
 
diff --git a/app/operations/layer-modes/gimpoperationlayermode.c 
b/app/operations/layer-modes/gimpoperationlayermode.c
index b899a2d..20de360 100644
--- a/app/operations/layer-modes/gimpoperationlayermode.c
+++ b/app/operations/layer-modes/gimpoperationlayermode.c
@@ -1980,574 +1980,6 @@ static inline GimpBlendFunc gimp_layer_mode_get_blend_fun (GimpLayerMode mode)
     case GIMP_LAYER_MODE_ANTI_ERASE:
       return (void*)dummy_fun;
   }
-  return (void*)dummy_fun;
-}
-
-struct _GimpOperationLayerModeInfo
-{
-  GimpLayerMode          layer_mode;
-  gchar                 *mode_name;
-  gchar                 *op_name;
-  GimpLayerModeFlags     flags;
-  GimpLayerCompositeMode composite_mode;
-  GimpLayerColorSpace    composite_space;
-  GimpLayerColorSpace    blend_space;
-};
 
-static GimpLayerModeInfo gimp_layer_mode_infos[]=
-{
-  { GIMP_LAYER_MODE_NORMAL,
-    "gimp:normal",
-    0,
-    GIMP_LAYER_COMPOSITE_SRC_OVER,
-  },
-  { GIMP_LAYER_MODE_DISSOLVE,
-    "gimp:dissolve",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_OVER,
-  },
-  { GIMP_LAYER_MODE_BEHIND,
-    "gimp:behind",
-    0,
-    GIMP_LAYER_COMPOSITE_DST_ATOP,
-  },
-  { GIMP_LAYER_MODE_MULTIPLY_LEGACY,
-    "gimp:multiply-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_SCREEN_LEGACY,
-    "gimp:screen-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_OVERLAY_LEGACY,
-    "gimp:overlay-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_DIFFERENCE_LEGACY,
-    "gimp:difference-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_ADDITION_LEGACY,
-    "gimp:addition-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_SUBTRACT_LEGACY,
-    "gimp:subtract-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_DARKEN_ONLY_LEGACY,
-    "gimp:darken-only-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_LIGHTEN_ONLY_LEGACY,
-    "gimp:lighten-only-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_HSV_HUE_LEGACY,
-    "gimp:hsv-hue-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_HSV_SATURATION_LEGACY,
-    "gimp:hsv-saturation-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_HSV_COLOR_LEGACY,
-    "gimp:hsv-color-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_HSV_VALUE_LEGACY,
-    "gimp:hsv-value-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_DIVIDE_LEGACY,
-    "gimp:divide-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_DODGE_LEGACY,
-    "gimp:dodge-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_BURN_LEGACY,
-    "gimp:burn-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_HARDLIGHT_LEGACY,
-    "gimp:hardlight-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_SOFTLIGHT_LEGACY,
-    "gimp:softlight-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_GRAIN_EXTRACT_LEGACY,
-    "gimp:grain-extract-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_GRAIN_MERGE_LEGACY,
-    "gimp:grain-merge-legacy",
-    GIMP_LAYER_MODE_FLAG_LEGACY,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_COLOR_ERASE,
-    "gimp:color-erase",
-    0,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-  },
-  { GIMP_LAYER_MODE_OVERLAY,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_LCH_HUE,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_LAB
-  },
-  { GIMP_LAYER_MODE_LCH_CHROMA,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_LAB
-  },
-  { GIMP_LAYER_MODE_LCH_COLOR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_LAB
-  },
-  { GIMP_LAYER_MODE_LCH_LIGHTNESS,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_LAB
-  },
-  { GIMP_LAYER_MODE_NORMAL_LINEAR,
-    "gimp:normal",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-  },
-  { GIMP_LAYER_MODE_BEHIND_LINEAR,
-    "gimp:behind",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-  },
-  { GIMP_LAYER_MODE_MULTIPLY,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_MULTIPLY_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_SCREEN,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_SCREEN_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_OVERLAY_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_DIFFERENCE,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_DIFFERENCE_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_ADDITION,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_ADDITION_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_SUBTRACT,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_SUBTRACT_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_DARKEN_ONLY,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_LIGHTEN_ONLY,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_HSV_HUE,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_HSV_SATURATION,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_HSV_COLOR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_HSV_VALUE,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_DIVIDE,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_DIVIDE_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_DODGE,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_DODGE_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_BURN,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_BURN_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_HARDLIGHT,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_HARDLIGHT_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_SOFTLIGHT,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_SOFTLIGHT_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_GRAIN_EXTRACT,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_GRAIN_EXTRACT_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_GRAIN_MERGE,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_GRAIN_MERGE_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_VIVID_LIGHT,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_VIVID_LIGHT_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_PIN_LIGHT,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_PIN_LIGHT_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_LINEAR_LIGHT,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_HARD_MIX,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_HARD_MIX_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_EXCLUSION,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_EXCLUSION_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_LINEAR_BURN,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_LINEAR_BURN_LINEAR,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_LUMA_DARKEN_ONLY,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_PERCEPTUAL
-  },
-  { GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY,
-    "gimp:layer-mode",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR,
-    GIMP_LAYER_COLOR_SPACE_RGB_LINEAR
-  },
-  { GIMP_LAYER_MODE_ERASE,
-    "gimp:erase",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-    GIMP_LAYER_COMPOSITE_SRC_ATOP
-  },
-  { GIMP_LAYER_MODE_REPLACE,
-    "gimp:replace",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-  },
-  { GIMP_LAYER_MODE_ANTI_ERASE,
-    "gimp:anti-erase",
-    GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA,
-  },
-};
-
-const GimpLayerModeInfo *gimp_layer_mode_info (GimpLayerMode mode)
-{
-  int i;
-  for (i = 0; i < sizeof (gimp_layer_mode_infos) /
-                  sizeof (gimp_layer_mode_infos[0]); i++)
-    {
-      if (gimp_layer_mode_infos[i].layer_mode == mode)
-        return &gimp_layer_mode_infos[i];
-    }
-  return NULL;
-}
-
-#if 0
-/* the following is test code for verifying that the above data matches 
-   the apis it takes over for
- */
-
-#include "core/gimp-layer-modes.h"
-
-void verify_layer_mode_info (void);
-void verify_layer_mode_info (void)
-{
-  int i;
-  for (i = 0; i < sizeof (gimp_layer_mode_infos) / sizeof (gimp_layer_mode_infos[0]); i++)
-  {
-     GimpLayerModeInfo *info = &gimp_layer_mode_infos[i];
-     printf ("%i  - %s\n", i,  info->op_name);
-     int mode = info->layer_mode;
-     if (info->layer_mode != i)
-     {
-        printf (" enum mismatch\n");
-     }
-     if ((gimp_layer_mode_is_legacy (mode) !=
-           ((info->flags & GIMP_LAYER_MODE_FLAG_LEGACY) != 0)))
-        printf (" legacy mismatch\n");
-     if ((gimp_layer_mode_wants_linear_data (mode) !=
-           ((info->flags & GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA) != 0)))
-        printf (" wants linear data mismatch\n");
-     if (!strcmp (info->op_name, "gimp:layer-mode"))
-     {
-     if (gimp_layer_mode_get_blend_space (mode) != info->blend_space)
-        printf (" blend space mismatch\n");
-     if (gimp_layer_mode_get_composite_space (mode) != info->composite_space)
-        printf (" composite space mismatch\n");
-     if (gimp_layer_mode_get_composite_mode (mode) != info->composite_mode)
-        printf (" composite mode mismatch\n");
-     if (strcmp (gimp_layer_mode_get_operation (mode), info->op_name))
-        printf (" operation mismatch\n");
-     }
-  }
-  exit(0);
+  return (void*)dummy_fun;
 }
-#endif
diff --git a/app/operations/layer-modes/gimpoperationlayermode.h 
b/app/operations/layer-modes/gimpoperationlayermode.h
index 392aa30..be6e684 100644
--- a/app/operations/layer-modes/gimpoperationlayermode.h
+++ b/app/operations/layer-modes/gimpoperationlayermode.h
@@ -48,26 +48,6 @@ struct _GimpOperationLayerModeClass
   GimpLayerModeAffectMask (* get_affect_mask) (GimpOperationLayerMode *layer_mode);
 };
 
-typedef struct _GimpLayerModeInfo GimpLayerModeInfo;
-
-typedef enum GimpLayerModeFlags {
-  GIMP_LAYER_MODE_FLAG_LEGACY = (1<<0),
-  GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA = (1<<1)
-} GimpLayerModeFlags;
-
-
-struct _GimpLayerModeInfo
-{
-  GimpLayerMode          layer_mode;
-  gchar                 *op_name;
-  GimpLayerModeFlags     flags;
-  GimpLayerCompositeMode composite_mode;
-  GimpLayerColorSpace    composite_space;
-  GimpLayerColorSpace    blend_space;
-};
-
-const GimpLayerModeInfo *gimp_layer_mode_info (GimpLayerMode mode);
-
 
 struct _GimpOperationLayerMode
 {
diff --git a/app/operations/operations-enums.c b/app/operations/operations-enums.c
index de7adcf..e8ccc4b 100644
--- a/app/operations/operations-enums.c
+++ b/app/operations/operations-enums.c
@@ -74,6 +74,224 @@ gimp_layer_composite_mode_get_type (void)
   return type;
 }
 
+GType
+gimp_layer_mode_get_type (void)
+{
+  static const GEnumValue values[] =
+  {
+    { GIMP_LAYER_MODE_NORMAL, "GIMP_LAYER_MODE_NORMAL", "normal" },
+    { GIMP_LAYER_MODE_DISSOLVE, "GIMP_LAYER_MODE_DISSOLVE", "dissolve" },
+    { GIMP_LAYER_MODE_BEHIND, "GIMP_LAYER_MODE_BEHIND", "behind" },
+    { GIMP_LAYER_MODE_MULTIPLY_LEGACY, "GIMP_LAYER_MODE_MULTIPLY_LEGACY", "multiply-legacy" },
+    { GIMP_LAYER_MODE_SCREEN_LEGACY, "GIMP_LAYER_MODE_SCREEN_LEGACY", "screen-legacy" },
+    { GIMP_LAYER_MODE_OVERLAY_LEGACY, "GIMP_LAYER_MODE_OVERLAY_LEGACY", "overlay-legacy" },
+    { GIMP_LAYER_MODE_DIFFERENCE_LEGACY, "GIMP_LAYER_MODE_DIFFERENCE_LEGACY", "difference-legacy" },
+    { GIMP_LAYER_MODE_ADDITION_LEGACY, "GIMP_LAYER_MODE_ADDITION_LEGACY", "addition-legacy" },
+    { GIMP_LAYER_MODE_SUBTRACT_LEGACY, "GIMP_LAYER_MODE_SUBTRACT_LEGACY", "subtract-legacy" },
+    { GIMP_LAYER_MODE_DARKEN_ONLY_LEGACY, "GIMP_LAYER_MODE_DARKEN_ONLY_LEGACY", "darken-only-legacy" },
+    { GIMP_LAYER_MODE_LIGHTEN_ONLY_LEGACY, "GIMP_LAYER_MODE_LIGHTEN_ONLY_LEGACY", "lighten-only-legacy" },
+    { GIMP_LAYER_MODE_HSV_HUE_LEGACY, "GIMP_LAYER_MODE_HSV_HUE_LEGACY", "hsv-hue-legacy" },
+    { GIMP_LAYER_MODE_HSV_SATURATION_LEGACY, "GIMP_LAYER_MODE_HSV_SATURATION_LEGACY", 
"hsv-saturation-legacy" },
+    { GIMP_LAYER_MODE_HSV_COLOR_LEGACY, "GIMP_LAYER_MODE_HSV_COLOR_LEGACY", "hsv-color-legacy" },
+    { GIMP_LAYER_MODE_HSV_VALUE_LEGACY, "GIMP_LAYER_MODE_HSV_VALUE_LEGACY", "hsv-value-legacy" },
+    { GIMP_LAYER_MODE_DIVIDE_LEGACY, "GIMP_LAYER_MODE_DIVIDE_LEGACY", "divide-legacy" },
+    { GIMP_LAYER_MODE_DODGE_LEGACY, "GIMP_LAYER_MODE_DODGE_LEGACY", "dodge-legacy" },
+    { GIMP_LAYER_MODE_BURN_LEGACY, "GIMP_LAYER_MODE_BURN_LEGACY", "burn-legacy" },
+    { GIMP_LAYER_MODE_HARDLIGHT_LEGACY, "GIMP_LAYER_MODE_HARDLIGHT_LEGACY", "hardlight-legacy" },
+    { GIMP_LAYER_MODE_SOFTLIGHT_LEGACY, "GIMP_LAYER_MODE_SOFTLIGHT_LEGACY", "softlight-legacy" },
+    { GIMP_LAYER_MODE_GRAIN_EXTRACT_LEGACY, "GIMP_LAYER_MODE_GRAIN_EXTRACT_LEGACY", "grain-extract-legacy" },
+    { GIMP_LAYER_MODE_GRAIN_MERGE_LEGACY, "GIMP_LAYER_MODE_GRAIN_MERGE_LEGACY", "grain-merge-legacy" },
+    { GIMP_LAYER_MODE_COLOR_ERASE, "GIMP_LAYER_MODE_COLOR_ERASE", "color-erase" },
+    { GIMP_LAYER_MODE_OVERLAY, "GIMP_LAYER_MODE_OVERLAY", "overlay" },
+    { GIMP_LAYER_MODE_LCH_HUE, "GIMP_LAYER_MODE_LCH_HUE", "lch-hue" },
+    { GIMP_LAYER_MODE_LCH_CHROMA, "GIMP_LAYER_MODE_LCH_CHROMA", "lch-chroma" },
+    { GIMP_LAYER_MODE_LCH_COLOR, "GIMP_LAYER_MODE_LCH_COLOR", "lch-color" },
+    { GIMP_LAYER_MODE_LCH_LIGHTNESS, "GIMP_LAYER_MODE_LCH_LIGHTNESS", "lch-lightness" },
+    { GIMP_LAYER_MODE_NORMAL_LINEAR, "GIMP_LAYER_MODE_NORMAL_LINEAR", "normal-linear" },
+    { GIMP_LAYER_MODE_BEHIND_LINEAR, "GIMP_LAYER_MODE_BEHIND_LINEAR", "behind-linear" },
+    { GIMP_LAYER_MODE_MULTIPLY, "GIMP_LAYER_MODE_MULTIPLY", "multiply" },
+    { GIMP_LAYER_MODE_MULTIPLY_LINEAR, "GIMP_LAYER_MODE_MULTIPLY_LINEAR", "multiply-linear" },
+    { GIMP_LAYER_MODE_SCREEN, "GIMP_LAYER_MODE_SCREEN", "screen" },
+    { GIMP_LAYER_MODE_SCREEN_LINEAR, "GIMP_LAYER_MODE_SCREEN_LINEAR", "screen-linear" },
+    { GIMP_LAYER_MODE_OVERLAY_LINEAR, "GIMP_LAYER_MODE_OVERLAY_LINEAR", "overlay-linear" },
+    { GIMP_LAYER_MODE_DIFFERENCE, "GIMP_LAYER_MODE_DIFFERENCE", "difference" },
+    { GIMP_LAYER_MODE_DIFFERENCE_LINEAR, "GIMP_LAYER_MODE_DIFFERENCE_LINEAR", "difference-linear" },
+    { GIMP_LAYER_MODE_ADDITION, "GIMP_LAYER_MODE_ADDITION", "addition" },
+    { GIMP_LAYER_MODE_ADDITION_LINEAR, "GIMP_LAYER_MODE_ADDITION_LINEAR", "addition-linear" },
+    { GIMP_LAYER_MODE_SUBTRACT, "GIMP_LAYER_MODE_SUBTRACT", "subtract" },
+    { GIMP_LAYER_MODE_SUBTRACT_LINEAR, "GIMP_LAYER_MODE_SUBTRACT_LINEAR", "subtract-linear" },
+    { GIMP_LAYER_MODE_DARKEN_ONLY, "GIMP_LAYER_MODE_DARKEN_ONLY", "darken-only" },
+    { GIMP_LAYER_MODE_LIGHTEN_ONLY, "GIMP_LAYER_MODE_LIGHTEN_ONLY", "lighten-only" },
+    { GIMP_LAYER_MODE_HSV_HUE, "GIMP_LAYER_MODE_HSV_HUE", "hsv-hue" },
+    { GIMP_LAYER_MODE_HSV_SATURATION, "GIMP_LAYER_MODE_HSV_SATURATION", "hsv-saturation" },
+    { GIMP_LAYER_MODE_HSV_COLOR, "GIMP_LAYER_MODE_HSV_COLOR", "hsv-color" },
+    { GIMP_LAYER_MODE_HSV_VALUE, "GIMP_LAYER_MODE_HSV_VALUE", "hsv-value" },
+    { GIMP_LAYER_MODE_DIVIDE, "GIMP_LAYER_MODE_DIVIDE", "divide" },
+    { GIMP_LAYER_MODE_DIVIDE_LINEAR, "GIMP_LAYER_MODE_DIVIDE_LINEAR", "divide-linear" },
+    { GIMP_LAYER_MODE_DODGE, "GIMP_LAYER_MODE_DODGE", "dodge" },
+    { GIMP_LAYER_MODE_DODGE_LINEAR, "GIMP_LAYER_MODE_DODGE_LINEAR", "dodge-linear" },
+    { GIMP_LAYER_MODE_BURN, "GIMP_LAYER_MODE_BURN", "burn" },
+    { GIMP_LAYER_MODE_BURN_LINEAR, "GIMP_LAYER_MODE_BURN_LINEAR", "burn-linear" },
+    { GIMP_LAYER_MODE_HARDLIGHT, "GIMP_LAYER_MODE_HARDLIGHT", "hardlight" },
+    { GIMP_LAYER_MODE_HARDLIGHT_LINEAR, "GIMP_LAYER_MODE_HARDLIGHT_LINEAR", "hardlight-linear" },
+    { GIMP_LAYER_MODE_SOFTLIGHT, "GIMP_LAYER_MODE_SOFTLIGHT", "softlight" },
+    { GIMP_LAYER_MODE_SOFTLIGHT_LINEAR, "GIMP_LAYER_MODE_SOFTLIGHT_LINEAR", "softlight-linear" },
+    { GIMP_LAYER_MODE_GRAIN_EXTRACT, "GIMP_LAYER_MODE_GRAIN_EXTRACT", "grain-extract" },
+    { GIMP_LAYER_MODE_GRAIN_EXTRACT_LINEAR, "GIMP_LAYER_MODE_GRAIN_EXTRACT_LINEAR", "grain-extract-linear" },
+    { GIMP_LAYER_MODE_GRAIN_MERGE, "GIMP_LAYER_MODE_GRAIN_MERGE", "grain-merge" },
+    { GIMP_LAYER_MODE_GRAIN_MERGE_LINEAR, "GIMP_LAYER_MODE_GRAIN_MERGE_LINEAR", "grain-merge-linear" },
+    { GIMP_LAYER_MODE_VIVID_LIGHT, "GIMP_LAYER_MODE_VIVID_LIGHT", "vivid-light" },
+    { GIMP_LAYER_MODE_VIVID_LIGHT_LINEAR, "GIMP_LAYER_MODE_VIVID_LIGHT_LINEAR", "vivid-light-linear" },
+    { GIMP_LAYER_MODE_PIN_LIGHT, "GIMP_LAYER_MODE_PIN_LIGHT", "pin-light" },
+    { GIMP_LAYER_MODE_PIN_LIGHT_LINEAR, "GIMP_LAYER_MODE_PIN_LIGHT_LINEAR", "pin-light-linear" },
+    { GIMP_LAYER_MODE_LINEAR_LIGHT, "GIMP_LAYER_MODE_LINEAR_LIGHT", "linear-light" },
+    { GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR, "GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR", "linear-light-linear" },
+    { GIMP_LAYER_MODE_HARD_MIX, "GIMP_LAYER_MODE_HARD_MIX", "hard-mix" },
+    { GIMP_LAYER_MODE_HARD_MIX_LINEAR, "GIMP_LAYER_MODE_HARD_MIX_LINEAR", "hard-mix-linear" },
+    { GIMP_LAYER_MODE_EXCLUSION, "GIMP_LAYER_MODE_EXCLUSION", "exclusion" },
+    { GIMP_LAYER_MODE_EXCLUSION_LINEAR, "GIMP_LAYER_MODE_EXCLUSION_LINEAR", "exclusion-linear" },
+    { GIMP_LAYER_MODE_LINEAR_BURN, "GIMP_LAYER_MODE_LINEAR_BURN", "linear-burn" },
+    { GIMP_LAYER_MODE_LINEAR_BURN_LINEAR, "GIMP_LAYER_MODE_LINEAR_BURN_LINEAR", "linear-burn-linear" },
+    { GIMP_LAYER_MODE_LUMA_DARKEN_ONLY, "GIMP_LAYER_MODE_LUMA_DARKEN_ONLY", "luma-darken-only" },
+    { GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY, "GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY", 
"luminance-darken-only" },
+    { GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY, "GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY", "luma-lighten-only" },
+    { GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY, "GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY", 
"luminance-lighten-only" },
+    { GIMP_LAYER_MODE_ERASE, "GIMP_LAYER_MODE_ERASE", "erase" },
+    { GIMP_LAYER_MODE_REPLACE, "GIMP_LAYER_MODE_REPLACE", "replace" },
+    { GIMP_LAYER_MODE_ANTI_ERASE, "GIMP_LAYER_MODE_ANTI_ERASE", "anti-erase" },
+    { 0, NULL, NULL }
+  };
+
+  static const GimpEnumDesc descs[] =
+  {
+    { GIMP_LAYER_MODE_NORMAL, NC_("layer-mode", "Normal"), NULL },
+    { GIMP_LAYER_MODE_DISSOLVE, NC_("layer-mode", "Dissolve"), NULL },
+    { GIMP_LAYER_MODE_BEHIND, NC_("layer-mode", "Behind"), NULL },
+    { GIMP_LAYER_MODE_MULTIPLY_LEGACY, NC_("layer-mode", "Multiply (legacy)"), NULL },
+    { GIMP_LAYER_MODE_SCREEN_LEGACY, NC_("layer-mode", "Screen (legacy)"), NULL },
+    { GIMP_LAYER_MODE_OVERLAY_LEGACY, NC_("layer-mode", "Old broken Overlay"), NULL },
+    { GIMP_LAYER_MODE_DIFFERENCE_LEGACY, NC_("layer-mode", "Difference (legacy)"), NULL },
+    { GIMP_LAYER_MODE_ADDITION_LEGACY, NC_("layer-mode", "Addition (legacy)"), NULL },
+    { GIMP_LAYER_MODE_SUBTRACT_LEGACY, NC_("layer-mode", "Subtract (legacy)"), NULL },
+    { GIMP_LAYER_MODE_DARKEN_ONLY_LEGACY, NC_("layer-mode", "Darken only (legacy)"), NULL },
+    { GIMP_LAYER_MODE_LIGHTEN_ONLY_LEGACY, NC_("layer-mode", "Lighten only (legacy)"), NULL },
+    { GIMP_LAYER_MODE_HSV_HUE_LEGACY, NC_("layer-mode", "Hue (HSV) (legacy)"), NULL },
+    { GIMP_LAYER_MODE_HSV_SATURATION_LEGACY, NC_("layer-mode", "Saturation (HSV) (legacy)"), NULL },
+    { GIMP_LAYER_MODE_HSV_COLOR_LEGACY, NC_("layer-mode", "Color (HSV) (legacy)"), NULL },
+    { GIMP_LAYER_MODE_HSV_VALUE_LEGACY, NC_("layer-mode", "Value (HSV) (legacy)"), NULL },
+    { GIMP_LAYER_MODE_DIVIDE_LEGACY, NC_("layer-mode", "Divide (legacy)"), NULL },
+    { GIMP_LAYER_MODE_DODGE_LEGACY, NC_("layer-mode", "Dodge (legacy)"), NULL },
+    { GIMP_LAYER_MODE_BURN_LEGACY, NC_("layer-mode", "Burn (legacy)"), NULL },
+    { GIMP_LAYER_MODE_HARDLIGHT_LEGACY, NC_("layer-mode", "Hard light (legacy)"), NULL },
+    { GIMP_LAYER_MODE_SOFTLIGHT_LEGACY, NC_("layer-mode", "Soft light (legacy)"), NULL },
+    { GIMP_LAYER_MODE_GRAIN_EXTRACT_LEGACY, NC_("layer-mode", "Grain extract (legacy)"), NULL },
+    { GIMP_LAYER_MODE_GRAIN_MERGE_LEGACY, NC_("layer-mode", "Grain merge (legacy)"), NULL },
+    { GIMP_LAYER_MODE_COLOR_ERASE, NC_("layer-mode", "Color erase"), NULL },
+    { GIMP_LAYER_MODE_OVERLAY, NC_("layer-mode", "Overlay"), NULL },
+    { GIMP_LAYER_MODE_LCH_HUE, NC_("layer-mode", "Hue (LCH)"), NULL },
+    { GIMP_LAYER_MODE_LCH_CHROMA, NC_("layer-mode", "Chroma (LCH)"), NULL },
+    { GIMP_LAYER_MODE_LCH_COLOR, NC_("layer-mode", "Color (LCH)"), NULL },
+    { GIMP_LAYER_MODE_LCH_LIGHTNESS, NC_("layer-mode", "Lightness (LCH)"), NULL },
+    { GIMP_LAYER_MODE_NORMAL_LINEAR, NC_("layer-mode", "Normal (linear)"), NULL },
+    { GIMP_LAYER_MODE_BEHIND_LINEAR, NC_("layer-mode", "Behind (linear)"), NULL },
+    { GIMP_LAYER_MODE_MULTIPLY, NC_("layer-mode", "Multiply"), NULL },
+    { GIMP_LAYER_MODE_MULTIPLY_LINEAR, NC_("layer-mode", "Multiply (linear)"), NULL },
+    { GIMP_LAYER_MODE_SCREEN, NC_("layer-mode", "Screen"), NULL },
+    { GIMP_LAYER_MODE_SCREEN_LINEAR, NC_("layer-mode", "Screen (linear)"), NULL },
+    { GIMP_LAYER_MODE_OVERLAY_LINEAR, NC_("layer-mode", "Overlay (linear)"), NULL },
+    { GIMP_LAYER_MODE_DIFFERENCE, NC_("layer-mode", "Difference"), NULL },
+    { GIMP_LAYER_MODE_DIFFERENCE_LINEAR, NC_("layer-mode", "Difference (linear)"), NULL },
+    { GIMP_LAYER_MODE_ADDITION, NC_("layer-mode", "Addition"), NULL },
+    { GIMP_LAYER_MODE_ADDITION_LINEAR, NC_("layer-mode", "Addition (linear)"), NULL },
+    { GIMP_LAYER_MODE_SUBTRACT, NC_("layer-mode", "Subtract"), NULL },
+    { GIMP_LAYER_MODE_SUBTRACT_LINEAR, NC_("layer-mode", "Subtract (linear)"), NULL },
+    { GIMP_LAYER_MODE_DARKEN_ONLY, NC_("layer-mode", "Darken only"), NULL },
+    { GIMP_LAYER_MODE_LIGHTEN_ONLY, NC_("layer-mode", "Lighten only"), NULL },
+    { GIMP_LAYER_MODE_HSV_HUE, NC_("layer-mode", "Hue (HSV)"), NULL },
+    { GIMP_LAYER_MODE_HSV_SATURATION, NC_("layer-mode", "Saturation (HSV)"), NULL },
+    { GIMP_LAYER_MODE_HSV_COLOR, NC_("layer-mode", "Color (HSV)"), NULL },
+    { GIMP_LAYER_MODE_HSV_VALUE, NC_("layer-mode", "Value (HSV)"), NULL },
+    { GIMP_LAYER_MODE_DIVIDE, NC_("layer-mode", "Divide"), NULL },
+    { GIMP_LAYER_MODE_DIVIDE_LINEAR, NC_("layer-mode", "Divide (linear)"), NULL },
+    { GIMP_LAYER_MODE_DODGE, NC_("layer-mode", "Dodge"), NULL },
+    { GIMP_LAYER_MODE_DODGE_LINEAR, NC_("layer-mode", "Dodge (linear)"), NULL },
+    { GIMP_LAYER_MODE_BURN, NC_("layer-mode", "Burn"), NULL },
+    { GIMP_LAYER_MODE_BURN_LINEAR, NC_("layer-mode", "Burn (linear)"), NULL },
+    { GIMP_LAYER_MODE_HARDLIGHT, NC_("layer-mode", "Hard light"), NULL },
+    { GIMP_LAYER_MODE_HARDLIGHT_LINEAR, NC_("layer-mode", "Hard light (linear)"), NULL },
+    { GIMP_LAYER_MODE_SOFTLIGHT, NC_("layer-mode", "Soft light"), NULL },
+    { GIMP_LAYER_MODE_SOFTLIGHT_LINEAR, NC_("layer-mode", "Soft light (linear)"), NULL },
+    { GIMP_LAYER_MODE_GRAIN_EXTRACT, NC_("layer-mode", "Grain extract"), NULL },
+    { GIMP_LAYER_MODE_GRAIN_EXTRACT_LINEAR, NC_("layer-mode", "Grain extract (linear)"), NULL },
+    { GIMP_LAYER_MODE_GRAIN_MERGE, NC_("layer-mode", "Grain merge"), NULL },
+    { GIMP_LAYER_MODE_GRAIN_MERGE_LINEAR, NC_("layer-mode", "Grain merge (linear)"), NULL },
+    { GIMP_LAYER_MODE_VIVID_LIGHT, NC_("layer-mode", "Vivid light"), NULL },
+    { GIMP_LAYER_MODE_VIVID_LIGHT_LINEAR, NC_("layer-mode", "Vivid light (linear)"), NULL },
+    { GIMP_LAYER_MODE_PIN_LIGHT, NC_("layer-mode", "Pin light"), NULL },
+    { GIMP_LAYER_MODE_PIN_LIGHT_LINEAR, NC_("layer-mode", "Pin light (linear)"), NULL },
+    { GIMP_LAYER_MODE_LINEAR_LIGHT, NC_("layer-mode", "Linear light"), NULL },
+    { GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR, NC_("layer-mode", "Linear light (linear)"), NULL },
+    { GIMP_LAYER_MODE_HARD_MIX, NC_("layer-mode", "Hard mix"), NULL },
+    { GIMP_LAYER_MODE_HARD_MIX_LINEAR, NC_("layer-mode", "Hard mix (linear)"), NULL },
+    { GIMP_LAYER_MODE_EXCLUSION, NC_("layer-mode", "Exclusion"), NULL },
+    { GIMP_LAYER_MODE_EXCLUSION_LINEAR, NC_("layer-mode", "Exclusion (linear)"), NULL },
+    { GIMP_LAYER_MODE_LINEAR_BURN, NC_("layer-mode", "Linear burn"), NULL },
+    { GIMP_LAYER_MODE_LINEAR_BURN_LINEAR, NC_("layer-mode", "Linear burn (linear)"), NULL },
+    { GIMP_LAYER_MODE_LUMA_DARKEN_ONLY, NC_("layer-mode", "Luma darken only"), NULL },
+    { GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY, NC_("layer-mode", "Luminance darken only"), NULL },
+    { GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY, NC_("layer-mode", "Luma lighten only"), NULL },
+    { GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY, NC_("layer-mode", "Luminance lighten only"), NULL },
+    { GIMP_LAYER_MODE_ERASE, NC_("layer-mode", "Erase"), NULL },
+    { GIMP_LAYER_MODE_REPLACE, NC_("layer-mode", "Replace"), NULL },
+    { GIMP_LAYER_MODE_ANTI_ERASE, NC_("layer-mode", "Anti erase"), NULL },
+    { 0, NULL, NULL }
+  };
+
+  static GType type = 0;
+
+  if (G_UNLIKELY (! type))
+    {
+      type = g_enum_register_static ("GimpLayerMode", values);
+      gimp_type_set_translation_context (type, "layer-mode");
+      gimp_enum_set_value_descriptions (type, descs);
+    }
+
+  return type;
+}
+
+GType
+gimp_layer_mode_group_get_type (void)
+{
+  static const GEnumValue values[] =
+  {
+    { GIMP_LAYER_MODE_GROUP_DEFAULT, "GIMP_LAYER_MODE_GROUP_DEFAULT", "default" },
+    { GIMP_LAYER_MODE_GROUP_LINEAR, "GIMP_LAYER_MODE_GROUP_LINEAR", "linear" },
+    { GIMP_LAYER_MODE_GROUP_PERCEPTUAL, "GIMP_LAYER_MODE_GROUP_PERCEPTUAL", "perceptual" },
+    { GIMP_LAYER_MODE_GROUP_LEGACY, "GIMP_LAYER_MODE_GROUP_LEGACY", "legacy" },
+    { 0, NULL, NULL }
+  };
+
+  static const GimpEnumDesc descs[] =
+  {
+    { GIMP_LAYER_MODE_GROUP_DEFAULT, NC_("layer-mode-group", "Default"), NULL },
+    { GIMP_LAYER_MODE_GROUP_LINEAR, NC_("layer-mode-group", "Linear light"), NULL },
+    { GIMP_LAYER_MODE_GROUP_PERCEPTUAL, NC_("layer-mode-group", "Perceptual"), NULL },
+    { GIMP_LAYER_MODE_GROUP_LEGACY, NC_("layer-mode-group", "Legacy"), NULL },
+    { 0, NULL, NULL }
+  };
+
+  static GType type = 0;
+
+  if (G_UNLIKELY (! type))
+    {
+      type = g_enum_register_static ("GimpLayerModeGroup", values);
+      gimp_type_set_translation_context (type, "layer-mode-group");
+      gimp_enum_set_value_descriptions (type, descs);
+    }
+
+  return type;
+}
+
 
 /* Generated data ends here */
 
diff --git a/app/operations/operations-enums.h b/app/operations/operations-enums.h
index 0739562..3ee565b 100644
--- a/app/operations/operations-enums.h
+++ b/app/operations/operations-enums.h
@@ -47,11 +47,119 @@ typedef enum
 } GimpLayerCompositeMode;
 
 
+#define GIMP_TYPE_LAYER_MODE (gimp_layer_mode_get_type ())
+
+GType gimp_layer_mode_get_type (void) G_GNUC_CONST;
+
+typedef enum
+{
+  /*  Modes that exist since ancient times  */
+  GIMP_LAYER_MODE_NORMAL,                /*< desc="Normal"                   >*/
+  GIMP_LAYER_MODE_DISSOLVE,              /*< desc="Dissolve"                 >*/
+  GIMP_LAYER_MODE_BEHIND,                /*< desc="Behind"                   >*/
+  GIMP_LAYER_MODE_MULTIPLY_LEGACY,       /*< desc="Multiply (legacy)"        >*/
+  GIMP_LAYER_MODE_SCREEN_LEGACY,         /*< desc="Screen (legacy)"          >*/
+  GIMP_LAYER_MODE_OVERLAY_LEGACY,        /*< desc="Old broken Overlay"       >*/
+  GIMP_LAYER_MODE_DIFFERENCE_LEGACY,     /*< desc="Difference (legacy)"      >*/
+  GIMP_LAYER_MODE_ADDITION_LEGACY,       /*< desc="Addition (legacy)"        >*/
+  GIMP_LAYER_MODE_SUBTRACT_LEGACY,       /*< desc="Subtract (legacy)"        >*/
+  GIMP_LAYER_MODE_DARKEN_ONLY_LEGACY,    /*< desc="Darken only (legacy)"     >*/
+  GIMP_LAYER_MODE_LIGHTEN_ONLY_LEGACY,   /*< desc="Lighten only (legacy)"    >*/
+  GIMP_LAYER_MODE_HSV_HUE_LEGACY,        /*< desc="Hue (HSV) (legacy)"       >*/
+  GIMP_LAYER_MODE_HSV_SATURATION_LEGACY, /*< desc="Saturation (HSV) (legacy)">*/
+  GIMP_LAYER_MODE_HSV_COLOR_LEGACY,      /*< desc="Color (HSV) (legacy)"     >*/
+  GIMP_LAYER_MODE_HSV_VALUE_LEGACY,      /*< desc="Value (HSV) (legacy)"     >*/
+  GIMP_LAYER_MODE_DIVIDE_LEGACY,         /*< desc="Divide (legacy)"          >*/
+  GIMP_LAYER_MODE_DODGE_LEGACY,          /*< desc="Dodge (legacy)"           >*/
+  GIMP_LAYER_MODE_BURN_LEGACY,           /*< desc="Burn (legacy)"            >*/
+  GIMP_LAYER_MODE_HARDLIGHT_LEGACY,      /*< desc="Hard light (legacy)"      >*/
+  GIMP_LAYER_MODE_SOFTLIGHT_LEGACY,      /*< desc="Soft light (legacy)"      >*/
+  GIMP_LAYER_MODE_GRAIN_EXTRACT_LEGACY,  /*< desc="Grain extract (legacy)"   >*/
+  GIMP_LAYER_MODE_GRAIN_MERGE_LEGACY,    /*< desc="Grain merge (legacy)"     >*/
+  GIMP_LAYER_MODE_COLOR_ERASE,           /*< desc="Color erase"              >*/
+
+  /*  Since 2.8  */
+  GIMP_LAYER_MODE_OVERLAY,               /*< desc="Overlay"                  >*/
+  GIMP_LAYER_MODE_LCH_HUE,               /*< desc="Hue (LCH)"                >*/
+  GIMP_LAYER_MODE_LCH_CHROMA,            /*< desc="Chroma (LCH)"             >*/
+  GIMP_LAYER_MODE_LCH_COLOR,             /*< desc="Color (LCH)"              >*/
+  GIMP_LAYER_MODE_LCH_LIGHTNESS,         /*< desc="Lightness (LCH)"          >*/
+
+  /*  Since 2.10  */
+  GIMP_LAYER_MODE_NORMAL_LINEAR,         /*< desc="Normal (linear)"          >*/
+  GIMP_LAYER_MODE_BEHIND_LINEAR,         /*< desc="Behind (linear)"          >*/
+  GIMP_LAYER_MODE_MULTIPLY,              /*< desc="Multiply"                 >*/
+  GIMP_LAYER_MODE_MULTIPLY_LINEAR,       /*< desc="Multiply (linear)"        >*/
+  GIMP_LAYER_MODE_SCREEN,                /*< desc="Screen"                   >*/
+  GIMP_LAYER_MODE_SCREEN_LINEAR,         /*< desc="Screen (linear)"          >*/
+  GIMP_LAYER_MODE_OVERLAY_LINEAR,        /*< desc="Overlay (linear)"         >*/
+  GIMP_LAYER_MODE_DIFFERENCE,            /*< desc="Difference"               >*/
+  GIMP_LAYER_MODE_DIFFERENCE_LINEAR,     /*< desc="Difference (linear)"      >*/
+  GIMP_LAYER_MODE_ADDITION,              /*< desc="Addition"                 >*/
+  GIMP_LAYER_MODE_ADDITION_LINEAR,       /*< desc="Addition (linear)"        >*/
+  GIMP_LAYER_MODE_SUBTRACT,              /*< desc="Subtract"                 >*/
+  GIMP_LAYER_MODE_SUBTRACT_LINEAR,       /*< desc="Subtract (linear)"        >*/
+  GIMP_LAYER_MODE_DARKEN_ONLY,           /*< desc="Darken only"              >*/
+  GIMP_LAYER_MODE_LIGHTEN_ONLY,          /*< desc="Lighten only"             >*/
+  GIMP_LAYER_MODE_HSV_HUE,               /*< desc="Hue (HSV)"                >*/
+  GIMP_LAYER_MODE_HSV_SATURATION,        /*< desc="Saturation (HSV)"         >*/
+  GIMP_LAYER_MODE_HSV_COLOR,             /*< desc="Color (HSV)"              >*/
+  GIMP_LAYER_MODE_HSV_VALUE,             /*< desc="Value (HSV)"              >*/
+  GIMP_LAYER_MODE_DIVIDE,                /*< desc="Divide"                   >*/
+  GIMP_LAYER_MODE_DIVIDE_LINEAR,         /*< desc="Divide (linear)"          >*/
+  GIMP_LAYER_MODE_DODGE,                 /*< desc="Dodge"                    >*/
+  GIMP_LAYER_MODE_DODGE_LINEAR,          /*< desc="Dodge (linear)"           >*/
+  GIMP_LAYER_MODE_BURN,                  /*< desc="Burn"                     >*/
+  GIMP_LAYER_MODE_BURN_LINEAR,           /*< desc="Burn (linear)"            >*/
+  GIMP_LAYER_MODE_HARDLIGHT,             /*< desc="Hard light"               >*/
+  GIMP_LAYER_MODE_HARDLIGHT_LINEAR,      /*< desc="Hard light (linear)"      >*/
+  GIMP_LAYER_MODE_SOFTLIGHT,             /*< desc="Soft light"               >*/
+  GIMP_LAYER_MODE_SOFTLIGHT_LINEAR,      /*< desc="Soft light (linear)"      >*/
+  GIMP_LAYER_MODE_GRAIN_EXTRACT,         /*< desc="Grain extract"            >*/
+  GIMP_LAYER_MODE_GRAIN_EXTRACT_LINEAR,  /*< desc="Grain extract (linear)"   >*/
+  GIMP_LAYER_MODE_GRAIN_MERGE,           /*< desc="Grain merge"              >*/
+  GIMP_LAYER_MODE_GRAIN_MERGE_LINEAR,    /*< desc="Grain merge (linear)"     >*/
+  GIMP_LAYER_MODE_VIVID_LIGHT,           /*< desc="Vivid light"              >*/
+  GIMP_LAYER_MODE_VIVID_LIGHT_LINEAR,    /*< desc="Vivid light (linear)"     >*/
+  GIMP_LAYER_MODE_PIN_LIGHT,             /*< desc="Pin light"                >*/
+  GIMP_LAYER_MODE_PIN_LIGHT_LINEAR,      /*< desc="Pin light (linear)"       >*/
+  GIMP_LAYER_MODE_LINEAR_LIGHT,          /*< desc="Linear light"             >*/
+  GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR,   /*< desc="Linear light (linear)"    >*/
+  GIMP_LAYER_MODE_HARD_MIX,              /*< desc="Hard mix"                 >*/
+  GIMP_LAYER_MODE_HARD_MIX_LINEAR,       /*< desc="Hard mix (linear)"        >*/
+  GIMP_LAYER_MODE_EXCLUSION,             /*< desc="Exclusion"                >*/
+  GIMP_LAYER_MODE_EXCLUSION_LINEAR,      /*< desc="Exclusion (linear)"       >*/
+  GIMP_LAYER_MODE_LINEAR_BURN,           /*< desc="Linear burn"              >*/
+  GIMP_LAYER_MODE_LINEAR_BURN_LINEAR,    /*< desc="Linear burn (linear)"     >*/
+  GIMP_LAYER_MODE_LUMA_DARKEN_ONLY,      /*< desc="Luma darken only"         >*/
+  GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY, /*< desc="Luminance darken only"    >*/
+  GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY,     /*< desc="Luma lighten only"        >*/
+  GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY,/*< desc="Luminance lighten only"   >*/
+
+  /*  Internal modes, not available to the PDB, must be kept at the end  */
+  GIMP_LAYER_MODE_ERASE,                 /*< pdb-skip, desc="Erase"          >*/
+  GIMP_LAYER_MODE_REPLACE,               /*< pdb-skip, desc="Replace"        >*/
+  GIMP_LAYER_MODE_ANTI_ERASE             /*< pdb-skip, desc="Anti erase"     >*/
+} GimpLayerMode;
+
+
+#define GIMP_TYPE_LAYER_MODE_GROUP (gimp_layer_mode_group_get_type ())
+
+GType gimp_layer_mode_group_get_type (void) G_GNUC_CONST;
+
+typedef enum  /*< pdb-skip >*/
+{
+  GIMP_LAYER_MODE_GROUP_DEFAULT,     /*< desc="Default"      >*/
+  GIMP_LAYER_MODE_GROUP_LINEAR,      /*< desc="Linear light" >*/
+  GIMP_LAYER_MODE_GROUP_PERCEPTUAL,  /*< desc="Perceptual"   >*/
+  GIMP_LAYER_MODE_GROUP_LEGACY,      /*< desc="Legacy"       >*/
+} GimpLayerModeGroup;
+
+
 /*
  * non-registered enums; register them if needed
  */
 
-
 typedef enum  /*< pdb-skip, skip >*/
 {
   GIMP_LAYER_MODE_AFFECT_NONE = 0,
@@ -59,5 +167,11 @@ typedef enum  /*< pdb-skip, skip >*/
   GIMP_LAYER_MODE_AFFECT_SRC  = 1 << 1
 } GimpLayerModeAffectMask;
 
+typedef enum  /*< pdb-skip, skip >*/
+{
+  GIMP_LAYER_MODE_FLAG_LEGACY            =  1 << 0,
+  GIMP_LAYER_MODE_FLAG_WANTS_LINEAR_DATA =  1 << 1
+} GimpLayerModeFlags;
+
 
 #endif /* __OPERATIONS_ENUMS_H__ */
diff --git a/app/paint/gimpbrushcore.c b/app/paint/gimpbrushcore.c
index 540d6e5..d495bfa 100644
--- a/app/paint/gimpbrushcore.c
+++ b/app/paint/gimpbrushcore.c
@@ -26,9 +26,10 @@
 
 #include "paint-types.h"
 
+#include "operations/layer-modes/gimp-layer-modes.h"
+
 #include "gegl/gimp-babl.h"
 
-#include "core/gimp-layer-modes.h"
 #include "core/gimpbrush.h"
 #include "core/gimpbrushgenerated.h"
 #include "core/gimpdrawable.h"
diff --git a/app/paint/gimpink.c b/app/paint/gimpink.c
index 8f8cf9e..3ee478f 100644
--- a/app/paint/gimpink.c
+++ b/app/paint/gimpink.c
@@ -26,9 +26,10 @@
 
 #include "paint-types.h"
 
+#include "operations/layer-modes/gimp-layer-modes.h"
+
 #include "gegl/gimp-gegl-utils.h"
 
-#include "core/gimp-layer-modes.h"
 #include "core/gimp-palettes.h"
 #include "core/gimpdrawable.h"
 #include "core/gimpimage.h"
diff --git a/app/paint/gimppaintcore-loops.c b/app/paint/gimppaintcore-loops.c
index e72dab1..63463d9 100644
--- a/app/paint/gimppaintcore-loops.c
+++ b/app/paint/gimppaintcore-loops.c
@@ -22,7 +22,8 @@
 
 #include "paint-types.h"
 
-#include "core/gimp-layer-modes.h"
+#include "operations/layer-modes/gimp-layer-modes.h"
+
 #include "core/gimptempbuf.h"
 
 #include "operations/layer-modes/gimplayermodefunctions.h"
diff --git a/app/paint/gimppaintcore.c b/app/paint/gimppaintcore.c
index 72bc503..dc7ea1e 100644
--- a/app/paint/gimppaintcore.c
+++ b/app/paint/gimppaintcore.c
@@ -28,13 +28,14 @@
 
 #include "paint-types.h"
 
+#include "operations/layer-modes/gimp-layer-modes.h"
+
 #include "gegl/gimp-gegl-loops.h"
 #include "gegl/gimp-gegl-nodes.h"
 #include "gegl/gimp-gegl-utils.h"
 #include "gegl/gimpapplicator.h"
 
 #include "core/gimp.h"
-#include "core/gimp-layer-modes.h"
 #include "core/gimp-utils.h"
 #include "core/gimpchannel.h"
 #include "core/gimpimage.h"
diff --git a/app/widgets/gimplayermodebox.c b/app/widgets/gimplayermodebox.c
index 7ae6f55..0b06e27 100644
--- a/app/widgets/gimplayermodebox.c
+++ b/app/widgets/gimplayermodebox.c
@@ -28,7 +28,7 @@
 
 #include "widgets-types.h"
 
-#include "core/gimp-layer-modes.h"
+#include "operations/layer-modes/gimp-layer-modes.h"
 
 #include "gimplayermodebox.h"
 #include "gimplayermodecombobox.h"
diff --git a/app/widgets/gimplayermodecombobox.c b/app/widgets/gimplayermodecombobox.c
index 733773d..bc45c29 100644
--- a/app/widgets/gimplayermodecombobox.c
+++ b/app/widgets/gimplayermodecombobox.c
@@ -28,7 +28,7 @@
 
 #include "widgets-types.h"
 
-#include "core/gimp-layer-modes.h"
+#include "operations/layer-modes/gimp-layer-modes.h"
 
 #include "gimplayermodecombobox.h"
 
diff --git a/tools/pdbgen/enums.pl b/tools/pdbgen/enums.pl
index e60ef62..9e8b13a 100644
--- a/tools/pdbgen/enums.pl
+++ b/tools/pdbgen/enums.pl
@@ -683,32 +683,9 @@ package Gimp::CodeGen::enums;
                       GIMP_LAYER_COMPOSITE_SRC_IN => '3',
                       GIMP_LAYER_COMPOSITE_DST_ATOP => '4' }
        },
-    GimpConvertDitherType =>
-       { contig => 1,
-         header => 'core/core-enums.h',
-         symbols => [ qw(GIMP_NO_DITHER GIMP_FS_DITHER
-                         GIMP_FSLOWBLEED_DITHER GIMP_FIXED_DITHER) ],
-         mapping => { GIMP_NO_DITHER => '0',
-                      GIMP_FS_DITHER => '1',
-                      GIMP_FSLOWBLEED_DITHER => '2',
-                      GIMP_FIXED_DITHER => '3' }
-       },
-    GimpHistogramChannel =>
-       { contig => 1,
-         header => 'core/core-enums.h',
-         symbols => [ qw(GIMP_HISTOGRAM_VALUE GIMP_HISTOGRAM_RED
-                         GIMP_HISTOGRAM_GREEN GIMP_HISTOGRAM_BLUE
-                         GIMP_HISTOGRAM_ALPHA GIMP_HISTOGRAM_LUMINANCE) ],
-         mapping => { GIMP_HISTOGRAM_VALUE => '0',
-                      GIMP_HISTOGRAM_RED => '1',
-                      GIMP_HISTOGRAM_GREEN => '2',
-                      GIMP_HISTOGRAM_BLUE => '3',
-                      GIMP_HISTOGRAM_ALPHA => '4',
-                      GIMP_HISTOGRAM_LUMINANCE => '5' }
-       },
     GimpLayerMode =>
        { contig => 1,
-         header => 'core/core-enums.h',
+         header => 'operations/operations-enums.h',
          symbols => [ qw(GIMP_LAYER_MODE_NORMAL GIMP_LAYER_MODE_DISSOLVE
                          GIMP_LAYER_MODE_BEHIND
                          GIMP_LAYER_MODE_MULTIPLY_LEGACY
@@ -859,6 +836,29 @@ package Gimp::CodeGen::enums;
                       GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY => '75',
                       GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY => '76' }
        },
+    GimpConvertDitherType =>
+       { contig => 1,
+         header => 'core/core-enums.h',
+         symbols => [ qw(GIMP_NO_DITHER GIMP_FS_DITHER
+                         GIMP_FSLOWBLEED_DITHER GIMP_FIXED_DITHER) ],
+         mapping => { GIMP_NO_DITHER => '0',
+                      GIMP_FS_DITHER => '1',
+                      GIMP_FSLOWBLEED_DITHER => '2',
+                      GIMP_FIXED_DITHER => '3' }
+       },
+    GimpHistogramChannel =>
+       { contig => 1,
+         header => 'core/core-enums.h',
+         symbols => [ qw(GIMP_HISTOGRAM_VALUE GIMP_HISTOGRAM_RED
+                         GIMP_HISTOGRAM_GREEN GIMP_HISTOGRAM_BLUE
+                         GIMP_HISTOGRAM_ALPHA GIMP_HISTOGRAM_LUMINANCE) ],
+         mapping => { GIMP_HISTOGRAM_VALUE => '0',
+                      GIMP_HISTOGRAM_RED => '1',
+                      GIMP_HISTOGRAM_GREEN => '2',
+                      GIMP_HISTOGRAM_BLUE => '3',
+                      GIMP_HISTOGRAM_ALPHA => '4',
+                      GIMP_HISTOGRAM_LUMINANCE => '5' }
+       },
     GimpBrushApplicationMode =>
        { contig => 1,
          header => 'paint/paint-enums.h',


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]