The R Project SVN R

Rev

Rev 32380 | Rev 32397 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 32380 Rev 32392
Line 19... Line 19...
19
 *  You should have received a copy of the GNU General Public License
19
 *  You should have received a copy of the GNU General Public License
20
 *  along with this program; if not, write to the Free Software
20
 *  along with this program; if not, write to the Free Software
21
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
 */
22
 */
23
 
23
 
24
/* <UTF8-FIXME> 
24
/* <UTF8-FIXME>
25
   byte-level access and use of ctype functions
25
   byte-level access and use of ctype functions
26
   byte-level charmetric information.
26
   byte-level charmetric information.
-
 
27
   Has encoding of symbol font hard-coded.
27
*/
28
*/
28
 
29
 
29
#ifdef HAVE_CONFIG_H
30
#ifdef HAVE_CONFIG_H
30
#include <config.h>
31
#include <config.h>
31
#endif
32
#endif
Line 949... Line 950...
949
			  mathContext*, R_GE_gcontext*, GEDevDesc*);
950
			  mathContext*, R_GE_gcontext*, GEDevDesc*);
950
static BBOX RenderOffsetElement(SEXP, double, double, int,
951
static BBOX RenderOffsetElement(SEXP, double, double, int,
951
				mathContext*, R_GE_gcontext*, GEDevDesc*);
952
				mathContext*, R_GE_gcontext*, GEDevDesc*);
952
static BBOX RenderExpression(SEXP, int,
953
static BBOX RenderExpression(SEXP, int,
953
			     mathContext*, R_GE_gcontext*, GEDevDesc*);
954
			     mathContext*, R_GE_gcontext*, GEDevDesc*);
954
static BBOX RenderSymbolChar(int, int, 
955
static BBOX RenderSymbolChar(int, int,
955
			     mathContext*, R_GE_gcontext*, GEDevDesc*);
956
			     mathContext*, R_GE_gcontext*, GEDevDesc*);
956
 
957
 
957
 
958
 
958
/*  Code to Generate Bounding Boxes and Draw Formulae.	*/
959
/*  Code to Generate Bounding Boxes and Draw Formulae.	*/
959
 
960
 
