summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Sharp <ken.sharp@artifex.com>2018-07-26 16:03:30 +0100
committerKen Sharp <ken.sharp@artifex.com>2018-08-09 16:05:56 +0100
commit12a188d18097e2161f3d653b677e55f558d57faf (patch)
tree1caeda9474ed737daf9c389766ded728df377352
parentae5fddd0bd7b06215235090470d3f9297faa24bb (diff)
downloadghostpdl-12a188d18097e2161f3d653b677e55f558d57faf.tar.gz
Device Subclassing - add a finalize routine for subclassing devices
After some research its clear that subclassing devices do actually need their own specific finalize routine, borrowing the device finalize leads to problems. So here we define a default version. All subclassing devices should either use this routine, or implement their own of the allocate additional memory. In that case the specific finalize routine should clean up its own memory and then call the default one. Add default subclassing finalize to system devices
-rw-r--r--base/gdevflp.c2
-rw-r--r--base/gdevmplt.c2
-rw-r--r--base/gdevoflt.c2
-rw-r--r--base/gdevsclass.c20
-rw-r--r--base/gdevsclass.h1
5 files changed, 24 insertions, 3 deletions
diff --git a/base/gdevflp.c b/base/gdevflp.c
index f35145fcb..3e4e6abdb 100644
--- a/base/gdevflp.c
+++ b/base/gdevflp.c
@@ -112,7 +112,7 @@ static dev_proc_process_page(flp_process_page);
#define public_st_flp_device() /* in gsdevice.c */\
gs_public_st_complex_only(st_flp_device, gx_device, "first_lastpage",\
- 0, flp_enum_ptrs, flp_reloc_ptrs, gx_device_finalize)
+ 0, flp_enum_ptrs, flp_reloc_ptrs, default_subclass_finalize)
static
ENUM_PTRS_WITH(flp_enum_ptrs, gx_device *dev);
diff --git a/base/gdevmplt.c b/base/gdevmplt.c
index 8971532d8..09804a55e 100644
--- a/base/gdevmplt.c
+++ b/base/gdevmplt.c
@@ -52,7 +52,7 @@ static dev_proc_get_color_mapping_procs(pcl_mono_palette_get_color_mapping_procs
/* GC descriptor */
#define public_st_pcl_mono_palette_device() /* in gsdevice.c */\
gs_public_st_complex_only(st_pcl_mono_palette_device, gx_device, "PCL_Mono_Palette",\
- 0, pcl_mono_palette_enum_ptrs, pcl_mono_palette_reloc_ptrs, gx_device_finalize)
+ 0, pcl_mono_palette_enum_ptrs, pcl_mono_palette_reloc_ptrs, default_subclass_finalize)
static
ENUM_PTRS_WITH(pcl_mono_palette_enum_ptrs, gx_device *dev);
diff --git a/base/gdevoflt.c b/base/gdevoflt.c
index c89574302..966012d48 100644
--- a/base/gdevoflt.c
+++ b/base/gdevoflt.c
@@ -74,7 +74,7 @@ static dev_proc_strip_tile_rect_devn(obj_filter_strip_tile_rect_devn);
#define public_st_obj_filter_device() /* in gsdevice.c */\
gs_public_st_complex_only(st_obj_filter_device, gx_device, "object filter",\
- 0, obj_filter_enum_ptrs, obj_filter_reloc_ptrs, gx_device_finalize)
+ 0, obj_filter_enum_ptrs, obj_filter_reloc_ptrs, default_subclass_finalize)
static
ENUM_PTRS_WITH(obj_filter_enum_ptrs, gx_device *dev);
diff --git a/base/gdevsclass.c b/base/gdevsclass.c
index 91d56475e..44ee4f607 100644
--- a/base/gdevsclass.c
+++ b/base/gdevsclass.c
@@ -886,3 +886,23 @@ int default_subclass_process_page(gx_device *dev, gx_process_page_options_t *opt
return 0;
}
+
+void default_subclass_finalize(const gs_memory_t *cmem, void *vptr)
+{
+ gx_device * const dev = (gx_device *)vptr;
+ generic_subclass_data *psubclass_data = (generic_subclass_data *)dev->subclass_data;
+ (void)cmem; /* unused */
+
+ if (psubclass_data) {
+ gs_free_object(dev->memory->non_gc_memory, psubclass_data, "gx_epo_finalize(suclass data)");
+ dev->subclass_data = NULL;
+ }
+ if (dev->parent)
+ dev->parent->child = dev->child;
+ if (dev->child)
+ dev->child->parent = dev->parent;
+ if (dev->icc_struct)
+ rc_decrement(dev->icc_struct, "finalize subclass device");
+ if (dev->PageList)
+ rc_decrement(dev->PageList, "finalize subclass device");
+}
diff --git a/base/gdevsclass.h b/base/gdevsclass.h
index b7d120fb3..0ce3c37e3 100644
--- a/base/gdevsclass.h
+++ b/base/gdevsclass.h
@@ -102,4 +102,5 @@ dev_proc_strip_tile_rect_devn(default_subclass_strip_tile_rect_devn);
dev_proc_copy_alpha_hl_color(default_subclass_copy_alpha_hl_color);
dev_proc_process_page(default_subclass_process_page);
+void default_subclass_finalize(const gs_memory_t *cmem, void *vptr);
#endif /* gdev_obj_filter_INCLUDED */