The R Project SVN R

Rev

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

Rev 44534 Rev 45446
Line 585... Line 585...
585
     * We used to just force lwd = 1, which is a reasonable sanity check
585
     * We used to just force lwd = 1, which is a reasonable sanity check
586
     * because if the user had set lwd = 10 for something, your
586
     * because if the user had set lwd = 10 for something, your
587
     * mathematical annotation would look REALLY bad.
587
     * mathematical annotation would look REALLY bad.
588
     * Unfortunately, this meant that the user could not set a nice
588
     * Unfortunately, this meant that the user could not set a nice
589
     * small lwd to get a finer line;  we always bumped it back up to 1.
589
     * small lwd to get a finer line;  we always bumped it back up to 1.
590
     * NOW we just reduce lwd to 1 (as a sanity check) ONLY if 
590
     * NOW we just reduce lwd to 1 (as a sanity check) ONLY if
591
     * lwd is greater than 1.
591
     * lwd is greater than 1.
592
     */
592
     */
593
    if (gc->lwd > 1)
593
    if (gc->lwd > 1)
594
	gc->lwd = 1;
594
	gc->lwd = 1;
595
    GEPolyline(5, x, y, gc, dd);
595
    GEPolyline(5, x, y, gc, dd);
Line 948... Line 948...
948
static BBOX GlyphBBox(int chr, pGEcontext gc, pGEDevDesc dd)
948
static BBOX GlyphBBox(int chr, pGEcontext gc, pGEDevDesc dd)
949
{
949
{
950
    BBOX bbox;
950
    BBOX bbox;
951
    double height, depth, width;
951
    double height, depth, width;
952
    int chr1 = chr;
952
    int chr1 = chr;
953
    if(dd->dev->wantSymbolUTF8 && gc->fontface == 5) 
953
    if(dd->dev->wantSymbolUTF8 && gc->fontface == 5)
954
	chr1 = -Rf_AdobeSymbol2ucs2(chr);
954
	chr1 = -Rf_AdobeSymbol2ucs2(chr);
955
    GEMetricInfo(chr1, gc, &height, &depth, &width, dd);
955
    GEMetricInfo(chr1, gc, &height, &depth, &width, dd);
956
    bboxHeight(bbox) = fromDeviceHeight(height, MetricUnit, dd);
956
    bboxHeight(bbox) = fromDeviceHeight(height, MetricUnit, dd);
957
    bboxDepth(bbox)  = fromDeviceHeight(depth, MetricUnit, dd);
957
    bboxDepth(bbox)  = fromDeviceHeight(depth, MetricUnit, dd);
958
    bboxWidth(bbox)  = fromDeviceHeight(width, MetricUnit, dd);
958
    bboxWidth(bbox)  = fromDeviceHeight(width, MetricUnit, dd);
Line 1006... Line 1006...
1006
	prev = SetFont(SymbolFont, gc);
1006
	prev = SetFont(SymbolFont, gc);
1007
    bbox = GlyphBBox(ascii, gc, dd);
1007
    bbox = GlyphBBox(ascii, gc, dd);
1008
    if (draw) {
1008
    if (draw) {
1009
	asciiStr[0] = ascii;
1009
	asciiStr[0] = ascii;
1010
	asciiStr[1] = '\0';
1010
	asciiStr[1] = '\0';
1011
	GEText(ConvertedX(mc ,dd), ConvertedY(mc, dd), asciiStr, 
1011
	GEText(ConvertedX(mc ,dd), ConvertedY(mc, dd), asciiStr,
1012
	       CE_SYMBOL,
1012
	       CE_SYMBOL,
1013
	       0.0, 0.0, mc->CurrentAngle, gc,
1013
	       0.0, 0.0, mc->CurrentAngle, gc,
1014
	       dd);
1014
	       dd);
1015
	PMoveAcross(bboxWidth(bbox), mc);
1015
	PMoveAcross(bboxWidth(bbox), mc);
1016
    }
1016
    }
Line 1124... Line 1124...
1124
    BBOX bbox;
1124
    BBOX bbox;
1125
    char asciiStr[7];
1125
    char asciiStr[7];
1126
 
1126
 
1127
    bbox = GlyphBBox(ascii, gc, dd);
1127
    bbox = GlyphBBox(ascii, gc, dd);
1128
    if (draw) {
1128
    if (draw) {
1129
        memset(asciiStr, 0, sizeof(asciiStr));
1129
	memset(asciiStr, 0, sizeof(asciiStr));
1130
#ifdef SUPPORT_MBCS
1130
#ifdef SUPPORT_MBCS
1131
	if(mbcslocale) {
1131
	if(mbcslocale) {
1132
	    size_t res = wcrtomb(asciiStr, ascii, NULL);
1132
	    size_t res = wcrtomb(asciiStr, ascii, NULL);
1133
	    if(res == -1)
1133
	    if(res == -1)
1134
		error("invalid character in current multibyte locale");
1134
		error("invalid character in current multibyte locale");
Line 1861... Line 1861...
1861
	phi = theta;
1861
	phi = theta;
1862
    }
1862
    }
1863
    delta = (*u - bboxDepth(numBBox)) - (a + 0.5 * theta);
1863
    delta = (*u - bboxDepth(numBBox)) - (a + 0.5 * theta);
1864
    /*
1864
    /*
1865
     * Numerators and denominators on fractions appear too far from
1865
     * Numerators and denominators on fractions appear too far from
1866
     * horizontal bar. 
1866
     * horizontal bar.
1867
     * Reread of Knuth suggests removing "+ theta" components below.
1867
     * Reread of Knuth suggests removing "+ theta" components below.
1868
     */ 
1868
     */
1869
    if (delta < phi)
1869
    if (delta < phi)
1870
	*u += (phi - delta); /* + theta; */
1870
	*u += (phi - delta); /* + theta; */
1871
    delta = (a + 0.5 * theta) - (bboxHeight(denomBBox) - *v);
1871
    delta = (a + 0.5 * theta) - (bboxHeight(denomBBox) - *v);
1872
    if (delta < phi)
1872
    if (delta < phi)
1873
	*v += (phi - delta); /* + theta; */
1873
	*v += (phi - delta); /* + theta; */
Line 1952... Line 1952...
1952
    }
1952
    }
1953
    return CombineAlignedBBoxes(numBBox, denomBBox);
1953
    return CombineAlignedBBoxes(numBBox, denomBBox);
1954
}
1954
}
1955
 