960
static BBOX RenderItalicCorr(BBOX bbox, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
961
static BBOX RenderItalicCorr(BBOX bbox, int draw, mathContext *mc,
-
 
962
			     R_GE_gcontext *gc, GEDevDesc *dd)
961
{
963
{
962
    if (bboxItalic(bbox) > 0) {
964
    if (bboxItalic(bbox) > 0) {
963
	if (draw)
965
	if (draw)
964
	    PMoveAcross(bboxItalic(bbox), mc);
966
	    PMoveAcross(bboxItalic(bbox), mc);
965
	bboxWidth(bbox) += bboxItalic(bbox);
967
	bboxWidth(bbox) += bboxItalic(bbox);
966
	bboxItalic(bbox) = 0;
968
	bboxItalic(bbox) = 0;
967
    }
969
    }
968
    return bbox;
970
    return bbox;
969
}
971
}
970
 
972
 
971
static BBOX RenderGap(double gap, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
973
static BBOX RenderGap(double gap, int draw, mathContext *mc,
-
 
974
		      R_GE_gcontext *gc, GEDevDesc *dd)
972
{
975
{
973
    if (draw)
976
    if (draw)
974
	PMoveAcross(gap, mc);
977
	PMoveAcross(gap, mc);
975
    return MakeBBox(0, 0, gap);
978
    return MakeBBox(0, 0, gap);
976
}
979
}
977
 
980
 
978
/* Draw a Symbol from the Special Font */
981
/* Draw a Symbol from the Special Font */
979
 
982
 
980
static BBOX RenderSymbolChar(int ascii, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
983
static BBOX RenderSymbolChar(int ascii, int draw, mathContext *mc,
-
 
984
			     R_GE_gcontext *gc, GEDevDesc *dd)
981
{
985
{
982
    FontType prev;
986
    FontType prev;
983
    BBOX bbox;
987
    BBOX bbox;
984
    char asciiStr[2];
988
    char asciiStr[2];
985
    if (ascii == A_HAT || ascii == A_TILDE)
989
    if (ascii == A_HAT || ascii == A_TILDE)
Line 988... Line 992...
988
	prev = SetFont(SymbolFont, gc);
992
	prev = SetFont(SymbolFont, gc);
989
    bbox = GlyphBBox(ascii, gc, dd);
993
    bbox = GlyphBBox(ascii, gc, dd);
990
    if (draw) {
994
    if (draw) {
991
	asciiStr[0] = ascii;
995
	asciiStr[0] = ascii;
992
	asciiStr[1] = '\0';
996
	asciiStr[1] = '\0';
993
	GEText(ConvertedX(mc ,dd), ConvertedY(mc, dd), asciiStr, 
997
	GEText(ConvertedX(mc ,dd), ConvertedY(mc, dd), asciiStr,
994
	       0.0, 0.0, mc->CurrentAngle, gc,
998
	       0.0, 0.0, mc->CurrentAngle, gc,
995
	       dd);
999
	       dd);
996
	PMoveAcross(bboxWidth(bbox), mc);
1000
	PMoveAcross(bboxWidth(bbox), mc);
997
    }
1001
    }
998
    SetFont(prev, gc);
1002
    SetFont(prev, gc);
Line 1001... Line 1005...
1001
 
1005
 
1002
/* Draw a Symbol String in "Math Mode */
1006
/* Draw a Symbol String in "Math Mode */
1003
/* This code inserts italic corrections after */
1007
/* This code inserts italic corrections after */
1004
/* every character. */
1008
/* every character. */
1005
 
1009
 
1006
static BBOX RenderSymbolStr(char *str, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1010
static BBOX RenderSymbolStr(char *str, int draw, mathContext *mc,
-
 
1011
			    R_GE_gcontext *gc, GEDevDesc *dd)
1007
{
1012
{
1008
    char chr[2];
1013
    char chr[2];
1009
    BBOX glyphBBox;
1014
    BBOX glyphBBox;
1010
    BBOX resultBBox = NullBBox();
1015
    BBOX resultBBox = NullBBox();
1011
    double lastItalicCorr = 0;
1016
    double lastItalicCorr = 0;
Line 1048... Line 1053...
1048
    return resultBBox;
1053
    return resultBBox;
1049
}
1054
}
1050
 
1055
 
1051
/* Code for Character String Atoms. */
1056
/* Code for Character String Atoms. */
1052
 
1057
 
1053
static BBOX RenderChar(int ascii, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1058
static BBOX RenderChar(int ascii, int draw, mathContext *mc,
-
 
1059
		       R_GE_gcontext *gc, GEDevDesc *dd)
1054
{
1060
{
1055
    BBOX bbox;
1061
    BBOX bbox;
1056
    char asciiStr[2];
1062
    char asciiStr[2];
1057
    bbox = GlyphBBox(ascii, gc, dd);
1063
    bbox = GlyphBBox(ascii, gc, dd);
1058
    if (draw) {
1064
    if (draw) {
Line 1064... Line 1070...
1064
	PMoveAcross(bboxWidth(bbox), mc);
1070
	PMoveAcross(bboxWidth(bbox), mc);
1065
    }
1071
    }
1066
    return bbox;
1072
    return bbox;
1067
}
1073
}
1068
 
1074
 
1069
static BBOX RenderStr(char *str, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1075
static BBOX RenderStr(char *str, int draw, mathContext *mc,
-
 
1076
		      R_GE_gcontext *gc, GEDevDesc *dd)
1070
{
1077
{
1071
    BBOX glyphBBox;
1078
    BBOX glyphBBox;
1072
    BBOX resultBBox = NullBBox();
1079
    BBOX resultBBox = NullBBox();
1073
    if (str) {
1080
    if (str) {
1074
	char *s = str;
1081
	char *s = str;
Line 1093... Line 1100...
1093
}
1100
}
1094
 
1101
 
1095
 
1102
 
1096
/* Code for Symbol Font Atoms */
1103
/* Code for Symbol Font Atoms */
1097
 
1104
 
1098
static BBOX RenderSymbol(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1105
static BBOX RenderSymbol(SEXP expr, int draw, mathContext *mc,
-
 
1106
			 R_GE_gcontext *gc, GEDevDesc *dd)
1099
{
1107
{
1100
    int code;
1108
    int code;
1101
    if ((code = TranslatedSymbol(expr)))
1109
    if ((code = TranslatedSymbol(expr)))
1102
	return RenderSymbolChar(code, draw, mc, gc, dd);
1110
	return RenderSymbolChar(code, draw, mc, gc, dd);
1103
    else
1111
    else
1104
	return RenderSymbolStr(CHAR(PRINTNAME(expr)), draw, mc, gc, dd);
1112
	return RenderSymbolStr(CHAR(PRINTNAME(expr)), draw, mc, gc, dd);
1105
}
1113
}
1106
 
1114
 
1107
static BBOX RenderSymbolString(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1115
static BBOX RenderSymbolString(SEXP expr, int draw, mathContext *mc,
-
 
1116
			       R_GE_gcontext *gc, GEDevDesc *dd)
1108
{
1117
{
1109
    int code;
1118
    int code;
1110
    if ((code = TranslatedSymbol(expr)))
1119
    if ((code = TranslatedSymbol(expr)))
1111
	return RenderSymbolChar(code, draw, mc, gc, dd);
1120
	return RenderSymbolChar(code, draw, mc, gc, dd);
1112
    else
1121
    else
Line 1114... Line 1123...
1114
}
1123
}
1115
 
1124
 
1116
 
1125
 
1117
/* Code for Numeric Atoms */
1126
/* Code for Numeric Atoms */
1118
 
1127
 
1119
static BBOX RenderNumber(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1128
static BBOX RenderNumber(SEXP expr, int draw, mathContext *mc,
-
 
1129
			 R_GE_gcontext *gc, GEDevDesc *dd)
1120
{
1130
{
1121
    BBOX bbox;
1131
    BBOX bbox;
1122
    FontType prevfont = SetFont(PlainFont, gc);
1132
    FontType prevfont = SetFont(PlainFont, gc);
1123
    bbox = RenderStr(CHAR(asChar(expr)), draw, mc, gc, dd);
1133
    bbox = RenderStr(CHAR(asChar(expr)), draw, mc, gc, dd);
1124
    SetFont(prevfont, gc);
1134
    SetFont(prevfont, gc);
1125
    return bbox;
1135
    return bbox;
1126
}
1136
}
1127
 
1137
 
1128
/* Code for String Atoms */
1138
/* Code for String Atoms */
1129
 
1139
 
1130
static BBOX RenderString(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1140
static BBOX RenderString(SEXP expr, int draw, mathContext *mc,
-
 
1141
			 R_GE_gcontext *gc, GEDevDesc *dd)
1131
{
1142
{
1132
    return RenderStr(CHAR(STRING_ELT(expr, 0)), draw, mc, gc, dd);
1143
    return RenderStr(CHAR(STRING_ELT(expr, 0)), draw, mc, gc, dd);
1133
}
1144
}
1134
 
1145
 
1135
/* Code for Ellipsis (ldots, cdots, ...) */
1146
/* Code for Ellipsis (ldots, cdots, ...) */
Line 1141... Line 1152...
1141
	NameMatch(expr, "ldots"))
1152
	NameMatch(expr, "ldots"))
1142
	    return 1;
1153
	    return 1;
1143
    return 0;
1154
    return 0;
1144
}
1155
}
1145
 
1156
 
1146
static BBOX RenderDots(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1157
static BBOX RenderDots(SEXP expr, int draw, mathContext *mc,
-
 
1158
		       R_GE_gcontext *gc, GEDevDesc *dd)
1147
{
1159
{
1148
    BBOX bbox = RenderSymbolChar(S_ELLIPSIS, 0, mc, gc, dd);
1160
    BBOX bbox = RenderSymbolChar(S_ELLIPSIS, 0, mc, gc, dd);
1149
    if (NameMatch(expr, "cdots") || NameMatch(expr, "...")) {
1161
    if (NameMatch(expr, "cdots") || NameMatch(expr, "...")) {
1150
	double shift = AxisHeight(gc, dd) - 0.5 * bboxHeight(bbox);
1162
	double shift = AxisHeight(gc, dd) - 0.5 * bboxHeight(bbox);
1151
	if (draw) {
1163
	if (draw) {
Line 1166... Line 1178...
1166
 *
1178
 *
1167
 *  Code for Atoms
1179
 *  Code for Atoms
1168
 *
1180
 *
1169
 */
1181
 */
1170
 
1182
 
1171
static BBOX RenderAtom(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1183
static BBOX RenderAtom(SEXP expr, int draw, mathContext *mc,
-
 
1184
		       R_GE_gcontext *gc, GEDevDesc *dd)
1172
{
1185
{
1173
    if (NameAtom(expr)) {
1186
    if (NameAtom(expr)) {
1174
	if (DotsAtom(expr))
1187
	if (DotsAtom(expr))
1175
	    return RenderDots(expr, draw, mc, gc, dd);
1188
	    return RenderDots(expr, draw, mc, gc, dd);
1176
	else
1189
	else
Line 1197... Line 1210...
1197
{
1210
{
1198
    return NameAtom(expr) && NameMatch(expr, "~");
1211
    return NameAtom(expr) && NameMatch(expr, "~");
1199
}
1212
}
1200
 
1213
 
1201
 
1214
 
1202
static BBOX RenderSpace(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1215
static BBOX RenderSpace(SEXP expr, int draw, mathContext *mc,
-
 
1216
			R_GE_gcontext *gc, GEDevDesc *dd)
1203
{
1217
{
1204
 
1218
 
1205
    BBOX opBBox, arg1BBox, arg2BBox;
1219
    BBOX opBBox, arg1BBox, arg2BBox;
1206
    int nexpr = length(expr);
1220
    int nexpr = length(expr);
1207
 
1221
 
Line 1248... Line 1262...
1248
    return 0;
1262
    return 0;
1249
}
1263
}
1250
 
1264
 
1251
#define SLASH2
1265
#define SLASH2
1252
 
1266
 
1253
static BBOX RenderSlash(int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1267
static BBOX RenderSlash(int draw, mathContext *mc, R_GE_gcontext *gc,
-
 
1268
			GEDevDesc *dd)
1254
{
1269
{
1255
#ifdef SLASH0
1270
#ifdef SLASH0
1256
    /* The Default Font Character */
1271
    /* The Default Font Character */
1257
    return RenderSymbolChar(S_SLASH, draw, mc, gc, dd);
1272
    return RenderSymbolChar(S_SLASH, draw, mc, gc, dd);
1258
#endif
1273
#endif
Line 1310... Line 1325...
1310
    double delta = TeX(sigma22, gc, dd);
1325
    double delta = TeX(sigma22, gc, dd);
1311
    if (draw)
1326
    if (draw)
1312
	PMoveUp(-delta, mc);
1327
	PMoveUp(-delta, mc);
1313
    ansBBox = ShiftBBox(RenderSymbolChar(S_SLASH, draw), -delta, mc, gc, dd);
1328
    ansBBox = ShiftBBox(RenderSymbolChar(S_SLASH, draw), -delta, mc, gc, dd);
1314
    PMoveUp(2 * delta, mc);
1329
    PMoveUp(2 * delta, mc);
1315
    ansBBox = CombineBBoxes(ansBBox, RenderGap(2 * delta / slope, draw, mc, gc, dd));
1330
    ansBBox = CombineBBoxes(ansBBox, RenderGap(2 * delta / slope, draw,
-
 
1331
					       mc, gc, dd));
1316
    ansBBox = ShiftBBox(RenderSymbolChar(S_SLASH, draw), 2 * delta, mc, gc, dd);
1332
    ansBBox = ShiftBBox(RenderSymbolChar(S_SLASH, draw), 2 * delta,
-
 
1333
			mc, gc, dd);
1317
    PMoveUp(-delta, mc);
1334
    PMoveUp(-delta, mc);
1318
    return ansBBox;
1335
    return ansBBox;
1319
#endif
1336
#endif
1320
}
1337
}
1321
 
1338
 
1322
static BBOX RenderBin(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1339
static BBOX RenderBin(SEXP expr, int draw, mathContext *mc,
-
 
1340
		      R_GE_gcontext *gc, GEDevDesc *dd)
1323
{
1341
{
1324
    int op = BinAtom(CAR(expr));
1342
    int op = BinAtom(CAR(expr));
1325
    int nexpr = length(expr);
1343
    int nexpr = length(expr);
1326
    BBOX bbox;
1344
    BBOX bbox;
1327
    double gap;
1345
    double gap;
1328
 
1346
 
1329
    if(nexpr == 3) {
1347
    if(nexpr == 3) {
1330
	if (op == S_ASTERISKMATH) {
1348
	if (op == S_ASTERISKMATH) {
1331
	    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
1349
	    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
1332
	    bbox = RenderItalicCorr(bbox, draw, mc, gc, dd);
1350
	    bbox = RenderItalicCorr(bbox, draw, mc, gc, dd);
1333
	    return CombineBBoxes(bbox, RenderElement(CADDR(expr), draw, mc, gc, dd));
1351
	    return CombineBBoxes(bbox, RenderElement(CADDR(expr), draw,
-
 
1352
						     mc, gc, dd));
1334
	}
1353
	}
1335
	else if (op == S_SLASH) {
1354
	else if (op == S_SLASH) {
1336
	    gap = 0;
1355
	    gap = 0;
1337
	    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
1356
	    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
1338
	    bbox = RenderItalicCorr(bbox, draw, mc, gc, dd);
1357
	    bbox = RenderItalicCorr(bbox, draw, mc, gc, dd);
1339
	    bbox = CombineBBoxes(bbox, RenderGap(gap, draw, mc, gc, dd));
1358
	    bbox = CombineBBoxes(bbox, RenderGap(gap, draw, mc, gc, dd));
1340
	    bbox = CombineBBoxes(bbox, RenderSlash(draw, mc, gc, dd));
1359
	    bbox = CombineBBoxes(bbox, RenderSlash(draw, mc, gc, dd));
1341
	    bbox = CombineBBoxes(bbox, RenderGap(gap, draw, mc, gc, dd));
1360
	    bbox = CombineBBoxes(bbox, RenderGap(gap, draw, mc, gc, dd));
1342
	    return CombineBBoxes(bbox, RenderElement(CADDR(expr), draw, mc, gc, dd));
1361
	    return CombineBBoxes(bbox, RenderElement(CADDR(expr), draw,
-
 
1362
						     mc, gc, dd));
1343
	}
1363
	}
1344
	else {
1364
	else {
1345
	    gap = (mc->CurrentStyle > STYLE_S) ? MediumSpace(gc, dd) : 0;
1365
	    gap = (mc->CurrentStyle > STYLE_S) ? MediumSpace(gc, dd) : 0;
1346
	    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
1366
	    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
1347
	    bbox = RenderItalicCorr(bbox, draw, mc, gc, dd);
1367
	    bbox = RenderItalicCorr(bbox, draw, mc, gc, dd);
1348
	    bbox = CombineBBoxes(bbox, RenderGap(gap, draw, mc, gc, dd));
1368
	    bbox = CombineBBoxes(bbox, RenderGap(gap, draw, mc, gc, dd));
1349
	    bbox = CombineBBoxes(bbox, RenderSymbolChar(op, draw, mc, gc, dd));
1369
	    bbox = CombineBBoxes(bbox, RenderSymbolChar(op, draw, mc, gc, dd));
1350
	    bbox = CombineBBoxes(bbox, RenderGap(gap, draw, mc, gc, dd));
1370
	    bbox = CombineBBoxes(bbox, RenderGap(gap, draw, mc, gc, dd));
1351
	    return CombineBBoxes(bbox, RenderElement(CADDR(expr), draw, mc, gc, dd));
1371
	    return CombineBBoxes(bbox, RenderElement(CADDR(expr), draw,
-
 
1372
						     mc, gc, dd));
1352
	}
1373
	}
1353
    }
1374
    }
1354
    else if(nexpr == 2) {
1375
    else if(nexpr == 2) {
1355
	gap = (mc->CurrentStyle > STYLE_S) ? ThinSpace(gc, dd) : 0;
1376
	gap = (mc->CurrentStyle > STYLE_S) ? ThinSpace(gc, dd) : 0;
1356
	bbox = RenderSymbolChar(op, draw, mc, gc, dd);
1377
	bbox = RenderSymbolChar(op, draw, mc, gc, dd);
1357
	bbox = CombineBBoxes(bbox, RenderGap(gap, draw, mc, gc, dd));
1378
	bbox = CombineBBoxes(bbox, RenderGap(gap, draw, mc, gc, dd));
1358
	return CombineBBoxes(bbox, RenderElement(CADR(expr), draw, mc, gc, dd));
1379
	return CombineBBoxes(bbox, RenderElement(CADR(expr), draw, mc,
-
 
1380
						 gc, dd));
1359
    }
1381
    }
1360
    else
1382
    else
1361
	error("invalid mathematical annotation");
1383
	error("invalid mathematical annotation");
1362
 
1384
 
1363
    return NullBBox();		/* -Wall */
1385
    return NullBBox();		/* -Wall */
Line 1384... Line 1406...
1384
}
1406
}
1385
 
1407
 
1386
/* Note : If all computations are correct */
1408
/* Note : If all computations are correct */
1387
/* We do not need to save and restore the */
1409
/* We do not need to save and restore the */
1388
/* current location here.  This is paranoia. */
1410
/* current location here.  This is paranoia. */
1389
static BBOX RenderSub(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1411
static BBOX RenderSub(SEXP expr, int draw, mathContext *mc,
-
 
1412
		      R_GE_gcontext *gc, GEDevDesc *dd)
1390
{
1413
{
1391
    BBOX bodyBBox, subBBox;
1414
    BBOX bodyBBox, subBBox;
1392
    SEXP body = CADR(expr);
1415
    SEXP body = CADR(expr);
1393
    SEXP sub = CADDR(expr);
1416
    SEXP sub = CADDR(expr);
1394
    STYLE style = GetStyle(mc);
1417
    STYLE style = GetStyle(mc);
Line 1409... Line 1432...
1409
    if (draw)
1432
    if (draw)
1410
	PMoveTo(savedX + bboxWidth(bodyBBox), savedY, mc);
1433
	PMoveTo(savedX + bboxWidth(bodyBBox), savedY, mc);
1411
    return bodyBBox;
1434
    return bodyBBox;
1412
}
1435
}
1413
 
1436
 
1414
static BBOX RenderSup(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1437
static BBOX RenderSup(SEXP expr, int draw, mathContext *mc,
-
 
1438
		      R_GE_gcontext *gc, GEDevDesc *dd)
1415
{
1439
{
1416
    BBOX bodyBBox, subBBox, supBBox;
1440
    BBOX bodyBBox, subBBox, supBBox;
1417
    SEXP body = CADR(expr);
1441
    SEXP body = CADR(expr);
1418
    SEXP sup = CADDR(expr);
1442
    SEXP sup = CADDR(expr);
1419
    SEXP sub = R_NilValue;	/* -Wall */
1443
    SEXP sub = R_NilValue;	/* -Wall */
Line 1502... Line 1526...
1502
static int WideTildeAtom(SEXP expr)
1526
static int WideTildeAtom(SEXP expr)
1503
{
1527
{
1504
    return NameAtom(expr) && NameMatch(expr, "widetilde");
1528
    return NameAtom(expr) && NameMatch(expr, "widetilde");
1505
}
1529
}
1506
 
1530
 
1507
static BBOX RenderWideTilde(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1531
static BBOX RenderWideTilde(SEXP expr, int draw, mathContext *mc,
-
 
1532
			    R_GE_gcontext *gc, GEDevDesc *dd)
1508
{
1533
{
1509
    double savedX = mc->CurrentX;
1534
    double savedX = mc->CurrentX;
1510
    double savedY = mc->CurrentY;
1535
    double savedY = mc->CurrentY;
1511
    BBOX bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
1536
    BBOX bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
1512
    double height = bboxHeight(bbox);
1537
    double height = bboxHeight(bbox);
Line 1553... Line 1578...
1553
static int WideHatAtom(SEXP expr)
1578
static int WideHatAtom(SEXP expr)
1554
{
1579
{
1555
    return NameAtom(expr) && NameMatch(expr, "widehat");
1580
    return NameAtom(expr) && NameMatch(expr, "widehat");
1556
}
1581
}
1557
 
1582
 
1558
static BBOX RenderWideHat(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1583
static BBOX RenderWideHat(SEXP expr, int draw, mathContext *mc,
-
 
1584
			  R_GE_gcontext *gc, GEDevDesc *dd)
1559
{
1585
{
1560
    double savedX = mc->CurrentX;
1586
    double savedX = mc->CurrentX;
1561
    double savedY = mc->CurrentY;
1587
    double savedY = mc->CurrentY;
1562
    BBOX bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
1588
    BBOX bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
1563
    double accentGap = ACCENT_GAP * XHeight(gc, dd);
1589
    double accentGap = ACCENT_GAP * XHeight(gc, dd);
Line 1594... Line 1620...
1594
static int BarAtom(SEXP expr)
1620
static int BarAtom(SEXP expr)
1595
{
1621
{
1596
    return NameAtom(expr) && NameMatch(expr, "bar");
1622
    return NameAtom(expr) && NameMatch(expr, "bar");
1597
}
1623
}
1598
 
1624
 
1599
static BBOX RenderBar(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1625
static BBOX RenderBar(SEXP expr, int draw, mathContext *mc,
-
 
1626
		      R_GE_gcontext *gc, GEDevDesc *dd)
1600
{
1627
{
1601
    double savedX = mc->CurrentX;
1628
    double savedX = mc->CurrentX;
1602
    double savedY = mc->CurrentY;
1629
    double savedY = mc->CurrentY;
1603
    BBOX bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
1630
    BBOX bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
1604
    double accentGap = ACCENT_GAP * XHeight(gc, dd);
1631
    double accentGap = ACCENT_GAP * XHeight(gc, dd);
Line 1656... Line 1683...
1656
static void InvalidAccent(SEXP expr)
1683
static void InvalidAccent(SEXP expr)
1657
{
1684
{
1658
    errorcall(expr, "invalid accent");
1685
    errorcall(expr, "invalid accent");
1659
}
1686
}
1660
 
1687
 
1661
static BBOX RenderAccent(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1688
static BBOX RenderAccent(SEXP expr, int draw, mathContext *mc,
-
 
1689
			 R_GE_gcontext *gc, GEDevDesc *dd)
1662
{
1690
{
1663
    SEXP body, accent;
1691
    SEXP body, accent;
1664
    double savedX = mc->CurrentX;
1692
    double savedX = mc->CurrentX;
1665
    double savedY = mc->CurrentY;
1693
    double savedY = mc->CurrentY;
1666
    BBOX bodyBBox, accentBBox;
1694
    BBOX bodyBBox, accentBBox;
Line 1686... Line 1714...
1686
    bodyBBox = CombineBBoxes(bodyBBox, RenderElement(body, draw, mc, gc, dd));
1714
    bodyBBox = CombineBBoxes(bodyBBox, RenderElement(body, draw, mc, gc, dd));
1687
    bodyBBox = CombineBBoxes(bodyBBox, RenderGap(xoffset, draw, mc, gc, dd));
1715
    bodyBBox = CombineBBoxes(bodyBBox, RenderGap(xoffset, draw, mc, gc, dd));
1688
    PMoveTo(savedX, savedY, mc);
1716
    PMoveTo(savedX, savedY, mc);
1689
    xoffset = 0.5 *(width - bboxWidth(accentBBox))
1717
    xoffset = 0.5 *(width - bboxWidth(accentBBox))
1690
	+ 0.9 * italic;
1718
	+ 0.9 * italic;
1691
    yoffset = bboxHeight(bodyBBox) + bboxDepth(accentBBox) + 0.1 * XHeight(gc, dd);
1719
    yoffset = bboxHeight(bodyBBox) + bboxDepth(accentBBox) +
-
 
1720
	0.1 * XHeight(gc, dd);
1692
    if (draw) {
1721
    if (draw) {
1693
	PMoveTo(savedX + xoffset, savedY + yoffset, mc);
1722
	PMoveTo(savedX + xoffset, savedY + yoffset, mc);
1694
	if (code == 215) /* dotmath */
1723
	if (code == 215) /* dotmath */
1695
	    RenderSymbolChar(code, draw, mc, gc, dd);
1724
	    RenderSymbolChar(code, draw, mc, gc, dd);
1696
	else
1725
	else
Line 1750... Line 1779...
1750
	*numShift = (denomWidth - numWidth) / 2;
1779
	*numShift = (denomWidth - numWidth) / 2;
1751
	*denomShift = 0;
1780
	*denomShift = 0;
1752
    }
1781
    }
1753
}
1782
}
1754
 
1783
 
1755
static BBOX RenderFraction(SEXP expr, int rule, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1784
static BBOX RenderFraction(SEXP expr, int rule, int draw,
-
 
1785
			   mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1756
{
1786
{
1757
    SEXP numerator = CADR(expr);
1787
    SEXP numerator = CADR(expr);
1758
    SEXP denominator = CADDR(expr);
1788
    SEXP denominator = CADDR(expr);
1759
    BBOX numBBox, denomBBox;
1789
    BBOX numBBox, denomBBox;
1760
    double nHShift, dHShift;
1790
    double nHShift, dHShift;
Line 1764... Line 1794...
1764
    double savedY = mc->CurrentY;
1794
    double savedY = mc->CurrentY;
1765
    STYLE style;
1795
    STYLE style;
1766
 
1796
 
1767
    style = GetStyle(mc);
1797
    style = GetStyle(mc);
1768
    SetNumStyle(style, mc, gc);
1798
    SetNumStyle(style, mc, gc);
1769
    numBBox = RenderItalicCorr(RenderElement(numerator, 0, mc, gc, dd), 0, mc, gc, dd);
1799
    numBBox = RenderItalicCorr(RenderElement(numerator, 0, mc, gc, dd), 0,
-
 
1800
			       mc, gc, dd);
1770
    SetDenomStyle(style, mc, gc);
1801
    SetDenomStyle(style, mc, gc);
1771
    denomBBox = RenderItalicCorr(RenderElement(denominator, 0, mc, gc, dd), 0, mc, gc, dd);
1802
    denomBBox = RenderItalicCorr(RenderElement(denominator, 0, mc, gc, dd), 0,
-
 
1803
				 mc, gc, dd);
1772
    SetStyle(style, mc, gc);
1804
    SetStyle(style, mc, gc);
1773
 
1805
 
1774
    width = max(bboxWidth(numBBox), bboxWidth(denomBBox));
1806
    width = max(bboxWidth(numBBox), bboxWidth(denomBBox));
1775
    NumDenomHShift(numBBox, denomBBox, &nHShift, &dHShift);
1807
    NumDenomHShift(numBBox, denomBBox, &nHShift, &dHShift);
1776
    NumDenomVShift(numBBox, denomBBox, &nVShift, &dVShift, mc, gc, dd);
1808
    NumDenomVShift(numBBox, denomBBox, &nVShift, &dVShift, mc, gc, dd);
1777
 
1809
 
1778
    mc->CurrentX = savedX;
1810
    mc->CurrentX = savedX;
1779
    mc->CurrentY = savedY;
1811
    mc->CurrentY = savedY;
1780
    SetNumStyle(style, mc, gc);
1812
    SetNumStyle(style, mc, gc);
1781
    numBBox = RenderOffsetElement(numerator, nHShift, nVShift, draw, mc, gc, dd);
1813
    numBBox = RenderOffsetElement(numerator, nHShift, nVShift, draw, mc,
-
 
1814
				  gc, dd);
1782
 
1815
 
1783
    mc->CurrentX = savedX;
1816
    mc->CurrentX = savedX;
1784
    mc->CurrentY = savedY;
1817
    mc->CurrentY = savedY;
1785
    SetDenomStyle(style, mc, gc);
1818
    SetDenomStyle(style, mc, gc);
1786
    denomBBox = RenderOffsetElement(denominator, dHShift, -dVShift, draw, mc, gc, dd);
1819
    denomBBox = RenderOffsetElement(denominator, dHShift, -dVShift, draw,
-
 
1820
				    mc, gc, dd);
1787
 
1821
 
1788
    SetStyle(style, mc, gc);
1822
    SetStyle(style, mc, gc);
1789
 
1823
 
1790
    if (draw) {
1824
    if (draw) {
1791
	if (rule) {
1825
	if (rule) {
Line 1856... Line 1890...
1856
{
1890
{
1857
    return NameAtom(expr) &&
1891
    return NameAtom(expr) &&
1858
	(NameMatch(expr, "over") || NameMatch(expr, "frac"));
1892
	(NameMatch(expr, "over") || NameMatch(expr, "frac"));
1859
}
1893
}
1860
 
1894
 
1861
static BBOX RenderOver(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1895
static BBOX RenderOver(SEXP expr, int draw, mathContext *mc,
-
 
1896
		       R_GE_gcontext *gc, GEDevDesc *dd)
1862
{
1897
{
1863
    return RenderFraction(expr, 1, draw, mc, gc, dd);
1898
    return RenderFraction(expr, 1, draw, mc, gc, dd);
1864
}
1899
}
1865
 
1900
 
1866
static int UnderlAtom(SEXP expr)
1901
static int UnderlAtom(SEXP expr)
1867
{
1902
{
1868
    return NameAtom(expr) && NameMatch(expr, "underline");
1903
    return NameAtom(expr) && NameMatch(expr, "underline");
1869
}
1904
}
1870
 
1905
 
1871
static BBOX RenderUnderl(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1906
static BBOX RenderUnderl(SEXP expr, int draw, mathContext *mc,
-
 
1907
			 R_GE_gcontext *gc, GEDevDesc *dd)
1872
{
1908
{
1873
    return RenderUnderline(expr, draw, mc, gc, dd);
1909
    return RenderUnderline(expr, draw, mc, gc, dd);
1874
}
1910
}
1875
 
1911
 
1876
 
1912
 
1877
static int AtopAtom(SEXP expr)
1913
static int AtopAtom(SEXP expr)
1878
{
1914
{
1879
    return NameAtom(expr) && NameMatch(expr, "atop");
1915
    return NameAtom(expr) && NameMatch(expr, "atop");
1880
}
1916
}
1881
 
1917
 
1882
static BBOX RenderAtop(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1918
static BBOX RenderAtop(SEXP expr, int draw, mathContext *mc,
-
 
1919
		       R_GE_gcontext *gc, GEDevDesc *dd)
1883
{
1920
{
1884
    return RenderFraction(expr, 0, draw, mc, gc, dd);
1921
    return RenderFraction(expr, 0, draw, mc, gc, dd);
1885
}
1922
}
1886
 
1923
 
1887
/*----------------------------------------------------------------------
1924
/*----------------------------------------------------------------------
Line 1932... Line 1969...
1932
    if (code == 0)
1969
    if (code == 0)
1933
	errorcall(expr, "invalid group delimiter");
1970
	errorcall(expr, "invalid group delimiter");
1934
    return code;
1971
    return code;
1935
}
1972
}
1936
 
1973
 
1937
static BBOX RenderDelimiter(int delim, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1974
static BBOX RenderDelimiter(int delim, int draw, mathContext *mc,
-
 
1975
			    R_GE_gcontext *gc, GEDevDesc *dd)
1938
{
1976
{
1939
    BBOX bbox;
1977
    BBOX bbox;
1940
    double savecex = gc->cex;
1978
    double savecex = gc->cex;
1941
    gc->cex = DelimSymbolMag * gc->cex;
1979
    gc->cex = DelimSymbolMag * gc->cex;
1942
    bbox = RenderSymbolChar(delim, draw, mc, gc, dd);
1980
    bbox = RenderSymbolChar(delim, draw, mc, gc, dd);
Line 1947... Line 1985...
1947
static int GroupAtom(SEXP expr)
1985
static int GroupAtom(SEXP expr)
1948
{
1986
{
1949
    return NameAtom(expr) && NameMatch(expr, "group");
1987
    return NameAtom(expr) && NameMatch(expr, "group");
1950
}
1988
}
1951
 
1989
 
1952
static BBOX RenderGroup(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
1990
static BBOX RenderGroup(SEXP expr, int draw, mathContext *mc,
-
 
1991
			R_GE_gcontext *gc, GEDevDesc *dd)
1953
{
1992
{
1954
    double cexSaved = gc->cex;
1993
    double cexSaved = gc->cex;
1955
    BBOX bbox;
1994
    BBOX bbox;
1956
    int code;
1995
    int code;
1957
    if (length(expr) != 4)
1996
    if (length(expr) != 4)
Line 1983... Line 2022...
1983
static int BGroupAtom(SEXP expr)
2022
static int BGroupAtom(SEXP expr)
1984
{
2023
{
1985
    return NameAtom(expr) && NameMatch(expr, "bgroup");
2024
    return NameAtom(expr) && NameMatch(expr, "bgroup");
1986
}
2025
}
1987
 
2026
 
1988
static BBOX RenderDelim(int which, double dist, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2027
static BBOX RenderDelim(int which, double dist, int draw, mathContext *mc,
-
 
2028
			R_GE_gcontext *gc, GEDevDesc *dd)
1989
{
2029
{
1990
    double savedX = mc->CurrentX;
2030
    double savedX = mc->CurrentX;
1991
    double savedY = mc->CurrentY;
2031
    double savedY = mc->CurrentY;
1992
    FontType prev = SetFont(SymbolFont, gc);
2032
    FontType prev = SetFont(SymbolFont, gc);
1993
    BBOX ansBBox, topBBox, botBBox, extBBox, midBBox;
2033
    BBOX ansBBox, topBBox, botBBox, extBBox, midBBox;
Line 1996... Line 2036...
1996
    double topShift, botShift, extShift, midShift;
2036
    double topShift, botShift, extShift, midShift;
1997
    double ytop, ybot, extHeight, delta;
2037
    double ytop, ybot, extHeight, delta;
1998
    double axisHeight = TeX(sigma22, gc, dd);
2038
    double axisHeight = TeX(sigma22, gc, dd);
1999
 
2039
 
2000
    switch(which) {
2040
    switch(which) {
2001
    case '.': 
2041
    case '.':
2002
	SetFont(prev, gc);
2042
	SetFont(prev, gc);
2003
	return NullBBox();
2043
	return NullBBox();
2004
	break;
2044
	break;
2005
    case '|':
2045
    case '|':
2006
    case 2:
2046
    case 2:
Line 2076... Line 2116...
2076
		+ (bboxHeight(botBBox) + bboxDepth(botBBox));
2116
		+ (bboxHeight(botBBox) + bboxDepth(botBBox));
2077
	    n = ceil((ytop - ybot) / (0.99 * extHeight));
2117
	    n = ceil((ytop - ybot) / (0.99 * extHeight));
2078
	    if (n > 0) {
2118
	    if (n > 0) {
2079
		delta = (ytop - ybot) / n;
2119
		delta = (ytop - ybot) / n;
2080
		for (i = 0; i < n; i++) {
2120
		for (i = 0; i < n; i++) {
-
 
2121
		    PMoveTo(savedX, savedY + ybot +
2081
		    PMoveTo(savedX, savedY + ybot + (i + 0.5) * delta - extShift, mc);
2122
			    (i + 0.5) * delta - extShift, mc);
2082
		    RenderSymbolChar(ext, draw, mc, gc, dd);
2123
		    RenderSymbolChar(ext, draw, mc, gc, dd);
2083
		}
2124
		}
2084
	    }
2125
	    }
2085
	    PMoveTo(savedX + bboxWidth(ansBBox), savedY, mc);
2126
	    PMoveTo(savedX + bboxWidth(ansBBox), savedY, mc);
2086
 
2127
 
Line 2088... Line 2129...
2088
    }
2129
    }
2089
    SetFont(prev, gc);
2130
    SetFont(prev, gc);
2090
    return ansBBox;
2131
    return ansBBox;
2091
}
2132
}
2092
 
2133
 
2093
static BBOX RenderBGroup(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2134
static BBOX RenderBGroup(SEXP expr, int draw, mathContext *mc,
-
 
2135
			 R_GE_gcontext *gc, GEDevDesc *dd)
2094
{
2136
{
2095
    double dist;
2137
    double dist;
2096
    BBOX bbox;
2138
    BBOX bbox;
2097
    double axisHeight = TeX(sigma22, gc, dd);
2139
    double axisHeight = TeX(sigma22, gc, dd);
2098
    double extra = 0.2 * xHeight(gc, dd);
2140
    double extra = 0.2 * xHeight(gc, dd);
Line 2105... Line 2147...
2105
    bbox = RenderElement(CADDR(expr), 0, mc, gc, dd);
2147
    bbox = RenderElement(CADDR(expr), 0, mc, gc, dd);
2106
    dist = max(bboxHeight(bbox) - axisHeight, bboxDepth(bbox) + axisHeight);
2148
    dist = max(bboxHeight(bbox) - axisHeight, bboxDepth(bbox) + axisHeight);
2107
    bbox = RenderDelim(delim1, dist + extra, draw, mc, gc, dd);
2149
    bbox = RenderDelim(delim1, dist + extra, draw, mc, gc, dd);
2108
    bbox = CombineBBoxes(bbox,	RenderElement(CADDR(expr), draw, mc, gc, dd));
2150
    bbox = CombineBBoxes(bbox,	RenderElement(CADDR(expr), draw, mc, gc, dd));
2109
    bbox = RenderItalicCorr(bbox, draw, mc, gc, dd);
2151
    bbox = RenderItalicCorr(bbox, draw, mc, gc, dd);
2110
    bbox = CombineBBoxes(bbox,	RenderDelim(delim2, dist + extra, draw, mc, gc, dd));
2152
    bbox = CombineBBoxes(bbox,	RenderDelim(delim2, dist + extra, draw, mc,
-
 
2153
					    gc, dd));
2111
    return bbox;
2154
    return bbox;
2112
}
2155
}
2113
 
2156
 
2114
/*----------------------------------------------------------------------
2157
/*----------------------------------------------------------------------
2115
 *
2158
 *
Line 2120... Line 2163...
2120
static int ParenAtom(SEXP expr)
2163
static int ParenAtom(SEXP expr)
2121
{
2164
{
2122
    return NameAtom(expr) && NameMatch(expr, "(");
2165
    return NameAtom(expr) && NameMatch(expr, "(");
2123
}
2166
}
2124
 
2167
 
2125
static BBOX RenderParen(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2168
static BBOX RenderParen(SEXP expr, int draw, mathContext *mc,
-
 
2169
			R_GE_gcontext *gc, GEDevDesc *dd)
2126
{
2170
{
2127
    BBOX bbox;
2171
    BBOX bbox;
2128
    bbox = RenderDelimiter(S_PARENLEFT, draw, mc, gc, dd);
2172
    bbox = RenderDelimiter(S_PARENLEFT, draw, mc, gc, dd);
2129
    bbox = CombineBBoxes(bbox, RenderElement(CADR(expr), draw, mc, gc, dd));
2173
    bbox = CombineBBoxes(bbox, RenderElement(CADR(expr), draw, mc, gc, dd));
2130
    bbox = RenderItalicCorr(bbox, draw, mc, gc, dd);
2174
    bbox = RenderItalicCorr(bbox, draw, mc, gc, dd);
Line 2141... Line 2185...
2141
{
2185
{
2142
    return NameAtom(expr) && NameMatch(expr, "integral");
2186
    return NameAtom(expr) && NameMatch(expr, "integral");
2143
}
2187
}
2144
 
2188
 
2145
 
2189
 
2146
static BBOX RenderIntSymbol(int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2190
static BBOX RenderIntSymbol(int draw, mathContext *mc, R_GE_gcontext *gc,
-
 
2191
			    GEDevDesc *dd)
2147
{
2192
{
2148
    double savedX = mc->CurrentX;
2193
    double savedX = mc->CurrentX;
2149
    double savedY = mc->CurrentY;
2194
    double savedY = mc->CurrentY;
2150
    if (GetStyle(mc) > STYLE_T) {
2195
    if (GetStyle(mc) > STYLE_T) {
2151
	BBOX bbox1 = RenderSymbolChar(243, 0, mc, gc, dd);
2196
	BBOX bbox1 = RenderSymbolChar(243, 0, mc, gc, dd);
Line 2158... Line 2203...
2158
	mc->CurrentY = savedY;
2203
	mc->CurrentY = savedY;
2159
	shift = TeX(sigma22, gc, dd) - 0.99 * bboxHeight(bbox2);
2204
	shift = TeX(sigma22, gc, dd) - 0.99 * bboxHeight(bbox2);
2160
	PMoveUp(shift, mc);
2205
	PMoveUp(shift, mc);
2161
	bbox2 = ShiftBBox(RenderSymbolChar(245, draw, mc, gc, dd), shift);
2206
	bbox2 = ShiftBBox(RenderSymbolChar(245, draw, mc, gc, dd), shift);
2162
	if (draw)
2207
	if (draw)
2163
	    PMoveTo(savedX + max(bboxWidth(bbox1), bboxWidth(bbox2)), savedY, mc);
2208
	    PMoveTo(savedX + max(bboxWidth(bbox1), bboxWidth(bbox2)),
-
 
2209
		    savedY, mc);
2164
	else
2210
	else
2165
	    PMoveTo(savedX, savedY, mc);
2211
	    PMoveTo(savedX, savedY, mc);
2166
	return CombineAlignedBBoxes(bbox1, bbox2);
2212
	return CombineAlignedBBoxes(bbox1, bbox2);
2167
    }
2213
    }
2168
    else {
2214
    else {
2169
	return RenderSymbolChar(0362, draw, mc, gc, dd);
2215
	return RenderSymbolChar(0362, draw, mc, gc, dd);
2170
    }
2216
    }
2171
}
2217
}
2172
 
2218
 
2173
static BBOX RenderInt(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2219
static BBOX RenderInt(SEXP expr, int draw, mathContext *mc,
-
 
2220
		      R_GE_gcontext *gc, GEDevDesc *dd)
2174
{
2221
{
2175
    BBOX opBBox, lowerBBox, upperBBox, bodyBBox;
2222
    BBOX opBBox, lowerBBox, upperBBox, bodyBBox;
2176
    int nexpr = length(expr);
2223
    int nexpr = length(expr);
2177
    STYLE style = GetStyle(mc);
2224
    STYLE style = GetStyle(mc);
2178
    double savedX = mc->CurrentX;
2225
    double savedX = mc->CurrentX;
Line 2186... Line 2233...
2186
    if (nexpr > 2) {
2233
    if (nexpr > 2) {
2187
	hshift = 0.5 * width + ThinSpace(gc, dd);
2234
	hshift = 0.5 * width + ThinSpace(gc, dd);
2188
	SetSubStyle(style, mc, gc);
2235
	SetSubStyle(style, mc, gc);
2189
	lowerBBox = RenderElement(CADDR(expr), 0, mc, gc, dd);
2236
	lowerBBox = RenderElement(CADDR(expr), 0, mc, gc, dd);
2190
	vshift = bboxDepth(opBBox) + CenterShift(lowerBBox);
2237
	vshift = bboxDepth(opBBox) + CenterShift(lowerBBox);
2191
	lowerBBox = RenderOffsetElement(CADDR(expr), hshift, -vshift, draw, mc, gc, dd);
2238
	lowerBBox = RenderOffsetElement(CADDR(expr), hshift, -vshift, draw,
-
 
2239
					mc, gc, dd);
2192
	opBBox = CombineAlignedBBoxes(opBBox, lowerBBox);
2240
	opBBox = CombineAlignedBBoxes(opBBox, lowerBBox);
2193
	SetStyle(style, mc, gc);
2241
	SetStyle(style, mc, gc);
2194
	mc->CurrentX = savedX;
2242
	mc->CurrentX = savedX;
2195
	mc->CurrentY = savedY;
2243
	mc->CurrentY = savedY;
2196
    }
2244
    }
2197
    if (nexpr > 3) {
2245
    if (nexpr > 3) {
2198
	hshift = width + ThinSpace(gc, dd);
2246
	hshift = width + ThinSpace(gc, dd);
2199
	SetSupStyle(style, mc, gc);
2247
	SetSupStyle(style, mc, gc);
2200
	upperBBox = RenderElement(CADDDR(expr), 0, mc, gc, dd);
2248
	upperBBox = RenderElement(CADDDR(expr), 0, mc, gc, dd);
2201
	vshift = bboxHeight(opBBox) - CenterShift(upperBBox);
2249
	vshift = bboxHeight(opBBox) - CenterShift(upperBBox);
2202
	upperBBox = RenderOffsetElement(CADDDR(expr), hshift, vshift, draw, mc, gc, dd);
2250
	upperBBox = RenderOffsetElement(CADDDR(expr), hshift, vshift, draw,
-
 
2251
					mc, gc, dd);
2203
	opBBox = CombineAlignedBBoxes(opBBox, upperBBox);
2252
	opBBox = CombineAlignedBBoxes(opBBox, upperBBox);
2204
	SetStyle(style, mc, gc);
2253
	SetStyle(style, mc, gc);
2205
	mc->CurrentX = savedX;
2254
	mc->CurrentX = savedX;
2206
	mc->CurrentY = savedY;
2255
	mc->CurrentY = savedY;
2207
    }
2256
    }
Line 2244... Line 2293...
2244
	if (NameMatch(expr, OpTable[i].name))
2293
	if (NameMatch(expr, OpTable[i].name))
2245
	    return OpTable[i].code;
2294
	    return OpTable[i].code;
2246
    return 0;
2295
    return 0;
2247
}
2296
}
2248
 
2297
 
2249
static BBOX RenderOpSymbol(SEXP op, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2298
static BBOX RenderOpSymbol(SEXP op, int draw, mathContext *mc,
-
 
2299
			   R_GE_gcontext *gc, GEDevDesc *dd)
2250
{
2300
{
2251
    BBOX bbox;
2301
    BBOX bbox;
2252
    double cexSaved = gc->cex;
2302
    double cexSaved = gc->cex;
2253
    /*double savedX = mc->CurrentX;*/
2303
    /*double savedX = mc->CurrentX;*/
2254
    /*double savedY = mc->CurrentY;*/
2304
    /*double savedY = mc->CurrentY;*/
Line 2259... Line 2309...
2259
    if (opId == S_SUM || opId == S_PRODUCT ||
2309
    if (opId == S_SUM || opId == S_PRODUCT ||
2260
	opId == S_UNION || opId == S_INTERSECTION) {
2310
	opId == S_UNION || opId == S_INTERSECTION) {
2261
	if (display) {
2311
	if (display) {
2262
	    gc->cex = OperatorSymbolMag * gc->cex;
2312
	    gc->cex = OperatorSymbolMag * gc->cex;
2263
	    bbox = RenderSymbolChar(OpAtom(op), 0, mc, gc, dd);
2313
	    bbox = RenderSymbolChar(OpAtom(op), 0, mc, gc, dd);
2264
	    shift = 0.5 * (bboxHeight(bbox) - bboxDepth(bbox)) - TeX(sigma22, gc, dd);
2314
	    shift = 0.5 * (bboxHeight(bbox) - bboxDepth(bbox)) -
-
 
2315
		TeX(sigma22, gc, dd);
2265
	    if (draw) {
2316
	    if (draw) {
2266
		PMoveUp(-shift, mc);
2317
		PMoveUp(-shift, mc);
2267
		bbox = RenderSymbolChar(opId, 1, mc, gc, dd);
2318
		bbox = RenderSymbolChar(opId, 1, mc, gc, dd);
2268
		PMoveUp(shift, mc);
2319
		PMoveUp(shift, mc);
2269
	    }
2320
	    }
Line 2278... Line 2329...
2278
	SetFont(prevfont, gc);
2329
	SetFont(prevfont, gc);
2279
	return bbox;
2330
	return bbox;
2280
    }
2331
    }
2281
}
2332
}
2282
 
2333
 
2283
static BBOX RenderOp(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2334
static BBOX RenderOp(SEXP expr, int draw, mathContext *mc,
-
 
2335
		     R_GE_gcontext *gc, GEDevDesc *dd)
2284
{
2336
{
2285
    BBOX lowerBBox, upperBBox, bodyBBox;
2337
    BBOX lowerBBox, upperBBox, bodyBBox;
2286
    double savedX = mc->CurrentX;
2338
    double savedX = mc->CurrentX;
2287
    double savedY = mc->CurrentY;
2339
    double savedY = mc->CurrentY;
2288
    int nexpr = length(expr);
2340
    int nexpr = length(expr);
Line 2294... Line 2346...
2294
    if (nexpr > 2) {
2346
    if (nexpr > 2) {
2295
	SetSubStyle(style, mc, gc);
2347
	SetSubStyle(style, mc, gc);
2296
	lowerBBox = RenderElement(CADDR(expr), 0, mc, gc, dd);
2348
	lowerBBox = RenderElement(CADDR(expr), 0, mc, gc, dd);
2297
	SetStyle(style, mc, gc);
2349
	SetStyle(style, mc, gc);
2298
	width = max(width, bboxWidth(lowerBBox));
2350
	width = max(width, bboxWidth(lowerBBox));
2299
	lvshift = max(TeX(xi10, gc, dd), TeX(xi12, gc, dd) - bboxHeight(lowerBBox));
2351
	lvshift = max(TeX(xi10, gc, dd), TeX(xi12, gc, dd) -
-
 
2352
		      bboxHeight(lowerBBox));
2300
	lvshift = bboxDepth(opBBox) + bboxHeight(lowerBBox) + lvshift;
2353
	lvshift = bboxDepth(opBBox) + bboxHeight(lowerBBox) + lvshift;
2301
    }
2354
    }
2302
    if (nexpr > 3) {
2355
    if (nexpr > 3) {
2303
	SetSupStyle(style, mc, gc);
2356
	SetSupStyle(style, mc, gc);
2304
	upperBBox = RenderElement(CADDDR(expr), 0, mc, gc, dd);
2357
	upperBBox = RenderElement(CADDDR(expr), 0, mc, gc, dd);
2305
	SetStyle(style, mc, gc);
2358
	SetStyle(style, mc, gc);
2306
	width = max(width, bboxWidth(upperBBox));
2359
	width = max(width, bboxWidth(upperBBox));
2307
	uvshift = max(TeX(xi9, gc, dd), TeX(xi11, gc, dd) - bboxDepth(upperBBox));
2360
	uvshift = max(TeX(xi9, gc, dd), TeX(xi11, gc, dd) -
-
 
2361
		      bboxDepth(upperBBox));
2308
	uvshift = bboxHeight(opBBox) + bboxDepth(upperBBox) + uvshift;
2362
	uvshift = bboxHeight(opBBox) + bboxDepth(upperBBox) + uvshift;
2309
    }
2363
    }
2310
    hshift = 0.5 * (width - bboxWidth(opBBox));
2364
    hshift = 0.5 * (width - bboxWidth(opBBox));
2311
    opBBox = RenderGap(hshift, draw, mc, gc, dd);
2365
    opBBox = RenderGap(hshift, draw, mc, gc, dd);
-
 
2366
    opBBox = CombineBBoxes(opBBox,
2312
    opBBox = CombineBBoxes(opBBox, RenderOpSymbol(CAR(expr), draw, mc, gc, dd));
2367
			   RenderOpSymbol(CAR(expr), draw, mc, gc, dd));
2313
    mc->CurrentX = savedX;
2368
    mc->CurrentX = savedX;
2314
    mc->CurrentY = savedY;
2369
    mc->CurrentY = savedY;
2315
    if (nexpr > 2) {
2370
    if (nexpr > 2) {
2316
	SetSubStyle(style, mc, gc);
2371
	SetSubStyle(style, mc, gc);
2317
	hshift = 0.5 * (width - bboxWidth(lowerBBox));
2372
	hshift = 0.5 * (width - bboxWidth(lowerBBox));
2318
	lowerBBox = RenderOffsetElement(CADDR(expr), hshift, -lvshift, draw, mc, gc, dd);
2373
	lowerBBox = RenderOffsetElement(CADDR(expr), hshift, -lvshift, draw,
-
 
2374
					mc, gc, dd);
2319
	SetStyle(style, mc, gc);
2375
	SetStyle(style, mc, gc);
2320
	opBBox = CombineAlignedBBoxes(opBBox, lowerBBox);
2376
	opBBox = CombineAlignedBBoxes(opBBox, lowerBBox);
2321
	mc->CurrentX = savedX;
2377
	mc->CurrentX = savedX;
2322
	mc->CurrentY = savedY;
2378
	mc->CurrentY = savedY;
2323
    }
2379
    }
2324
    if (nexpr > 3) {
2380
    if (nexpr > 3) {
2325
	SetSupStyle(style, mc, gc);
2381
	SetSupStyle(style, mc, gc);
2326
	hshift = 0.5 * (width - bboxWidth(upperBBox));
2382
	hshift = 0.5 * (width - bboxWidth(upperBBox));
2327
	upperBBox = RenderOffsetElement(CADDDR(expr), hshift, uvshift, draw, mc, gc, dd);
2383
	upperBBox = RenderOffsetElement(CADDDR(expr), hshift, uvshift, draw,
-
 
2384
					mc, gc, dd);
2328
	SetStyle(style, mc, gc);
2385
	SetStyle(style, mc, gc);
2329
	opBBox = CombineAlignedBBoxes(opBBox, upperBBox);
2386
	opBBox = CombineAlignedBBoxes(opBBox, upperBBox);
2330
	mc->CurrentX = savedX;
2387
	mc->CurrentX = savedX;
2331
	mc->CurrentY = savedY;
2388
	mc->CurrentY = savedY;
2332
    }
2389
    }
2333
    opBBox = EnlargeBBox(opBBox, TeX(xi13, gc, dd), TeX(xi13, gc, dd), 0);
2390
    opBBox = EnlargeBBox(opBBox, TeX(xi13, gc, dd), TeX(xi13, gc, dd), 0);
2334
    if (draw)
2391
    if (draw)
2335
	PMoveAcross(width, mc);
2392
	PMoveAcross(width, mc);
-
 
2393
    opBBox = CombineBBoxes(opBBox,
2336
    opBBox = CombineBBoxes(opBBox, RenderGap(ThinSpace(gc, dd), draw, mc, gc, dd));
2394
			   RenderGap(ThinSpace(gc, dd), draw, mc, gc, dd));
2337
    bodyBBox = RenderElement(CADR(expr), draw, mc, gc, dd);
2395
    bodyBBox = RenderElement(CADR(expr), draw, mc, gc, dd);
2338
    return CombineBBoxes(opBBox, bodyBBox);
2396
    return CombineBBoxes(opBBox, bodyBBox);
2339
}
2397
}
2340
 
2398
 
2341
 
2399
 
Line 2358... Line 2416...
2358
    return NameAtom(expr) &&
2416
    return NameAtom(expr) &&
2359
	(NameMatch(expr, "root") ||
2417
	(NameMatch(expr, "root") ||
2360
	 NameMatch(expr, "sqrt"));
2418
	 NameMatch(expr, "sqrt"));
2361
}
2419
}
2362
 
2420
 
2363
static BBOX RenderScript(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2421
static BBOX RenderScript(SEXP expr, int draw, mathContext *mc,
-
 
2422
			 R_GE_gcontext *gc, GEDevDesc *dd)
2364
{
2423
{
2365
    BBOX bbox;
2424
    BBOX bbox;
2366
    STYLE style = GetStyle(mc);
2425
    STYLE style = GetStyle(mc);
2367
    SetSupStyle(style, mc, gc);
2426
    SetSupStyle(style, mc, gc);
2368
    bbox = RenderElement(expr, draw, mc, gc, dd);
2427
    bbox = RenderElement(expr, draw, mc, gc, dd);
2369
    SetStyle(style, mc, gc);
2428
    SetStyle(style, mc, gc);
2370
    return bbox;
2429
    return bbox;
2371
}
2430
}
2372
 
2431
 
2373
static BBOX RenderRadical(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2432
static BBOX RenderRadical(SEXP expr, int draw, mathContext *mc,
-
 
2433
			  R_GE_gcontext *gc, GEDevDesc *dd)
2374
{
2434
{
2375
    SEXP body = CADR(expr);
2435
    SEXP body = CADR(expr);
2376
    SEXP order = CADDR(expr);
2436
    SEXP order = CADDR(expr);
2377
    BBOX bodyBBox, orderBBox;
2437
    BBOX bodyBBox, orderBBox;
2378
    double radWidth, radHeight, radDepth;
2438
    double radWidth, radHeight, radDepth;
Line 2441... Line 2501...
2441
	GEPolyline(5, x, y, gc, dd);
2501
	GEPolyline(5, x, y, gc, dd);
2442
	PMoveTo(savedX, savedY, mc);
2502
	PMoveTo(savedX, savedY, mc);
2443
	gc->lty = savedlty;
2503
	gc->lty = savedlty;
2444
	gc->lwd = savedlwd;
2504
	gc->lwd = savedlwd;
2445
    }
2505
    }
-
 
2506
    orderBBox =
2446
    orderBBox = CombineAlignedBBoxes(orderBBox,
2507
	CombineAlignedBBoxes(orderBBox,
2447
				     RenderGap(leadWidth + radSpace, draw, mc, gc, dd));
2508
			     RenderGap(leadWidth + radSpace, draw, mc, gc, dd));
2448
    SetPrimeStyle(style, mc, gc);
2509
    SetPrimeStyle(style, mc, gc);
-
 
2510
    orderBBox = CombineBBoxes(orderBBox,
2449
    orderBBox = CombineBBoxes(orderBBox, RenderElement(body, draw, mc, gc, dd));
2511
			      RenderElement(body, draw, mc, gc, dd));
-
 
2512
    orderBBox = CombineBBoxes(orderBBox,
2450
    orderBBox = CombineBBoxes(orderBBox, RenderGap(2 * radTrail, draw, mc, gc, dd));
2513
			      RenderGap(2 * radTrail, draw, mc, gc, dd));
2451
    orderBBox = EnlargeBBox(orderBBox, radGap, 0, 0);/* << fixes PR#1101 */
2514
    orderBBox = EnlargeBBox(orderBBox, radGap, 0, 0);/* << fixes PR#1101 */
2452
    SetStyle(style, mc, gc);
2515
    SetStyle(style, mc, gc);
2453
    return orderBBox;
2516
    return orderBBox;
2454
}
2517
}
2455
 
2518
 
Line 2462... Line 2525...
2462
static int AbsAtom(SEXP expr)
2525
static int AbsAtom(SEXP expr)
2463
{
2526
{
2464
    return NameAtom(expr) && NameMatch(expr, "abs");
2527
    return NameAtom(expr) && NameMatch(expr, "abs");
2465
}
2528
}
2466
 
2529
 
2467
static BBOX RenderAbs(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2530
static BBOX RenderAbs(SEXP expr, int draw, mathContext *mc,
-
 
2531
		      R_GE_gcontext *gc, GEDevDesc *dd)
2468
{
2532
{
2469
    BBOX bbox = RenderElement(CADR(expr), 0, mc, gc, dd);
2533
    BBOX bbox = RenderElement(CADR(expr), 0, mc, gc, dd);
2470
    double height = bboxHeight(bbox);
2534
    double height = bboxHeight(bbox);
2471
    double depth = bboxDepth(bbox);
2535
    double depth = bboxDepth(bbox);
2472
    double x[2], y[2];
2536
    double x[2], y[2];
Line 2522... Line 2586...
2522
{
2586
{
2523
    return NameAtom(expr) &&
2587
    return NameAtom(expr) &&
2524
	NameMatch(expr, "{");
2588
	NameMatch(expr, "{");
2525
}
2589
}
2526
 
2590
 
2527
static BBOX RenderCurly(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2591
static BBOX RenderCurly(SEXP expr, int draw, mathContext *mc,
-
 
2592
			R_GE_gcontext *gc, GEDevDesc *dd)
2528
{
2593
{
2529
    return RenderElement(CADR(expr), draw, mc, gc, dd);
2594
    return RenderElement(CADR(expr), draw, mc, gc, dd);
2530
}
2595
}
2531
 
2596
 
2532
 
2597
 
Line 2579... Line 2644...
2579
	if (NameMatch(expr, RelTable[i].name))
2644
	if (NameMatch(expr, RelTable[i].name))
2580
	    return RelTable[i].code;
2645
	    return RelTable[i].code;
2581
    return 0;
2646
    return 0;
2582
}
2647
}
2583
 
2648
 
2584
static BBOX RenderRel(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2649
static BBOX RenderRel(SEXP expr, int draw, mathContext *mc,
-
 
2650
		      R_GE_gcontext *gc, GEDevDesc *dd)
2585
{
2651
{
2586
    int op = RelAtom(CAR(expr));
2652
    int op = RelAtom(CAR(expr));
2587
    int nexpr = length(expr);
2653
    int nexpr = length(expr);
2588
    BBOX bbox;
2654
    BBOX bbox;
2589
    double gap;
2655
    double gap;
Line 2593... Line 2659...
2593
	bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
2659
	bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
2594
	bbox = RenderItalicCorr(bbox, draw, mc, gc, dd);
2660
	bbox = RenderItalicCorr(bbox, draw, mc, gc, dd);
2595
	bbox = CombineBBoxes(bbox, RenderGap(gap, draw, mc, gc, dd));
2661
	bbox = CombineBBoxes(bbox, RenderGap(gap, draw, mc, gc, dd));
2596
	bbox = CombineBBoxes(bbox, RenderSymbolChar(op, draw, mc, gc, dd));
2662
	bbox = CombineBBoxes(bbox, RenderSymbolChar(op, draw, mc, gc, dd));
2597
	bbox = CombineBBoxes(bbox, RenderGap(gap, draw, mc, gc, dd));
2663
	bbox = CombineBBoxes(bbox, RenderGap(gap, draw, mc, gc, dd));
-
 
2664
	return
2598
	return CombineBBoxes(bbox, RenderElement(CADDR(expr), draw, mc, gc, dd));
2665
	    CombineBBoxes(bbox, RenderElement(CADDR(expr), draw, mc, gc, dd));
2599
    }
2666
    }
2600
    else error("invalid mathematical annotation");
2667
    else error("invalid mathematical annotation");
2601
 
2668
 
2602
    return NullBBox();		/* -Wall */
2669
    return NullBBox();		/* -Wall */
2603
}
2670
}
Line 2613... Line 2680...
2613
{
2680
{
2614
    return NameAtom(expr) &&
2681
    return NameAtom(expr) &&
2615
	NameMatch(expr, "bold");
2682
	NameMatch(expr, "bold");
2616
}
2683
}
2617
 
2684
 
2618
static BBOX RenderBold(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2685
static BBOX RenderBold(SEXP expr, int draw, mathContext *mc,
-
 
2686
		       R_GE_gcontext *gc, GEDevDesc *dd)
2619
{
2687
{
2620
    BBOX bbox;
2688
    BBOX bbox;
2621
    FontType prevfont = SetFont(BoldFont, gc);
2689
    FontType prevfont = SetFont(BoldFont, gc);
2622
    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
2690
    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
2623
    SetFont(prevfont, gc);
2691
    SetFont(prevfont, gc);
Line 2634... Line 2702...
2634
{
2702
{
2635
    return NameAtom(expr) &&
2703
    return NameAtom(expr) &&
2636
	(NameMatch(expr, "italic") || NameMatch(expr, "math"));
2704
	(NameMatch(expr, "italic") || NameMatch(expr, "math"));
2637
}
2705
}
2638
 
2706
 
2639
static BBOX RenderItalic(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2707
static BBOX RenderItalic(SEXP expr, int draw, mathContext *mc,
-
 
2708
			 R_GE_gcontext *gc, GEDevDesc *dd)
2640
{
2709
{
2641
    BBOX bbox;
2710
    BBOX bbox;
2642
    FontType prevfont = SetFont(ItalicFont, gc);
2711
    FontType prevfont = SetFont(ItalicFont, gc);
2643
    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
2712
    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
2644
    SetFont(prevfont, gc);
2713
    SetFont(prevfont, gc);
Line 2655... Line 2724...
2655
{
2724
{
2656
    return NameAtom(expr) &&
2725
    return NameAtom(expr) &&
2657
	NameMatch(expr, "plain");
2726
	NameMatch(expr, "plain");
2658
}
2727
}
2659
 
2728
 
2660
static BBOX RenderPlain(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2729
static BBOX RenderPlain(SEXP expr, int draw, mathContext *mc,
-
 
2730
			R_GE_gcontext *gc, GEDevDesc *dd)
2661
{
2731
{
2662
    BBOX bbox;
2732
    BBOX bbox;
2663
    int prevfont = SetFont(PlainFont, gc);
2733
    int prevfont = SetFont(PlainFont, gc);
2664
    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
2734
    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
2665
    SetFont(prevfont, gc);
2735
    SetFont(prevfont, gc);
Line 2676... Line 2746...
2676
{
2746
{
2677
    return NameAtom(expr) &&
2747
    return NameAtom(expr) &&
2678
	(NameMatch(expr, "bolditalic") || NameMatch(expr, "boldmath"));
2748
	(NameMatch(expr, "bolditalic") || NameMatch(expr, "boldmath"));
2679
}
2749
}
2680
 
2750
 
2681
static BBOX RenderBoldItalic(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2751
static BBOX RenderBoldItalic(SEXP expr, int draw, mathContext *mc,
-
 
2752
			     R_GE_gcontext *gc, GEDevDesc *dd)
2682
{
2753
{
2683
    BBOX bbox;
2754
    BBOX bbox;
2684
    int prevfont = SetFont(BoldItalicFont, gc);
2755
    int prevfont = SetFont(BoldItalicFont, gc);
2685
    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
2756
    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
2686
    SetFont(prevfont, gc);
2757
    SetFont(prevfont, gc);
Line 2700... Line 2771...
2700
	     NameMatch(expr, "textstyle")    ||
2771
	     NameMatch(expr, "textstyle")    ||
2701
	     NameMatch(expr, "scriptstyle")   ||
2772
	     NameMatch(expr, "scriptstyle")   ||
2702
	     NameMatch(expr, "scriptscriptstyle")));
2773
	     NameMatch(expr, "scriptscriptstyle")));
2703
}
2774
}
2704
 
2775
 
2705
static BBOX RenderStyle(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2776
static BBOX RenderStyle(SEXP expr, int draw, mathContext *mc,
-
 
2777
			R_GE_gcontext *gc, GEDevDesc *dd)
2706
{
2778
{
2707
    STYLE prevstyle = GetStyle(mc);
2779
    STYLE prevstyle = GetStyle(mc);
2708
    BBOX bbox;
2780
    BBOX bbox;
2709
    if (NameMatch(CAR(expr), "displaystyle"))
2781
    if (NameMatch(CAR(expr), "displaystyle"))
2710
	SetStyle(STYLE_D, mc, gc);
2782
	SetStyle(STYLE_D, mc, gc);
Line 2730... Line 2802...
2730
    return (NameAtom(expr) &&
2802
    return (NameAtom(expr) &&
2731
	    (NameMatch(expr, "phantom") ||
2803
	    (NameMatch(expr, "phantom") ||
2732
	     NameMatch(expr, "vphantom")));
2804
	     NameMatch(expr, "vphantom")));
2733
}
2805
}
2734
 
2806
 
2735
static BBOX RenderPhantom(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2807
static BBOX RenderPhantom(SEXP expr, int draw, mathContext *mc,
-
 
2808
			  R_GE_gcontext *gc, GEDevDesc *dd)
2736
{
2809
{
2737
    BBOX bbox = RenderElement(CADR(expr), 0, mc, gc, dd);
2810
    BBOX bbox = RenderElement(CADR(expr), 0, mc, gc, dd);
2738
    if (NameMatch(CAR(expr), "vphantom")) {
2811
    if (NameMatch(CAR(expr), "vphantom")) {
2739
	bboxWidth(bbox) = 0;
2812
	bboxWidth(bbox) = 0;
2740
	bboxItalic(bbox) = 0;
2813
	bboxItalic(bbox) = 0;
Line 2752... Line 2825...
2752
static int ConcatenateAtom(SEXP expr)
2825
static int ConcatenateAtom(SEXP expr)
2753
{
2826
{
2754
    return NameAtom(expr) && NameMatch(expr, "paste");
2827
    return NameAtom(expr) && NameMatch(expr, "paste");
2755
}
2828
}
2756
 
2829
 
2757
static BBOX RenderConcatenate(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2830
static BBOX RenderConcatenate(SEXP expr, int draw, mathContext *mc,
-
 
2831
			      R_GE_gcontext *gc, GEDevDesc *dd)
2758
{
2832
{
2759
    BBOX bbox = NullBBox();
2833
    BBOX bbox = NullBBox();
2760
    int i, n;
2834
    int i, n;
2761
 
2835
 
2762
    expr = CDR(expr);
2836
    expr = CDR(expr);
Line 2775... Line 2849...
2775
 *
2849
 *
2776
 *  Code for Comma-Separated Lists
2850
 *  Code for Comma-Separated Lists
2777
 *
2851
 *
2778
 */
2852
 */
2779
 
2853
 
2780
static BBOX RenderCommaList(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2854
static BBOX RenderCommaList(SEXP expr, int draw, mathContext *mc,
-
 
2855
			    R_GE_gcontext *gc, GEDevDesc *dd)
2781
{
2856
{
2782
    BBOX bbox = NullBBox();
2857
    BBOX bbox = NullBBox();
2783
    double small = 0.4 * ThinSpace(gc, dd);
2858
    double small = 0.4 * ThinSpace(gc, dd);
2784
    int i, n;
2859
    int i, n;
2785
    n = length(expr);
2860
    n = length(expr);
2786
    for (i = 0; i < n; i++) {
2861
    for (i = 0; i < n; i++) {
2787
	if (NameAtom(CAR(expr)) && NameMatch(CAR(expr), "...")) {
2862
	if (NameAtom(CAR(expr)) && NameMatch(CAR(expr), "...")) {
2788
	    if (i > 0) {
2863
	    if (i > 0) {
2789
		bbox = CombineBBoxes(bbox, RenderSymbolChar(S_COMMA, draw, mc, gc, dd));
2864
		bbox = CombineBBoxes(bbox, RenderSymbolChar(S_COMMA, draw,
-
 
2865
							    mc, gc, dd));
2790
		bbox = CombineBBoxes(bbox, RenderSymbolChar(S_SPACE, draw, mc, gc, dd));
2866
		bbox = CombineBBoxes(bbox, RenderSymbolChar(S_SPACE, draw,
-
 
2867
							    mc, gc, dd));
2791
	    }
2868
	    }
2792
	    bbox = CombineBBoxes(bbox, RenderSymbolChar(S_ELLIPSIS, draw, mc, gc, dd));
2869
	    bbox = CombineBBoxes(bbox, RenderSymbolChar(S_ELLIPSIS, draw,
-
 
2870
							mc, gc, dd));
2793
	    bbox = CombineBBoxes(bbox, RenderGap(small, draw, mc, gc, dd));
2871
	    bbox = CombineBBoxes(bbox, RenderGap(small, draw, mc, gc, dd));
2794
	}
2872
	}
2795
	else {
2873
	else {
2796
	    if (i > 0) {
2874
	    if (i > 0) {
2797
		bbox = CombineBBoxes(bbox, RenderSymbolChar(S_COMMA, draw, mc, gc, dd));
2875
		bbox = CombineBBoxes(bbox, RenderSymbolChar(S_COMMA, draw,
-
 
2876
							    mc, gc, dd));
2798
		bbox = CombineBBoxes(bbox, RenderSymbolChar(S_SPACE, draw, mc, gc, dd));
2877
		bbox = CombineBBoxes(bbox, RenderSymbolChar(S_SPACE, draw,
-
 
2878
							    mc, gc, dd));
2799
	    }
2879
	    }
2800
	    bbox = CombineBBoxes(bbox, RenderElement(CAR(expr), draw, mc, gc, dd));
2880
	    bbox = CombineBBoxes(bbox, RenderElement(CAR(expr), draw, mc,
-
 
2881
						     gc, dd));
2801
	}
2882
	}
2802
	expr = CDR(expr);
2883
	expr = CDR(expr);
2803
    }
2884
    }
2804
    return bbox;
2885
    return bbox;
2805
}
2886
}
Line 2808... Line 2889...
2808
 *
2889
 *
2809
 *  Code for General Expressions
2890
 *  Code for General Expressions
2810
 *
2891
 *
2811
 */
2892
 */
2812
 
2893
 
2813
static BBOX RenderExpression(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2894
static BBOX RenderExpression(SEXP expr, int draw, mathContext *mc,
-
 
2895
			     R_GE_gcontext *gc, GEDevDesc *dd)
2814
{
2896
{
2815
    BBOX bbox;
2897
    BBOX bbox;
2816
    if (NameAtom(CAR(expr)))
2898
    if (NameAtom(CAR(expr)))
2817
	bbox = RenderSymbolString(CAR(expr), draw, mc, gc, dd);
2899
	bbox = RenderSymbolString(CAR(expr), draw, mc, gc, dd);
2818
    else
2900
    else
Line 2834... Line 2916...
2834
static int ListAtom(SEXP expr)
2916
static int ListAtom(SEXP expr)
2835
{
2917
{
2836
    return NameAtom(expr) && NameMatch(expr, "list");
2918
    return NameAtom(expr) && NameMatch(expr, "list");
2837
}
2919
}
2838
 
2920
 
2839
static BBOX RenderList(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2921
static BBOX RenderList(SEXP expr, int draw, mathContext *mc,
-
 
2922
		       R_GE_gcontext *gc, GEDevDesc *dd)
2840
{
2923
{
2841
    return RenderCommaList(CDR(expr), draw, mc, gc, dd);
2924
    return RenderCommaList(CDR(expr), draw, mc, gc, dd);
2842
}
2925
}
2843
 
2926
 
2844
/* Dispatching procedure which determines nature of expression. */
2927
/* Dispatching procedure which determines nature of expression. */
2845
 
2928
 
2846
 
2929
 
2847
static BBOX RenderFormula(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2930
static BBOX RenderFormula(SEXP expr, int draw, mathContext *mc,
-
 
2931
			  R_GE_gcontext *gc, GEDevDesc *dd)
2848
{
2932
{
2849
    SEXP head = CAR(expr);
2933
    SEXP head = CAR(expr);
2850
 
2934
 
2851
    if (SpaceAtom(head))
2935
    if (SpaceAtom(head))
2852
	return RenderSpace(expr, draw, mc, gc, dd);
2936
	return RenderSpace(expr, draw, mc, gc, dd);
Line 2910... Line 2994...
2910
 
2994
 
2911
 
2995
 
2912
/* Dispatch on whether atom (symbol, string, number, ...) */
2996
/* Dispatch on whether atom (symbol, string, number, ...) */
2913
/* or formula (some sort of expression) */
2997
/* or formula (some sort of expression) */
2914
 
2998
 
2915
static BBOX RenderElement(SEXP expr, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
2999
static BBOX RenderElement(SEXP expr, int draw, mathContext *mc,
-
 
3000
			  R_GE_gcontext *gc, GEDevDesc *dd)
2916
{
3001
{
2917
    if (FormulaExpression(expr))
3002
    if (FormulaExpression(expr))
2918
	return RenderFormula(expr, draw, mc, gc, dd);
3003
	return RenderFormula(expr, draw, mc, gc, dd);
2919
    else
3004
    else
2920
	return RenderAtom(expr, draw, mc, gc, dd);
3005
	return RenderAtom(expr, draw, mc, gc, dd);
2921
}
3006
}
2922
 
3007
 
2923
static BBOX RenderOffsetElement(SEXP expr, double x, double y, int draw, mathContext *mc, R_GE_gcontext *gc, GEDevDesc *dd)
3008
static BBOX RenderOffsetElement(SEXP expr, double x, double y, int draw,
-
 
3009
				mathContext *mc, R_GE_gcontext *gc,
-
 
3010
				GEDevDesc *dd)
2924
{
3011
{
2925
    BBOX bbox;
3012
    BBOX bbox;
2926
    double savedX = mc->CurrentX;
3013
    double savedX = mc->CurrentX;
2927
    double savedY = mc->CurrentY;
3014
    double savedY = mc->CurrentY;
2928
    if (draw) {
3015
    if (draw) {
Line 2942... Line 3029...
2942
/* Functions forming the R API */
3029
/* Functions forming the R API */
2943
 
3030
 
2944
/* Calculate width of expression */
3031
/* Calculate width of expression */
2945
/* BBOXes are in INCHES (see MetricUnit) */
3032
/* BBOXes are in INCHES (see MetricUnit) */
2946
 
3033
 
2947
double GEExpressionWidth(SEXP expr, 
3034
double GEExpressionWidth(SEXP expr,
2948
			 R_GE_gcontext *gc,
3035
			 R_GE_gcontext *gc,
2949
			 GEDevDesc *dd)
3036
			 GEDevDesc *dd)
2950
{
3037
{
2951
    BBOX bbox;
3038
    BBOX bbox;
2952
    double width;
3039
    double width;
Line 2970... Line 3057...
2970
    mc.SinAngle = 0;
3057
    mc.SinAngle = 0;
2971
 
3058
 
2972
    SetFont(PlainFont, gc);
3059
    SetFont(PlainFont, gc);
2973
    bbox = RenderElement(expr, 0, &mc, gc, dd);
3060
    bbox = RenderElement(expr, 0, &mc, gc, dd);
2974
    width  = bboxWidth(bbox);
3061
    width  = bboxWidth(bbox);
2975
    /* 
3062
    /*
2976
     * NOTE that we do fabs() here in case the device
3063
     * NOTE that we do fabs() here in case the device
2977
     * runs right-to-left.
3064
     * runs right-to-left.
2978
     * This is so that these calculations match those
3065
     * This is so that these calculations match those
2979
     * for string widths and heights, where the width
3066
     * for string widths and heights, where the width
2980
     * and height of text is positive no matter how
3067
     * and height of text is positive no matter how
2981
     * the device drawing is oriented.
3068
     * the device drawing is oriented.
2982
     */
3069
     */
2983
    return fabs(toDeviceWidth(width, GE_INCHES, dd));
3070
    return fabs(toDeviceWidth(width, GE_INCHES, dd));
2984
}
3071
}
2985
 
3072
 
2986
double GEExpressionHeight(SEXP expr, 
3073
double GEExpressionHeight(SEXP expr,
2987
			  R_GE_gcontext *gc,
3074
			  R_GE_gcontext *gc,
2988
			  GEDevDesc *dd)
3075
			  GEDevDesc *dd)
2989
{
3076
{
2990
    BBOX bbox;
3077
    BBOX bbox;
2991
    double height;
3078
    double height;
Line 3020... Line 3107...
3020
     */
3107
     */
3021
    return fabs(toDeviceHeight(height, GE_INCHES, dd));
3108
    return fabs(toDeviceHeight(height, GE_INCHES, dd));
3022
}
3109
}
3023
 
3110
 
3024
void GEMathText(double x, double y, SEXP expr,
3111
void GEMathText(double x, double y, SEXP expr,
3025
		double xc, double yc, double rot, 
3112
		double xc, double yc, double rot,
3026
		R_GE_gcontext *gc,
3113
		R_GE_gcontext *gc,
3027
		GEDevDesc *dd)
3114
		GEDevDesc *dd)
3028
{
3115
{
3029
    BBOX bbox;
3116
    BBOX bbox;
3030
    mathContext mc;
3117
    mathContext mc;
Line 3087... Line 3174...
3087
}/* GMathText */
3174
}/* GMathText */
3088
 
3175
 
3089
 
3176
 
3090
/********************************
3177
/********************************
3091
 * Code below here ...
3178
 * Code below here ...
3092
 * ... should be moved to base.c and 
3179
 * ... should be moved to base.c and
3093
 * ... is part of the base graphics API NOT the graphics engine API
3180
 * ... is part of the base graphics API NOT the graphics engine API
3094
 ********************************
3181
 ********************************
3095
 */
3182
 */
3096
double GExpressionWidth(SEXP expr, GUnit units, DevDesc *dd)
3183
double GExpressionWidth(SEXP expr, GUnit units, DevDesc *dd)
3097
{
3184
{
3098
    R_GE_gcontext gc;
3185
    R_GE_gcontext gc;
3099
    double width; 
3186
    double width;
3100
    gcontextFromGP(&gc, dd);
3187
    gcontextFromGP(&gc, dd);
3101
    width = GEExpressionWidth(expr, &gc, (GEDevDesc*) dd);
3188
    width = GEExpressionWidth(expr, &gc, (GEDevDesc*) dd);
3102
    if (units == DEVICE)
3189
    if (units == DEVICE)
3103
	return width;
3190
	return width;
3104
    else
3191
    else
Line 3116... Line 3203...
3116
    else
3203
    else
3117
	return GConvertYUnits(height, DEVICE, units, dd);
3204
	return GConvertYUnits(height, DEVICE, units, dd);
3118
}
3205
}
3119
 
3206
 
3120
/* This is just here to satisfy the Rgraphics.h API.
3207
/* This is just here to satisfy the Rgraphics.h API.
3121
 * This allows new graphics API (GraphicsDevice.h, GraphicsEngine.h) 
3208
 * This allows new graphics API (GraphicsDevice.h, GraphicsEngine.h)
3122
 * to be developed alongside.
3209
 * to be developed alongside.
3123
 * Could be removed if Rgraphics.h ever gets REPLACED by new API
3210
 * Could be removed if Rgraphics.h ever gets REPLACED by new API
3124
 * NOTE that base graphics code no longer calls this -- the base
3211
 * NOTE that base graphics code no longer calls this -- the base
3125
 * graphics system directly calls the graphics engine for mathematical
3212
 * graphics system directly calls the graphics engine for mathematical
3126
 * annotation (GEMathText)
3213
 * annotation (GEMathText)
3127
 */
3214
 */
3128
void GMathText(double x, double y, int coords, SEXP expr,
3215
void GMathText(double x, double y, int coords, SEXP expr,
3129
	       double xc, double yc, double rot, 
3216
	       double xc, double yc, double rot,
3130
	       DevDesc *dd)
3217
	       DevDesc *dd)
3131
{
3218
{
3132
    R_GE_gcontext gc;
3219
    R_GE_gcontext gc;
3133
    gcontextFromGP(&gc, dd);
3220
    gcontextFromGP(&gc, dd);
3134
    GConvert(&x, &y, coords, DEVICE, dd);
3221
    GConvert(&x, &y, coords, DEVICE, dd);