diff options
-rw-r--r-- | base/gdevp14.c | 3 | ||||
-rw-r--r-- | psi/zdevice.c | 18 |
2 files changed, 18 insertions, 3 deletions
diff --git a/base/gdevp14.c b/base/gdevp14.c index 3019131c7..537a56475 100644 --- a/base/gdevp14.c +++ b/base/gdevp14.c | |||
@@ -5617,7 +5617,8 @@ pdf14_dev_spec_op(gx_device *pdev, int dev_spec_op, | |||
5617 | return 0; | 5617 | return 0; |
5618 | } | 5618 | } |
5619 | } | 5619 | } |
5620 | if (dev_spec_op == gxdso_get_dev_param || dev_spec_op == gxdso_restrict_bbox) { | 5620 | if (dev_spec_op == gxdso_get_dev_param || dev_spec_op == gxdso_restrict_bbox |
5621 | || dev_spec_op == gxdso_current_output_device) { | ||
5621 | return dev_proc(p14dev->target, dev_spec_op)(p14dev->target, dev_spec_op, data, size); | 5622 | return dev_proc(p14dev->target, dev_spec_op)(p14dev->target, dev_spec_op, data, size); |
5622 | } | 5623 | } |
5623 | 5624 | ||
diff --git a/psi/zdevice.c b/psi/zdevice.c index 7ede0a181..bd2c542fb 100644 --- a/psi/zdevice.c +++ b/psi/zdevice.c | |||
@@ -509,16 +509,30 @@ int | |||
509 | zsetdevice(i_ctx_t *i_ctx_p) | 509 | zsetdevice(i_ctx_t *i_ctx_p) |
510 | { | 510 | { |
511 | gx_device *odev = NULL, *dev = gs_currentdevice(igs); | 511 | gx_device *odev = NULL, *dev = gs_currentdevice(igs); |
512 | gx_device *ndev = NULL; | ||
512 | os_ptr op = osp; | 513 | os_ptr op = osp; |
513 | int code = dev_proc(dev, dev_spec_op)(dev, | 514 | int code = dev_proc(dev, dev_spec_op)(dev, |
514 | gxdso_current_output_device, (void *)&odev, 0); | 515 | gxdso_current_output_device, (void *)&odev, 0); |
515 | 516 | ||
516 | if (code < 0) | 517 | if (code < 0) |
517 | return code; | 518 | return code; |
518 | |||
519 | check_write_type(*op, t_device); | 519 | check_write_type(*op, t_device); |
520 | |||
521 | /* slightly icky special case: the new device may not have had | ||
522 | * it's procs initialised, at this point - but we need to check | ||
523 | * whether we're being asked to change the device here | ||
524 | */ | ||
525 | if (dev_proc((op->value.pdevice), dev_spec_op) == NULL) | ||
526 | ndev = op->value.pdevice; | ||
527 | else | ||
528 | code = dev_proc((op->value.pdevice), dev_spec_op)(op->value.pdevice, | ||
529 | gxdso_current_output_device, (void *)&ndev, 0); | ||
530 | |||
531 | if (code < 0) | ||
532 | return code; | ||
533 | |||
520 | if (odev->LockSafetyParams) { /* do additional checking if locked */ | 534 | if (odev->LockSafetyParams) { /* do additional checking if locked */ |
521 | if(op->value.pdevice != odev) /* don't allow a different device */ | 535 | if(ndev != odev) /* don't allow a different device */ |
522 | return_error(gs_error_invalidaccess); | 536 | return_error(gs_error_invalidaccess); |
523 | } | 537 | } |
524 | dev->ShowpageCount = 0; | 538 | dev->ShowpageCount = 0; |