On Mon, 2013-02-18 at 19:37 +0100, Nils Philippsen wrote:
> The patch I ended up with so far[2] works, but I'm not quite
> content with it:
[...]
> [2]: http://paste.fedoraproject.org/3296

Hmm, I don't think it's a good idea to only post this somewhere with a
lifetime of only 24 hours... I've attached the patch to this mail.

Nils
-- 
Nils Philippsen / Wilhelmstraße 22 / D-71229 Leonberg 
n...@tiptoe.de / n...@redhat.com
PGP fingerprint:  C4A8 9474 5C4C ADE3 2B8F  656D 47D8 9B65 6951 3011
Ever noticed that common sense isn't really all that common?
>From 9b57cff5262867ebcc77b11342003b342c5d9d25 Mon Sep 17 00:00:00 2001
From: Nils Philippsen <n...@redhat.com>
Date: Tue, 12 Feb 2013 16:41:50 +0100
Subject: [PATCH] enable high precision in gimp-2.9.x and later

---
 configure.ac |  3 +++
 ufraw-gimp.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------
 2 files changed, 61 insertions(+), 6 deletions(-)

diff --git a/configure.ac b/configure.ac
index f82c502..d971f59 100644
--- a/configure.ac
+++ b/configure.ac
@@ -160,6 +160,9 @@ if test "$have_gtk" = "yes"; then
     PKG_CHECK_MODULES(GIMP_2_6, gimpui-2.0 >= 2.6.0,
       [ AC_DEFINE_UNQUOTED(HAVE_GIMP_2_6, 1, have Gimp 2.6 or later) ],
       [ AC_DEFINE_UNQUOTED(HAVE_GIMP_2_6, 0, have Gimp 2.6 or later) ])
