diff options
author | Ken Sharp <ken.sharp@artifex.com> | 2018-07-26 16:03:30 +0100 |
---|---|---|
committer | Ken Sharp <ken.sharp@artifex.com> | 2018-08-09 16:05:56 +0100 |
commit | 12a188d18097e2161f3d653b677e55f558d57faf (patch) | |
tree | 1caeda9474ed737daf9c389766ded728df377352 | |
parent | ae5fddd0bd7b06215235090470d3f9297faa24bb (diff) | |
download | ghostpdl-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.c | 2 | ||||
-rw-r--r-- | base/gdevmplt.c | 2 | ||||
-rw-r--r-- | base/gdevoflt.c | 2 | ||||
-rw-r--r-- | base/gdevsclass.c | 20 | ||||
-rw-r--r-- | base/gdevsclass.h | 1 |
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 */ |