mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2025-12-31 05:30:19 +01:00
PDF: Put each fallback image in a separate group
Each fallback image needs to be in a separate group in the knockout group. Otherwise transparent edges of adjacent fallback images will composite with each other creating visible seams between the images.
This commit is contained in:
parent
d6a84302a0
commit
e2adb921f8
2 changed files with 21 additions and 7 deletions
|
|
@ -110,6 +110,7 @@ struct _cairo_pdf_surface {
|
|||
cairo_array_t alpha_linear_functions;
|
||||
cairo_array_t patterns;
|
||||
cairo_array_t smask_groups;
|
||||
cairo_array_t knockout_group;
|
||||
|
||||
cairo_scaled_font_subsets_t *font_subsets;
|
||||
cairo_array_t fonts;
|
||||
|
|
@ -120,7 +121,6 @@ struct _cairo_pdf_surface {
|
|||
cairo_bool_t compress_content;
|
||||
|
||||
cairo_pdf_resource_t content;
|
||||
cairo_pdf_resource_t fallback_content;
|
||||
cairo_pdf_resource_t content_resources;
|
||||
cairo_pdf_group_resources_t resources;
|
||||
cairo_bool_t has_fallback_images;
|
||||
|
|
|
|||
|
|
@ -311,6 +311,7 @@ _cairo_pdf_surface_create_for_stream_internal (cairo_output_stream_t *output,
|
|||
_cairo_array_init (&surface->fonts, sizeof (cairo_pdf_font_t));
|
||||
_cairo_array_init (&surface->patterns, sizeof (cairo_pdf_pattern_t));
|
||||
_cairo_array_init (&surface->smask_groups, sizeof (cairo_pdf_smask_group_t *));
|
||||
_cairo_array_init (&surface->knockout_group, sizeof (cairo_pdf_resource_t));
|
||||
|
||||
_cairo_pdf_group_resources_init (&surface->resources);
|
||||
|
||||
|
|
@ -540,6 +541,7 @@ _cairo_pdf_surface_clear (cairo_pdf_surface_t *surface)
|
|||
_cairo_pdf_smask_group_destroy (group);
|
||||
}
|
||||
_cairo_array_truncate (&surface->smask_groups, 0);
|
||||
_cairo_array_truncate (&surface->knockout_group, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -1250,6 +1252,7 @@ _cairo_pdf_surface_finish (void *abstract_surface)
|
|||
_cairo_array_fini (&surface->patterns);
|
||||
_cairo_array_fini (&surface->smask_groups);
|
||||
_cairo_array_fini (&surface->fonts);
|
||||
_cairo_array_fini (&surface->knockout_group);
|
||||
|
||||
if (surface->font_subsets) {
|
||||
_cairo_scaled_font_subsets_destroy (surface->font_subsets);
|
||||
|
|
@ -4005,8 +4008,9 @@ _cairo_pdf_surface_write_patterns_and_smask_groups (cairo_pdf_surface_t *surface
|
|||
static cairo_status_t
|
||||
_cairo_pdf_surface_write_page (cairo_pdf_surface_t *surface)
|
||||
{
|
||||
cairo_pdf_resource_t page, knockout;
|
||||
cairo_pdf_resource_t page, knockout, res;
|
||||
cairo_status_t status;
|
||||
int i, len;
|
||||
|
||||
_cairo_pdf_group_resources_clear (&surface->resources);
|
||||
if (surface->has_fallback_images) {
|
||||
|
|
@ -4014,13 +4018,19 @@ _cairo_pdf_surface_write_page (cairo_pdf_surface_t *surface)
|
|||
if (status)
|
||||
return status;
|
||||
|
||||
len = _cairo_array_num_elements (&surface->knockout_group);
|
||||
for (i = 0; i < len; i++) {
|
||||
_cairo_array_copy_element (&surface->knockout_group, i, &res);
|
||||
_cairo_output_stream_printf (surface->output,
|
||||
"/x%d Do\r\n",
|
||||
res.id);
|
||||
_cairo_pdf_surface_add_xobject (surface, res);
|
||||
}
|
||||
_cairo_output_stream_printf (surface->output,
|
||||
"/x%d Do\r\n"
|
||||
"/x%d Do\r\n",
|
||||
surface->content.id,
|
||||
surface->fallback_content.id);
|
||||
surface->content.id);
|
||||
_cairo_pdf_surface_add_xobject (surface, surface->content);
|
||||
_cairo_pdf_surface_add_xobject (surface, surface->fallback_content);
|
||||
|
||||
status = _cairo_pdf_surface_close_group (surface, &knockout);
|
||||
if (status)
|
||||
return status;
|
||||
|
|
@ -4204,10 +4214,14 @@ _cairo_pdf_surface_start_fallback (cairo_pdf_surface_t *surface)
|
|||
if (status)
|
||||
return status;
|
||||
|
||||
status = _cairo_array_append (&surface->knockout_group, &surface->content);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
surface->has_fallback_images = TRUE;
|
||||
_cairo_pdf_group_resources_clear (&surface->resources);
|
||||
return _cairo_pdf_surface_open_content_stream (surface,
|
||||
&surface->fallback_content,
|
||||
&surface->content,
|
||||
TRUE);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue