[gimp] Bug 747156 - Gimp Development version crashes on processing masks from psds
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Bug 747156 - Gimp Development version crashes on processing masks from psds
- Date: Sat, 18 Apr 2015 22:18:13 +0000 (UTC)
commit 0d7d96d09ff0fca4a90d24fff2555fe9b8f64c9d
Author: Michael Natterer <mitch gimp org>
Date: Sun Apr 19 00:16:57 2015 +0200
Bug 747156 - Gimp Development version crashes on processing masks from psds
Don't use the image's layer format to load layer mask and channels,
use a grayscale format instead.
plug-ins/file-psd/psd-load.c | 61 ++++++++++++++++++++++++++++++++++-------
1 files changed, 50 insertions(+), 11 deletions(-)
---
diff --git a/plug-ins/file-psd/psd-load.c b/plug-ins/file-psd/psd-load.c
index 373608d..2a1b96c 100644
--- a/plug-ins/file-psd/psd-load.c
+++ b/plug-ins/file-psd/psd-load.c
@@ -102,7 +102,8 @@ static void convert_1_bit (const gchar *src,
guint32 rows,
guint32 columns);
-static const Babl* get_pixel_format (PSDimage *img_a);
+static const Babl* get_pixel_format (PSDimage *img_a,
+ gboolean mask_format);
/* Main file load function */
@@ -1386,8 +1387,12 @@ add_layers (gint32 image_id,
gimp_layer_set_offsets (layer_id, l_x, l_y);
gimp_layer_set_lock_alpha (layer_id, lyr_a[lidx]->layer_flags.trans_prot);
buffer = gimp_drawable_get_buffer (layer_id);
- gegl_buffer_set (buffer, GEGL_RECTANGLE (0, 0, gegl_buffer_get_width (buffer),
gegl_buffer_get_height (buffer)),
- 0, get_pixel_format (img_a), pixels, GEGL_AUTO_ROWSTRIDE);
+ gegl_buffer_set (buffer,
+ GEGL_RECTANGLE (0, 0,
+ gegl_buffer_get_width (buffer),
+ gegl_buffer_get_height (buffer)),
+ 0, get_pixel_format (img_a, FALSE),
+ pixels, GEGL_AUTO_ROWSTRIDE);
gimp_item_set_visible (layer_id, lyr_a[lidx]->layer_flags.visible);
if (lyr_a[lidx]->id)
gimp_item_set_tattoo (layer_id, lyr_a[lidx]->id);
@@ -1499,8 +1504,10 @@ add_layers (gint32 image_id,
IFDBG(3) g_debug ("New layer mask %d", mask_id);
gimp_layer_add_mask (layer_id, mask_id);
buffer = gimp_drawable_get_buffer (mask_id);
- gegl_buffer_set (buffer, GEGL_RECTANGLE (lm_x, lm_y, lm_w, lm_h), 0,
- get_pixel_format (img_a), pixels, GEGL_AUTO_ROWSTRIDE);
+ gegl_buffer_set (buffer,
+ GEGL_RECTANGLE (lm_x, lm_y, lm_w, lm_h),
+ 0, get_pixel_format (img_a, TRUE),
+ pixels, GEGL_AUTO_ROWSTRIDE);
g_object_unref (buffer);
gimp_layer_set_apply_mask (layer_id,
! lyr_a[lidx]->layer_mask.mask_flags.disabled);
@@ -1682,8 +1689,12 @@ add_merged_image (gint32 image_id,
100, GIMP_NORMAL_MODE);
gimp_image_insert_layer (image_id, layer_id, -1, 0);
buffer = gimp_drawable_get_buffer (layer_id);
- gegl_buffer_set (buffer, GEGL_RECTANGLE (0, 0, gegl_buffer_get_width (buffer), gegl_buffer_get_height
(buffer)),
- 0, get_pixel_format (img_a), pixels, GEGL_AUTO_ROWSTRIDE);
+ gegl_buffer_set (buffer,
+ GEGL_RECTANGLE (0, 0,
+ gegl_buffer_get_width (buffer),
+ gegl_buffer_get_height (buffer)),
+ 0, get_pixel_format (img_a, FALSE),
+ pixels, GEGL_AUTO_ROWSTRIDE);
g_object_unref (buffer);
g_free (pixels);
}
@@ -1774,8 +1785,11 @@ add_merged_image (gint32 image_id,
gimp_item_set_tattoo (channel_id, alpha_id);
gimp_item_set_visible (channel_id, alpha_visible);
gegl_buffer_set (buffer,
- GEGL_RECTANGLE (0, 0, gegl_buffer_get_width (buffer), gegl_buffer_get_height
(buffer)),
- 0, get_pixel_format (img_a), pixels, GEGL_AUTO_ROWSTRIDE);
+ GEGL_RECTANGLE (0, 0,
+ gegl_buffer_get_width (buffer),
+ gegl_buffer_get_height (buffer)),
+ 0, get_pixel_format (img_a, TRUE),
+ pixels, GEGL_AUTO_ROWSTRIDE);
g_object_unref (buffer);
g_free (chn_a[cidx].data);
}
@@ -2015,9 +2029,34 @@ convert_1_bit (const gchar *src,
}
static const Babl*
-get_pixel_format (PSDimage *img_a)
+get_pixel_format (PSDimage *img_a,
+ gboolean mask_format)
{
- const Babl *format;
+ const Babl *format = NULL;
+
+ if (mask_format)
+ {
+ switch (img_a->bps)
+ {
+ case 32:
+ format = babl_format ("Y u32");
+ break;
+
+ case 16:
+ format = babl_format ("Y u16");
+ break;
+
+ case 8:
+ case 1:
+ format = babl_format ("Y u8");
+ break;
+
+ default:
+ break;
+ }
+
+ return format;
+ }
switch (get_gimp_image_type (img_a->base_type, img_a->transparency))
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]