diff options
author | L Peter Deutsch <lpd@ghostscript.com> | 2001-07-29 03:00:45 +0000 |
---|---|---|
committer | L Peter Deutsch <lpd@ghostscript.com> | 2001-07-29 03:00:45 +0000 |
commit | 9b3b0a088e544e72d1d961dcd5eaaacded4eb312 (patch) | |
tree | 83985102f8ab987cb7cf963f2874099f9c7e45e7 /gs/src/gdevpdfo.c | |
parent | 9dd941d9f5ff432e5657343829c1cfac259e731c (diff) | |
download | ghostpdl-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.c | 74 |
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"); |