summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--devices/gdevpdfimg.c422
-rw-r--r--windows/ghostscript.vcproj12
2 files changed, 214 insertions, 220 deletions
diff --git a/devices/gdevpdfimg.c b/devices/gdevpdfimg.c
index 25e7a60e7..5936d96f0 100644
--- a/devices/gdevpdfimg.c
+++ b/devices/gdevpdfimg.c
@@ -547,81 +547,33 @@ pdf_image_downscale_and_print_page(gx_device_printer *dev, int factor,
return code;
}
-static int
-pdf_image_print_page(gx_device_printer * pdev, FILE * file)
-{
- gx_device_pdf_image *const pdf_dev = (gx_device_pdf_image *)pdev;
- int code;
-
- code = gdev_pdf_image_begin_page(pdf_dev, file);
- if (code < 0)
- return code;
-
- code = pdf_image_downscale_and_print_page(pdev,
- pdf_dev->downscale.downscale_factor,
- pdf_dev->downscale.min_feature_size,
- 8, pdf_dev->color_info.num_components,
- 0, 0, NULL,
- pdf_dev->downscale.ets);
- if (code < 0)
- return code;
-
- return 0;
-}
-
-int
-pdf_image_open(gx_device *pdev)
+static void write_fileID(stream *s, const byte *str, int size)
{
- gx_device_pdf_image *ppdev = (gx_device_pdf_image *)pdev;
- int code;
- bool update_procs = false;
+ const stream_template *templat;
+ stream_AXE_state state;
+ stream_state *st = NULL;
- code = install_internal_subclass_devices((gx_device **)&pdev, &update_procs);
- if (code < 0)
- return code;
- /* If we've been subclassed, find the terminal device */
- while(pdev->child)
- pdev = pdev->child;
+ templat = &s_AXE_template;
+ st = (stream_state *) & state;
+ s_AXE_init_inline(&state);
+ stream_putc(s, '<');
+ {
+ byte buf[100]; /* size is arbitrary */
+ stream_cursor_read r;
+ stream_cursor_write w;
+ int status;
- ppdev->file = NULL;
- ppdev->Pages = NULL;
- ppdev->NumPages = 0;
- ppdev->RootOffset = 0;
- ppdev->PagesOffset = 0;
- ppdev->MetadataOffset = 0;
- ppdev->MetadataLengthOffset = 0;
- ppdev->InfoOffset = 0;
- ppdev->xrefOffset = 0;
- ppdev->StripHeight = 0;
- code = gdev_prn_allocate_memory(pdev, NULL, 0, 0);
- if (code < 0)
- return code;
- if (update_procs) {
- if (pdev->ObjectHandlerPushed) {
- gx_copy_device_procs(pdev->parent, pdev, &gs_obj_filter_device);
- pdev = pdev->parent;
+ r.ptr = str - 1;
+ r.limit = r.ptr + size;
+ w.limit = buf + sizeof(buf) - 1;
+ do {
+ /* One picky compiler complains if we initialize to buf - 1. */
+ w.ptr = buf; w.ptr--;
+ status = (*templat->process) (st, &r, &w, true);
+ stream_write(s, buf, (uint) (w.ptr + 1 - buf));
}
- if (pdev->PageHandlerPushed)
- gx_copy_device_procs(pdev->parent, pdev, &gs_flp_device);
- }
- if (ppdev->OpenOutputFile)
- code = gdev_prn_open_printer_seekable(pdev, 1, true);
- return code;
-}
-
-static void write_xref_entry (stream *s, gs_offset_t Offset)
-{
- char O[11];
- int i;
-
- if (Offset > 9999999999){
- Offset = 0;
+ while (status == 1);
}
- gs_sprintf(O, "%d", Offset);
- for (i=0; i< (10 - strlen(O)); i++)
- stream_puts(s, "0");
- stream_puts(s, O);
- stream_puts(s, " 00000 n \n");
}
static int
@@ -659,34 +611,21 @@ pdf_compute_fileID(gx_device_pdf_image * pdev, byte fileID[16], char *CreationDa
return 0;
}
-static void write_fileID(stream *s, const byte *str, int size)
+static void write_xref_entry (stream *s, gs_offset_t Offset)
{
- const stream_template *templat;
- stream_AXE_state state;
- stream_state *st = NULL;
-
- templat = &s_AXE_template;
- st = (stream_state *) & state;
- s_AXE_init_inline(&state);
- stream_putc(s, '<');
- {
- byte buf[100]; /* size is arbitrary */
- stream_cursor_read r;
- stream_cursor_write w;
- int status;
+ char O[11];
+ int i;
- r.ptr = str - 1;
- r.limit = r.ptr + size;
- w.limit = buf + sizeof(buf) - 1;
- do {
- /* One picky compiler complains if we initialize to buf - 1. */
- w.ptr = buf; w.ptr--;
- status = (*templat->process) (st, &r, &w, true);
- stream_write(s, buf, (uint) (w.ptr + 1 - buf));
- }
- while (status == 1);
+ if (Offset > 9999999999){
+ Offset = 0;
}
+ gs_sprintf(O, "%d", Offset);
+ for (i=0; i< (10 - strlen(O)); i++)
+ stream_puts(s, "0");
+ stream_puts(s, O);
+ stream_puts(s, " 00000 n \n");
}
+
static void
pdf_store_default_Producer(char *buf)
{
@@ -696,11 +635,8 @@ pdf_store_default_Producer(char *buf)
gs_sprintf(buf, "(%s %1.2f)", gs_product, gs_revision / 100.0);
}
-
-int
-pdf_image_close(gx_device * pdev)
+static int pdf_image_finish_file(gx_device_pdf_image *pdf_dev, int PCLm)
{
- gx_device_pdf_image *const pdf_dev = (gx_device_pdf_image *)pdev;
pdfimage_page *page = pdf_dev->Pages;
struct tm tms;
time_t t;
@@ -713,8 +649,13 @@ pdf_image_close(gx_device * pdev)
pdf_store_default_Producer(Producer);
- pdf_dev->RootOffset = stell(pdf_dev->strm);
- stream_puts(pdf_dev->strm, "1 0 obj\n<<\n/Pages 2 0 R\n/Metadata 3 0 R\n/Type /Catalog\n>>\nendobj\n");
+ if (PCLm) {
+ pdf_dev->RootOffset = stell(pdf_dev->strm);
+ stream_puts(pdf_dev->strm, "1 0 obj\n<<\n/Pages 2 0 R\n/Type /Catalog\n>>\nendobj\n");
+ } else {
+ pdf_dev->RootOffset = stell(pdf_dev->strm);
+ stream_puts(pdf_dev->strm, "1 0 obj\n<<\n/Pages 2 0 R\n/Metadata 3 0 R\n/Type /Catalog\n>>\nendobj\n");
+ }
pdf_dev->PagesOffset = stell(pdf_dev->strm);
pprintd1(pdf_dev->strm, "2 0 obj\n<<\n/Count %d\n", pdf_dev->NumPages);
@@ -741,35 +682,62 @@ pdf_image_close(gx_device * pdev)
timesign, timeoffset / 60, timeoffset % 60);
pdf_dev->xrefOffset = stell(pdf_dev->strm);
- pprintd1(pdf_dev->strm, "xref\n0 %d\n0000000000 65536 f \n", (pdf_dev->NumPages * 4) + 6);
+ if (PCLm)
+ pprintd1(pdf_dev->strm, "xref\n0 %d\n0000000000 65536 f \n", pdf_dev->NextObject);
+ else
+ pprintd1(pdf_dev->strm, "xref\n0 %d\n0000000000 65536 f \n", (pdf_dev->NumPages * 4) + 6);
write_xref_entry(pdf_dev->strm, pdf_dev->RootOffset);
write_xref_entry(pdf_dev->strm, pdf_dev->PagesOffset);
- write_xref_entry(pdf_dev->strm, pdf_dev->MetadataOffset);
- write_xref_entry(pdf_dev->strm, pdf_dev->MetadataLengthOffset);
- write_xref_entry(pdf_dev->strm, pdf_dev->InfoOffset);
- page = pdf_dev->Pages;
- while(page){
- write_xref_entry(pdf_dev->strm, page->ImageOffset);
- write_xref_entry(pdf_dev->strm, page->LengthOffset);
- write_xref_entry(pdf_dev->strm, page->PageStreamOffset);
- write_xref_entry(pdf_dev->strm, page->PageDictOffset);
- page = page->next;
+ if (!PCLm) {
+ write_xref_entry(pdf_dev->strm, pdf_dev->MetadataOffset);
+ write_xref_entry(pdf_dev->strm, pdf_dev->MetadataLengthOffset);
+ write_xref_entry(pdf_dev->strm, pdf_dev->InfoOffset);
+
+ page = pdf_dev->Pages;
+ while(page){
+ write_xref_entry(pdf_dev->strm, page->ImageOffset);
+ write_xref_entry(pdf_dev->strm, page->LengthOffset);
+ write_xref_entry(pdf_dev->strm, page->PageStreamOffset);
+ write_xref_entry(pdf_dev->strm, page->PageDictOffset);
+ page = page->next;
+ }
+ pprintd1(pdf_dev->strm, "trailer\n<<\n/Size %d\n/Info 5 0 R\n/Root 1 0 R\n/ID [", (pdf_dev->NumPages * 4) + 6);
+ pdf_compute_fileID(pdf_dev, fileID, CreationDate, Title, Producer);
+ write_fileID(pdf_dev->strm, (const byte *)&fileID, 16);
+ write_fileID(pdf_dev->strm, (const byte *)&fileID, 16);
+ pprintd1(pdf_dev->strm, "]\n>>\nstartxref\n%d\n%%%%EOF\n", pdf_dev->xrefOffset);
+ } else {
+ gs_offset_t streamsize, R = 0;
+ char Buffer[1024];
+
+ sflush(pdf_dev->xref_stream.strm);
+ streamsize = gp_ftell_64(pdf_dev->xref_stream.file);
+ if (gp_fseek_64(pdf_dev->xref_stream.file, 0, SEEK_SET) != 0)
+ return_error(gs_error_ioerror);
+
+ while(streamsize > 0) {
+ if (streamsize > 1024) {
+ streamsize -= gp_fpread(Buffer, 1024, R, pdf_dev->xref_stream.file);
+ R += 1024;
+ stream_write(pdf_dev->strm, Buffer, 1024);
+ }
+ else {
+ gp_fpread(Buffer, streamsize, R, pdf_dev->xref_stream.file);
+ stream_write(pdf_dev->strm, Buffer, streamsize);
+ streamsize = 0;
+ }
+ }
+ if (gp_fseek_64(pdf_dev->xref_stream.file, 0, SEEK_SET) != 0)
+ return_error(gs_error_ioerror);
+
+ pprintd1(pdf_dev->strm, "trailer\n<<\n/Size %d\n/Root 1 0 R\n/ID [", pdf_dev->NextObject);
+ pdf_compute_fileID(pdf_dev, fileID, CreationDate, Title, Producer);
+ write_fileID(pdf_dev->strm, (const byte *)&fileID, 16);
+ write_fileID(pdf_dev->strm, (const byte *)&fileID, 16);
+ pprintd1(pdf_dev->strm, "]\n>>\nstartxref\n%d\n%%%%EOF\n", pdf_dev->xrefOffset);
}
- pprintd1(pdf_dev->strm, "trailer\n<<\n/Size %d\n/Info 5 0 R\n/Root 1 0 R\n/ID [", (pdf_dev->NumPages * 4) + 6);
- pdf_compute_fileID(pdf_dev, fileID, CreationDate, Title, Producer);
- write_fileID(pdf_dev->strm, (const byte *)&fileID, 16);
- write_fileID(pdf_dev->strm, (const byte *)&fileID, 16);
- pprintd1(pdf_dev->strm, "]\n>>\nstartxref\n%d\n%%%%EOF\n", pdf_dev->xrefOffset);
- }
- if (pdf_dev->icclink != NULL)
- {
- pdf_dev->icclink->procs.free_link(pdf_dev->icclink);
- gsicc_free_link_dev(pdev->memory, pdf_dev->icclink);
- pdf_dev->icclink = NULL;
- }
- if (pdf_dev->strm) {
sflush(pdf_dev->strm);
pdf_dev->strm->file = NULL; /* Don't close underlying file when we free the stream */
gs_free_object(pdf_dev->memory->non_gc_memory, pdf_dev->strm, "pdfimage_close(strm)");
@@ -785,7 +753,108 @@ pdf_image_close(gx_device * pdev)
"pdfimage free a page");
p = n;
}while (p);
+ pdf_dev->Pages = NULL;
+ pdf_dev->NumPages = 0;
+ }
+ if (pdf_dev->icclink != NULL)
+ {
+ pdf_dev->icclink->procs.free_link(pdf_dev->icclink);
+ gsicc_free_link_dev(pdf_dev->memory, pdf_dev->icclink);
+ pdf_dev->icclink = NULL;
+ }
+ pdf_dev->RootOffset = 0;
+ pdf_dev->PagesOffset = 0;
+ pdf_dev->MetadataOffset = 0;
+ pdf_dev->MetadataLengthOffset = 0;
+ pdf_dev->InfoOffset = 0;
+ pdf_dev->xrefOffset = 0;
+ if (!PCLm)
+ pdf_dev->StripHeight = 0;
+ else
+ pdf_dev->NextObject = 0;
+ return 0;
+}
+
+static int
+pdf_image_print_page(gx_device_printer * pdev, FILE * file)
+{
+ gx_device_pdf_image *const pdf_dev = (gx_device_pdf_image *)pdev;
+ const char *fmt;
+ gs_parsed_file_name_t parsed;
+ int code;
+
+ code = gdev_pdf_image_begin_page(pdf_dev, file);
+ if (code < 0)
+ return code;
+
+ code = pdf_image_downscale_and_print_page(pdev,
+ pdf_dev->downscale.downscale_factor,
+ pdf_dev->downscale.min_feature_size,
+ 8, pdf_dev->color_info.num_components,
+ 0, 0, NULL,
+ pdf_dev->downscale.ets);
+ if (code < 0)
+ return code;
+
+ code = gx_parse_output_file_name(&parsed, &fmt, pdev->fname,
+ strlen(pdev->fname), pdev->memory);
+
+ if (code >= 0 && fmt) {
+ code = pdf_image_finish_file(pdf_dev, 0);
+ }
+ return code;
+}
+
+int
+pdf_image_open(gx_device *pdev)
+{
+ gx_device_pdf_image *ppdev = (gx_device_pdf_image *)pdev;
+ int code;
+ bool update_procs = false;
+
+ code = install_internal_subclass_devices((gx_device **)&pdev, &update_procs);
+ if (code < 0)
+ return code;
+ /* If we've been subclassed, find the terminal device */
+ while(pdev->child)
+ pdev = pdev->child;
+
+ ppdev->file = NULL;
+ ppdev->Pages = NULL;
+ ppdev->NumPages = 0;
+ ppdev->RootOffset = 0;
+ ppdev->PagesOffset = 0;
+ ppdev->MetadataOffset = 0;
+ ppdev->MetadataLengthOffset = 0;
+ ppdev->InfoOffset = 0;
+ ppdev->xrefOffset = 0;
+ ppdev->StripHeight = 0;
+ code = gdev_prn_allocate_memory(pdev, NULL, 0, 0);
+ if (code < 0)
+ return code;
+ if (update_procs) {
+ if (pdev->ObjectHandlerPushed) {
+ gx_copy_device_procs(pdev->parent, pdev, &gs_obj_filter_device);
+ pdev = pdev->parent;
+ }
+ if (pdev->PageHandlerPushed)
+ gx_copy_device_procs(pdev->parent, pdev, &gs_flp_device);
}
+ if (ppdev->OpenOutputFile)
+ code = gdev_prn_open_printer_seekable(pdev, 1, true);
+ return code;
+}
+
+int
+pdf_image_close(gx_device * pdev)
+{
+ gx_device_pdf_image *const pdf_dev = (gx_device_pdf_image *)pdev;
+ int code;
+
+ code = pdf_image_finish_file(pdf_dev, 0);
+ if (code < 0)
+ return code;
+
return gdev_prn_close(pdev);
}
@@ -1428,7 +1497,7 @@ PCLm_downscale_and_print_page(gx_device_printer *dev, int factor,
}
if (Read) {
- uint R = 0;
+ uint R = 0, saved = pdf_dev->StripHeight;
pdf_dev->StripHeight = Read;
if (pdf_dev->temp_stream.save != pdf_dev->temp_stream.strm)
@@ -1494,6 +1563,7 @@ PCLm_downscale_and_print_page(gx_device_printer *dev, int factor,
write_xref_entry(pdf_dev->xref_stream.strm, page->ImageOffset);
pprintd1(pdf_dev->strm, "%d 0 obj\n", page->ImageObjectNumber++);
stream_puts(pdf_dev->strm, "<</Length 14>>\nstream\nq /image Do Q\nendstream\nendobj\n");
+ pdf_dev->StripHeight = saved;
}
pdf_dev->NextObject = page->ImageObjectNumber;
@@ -1508,6 +1578,8 @@ static int
PCLm_print_page(gx_device_printer * pdev, FILE * file)
{
gx_device_pdf_image *const pdf_dev = (gx_device_pdf_image *)pdev;
+ const char *fmt;
+ gs_parsed_file_name_t parsed;
int code;
code = gdev_PCLm_begin_page(pdf_dev, file);
@@ -1523,6 +1595,12 @@ PCLm_print_page(gx_device_printer * pdev, FILE * file)
if (code < 0)
return code;
+ code = gx_parse_output_file_name(&parsed, &fmt, pdev->fname,
+ strlen(pdev->fname), pdev->memory);
+
+ if (code >= 0 && fmt) {
+ code = pdf_image_finish_file(pdf_dev, 1);
+ }
return 0;
}
@@ -1530,100 +1608,12 @@ int
PCLm_close(gx_device * pdev)
{
gx_device_pdf_image *const pdf_dev = (gx_device_pdf_image *)pdev;
- pdfimage_page *page = pdf_dev->Pages;
int code, code1;
- struct tm tms;
- time_t t;
- int timeoffset;
- char timesign;
- char Buffer[1024], CreationDate[26], Title[] = "Untitled", Producer[256];
- gs_offset_t streamsize, R = 0;
-
- if (pdf_dev->strm != NULL) {
- byte fileID[16];
-
- pdf_store_default_Producer(Producer);
-
- pdf_dev->RootOffset = stell(pdf_dev->strm);
- stream_puts(pdf_dev->strm, "1 0 obj\n<<\n/Pages 2 0 R\n/Type /Catalog\n>>\nendobj\n");
-
- pdf_dev->PagesOffset = stell(pdf_dev->strm);
- pprintd1(pdf_dev->strm, "2 0 obj\n<<\n/Count %d\n", pdf_dev->NumPages);
- stream_puts(pdf_dev->strm, "/Kids [");
- while(page){
- pprintd1(pdf_dev->strm, "%d 0 R ", page->PageDictObjectNumber);
- page = page->next;
- }
-
- stream_puts(pdf_dev->strm, "]\n/Type /Pages\n>>\nendobj\n");
-
- time(&t);
- tms = *gmtime(&t);
- tms.tm_isdst = -1;
- timeoffset = (int)difftime(t, mktime(&tms)); /* tz+dst in seconds */
- timesign = (timeoffset == 0 ? 'Z' : timeoffset < 0 ? '-' : '+');
- timeoffset = any_abs(timeoffset) / 60;
- tms = *localtime(&t);
-
- gs_sprintf(CreationDate, "(D:%04d%02d%02d%02d%02d%02d%c%02d\'%02d\')",
- tms.tm_year + 1900, tms.tm_mon + 1, tms.tm_mday,
- tms.tm_hour, tms.tm_min, tms.tm_sec,
- timesign, timeoffset / 60, timeoffset % 60);
-
- pdf_dev->xrefOffset = stell(pdf_dev->strm);
- pprintd1(pdf_dev->strm, "xref\n0 %d\n0000000000 65536 f \n", pdf_dev->NextObject);
- write_xref_entry(pdf_dev->strm, pdf_dev->RootOffset);
- write_xref_entry(pdf_dev->strm, pdf_dev->PagesOffset);
-
- sflush(pdf_dev->xref_stream.strm);
- streamsize = gp_ftell_64(pdf_dev->xref_stream.file);
- if (gp_fseek_64(pdf_dev->xref_stream.file, 0, SEEK_SET) != 0)
- return_error(gs_error_ioerror);
-
- while(streamsize > 0) {
- if (streamsize > 1024) {
- streamsize -= gp_fpread(Buffer, 1024, R, pdf_dev->xref_stream.file);
- R += 1024;
- stream_write(pdf_dev->strm, Buffer, 1024);
- }
- else {
- gp_fpread(Buffer, streamsize, R, pdf_dev->xref_stream.file);
- stream_write(pdf_dev->strm, Buffer, streamsize);
- streamsize = 0;
- }
- }
-
- pprintd1(pdf_dev->strm, "trailer\n<<\n/Size %d\n/Root 1 0 R\n/ID [", pdf_dev->NextObject);
- pdf_compute_fileID(pdf_dev, fileID, CreationDate, Title, Producer);
- write_fileID(pdf_dev->strm, (const byte *)&fileID, 16);
- write_fileID(pdf_dev->strm, (const byte *)&fileID, 16);
- pprintd1(pdf_dev->strm, "]\n>>\nstartxref\n%d\n%%%%EOF\n", pdf_dev->xrefOffset);
- }
+ code = pdf_image_finish_file(pdf_dev, 1);
+ if (code < 0)
+ return code;
- if (pdf_dev->icclink != NULL)
- {
- pdf_dev->icclink->procs.free_link(pdf_dev->icclink);
- gsicc_free_link_dev(pdev->memory, pdf_dev->icclink);
- pdf_dev->icclink = NULL;
- }
- if (pdf_dev->strm) {
- sflush(pdf_dev->strm);
- pdf_dev->strm->file = NULL; /* Don't close underlying file when we free the stream */
- gs_free_object(pdf_dev->memory->non_gc_memory, pdf_dev->strm, "pdfimage_close(strm)");
- pdf_dev->strm = 0;
- gs_free_object(pdf_dev->memory->non_gc_memory, pdf_dev->strm_buf, "pdfimage_close(strmbuf)");
- pdf_dev->strm_buf = 0;
- }
- if (pdf_dev->Pages) {
- pdfimage_page *p = pdf_dev->Pages, *n;
- do {
- n = p->next;
- gs_free_object(pdf_dev->memory->non_gc_memory, p,
- "pdfimage free a page");
- p = n;
- }while (p);
- }
code = PCLm_close_temp_file(pdf_dev, &pdf_dev->xref_stream, 0);
code1 = PCLm_close_temp_file(pdf_dev, &pdf_dev->temp_stream, 0);
if (code == 0)
diff --git a/windows/ghostscript.vcproj b/windows/ghostscript.vcproj
index 39820e5ec..e86f093c1 100644
--- a/windows/ghostscript.vcproj
+++ b/windows/ghostscript.vcproj
@@ -5869,11 +5869,15 @@
RelativePath="..\devices\gdevpcx.c"
>
</File>
- <File
- RelativePath="..\devices\gdevpe.c"
+ <File
+ RelativePath="..\devices\gdevpdfimg.c"
>
- </File>
- <File
+ </File>
+ <File
+ RelativePath="..\devices\gdevpe.c"
+ >
+ </File>
+ <File
RelativePath="..\devices\gdevperm.c"
>
</File>