summaryrefslogtreecommitdiff
path: root/src/cairo-pdf-interchange.c
diff options
context:
space:
mode:
authorAdrian Johnson <ajohnson@redneon.com>2017-08-21 21:23:45 +0930
committerAdrian Johnson <ajohnson@redneon.com>2017-08-21 21:23:45 +0930
commit4c12e2aec38eb03d17787ece5a5566af902d16b7 (patch)
tree34613d1a2108d6f24b4a3e869bddb648c2136537 /src/cairo-pdf-interchange.c
parente3857c133f6403b94a49480ca0fad66876dbe609 (diff)
downloadcairo-4c12e2aec38eb03d17787ece5a5566af902d16b7.tar.gz
pdf: Don't emit /PageLabel dict when no labels defined
Diffstat (limited to 'src/cairo-pdf-interchange.c')
-rw-r--r--src/cairo-pdf-interchange.c92
1 files changed, 52 insertions, 40 deletions
diff --git a/src/cairo-pdf-interchange.c b/src/cairo-pdf-interchange.c
index 3d81c771a..b7ce1dca6 100644
--- a/src/cairo-pdf-interchange.c
+++ b/src/cairo-pdf-interchange.c
@@ -654,57 +654,69 @@ cairo_pdf_interchange_write_page_labels (cairo_pdf_surface_t *surface)
char *prev_prefix;
int num, prev_num;
cairo_int_status_t status;
+ cairo_bool_t has_labels;
+ /* Check if any labels defined */
num_elems = _cairo_array_num_elements (&surface->page_labels);
- if (num_elems > 0) {
- surface->page_labels_res = _cairo_pdf_surface_new_object (surface);
- _cairo_output_stream_printf (surface->output,
- "%d 0 obj\n"
- "<< /Nums [\n",
- surface->page_labels_res.id);
- prefix = NULL;
- prev_prefix = NULL;
- num = 0;
- prev_num = 0;
- for (i = 0; i < num_elems; i++) {
- _cairo_array_copy_element (&surface->page_labels, i, &label);
- if (label) {
- prefix = split_label (label, &num);
- } else {
- prefix = NULL;
- num = i + 1;
- }
+ has_labels = FALSE;
+ for (i = 0; i < num_elems; i++) {
+ _cairo_array_copy_element (&surface->page_labels, i, &label);
+ if (label) {
+ has_labels = TRUE;
+ break;
+ }
+ }
- if (!strcmp_null (prefix, prev_prefix) || num != prev_num + 1) {
- _cairo_output_stream_printf (surface->output, " %d << ", i);
+ if (!has_labels)
+ return CAIRO_STATUS_SUCCESS;
- if (num)
- _cairo_output_stream_printf (surface->output, "/S /D /St %d ", num);
+ surface->page_labels_res = _cairo_pdf_surface_new_object (surface);
+ _cairo_output_stream_printf (surface->output,
+ "%d 0 obj\n"
+ "<< /Nums [\n",
+ surface->page_labels_res.id);
+ prefix = NULL;
+ prev_prefix = NULL;
+ num = 0;
+ prev_num = 0;
+ for (i = 0; i < num_elems; i++) {
+ _cairo_array_copy_element (&surface->page_labels, i, &label);
+ if (label) {
+ prefix = split_label (label, &num);
+ } else {
+ prefix = NULL;
+ num = i + 1;
+ }
- if (prefix) {
- char *s;
- status = _cairo_utf8_to_pdf_string (prefix, &s);
- if (unlikely (status))
- return status;
+ if (!strcmp_null (prefix, prev_prefix) || num != prev_num + 1) {
+ _cairo_output_stream_printf (surface->output, " %d << ", i);
- _cairo_output_stream_printf (surface->output, "/P %s ", s);
- free (s);
- }
+ if (num)
+ _cairo_output_stream_printf (surface->output, "/S /D /St %d ", num);
+
+ if (prefix) {
+ char *s;
+ status = _cairo_utf8_to_pdf_string (prefix, &s);
+ if (unlikely (status))
+ return status;
- _cairo_output_stream_printf (surface->output, ">>\n");
+ _cairo_output_stream_printf (surface->output, "/P %s ", s);
+ free (s);
}
- free (prev_prefix);
- prev_prefix = prefix;
- prefix = NULL;
- prev_num = num;
+
+ _cairo_output_stream_printf (surface->output, ">>\n");
}
- free (prefix);
free (prev_prefix);
- _cairo_output_stream_printf (surface->output,
- " ]\n"
- ">>\n"
- "endobj\n");
+ prev_prefix = prefix;
+ prefix = NULL;
+ prev_num = num;
}
+ free (prefix);
+ free (prev_prefix);
+ _cairo_output_stream_printf (surface->output,
+ " ]\n"
+ ">>\n"
+ "endobj\n");
return CAIRO_STATUS_SUCCESS;
}