The R Project SVN R

Rev

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

Rev 45733 Rev 45740
Line 837... Line 837...
837
    }
837
    }
838
    }
838
    }
839
    return padj;
839
    return padj;
840
}
840
}
841
 
841
 
-
 
842
static void getxlimits(double *x, pGEDevDesc dd) {
-
 
843
    /*
-
 
844
     * xpd = 0 means clip to current plot region
-
 
845
     * xpd = 1 means clip to current figure region
-
 
846
     * xpd = 2 means clip to device region
-
 
847
     */
-
 
848
    switch (gpptr(dd)->xpd) {
-
 
849
    case 0:
-
 
850
	x[0] = gpptr(dd)->usr[0];
-
 
851
	x[1] = gpptr(dd)->usr[1];
-
 
852
	break;
-
 
853
    case 1:
-
 
854
	x[0] = GConvertX(0, NFC, USER, dd);
-
 
855
	x[1] = GConvertX(1, NFC, USER, dd);
-
 
856
	break;
-
 
857
    case 2:
-
 
858
	x[0] = GConvertX(0, NDC, USER, dd);
-
 
859
	x[1] = GConvertX(1, NDC, USER, dd);
-
 
860
	break;
-
 
861
    }
-
 
862
}
-
 
863
 
-
 
864
static void getylimits(double *y, pGEDevDesc dd) {
-
 
865
    switch (gpptr(dd)->xpd) {
-
 
866
    case 0:
-
 
867
	y[0] = gpptr(dd)->usr[2];
-
 
868
	y[1] = gpptr(dd)->usr[3];
-
 
869
	break;
-
 
870
    case 1:
-
 
871
	y[0] = GConvertY(0, NFC, USER, dd);
-
 
872
	y[1] = GConvertY(1, NFC, USER, dd);
-
 
873
	break;
-
 
874
    case 2:
-
 
875
	y[0] = GConvertY(0, NDC, USER, dd);
-
 
876
	y[1] = GConvertY(1, NDC, USER, dd);
-
 
877
	break;
-
 
878
    }
-
 
879
}
-
 
880
 
