summaryrefslogtreecommitdiff
path: root/src/cairo-pdf-surface.c
diff options
context:
space:
mode:
authorAdrian Johnson <ajohnson@redneon.com>2016-10-01 22:44:22 +0930
committerAdrian Johnson <ajohnson@redneon.com>2016-10-01 22:44:22 +0930
commit26b3f83ff652a284b79557ec1555b398c566a7eb (patch)
tree8a5aff3112e7853293a401f0f3ea023230b3e6c3 /src/cairo-pdf-surface.c
parent5bfadd5530623d3b12fadf8cd22f95cec4132b65 (diff)
pdf: page label API
Diffstat (limited to 'src/cairo-pdf-surface.c')
-rw-r--r--src/cairo-pdf-surface.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c
index 3a125e74f..900055431 100644
--- a/src/cairo-pdf-surface.c
+++ b/src/cairo-pdf-surface.c
@@ -447,8 +447,12 @@ _cairo_pdf_surface_create_for_stream_internal (cairo_output_stream_t *output,
surface->page_parent_tree = -1;
_cairo_array_init (&surface->page_annots, sizeof (cairo_pdf_resource_t));
surface->tagged = FALSE;
+ surface->current_page_label = NULL;
+ _cairo_array_init (&surface->page_labels, sizeof (char *));
surface->outlines_dict_res.id = 0;
surface->names_dict_res.id = 0;
+ surface->docinfo_res.id = 0;
+ surface->page_labels_res.id = 0;
surface->paginated_surface = _cairo_paginated_surface_create (
&surface->base,
@@ -806,6 +810,28 @@ cairo_pdf_surface_set_metadata (cairo_surface_t *surface,
status = _cairo_surface_set_error (surface, status);
}
+/**
+ * cairo_pdf_surface_set_page_label:
+ * @surface: a PDF #cairo_surface_t
+ * @utf8: The page label.
+ *
+ * Set page label for the current page.
+ *
+ * Since: 1.16
+ **/
+void
+cairo_pdf_surface_set_page_label (cairo_surface_t *surface,
+ const char *utf8)
+{
+ cairo_pdf_surface_t *pdf_surface = NULL; /* hide compiler warning */
+
+ if (! _extract_pdf_surface (surface, &pdf_surface))
+ return;
+
+ free (pdf_surface->current_page_label);
+ pdf_surface->current_page_label = utf8 ? strdup (utf8) : NULL;
+}
+
static void
_cairo_pdf_surface_clear (cairo_pdf_surface_t *surface)
{
@@ -2158,6 +2184,7 @@ _cairo_pdf_surface_finish (void *abstract_surface)
cairo_status_t status, status2;
int size, i;
cairo_pdf_jbig2_global_t *global;
+ char *label;
status = surface->base.status;
if (status == CAIRO_STATUS_SUCCESS)
@@ -2255,6 +2282,13 @@ _cairo_pdf_surface_finish (void *abstract_surface)
}
_cairo_array_fini (&surface->jbig2_global);
+ size = _cairo_array_num_elements (&surface->page_labels);
+ for (i = 0; i < size; i++) {
+ _cairo_array_copy_element (&surface->page_labels, i, &label);
+ free (label);
+ }
+ _cairo_array_fini (&surface->page_labels);
+
_cairo_array_truncate (&surface->page_surfaces, 0);
_cairo_surface_clipper_reset (&surface->clipper);
@@ -4783,6 +4817,9 @@ _cairo_pdf_surface_show_page (void *abstract_surface)
cairo_pdf_surface_t *surface = abstract_surface;
cairo_int_status_t status;
+ status = _cairo_array_append (&surface->page_labels, &surface->current_page_label);
+ surface->current_page_label = NULL;
+
status = _cairo_pdf_interchange_end_page_content (surface);
if (unlikely (status))
return status;
@@ -6173,6 +6210,12 @@ _cairo_pdf_surface_write_catalog (cairo_pdf_surface_t *surface)
surface->outlines_dict_res.id);
}
+ if (surface->page_labels_res.id != 0) {
+ _cairo_output_stream_printf (surface->output,
+ " /PageLabels %d 0 R\n",
+ surface->page_labels_res.id);
+ }
+
if (surface->names_dict_res.id != 0) {
_cairo_output_stream_printf (surface->output,
" /Names %d 0 R\n",