The R Project SVN R

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
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
}