[gimp] plug-ins: add new plug-in file-darktable
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] plug-ins: add new plug-in file-darktable
- Date: Mon, 18 Apr 2016 23:21:32 +0000 (UTC)
commit fc0f42def4c6e5bf53e9a49516f963bde55f23cf
Author: Tobias Ellinghaus <me houz org>
Date: Tue Apr 19 00:18:05 2016 +0100
plug-ins: add new plug-in file-darktable
Which loads raw files by having them developed in darktable.
Also disable NEF support in file-gegl.
configure.ac | 1 +
plug-ins/Makefile.am | 2 +
plug-ins/common/file-gegl.c | 13 --
plug-ins/file-darktable/.gitignore | 7 +
plug-ins/file-darktable/Makefile.am | 44 +++++
plug-ins/file-darktable/export-on-exit.lua | 63 ++++++
plug-ins/file-darktable/file-darktable.c | 286 ++++++++++++++++++++++++++++
po-plug-ins/POTFILES.in | 1 +
8 files changed, 404 insertions(+), 13 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index fe3d22f..3545ef2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2326,6 +2326,7 @@ build/windows/gimp.rc
build/windows/gimp-plug-ins.rc
plug-ins/Makefile
plug-ins/file-bmp/Makefile
+plug-ins/file-darktable/Makefile
plug-ins/file-exr/Makefile
plug-ins/file-faxg3/Makefile
plug-ins/file-fits/Makefile
diff --git a/plug-ins/Makefile.am b/plug-ins/Makefile.am
index f4c8c10..743be1b 100644
--- a/plug-ins/Makefile.am
+++ b/plug-ins/Makefile.am
@@ -5,6 +5,7 @@ help_browser = help-browser
endif
if HAVE_OPENEXR
+file_darktable = file-darktable
file_exr = file-exr
endif
@@ -29,6 +30,7 @@ SUBDIRS = \
$(script_fu) \
$(pygimp) \
file-bmp \
+ $(file_darktable) \
$(file_exr) \
file-faxg3 \
file-fits \
diff --git a/plug-ins/common/file-gegl.c b/plug-ins/common/file-gegl.c
index 37ae4d2..f397cc6 100644
--- a/plug-ins/common/file-gegl.c
+++ b/plug-ins/common/file-gegl.c
@@ -84,19 +84,6 @@ static const FileFormat file_formats[] =
},
{
- N_("NEF image"),
- "image/x-nikon-nef",
- "nef",
- "",
-
- "file-nef-load",
- "Loads NEF images using GEGL",
- "This procedure loads images in NEF format, using gegl:load",
-
- NULL, NULL, NULL /* no NEF saving */
- },
-
- {
N_("WebP image"),
"image/webp",
"webp",
diff --git a/plug-ins/file-darktable/.gitignore b/plug-ins/file-darktable/.gitignore
new file mode 100644
index 0000000..2643bdf
--- /dev/null
+++ b/plug-ins/file-darktable/.gitignore
@@ -0,0 +1,7 @@
+/Makefile.in
+/Makefile
+/.deps
+/_libs
+/.libs
+/file-darktable
+/file-darktable.exe
diff --git a/plug-ins/file-darktable/Makefile.am b/plug-ins/file-darktable/Makefile.am
new file mode 100644
index 0000000..e3de447
--- /dev/null
+++ b/plug-ins/file-darktable/Makefile.am
@@ -0,0 +1,44 @@
+## Process this file with automake to produce Makefile.in
+
+libgimp = $(top_builddir)/libgimp/libgimp-$(GIMP_API_VERSION).la
+libgimpbase = $(top_builddir)/libgimpbase/libgimpbase-$(GIMP_API_VERSION).la
+
+filedarktabledatadir = $(gimpdatadir)/file-darktable
+
+if OS_WIN32
+mwindows = -mwindows
+endif
+
+# if HAVE_WINDRES
+# include $(top_srcdir)/build/windows/gimprc-plug-ins.rule
+# file_darktable_RC = file-darktable.rc.o
+# endif
+
+AM_LDFLAGS = $(mwindows)
+
+libexecdir = $(gimpplugindir)/plug-ins
+
+AM_CPPFLAGS = \
+ -I$(top_srcdir) \
+ -I$(includedir) \
+ $(GTK_CFLAGS) \
+ $(GEGL_CFLAGS)
+
+libexec_PROGRAMS = file-darktable
+
+file_darktable_SOURCES = \
+ file-darktable.c
+
+file_darktable_LDADD = \
+ $(libgimp) \
+ $(libgimpbase) \
+ $(CAIRO_LIBS) \
+ $(GEGL_LIBS) \
+ $(RT_LIBS) \
+ $(INTLLIBS) \
+ $(file_darktable_RC)
+
+filedarktabledata_DATA = \
+ export-on-exit.lua
+
+EXTRA_DIST = $(filedarktabledata_DATA)
diff --git a/plug-ins/file-darktable/export-on-exit.lua b/plug-ins/file-darktable/export-on-exit.lua
new file mode 100644
index 0000000..32385d7
--- /dev/null
+++ b/plug-ins/file-darktable/export-on-exit.lua
@@ -0,0 +1,63 @@
+--[[
+ This file is part of darktable,
+ copyright (c) 2015-2016 Tobias Ellinghaus
+
+ darktable 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.
+
+ darktable 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 darktable. If not, see <http://www.gnu.org/licenses/>.
+]]
+
+--[[
+EXPORT ON EXIT
+exports all (but at most 1) images from the database to tmp_dir/out.exr when darktable exits
+
+
+USAGE
+* require this file from your main lua config file
+* or: use --luacmd "dofile('/path/to/this/file.lua')"
+
+
+]]
+
+local dt = require "darktable"
+
+local min_api_version = "2.1.0"
+if dt.configuration.api_version_string < min_api_version then
+ dt.print("the exit export script requires at least darktable version 1.7.0")
+ dt.print_error("the exit export script requires at least darktable version 1.7.0")
+ return
+end
+
+dt.register_event("exit", function()
+ -- safegurad against someone using this with their library containing 50k images
+ if #dt.database > 1 then
+ dt.print_error("too many images, not exporting")
+ return
+ end
+
+ -- change the view first to force writing of the history stack
+ dt.gui.current_view(dt.gui.views.lighttable)
+ -- now export
+ local format = dt.new_format("exr")
+ format.max_width = 0
+ format.max_height = 0
+ -- let's have the export in a loop so we could easily support > 1 images
+ for _, image in ipairs(dt.database) do
+ local filename = dt.configuration.tmp_dir.."/out."..format.extension
+ dt.print_error("exporting `"..tostring(image).."' to `"..filename.."'")
+ format:write_image(image, filename)
+ end
+end)
+
+--
+-- vim: shiftwidth=2 expandtab tabstop=2 cindent syntax=lua
+-- kate: hl Lua;
diff --git a/plug-ins/file-darktable/file-darktable.c b/plug-ins/file-darktable/file-darktable.c
new file mode 100644
index 0000000..83ab6bb
--- /dev/null
+++ b/plug-ins/file-darktable/file-darktable.c
@@ -0,0 +1,286 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * file-darktable.c -- raw file format plug-in that uses darktable
+ * Copyright (C) 2012 Simon Budig <simon gimp org>
+ * Copyright (C) 2016 Tobias Ellinghaus <me houz 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 <stdlib.h>
+#include <errno.h>
+
+#include <glib/gstdio.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "libgimp/stdplugins-intl.h"
+
+
+#define LOAD_PROC "file-darktable-load"
+#define PLUG_IN_BINARY "file-darktable"
+
+
+typedef struct _FileFormat FileFormat;
+
+struct _FileFormat
+{
+ const gchar *file_type;
+ const gchar *mime_type;
+ const gchar *extensions;
+ const gchar *magic;
+
+ const gchar *load_proc;
+ const gchar *load_blurb;
+ const gchar *load_help;
+};
+
+
+static void query (void);
+static void run (const gchar *name,
+ gint nparams,
+ const GimpParam *param,
+ gint *nreturn_vals,
+ GimpParam **return_vals);
+static gint32 load_image (const gchar *filename,
+ GimpRunMode run_mode,
+ GError **error);
+
+
+static const FileFormat file_formats[] =
+{
+ {
+ N_("Canon CR2 raw"),
+ "image/x-canon-cr2",
+ "cr2",
+ "0,string,\\x49\\x49\\x2a\\x00\\x10\\x00\\x00\\x00\\x43\\x52",
+
+ "file-cr2-load",
+ "Load files in the CR2 raw format via darktable",
+ "This plug-in loads files in Canon's raw CR2 format by calling darktable."
+ },
+
+ {
+ N_("Nikon NEF raw"),
+ " image/x-nikon-nef ",
+ "nef",
+ "",
+
+ "file-nef-load",
+ "Load files in the NEF raw format via darktable",
+ "This plug-in loads files in Nikon's raw NEF format by calling darktable."
+ }
+};
+
+
+const GimpPlugInInfo PLUG_IN_INFO =
+{
+ NULL, /* init_proc */
+ NULL, /* quit_proc */
+ query, /* query proc */
+ run, /* run_proc */
+};
+
+MAIN ()
+
+static void
+query (void)
+{
+ static const GimpParamDef load_args[] =
+ {
+ { GIMP_PDB_INT32, "run-mode", "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }" },
+ { GIMP_PDB_STRING, "filename", "The name of the file to load." },
+ { GIMP_PDB_STRING, "raw-filename", "The name entered" },
+ };
+
+ static const GimpParamDef load_return_vals[] =
+ {
+ { GIMP_PDB_IMAGE, "image", "Output image" }
+ };
+
+ gint i;
+
+ // TODO: check if darktable is installed
+ gboolean have_darktable = TRUE;
+
+ if (! have_darktable)
+ return;
+
+ for (i = 0; i < G_N_ELEMENTS (file_formats); i++)
+ {
+ const FileFormat *format = &file_formats[i];
+
+ gimp_install_procedure (format->load_proc,
+ format->load_blurb,
+ format->load_help,
+ "Tobias Ellinghaus",
+ "Tobias Ellinghaus",
+ "2016",
+ format->file_type,
+ NULL,
+ GIMP_PLUGIN,
+ G_N_ELEMENTS (load_args),
+ G_N_ELEMENTS (load_return_vals),
+ load_args, load_return_vals);
+
+ gimp_register_file_handler_mime (format->load_proc,
+ format->mime_type);
+ gimp_register_magic_load_handler (format->load_proc,
+ format->extensions,
+ "",
+ format->magic);
+ }
+}
+
+static void
+run (const gchar *name,
+ gint nparams,
+ const GimpParam *param,
+ gint *nreturn_vals,
+ GimpParam **return_vals)
+{
+ static GimpParam values[2];
+ GimpPDBStatusType status = GIMP_PDB_SUCCESS;
+ GimpRunMode run_mode;
+ gint image_ID;
+ GError *error = NULL;
+ gint i;
+
+ INIT_I18N ();
+
+ run_mode = param[0].data.d_int32;
+
+ *nreturn_vals = 1;
+ *return_vals = values;
+
+ values[0].type = GIMP_PDB_STATUS;
+ values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR;
+
+ /* check if the format passed is actually supported & load */
+ for (i = 0; i < G_N_ELEMENTS (file_formats); i++)
+ {
+ const FileFormat *format = &file_formats[i];
+
+ if (format->load_proc && ! strcmp (name, format->load_proc))
+ {
+ image_ID = load_image (param[1].data.d_string, run_mode, &error);
+
+ if (image_ID != -1)
+ {
+ *nreturn_vals = 2;
+ values[1].type = GIMP_PDB_IMAGE;
+ values[1].data.d_image = image_ID;
+ }
+ else
+ {
+ status = GIMP_PDB_EXECUTION_ERROR;
+ }
+
+ break;
+ }
+ }
+
+ if (i == G_N_ELEMENTS (file_formats))
+ status = GIMP_PDB_CALLING_ERROR;
+
+ if (status != GIMP_PDB_SUCCESS && error)
+ {
+ *nreturn_vals = 2;
+ values[1].type = GIMP_PDB_STRING;
+ values[1].data.d_string = error->message;
+ }
+
+ values[0].data.d_status = status;
+}
+
+static gint32
+load_image (const gchar *filename,
+ GimpRunMode run_mode,
+ GError **error)
+{
+ gint32 image_ID = -1;
+ GFile *lua_file = gimp_data_directory_file ("file-darktable",
+ "export-on-exit.lua",
+ NULL);
+ gchar *lua_script = g_file_get_path (lua_file);
+ gchar *lua_quoted = g_shell_quote (lua_script);
+ gchar *tempdir = g_strdup ("/tmp/dt4gimp_XXXXXX");
+ gchar *lua_cmd = g_strdup_printf ("dofile(%s)", lua_quoted);
+ gchar *filename_in = g_strdup (filename);
+ gchar *filename_out = NULL;
+
+ /* linear sRGB for now as GIMP uses that internally in many places anyway */
+ gchar *argv[] =
+ {
+ "darktable",
+ "--library", ":memory:",
+ "--tmpdir", tempdir,
+ "--luacmd", lua_cmd,
+ "--conf", "plugins/lighttable/export/iccprofile=linear_rec709_rgb",
+ filename_in,
+ NULL
+ };
+
+ g_object_unref (lua_file);
+ g_free (lua_script);
+
+ if ( ! g_mkdtemp (tempdir))
+ {
+ g_free (tempdir);
+ g_free (lua_quoted);
+ g_free (lua_cmd);
+ g_free (filename_in);
+ return -1;
+ }
+
+ gimp_progress_init_printf (_("Opening '%s'"),
+ gimp_filename_to_utf8 (filename));
+
+ /* keep the filename in sync with the .lua file! */
+ filename_out = g_build_filename (tempdir, "out.exr", NULL);
+
+ if (g_spawn_sync (tempdir,
+ argv,
+ NULL,
+ G_SPAWN_STDOUT_TO_DEV_NULL |
+ G_SPAWN_STDERR_TO_DEV_NULL |
+ G_SPAWN_SEARCH_PATH,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ error))
+ {
+ image_ID = gimp_file_load (run_mode, filename_out, filename_out);
+ if (image_ID != -1)
+ gimp_image_set_filename (image_ID, filename);
+ }
+
+ g_unlink (filename_out);
+ g_rmdir (tempdir);
+ g_free (tempdir);
+ g_free (lua_quoted);
+ g_free (lua_cmd);
+ g_free (filename_in);
+ g_free (filename_out);
+
+ gimp_progress_update (1.0);
+
+ return image_ID;
+}
diff --git a/po-plug-ins/POTFILES.in b/po-plug-ins/POTFILES.in
index fbef0ec..d57e4ee 100644
--- a/po-plug-ins/POTFILES.in
+++ b/po-plug-ins/POTFILES.in
@@ -99,6 +99,7 @@ plug-ins/common/web-page.c
plug-ins/file-bmp/bmp-read.c
plug-ins/file-bmp/bmp-write.c
plug-ins/file-bmp/bmp.c
+plug-ins/file-darktable/file-darktable.c
plug-ins/file-exr/file-exr.c
plug-ins/file-faxg3/faxg3.c
plug-ins/file-fits/fits.c
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]