summaryrefslogtreecommitdiff
path: root/gs/src/gdevpdfo.c
diff options
context:
space:
mode:
authorL Peter Deutsch <lpd@ghostscript.com>2001-07-29 03:00:45 +0000
committerL Peter Deutsch <lpd@ghostscript.com>2001-07-29 03:00:45 +0000
commit9b3b0a088e544e72d1d961dcd5eaaacded4eb312 (patch)
tree83985102f8ab987cb7cf963f2874099f9c7e45e7 /gs/src/gdevpdfo.c
parent9dd941d9f5ff432e5657343829c1cfac259e731c (diff)
downloadghostpdl-9b3b0a088e544e72d1d961dcd5eaaacded4eb312.tar.gz
Shrinks PDF output slightly by removing unnecessary spaces.
git-svn-id: http://svn.ghostscript.com/ghostscript/trunk@1639 a1074d23-0009-0410-80fe-cf8c14f379e6
Diffstat (limited to 'gs/src/gdevpdfo.c')
-rw-r--r--gs/src/gdevpdfo.c74
1 files changed, 50 insertions, 24 deletions
diff --git a/gs/src/gdevpdfo.c b/gs/src/gdevpdfo.c
index d8563f1e1..5807b3fa7 100644
--- a/gs/src/gdevpdfo.c
+++ b/gs/src/gdevpdfo.c
@@ -300,24 +300,39 @@ cos_value_free(const cos_value_t *pcv, const cos_object_t *pco,
}
/* Write a value on the output. */
-int
-cos_value_write(const cos_value_t *pcv, gx_device_pdf *pdev)
+private int
+cos_value_write_spaced(const cos_value_t *pcv, gx_device_pdf *pdev,
+ bool do_space)
{
+ stream *s = pdev->strm;
+
switch (pcv->value_type) {
case COS_VALUE_SCALAR:
case COS_VALUE_CONST:
+ if (do_space && pcv->contents.chars.data[0] != '/')
+ stream_putc(s, ' ');
pdf_write_value(pdev, pcv->contents.chars.data,
pcv->contents.chars.size);
break;
case COS_VALUE_RESOURCE:
- pprintld1(pdev->strm, "/R%ld", pcv->contents.object->id);
+ pprintld1(s, "/R%ld", pcv->contents.object->id);
break;
case COS_VALUE_OBJECT: {
- cos_object_t *pco = pcv->contents.object;
-
- if (!pco->id)
+ const cos_object_t *pco = pcv->contents.object;
+
+ if (!pco->id) {
+ if (do_space &&
+ !(pco->cos_procs == cos_type_array ||
+ pco->cos_procs == cos_type_dict)
+ ) {
+ /* Arrays and dictionaries (only) are self-delimiting. */
+ stream_putc(s, ' ');
+ }
return cos_write(pco, pdev);
- pprintld1(pdev->strm, "%ld 0 R", pco->id);
+ }
+ if (do_space)
+ stream_putc(s, ' ');
+ pprintld1(s, "%ld 0 R", pco->id);
break;
}
default: /* can't happen */
@@ -325,6 +340,11 @@ cos_value_write(const cos_value_t *pcv, gx_device_pdf *pdev)
}
return 0;
}
+int
+cos_value_write(const cos_value_t *pcv, gx_device_pdf *pdev)
+{
+ return cos_value_write_spaced(pcv, pdev, false);
+}
/* Copy a value if necessary for putting into an array or dictionary. */
private int
@@ -453,10 +473,11 @@ cos_array_write(const cos_object_t *pco, gx_device_pdf *pdev)
stream_puts(s, "[");
for (pcae = first; pcae; ++last_index, pcae = pcae->next) {
+ if (pcae != first)
+ stream_putc(s, '\n');
for (; pcae->index > last_index; ++last_index)
stream_puts(s, "null\n");
cos_value_write(&pcae->value, pdev);
- stream_putc(s, '\n');
}
DISCARD(cos_array_reorder(pca, first));
stream_puts(s, "]");
@@ -630,25 +651,30 @@ cos_dict_release(cos_object_t *pco, client_name_t cname)
/* Write the elements of a dictionary. */
private int
cos_elements_write(stream *s, const cos_dict_element_t *pcde,
- gx_device_pdf *pdev)
-{
- /* Temporarily replace the output stream in pdev. */
- stream *save = pdev->strm;
-
- pdev->strm = s;
- for (; pcde; pcde = pcde->next) {
- pdf_write_value(pdev, pcde->key.data, pcde->key.size);
- stream_putc(s, ' ');
- cos_value_write(&pcde->value, pdev);
- stream_putc(s, '\n');
+ gx_device_pdf *pdev, bool do_space)
+{
+ if (pcde) {
+ /* Temporarily replace the output stream in pdev. */
+ stream *save = pdev->strm;
+
+ pdev->strm = s;
+ for (;;) {
+ pdf_write_value(pdev, pcde->key.data, pcde->key.size);
+ cos_value_write_spaced(&pcde->value, pdev, true);
+ pcde = pcde->next;
+ if (pcde || do_space)
+ stream_putc(s, '\n');
+ if (!pcde)
+ break;
+ }
+ pdev->strm = save;
}
- pdev->strm = save;
return 0;
}
int
cos_dict_elements_write(const cos_dict_t *pcd, gx_device_pdf *pdev)
{
- return cos_elements_write(pdev->strm, pcd->elements, pdev);
+ return cos_elements_write(pdev->strm, pcd->elements, pdev, true);
}
private int
@@ -657,7 +683,7 @@ cos_dict_write(const cos_object_t *pco, gx_device_pdf *pdev)
stream *s = pdev->strm;
stream_puts(s, "<<");
- cos_dict_elements_write((const cos_dict_t *)pco, pdev);
+ cos_elements_write(s, ((const cos_dict_t *)pco)->elements, pdev, false);
stream_puts(s, ">>");
return 0;
}
@@ -1012,7 +1038,7 @@ cos_stream_length(const cos_stream_t *pcs)
int
cos_stream_elements_write(const cos_stream_t *pcs, gx_device_pdf *pdev)
{
- return cos_elements_write(pdev->strm, pcs->elements, pdev);
+ return cos_elements_write(pdev->strm, pcs->elements, pdev, true);
}
/* Write the contents of a stream. (This procedure is exported.) */
@@ -1053,7 +1079,7 @@ cos_stream_write(const cos_object_t *pco, gx_device_pdf *pdev)
int code;
stream_puts(s, "<<");
- cos_elements_write(s, pcs->elements, pdev);
+ cos_elements_write(s, pcs->elements, pdev, false);
pprintld1(s, "/Length %ld>>stream\n", cos_stream_length(pcs));
code = cos_stream_contents_write(pcs, pdev);
stream_puts(s, "\nendstream\n");