mirror of https://github.com/GNOME/gimp.git
Issue #5274 - Exporting as TIFF fails for layers with a negative offset
When exporting a TIFF file without merging the image, make sure non of the exported layers has a negative offset, by offsetting all the layers as necessary. TIFF doesn't support negative page offsets, giving an error in libtiff.
This commit is contained in:
parent
8732f06196
commit
536bf771b7
|
@ -275,6 +275,8 @@ save_layer (TIFF *tif,
|
||||||
gint32 num_pages,
|
gint32 num_pages,
|
||||||
GimpImage *orig_image, /* the export function might
|
GimpImage *orig_image, /* the export function might
|
||||||
* have created a duplicate */
|
* have created a duplicate */
|
||||||
|
gint origin_x,
|
||||||
|
gint origin_y,
|
||||||
gint *saved_bpp,
|
gint *saved_bpp,
|
||||||
gboolean out_linear,
|
gboolean out_linear,
|
||||||
GError **error)
|
GError **error)
|
||||||
|
@ -693,6 +695,9 @@ save_layer (TIFF *tif,
|
||||||
|
|
||||||
gimp_drawable_offsets (GIMP_DRAWABLE (layer), &offset_x, &offset_y);
|
gimp_drawable_offsets (GIMP_DRAWABLE (layer), &offset_x, &offset_y);
|
||||||
|
|
||||||
|
offset_x -= origin_x;
|
||||||
|
offset_y -= origin_y;
|
||||||
|
|
||||||
if (offset_x || offset_y)
|
if (offset_x || offset_y)
|
||||||
{
|
{
|
||||||
TIFFSetField (tif, TIFFTAG_XPOSITION, offset_x / xresolution);
|
TIFFSetField (tif, TIFFTAG_XPOSITION, offset_x / xresolution);
|
||||||
|
@ -951,6 +956,9 @@ save_image (GFile *file,
|
||||||
gint32 num_layers;
|
gint32 num_layers;
|
||||||
gint32 current_layer = 0;
|
gint32 current_layer = 0;
|
||||||
GList *layers;
|
GList *layers;
|
||||||
|
GList *iter;
|
||||||
|
gint origin_x = 0;
|
||||||
|
gint origin_y = 0;
|
||||||
gint saved_bpp;
|
gint saved_bpp;
|
||||||
gchar *config_comment;
|
gchar *config_comment;
|
||||||
gboolean config_save_profile;
|
gboolean config_save_profile;
|
||||||
|
@ -1046,11 +1054,25 @@ save_image (GFile *file,
|
||||||
if (config_save_thumbnail)
|
if (config_save_thumbnail)
|
||||||
TIFFSetField (tif, TIFFTAG_SUBIFD, number_of_sub_IFDs, sub_IFDs_offsets);
|
TIFFSetField (tif, TIFFTAG_SUBIFD, number_of_sub_IFDs, sub_IFDs_offsets);
|
||||||
|
|
||||||
|
/* calculate the top-left coordinates */
|
||||||
|
for (iter = layers; iter; iter = g_list_next (iter))
|
||||||
|
{
|
||||||
|
GimpDrawable *drawable = iter->data;
|
||||||
|
gint offset_x, offset_y;
|
||||||
|
|
||||||
|
gimp_drawable_offsets (drawable, &offset_x, &offset_y);
|
||||||
|
|
||||||
|
origin_x = MIN (origin_x, offset_x);
|
||||||
|
origin_y = MIN (origin_y, offset_y);
|
||||||
|
}
|
||||||
|
|
||||||
/* write last layer as first page. */
|
/* write last layer as first page. */
|
||||||
if (! save_layer (tif, config, space, image,
|
if (! save_layer (tif, config, space, image,
|
||||||
g_list_nth_data (layers, current_layer),
|
g_list_nth_data (layers, current_layer),
|
||||||
current_layer, num_layers,
|
current_layer, num_layers,
|
||||||
orig_image, &saved_bpp, out_linear, error))
|
orig_image,
|
||||||
|
origin_x, origin_y,
|
||||||
|
&saved_bpp, out_linear, error))
|
||||||
{
|
{
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -1092,6 +1114,7 @@ save_image (GFile *file,
|
||||||
if (! save_layer (tif, config, space, image,
|
if (! save_layer (tif, config, space, image,
|
||||||
g_list_nth_data (layers, current_layer),
|
g_list_nth_data (layers, current_layer),
|
||||||
current_layer, num_layers, orig_image,
|
current_layer, num_layers, orig_image,
|
||||||
|
origin_x, origin_y,
|
||||||
&tmp_saved_bpp, out_linear, error))
|
&tmp_saved_bpp, out_linear, error))
|
||||||
{
|
{
|
||||||
goto out;
|
goto out;
|
||||||
|
|
Loading…
Reference in New Issue