1955
 
1956
static BBOX RenderUnderline(SEXP expr, int draw, mathContext *mc,
1956
static BBOX RenderUnderline(SEXP expr, int draw, mathContext *mc,
1957
	        	    pGEcontext gc, pGEDevDesc dd)
1957
			    pGEcontext gc, pGEDevDesc dd)
1958
{
1958
{
1959
    SEXP body = CADR(expr);
1959
    SEXP body = CADR(expr);
1960
    BBOX BBox;
1960
    BBOX BBox;
1961
    double width, adepth, depth, x[2], y[2];
1961
    double width, adepth, depth, x[2], y[2];
1962
    double savedX = mc->CurrentX;
1962
    double savedX = mc->CurrentX;
Line 1970... Line 1970...
1970
    BBox = RenderElement(body, draw, mc, gc, dd);
1970
    BBox = RenderElement(body, draw, mc, gc, dd);
1971
    adepth = 0.1 * XHeight(gc, dd);
1971
    adepth = 0.1 * XHeight(gc, dd);
1972
    depth = bboxDepth(BBox) + adepth;
1972
    depth = bboxDepth(BBox) + adepth;
1973
 
1973
 
1974
    if (draw) {
1974
    if (draw) {
1975
        int savedlty = gc->lty;
1975
	int savedlty = gc->lty;
1976
        double savedlwd = gc->lwd;
1976
	double savedlwd = gc->lwd;
1977
        mc->CurrentX = savedX;
1977
	mc->CurrentX = savedX;
1978
        mc->CurrentY = savedY;
1978
	mc->CurrentY = savedY;
1979
        PMoveUp(-depth, mc);
1979
	PMoveUp(-depth, mc);
1980
        x[0] = ConvertedX(mc, dd);
1980
	x[0] = ConvertedX(mc, dd);
1981
        y[0] = ConvertedY(mc, dd);
1981
	y[0] = ConvertedY(mc, dd);
1982
        PMoveAcross(width, mc);
1982
	PMoveAcross(width, mc);
1983
        x[1] = ConvertedX(mc, dd);
1983
	x[1] = ConvertedX(mc, dd);
1984
        y[1] = ConvertedY(mc, dd);
1984
	y[1] = ConvertedY(mc, dd);
1985
        gc->lty = LTY_SOLID;
1985
	gc->lty = LTY_SOLID;
1986
	if (gc->lwd > 1)
1986
	if (gc->lwd > 1)
1987
	    gc->lwd = 1;
1987
	    gc->lwd = 1;
1988
        GEPolyline(2, x, y, gc, dd);
1988
	GEPolyline(2, x, y, gc, dd);
1989
        PMoveUp(depth, mc);
1989
	PMoveUp(depth, mc);
1990
        gc->lty = savedlty;
1990
	gc->lty = savedlty;
1991
        gc->lwd = savedlwd;
1991
	gc->lwd = savedlwd;
1992
        PMoveTo(savedX + width, savedY, mc);
1992
	PMoveTo(savedX + width, savedY, mc);
1993
    }
1993
    }
1994
    return EnlargeBBox(BBox, 0.0, adepth, 0.0);
1994
    return EnlargeBBox(BBox, 0.0, adepth, 0.0);
1995
}
1995
}
1996
 
