| 16876 |
murrell |
1 |
/* The beginning of code which represents an R base graphics system
|
|
|
2 |
* separate from an R graphics engine (separate from R devices)
|
|
|
3 |
*/
|
|
|
4 |
|
| 26857 |
ripley |
5 |
#ifdef HAVE_CONFIG_H
|
|
|
6 |
#include <config.h>
|
|
|
7 |
#endif
|
|
|
8 |
|
| 16876 |
murrell |
9 |
#include <Defn.h>
|
|
|
10 |
#include <Graphics.h>
|
|
|
11 |
#include <Rdevices.h>
|
|
|
12 |
|
| 17076 |
ripley |
13 |
int baseRegisterIndex = -1;
|
| 16991 |
murrell |
14 |
|
| 17113 |
murrell |
15 |
void restoredpSaved(DevDesc *dd);
|
|
|
16 |
|
| 17022 |
murrell |
17 |
SEXP baseCallback(GEevent task, GEDevDesc *dd, SEXP data) {
|
| 17019 |
murrell |
18 |
GEDevDesc *curdd;
|
| 16876 |
murrell |
19 |
GESystemDesc *sd;
|
|
|
20 |
NewDevDesc *dev;
|
| 17270 |
murrell |
21 |
GPar *ddp;
|
|
|
22 |
GPar *ddpSaved;
|
| 17022 |
murrell |
23 |
SEXP state;
|
| 17113 |
murrell |
24 |
SEXP valid;
|
| 17022 |
murrell |
25 |
SEXP result = R_NilValue;
|
| 16876 |
murrell |
26 |
switch (task) {
|
|
|
27 |
case GE_FinaliseState:
|
|
|
28 |
sd = dd->gesd[baseRegisterIndex];
|
| 17022 |
murrell |
29 |
free((baseSystemState*) sd->systemSpecific);
|
| 16876 |
murrell |
30 |
sd->systemSpecific = NULL;
|
|
|
31 |
break;
|
|
|
32 |
case GE_InitState:
|
|
|
33 |
sd = dd->gesd[baseRegisterIndex];
|
|
|
34 |
dev = dd->dev;
|
|
|
35 |
sd->systemSpecific = malloc(sizeof(baseSystemState));
|
|
|
36 |
ddp = &(((baseSystemState*) sd->systemSpecific)->dp);
|
|
|
37 |
GInit(ddp);
|
|
|
38 |
/* Some things are set by the device, so copy them across now.
|
|
|
39 |
*/
|
|
|
40 |
ddp->ipr[0] = dev->ipr[0];
|
|
|
41 |
ddp->ipr[1] = dev->ipr[1];
|
|
|
42 |
ddp->cra[0] = dev->cra[0];
|
|
|
43 |
ddp->cra[1] = dev->cra[1];
|
|
|
44 |
ddp->asp = dev->asp;
|
|
|
45 |
ddp->left = dev->left;
|
|
|
46 |
ddp->right = dev->right;
|
|
|
47 |
ddp->top = dev->top;
|
|
|
48 |
ddp->bottom = dev->bottom;
|
|
|
49 |
ddp->xCharOffset = dev->xCharOffset;
|
|
|
50 |
ddp->yCharOffset = dev->yCharOffset;
|
|
|
51 |
ddp->yLineBias = dev->yLineBias;
|
|
|
52 |
ddp->canResizePlot = dev->canResizePlot;
|
|
|
53 |
ddp->canChangeFont = dev->canChangeFont;
|
|
|
54 |
ddp->canRotateText = dev->canRotateText;
|
|
|
55 |
ddp->canResizeText = dev->canResizeText;
|
|
|
56 |
ddp->canClip = dev->canClip;
|
|
|
57 |
ddp->canHAdj = dev->canHAdj;
|
| 16951 |
murrell |
58 |
/* For some things, the device sets the starting value at least.
|
|
|
59 |
*/
|
|
|
60 |
ddp->ps = dev->startps;
|
|
|
61 |
ddp->col = ddp->fg = dev->startcol;
|
|
|
62 |
ddp->bg = dev->startfill;
|
| 17165 |
murrell |
63 |
ddp->font = dev->startfont;
|
|
|
64 |
ddp->lty = dev->startlty;
|
|
|
65 |
ddp->gamma = dev->startgamma;
|
| 16951 |
murrell |
66 |
/* Initialise the gp settings too.
|
|
|
67 |
*/
|
| 17039 |
murrell |
68 |
/* copyGPar(ddp, &(((baseSystemState*) sd->systemSpecific)->gp)); */
|
| 16876 |
murrell |
69 |
break;
|
| 17019 |
murrell |
70 |
case GE_CopyState:
|
| 17024 |
murrell |
71 |
sd = dd->gesd[baseRegisterIndex];
|
| 17019 |
murrell |
72 |
curdd = GEcurrentDevice();
|
|
|
73 |
copyGPar(&(((baseSystemState*) sd->systemSpecific)->dpSaved),
|
|
|
74 |
&(((baseSystemState*)
|
|
|
75 |
curdd->gesd[baseRegisterIndex]->systemSpecific)->dpSaved));
|
| 17270 |
murrell |
76 |
restoredpSaved((DevDesc*) curdd);
|
| 17113 |
murrell |
77 |
copyGPar(&(((baseSystemState*)
|
|
|
78 |
curdd->gesd[baseRegisterIndex]->systemSpecific)->dp),
|
|
|
79 |
&(((baseSystemState*)
|
|
|
80 |
curdd->gesd[baseRegisterIndex]->systemSpecific)->gp));
|
|
|
81 |
GReset((DevDesc*) curdd);
|
| 17019 |
murrell |
82 |
break;
|
| 17113 |
murrell |
83 |
case GE_SaveState:
|
|
|
84 |
sd = dd->gesd[baseRegisterIndex];
|
|
|
85 |
copyGPar(&(((baseSystemState*) sd->systemSpecific)->dp),
|
|
|
86 |
&(((baseSystemState*) sd->systemSpecific)->dpSaved));
|
| 16876 |
murrell |
87 |
break;
|
| 17113 |
murrell |
88 |
case GE_RestoreState:
|
|
|
89 |
sd = dd->gesd[baseRegisterIndex];
|
|
|
90 |
restoredpSaved((DevDesc*) dd);
|
|
|
91 |
copyGPar(&(((baseSystemState*) sd->systemSpecific)->dp),
|
|
|
92 |
&(((baseSystemState*) sd->systemSpecific)->gp));
|
|
|
93 |
GReset((DevDesc*) dd);
|
|
|
94 |
break;
|
| 17022 |
murrell |
95 |
case GE_SaveSnapshotState:
|
| 17039 |
murrell |
96 |
sd = dd->gesd[baseRegisterIndex];
|
| 17022 |
murrell |
97 |
PROTECT(state = allocVector(INTSXP,
|
|
|
98 |
/* Got this formula from devga.c
|
|
|
99 |
* Not sure why the "+ 1"
|
|
|
100 |
* Rounding up?
|
|
|
101 |
*/
|
|
|
102 |
1 + sizeof(GPar) / sizeof(int)));
|
|
|
103 |
copyGPar(&(((baseSystemState*) sd->systemSpecific)->dpSaved),
|
|
|
104 |
(GPar*) INTEGER(state));
|
|
|
105 |
result = state;
|
|
|
106 |
UNPROTECT(1);
|
|
|
107 |
break;
|
|
|
108 |
case GE_RestoreSnapshotState:
|
| 17039 |
murrell |
109 |
sd = dd->gesd[baseRegisterIndex];
|
| 17022 |
murrell |
110 |
copyGPar((GPar*) INTEGER(data),
|
|
|
111 |
&(((baseSystemState*) sd->systemSpecific)->dpSaved));
|
| 17113 |
murrell |
112 |
restoredpSaved((DevDesc*) dd);
|
|
|
113 |
copyGPar(&(((baseSystemState*) sd->systemSpecific)->dp),
|
|
|
114 |
&(((baseSystemState*) sd->systemSpecific)->gp));
|
|
|
115 |
GReset((DevDesc*) dd);
|
| 17022 |
murrell |
116 |
break;
|
| 17113 |
murrell |
117 |
case GE_CheckPlot:
|
|
|
118 |
/* Check that the current plotting state is "valid"
|
|
|
119 |
*/
|
|
|
120 |
sd = dd->gesd[baseRegisterIndex];
|
|
|
121 |
PROTECT(valid = allocVector(LGLSXP, 1));
|
|
|
122 |
LOGICAL(valid)[0] = ((baseSystemState*) sd->systemSpecific)->gp.valid;
|
|
|
123 |
UNPROTECT(1);
|
|
|
124 |
result = valid;
|
| 17270 |
murrell |
125 |
break;
|
|
|
126 |
case GE_ScalePS:
|
|
|
127 |
sd = dd->gesd[baseRegisterIndex];
|
|
|
128 |
dev = dd->dev;
|
|
|
129 |
ddp = &(((baseSystemState*) sd->systemSpecific)->dp);
|
|
|
130 |
ddpSaved = &(((baseSystemState*) sd->systemSpecific)->dpSaved);
|
|
|
131 |
if (isReal(data) && LENGTH(data) == 1) {
|
|
|
132 |
double rf = REAL(data)[0];
|
|
|
133 |
/* The pointsize appears to be being scaled somewhere else
|
|
|
134 |
* Can't see where yet; this seems to work and will have
|
|
|
135 |
* to do while we're in feature freeze (!?)
|
|
|
136 |
* ddp->ps *= rf;
|
|
|
137 |
*/
|
|
|
138 |
ddp->cra[0] *= rf;
|
|
|
139 |
ddp->cra[1] *= rf;
|
|
|
140 |
/* Modify the saved settings so effects dislpay list too
|
|
|
141 |
*/
|
|
|
142 |
/* The pointsize appears to be being scaled somewhere else
|
|
|
143 |
* Can't see where yet; this seems to work and will have
|
|
|
144 |
* to do while we're in feature freeze (!?)
|
|
|
145 |
* ddpSaved->ps *= rf;
|
|
|
146 |
*/
|
|
|
147 |
ddpSaved->cra[0] *= rf;
|
|
|
148 |
ddpSaved->cra[1] *= rf;
|
|
|
149 |
}
|
|
|
150 |
else
|
|
|
151 |
error("Event UpdatePS requires a single numeric value");
|
|
|
152 |
break;
|
| 16876 |
murrell |
153 |
}
|
| 17022 |
murrell |
154 |
return result;
|
| 16876 |
murrell |
155 |
}
|
|
|
156 |
|
|
|
157 |
/* Register the base graphics system with the graphics engine
|
|
|
158 |
*/
|
|
|
159 |
void registerBase() {
|
| 17360 |
murrell |
160 |
GEregisterSystem(baseCallback, &baseRegisterIndex);
|
| 16876 |
murrell |
161 |
}
|
|
|
162 |
|
|
|
163 |
/* FIXME: Make this a macro to avoid function call overhead?
|
|
|
164 |
*/
|
| 17179 |
murrell |
165 |
GPar* Rf_gpptr(DevDesc *dd) {
|
| 26787 |
murrell |
166 |
return &(((baseSystemState*) GEsystemState((GEDevDesc*) dd,
|
|
|
167 |
baseRegisterIndex))->gp);
|
| 16876 |
murrell |
168 |
}
|
|
|
169 |
|
| 17179 |
murrell |
170 |
GPar* Rf_dpptr(DevDesc *dd) {
|
| 26787 |
murrell |
171 |
return &(((baseSystemState*) GEsystemState((GEDevDesc*) dd,
|
|
|
172 |
baseRegisterIndex))->dp);
|
| 16876 |
murrell |
173 |
}
|
|
|
174 |
|
| 17179 |
murrell |
175 |
GPar* Rf_dpSavedptr(DevDesc *dd) {
|
| 26787 |
murrell |
176 |
return &(((baseSystemState*) GEsystemState((GEDevDesc*) dd,
|
|
|
177 |
baseRegisterIndex))->dpSaved);
|
| 16876 |
murrell |
178 |
}
|
|
|
179 |
|
| 17179 |
murrell |
180 |
SEXP Rf_displayList(DevDesc *dd) {
|
| 26787 |
murrell |
181 |
return ((GEDevDesc*) dd)->dev->displayList;
|
| 16876 |
murrell |
182 |
}
|