| /* | |
| * R : A Computer Language for Statistical Data Analysis | |
| * Copyright (C) 2001-11 The R Core Team. | |
| * | |
| * This header file is free software; you can redistribute it and/or modify | |
| * it under the terms of the GNU Lesser General Public License as published by | |
| * the Free Software Foundation; either version 2.1 of the License, or | |
| * (at your option) any later version. | |
| * | |
| * This file is part of R. R is distributed under the terms of the | |
| * GNU General Public License, either Version 2, June 1991 or Version 3, | |
| * June 2007. See doc/COPYRIGHTS for details of the copyright status of R. | |
| * | |
| * This program is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| * GNU Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public License | |
| * along with this program; if not, a copy is available at | |
| * https://www.R-project.org/Licenses/ | |
| */ | |
| /* Used by third-party graphics devices. | |
| * | |
| * This defines DevDesc, whereas GraphicsEngine.h defines GEDevDesc. | |
| * Also contains entry points from gevents.c | |
| */ | |
| #ifndef R_GRAPHICSDEVICE_H_ | |
| #define R_GRAPHICSDEVICE_H_ | |
| /* ideally we would use prototypes in DevDesc. | |
| Some devices have taken to passing pointers to their own structure | |
| instead of DevDesc* , defining R_USE_PROTOTYPES 0 allows them to | |
| opt out. | |
| */ | |
| #ifndef R_USE_PROTOTYPES | |
| # define R_USE_PROTOTYPES 1 | |
| # ifndef R_GRAPHICSENGINE_H_ | |
| # error R_ext/GraphicsEngine.h must be included first, and includes this header | |
| # endif | |
| #endif | |
| #include <R_ext/Boolean.h> | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif | |
| /* --------- New (in 1.4.0) device driver structure --------- | |
| * NOTES: | |
| * 1. All locations and dimensions are in device coordinates. | |
| * 2. I found this comment in the doc for dev_Open -- looks nasty | |
| * Any known instances of such a thing happening? Should be | |
| * replaced by a function to query the device for preferred gpars | |
| * settings? (to be called when the device is initialised) | |
| * | |
| * NOTE that it is perfectly acceptable for this | |
| * function to set generic graphics parameters too | |
| * (i.e., override the generic parameter settings | |
| * which GInit sets up) all at the author's own risk | |
| * of course :) | |
| * | |
| * 3. Do we really need dev_StrWidth as well as dev_MetricInfo? | |
| * I can see the difference between the two -- its just a | |
| * question of whether dev_MetricInfo should just return | |
| * what dev_StrWidth would give if font metric information is | |
| * not available. I guess having both allows the developer | |
| * to decide when to ask for which sort of value, and to decide | |
| * what to do when font metric information is not available. | |
| * And why not a dev_StrHeight? | |
| * 4. Should "ipr", "asp", and "cra" be in the device description? | |
| * If not, then where? | |
| * I guess they don't need to be if no device makes use of them. | |
| * On the other hand, they would need to be replaced by a device | |
| * call that R base graphics could use to get enough information | |
| * to figure them out. (e.g., some sort of dpi() function to | |
| * complement the size() function.) | |
| */ | |
| typedef struct _DevDesc DevDesc; | |
| typedef DevDesc* pDevDesc; | |
| struct _DevDesc { | |
| /******************************************************** | |
| * Device physical characteristics | |
| ********************************************************/ | |
| double left; /* left raster coordinate */ | |
| double right; /* right raster coordinate */ | |
| double bottom; /* bottom raster coordinate */ | |
| double top; /* top raster coordinate */ | |
| /* R only has the notion of a rectangular clipping region | |
| */ | |
| double clipLeft; | |
| double clipRight; | |
| double clipBottom; | |
| double clipTop; | |
| /* I hate these next three -- they seem like a real fudge | |
| * BUT I'm not sure what to replace them with so they stay for now. | |
| */ | |
| double xCharOffset; /* x character addressing offset - unused */ | |
| double yCharOffset; /* y character addressing offset */ | |
| double yLineBias; /* 1/2 interline space as frac of line height */ | |
| double ipr[2]; /* Inches per raster; [0]=x, [1]=y */ | |
| /* I hate this guy too -- seems to assume that a device can only | |
| * have one font size during its lifetime | |
| * BUT removing/replacing it would take quite a lot of work | |
| * to design and insert a good replacement so it stays for now. | |
| */ | |
| double cra[2]; /* Character size in rasters; [0]=x, [1]=y */ | |
| double gamma; /* (initial) Device Gamma Correction */ | |
| /******************************************************** | |
| * Device capabilities | |
| ********************************************************/ | |
| Rboolean canClip; /* Device-level clipping */ | |
| Rboolean canChangeGamma; /* can the gamma factor be modified? */ | |
| int canHAdj; /* Can do at least some horiz adjust of text | |
| 0 = none, 1 = {0,0.5,1}, 2 = [0,1] */ | |
| /******************************************************** | |
| * Device initial settings | |
| ********************************************************/ | |
| /* These are things that the device must set up when it is created. | |
| * The graphics system can modify them and track current values, | |
| */ | |
| double startps; | |
| int startcol; /* sets par("fg"), par("col") and gpar("col") */ | |
| int startfill; /* sets par("bg") and gpar("fill") */ | |
| int startlty; | |
| int startfont; | |
| double startgamma; | |
| /******************************************************** | |
| * Device specific information | |
| ********************************************************/ | |
| void *deviceSpecific; /* pointer to device specific parameters */ | |
| /******************************************************** | |
| * Device display list | |
| ********************************************************/ | |
| Rboolean displayListOn; /* toggle for initial display list status */ | |
| /******************************************************** | |
| * Event handling entries | |
| ********************************************************/ | |
| /* Used in do_setGraphicsEventEnv */ | |
| Rboolean canGenMouseDown; /* can the device generate mousedown events */ | |
| Rboolean canGenMouseMove; /* can the device generate mousemove events */ | |
| Rboolean canGenMouseUp; /* can the device generate mouseup events */ | |
| Rboolean canGenKeybd; /* can the device generate keyboard events */ | |
| Rboolean canGenIdle; /* can the device generate idle events */ | |
| Rboolean gettingEvent; /* This is set while getGraphicsEvent | |
| is actively looking for events */ | |
| /******************************************************** | |
| * Device procedures. | |
| ********************************************************/ | |
| /* | |
| * --------------------------------------- | |
| * GENERAL COMMENT ON GRAPHICS PARAMETERS: | |
| * --------------------------------------- | |
| * Graphical parameters are now passed in a pointer to a | |
| * graphics context structure (pGEcontext) rather than individually. | |
| * Each device action should extract the parameters it needs | |
| * and ignore the others. Thought should be given to which | |
| * parameters are relevant in each case -- the graphics engine | |
| * does not REQUIRE that each parameter is honoured, but if | |
| * a parameter is NOT honoured, it might be a good idea to | |
| * issue a warning when a parameter is not honoured (or at | |
| * the very least document which parameters are not honoured | |
| * in the user-level documentation for the device). [An example | |
| * of a parameter that may not be honoured by many devices is | |
| * transparency.] | |
| */ | |
| /* | |
| * device_Activate is called when a device becomes the | |
| * active device. For example, it can be used to change the | |
| * title of a window to indicate the active status of | |
| * the device to the user. Not all device types will | |
| * do anything. | |
| * The only parameter is a device driver structure. | |
| * An example is ... | |
| * | |
| * static void X11_Activate(pDevDesc dd); | |
| * | |
| * As from R 2.14.0 this can be omitted or set to NULL. | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*activate)(const pDevDesc ); | |
| #else | |
| void (*activate)(); | |
| #endif | |
| /* | |
| * device_Circle should have the side-effect that a | |
| * circle is drawn, centred at the given location, with | |
| * the given radius. | |
| * (If the device has non-square pixels, 'radius' should | |
| * be interpreted in the units of the x direction.) | |
| * The border of the circle should be | |
| * drawn in the given "col", and the circle should be | |
| * filled with the given "fill" colour. | |
| * If "col" is NA_INTEGER then no border should be drawn | |
| * If "fill" is NA_INTEGER then the circle should not | |
| * be filled. | |
| * An example is ... | |
| * | |
| * static void X11_Circle(double x, double y, double r, | |
| * pGEcontext gc, | |
| * pDevDesc dd); | |
| * | |
| * R_GE_gcontext parameters that should be honoured (if possible): | |
| * col, fill, gamma, lty, lwd | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*circle)(double x, double y, double r, const pGEcontext gc, pDevDesc dd); | |
| #else | |
| void (*circle)(); | |
| #endif | |
| /* | |
| * device_Clip is given the left, right, bottom, and | |
| * top of a rectangle (in DEVICE coordinates). | |
| * It should have the side-effect that subsequent output | |
| * is clipped to the given rectangle. | |
| * NOTE that R's graphics engine already clips to the | |
| * extent of the device. | |
| * NOTE also that this will probably only be called if | |
| * the flag canClip is true. | |
| * An example is ... | |
| * | |
| * static void X11_Clip(double x0, double x1, double y0, double y1, | |
| * pDevDesc dd) | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*clip)(double x0, double x1, double y0, double y1, pDevDesc dd); | |
| #else | |
| void (*clip)(); | |
| #endif | |
| /* | |
| * device_Close is called when the device is killed. | |
| * This function is responsible for destroying any | |
| * device-specific resources that were created in | |
| * device_Open and for FREEing the device-specific | |
| * parameters structure. | |
| * An example is ... | |
| * | |
| * static void X11_Close(pDevDesc dd) | |
| * | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*close)(pDevDesc dd); | |
| #else | |
| void (*close)(); | |
| #endif | |
| /* | |
| * device_Deactivate is called when a device becomes | |
| * inactive. | |
| * This allows the device to undo anything it did in | |
| * dev_Activate. | |
| * Not all device types will do anything. | |
| * An example is ... | |
| * | |
| * static void X11_Deactivate(pDevDesc dd) | |
| * | |
| * As from R 2.14.0 this can be omitted or set to NULL. | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*deactivate)(pDevDesc ); | |
| #else | |
| void (*deactivate)(); | |
| #endif | |
| /* | |
| * device_Locator should return the location of the next | |
| * mouse click (in DEVICE coordinates) | |
| * Not all devices will do anything (e.g., postscript) | |
| * An example is ... | |
| * | |
| * static Rboolean X11_Locator(double *x, double *y, pDevDesc dd) | |
| * | |
| * As from R 2.14.0 this can be omitted or set to NULL. | |
| */ | |
| #if R_USE_PROTOTYPES | |
| Rboolean (*locator)(double *x, double *y, pDevDesc dd); | |
| #else | |
| Rboolean (*locator)(); | |
| #endif | |
| /* | |
| * device_Line should have the side-effect that a single | |
| * line is drawn (from x1,y1 to x2,y2) | |
| * An example is ... | |
| * | |
| * static void X11_Line(double x1, double y1, double x2, double y2, | |
| * const pGEcontext gc, | |
| * pDevDesc dd); | |
| * | |
| * R_GE_gcontext parameters that should be honoured (if possible): | |
| * col, gamma, lty, lwd | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*line)(double x1, double y1, double x2, double y2, | |
| const pGEcontext gc, pDevDesc dd); | |
| #else | |
| void (*line)(); | |
| #endif | |
| /* | |
| * device_MetricInfo should return height, depth, and | |
| * width information for the given character in DEVICE | |
| * units. | |
| * Note: in an 8-bit locale, c is 'char'. | |
| * In an mbcslocale, it is wchar_t, and at least some | |
| * of code assumes that is UCS-2 (Windows, true) or UCS-4. | |
| * This is used for formatting mathematical expressions | |
| * and for exact centering of text (see GText) | |
| * If the device cannot provide metric information then | |
| * it MUST return 0.0 for ascent, descent, and width. | |
| * An example is ... | |
| * | |
| * static void X11_MetricInfo(int c, | |
| * const pGEcontext gc, | |
| * double* ascent, double* descent, | |
| * double* width, pDevDesc dd); | |
| * | |
| * R_GE_gcontext parameters that should be honoured (if possible): | |
| * font, cex, ps | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*metricInfo)(int c, const pGEcontext gc, | |
| double* ascent, double* descent, double* width, | |
| pDevDesc dd); | |
| #else | |
| void (*metricInfo)(); | |
| #endif | |
| /* | |
| * device_Mode is called whenever the graphics engine | |
| * starts drawing (mode=1) or stops drawing (mode=0) | |
| * GMode (in graphics.c) also says that | |
| * mode = 2 (graphical input on) exists. | |
| * The device is not required to do anything | |
| * An example is ... | |
| * | |
| * static void X11_Mode(int mode, pDevDesc dd); | |
| * | |
| * As from R 2.14.0 this can be omitted or set to NULL. | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*mode)(int mode, pDevDesc dd); | |
| #else | |
| void (*mode)(); | |
| #endif | |
| /* | |
| * device_NewPage is called whenever a new plot requires | |
| * a new page. | |
| * A new page might mean just clearing the | |
| * device (e.g., X11) or moving to a new page | |
| * (e.g., postscript) | |
| * An example is ... | |
| * | |
| * | |
| * static void X11_NewPage(const pGEcontext gc, | |
| * pDevDesc dd); | |
| * | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*newPage)(const pGEcontext gc, pDevDesc dd); | |
| #else | |
| void (*newPage)(); | |
| #endif | |
| /* | |
| * device_Polygon should have the side-effect that a | |
| * polygon is drawn using the given x and y values | |
| * the polygon border should be drawn in the "col" | |
| * colour and filled with the "fill" colour. | |
| * If "col" is NA_INTEGER don't draw the border | |
| * If "fill" is NA_INTEGER don't fill the polygon | |
| * An example is ... | |
| * | |
| * static void X11_Polygon(int n, double *x, double *y, | |
| * const pGEcontext gc, | |
| * pDevDesc dd); | |
| * | |
| * R_GE_gcontext parameters that should be honoured (if possible): | |
| * col, fill, gamma, lty, lwd | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*polygon)(int n, double *x, double *y, const pGEcontext gc, pDevDesc dd); | |
| #else | |
| void (*polygon)(); | |
| #endif | |
| /* | |
| * device_Polyline should have the side-effect that a | |
| * series of line segments are drawn using the given x | |
| * and y values. | |
| * An example is ... | |
| * | |
| * static void X11_Polyline(int n, double *x, double *y, | |
| * const pGEcontext gc, | |
| * pDevDesc dd); | |
| * | |
| * R_GE_gcontext parameters that should be honoured (if possible): | |
| * col, gamma, lty, lwd | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*polyline)(int n, double *x, double *y, const pGEcontext gc, pDevDesc dd); | |
| #else | |
| void (*polyline)(); | |
| #endif | |
| /* | |
| * device_Rect should have the side-effect that a | |
| * rectangle is drawn with the given locations for its | |
| * opposite corners. The border of the rectangle | |
| * should be in the given "col" colour and the rectangle | |
| * should be filled with the given "fill" colour. | |
| * If "col" is NA_INTEGER then no border should be drawn | |
| * If "fill" is NA_INTEGER then the rectangle should not | |
| * be filled. | |
| * An example is ... | |
| * | |
| * static void X11_Rect(double x0, double y0, double x1, double y1, | |
| * const pGEcontext gc, | |
| * pDevDesc dd); | |
| * | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*rect)(double x0, double y0, double x1, double y1, | |
| const pGEcontext gc, pDevDesc dd); | |
| #else | |
| void (*rect)(); | |
| #endif | |
| /* | |
| * device_Path should draw one or more sets of points | |
| * as a single path | |
| * | |
| * 'x' and 'y' give the points | |
| * | |
| * 'npoly' gives the number of polygons in the path | |
| * MUST be at least 1 | |
| * | |
| * 'nper' gives the number of points in each polygon | |
| * each value MUST be at least 2 | |
| * | |
| * 'winding' says whether to fill using the nonzero | |
| * winding rule or the even-odd rule | |
| * | |
| * Added 2010-06-27 | |
| * | |
| * As from R 2.13.2 this can be left unimplemented as NULL. | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*path)(double *x, double *y, | |
| int npoly, int *nper, | |
| Rboolean winding, | |
| const pGEcontext gc, pDevDesc dd); | |
| #else | |
| void (*path)(); | |
| #endif | |
| /* | |
| * device_Raster should draw a raster image justified | |
| * at the given location, | |
| * size, and rotation (not all devices may be able to rotate?) | |
| * | |
| * 'raster' gives the image data BY ROW, with every four bytes | |
| * giving one R colour (ABGR). | |
| * | |
| * 'x and 'y' give the bottom-left corner. | |
| * | |
| * 'rot' is in degrees (as per device_Text), with positive | |
| * rotation anticlockwise from the positive x-axis. | |
| * | |
| * As from R 2.13.2 this can be left unimplemented as NULL. | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*raster)(unsigned int *raster, int w, int h, | |
| double x, double y, | |
| double width, double height, | |
| double rot, | |
| Rboolean interpolate, | |
| const pGEcontext gc, pDevDesc dd); | |
| #else | |
| void (*raster)(); | |
| #endif | |
| /* | |
| * device_Cap should return an integer matrix (R colors) | |
| * representing the current contents of the device display. | |
| * | |
| * The result is expected to be ROW FIRST. | |
| * | |
| * This will only make sense for raster devices and can | |
| * probably only be implemented for screen devices. | |
| * | |
| * added 2010-06-27 | |
| * | |
| * As from R 2.13.2 this can be left unimplemented as NULL. | |
| * For earlier versions of R it should return R_NilValue. | |
| */ | |
| #if R_USE_PROTOTYPES | |
| SEXP (*cap)(pDevDesc dd); | |
| #else | |
| SEXP (*cap)(); | |
| #endif | |
| /* | |
| * device_Size is called whenever the device is | |
| * resized. | |
| * The function returns (left, right, bottom, and top) for the | |
| * new device size. | |
| * This is not usually called directly by the graphics | |
| * engine because the detection of device resizes | |
| * (e.g., a window resize) are usually detected by | |
| * device-specific code. | |
| * An example is ... | |
| * | |
| * static void X11_Size(double *left, double *right, | |
| * double *bottom, double *top, | |
| * pDevDesc dd); | |
| * | |
| * R_GE_gcontext parameters that should be honoured (if possible): | |
| * col, fill, gamma, lty, lwd | |
| * | |
| * As from R 2.13.2 this can be left unimplemented as NULL. | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*size)(double *left, double *right, double *bottom, double *top, | |
| pDevDesc dd); | |
| #else | |
| void (*size)(); | |
| #endif | |
| /* | |
| * device_StrWidth should return the width of the given | |
| * string in DEVICE units. | |
| * An example is ... | |
| * | |
| * static double X11_StrWidth(const char *str, | |
| * const pGEcontext gc, | |
| * pDevDesc dd) | |
| * | |
| * R_GE_gcontext parameters that should be honoured (if possible): | |
| * font, cex, ps | |
| */ | |
| #if R_USE_PROTOTYPES | |
| double (*strWidth)(const char *str, const pGEcontext gc, pDevDesc dd); | |
| #else | |
| double (*strWidth)(); | |
| #endif | |
| /* | |
| * device_Text should have the side-effect that the | |
| * given text is drawn at the given location. | |
| * The text should be rotated according to rot (degrees) | |
| * An example is ... | |
| * | |
| * static void X11_Text(double x, double y, const char *str, | |
| * double rot, double hadj, | |
| * const pGEcontext gc, | |
| * pDevDesc dd); | |
| * | |
| * R_GE_gcontext parameters that should be honoured (if possible): | |
| * font, cex, ps, col, gamma | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*text)(double x, double y, const char *str, double rot, | |
| double hadj, const pGEcontext gc, pDevDesc dd); | |
| #else | |
| void (*text)(); | |
| #endif | |
| /* | |
| * device_onExit is called by GEonExit when the user has aborted | |
| * some operation, and so an R_ProcessEvents call may not return normally. | |
| * It need not be set to any value; if null, it will not be called. | |
| * | |
| * An example is ... | |
| * | |
| * static void GA_onExit(pDevDesc dd); | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*onExit)(pDevDesc dd); | |
| #else | |
| void (*onExit)(); | |
| #endif | |
| /* | |
| * device_getEvent is no longer used, but the slot is kept for back | |
| * compatibility of the structure. | |
| */ | |
| SEXP (*getEvent)(SEXP, const char *); | |
| /* --------- Optional features introduced in 2.7.0 --------- */ | |
| /* Does the device have a device-specific way to confirm a | |
| new frame (for e.g. par(ask=TRUE))? | |
| This should be NULL if it does not. | |
| If it does, it returns TRUE if the device handled this, and | |
| FALSE if it wants the engine to do so. | |
| There is an example in the windows() device. | |
| Can be left unimplemented as NULL. | |
| */ | |
| #if R_USE_PROTOTYPES | |
| Rboolean (*newFrameConfirm)(pDevDesc dd); | |
| #else | |
| Rboolean (*newFrameConfirm)(); | |
| #endif | |
| /* Some devices can plot UTF-8 text directly without converting | |
| to the native encoding, e.g. windows(), quartz() .... | |
| If this flag is true, all text *not in the symbol font* is sent | |
| in UTF8 to the textUTF8/strWidthUTF8 entry points. | |
| If the flag is TRUE, the metricInfo entry point should | |
| accept negative values for 'c' and treat them as indicating | |
| Unicode points (as well as positive values in a MBCS locale). | |
| */ | |
| Rboolean hasTextUTF8; /* and strWidthUTF8 */ | |
| #if R_USE_PROTOTYPES | |
| void (*textUTF8)(double x, double y, const char *str, double rot, | |
| double hadj, const pGEcontext gc, pDevDesc dd); | |
| double (*strWidthUTF8)(const char *str, const pGEcontext gc, pDevDesc dd); | |
| #else | |
| void (*textUTF8)(); | |
| double (*strWidthUTF8)(); | |
| #endif | |
| Rboolean wantSymbolUTF8; | |
| /* Is rotated text good enough to be preferable to Hershey in | |
| contour labels? Old default was FALSE. | |
| */ | |
| Rboolean useRotatedTextInContour; | |
| /* --------- Post-2.7.0 features --------- */ | |
| /* Added in 2.12.0: Changed graphics event handling. */ | |
| SEXP eventEnv; /* This is an environment holding event handlers. */ | |
| /* | |
| * eventHelper(dd, 1) is called by do_getGraphicsEvent before looking for a | |
| * graphics event. It will then call R_ProcessEvents() and eventHelper(dd, 2) | |
| * until this or another device returns sets a non-null result value in eventEnv, | |
| * at which time eventHelper(dd, 0) will be called. | |
| * | |
| * An example is ... | |
| * | |
| * static SEXP GA_eventHelper(pDevDesc dd, int code); | |
| * Can be left unimplemented as NULL | |
| */ | |
| #if R_USE_PROTOTYPES | |
| void (*eventHelper)(pDevDesc dd, int code); | |
| #else | |
| void (*eventHelper)(); | |
| #endif | |
| /* added in 2.14.0, only used by screen devices. | |
| Allows graphics devices to have multiple levels of suspension: | |
| when this reaches zero output is flushed. | |
| Can be left unimplemented as NULL. | |
| */ | |
| #if R_USE_PROTOTYPES | |
| int (*holdflush)(pDevDesc dd, int level); | |
| #else | |
| int (*holdflush)(); | |
| #endif | |
| /* added in 2.14.0, for dev.capabilities. | |
| In all cases 0 means NA (unset). | |
| */ | |
| int haveTransparency; /* 1 = no, 2 = yes */ | |
| int haveTransparentBg; /* 1 = no, 2 = fully, 3 = semi */ | |
| int haveRaster; /* 1 = no, 2 = yes, 3 = except for missing values */ | |
| int haveCapture, haveLocator; /* 1 = no, 2 = yes */ | |
| /* Area for future expansion. | |
| By zeroing this, devices are more likely to work if loaded | |
| into a later version of R than that they were compiled under. | |
| */ | |
| char reserved[64]; | |
| }; | |
| /********************************************************/ | |
| /* the device-driver entry point is given a device */ | |
| /* description structure that it must set up. this */ | |
| /* involves several important jobs ... */ | |
| /* (1) it must ALLOCATE a new device-specific parameters*/ | |
| /* structure and FREE that structure if anything goes */ | |
| /* wrong (i.e., it won't report a successful setup to */ | |
| /* the graphics engine (the graphics engine is NOT */ | |
| /* responsible for allocating or freeing device-specific*/ | |
| /* resources or parameters) */ | |
| /* (2) it must initialise the device-specific resources */ | |
| /* and parameters (mostly done by calling device_Open) */ | |
| /* (3) it must initialise the generic graphical */ | |
| /* parameters that are not initialised by GInit (because*/ | |
| /* only the device knows what values they should have) */ | |
| /* see Graphics.h for the official list of these */ | |
| /* (4) it may reset generic graphics parameters that */ | |
| /* have already been initialised by GInit (although you */ | |
| /* should know what you are doing if you do this) */ | |
| /* (5) it must attach the device-specific parameters */ | |
| /* structure to the device description structure */ | |
| /* e.g., dd->deviceSpecfic = (void *) xd; */ | |
| /* (6) it must FREE the overall device description if */ | |
| /* it wants to bail out to the top-level */ | |
| /* the graphics engine is responsible for allocating */ | |
| /* the device description and freeing it in most cases */ | |
| /* but if the device driver freaks out it needs to do */ | |
| /* the clean-up itself */ | |
| /********************************************************/ | |
| /* moved from Rgraphics.h */ | |
| /* | |
| * Some Notes on Color | |
| * | |
| * R uses a 24-bit color model. Colors are specified in 32-bit | |
| * integers which are partitioned into 4 bytes as follows. | |
| * | |
| * <-- most sig least sig --> | |
| * +-------------------------------+ | |
| * | 0 | blue | green | red | | |
| * +-------------------------------+ | |
| * | |
| * The red, green and blue bytes can be extracted as follows. | |
| * | |
| * red = ((color ) & 255) | |
| * green = ((color >> 8) & 255) | |
| * blue = ((color >> 16) & 255) | |
| */ | |
| /* | |
| * Changes as from 1.4.0: use top 8 bits as an alpha channel. | |
| * 0 = opaque, 255 = transparent. | |
| */ | |
| /* | |
| * Changes as from 2.0.0: use top 8 bits as full alpha channel | |
| * 255 = opaque, 0 = transparent | |
| * [to conform with SVG, PDF and others] | |
| * and everything in between is used | |
| * [which means that NA is not stored as an internal colour; | |
| * it is converted to R_RGBA(255, 255, 255, 0)] | |
| */ | |
| #define R_RGB(r,g,b) ((r)|((g)<<8)|((b)<<16)|0xFF000000) | |
| #define R_RGBA(r,g,b,a) ((r)|((g)<<8)|((b)<<16)|((a)<<24)) | |
| #define R_RED(col) (((col) )&255) | |
| #define R_GREEN(col) (((col)>> 8)&255) | |
| #define R_BLUE(col) (((col)>>16)&255) | |
| #define R_ALPHA(col) (((col)>>24)&255) | |
| #define R_OPAQUE(col) (R_ALPHA(col) == 255) | |
| #define R_TRANSPARENT(col) (R_ALPHA(col) == 0) | |
| /* | |
| * A transparent white | |
| */ | |
| #define R_TRANWHITE (R_RGBA(255, 255, 255, 0)) | |
| /* used in various devices */ | |
| #define curDevice Rf_curDevice | |
| #define killDevice Rf_killDevice | |
| #define ndevNumber Rf_ndevNumber | |
| #define NewFrameConfirm Rf_NewFrameConfirm | |
| #define nextDevice Rf_nextDevice | |
| #define NoDevices Rf_NoDevices | |
| #define NumDevices Rf_NumDevices | |
| #define prevDevice Rf_prevDevice | |
| #define selectDevice Rf_selectDevice | |
| #define AdobeSymbol2utf8 Rf_AdobeSymbol2utf8 | |
| /* Properly declared version of devNumber */ | |
| int ndevNumber(pDevDesc ); | |
| /* How many devices exist ? (>= 1) */ | |
| int NumDevices(void); | |
| /* Check for an available device slot */ | |
| void R_CheckDeviceAvailable(void); | |
| Rboolean R_CheckDeviceAvailableBool(void); | |
| /* Return the number of the current device. */ | |
| int curDevice(void); | |
| /* Return the number of the next device. */ | |
| int nextDevice(int); | |
| /* Return the number of the previous device. */ | |
| int prevDevice(int); | |
| /* Make the specified device (specified by number) the current device */ | |
| int selectDevice(int); | |
| /* Kill device which is identified by number. */ | |
| void killDevice(int); | |
| int NoDevices(void); /* used in engine, graphics, plot, grid */ | |
| void NewFrameConfirm(pDevDesc); /* used in graphics.c, grid */ | |
| /* Graphics events: defined in gevents.c */ | |
| /* These give the indices of some known keys */ | |
| typedef enum {knUNKNOWN = -1, | |
| knLEFT = 0, knUP, knRIGHT, knDOWN, | |
| knF1, knF2, knF3, knF4, knF5, knF6, knF7, knF8, knF9, knF10, | |
| knF11, knF12, | |
| knPGUP, knPGDN, knEND, knHOME, knINS, knDEL} R_KeyName; | |
| /* These are the three possible mouse events */ | |
| typedef enum {meMouseDown = 0, | |
| meMouseUp, | |
| meMouseMove} R_MouseEvent; | |
| #define leftButton 1 | |
| #define middleButton 2 | |
| #define rightButton 4 | |
| #define doKeybd Rf_doKeybd | |
| #define doMouseEvent Rf_doMouseEvent | |
| #define doIdle Rf_doIdle | |
| #define doesIdle Rf_doesIdle | |
| void doMouseEvent(pDevDesc dd, R_MouseEvent event, | |
| int buttons, double x, double y); | |
| void doKeybd(pDevDesc dd, R_KeyName rkey, | |
| const char *keyname); | |
| void doIdle(pDevDesc dd); | |
| Rboolean doesIdle(pDevDesc dd); | |
| /* For use in third-party devices when setting up a device: | |
| * duplicates Defn.h which is used internally. | |
| * (Tested in devNull.c) | |
| */ | |
| #ifndef BEGIN_SUSPEND_INTERRUPTS | |
| /* Macros for suspending interrupts */ | |
| #define BEGIN_SUSPEND_INTERRUPTS do { \ | |
| Rboolean __oldsusp__ = R_interrupts_suspended; \ | |
| R_interrupts_suspended = TRUE; | |
| #define END_SUSPEND_INTERRUPTS R_interrupts_suspended = __oldsusp__; \ | |
| if (R_interrupts_pending && ! R_interrupts_suspended) \ | |
| Rf_onintr(); \ | |
| } while(0) | |
| #include <R_ext/libextern.h> | |
| LibExtern Rboolean R_interrupts_suspended; | |
| LibExtern int R_interrupts_pending; | |
| extern void Rf_onintr(void); | |
| LibExtern Rboolean mbcslocale; | |
| #endif | |
| /* Useful for devices: translates Adobe symbol encoding to UTF-8 */ | |
| extern void *AdobeSymbol2utf8(char*out, const char *in, size_t nwork); | |
| /* Translates Unicode point to UTF-8 */ | |
| extern size_t Rf_ucstoutf8(char *s, const unsigned int c); | |
| #ifdef __cplusplus | |
| } | |
| #endif | |
| #endif /* R_GRAPHICSDEVICE_ */ |