[gimp/pippin/linear-is-the-new-black: 6/10] app: dither floating point result on load if original is 8bit gamma
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/pippin/linear-is-the-new-black: 6/10] app: dither floating point result on load if original is 8bit gamma
- Date: Mon, 9 Jan 2017 03:48:24 +0000 (UTC)
commit 78f41324dd6899aa85c32893fd9a28ef5c66bbc6
Author: Øyvind Kolås <pippin gimp org>
Date: Tue Dec 20 22:54:28 2016 +0100
app: dither floating point result on load if original is 8bit gamma
app/file/file-open.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 42 insertions(+), 7 deletions(-)
---
diff --git a/app/file/file-open.c b/app/file/file-open.c
index 0996831..388ca90 100644
--- a/app/file/file-open.c
+++ b/app/file/file-open.c
@@ -35,6 +35,7 @@
#include "core/gimp.h"
#include "core/gimpcontext.h"
#include "core/gimpdocumentlist.h"
+#include "core/gimpdrawable-operation.h"
#include "core/gimpimage.h"
#include "core/gimpimage-color-profile.h"
#include "core/gimpimage-convert-precision.h"
@@ -277,15 +278,49 @@ file_open_image (Gimp *gimp,
if (image)
{
+ GimpPrecision old_precision = gimp_image_get_precision (image);
gimp_image_undo_disable (image);
- if (gimp_image_get_precision (image) != GIMP_PRECISION_FLOAT_LINEAR)
-
- gimp_image_convert_precision (image, GIMP_PRECISION_FLOAT_LINEAR,
- GEGL_DITHER_NONE,
- GEGL_DITHER_NONE,
- GEGL_DITHER_NONE,
- progress);
+ if (old_precision != GIMP_PRECISION_FLOAT_LINEAR)
+ {
+ gimp_image_convert_precision (image, GIMP_PRECISION_FLOAT_LINEAR,
+ GEGL_DITHER_NONE,
+ GEGL_DITHER_NONE,
+ GEGL_DITHER_NONE,
+ progress);
+
+ if (old_precision == GIMP_PRECISION_U8_GAMMA)
+ {
+ GeglNode *ditherer = gegl_node_new_child (NULL,
+ "operation", "gegl:noise-rgb",
+ "red", 1.0/256.0,
+ "green", 1.0/256.0,
+ "blue", 1.0/256.0,
+ "alpha", 1.0/256.0,
+ "linear", FALSE,
+ "gaussian", FALSE,
+ NULL);
+ if (ditherer)
+ {
+ GList *l, *list;
+ list = gimp_image_get_layer_list (image);
+ for (l = list; l; l = g_list_next (l))
+ {
+ if (!gimp_viewable_get_children (l->data))
+ gimp_drawable_apply_operation (l->data, progress,
+ _("Dithering"), ditherer);
+ }
+ list = gimp_image_get_channel_list (image);
+ for (l = list; l; l = g_list_next (l))
+ {
+ if (!gimp_viewable_get_children (l->data))
+ gimp_drawable_apply_operation (l->data, progress,
+ _("Dithering"), ditherer);
+ }
+ g_object_unref (ditherer);
+ }
+ }
+ }
gimp_image_import_color_profile (image, context, progress,
run_mode == GIMP_RUN_INTERACTIVE ?
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]