plug-ins: also omit hidden layer groups in PDF export.

When the "Omit hidden layers and layers with zero opacity" option is
set, this property was only checked on non-group layers. So if we had
non-hidden layers inside hidden layer groups, they ended up exported,
which is not the expected behavior.

See https://gitlab.gnome.org/GNOME/gimp/issues/4425#note_675350
This commit is contained in:
Jehan 2020-01-01 18:40:52 +01:00
parent 34f05750d0
commit 24a0b0c53a
1 changed files with 71 additions and 73 deletions

View File

@ -1896,12 +1896,18 @@ draw_layer (GimpLayer **layers,
GError **error)
{
GimpLayer *layer;
gdouble opacity;
if (optimize.reverse_order && optimize.layers_as_pages)
layer = layers [j];
else
layer = layers [n_layers - j - 1];
opacity = gimp_layer_get_opacity (layer) / 100.0;
if ((! gimp_item_get_visible (GIMP_ITEM (layer)) || opacity == 0.0) &&
optimize.ignore_hidden)
return TRUE;
if (gimp_item_is_group (GIMP_ITEM (layer)))
{
GimpItem **children;
@ -1924,89 +1930,81 @@ draw_layer (GimpLayer **layers,
{
cairo_surface_t *mask_image = NULL;
GimpLayerMask *mask = NULL;
gdouble opacity;
gint x, y;
opacity = gimp_layer_get_opacity (layer) / 100.0;
if ((gimp_item_get_visible (GIMP_ITEM (layer)) && opacity > 0.0) ||
! optimize.ignore_hidden)
mask = gimp_layer_get_mask (layer);
if (mask)
{
gint x, y;
mask_image = get_cairo_surface (GIMP_DRAWABLE (mask), TRUE,
error);
mask = gimp_layer_get_mask (layer);
if (mask)
if (*error)
return FALSE;
}
gimp_drawable_offsets (GIMP_DRAWABLE (layer), &x, &y);
if (! gimp_item_is_text_layer (GIMP_ITEM (layer)) || optimize.convert_text)
{
/* For raster layers */
GimpRGB layer_color;
gboolean single_color = FALSE;
layer_color = get_layer_color (layer, &single_color);
cairo_rectangle (cr, x, y,
gimp_drawable_width (GIMP_DRAWABLE (layer)),
gimp_drawable_height (GIMP_DRAWABLE (layer)));
if (optimize.vectorize && single_color)
{
mask_image = get_cairo_surface (GIMP_DRAWABLE (mask), TRUE,
error);
if (*error)
return FALSE;
}
gimp_drawable_offsets (GIMP_DRAWABLE (layer), &x, &y);
if (! gimp_item_is_text_layer (GIMP_ITEM (layer)) || optimize.convert_text)
{
/* For raster layers */
GimpRGB layer_color;
gboolean single_color = FALSE;
layer_color = get_layer_color (layer, &single_color);
cairo_rectangle (cr, x, y,
gimp_drawable_width (GIMP_DRAWABLE (layer)),
gimp_drawable_height (GIMP_DRAWABLE (layer)));
if (optimize.vectorize && single_color)
{
cairo_set_source_rgba (cr,
layer_color.r,
layer_color.g,
layer_color.b,
layer_color.a * opacity);
if (mask)
cairo_mask_surface (cr, mask_image, x, y);
else
cairo_fill (cr);
}
cairo_set_source_rgba (cr,
layer_color.r,
layer_color.g,
layer_color.b,
layer_color.a * opacity);
if (mask)
cairo_mask_surface (cr, mask_image, x, y);
else
{
cairo_surface_t *layer_image;
layer_image = get_cairo_surface (GIMP_DRAWABLE (layer), FALSE,
error);
if (*error)
return FALSE;
cairo_clip (cr);
cairo_set_source_surface (cr, layer_image, x, y);
cairo_push_group (cr);
cairo_paint_with_alpha (cr, opacity);
cairo_pop_group_to_source (cr);
if (mask)
cairo_mask_surface (cr, mask_image, x, y);
else
cairo_paint (cr);
cairo_reset_clip (cr);
cairo_surface_destroy (layer_image);
}
cairo_fill (cr);
}
else
{
/* For text layers */
drawText (layer, opacity, cr, x_res, y_res);
}
cairo_surface_t *layer_image;
/* draw new page if "layers as pages" option is checked */
if (optimize.layers_as_pages)
cairo_show_page (cr);
layer_image = get_cairo_surface (GIMP_DRAWABLE (layer), FALSE,
error);
if (*error)
return FALSE;
cairo_clip (cr);
cairo_set_source_surface (cr, layer_image, x, y);
cairo_push_group (cr);
cairo_paint_with_alpha (cr, opacity);
cairo_pop_group_to_source (cr);
if (mask)
cairo_mask_surface (cr, mask_image, x, y);
else
cairo_paint (cr);
cairo_reset_clip (cr);
cairo_surface_destroy (layer_image);
}
}
else
{
/* For text layers */
drawText (layer, opacity, cr, x_res, y_res);
}
/* draw new page if "layers as pages" option is checked */
if (optimize.layers_as_pages)
cairo_show_page (cr);
/* We are done with the layer - time to free some resources */
if (mask)