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