From 06fafe6f71a7de4ab39bf89e251c53f3c2cee771 Mon Sep 17 00:00:00 2001 From: Jehan Date: Sat, 21 Feb 2026 12:22:56 +0100 Subject: [PATCH] plug-ins: change to Unix newlines with dos2unix. --- plug-ins/python/palette-export-as-kpl.py | 394 +++++++++++------------ 1 file changed, 197 insertions(+), 197 deletions(-) diff --git a/plug-ins/python/palette-export-as-kpl.py b/plug-ins/python/palette-export-as-kpl.py index a6bdc5a050..0c6ea16e58 100644 --- a/plug-ins/python/palette-export-as-kpl.py +++ b/plug-ins/python/palette-export-as-kpl.py @@ -1,197 +1,197 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Allows exporting Krita's .kpl palettes -# -# 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 . - -import gi -gi.require_version('Gimp', '3.0') -from gi.repository import Gimp -from gi.repository import GObject -from gi.repository import GLib -from gi.repository import Gio -import os, sys, tempfile, zipfile -import xml.etree.ElementTree as ET - -def N_(message): return message -def _(message): return GLib.dgettext(None, message) - -# Taken from file-openraster.py -def write_file_str(zfile, fname, data): - # work around a permission bug in the zipfile library: - # http://bugs.python.org/issue3394 - zi = zipfile.ZipInfo(fname) - zi.external_attr = int("100644", 8) << 16 - zfile.writestr(zi, data) - -def palette_kpl_export(procedure, config, data): - success = True - runmode = config.get_property("run-mode") - - if runmode == Gimp.RunMode.INTERACTIVE: - gi.require_version('GimpUi', '3.0') - from gi.repository import GimpUi - gi.require_version('Gtk', '3.0') - from gi.repository import Gtk - - GimpUi.init('python-fu-palette-export-as-kpl') - dialog = GimpUi.ProcedureDialog(procedure=procedure, config=config) - - # Fill the dialog. - config.set_property("palette", None) - config.set_property("file", None) - - dialog.get_label ("options-label", _("Options"), False, False) - hbox = dialog.fill_box ("options-box", ["comment", "read-only"]) - dialog.fill_frame("options-frame", "options-label", False, "options-box") - - dialog.fill (["palette", "file", "options-frame"]) - dialog.set_ok_label (_("_Export")) - - if not dialog.run(): - dialog.destroy() - return procedure.new_return_values(Gimp.PDBStatusType.CANCEL, GLib.Error()) - - palette = config.get_property("palette") - file = config.get_property("file") - comment = config.get_property("comment") - read_only = config.get_property("read-only") - - if file is None or file.peek_path() is None: - error = 'No file given' - return procedure.new_return_values(Gimp.PDBStatusType.CALLING_ERROR, - GLib.Error(error)) - - tempdir = tempfile.mkdtemp('python-fu-palette-export-as-kpl') - - kplfile = zipfile.ZipFile(file.peek_path() + '.tmpsave', 'w', compression=zipfile.ZIP_STORED) - - write_file_str(kplfile, 'mimetype', 'application/x-krita-palette') # must be the first file written - - # Filling in palette - xml_palette = ET.Element('ColorSet') - a = xml_palette.attrib - if comment != "": - a['comment'] = comment - a['name'] = palette.get_name() - a['version'] = "1.0" - a['readonly'] = "true" if read_only == True else "false" - columns = palette.get_columns() - if columns == 0: - columns = 16 - a['columns'] = str(columns) - - count = palette.get_color_count() - - row = 0 - col = 0 - for i in range(count): - entry = ET.Element('ColorSetEntry') - xml_palette.append(entry) - - success, name = palette.get_entry_name(i) - if success: - a = entry.attrib - a['name'] = name - a['id'] = str(i + 1) - # TODO: Add options for different bit-depths - a['bitdepth'] = "F32" - a['spot'] = "false" - - color = palette.get_entry_color(i) - # TODO: Allow for other color spaces - pal = ET.Element('RGB') - entry.append(pal) - a = pal.attrib - - r, g, b, alpha = color.get_rgba() - a['r'] = str(r) - a['g'] = str(g) - a['b'] = str(b) - - pos = ET.Element('Position') - entry.append(pos) - a = pos.attrib - a['row'] = str(row) - a['column'] = str(col) - - col += 1 - if col >= columns: - col = 0 - row += 1 - else: - break; - - if success: - # Write everything to file - xml = ET.tostring(xml_palette, encoding='UTF-8') - write_file_str(kplfile, 'colorset.xml', xml) - - kplfile.close() - os.rmdir(tempdir) - if os.path.exists(file.peek_path()): - os.remove(file.peek_path()) # win32 needs that - os.rename(file.peek_path() + '.tmpsave', file.peek_path()) - - return procedure.new_return_values(Gimp.PDBStatusType.SUCCESS, GLib.Error()) - else: - kplfile.close() - os.rmdir(tempdir) - return procedure.new_return_values(Gimp.PDBStatusType.EXECUTION_ERROR, - GLib.Error('File exporting failed: {}'.format(file.get_path()))) - -class PaletteExportAsKPL (Gimp.PlugIn): - ## GimpPlugIn virtual methods ## - def do_set_i18n(self, procname): - return True, 'gimp30-python', None - - def do_query_procedures(self): - return [ 'python-fu-palette-export-as-kpl' ] - - def do_create_procedure(self, name): - procedure = Gimp.Procedure.new(self, name, - Gimp.PDBProcType.PLUGIN, - palette_kpl_export, None) - if name == 'python-fu-palette-export-as-kpl': - procedure.set_documentation (_("Export palette as Krita .kpl"), - _("Export palette as Krita .kpl"), - name) - procedure.set_menu_label(_("_Krita palette...")) - procedure.set_attribution("Alx Sa", - "(c) GPL V3.0 or later", - "2025") - procedure.add_menu_path('/Palettes Menu/Export as') - - procedure.add_enum_argument ("run-mode", _("Run mode"), - _("The run mode"), Gimp.RunMode, - Gimp.RunMode.NONINTERACTIVE, - GObject.ParamFlags.READWRITE) - procedure.add_palette_argument ("palette", _("_Palette to export"), - "", True, - None, True, # Default to context. - GObject.ParamFlags.READWRITE) - procedure.add_file_argument ("file", _("_File (.kpl)"), "", - Gimp.FileChooserAction.SAVE, - False, None, GObject.ParamFlags.READWRITE) - procedure.add_string_argument ("comment", _("Commen_t"), - _("Optional comment"), "", - GObject.ParamFlags.READWRITE) - procedure.add_boolean_argument ("read-only", - _("Re_ad only"), - _("The palette will be locked on import"), - False, GObject.ParamFlags.READWRITE) - return procedure - -Gimp.main(PaletteExportAsKPL.__gtype__, sys.argv) +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Allows exporting Krita's .kpl palettes +# +# 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 . + +import gi +gi.require_version('Gimp', '3.0') +from gi.repository import Gimp +from gi.repository import GObject +from gi.repository import GLib +from gi.repository import Gio +import os, sys, tempfile, zipfile +import xml.etree.ElementTree as ET + +def N_(message): return message +def _(message): return GLib.dgettext(None, message) + +# Taken from file-openraster.py +def write_file_str(zfile, fname, data): + # work around a permission bug in the zipfile library: + # http://bugs.python.org/issue3394 + zi = zipfile.ZipInfo(fname) + zi.external_attr = int("100644", 8) << 16 + zfile.writestr(zi, data) + +def palette_kpl_export(procedure, config, data): + success = True + runmode = config.get_property("run-mode") + + if runmode == Gimp.RunMode.INTERACTIVE: + gi.require_version('GimpUi', '3.0') + from gi.repository import GimpUi + gi.require_version('Gtk', '3.0') + from gi.repository import Gtk + + GimpUi.init('python-fu-palette-export-as-kpl') + dialog = GimpUi.ProcedureDialog(procedure=procedure, config=config) + + # Fill the dialog. + config.set_property("palette", None) + config.set_property("file", None) + + dialog.get_label ("options-label", _("Options"), False, False) + hbox = dialog.fill_box ("options-box", ["comment", "read-only"]) + dialog.fill_frame("options-frame", "options-label", False, "options-box") + + dialog.fill (["palette", "file", "options-frame"]) + dialog.set_ok_label (_("_Export")) + + if not dialog.run(): + dialog.destroy() + return procedure.new_return_values(Gimp.PDBStatusType.CANCEL, GLib.Error()) + + palette = config.get_property("palette") + file = config.get_property("file") + comment = config.get_property("comment") + read_only = config.get_property("read-only") + + if file is None or file.peek_path() is None: + error = 'No file given' + return procedure.new_return_values(Gimp.PDBStatusType.CALLING_ERROR, + GLib.Error(error)) + + tempdir = tempfile.mkdtemp('python-fu-palette-export-as-kpl') + + kplfile = zipfile.ZipFile(file.peek_path() + '.tmpsave', 'w', compression=zipfile.ZIP_STORED) + + write_file_str(kplfile, 'mimetype', 'application/x-krita-palette') # must be the first file written + + # Filling in palette + xml_palette = ET.Element('ColorSet') + a = xml_palette.attrib + if comment != "": + a['comment'] = comment + a['name'] = palette.get_name() + a['version'] = "1.0" + a['readonly'] = "true" if read_only == True else "false" + columns = palette.get_columns() + if columns == 0: + columns = 16 + a['columns'] = str(columns) + + count = palette.get_color_count() + + row = 0 + col = 0 + for i in range(count): + entry = ET.Element('ColorSetEntry') + xml_palette.append(entry) + + success, name = palette.get_entry_name(i) + if success: + a = entry.attrib + a['name'] = name + a['id'] = str(i + 1) + # TODO: Add options for different bit-depths + a['bitdepth'] = "F32" + a['spot'] = "false" + + color = palette.get_entry_color(i) + # TODO: Allow for other color spaces + pal = ET.Element('RGB') + entry.append(pal) + a = pal.attrib + + r, g, b, alpha = color.get_rgba() + a['r'] = str(r) + a['g'] = str(g) + a['b'] = str(b) + + pos = ET.Element('Position') + entry.append(pos) + a = pos.attrib + a['row'] = str(row) + a['column'] = str(col) + + col += 1 + if col >= columns: + col = 0 + row += 1 + else: + break; + + if success: + # Write everything to file + xml = ET.tostring(xml_palette, encoding='UTF-8') + write_file_str(kplfile, 'colorset.xml', xml) + + kplfile.close() + os.rmdir(tempdir) + if os.path.exists(file.peek_path()): + os.remove(file.peek_path()) # win32 needs that + os.rename(file.peek_path() + '.tmpsave', file.peek_path()) + + return procedure.new_return_values(Gimp.PDBStatusType.SUCCESS, GLib.Error()) + else: + kplfile.close() + os.rmdir(tempdir) + return procedure.new_return_values(Gimp.PDBStatusType.EXECUTION_ERROR, + GLib.Error('File exporting failed: {}'.format(file.get_path()))) + +class PaletteExportAsKPL (Gimp.PlugIn): + ## GimpPlugIn virtual methods ## + def do_set_i18n(self, procname): + return True, 'gimp30-python', None + + def do_query_procedures(self): + return [ 'python-fu-palette-export-as-kpl' ] + + def do_create_procedure(self, name): + procedure = Gimp.Procedure.new(self, name, + Gimp.PDBProcType.PLUGIN, + palette_kpl_export, None) + if name == 'python-fu-palette-export-as-kpl': + procedure.set_documentation (_("Export palette as Krita .kpl"), + _("Export palette as Krita .kpl"), + name) + procedure.set_menu_label(_("_Krita palette...")) + procedure.set_attribution("Alx Sa", + "(c) GPL V3.0 or later", + "2025") + procedure.add_menu_path('/Palettes Menu/Export as') + + procedure.add_enum_argument ("run-mode", _("Run mode"), + _("The run mode"), Gimp.RunMode, + Gimp.RunMode.NONINTERACTIVE, + GObject.ParamFlags.READWRITE) + procedure.add_palette_argument ("palette", _("_Palette to export"), + "", True, + None, True, # Default to context. + GObject.ParamFlags.READWRITE) + procedure.add_file_argument ("file", _("_File (.kpl)"), "", + Gimp.FileChooserAction.SAVE, + False, None, GObject.ParamFlags.READWRITE) + procedure.add_string_argument ("comment", _("Commen_t"), + _("Optional comment"), "", + GObject.ParamFlags.READWRITE) + procedure.add_boolean_argument ("read-only", + _("Re_ad only"), + _("The palette will be locked on import"), + False, GObject.ParamFlags.READWRITE) + return procedure + +Gimp.main(PaletteExportAsKPL.__gtype__, sys.argv)