diff options
author | Robin Watts <Robin.Watts@artifex.com> | 2021-03-11 17:05:37 +0000 |
---|---|---|
committer | Chris Liddell <chris.liddell@artifex.com> | 2021-03-15 15:24:28 +0000 |
commit | 1f06cee57841f0cde5ea299254d8a8a62ffae1e3 (patch) | |
tree | 6047960bb4e8d79fa52ef995cba73e11de5e8d62 | |
parent | 1eaeefb71d3ca569de8d4c9d8301be7b64779593 (diff) | |
download | ghostpdl-1f06cee57841f0cde5ea299254d8a8a62ffae1e3.tar.gz |
Extract clist setup code from prn and display device.
Move to a common clist_mutatable function.
-rw-r--r-- | base/gdevprn.c | 111 | ||||
-rw-r--r-- | base/gxclist.c | 105 | ||||
-rw-r--r-- | base/gxclist.h | 10 | ||||
-rw-r--r-- | devices/gdevdsp.c | 79 |
4 files changed, 130 insertions, 175 deletions
diff --git a/base/gdevprn.c b/base/gdevprn.c index f374f3adf..55a59b18d 100644 --- a/base/gdevprn.c +++ b/base/gdevprn.c @@ -218,107 +218,6 @@ gdev_prn_dev_spec_op(gx_device *pdev, int dev_spec_op, void *data, int size) return gx_default_dev_spec_op(pdev, dev_spec_op, data, size); } -static int /* returns 0 ok, else -ve error cde */ -gdev_prn_setup_as_command_list(gx_device *pdev, gs_memory_t *buffer_memory, - byte **the_memory, - const gdev_space_params *space_params, - bool bufferSpace_is_exact) -{ - gx_device_printer * const ppdev = (gx_device_printer *)pdev; - gx_device *target = pdev; - uint space; - int code; - gx_device_clist *const pclist_dev = (gx_device_clist *)pdev; - gx_device_clist_common * const pcldev = &pclist_dev->common; - bool reallocate = *the_memory != 0; - byte *base; - bool save_is_open = pdev->is_open; /* Save around temporary failure in open_c loop */ - - while (target->parent != NULL) { - target = target->parent; - gx_update_from_subclass(target); - } - - /* Try to allocate based simply on param-requested buffer size */ -#ifdef DEBUGGING_HACKS -#define BACKTRACE(first_arg)\ - BEGIN\ - ulong *fp_ = (ulong *)&first_arg - 2;\ - for (; fp_ && (fp_[1] & 0xff000000) == 0x08000000; fp_ = (ulong *)*fp_)\ - dmprintf2(buffer_memory, " fp="PRI_INTPTR" ip=0x%lx\n", (intptr_t)fp_, fp_[1]);\ - END -dmputs(buffer_memory, "alloc buffer:\n"); -BACKTRACE(pdev); -#endif /*DEBUGGING_HACKS*/ - for ( space = space_params->BufferSpace; ; ) { - base = (reallocate ? - (byte *)gs_resize_object(buffer_memory, *the_memory, space, - "cmd list buffer") : - gs_alloc_bytes(buffer_memory, space, - "cmd list buffer")); - if (base != 0) - break; - if (bufferSpace_is_exact || (space >>= 1) < PRN_MIN_BUFFER_SPACE) - break; - } - if (base == 0) - return_error(gs_error_VMerror); - *the_memory = base; - - /* Try opening the command list, to see if we allocated */ - /* enough buffer space. */ -open_c: - ppdev->buf = base; - ppdev->buffer_space = space; - pclist_dev->common.orig_spec_op = gdev_prn_forwarding_dev_spec_op; - clist_init_io_procs(pclist_dev, ppdev->BLS_force_memory); - clist_init_params(pclist_dev, base, space, target, - ppdev->printer_procs.buf_procs, - space_params->band, - false, /* do_not_open_or_close_bandfiles */ - (ppdev->bandlist_memory == 0 ? pdev->memory->non_gc_memory: - ppdev->bandlist_memory), - ppdev->clist_disable_mask, - ppdev->page_uses_transparency, - ppdev->page_uses_overprint); - code = (*gs_clist_device_procs.open_device)( (gx_device *)pcldev ); - if (code < 0) { - /* If there wasn't enough room, and we haven't */ - /* already shrunk the buffer, try enlarging it. */ - if ( code == gs_error_rangecheck && - space >= space_params->BufferSpace && - !bufferSpace_is_exact - ) { - space += space / 8; - if (reallocate) { - base = gs_resize_object(buffer_memory, - *the_memory, space, - "cmd list buf(retry open)"); - if (base != 0) - *the_memory = base; - } else { - gs_free_object(buffer_memory, base, - "cmd list buf(retry open)"); - *the_memory = base = - gs_alloc_bytes(buffer_memory, space, - "cmd list buf(retry open)"); - } - ppdev->buf = *the_memory; - if (base != 0) { - pdev->is_open = save_is_open; /* allow for success when we loop */ - goto open_c; - } - } - /* Failure. */ - if (!reallocate) { - gs_free_object(buffer_memory, base, "cmd list buf"); - ppdev->buffer_space = 0; - *the_memory = 0; - } - } - return code; -} - static bool /* ret true if device was cmd list, else false */ gdev_prn_tear_down(gx_device *pdev, byte **the_memory) { @@ -526,9 +425,13 @@ gdev_prn_allocate(gx_device *pdev, gdev_space_params *new_space_params, ppdev->bg_print->obfile = ppdev->bg_print->ocfile = NULL; } - code = gdev_prn_setup_as_command_list(pdev, buffer_memory, - &the_memory, &space_params, - !bufferSpace_is_default); + code = clist_mutate_to_clist((gx_device_clist_mutatable *)pdev, + buffer_memory, + &the_memory, &space_params, + !bufferSpace_is_default, + &ppdev->printer_procs.buf_procs, + gdev_prn_forwarding_dev_spec_op, + PRN_MIN_BUFFER_SPACE); if (ecode == 0) ecode = code; diff --git a/base/gxclist.c b/base/gxclist.c index f7bbd7b24..eee3c57ff 100644 --- a/base/gxclist.c +++ b/base/gxclist.c @@ -1474,3 +1474,108 @@ RELOC_PTRS_WITH(device_clist_mutatable_reloc_ptrs, gx_device_clist_mutatable *pd RELOC_PREFIX(st_device_forward); } RELOC_PTRS_END public_st_device_clist_mutatable(); + +int +clist_mutate_to_clist(gx_device_clist_mutatable *pdev, + gs_memory_t *buffer_memory, + byte **the_memory, + const gdev_space_params *space_params, + bool bufferSpace_is_exact, + const gx_device_buf_procs_t *buf_procs, + dev_proc_dev_spec_op(dev_spec_op), + uint min_buffer_space) +{ + gx_device *target = (gx_device *)pdev; + uint space; + int code; + gx_device_clist *const pclist_dev = (gx_device_clist *)pdev; + gx_device_clist_common * const pcldev = &pclist_dev->common; + bool reallocate = the_memory != NULL && *the_memory != NULL; + byte *base; + bool save_is_open = pdev->is_open; /* Save around temporary failure in open_c loop */ + + while (target->parent != NULL) { + target = target->parent; + gx_update_from_subclass(target); + } + + /* Try to allocate based simply on param-requested buffer size */ +#ifdef DEBUGGING_HACKS +#define BACKTRACE(first_arg)\ + BEGIN\ + ulong *fp_ = (ulong *)&first_arg - 2;\ + for (; fp_ && (fp_[1] & 0xff000000) == 0x08000000; fp_ = (ulong *)*fp_)\ + dmprintf2(buffer_memory, " fp="PRI_INTPTR" ip=0x%lx\n", (intptr_t)fp_, fp_[1]);\ + END +dmputs(buffer_memory, "alloc buffer:\n"); +BACKTRACE(pdev); +#endif /*DEBUGGING_HACKS*/ + for ( space = space_params->BufferSpace; ; ) { + base = (reallocate ? + (byte *)gs_resize_object(buffer_memory, *the_memory, space, + "cmd list buffer") : + gs_alloc_bytes(buffer_memory, space, + "cmd list buffer")); + if (base != 0) + break; + if (bufferSpace_is_exact || (space >>= 1) < min_buffer_space) + break; + } + if (base == 0) + return_error(gs_error_VMerror); + if (the_memory) + *the_memory = base; + + /* Try opening the command list, to see if we allocated */ + /* enough buffer space. */ +open_c: + pdev->buf = base; + pdev->buffer_space = space; + pclist_dev->common.orig_spec_op = dev_spec_op; + clist_init_io_procs(pclist_dev, pdev->BLS_force_memory); + clist_init_params(pclist_dev, base, space, target, + *buf_procs, + space_params->band, + false, /* do_not_open_or_close_bandfiles */ + (pdev->bandlist_memory == 0 ? pdev->memory->non_gc_memory: + pdev->bandlist_memory), + pdev->clist_disable_mask, + pdev->page_uses_transparency, + pdev->page_uses_overprint); + code = (*gs_clist_device_procs.open_device)( (gx_device *)pcldev ); + if (code < 0) { + /* If there wasn't enough room, and we haven't */ + /* already shrunk the buffer, try enlarging it. */ + if ( code == gs_error_rangecheck && + space >= space_params->BufferSpace && + !bufferSpace_is_exact + ) { + space += space / 8; + if (reallocate) { + base = gs_resize_object(buffer_memory, + *the_memory, space, + "cmd list buf(retry open)"); + if (base != 0) + *the_memory = base; + } else { + gs_free_object(buffer_memory, base, + "cmd list buf(retry open)"); + *the_memory = base = + gs_alloc_bytes(buffer_memory, space, + "cmd list buf(retry open)"); + } + pdev->buf = *the_memory; + if (base != 0) { + pdev->is_open = save_is_open; /* allow for success when we loop */ + goto open_c; + } + } + /* Failure. */ + if (!reallocate) { + gs_free_object(buffer_memory, base, "cmd list buf"); + pdev->buffer_space = 0; + *the_memory = NULL; + } + } + return code; +} diff --git a/base/gxclist.h b/base/gxclist.h index e962e3725..f5016d5eb 100644 --- a/base/gxclist.h +++ b/base/gxclist.h @@ -666,4 +666,14 @@ extern_st(st_device_clist_mutatable); #define CLIST_MUTATABLE_HAS_MUTATED(pdev) \ (((gx_device_clist_mutatable *)(pdev))->buffer_space != 0) +int +clist_mutate_to_clist(gx_device_clist_mutatable *pdev, + gs_memory_t *buffer_memory, + byte **the_memory, + const gdev_space_params *space_params, + bool bufferSpace_is_exact, + const gx_device_buf_procs_t *buf_procs, + dev_proc_dev_spec_op(dev_spec_op), + uint min_buffer_space); + #endif /* gxclist_INCLUDED */ diff --git a/devices/gdevdsp.c b/devices/gdevdsp.c index bf492ba5e..9944188bb 100644 --- a/devices/gdevdsp.c +++ b/devices/gdevdsp.c @@ -1677,76 +1677,6 @@ static gx_device_buf_procs_t display_buf_procs = { gx_default_destroy_buf_device }; -static int /* returns 0 ok, else -ve error cde */ -setup_as_clist(gx_device_display *ddev, gs_memory_t *buffer_memory) -{ - gdev_space_params space_params = ddev->space_params; - gx_device *target = (gx_device *)ddev; - uint space; - int code; - gx_device_clist *const pclist_dev = (gx_device_clist *)ddev; - gx_device_clist_common * const pcldev = &pclist_dev->common; - byte *base; - bool save_is_open = ddev->is_open; /* Save around temporary failure in open_c loop */ - - while (target->parent != NULL) { - target = target->parent; - gx_update_from_subclass(target); - } - - /* Try to allocate based simply on param-requested buffer size */ - for ( space = space_params.BufferSpace; ; ) { - base = gs_alloc_bytes(buffer_memory, space, - "cmd list buffer"); - if (base != NULL) - break; - if ((space >>= 1) < MIN_BUFFER_SPACE) - break; - } - if (base == NULL) - return_error(gs_error_VMerror); - - /* Try opening the command list, to see if we allocated */ - /* enough buffer space. */ -open_c: - ddev->buf = base; - ddev->buffer_space = space; - pclist_dev->common.orig_spec_op = ddev->orig_procs.dev_spec_op; - clist_init_io_procs(pclist_dev, ddev->BLS_force_memory); - clist_init_params(pclist_dev, base, space, target, - display_buf_procs, - space_params.band, - false, /* do_not_open_or_close_bandfiles */ - (ddev->bandlist_memory == NULL ? - ddev->memory->non_gc_memory: - ddev->bandlist_memory), - ddev->clist_disable_mask, - ddev->page_uses_transparency, - ddev->page_uses_overprint); - code = (*gs_clist_device_procs.open_device)( (gx_device *)pcldev ); - if (code < 0) { - /* If there wasn't enough room, and we haven't */ - /* already shrunk the buffer, try enlarging it. */ - if (code == gs_error_rangecheck && - space >= space_params.BufferSpace) { - space += space / 8; - gs_free_object(buffer_memory, base, - "cmd list buf(retry open)"); - base = gs_alloc_bytes(buffer_memory, space, - "cmd list buf(retry open)"); - ddev->buf = base; - if (base != NULL) { - ddev->is_open = save_is_open; /* allow for success when we loop */ - goto open_c; - } - } - /* Failure. */ - gs_free_object(buffer_memory, base, "cmd list buf"); - ddev->buffer_space = 0; - } - return code; -} - /* Allocate the backing bitmap. */ static int display_alloc_bitmap(gx_device_display * ddev, gx_device * param_dev) @@ -1812,7 +1742,14 @@ display_alloc_bitmap(gx_device_display * ddev, gx_device * param_dev) return_error(gs_error_VMerror); } /* Let's set up as a clist. */ - ccode = setup_as_clist(ddev, ddev->memory->non_gc_memory); + ccode = clist_mutate_to_clist((gx_device_clist_mutatable *)ddev, + ddev->memory->non_gc_memory, + NULL, + &ddev->space_params, + 0, + &display_buf_procs, + ddev->orig_procs.dev_spec_op, + MIN_BUFFER_SPACE); if (ccode >= 0) ddev->procs = gs_clist_device_procs; } else { |