plug-ins: improve exporting of layer modes for openraster.

The current openraster specification only has a limited
number of layer modes. Let's improve things a little bit
by mapping both the current and legacy layer modes
to the same openraster composite-op where available.

For the other layer modes we could examine what the
closest composite-op is, or add a GIMP specific op
(which is what Krita seems to do). For now we set
all these to the openraster equivalent of NORMAL.
This commit is contained in:
Jacob Boerema
2021-01-27 14:11:39 -05:00
parent 304c7d6bc8
commit 6d6b7e90c2

View File

@ -46,6 +46,79 @@ layermodes_map = {
"svg:plus": Gimp.LayerMode.ADDITION,
}
# There are less svg blending ops than we have GIMP blend modes.
# We are going to map them as closely as possible.
gimp_layermodes_map = {
Gimp.LayerMode.NORMAL: "svg:src-over",
Gimp.LayerMode.NORMAL_LEGACY: "svg:src-over",
Gimp.LayerMode.MULTIPLY: "svg:multiply",
Gimp.LayerMode.MULTIPLY_LEGACY: "svg:multiply",
Gimp.LayerMode.SCREEN: "svg:screen",
Gimp.LayerMode.SCREEN_LEGACY: "svg:screen",
Gimp.LayerMode.OVERLAY: "svg:overlay",
Gimp.LayerMode.OVERLAY_LEGACY: "svg:overlay",
Gimp.LayerMode.DARKEN_ONLY: "svg:darken",
Gimp.LayerMode.DARKEN_ONLY_LEGACY: "svg:darken",
Gimp.LayerMode.LIGHTEN_ONLY: "svg:lighten",
Gimp.LayerMode.LIGHTEN_ONLY_LEGACY: "svg:lighten",
Gimp.LayerMode.DODGE: "svg:color-dodge",
Gimp.LayerMode.DODGE_LEGACY: "svg:color-dodge",
Gimp.LayerMode.BURN: "svg:color-burn",
Gimp.LayerMode.BURN_LEGACY: "svg:color-burn",
Gimp.LayerMode.HARDLIGHT: "svg:hard-light",
Gimp.LayerMode.HARDLIGHT_LEGACY: "svg:hard-light",
Gimp.LayerMode.SOFTLIGHT: "svg:soft-light",
Gimp.LayerMode.SOFTLIGHT_LEGACY: "svg:soft-light",
Gimp.LayerMode.DIFFERENCE: "svg:difference",
Gimp.LayerMode.DIFFERENCE_LEGACY: "svg:difference",
Gimp.LayerMode.HSL_COLOR: "svg:color",
Gimp.LayerMode.HSL_COLOR_LEGACY: "svg:color",
Gimp.LayerMode.HSV_VALUE: "svg:luminosity",
Gimp.LayerMode.HSV_VALUE_LEGACY: "svg:luminosity",
Gimp.LayerMode.HSV_HUE: "svg:hue",
Gimp.LayerMode.HSV_HUE_LEGACY: "svg:hue",
Gimp.LayerMode.HSV_SATURATION: "svg:saturation",
Gimp.LayerMode.HSV_SATURATION_LEGACY: "svg:saturation",
Gimp.LayerMode.ADDITION: "svg:plus",
Gimp.LayerMode.ADDITION_LEGACY: "svg:plus",
# FIXME Determine the closest available layer mode
# Alternatively we could add additional modes
# e.g. something like "gimp:dissolve", this
# is what Krita seems to do too
Gimp.LayerMode.DISSOLVE: "svg:src-over",
Gimp.LayerMode.DIVIDE: "svg:src-over",
Gimp.LayerMode.DIVIDE_LEGACY: "svg:src-over",
Gimp.LayerMode.BEHIND: "svg:src-over",
Gimp.LayerMode.BEHIND_LEGACY: "svg:src-over",
Gimp.LayerMode.GRAIN_EXTRACT: "svg:src-over",
Gimp.LayerMode.GRAIN_EXTRACT_LEGACY: "svg:src-over",
Gimp.LayerMode.GRAIN_MERGE: "svg:src-over",
Gimp.LayerMode.GRAIN_MERGE_LEGACY: "svg:src-over",
Gimp.LayerMode.COLOR_ERASE: "svg:src-over",
Gimp.LayerMode.COLOR_ERASE_LEGACY: "svg:src-over",
Gimp.LayerMode.LCH_HUE: "svg:src-over",
Gimp.LayerMode.LCH_CHROMA: "svg:src-over",
Gimp.LayerMode.LCH_COLOR: "svg:src-over",
Gimp.LayerMode.LCH_LIGHTNESS: "svg:src-over",
Gimp.LayerMode.SUBTRACT: "svg:src-over",
Gimp.LayerMode.SUBTRACT_LEGACY: "svg:src-over",
Gimp.LayerMode.VIVID_LIGHT: "svg:src-over",
Gimp.LayerMode.PIN_LIGHT: "svg:src-over",
Gimp.LayerMode.LINEAR_LIGHT: "svg:src-over",
Gimp.LayerMode.HARD_MIX: "svg:src-over",
Gimp.LayerMode.EXCLUSION: "svg:src-over",
Gimp.LayerMode.LINEAR_BURN: "svg:src-over",
Gimp.LayerMode.LUMA_DARKEN_ONLY: "svg:src-over",
Gimp.LayerMode.LUMA_LIGHTEN_ONLY: "svg:src-over",
Gimp.LayerMode.LUMINANCE: "svg:src-over",
Gimp.LayerMode.COLOR_ERASE: "svg:src-over",
Gimp.LayerMode.ERASE: "svg:src-over",
Gimp.LayerMode.MERGE: "svg:src-over",
Gimp.LayerMode.SPLIT: "svg:src-over",
Gimp.LayerMode.PASS_THROUGH: "svg:src-over",
}
def reverse_map(mapping):
return dict((v,k) for k, v in mapping.items())
@ -171,7 +244,7 @@ def save_ora(procedure, run_mode, image, n_drawables, drawables, file, args, dat
a['y'] = str(y)
a['opacity'] = str(opac)
a['visibility'] = 'visible' if visible else 'hidden'
a['composite-op'] = reverse_map(layermodes_map).get(gimp_layer.get_mode(), 'svg:src-over')
a['composite-op'] = gimp_layermodes_map.get(gimp_layer.get_mode(), 'svg:src-over')
return layer
def add_group_layer(parent, opac, gimp_layer, visible=True):
@ -182,7 +255,7 @@ def save_ora(procedure, run_mode, image, n_drawables, drawables, file, args, dat
a['name'] = gimp_layer.get_name()
a['opacity'] = str(opac)
a['visibility'] = 'visible' if visible else 'hidden'
a['composite-op'] = reverse_map(layermodes_map).get(gimp_layer.get_mode(), 'svg:src-over')
a['composite-op'] = gimp_layermodes_map.get(gimp_layer.get_mode(), 'svg:src-over')
return group_layer