| /* |
| * 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 graphics.c, grid and by third-party graphics devices */ |
| |
| #ifndef R_GRAPHICSENGINE_H_ |
| #define R_GRAPHICSENGINE_H_ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /* |
| * The current graphics engine (including graphics device) API version |
| * MUST be integer |
| * |
| * This number should be bumped whenever there are changes to |
| * GraphicsEngine.h or GraphicsDevice.h so that add-on packages |
| * that compile against these headers (graphics systems such as |
| * graphics and grid; graphics devices such as gtkDevice, RSvgDevice) |
| * can detect any version mismatch. |
| * |
| * Version 1: Introduction of the version number. |
| * Version 2: GEDevDesc *dd dropped from GEcontourLines(). |
| * Version 3: R_GE_str2col() added to API. (r41887) |
| * Version 4: UTF-8 text hooks, useRotatedTextInContour, |
| * add newFrameConfirm() to NewDevDesc. |
| * New API: GEaddDevice[2] GEgetDevice, GEkillDevice, |
| * ndevNumber. (R 2.7.0) |
| * Version 5: Clean up 1.4.0/2.0.0 changes! |
| * Remove newDevStruct from GEDevDesc and NewDevDesc. |
| * Remove asp, dot(), hold(), open() from NewDevDesc. |
| * Move displayList, DLlastElt, savedSnapshot from |
| * NewDevDesc to GEDevDesc. |
| * Add 'ask' to GEDevDesc. (R 2.8.0) |
| * Version 6: Add dev_Raster() and dev_Cap() (R 2.11.0) |
| * Version 7: Change graphics event handling, adding eventEnv and eventHelper() |
| * to DevDesc. (R 2.12.0) |
| * Version 8: Add dev_Path() (R 2.12.0) |
| * Version 9: Add dev_HoldFlush(), haveTrans*, haveRaster, |
| * haveCapture, haveLocator. (R 2.14.0) |
| * Version 10: For R 3.0.0. Typedef and use 'rcolor', |
| * Remove name2col (R_GE_str2col does the job). |
| * Version 11: For R 3.3.0. |
| * Official support for saving/restoring display lists |
| * across R sessions (via recordPlot() and replayPlot()) |
| * - added grid DL to snapshots (used to be NULL) |
| * - added this version number to snapshots (as attribute) |
| * - added R version number to snapshots (as attribute) |
| * - added pkgName to graphics system state info (as attribute) |
| * Version 12: For R 3.4.0 |
| * Added canGenIdle, doIdle() and doesIdle() to devices. |
| */ |
| |
| #define R_GE_version 12 |
| |
| int R_GE_getVersion(void); |
| |
| void R_GE_checkVersionOrDie(int version); |
| |
| /* The graphics engine will only accept locations and dimensions |
| * in native device coordinates, but it provides the following functions |
| * for converting between a couple of simple alternative coordinate |
| * systems and device coordinates: |
| * DEVICE = native units of the device |
| * NDC = Normalised device coordinates |
| * INCHES = inches (!) |
| * CM = centimetres (!!) |
| */ |
| |
| typedef enum { |
| GE_DEVICE = 0, /* native device coordinates (rasters) */ |
| GE_NDC = 1, /* normalised device coordinates x=(0,1), y=(0,1) */ |
| GE_INCHES = 2, |
| GE_CM = 3 |
| } GEUnit; |
| |
| #define MAX_GRAPHICS_SYSTEMS 24 |
| |
| typedef enum { |
| /* In response to this event, the registered graphics system |
| * should allocate and initialise the systemSpecific structure |
| * |
| * Should return R_NilValue on failure so that engine |
| * can tidy up memory allocation |
| */ |
| GE_InitState = 0, |
| /* This event gives the registered system a chance to undo |
| * anything done in the initialisation. |
| */ |
| GE_FinaliseState = 1, |
| /* This is sent by the graphics engine prior to initialising |
| * the display list. It give the graphics system the chance |
| * to squirrel away information it will need for redrawing the |
| * the display list |
| */ |
| GE_SaveState = 2, |
| /* This is sent by the graphics engine prior to replaying the |
| * display list. It gives the graphics system the chance to |
| * restore any information it saved on the GE_SaveState event |
| */ |
| GE_RestoreState = 6, |
| /* Copy system state information to the current device. |
| * This is used when copying graphics from one device to another |
| * so all the graphics system needs to do is to copy across |
| * the bits required for the display list to draw faithfully |
| * on the new device. |
| */ |
| GE_CopyState = 3, |
| /* Create a snapshot of the system state that is sufficient |
| * for the current "image" to be reproduced |
| */ |
| GE_SaveSnapshotState = 4, |
| /* Restore the system state that is saved by GE_SaveSnapshotState |
| */ |
| GE_RestoreSnapshotState = 5, |
| /* When replaying the display list, the graphics engine |
| * checks, after each replayed action, that the action |
| * produced valid output. This is the graphics system's |
| * chance to say that the output is crap (in which case the |
| * graphics engine will abort the display list replay). |
| */ |
| GE_CheckPlot = 7, |
| /* The device wants to scale the current pointsize |
| * (for scaling an image) |
| * This is not a nice general solution, but a quick fix for |
| * the Windows device. |
| */ |
| GE_ScalePS = 8 |
| } GEevent; |
| |
| /* |
| * Some line end/join constants |
| */ |
| typedef enum { |
| GE_ROUND_CAP = 1, |
| GE_BUTT_CAP = 2, |
| GE_SQUARE_CAP = 3 |
| } R_GE_lineend; |
| |
| typedef enum { |
| GE_ROUND_JOIN = 1, |
| GE_MITRE_JOIN = 2, |
| GE_BEVEL_JOIN = 3 |
| } R_GE_linejoin; |
| |
| /* |
| * A structure containing graphical parameters |
| * |
| * This is how graphical parameters are passed from graphics systems |
| * to the graphics engine AND from the graphics engine to graphics |
| * devices. |
| * |
| * Devices are not *required* to honour graphical parameters |
| * (e.g., alpha transparency is going to be tough for some) |
| */ |
| typedef struct { |
| /* |
| * Colours |
| * |
| * NOTE: Alpha transparency included in col & fill |
| */ |
| int col; /* pen colour (lines, text, borders, ...) */ |
| int fill; /* fill colour (for polygons, circles, rects, ...) */ |
| double gamma; /* Gamma correction */ |
| /* |
| * Line characteristics |
| */ |
| double lwd; /* Line width (roughly number of pixels) */ |
| int lty; /* Line type (solid, dashed, dotted, ...) */ |
| R_GE_lineend lend; /* Line end */ |
| R_GE_linejoin ljoin; /* line join */ |
| double lmitre; /* line mitre */ |
| /* |
| * Text characteristics |
| */ |
| double cex; /* Character expansion (font size = fontsize*cex) */ |
| double ps; /* Font size in points */ |
| double lineheight; /* Line height (multiply by font size) */ |
| int fontface; /* Font face (plain, italic, bold, ...) */ |
| char fontfamily[201]; /* Font family */ |
| } R_GE_gcontext; |
| |
| typedef R_GE_gcontext* pGEcontext; |
| |
| |
| #include <R_ext/GraphicsDevice.h> /* needed for DevDesc */ |
| |
| typedef struct _GEDevDesc GEDevDesc; |
| |
| typedef SEXP (* GEcallback)(GEevent, GEDevDesc *, SEXP); |
| |
| typedef struct { |
| /* An array of information about each graphics system that |
| * has registered with the graphics engine. |
| * This is used to store graphics state for each graphics |
| * system on each device. |
| */ |
| void *systemSpecific; |
| /* |
| * An array of function pointers, one per graphics system that |
| * has registered with the graphics engine. |
| * |
| * system_Callback is called when the graphics engine wants |
| * to give a graphics system the chance to play with its |
| * device-specific information (stored in systemSpecific) |
| * There are two parameters: an "event" to tell the graphics |
| * system why the graphics engine has called this function, |
| * and the systemSpecific pointer. The graphics engine |
| * has to pass the systemSpecific pointer because only |
| * the graphics engine will know what array index to use. |
| */ |
| GEcallback callback; |
| } GESystemDesc; |
| |
| struct _GEDevDesc { |
| /* |
| * Stuff that the devices can see (and modify). |
| * All detailed in GraphicsDevice.h |
| */ |
| pDevDesc dev; |
| /* |
| * Stuff about the device that only the graphics engine sees |
| * (the devices don't see it). |
| */ |
| Rboolean displayListOn; /* toggle for display list status */ |
| SEXP displayList; /* display list */ |
| SEXP DLlastElt; /* A pointer to the end of the display list |
| to avoid tranversing pairlists */ |
| SEXP savedSnapshot; /* The last element of the display list |
| * just prior to when the display list |
| * was last initialised |
| */ |
| Rboolean dirty; /* Has the device received any output? */ |
| Rboolean recordGraphics; /* Should a graphics call be stored |
| * on the display list? |
| * Set to FALSE by do_recordGraphics, |
| * do_dotcallgr, and do_Externalgr |
| * so that nested calls are not |
| * recorded on the display list |
| */ |
| /* |
| * Stuff about the device that only graphics systems see. |
| * The graphics engine has no idea what is in here. |
| * Used by graphics systems to store system state per device. |
| */ |
| GESystemDesc *gesd[MAX_GRAPHICS_SYSTEMS]; |
| |
| /* per-device setting for 'ask' (use NewFrameConfirm) */ |
| Rboolean ask; |
| }; |
| |
| typedef GEDevDesc* pGEDevDesc; |
| |
| /* functions from devices.c for use by graphics devices */ |
| |
| #define desc2GEDesc Rf_desc2GEDesc |
| /* map DevDesc to enclosing GEDevDesc */ |
| pGEDevDesc desc2GEDesc(pDevDesc dd); |
| int GEdeviceNumber(pGEDevDesc); |
| pGEDevDesc GEgetDevice(int); |
| void GEaddDevice(pGEDevDesc); |
| void GEaddDevice2(pGEDevDesc, const char *); |
| void GEaddDevice2f(pGEDevDesc, const char *, const char *); |
| void GEkillDevice(pGEDevDesc); |
| pGEDevDesc GEcreateDevDesc(pDevDesc dev); |
| |
| void GEdestroyDevDesc(pGEDevDesc dd); |
| void *GEsystemState(pGEDevDesc dd, int index); |
| void GEregisterWithDevice(pGEDevDesc dd); |
| void GEregisterSystem(GEcallback callback, int *systemRegisterIndex); |
| void GEunregisterSystem(int registerIndex); |
| SEXP GEhandleEvent(GEevent event, pDevDesc dev, SEXP data); |
| |
| #define fromDeviceX GEfromDeviceX |
| #define toDeviceX GEtoDeviceX |
| #define fromDeviceY GEfromDeviceY |
| #define toDeviceY GEtoDeviceY |
| #define fromDeviceWidth GEfromDeviceWidth |
| #define toDeviceWidth GEtoDeviceWidth |
| #define fromDeviceHeight GEfromDeviceHeight |
| #define toDeviceHeight GEtoDeviceHeight |
| |
| double fromDeviceX(double value, GEUnit to, pGEDevDesc dd); |
| double toDeviceX(double value, GEUnit from, pGEDevDesc dd); |
| double fromDeviceY(double value, GEUnit to, pGEDevDesc dd); |
| double toDeviceY(double value, GEUnit from, pGEDevDesc dd); |
| double fromDeviceWidth(double value, GEUnit to, pGEDevDesc dd); |
| double toDeviceWidth(double value, GEUnit from, pGEDevDesc dd); |
| double fromDeviceHeight(double value, GEUnit to, pGEDevDesc dd); |
| double toDeviceHeight(double value, GEUnit from, pGEDevDesc dd); |
| |
| /*------------------------------------------------------------------- |
| * |
| * COLOUR CODE is concerned with the internals of R colour representation |
| * |
| * From colors.c, used in par.c, grid/src/gpar.c |
| */ |
| |
| typedef unsigned int rcolor; |
| |
| #define RGBpar Rf_RGBpar |
| #define RGBpar3 Rf_RGBpar3 |
| #define col2name Rf_col2name |
| |
| /* Convert an element of a R colour specification (which might be a |
| number or a string) into an internal colour specification. */ |
| rcolor RGBpar(SEXP, int); |
| rcolor RGBpar3(SEXP, int, rcolor); |
| |
| /* Convert an internal colour specification to/from a colour name */ |
| const char *col2name(rcolor col); /* used in par.c, grid */ |
| |
| /* Convert either a name or a #RRGGBB[AA] string to internal. |
| Because people were using it, it also converts "1", "2" ... |
| to a colour in the palette, and "0" to transparent white. |
| */ |
| rcolor R_GE_str2col(const char *s); |
| |
| |
| |
| /* |
| * Some Notes on Line Textures |
| * |
| * Line textures are stored as an array of 4-bit integers within |
| * a single 32-bit word. These integers contain the lengths of |
| * lines to be drawn with the pen alternately down and then up. |
| * The device should try to arrange that these values are measured |
| * in points if possible, although pixels is ok on most displays. |
| * |
| * If newlty contains a line texture description it is decoded |
| * as follows: |
| * |
| * ndash = 0; |
| * for(i=0 ; i<8 && newlty & 15 ; i++) { |
| * dashlist[ndash++] = newlty & 15; |
| * newlty = newlty>>4; |
| * } |
| * dashlist[0] = length of pen-down segment |
| * dashlist[1] = length of pen-up segment |
| * etc |
| * |
| * An integer containing a zero terminates the pattern. Hence |
| * ndash in this code fragment gives the length of the texture |
| * description. If a description contains an odd number of |
| * elements it is replicated to create a pattern with an |
| * even number of elements. (If this is a pain, do something |
| * different its not crucial). |
| * |
| */ |
| |
| /*--- The basic numbered & names line types; Here device-independent: |
| e.g. "dashed" == "44", "dotdash" == "1343" |
| */ |
| |
| /* NB: was also in Rgraphics.h in R < 2.7.0 */ |
| #define LTY_BLANK -1 |
| #define LTY_SOLID 0 |
| #define LTY_DASHED 4 + (4<<4) |
| #define LTY_DOTTED 1 + (3<<4) |
| #define LTY_DOTDASH 1 + (3<<4) + (4<<8) + (3<<12) |
| #define LTY_LONGDASH 7 + (3<<4) |
| #define LTY_TWODASH 2 + (2<<4) + (6<<8) + (2<<12) |
| |
| R_GE_lineend GE_LENDpar(SEXP value, int ind); |
| SEXP GE_LENDget(R_GE_lineend lend); |
| R_GE_linejoin GE_LJOINpar(SEXP value, int ind); |
| SEXP GE_LJOINget(R_GE_linejoin ljoin); |
| |
| void GESetClip(double x1, double y1, double x2, double y2, pGEDevDesc dd); |
| void GENewPage(const pGEcontext gc, pGEDevDesc dd); |
| void GELine(double x1, double y1, double x2, double y2, |
| const pGEcontext gc, pGEDevDesc dd); |
| void GEPolyline(int n, double *x, double *y, |
| const pGEcontext gc, pGEDevDesc dd); |
| void GEPolygon(int n, double *x, double *y, |
| const pGEcontext gc, pGEDevDesc dd); |
| SEXP GEXspline(int n, double *x, double *y, double *s, Rboolean open, |
| Rboolean repEnds, Rboolean draw, |
| const pGEcontext gc, pGEDevDesc dd); |
| void GECircle(double x, double y, double radius, |
| const pGEcontext gc, pGEDevDesc dd); |
| void GERect(double x0, double y0, double x1, double y1, |
| const pGEcontext gc, pGEDevDesc dd); |
| void GEPath(double *x, double *y, |
| int npoly, int *nper, |
| Rboolean winding, |
| const pGEcontext gc, pGEDevDesc dd); |
| void GERaster(unsigned int *raster, int w, int h, |
| double x, double y, double width, double height, |
| double angle, Rboolean interpolate, |
| const pGEcontext gc, pGEDevDesc dd); |
| SEXP GECap(pGEDevDesc dd); |
| void GEText(double x, double y, const char * const str, cetype_t enc, |
| double xc, double yc, double rot, |
| const pGEcontext gc, pGEDevDesc dd); |
| void GEMode(int mode, pGEDevDesc dd); |
| void GESymbol(double x, double y, int pch, double size, |
| const pGEcontext gc, pGEDevDesc dd); |
| void GEPretty(double *lo, double *up, int *ndiv); |
| void GEMetricInfo(int c, const pGEcontext gc, |
| double *ascent, double *descent, double *width, |
| pGEDevDesc dd); |
| double GEStrWidth(const char *str, cetype_t enc, |
| const pGEcontext gc, pGEDevDesc dd); |
| double GEStrHeight(const char *str, cetype_t enc, |
| const pGEcontext gc, pGEDevDesc dd); |
| void GEStrMetric(const char *str, cetype_t enc, const pGEcontext gc, |
| double *ascent, double *descent, double *width, |
| pGEDevDesc dd); |
| int GEstring_to_pch(SEXP pch); |
| |
| /*------------------------------------------------------------------- |
| * |
| * LINE TEXTURE CODE is concerned with the internals of R |
| * line texture representation. |
| */ |
| unsigned int GE_LTYpar(SEXP, int); |
| SEXP GE_LTYget(unsigned int); |
| |
| /* |
| * Raster operations |
| */ |
| void R_GE_rasterScale(unsigned int *sraster, int sw, int sh, |
| unsigned int *draster, int dw, int dh); |
| void R_GE_rasterInterpolate(unsigned int *sraster, int sw, int sh, |
| unsigned int *draster, int dw, int dh); |
| void R_GE_rasterRotatedSize(int w, int h, double angle, |
| int *wnew, int *hnew); |
| void R_GE_rasterRotatedOffset(int w, int h, double angle, int botleft, |
| double *xoff, double *yoff); |
| void R_GE_rasterResizeForRotation(unsigned int *sraster, |
| int w, int h, |
| unsigned int *newRaster, |
| int wnew, int hnew, |
| const pGEcontext gc); |
| void R_GE_rasterRotate(unsigned int *sraster, int w, int h, double angle, |
| unsigned int *draster, const pGEcontext gc, |
| Rboolean perPixelAlpha); |
| |
| |
| /* |
| * From plotmath.c |
| */ |
| double GEExpressionWidth(SEXP expr, |
| const pGEcontext gc, pGEDevDesc dd); |
| double GEExpressionHeight(SEXP expr, |
| const pGEcontext gc, pGEDevDesc dd); |
| void GEExpressionMetric(SEXP expr, const pGEcontext gc, |
| double *ascent, double *descent, double *width, |
| pGEDevDesc dd); |
| void GEMathText(double x, double y, SEXP expr, |
| double xc, double yc, double rot, |
| const pGEcontext gc, pGEDevDesc dd); |
| /* |
| * (End from plotmath.c) |
| */ |
| |
| /* |
| * From plot3d.c : used in package clines |
| */ |
| SEXP GEcontourLines(double *x, int nx, double *y, int ny, |
| double *z, double *levels, int nl); |
| /* |
| * (End from plot3d.c) |
| */ |
| |
| /* |
| * From vfonts.c |
| */ |
| double R_GE_VStrWidth(const char *s, cetype_t enc, const pGEcontext gc, pGEDevDesc dd); |
| |
| double R_GE_VStrHeight(const char *s, cetype_t enc, const pGEcontext gc, pGEDevDesc dd); |
| void R_GE_VText(double x, double y, const char * const s, cetype_t enc, |
| double x_justify, double y_justify, double rotation, |
| const pGEcontext gc, pGEDevDesc dd); |
| /* |
| * (End from vfonts.c) |
| */ |
| |
| /* Also in Graphics.h */ |
| #define DEG2RAD 0.01745329251994329576 |
| |
| pGEDevDesc GEcurrentDevice(void); |
| Rboolean GEdeviceDirty(pGEDevDesc dd); |
| void GEdirtyDevice(pGEDevDesc dd); |
| Rboolean GEcheckState(pGEDevDesc dd); |
| Rboolean GErecording(SEXP call, pGEDevDesc dd); |
| void GErecordGraphicOperation(SEXP op, SEXP args, pGEDevDesc dd); |
| void GEinitDisplayList(pGEDevDesc dd); |
| void GEplayDisplayList(pGEDevDesc dd); |
| void GEcopyDisplayList(int fromDevice); |
| SEXP GEcreateSnapshot(pGEDevDesc dd); |
| void GEplaySnapshot(SEXP snapshot, pGEDevDesc dd); |
| void GEonExit(void); |
| void GEnullDevice(void); |
| |
| |
| /* From ../../main/plot.c, used by ../../library/grid/src/grid.c : */ |
| #define CreateAtVector Rf_CreateAtVector |
| SEXP CreateAtVector(double*, double*, int, Rboolean); |
| /* From ../../main/graphics.c, used by ../../library/grDevices/src/axis_scales.c : */ |
| #define GAxisPars Rf_GAxisPars |
| void GAxisPars(double *min, double *max, int *n, Rboolean log, int axis); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* R_GRAPHICSENGINE_ */ |