summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'base/gdevflp.c')
-rw-r--r--base/gdevflp.c103
1 files changed, 98 insertions, 5 deletions
diff --git a/base/gdevflp.c b/base/gdevflp.c
index 0ad19656..7b02bc35 100644
--- a/base/gdevflp.c
+++ b/base/gdevflp.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2019 Artifex Software, Inc.
+/* Copyright (C) 2001-2020 Artifex Software, Inc.
All Rights Reserved.
This software is provided AS-IS with no warranty, either express or
@@ -419,7 +419,7 @@ int flp_close_device(gx_device *dev)
if (psubclass_data->PageArraySize)
{
- gs_free(dev->memory->non_gc_memory, psubclass_data->PageArray, 1, , "array of pages selected");
+ gs_free(dev->memory->non_gc_memory, psubclass_data->PageArray, 1, psubclass_data->PageArraySize, "array of pages selected");
psubclass_data->PageArray = 0;
psubclass_data->PageArraySize = 0;
}
@@ -504,23 +504,116 @@ int flp_get_bits(gx_device *dev, int y, byte *data, byte **actual_data)
return gx_default_get_bits(dev, y, data, actual_data);
}
+static void
+flp_rc_free_pages_list(gs_memory_t * mem, void *ptr_in, client_name_t cname)
+{
+ gdev_pagelist *PageList = (gdev_pagelist *)ptr_in;
+
+ if (PageList->rc.ref_count <= 1) {
+ gs_free(mem->non_gc_memory, PageList->Pages, 1, PagesSize, "free page list");
+ gs_free(mem->non_gc_memory, PageList, 1, sizeof(gdev_pagelist), "free structure to hold page list");
+ }
+}
+
int
flp_put_params(gx_device * dev, gs_param_list * plist)
{
bool temp_bool = false;
- int code;
+ int code, ecode;
+ gs_param_string pagelist;
+
+ code = param_read_int(plist, "FirstPage", &dev->FirstPage);
+ if (code < 0)
+ ecode = code;
+ if (code == 0) {
+ first_last_subclass_data *psubclass_data = dev->subclass_data;
+
+ dev->DisablePageHandler = false;
+ psubclass_data->PageCount = 0;
+ if (dev->PageList) {
+ rc_decrement(dev->PageList, "flp_put_params");
+ dev->PageList = NULL;
+ }
+ if (psubclass_data->PageArray != NULL) {
+ gs_free(dev->memory->non_gc_memory, psubclass_data->PageArray, 1, psubclass_data->PageArraySize, "array of pages selected");
+ psubclass_data->PageArray = NULL;
+ psubclass_data->PageArraySize = 0;
+ }
+ }
+
+ code = param_read_int(plist, "LastPage", &dev->LastPage);
+ if (code < 0)
+ ecode = code;
+ if (code == 0) {
+ first_last_subclass_data *psubclass_data = dev->subclass_data;
+
+ dev->DisablePageHandler = false;
+ psubclass_data->PageCount = 0;
+ if (dev->PageList) {
+ rc_decrement(dev->PageList, "flp_put_params");
+ dev->PageList = NULL;
+ }
+ if (psubclass_data->PageArray != NULL) {
+ gs_free(dev->memory->non_gc_memory, psubclass_data->PageArray, 1, psubclass_data->PageArraySize, "array of pages selected");
+ psubclass_data->PageArray = NULL;
+ psubclass_data->PageArraySize = 0;
+ }
+ }
code = param_read_bool(plist, "DisablePageHandler", &temp_bool);
if (code < 0)
- return code;
- if (code == 0)
+ ecode = code;
+ if (code == 0) {
dev->DisablePageHandler = temp_bool;
+ if (dev->DisablePageHandler == false) {
+ first_last_subclass_data *psubclass_data = dev->subclass_data;
+
+ psubclass_data->PageCount = 0;
+ }
+ }
+
+ code = param_read_string(plist, "PageList", &pagelist);
+ if (code < 0)
+ ecode = code;
+
+ if (code == 0 && pagelist.size > 0) {
+ first_last_subclass_data *psubclass_data = dev->subclass_data;
+
+ if (dev->PageList)
+ rc_decrement(dev->PageList, "flp_put_params");
+
+ if (psubclass_data->PageArray != NULL) {
+ gs_free(dev->memory->non_gc_memory, psubclass_data->PageArray, 1, psubclass_data->PageArraySize, "array of pages selected");
+ psubclass_data->PageArray = NULL;
+ psubclass_data->PageArraySize = 0;
+ }
+
+ dev->PageList = (gdev_pagelist *)gs_alloc_bytes(dev->memory->non_gc_memory, sizeof(gdev_pagelist), "structure to hold page list");
+ if (!dev->PageList)
+ return gs_note_error(gs_error_VMerror);
+ dev->PageList->Pages = (void *)gs_alloc_bytes(dev->memory->non_gc_memory, pagelist.size + 1, "String to hold page list");
+ if (!dev->PageList->Pages){
+ gs_free(dev->memory->non_gc_memory, dev->PageList, 1, sizeof(gdev_pagelist), "free structure to hold page list");
+ dev->PageList = 0;
+ return gs_note_error(gs_error_VMerror);
+ }
+ memset(dev->PageList->Pages, 0x00, pagelist.size + 1);
+ memcpy(dev->PageList->Pages, pagelist.data, pagelist.size);
+ dev->PageList->PagesSize = pagelist.size + 1;
+ rc_init_free(dev->PageList, dev->memory->non_gc_memory, 1, flp_rc_free_pages_list);
+ psubclass_data->ProcessedPageList = false;
+ dev->DisablePageHandler = false;
+ psubclass_data->PageCount = 0;
+ }
code = default_subclass_put_params(dev, plist);
if (code < 0)
return code;
+ if (ecode < 0)
+ code = ecode;
+
return code;
}