plug-ins: clean up a bit file-pdf-save.
This improves commitbbd5ebbe8a
. Several parameters did not need to go inside draw_layer(). In particular this function should not take care of filling return values on errors. It should just return a success boolean with a GError which is processed on the main function. This also allows proper shortcut to end the loop earlier on the first error. Also the layer index parameter does not need to be a pointer since it never requires updates. Finally declare variables in smaller scopes for cleaner code. (cherry picked from commit5b2d89f794
)
This commit is contained in:
@ -260,18 +260,14 @@ static void drawText (gint32 text_id,
|
|||||||
gdouble x_res,
|
gdouble x_res,
|
||||||
gdouble y_res);
|
gdouble y_res);
|
||||||
|
|
||||||
static void draw_layer (gint32 *layers,
|
static gboolean draw_layer (gint32 *layers,
|
||||||
gint n_layers,
|
gint n_layers,
|
||||||
gint *j,
|
gint j,
|
||||||
gint *nreturn_vals,
|
cairo_t *cr,
|
||||||
cairo_surface_t *pdf_file,
|
gdouble x_res,
|
||||||
cairo_t *cr,
|
gdouble y_res,
|
||||||
FILE *fp,
|
const gchar *name,
|
||||||
GimpParam *values,
|
GError **error);
|
||||||
gdouble x_res,
|
|
||||||
gdouble y_res,
|
|
||||||
const gchar *name,
|
|
||||||
GError *error);
|
|
||||||
|
|
||||||
static gboolean dnd_remove = TRUE;
|
static gboolean dnd_remove = TRUE;
|
||||||
static PdfMultiPage multi_page;
|
static PdfMultiPage multi_page;
|
||||||
@ -593,7 +589,21 @@ run (const gchar *name,
|
|||||||
/* Now, we should loop over the layers of each image */
|
/* Now, we should loop over the layers of each image */
|
||||||
for (j = 0; j < n_layers; j++)
|
for (j = 0; j < n_layers; j++)
|
||||||
{
|
{
|
||||||
draw_layer (layers, n_layers, &j, nreturn_vals, pdf_file, cr, fp, values, x_res, y_res, name, error);
|
if (! draw_layer (layers, n_layers, j, cr, x_res, y_res, name, &error))
|
||||||
|
{
|
||||||
|
*nreturn_vals = 2;
|
||||||
|
|
||||||
|
/* free the resources */
|
||||||
|
cairo_surface_destroy (pdf_file);
|
||||||
|
cairo_destroy (cr);
|
||||||
|
fclose (fp);
|
||||||
|
|
||||||
|
values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR;
|
||||||
|
|
||||||
|
values[1].type = GIMP_PDB_STRING;
|
||||||
|
values[1].data.d_string = error->message;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We are done with this image - Show it!
|
/* We are done with this image - Show it!
|
||||||
@ -1651,68 +1661,57 @@ drawText (gint32 text_id,
|
|||||||
cairo_restore (cr);
|
cairo_restore (cr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void draw_layer (gint32 *layers,
|
static gboolean
|
||||||
gint n_layers,
|
draw_layer (gint32 *layers,
|
||||||
gint *j,
|
gint n_layers,
|
||||||
gint *nreturn_vals,
|
gint j,
|
||||||
cairo_surface_t *pdf_file,
|
cairo_t *cr,
|
||||||
cairo_t *cr,
|
gdouble x_res,
|
||||||
FILE *fp,
|
gdouble y_res,
|
||||||
GimpParam *values,
|
const gchar *name,
|
||||||
gdouble x_res,
|
GError **error)
|
||||||
gdouble y_res,
|
|
||||||
const gchar *name,
|
|
||||||
GError *error)
|
|
||||||
{
|
{
|
||||||
gint32 layer_ID;
|
gint32 layer_ID;
|
||||||
gint32 mask_ID = -1;
|
|
||||||
cairo_surface_t *mask_image = NULL;
|
|
||||||
gdouble opacity;
|
|
||||||
gboolean single_color;
|
|
||||||
gint x, y, i;
|
|
||||||
gint children_num;
|
|
||||||
gint *children;
|
|
||||||
|
|
||||||
if (optimize.reverse_order && optimize.layers_as_pages)
|
if (optimize.reverse_order && optimize.layers_as_pages)
|
||||||
layer_ID = layers [*j];
|
layer_ID = layers [j];
|
||||||
else
|
else
|
||||||
layer_ID = layers [n_layers - *j - 1];
|
layer_ID = layers [n_layers - j - 1];
|
||||||
|
|
||||||
if (gimp_item_is_group (layer_ID))
|
if (gimp_item_is_group (layer_ID))
|
||||||
{
|
{
|
||||||
|
gint *children;
|
||||||
|
gint children_num;
|
||||||
|
gint i;
|
||||||
|
|
||||||
children = gimp_item_get_children (layer_ID, &children_num);
|
children = gimp_item_get_children (layer_ID, &children_num);
|
||||||
for (i = 0; i < children_num; i++)
|
for (i = 0; i < children_num; i++)
|
||||||
{
|
{
|
||||||
draw_layer (children, children_num, &i, nreturn_vals, pdf_file, cr, fp, values, x_res, y_res, name, error);
|
if (! draw_layer (children, children_num, i,
|
||||||
|
cr, x_res, y_res, name, error))
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
cairo_surface_t *mask_image = NULL;
|
||||||
|
gint32 mask_ID = -1;
|
||||||
|
gdouble opacity;
|
||||||
|
|
||||||
opacity = gimp_layer_get_opacity (layer_ID) / 100.0;
|
opacity = gimp_layer_get_opacity (layer_ID) / 100.0;
|
||||||
|
|
||||||
if ((gimp_item_get_visible (layer_ID) && opacity > 0.0) ||
|
if ((gimp_item_get_visible (layer_ID) && opacity > 0.0) ||
|
||||||
! optimize.ignore_hidden)
|
! optimize.ignore_hidden)
|
||||||
{
|
{
|
||||||
|
gint x, y;
|
||||||
|
|
||||||
mask_ID = gimp_layer_get_mask (layer_ID);
|
mask_ID = gimp_layer_get_mask (layer_ID);
|
||||||
if (mask_ID != -1)
|
if (mask_ID != -1)
|
||||||
{
|
{
|
||||||
mask_image = get_cairo_surface (mask_ID, TRUE,
|
mask_image = get_cairo_surface (mask_ID, TRUE, error);
|
||||||
&error);
|
|
||||||
if (error != NULL)
|
|
||||||
{
|
|
||||||
*nreturn_vals = 2;
|
|
||||||
|
|
||||||
/* free the resources */
|
if (*error)
|
||||||
cairo_surface_destroy (pdf_file);
|
return FALSE;
|
||||||
cairo_destroy (cr);
|
|
||||||
fclose (fp);
|
|
||||||
|
|
||||||
values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR;
|
|
||||||
|
|
||||||
values[1].type = GIMP_PDB_STRING;
|
|
||||||
values[1].data.d_string = error->message;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
gimp_drawable_offsets (layer_ID, &x, &y);
|
gimp_drawable_offsets (layer_ID, &x, &y);
|
||||||
|
|
||||||
@ -1720,7 +1719,8 @@ static void draw_layer (gint32 *layers,
|
|||||||
{
|
{
|
||||||
/* For raster layers */
|
/* For raster layers */
|
||||||
|
|
||||||
GimpRGB layer_color;
|
GimpRGB layer_color;
|
||||||
|
gboolean single_color = FALSE;
|
||||||
|
|
||||||
layer_color = get_layer_color (layer_ID, &single_color);
|
layer_color = get_layer_color (layer_ID, &single_color);
|
||||||
|
|
||||||
@ -1744,23 +1744,10 @@ static void draw_layer (gint32 *layers,
|
|||||||
{
|
{
|
||||||
cairo_surface_t *layer_image;
|
cairo_surface_t *layer_image;
|
||||||
|
|
||||||
layer_image = get_cairo_surface (layer_ID, FALSE,
|
layer_image = get_cairo_surface (layer_ID, FALSE, error);
|
||||||
&error);
|
|
||||||
if (error != NULL)
|
|
||||||
{
|
|
||||||
*nreturn_vals = 2;
|
|
||||||
|
|
||||||
/* free the resources */
|
if (*error)
|
||||||
cairo_surface_destroy (pdf_file);
|
return FALSE;
|
||||||
cairo_destroy (cr);
|
|
||||||
fclose (fp);
|
|
||||||
|
|
||||||
values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR;
|
|
||||||
|
|
||||||
values[1].type = GIMP_PDB_STRING;
|
|
||||||
values[1].data.d_string = error->message;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
cairo_clip (cr);
|
cairo_clip (cr);
|
||||||
|
|
||||||
@ -1793,4 +1780,6 @@ static void draw_layer (gint32 *layers,
|
|||||||
if (mask_ID != -1)
|
if (mask_ID != -1)
|
||||||
cairo_surface_destroy (mask_image);
|
cairo_surface_destroy (mask_image);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user