static PyObject *Fm_QDTextBounds(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; char *inText__in__; int inText__len__; int inText__in_len__; Rect bounds; #ifndef QDTextBounds PyMac_PRECHECK(QDTextBounds); #endif if (!PyArg_ParseTuple(_args, "s#", &inText__in__, &inText__in_len__)) return NULL; inText__len__ = inText__in_len__; QDTextBounds(inText__len__, inText__in__, &bounds); _res = Py_BuildValue("O&", PyMac_BuildRect, &bounds); return _res; }
static void Quartz_MetricInfo(int c, R_GE_gcontext *gc, double* ascent, double* descent, double* width, NewDevDesc *dd) { FMetricRec myFMetric; QuartzDesc *xd = (QuartzDesc *) dd-> deviceSpecific; char testo[2]; char *ff; CGrafPtr savedPort; Rect bounds; CGPoint position; unsigned char tmp; testo[0] = c; testo[1] = '\0'; /* fprintf(stderr,"c=%c,>%s<\n",c,testo); */ GetPort(&savedPort); SetPort(GetWindowPort(xd->window)); Quartz_SetFont(gc->fontfamily, gc->fontface, gc->cex, gc->ps, dd); if(c==0){ FontMetrics(&myFMetric); *ascent = xd->yscale *floor(gc->cex * gc->ps + 0.5) * FixedToFloat(myFMetric.ascent); *descent = xd->yscale*floor(gc->cex * gc->ps + 0.5) * FixedToFloat(myFMetric.descent); } else { CGContextSaveGState( GetContext(xd) ); CGContextTranslateCTM( GetContext(xd), 0, 0 ); CGContextScaleCTM( GetContext(xd), -1, 1); CGContextRotateCTM( GetContext(xd), -1.0 * 3.1416); CGContextSetTextDrawingMode( GetContext(xd), kCGTextInvisible ); Quartz_SetFont(gc->fontfamily, gc->fontface, gc->cex, gc->ps, dd); ff = Quartz_TranslateFontFamily(gc->fontfamily, gc->fontface, xd->family); tmp = (unsigned char)c; if( (gc->fontface == 5) || (strcmp(ff,"Symbol")==0)){ if( (tmp>31) && IsThisASymbol(tmp)) testo[0] = (char)Lat2Uni[tmp-31-1]; else Quartz_SetFont(gc->fontfamily, -1, gc->cex, gc->ps, dd); } else { if(tmp>127) testo[0] = (char)Lat2Mac[tmp-127-1]; } CGContextShowTextAtPoint( GetContext(xd), 0, 0, testo, 1 ); position = CGContextGetTextPosition( GetContext(xd) ); CGContextRestoreGState( GetContext(xd) ); QDTextBounds(1,testo,&bounds); *ascent = -bounds.top; *descent = bounds.bottom; *width = bounds.right - bounds.left; *width = position.x; } SetPort(savedPort); /* fprintf(stderr,"ascent=%f, descent=%f,width=%f\n",*ascent, *descent, *width); */ return; }