+ Font fid = f->fid;
+ CTFontRef ctfont =
+ CTFontCreateWithName ((CFStringRef) [fid->nsfont fontName],
+ [fid->nsfont pointSize],
+ NULL);
+ Assert (ctfont, @"no CTFontRef for UIFont");
+
+ int utf8_len = 0;
+ char *utf8 = XChar2b_to_utf8 (s, &utf8_len);
+ NSString *nsstr = [NSString stringWithCString:utf8
+ encoding:NSUTF8StringEncoding];
+ NSUInteger L = [nsstr length];
+
+ for (int i = 0; i < L; i++) {
+ unichar c = [nsstr characterAtIndex:i];
+ XCharStruct cc;
+ CGGlyph cgglyph = 0;
+
+ if (CTFontGetGlyphsForCharacters (ctfont, &c, &cgglyph, 1))
+ glyph_metrics (ctfont, cgglyph, &cc);
+ else
+ // This is normal, since Latin1 does not encode 0-31 or 127-159.
+ memset (&cc, 0, sizeof(cc));
+
+ if (i == 0) {
+ *cs = cc;
+ } else {
+ cs->ascent = MAX (cs->ascent, cc.ascent);
+ cs->descent = MAX (cs->descent, cc.descent);
+ cs->lbearing = MIN (cs->lbearing, cs->width + cc.lbearing);
+ cs->rbearing = MAX (cs->rbearing, cs->width + cc.rbearing);
+ cs->width += cc.width;
+ }
+ }
+ *dir_ret = 0;
+ *ascent_ret = f->ascent;
+ *descent_ret = f->descent;
+
+ free (utf8);
+ CFRelease (ctfont);
+
+ return 0;
+}
+
+
+int
+Xutf8TextExtents (XFontSet set, const char *str, int num_bytes,
+ XRectangle *overall_ink_return,
+ XRectangle *overall_logical_return)
+{
+ Font fid = set->font;
+ CTFontRef ctfont =
+ CTFontCreateWithName ((CFStringRef) [fid->nsfont fontName],
+ [fid->nsfont pointSize],
+ NULL);
+ Assert (ctfont, @"no CTFontRef for UIFont");
+
+ NSString *nsstr = [NSString stringWithCString:str
+ encoding:NSUTF8StringEncoding];
+ NSUInteger L = [nsstr length];
+
+ XRectangle ink = { 0, };
+ XRectangle logical = { 0, };
+
+ logical.height = fid->metrics.ascent;
+
+ for (int i = 0; i < L; i++) {
+ unichar c = [nsstr characterAtIndex:i];