+    PKG_CHECK_MODULES(GIMP_2_9, gimpui-2.0 >= 2.9.0,
+      [ AC_DEFINE_UNQUOTED(HAVE_GIMP_2_9, 1, have Gimp 2.9 or later) ],
+      [ AC_DEFINE_UNQUOTED(HAVE_GIMP_2_9, 0, have Gimp 2.9 or later) ])
   fi
 
   AC_ARG_WITH([cinepaint],
diff --git a/ufraw-gimp.c b/ufraw-gimp.c
index 164f43c..ab763be 100644
--- a/ufraw-gimp.c
+++ b/ufraw-gimp.c
@@ -25,14 +25,25 @@
 /* Fix some compatibility issues between CinePaint and GIMP */
 typedef GimpRunModeType GimpRunMode;
 #define PLUGIN_MODE 2
+#define DEPTH_TO_BASETYPE(depth) (depth == 3 ? RGB : U16_RGB)
+#define DEPTH_TO_IMAGETYPE(depth) (depth == 3 ? RGB_IMAGE : U16_RGB_IMAGE)
+#else /* GIMP */
+#ifdef HAVE_GIMP_2_9
+#include <gegl.h>
+#define PLUGIN_MODE 2
 #else
+#define PLUGIN_MODE 1
+#endif
+#include <libgimpbase/gimpbase.h>
 #include <libgimp/gimp.h>
 #include <libgimp/gimpui.h>
 #define GIMP_CONST const
 /* Missing and irrelevant definitions in GIMP */
 #define U16_RGB 0
 #define U16_RGB_IMAGE 0
-#define PLUGIN_MODE 1
+#define DEPTH_TO_BASETYPE(depth) GIMP_RGB
+#define DEPTH_TO_IMAGETYPE(depth) GIMP_RGB_IMAGE
+#define DEPTH_TO_PRECISION(depth) (depth == 3 ? GIMP_PRECISION_U8 : GIMP_PRECISION_U16)
 #endif
 #include <glib/gi18n.h>
 #include <string.h>
@@ -153,6 +164,9 @@ void run(GIMP_CONST gchar *name,
     gdk_threads_enter();
     ufraw_binary = g_path_get_basename(gimp_get_progname());
     uf_init_locale(gimp_get_progname());
+#if HAVE_GIMP_2_9
+    gegl_init(NULL, NULL);
+#endif
 
     *nreturn_vals = 1;
     *return_vals = values;
@@ -238,7 +252,7 @@ void run(GIMP_CONST gchar *name,
 
     ufraw_config(uf, &rc, NULL, NULL);
     sendToGimpMode = (uf->conf->createID == send_id);
-#ifndef UFRAW_CINEPAINT
+#if !defined(UFRAW_CINEPAINT) && !defined(HAVE_GIMP_2_9)
     if (loadThumbnail) {
         uf->conf->size = size;
         uf->conf->embeddedImage = TRUE;
@@ -314,18 +328,29 @@ int gimp_row_writer(ufraw_data *uf, void *volatile out, void *pixbuf,
     (void)grayscale;
     (void)bitDepth;
 
+#ifdef HAVE_GIMP_2_9
+    gegl_buffer_set(out, GEGL_RECTANGLE(0, row, width, height),
+                    0, NULL, pixbuf,
+                    GEGL_AUTO_ROWSTRIDE);
+#else
     gimp_pixel_rgn_set_rect(out, pixbuf, 0, row, width, height);
+#endif
 
     return UFRAW_SUCCESS;
 }
 
 long ufraw_save_gimp_image(ufraw_data *uf, GtkWidget *widget)
 {
+#ifdef HAVE_GIMP_2_9
+    GeglBuffer *buffer;
+#else
     GimpDrawable *drawable;
     GimpPixelRgn pixel_region;
+    int tile_height, row, nrows;
+#endif
     gint32 layer;
     UFRectangle Crop;
-    int depth, tile_height, row, nrows;
+    int depth;
     (void)widget;
 
     uf->gimpImage = -1;
@@ -342,7 +367,7 @@ long ufraw_save_gimp_image(ufraw_data *uf, GtkWidget *widget)
         if (ufraw_convert_image(uf) != UFRAW_SUCCESS)
             return UFRAW_ERROR;
         ufraw_get_scaled_crop(uf, &Crop);
-#ifdef UFRAW_CINEPAINT
+#if defined(UFRAW_CINEPAINT) || defined(HAVE_GIMP_2_9)
         if (uf->conf->profile[out_profile]
                 [uf->conf->profileIndex[out_profile]].BitDepth == 16)
             depth = 6;
@@ -352,8 +377,15 @@ long ufraw_save_gimp_image(ufraw_data *uf, GtkWidget *widget)
         depth = 3;
 #endif
     }
+#ifdef HAVE_GIMP_2_9
+    uf->gimpImage =
+        gimp_image_new_with_precision (Crop.width, Crop.height,
+                                       DEPTH_TO_BASETYPE(depth),
+                                       DEPTH_TO_PRECISION(depth));
+#else
     uf->gimpImage = gimp_image_new(Crop.width, Crop.height,
-                                   depth == 3 ? GIMP_RGB : U16_RGB);
+                                   DEPTH_TO_BASETYPE(depth));
+#endif
     if (uf->gimpImage == -1) {
         ufraw_message(UFRAW_ERROR, _("Can't allocate new image."));
         return UFRAW_ERROR;
@@ -362,7 +394,7 @@ long ufraw_save_gimp_image(ufraw_data *uf, GtkWidget *widget)
 
     /* Create the "background" layer to hold the image... */
     layer = gimp_layer_new(uf->gimpImage, _("Background"), Crop.width,
-                           Crop.height, depth == 3 ? GIMP_RGB_IMAGE : U16_RGB_IMAGE,
+                           Crop.height, DEPTH_TO_IMAGETYPE(depth),
                            100.0, GIMP_NORMAL_MODE);
 #ifdef UFRAW_CINEPAINT
     gimp_image_add_layer(uf->gimpImage, layer, 0);
@@ -375,23 +407,43 @@ long ufraw_save_gimp_image(ufraw_data *uf, GtkWidget *widget)
 #endif
 
     /* Get the drawable and set the pixel region for our load... */
+#ifdef HAVE_GIMP_2_9
+    buffer = gimp_drawable_get_buffer(layer);
+#else
     drawable = gimp_drawable_get(layer);
     gimp_pixel_rgn_init(&pixel_region, drawable, 0, 0, drawable->width,
                         drawable->height, TRUE, FALSE);
     tile_height = gimp_tile_height();
+#endif
 
     if (uf->conf->embeddedImage) {
+#ifdef HAVE_GIMP_2_9
+        gegl_buffer_set(buffer,
+                        GEGL_RECTANGLE(0, 0, Crop.width, Crop.height),
+                        0, NULL, uf->thumb.buffer,
+                        GEGL_AUTO_ROWSTRIDE);
+#else
         for (row = 0; row < Crop.height; row += tile_height) {
             nrows = MIN(Crop.height - row, tile_height);
             gimp_pixel_rgn_set_rect(&pixel_region,
                                     uf->thumb.buffer + 3 * row * Crop.width, 0, row, Crop.width, nrows);
         }
+#endif
     } else {
+#ifdef HAVE_GIMP_2_9
+        ufraw_write_image_data(uf, buffer, &Crop, depth == 3 ? 8 : 16, 0,
+                               gimp_row_writer);
+#else
         ufraw_write_image_data(uf, &pixel_region, &Crop, depth == 3 ? 8 : 16, 0,
                                gimp_row_writer);
+#endif
     }
+#ifdef HAVE_GIMP_2_9
+    gegl_buffer_flush(buffer);
+#else
     gimp_drawable_flush(drawable);
     gimp_drawable_detach(drawable);
+#endif
 
     if (uf->conf->embeddedImage) return UFRAW_SUCCESS;
 
-- 
1.8.1.2

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
ufraw-devel mailing list
ufraw-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ufraw-devel

Reply via email to