Skip to content

Commit

Permalink
Update grid patched sources to grid 4.0.3
Browse files Browse the repository at this point in the history
  • Loading branch information
Pavel Marek committed Sep 20, 2022
1 parent c1de301 commit 2e8e655
Show file tree
Hide file tree
Showing 7 changed files with 813 additions and 729 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,6 @@ void initGPar(pGEDevDesc dd)
SEXP gpar, gparnames, class;
SEXP gpfill, gpcol, gpgamma, gplty, gplwd, gpcex, gpfs, gplh, gpfont;
SEXP gpfontfamily, gpalpha, gplineend, gplinejoin, gplinemitre, gplex;
int gridRegisterIndex = *((int *) FASTR_GlobalVarGetPtr(fastr_glob_gridRegisterIndex));
SEXP gsd = (SEXP) dd->gesd[gridRegisterIndex]->systemSpecific;
PROTECT(gpar = allocVector(VECSXP, 15));
PROTECT(gparnames = allocVector(STRSXP, 15));
Expand Down
22 changes: 4 additions & 18 deletions com.oracle.truffle.r.native/gnur/patch/src/library/grid/src/grid.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,18 +63,14 @@ static Rboolean deviceChanged(double devWidthCM, double devHeightCM,
*/
SEXP L_initGrid(SEXP GridEvalEnv)
{
int *gridRegisterIndex = (int *) FASTR_GlobalVarGetPtr(fastr_glob_gridRegisterIndex);
SEXP R_gridEvalEnv = GridEvalEnv;
FASTR_GlobalVarSetSEXP(fastr_glob_R_gridEvalEnv, R_gridEvalEnv);
GEregisterSystem(gridCallback, gridRegisterIndex);
R_gridEvalEnv = GridEvalEnv;
GEregisterSystem(gridCallback, &gridRegisterIndex);
return R_NilValue;
}

SEXP L_killGrid()
{
int *gridRegisterIndex = (int *) FASTR_GlobalVarGetPtr(fastr_glob_gridRegisterIndex);
GEunregisterSystem(*gridRegisterIndex);
*gridRegisterIndex = -1;
GEunregisterSystem(gridRegisterIndex);
return R_NilValue;
}

Expand All @@ -93,7 +89,6 @@ void dirtyGridDevice(pGEDevDesc dd) {
SEXP gsd, griddev;
/* Record the fact that this device has now received grid output
*/
int gridRegisterIndex = *((int *) FASTR_GlobalVarGetPtr(fastr_glob_gridRegisterIndex));
gsd = (SEXP) dd->gesd[gridRegisterIndex]->systemSpecific;
PROTECT(griddev = allocVector(LGLSXP, 1));
LOGICAL(griddev)[0] = TRUE;
Expand Down Expand Up @@ -324,7 +319,6 @@ SEXP L_setviewport(SEXP invp, SEXP hasParent)
{
SEXP vp;
SEXP pushedvp, fcall;
SEXP R_gridEvalEnv = FASTR_GlobalVarGetSEXP(fastr_glob_R_gridEvalEnv);
/* Get the current device
*/
pGEDevDesc dd = getDevice();
Expand Down Expand Up @@ -363,7 +357,6 @@ SEXP L_setviewport(SEXP invp, SEXP hasParent)
static Rboolean noChildren(SEXP children)
{
SEXP result, fcall;
SEXP R_gridEvalEnv = FASTR_GlobalVarGetSEXP(fastr_glob_R_gridEvalEnv);
PROTECT(fcall = lang2(install("no.children"),
children));
PROTECT(result = eval(fcall, R_gridEvalEnv));
Expand All @@ -374,7 +367,6 @@ static Rboolean noChildren(SEXP children)
static Rboolean childExists(SEXP name, SEXP children)
{
SEXP result, fcall;
SEXP R_gridEvalEnv = FASTR_GlobalVarGetSEXP(fastr_glob_R_gridEvalEnv);
PROTECT(fcall = lang3(install("child.exists"),
name, children));
PROTECT(result = eval(fcall, R_gridEvalEnv));
Expand All @@ -385,7 +377,6 @@ static Rboolean childExists(SEXP name, SEXP children)
static SEXP childList(SEXP children)
{
SEXP result, fcall;
SEXP R_gridEvalEnv = FASTR_GlobalVarGetSEXP(fastr_glob_R_gridEvalEnv);
PROTECT(fcall = lang2(install("child.list"),
children));
PROTECT(result = eval(fcall, R_gridEvalEnv));
Expand Down Expand Up @@ -541,7 +532,6 @@ SEXP L_downviewport(SEXP name, SEXP strict)
static Rboolean pathMatch(SEXP path, SEXP pathsofar, SEXP strict)
{
SEXP result, fcall;
SEXP R_gridEvalEnv = FASTR_GlobalVarGetSEXP(fastr_glob_R_gridEvalEnv);
PROTECT(fcall = lang4(install("pathMatch"),
path, pathsofar, strict));
PROTECT(result = eval(fcall, R_gridEvalEnv));
Expand All @@ -552,7 +542,6 @@ static Rboolean pathMatch(SEXP path, SEXP pathsofar, SEXP strict)
static SEXP growPath(SEXP pathsofar, SEXP name)
{
SEXP result, fcall;
SEXP R_gridEvalEnv = FASTR_GlobalVarGetSEXP(fastr_glob_R_gridEvalEnv);
if (isNull(pathsofar))
result = name;
else {
Expand Down Expand Up @@ -740,7 +729,6 @@ SEXP L_unsetviewport(SEXP n)
SET_TAG(t, install("envir"));
t = CDR(t);
SET_TAG(t, install("inherits"));
SEXP R_gridEvalEnv = FASTR_GlobalVarGetSEXP(fastr_glob_R_gridEvalEnv);
eval(fcall, R_gridEvalEnv);
UNPROTECT(2); /* false, fcall */
}
Expand Down Expand Up @@ -1151,8 +1139,7 @@ SEXP L_convert(SEXP x, SEXP whatfrom,
* In these cases do NOT transform thru INCHES
* (to avoid divide-by-zero, but still do something useful)
*/
relConvert = (!isUnitArithmetic(x) && !isUnitList(x) &&
(unitUnit(x, i) == L_NATIVE || unitUnit(x, i) == L_NPC) &&
relConvert = ((unitUnit(x, i) == L_NATIVE || unitUnit(x, i) == L_NPC) &&
(TOunit == L_NATIVE || TOunit == L_NPC) &&
((FROMaxis == TOaxis) ||
(FROMaxis == 0 && TOaxis == 2) ||
Expand Down Expand Up @@ -1660,7 +1647,6 @@ static void hullEdge(double *x, double *y, int n,
SEXP xin, yin, chullFn, R_fcall, hull;
int adjust = 0;
double *xkeep, *ykeep;
SEXP R_gridEvalEnv = FASTR_GlobalVarGetSEXP(fastr_glob_R_gridEvalEnv);
vmax = vmaxget();
/* Remove any NA's because chull() can't cope with them */
xkeep = (double *) R_alloc(n, sizeof(double));
Expand Down
46 changes: 38 additions & 8 deletions com.oracle.truffle.r.native/gnur/patch/src/library/grid/src/grid.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,6 @@
#define _(String) (String)
#endif

extern FASTR_GlobalVar_t fastr_glob_gridRegisterIndex;
extern FASTR_GlobalVar_t fastr_glob_R_gridEvalEnv;

/* All grid type names are prefixed with an "L"
* All grid global variable names are prefixed with an "L_"
*/
Expand Down Expand Up @@ -141,6 +138,13 @@ extern FASTR_GlobalVar_t fastr_glob_R_gridEvalEnv;
#define GRID_ARROWENDS 2
#define GRID_ARROWTYPE 3

/*
* Helpers for unit types
*/
#define uValue(X) REAL(VECTOR_ELT(X, 0))[0]
#define uData(X) VECTOR_ELT(X, 1)
#define uUnit(X) INTEGER(VECTOR_ELT(X, 2))[0]

typedef double LTransform[3][3];

typedef double LLocation[3];
Expand Down Expand Up @@ -197,9 +201,20 @@ typedef enum {
L_MYLINES = 103,
L_MYCHAR = 104,
L_MYSTRINGWIDTH = 105,
L_MYSTRINGHEIGHT = 106
L_MYSTRINGHEIGHT = 106,
/*
* Arithmetic units
*/
L_SUM = 201,
L_MIN = 202,
L_MAX = 203
} LUnit;

#define isAbsolute(X) ((X > 1000 || (X >= L_MYLINES && X <= L_MYSTRINGHEIGHT) || (X < L_GROBX && X > L_NPC && X != L_NATIVE && X != L_SNPC)))
#define isArith(X) (X >= L_SUM && X <= L_MAX)
#define isStringUnit(X) (X >= L_STRINGWIDTH && X <= L_STRINGDESCENT)
#define isGrobUnit(X) (X >= L_GROBX && X <= L_GROBDESCENT)

typedef enum {
L_LEFT = 0,
L_RIGHT = 1,
Expand Down Expand Up @@ -244,6 +259,13 @@ typedef struct {
double yscalemax;
} LViewportContext;

/* Evaluation environment */
#ifndef GRID_MAIN
extern SEXP R_gridEvalEnv;
#else
SEXP R_gridEvalEnv;
#endif


/* Functions called by R code
* (from all over the place)
Expand Down Expand Up @@ -331,10 +353,6 @@ void location(double x, double y, LLocation v);
void trans(LLocation vin, LTransform m, LLocation vout);

/* From unit.c */
int isUnitArithmetic(SEXP ua);

int isUnitList(SEXP ul);

SEXP unit(double value, int unit);

double unitValue(SEXP unit, int index);
Expand Down Expand Up @@ -600,6 +618,9 @@ void setGridStateElement(pGEDevDesc dd, int elementIndex, SEXP value);

SEXP gridCallback(GEevent task, pGEDevDesc dd, SEXP data);

extern int gridRegisterIndex;


/* From grid.c */
SEXP doSetViewport(SEXP vp,
Rboolean topLevelVP,
Expand Down Expand Up @@ -631,6 +652,15 @@ SEXP L_xsplinePoints(SEXP x, SEXP y, SEXP s, SEXP o, SEXP a, SEXP rep,

/* From unit.c */
SEXP validUnits(SEXP units);
SEXP constructUnits(SEXP amount, SEXP data, SEXP unit);
SEXP asUnit(SEXP simpleUnit);
SEXP conformingUnits(SEXP unitList);
SEXP matchUnit(SEXP units, SEXP unit);
SEXP addUnits(SEXP u1, SEXP u2);
SEXP multUnits(SEXP units, SEXP values);
SEXP flipUnits(SEXP units);
SEXP absoluteUnits(SEXP units);
SEXP summaryUnits(SEXP units, SEXP op_type);

/* From gpar.c */
SEXP L_getGPar(void);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,6 @@
#include <R_ext/Rdynload.h>
#include "grid.h"

FASTR_GlobalVar_t fastr_glob_gridRegisterIndex = NULL;
FASTR_GlobalVar_t fastr_glob_R_gridEvalEnv = NULL;

#define LCALLDEF(name, n) {#name, (DL_FUNC) &L_##name, n}

static const R_CallMethodDef callMethods[] = {
Expand Down Expand Up @@ -90,29 +87,23 @@ static const R_CallMethodDef callMethods[] = {
LCALLDEF(xsplinePoints, 8),
LCALLDEF(stringMetric, 1),
{"validUnits", (DL_FUNC) &validUnits, 1},
{"constructUnits", (DL_FUNC) &constructUnits, 3},
{"asUnit", (DL_FUNC) &asUnit, 1},
{"conformingUnits", (DL_FUNC) &conformingUnits, 1},
{"matchUnit", (DL_FUNC) &matchUnit, 2},
{"addUnits", (DL_FUNC) &addUnits, 2},
{"multUnits", (DL_FUNC) &multUnits, 2},
{"flipUnits", (DL_FUNC) &flipUnits, 1},
{"absoluteUnits", (DL_FUNC) &absoluteUnits, 1},
{"summaryUnits", (DL_FUNC) &summaryUnits, 2},
{ NULL, NULL, 0 }
};

static void fastr_free_gridRegisterIndex(void *grid_register_idx)
{
free(grid_register_idx);
}


void attribute_visible R_init_grid(DllInfo *dll)
{
/* No .C, .Fortran, or .External routines => NULL
*/
if (fastr_glob_gridRegisterIndex == NULL) {
fastr_glob_gridRegisterIndex = FASTR_GlobalVarAlloc();
fastr_glob_R_gridEvalEnv = FASTR_GlobalVarAlloc();
}
FASTR_GlobalVarInitWithDtor(fastr_glob_gridRegisterIndex, fastr_free_gridRegisterIndex);
int *gridRegisterIndex = malloc(sizeof(int));
*gridRegisterIndex = -1;
FASTR_GlobalVarSetPtr(fastr_glob_gridRegisterIndex, gridRegisterIndex);
FASTR_GlobalVarInit(fastr_glob_R_gridEvalEnv);

R_registerRoutines(dll, NULL, callMethods, NULL, NULL);
R_useDynamicSymbols(dll, FALSE);
R_forceSymbols(dll, FALSE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
#include "grid.h"
#include <string.h>

int gridRegisterIndex;

/* The gridSystemState (per device) consists of
* GSS_DEVSIZE 0 = current size of device
* GSS_CURRLOC 1 = current location of grid "pen"
Expand Down Expand Up @@ -58,7 +60,6 @@ void initDL(pGEDevDesc dd)
{
SEXP dl, dlindex;
SEXP vp = gridStateElement(dd, GSS_VP);
int gridRegisterIndex = *((int *) FASTR_GlobalVarGetPtr(fastr_glob_gridRegisterIndex));
SEXP gsd = (SEXP) dd->gesd[gridRegisterIndex]->systemSpecific;
/* The top-level viewport goes at the start of the display list
*/
Expand All @@ -82,7 +83,6 @@ void initDL(pGEDevDesc dd)
void initOtherState(pGEDevDesc dd)
{
SEXP currloc, prevloc, recording;
int gridRegisterIndex = *((int *) FASTR_GlobalVarGetPtr(fastr_glob_gridRegisterIndex));
SEXP state = (SEXP) dd->gesd[gridRegisterIndex]->systemSpecific;
currloc = VECTOR_ELT(state, GSS_CURRLOC);
REAL(currloc)[0] = NA_REAL;
Expand Down Expand Up @@ -139,21 +139,18 @@ void fillGridSystemState(SEXP state, pGEDevDesc dd)

SEXP gridStateElement(pGEDevDesc dd, int elementIndex)
{
int gridRegisterIndex = *((int *) FASTR_GlobalVarGetPtr(fastr_glob_gridRegisterIndex));
return VECTOR_ELT((SEXP) dd->gesd[gridRegisterIndex]->systemSpecific,
elementIndex);
}

void setGridStateElement(pGEDevDesc dd, int elementIndex, SEXP value)
{
int gridRegisterIndex = *((int *) FASTR_GlobalVarGetPtr(fastr_glob_gridRegisterIndex));
SET_VECTOR_ELT((SEXP) dd->gesd[gridRegisterIndex]->systemSpecific,
elementIndex, value);
}

static void deglobaliseState(SEXP state)
{
SEXP R_gridEvalEnv = FASTR_GlobalVarGetSEXP(fastr_glob_R_gridEvalEnv);
int index = INTEGER(VECTOR_ELT(state, GSS_GLOBALINDEX))[0];
SET_VECTOR_ELT(findVar(install(".GRID.STATE"), R_gridEvalEnv),
index, R_NilValue);
Expand All @@ -163,7 +160,6 @@ static int findStateSlot()
{
int i;
int result = -1;
SEXP R_gridEvalEnv = FASTR_GlobalVarGetSEXP(fastr_glob_R_gridEvalEnv);
SEXP globalstate = findVar(install(".GRID.STATE"), R_gridEvalEnv);
for (i = 0; i < length(globalstate); i++)
if (VECTOR_ELT(globalstate, i) == R_NilValue) {
Expand All @@ -179,7 +175,6 @@ static void globaliseState(SEXP state)
{
int index = findStateSlot();
SEXP globalstate, indexsxp;
SEXP R_gridEvalEnv = FASTR_GlobalVarGetSEXP(fastr_glob_R_gridEvalEnv);
PROTECT(globalstate = findVar(install(".GRID.STATE"), R_gridEvalEnv));
/* Record the index for deglobalisation
*/
Expand All @@ -199,7 +194,6 @@ SEXP gridCallback(GEevent task, pGEDevDesc dd, SEXP data) {
SEXP gsd;
SEXP devsize;
R_GE_gcontext gc;
int gridRegisterIndex = *((int *) FASTR_GlobalVarGetPtr(fastr_glob_gridRegisterIndex));
switch (task) {
case GE_InitState:
/* Create the initial grid state for a device
Expand Down Expand Up @@ -292,7 +286,6 @@ SEXP gridCallback(GEevent task, pGEDevDesc dd, SEXP data) {
*/
SEXP fcall;
PROTECT(fcall = lang1(install("draw.all")));
SEXP R_gridEvalEnv = FASTR_GlobalVarGetSEXP(fastr_glob_R_gridEvalEnv);
eval(fcall, R_gridEvalEnv);
UNPROTECT(1);
}
Expand Down
Loading

0 comments on commit 2e8e655

Please sign in to comment.