[gs-cvs] rev 7898 - in trunk/gs: lib src
alexcher at ghostscript.com
alexcher at ghostscript.com
Thu May 3 21:18:47 PDT 2007
Author: alexcher
Date: 2007-05-03 21:18:47 -0700 (Thu, 03 May 2007)
New Revision: 7898
Modified:
trunk/gs/lib/pdf_draw.ps
trunk/gs/src/gdevpdfp.c
Log:
Move allocation of a large structure from the stack to the heap to avoid
C stack overflow on Windows NT that allocates 12K less of the stack
space than requested by the application. Bug 688998.
DIFFERENCES:
None
Modified: trunk/gs/lib/pdf_draw.ps
===================================================================
--- trunk/gs/lib/pdf_draw.ps 2007-05-04 00:15:08 UTC (rev 7897)
+++ trunk/gs/lib/pdf_draw.ps 2007-05-04 04:18:47 UTC (rev 7898)
@@ -1451,7 +1451,7 @@
dup /AP known {
dup 1 exch drawwidget
} {
- (Piush button without appearance stream is not yet implemented) =
+ (Push button without appearance stream is not yet implemented) =
} ifelse
} {
16#10000 and 0 ne {
Modified: trunk/gs/src/gdevpdfp.c
===================================================================
--- trunk/gs/src/gdevpdfp.c 2007-05-04 00:15:08 UTC (rev 7897)
+++ trunk/gs/src/gdevpdfp.c 2007-05-04 04:18:47 UTC (rev 7898)
@@ -210,19 +210,17 @@
/* ---------------- Put parameters ---------------- */
-/* Put parameters. */
-int
-gdev_pdf_put_params(gx_device * dev, gs_param_list * plist)
+/* Put parameters, implementation */
+private int
+gdev_pdf_put_params_impl(gx_device * dev, const gx_device_pdf * save_dev, gs_param_list * plist)
{
+ int ecode, code;
gx_device_pdf *pdev = (gx_device_pdf *) dev;
- int ecode, code;
- gx_device_pdf save_dev;
float cl = (float)pdev->CompatibilityLevel;
bool locked = pdev->params.LockDistillerParams;
gs_param_name param_name;
enum psdf_color_conversion_strategy save_ccs = pdev->params.ColorConversionStrategy;
-
pdev->pdf_memory = gs_memory_stable(pdev->memory);
/*
* If this is a pseudo-parameter (pdfmark or DSC),
@@ -294,8 +292,6 @@
param_signal_error(plist, param_name, ecode = gs_error_rangecheck);
}
- save_dev = *pdev;
-
switch (code = param_read_float(plist, (param_name = "CompatibilityLevel"), &cl)) {
default:
ecode = code;
@@ -350,11 +346,11 @@
*/
long fon = pdev->FirstObjectNumber;
- if (fon != save_dev.FirstObjectNumber) {
+ if (fon != save_dev->FirstObjectNumber) {
if (fon <= 0 || fon > 0x7fff0000 ||
(pdev->next_id != 0 &&
pdev->next_id !=
- save_dev.FirstObjectNumber + pdf_num_initial_ids)
+ save_dev->FirstObjectNumber + pdf_num_initial_ids)
) {
ecode = gs_error_rangecheck;
param_signal_error(plist, "FirstObjectNumber", ecode);
@@ -505,7 +501,7 @@
dev->HWResolution[1] / factor);
}
#undef MAX_EXTENT
- if (pdev->FirstObjectNumber != save_dev.FirstObjectNumber) {
+ if (pdev->FirstObjectNumber != save_dev->FirstObjectNumber) {
if (pdev->xref.file != 0) {
fseek(pdev->xref.file, 0L, SEEK_SET);
pdf_initialize_ids(pdev);
@@ -516,23 +512,41 @@
return 0;
fail:
/* Restore all the parameters to their original state. */
- pdev->version = save_dev.version;
- pdf_set_process_color_model(pdev, save_dev.pcm_color_info_index);
- pdev->saved_fill_color = save_dev.saved_fill_color;
- pdev->saved_stroke_color = save_dev.saved_fill_color;
+ pdev->version = save_dev->version;
+ pdf_set_process_color_model(pdev, save_dev->pcm_color_info_index);
+ pdev->saved_fill_color = save_dev->saved_fill_color;
+ pdev->saved_stroke_color = save_dev->saved_fill_color;
{
const gs_param_item_t *ppi = pdf_param_items;
for (; ppi->key; ++ppi)
memcpy((char *)pdev + ppi->offset,
- (char *)&save_dev + ppi->offset,
+ (char *)save_dev + ppi->offset,
gs_param_type_sizes[ppi->type]);
- pdev->ForOPDFRead = save_dev.ForOPDFRead;
- pdev->OPDFReadProcsetPath = save_dev.OPDFReadProcsetPath;
+ pdev->ForOPDFRead = save_dev->ForOPDFRead;
+ pdev->OPDFReadProcsetPath = save_dev->OPDFReadProcsetPath;
}
return ecode;
}
+/* Put parameters */
+int
+gdev_pdf_put_params(gx_device * dev, gs_param_list * plist)
+{
+ int code;
+ gx_device_pdf *pdev = (gx_device_pdf *) dev;
+ gs_memory_t *mem = gs_memory_stable(pdev->memory);
+ gx_device_pdf *save_dev = gs_malloc(mem, sizeof(gx_device_pdf), 1,
+ "saved gx_device_pdf");
+
+ if (!save_dev)
+ return_error(gs_error_VMerror);
+ memcpy(save_dev, pdev, sizeof(gx_device_pdf));
+ code = gdev_pdf_put_params_impl(dev, save_dev, plist);
+ gs_free(mem, save_dev, sizeof(gx_device_pdf), 1, "saved gx_device_pdf");
+ return code;
+}
+
/* ---------------- Process DSC comments ---------------- */
private int
More information about the gs-cvs
mailing list