diff options
Diffstat (limited to 'gs/psi/idisp.c')
-rw-r--r-- | gs/psi/idisp.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/gs/psi/idisp.c b/gs/psi/idisp.c new file mode 100644 index 000000000..e26ec19a2 --- /dev/null +++ b/gs/psi/idisp.c @@ -0,0 +1,106 @@ +/* Copyright (C) 2001-2006 Artifex Software, Inc. + All Rights Reserved. + + This software is provided AS-IS with no warranty, either express or + implied. + + This software is distributed under license and may not be copied, modified + or distributed except as expressly authorized under the terms of that + license. Refer to licensing information at http://www.artifex.com/ + or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, + San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. +*/ + +/* idisp.c */ +/* $Id$ */ + +/* + * This allows the interpreter to set the callback structure + * of the "display" device. This must set at the end of + * initialization and before the device is used. + * This is harmless if the 'display' device is not included. + * If gsapi_set_display_callback() is not called, this code + * won't even be used. + */ + +#include "stdio_.h" +#include "stdpre.h" +#include "iapi.h" +#include "ghost.h" +#include "gp.h" +#include "gscdefs.h" +#include "gsmemory.h" +#include "gstypes.h" +#include "gsdevice.h" +#include "iref.h" +#include "imain.h" +#include "iminst.h" +#include "oper.h" +#include "ostack.h" +#include "gx.h" +#include "gxdevice.h" +#include "gxdevmem.h" +#include "idisp.h" +#include "gdevdevn.h" +#include "gsequivc.h" +#include "gdevdsp.h" +#include "gdevdsp2.h" + +int +display_set_callback(gs_main_instance *minst, display_callback *callback) +{ + i_ctx_t *i_ctx_p = minst->i_ctx_p; + bool was_open; + int code; + int exit_code = 0; + os_ptr op = osp; + gx_device *dev; + gx_device_display *ddev; + + /* If display device exists, copy prototype if needed and return + * device true + * If it doesn't exist, return + * false + */ + const char getdisplay[] = + "devicedict /display known dup { /display finddevice exch } if"; + code = gs_main_run_string(minst, getdisplay, 0, &exit_code, + &minst->error_object); + if (code < 0) + return code; + + op = osp; + check_type(*op, t_boolean); + if (op->value.boolval) { + /* display device was included in Ghostscript so we need + * to set the callback structure pointer within it. + * If the device is already open, close it before + * setting callback, then reopen it. + */ + check_read_type(op[-1], t_device); + dev = op[-1].value.pdevice; + + was_open = dev->is_open; + if (was_open) { + code = gs_closedevice(dev); + if (code < 0) + return_error(code); + } + + ddev = (gx_device_display *) dev; + ddev->callback = callback; + + if (was_open) { + code = gs_opendevice(dev); + if (code < 0) { + dprintf("**** Unable to open the display device, quitting.\n"); + return_error(code); + } + } + pop(1); /* device */ + } + pop(1); /* boolean */ + return 0; +} + + |