1996
 
1997
 
1997
 
Line 2865... Line 2865...
2865
    return NameAtom(expr) &&
2865
    return NameAtom(expr) &&
2866
	NameMatch(expr, "symbol");
2866
	NameMatch(expr, "symbol");
2867
}
2867
}
2868
 
2868
 
2869
static BBOX RenderSymbolFace(SEXP expr, int draw, mathContext *mc,
2869
static BBOX RenderSymbolFace(SEXP expr, int draw, mathContext *mc,
2870
                             pGEcontext gc, pGEDevDesc dd)
2870
			     pGEcontext gc, pGEDevDesc dd)
2871
{
2871
{
2872
    BBOX bbox;
2872
    BBOX bbox;
2873
    int prevfont = SetFont(SymbolFont, gc);
2873
    int prevfont = SetFont(SymbolFont, gc);
2874
    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
2874
    bbox = RenderElement(CADR(expr), draw, mc, gc, dd);
2875
    SetFont(prevfont, gc);
2875
    SetFont(prevfont, gc);
Line 3089... Line 3089...
3089
    else if (AccentAtom(head))
3089
    else if (AccentAtom(head))
3090
	return RenderAccent(expr, draw, mc, gc, dd);
3090
	return RenderAccent(expr, draw, mc, gc, dd);
3091
    else if (OverAtom(head))
3091
    else if (OverAtom(head))
3092
	return RenderOver(expr, draw, mc, gc, dd);
3092
	return RenderOver(expr, draw, mc, gc, dd);
3093
    else if (UnderlAtom(head))
3093
    else if (UnderlAtom(head))
3094
        return RenderUnderl(expr, draw, mc, gc, dd);
3094
	return RenderUnderl(expr, draw, mc, gc, dd);
3095
    else if (AtopAtom(head))
3095
    else if (AtopAtom(head))
3096
	return RenderAtop(expr, draw, mc, gc, dd);
3096
	return RenderAtop(expr, draw, mc, gc, dd);
3097
    else if (ParenAtom(head))
3097
    else if (ParenAtom(head))
3098
	return RenderParen(expr, draw, mc, gc, dd);
3098
	return RenderParen(expr, draw, mc, gc, dd);
3099
    else if (BGroupAtom(head))
3099
    else if (BGroupAtom(head))