/* * 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 /* 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_ */