842
SEXP attribute_hidden do_axis(SEXP call, SEXP op, SEXP args, SEXP env)
881
SEXP attribute_hidden do_axis(SEXP call, SEXP op, SEXP args, SEXP env)
843
{
882
{
844
    /* axis(side, at, labels, tick, line, pos,
883
    /* axis(side, at, labels, tick, line, pos,
845
     *	    outer, font, lty, lwd, col, padj, ...) */
884
     *	    outer, font, lty, lwd, col, padj, ...) */
846
 
885
 
Line 850... Line 889...
850
    int i, n, nint = 0, ntmp, side, *ind, outer, lineoff = 0;
889
    int i, n, nint = 0, ntmp, side, *ind, outer, lineoff = 0;
851
    int istart, iend, incr;
890
    int istart, iend, incr;
852
    Rboolean dolabels, doticks, logflag = FALSE;
891
    Rboolean dolabels, doticks, logflag = FALSE;
853
    Rboolean create_at;
892
    Rboolean create_at;
854
    double x, y, temp, tnew, tlast;
893
    double x, y, temp, tnew, tlast;
855
    double axp[3], usr[2];
894
    double axp[3], usr[2], limits[2];
856
    double gap, labw, low, high, line, pos, lwd, hadj;
895
    double gap, labw, low, high, line, pos, lwd, hadj;
857
    double axis_base, axis_tick, axis_lab, axis_low, axis_high;
896
    double axis_base, axis_tick, axis_lab, axis_low, axis_high;
858
 
897
 
859
    SEXP originalArgs = args, label;
898
    SEXP originalArgs = args, label;
860
    pGEDevDesc dd = GEcurrentDevice();
899
    pGEDevDesc dd = GEcurrentDevice();
Line 1072... Line 1111...
1072
 
1111
 
1073
    /* no! we do allow an `lty' argument -- will not be used often though
1112
    /* no! we do allow an `lty' argument -- will not be used often though
1074
     *	gpptr(dd)->lty = LTY_SOLID; */
1113
     *	gpptr(dd)->lty = LTY_SOLID; */
1075
    gpptr(dd)->lty = lty;
1114
    gpptr(dd)->lty = lty;
1076
    gpptr(dd)->lwd = lwd;
1115
    gpptr(dd)->lwd = lwd;
1077
 
-
 
1078
    /* Override par("xpd") and force clipping to device region. */
-
 
1079
    gpptr(dd)->xpd = 2;
-
 
1080
 
-
 
1081
    gpptr(dd)->adj = R_FINITE(hadj) ? hadj : 0.5;
1116
    gpptr(dd)->adj = R_FINITE(hadj) ? hadj : 0.5;
1082
    gpptr(dd)->font = (font == NA_INTEGER)? gpptr(dd)->fontaxis : font;
1117
    gpptr(dd)->font = (font == NA_INTEGER)? gpptr(dd)->fontaxis : font;
1083
    gpptr(dd)->cex = gpptr(dd)->cexbase * gpptr(dd)->cexaxis;
1118
    gpptr(dd)->cex = gpptr(dd)->cexbase * gpptr(dd)->cexaxis;
1084
    /* no!   col = gpptr(dd)->col; */
1119
    /* no!   col = gpptr(dd)->col; */
1085
 
1120
 
1086
    /* Draw the axis */
1121
    /* Draw the axis */
1087
    GMode(1, dd);
1122
    GMode(1, dd);
1088
    switch (side) {
1123
    switch (side) {
1089
    case 1: /*--- x-axis -- horizontal --- */
1124
    case 1: /*--- x-axis -- horizontal --- */
1090
    case 3:
1125
    case 3:
-
 
1126
        /* First set the clipping limits */
-
 
1127
        getxlimits(limits, dd);
-
 
1128
        /* Now override par("xpd") and force clipping to device region. */
-
 
1129
        gpptr(dd)->xpd = 2;        
1091
	GetAxisLimits(gpptr(dd)->usr[0], gpptr(dd)->usr[1], &low, &high);
1130
	GetAxisLimits(limits[0], limits[1], &low, &high);
1092
	axis_low  = GConvertX(fmax2(low, REAL(at)[0]), USER, NFC, dd);
1131
	axis_low  = GConvertX(fmin2(high, fmax2(low, REAL(at)[0])), USER, NFC, dd);
1093
	axis_high = GConvertX(fmin2(high, REAL(at)[n-1]), USER, NFC, dd);
1132
	axis_high = GConvertX(fmin2(high, fmax2(low, REAL(at)[n-1])), USER, NFC, dd);
1094
	if (side == 1) {
1133
	if (side == 1) {
1095
	    if (R_FINITE(pos))
1134
	    if (R_FINITE(pos))
1096
		axis_base = GConvertY(pos, USER, NFC, dd);
1135
		axis_base = GConvertY(pos, USER, NFC, dd);
1097
	    else
1136
	    else
1098
		axis_base = GConvertY(0.0, outer, NFC, dd)
1137
		axis_base = GConvertY(0.0, outer, NFC, dd)
Line 1218... Line 1257...
1218
	}
1257
	}
1219
	break;
1258
	break;
1220
 
1259
 
1221
    case 2: /*--- y-axis -- vertical --- */
1260
    case 2: /*--- y-axis -- vertical --- */
1222
    case 4:
1261
    case 4:
-
 
1262
        /* First set the clipping limits */
-
 
1263
        getylimits(limits, dd);
-
 
1264
        /* Now override par("xpd") and force clipping to device region. */
-
 
1265
        gpptr(dd)->xpd = 2;      
1223
	GetAxisLimits(gpptr(dd)->usr[2], gpptr(dd)->usr[3], &low, &high);
1266
	GetAxisLimits(limits[0], limits[1], &low, &high);
1224
	axis_low = GConvertY(fmax2(low, REAL(at)[0]), USER, NFC, dd);
1267
	axis_low = GConvertY(fmin2(high, fmax2(low, REAL(at)[0])), USER, NFC, dd);
1225
	axis_high = GConvertY(fmin2(high, REAL(at)[n-1]), USER, NFC, dd);
1268
	axis_high = GConvertY(fmin2(high, fmax2(low, REAL(at)[n-1])), USER, NFC, dd);
1226
	if (side == 2) {
1269
	if (side == 2) {
1227
	    if (R_FINITE(pos))
1270
	    if (R_FINITE(pos))
1228
		axis_base = GConvertX(pos, USER, NFC, dd);
1271
		axis_base = GConvertX(pos, USER, NFC, dd);
1229
	    else
1272
	    else
1230
		axis_base =  GConvertX(0.0, outer, NFC, dd)
1273
		axis_base =  GConvertX(0.0, outer, NFC, dd)
Line 2694... Line 2737...
2694
 
2737
 
2695
 
2738
 
2696
/*  abline(a, b, h, v, col, lty, lwd, ...)
2739
/*  abline(a, b, h, v, col, lty, lwd, ...)
2697
    draw lines in intercept/slope form.	 */
2740
    draw lines in intercept/slope form.	 */
2698
 
2741
 
2699
static void getxlimits(double *x, pGEDevDesc dd) {
-
 
2700
    /*
-
 
2701
     * xpd = 0 means clip to current plot region
-
 
2702
     * xpd = 1 means clip to current figure region
-
 
2703
     * xpd = 2 means clip to device region
-
 
2704
     */
-
 
2705
    switch (gpptr(dd)->xpd) {
-
 
2706
    case 0:
-
 
2707
	x[0] = gpptr(dd)->usr[0];
-
 
2708
	x[1] = gpptr(dd)->usr[1];
-
 
2709
	break;
-
 
2710
    case 1:
-
 
2711
	x[0] = GConvertX(0, NFC, USER, dd);
-
 
2712
	x[1] = GConvertX(1, NFC, USER, dd);
-
 
2713
	break;
-
 
2714
    case 2:
-
 
2715
	x[0] = GConvertX(0, NDC, USER, dd);
-
 
2716
	x[1] = GConvertX(1, NDC, USER, dd);
-
 
2717
	break;
-
 
2718
    }
-
 
2719
}
-
 
2720
 
-
 
2721
static void getylimits(double *y, pGEDevDesc dd) {
-
 
2722
    switch (gpptr(dd)->xpd) {
-
 
2723
    case 0:
-
 
2724
	y[0] = gpptr(dd)->usr[2];
-
 
2725
	y[1] = gpptr(dd)->usr[3];
-
 
2726
	break;
-
 
2727
    case 1:
-
 
2728
	y[0] = GConvertY(0, NFC, USER, dd);
-
 
2729
	y[1] = GConvertY(1, NFC, USER, dd);
-
 
2730
	break;
-
 
2731
    case 2:
-
 
2732
	y[0] = GConvertY(0, NDC, USER, dd);
-
 
2733
	y[1] = GConvertY(1, NDC, USER, dd);
-
 
2734
	break;
-
 
2735
    }
-
 
2736
}
-
 
2737
 
-
 
2738
SEXP attribute_hidden do_abline(SEXP call, SEXP op, SEXP args, SEXP env)
2742
SEXP attribute_hidden do_abline(SEXP call, SEXP op, SEXP args, SEXP env)
2739
{
2743
{
2740
    SEXP a, b, h, v, untf, col, lty, lwd;
2744
    SEXP a, b, h, v, untf, col, lty, lwd;
2741
    int i, ncol, nlines, nlty, nlwd, lstart, lstop;
2745
    int i, ncol, nlines, nlty, nlwd, lstart, lstop;
2742
    double aa, bb, x[2], y[2]={0.,0.} /* -Wall */;
2746
    double aa, bb, x[2], y[2]={0.,0.} /* -Wall */;