LEFT | RIGHT |
(no file at all) | |
1 #include <u.h> | 1 #include <u.h> |
2 | 2 |
3 #define Point OSXPoint | 3 #define Point OSXPoint |
4 #define Rect OSXRect | 4 #define Rect OSXRect |
5 #define Cursor OSXCursor | 5 #define Cursor OSXCursor |
6 #include <Carbon/Carbon.h> | 6 #include <Carbon/Carbon.h> |
7 #undef Rect | 7 #undef Rect |
8 #undef Point | 8 #undef Point |
9 #undef Cursor | 9 #undef Cursor |
10 #undef offsetof | 10 #undef offsetof |
11 #undef nil | 11 #undef nil |
12 | 12 |
13 #include <libc.h> | 13 #include <libc.h> |
14 #include <draw.h> | 14 #include <draw.h> |
15 #include <memdraw.h> | 15 #include <memdraw.h> |
16 #include "a.h" | 16 #include "a.h" |
17 | 17 |
18 | 18 |
19 extern void CGFontGetGlyphsForUnichars(CGFontRef, const UniChar[], const CGGlyph
[], size_t); | 19 extern void CGFontGetGlyphsForUnichars(CGFontRef, const UniChar[], const CGGlyph
[], size_t); |
| 20 |
| 21 int |
| 22 mapUnicode(int i) |
| 23 { |
| 24 switch(i) { |
| 25 case '\'': |
| 26 return 0x2019; |
| 27 case '`': |
| 28 return 0x2018; |
| 29 } |
| 30 return i; |
| 31 } |
20 | 32 |
21 char* | 33 char* |
22 mac2c(CFStringRef s) | 34 mac2c(CFStringRef s) |
23 { | 35 { |
24 char *p; | 36 char *p; |
25 int n; | 37 int n; |
26 | 38 |
27 n = CFStringGetLength(s)*8;····· | 39 n = CFStringGetLength(s)*8;····· |
28 p = malloc(n); | 40 p = malloc(n); |
29 CFStringGetCString(s, p, n, kCFStringEncodingUTF8); | 41 CFStringGetCString(s, p, n, kCFStringEncodingUTF8); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 bbox.origin.y = 0; | 94 bbox.origin.y = 0; |
83 bbox.size.height = 0; | 95 bbox.size.height = 0; |
84 bbox.size.width = 0; | 96 bbox.size.width = 0; |
85 | 97 |
86 first = 1; | 98 first = 1; |
87 for(i=lo; i<=hi; i++) { | 99 for(i=lo; i<=hi; i++) { |
88 UniChar u; | 100 UniChar u; |
89 CGGlyph g; | 101 CGGlyph g; |
90 CGRect r; | 102 CGRect r; |
91 | 103 |
92 » » u = i; | 104 » » u = mapUnicode(i); |
93 CGFontGetGlyphsForUnichars(font, &u, &g, 1); | 105 CGFontGetGlyphsForUnichars(font, &u, &g, 1); |
94 if(g == 0 || !CGFontGetGlyphBBoxes(font, &g, 1, &r)) | 106 if(g == 0 || !CGFontGetGlyphBBoxes(font, &g, 1, &r)) |
95 continue; | 107 continue; |
96 | 108 |
97 r.size.width += r.origin.x; | 109 r.size.width += r.origin.x; |
98 r.size.height += r.origin.y; | 110 r.size.height += r.origin.y; |
99 if(first) { | 111 if(first) { |
100 bbox = r; | 112 bbox = r; |
101 first = 0; | 113 first = 0; |
102 continue; | 114 continue; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 ········ | 149 ········ |
138 // assume bbox gives latin1 is height/ascent for all | 150 // assume bbox gives latin1 is height/ascent for all |
139 bbox = subfontbbox(font, 0x00, 0xff); | 151 bbox = subfontbbox(font, 0x00, 0xff); |
140 f->unit = CGFontGetUnitsPerEm(font); | 152 f->unit = CGFontGetUnitsPerEm(font); |
141 f->height = bbox.size.height; | 153 f->height = bbox.size.height; |
142 f->originy = bbox.origin.y; | 154 f->originy = bbox.origin.y; |
143 | 155 |
144 // figure out where the letters are | 156 // figure out where the letters are |
145 for(i=0; i<0xffff; i+=0x100) { | 157 for(i=0; i<0xffff; i+=0x100) { |
146 for(j=0; j<0x100; j++) { | 158 for(j=0; j<0x100; j++) { |
147 » » » u[j] = i+j; | 159 » » » u[j] = mapUnicode(i+j); |
148 g[j] = 0; | 160 g[j] = 0; |
149 } | 161 } |
150 CGFontGetGlyphsForUnichars(font, u, g, 256); | 162 CGFontGetGlyphsForUnichars(font, u, g, 256); |
151 for(j=0; j<0x100; j++) { | 163 for(j=0; j<0x100; j++) { |
152 if(g[j] != 0) { | 164 if(g[j] != 0) { |
153 f->range[i>>8] = 1; | 165 f->range[i>>8] = 1; |
154 f->nrange++; | 166 f->nrange++; |
155 break; | 167 break; |
156 } | 168 } |
157 } | 169 } |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 CGGlyph g[2]; | 238 CGGlyph g[2]; |
227 CGRect r[2]; | 239 CGRect r[2]; |
228 CGPoint p1; | 240 CGPoint p1; |
229 int n; | 241 int n; |
230 | 242 |
231 fc->x = x; | 243 fc->x = x; |
232 fc->top = 0; | 244 fc->top = 0; |
233 fc->bottom = Dy(m->r); | 245 fc->bottom = Dy(m->r); |
234 | 246 |
235 n = 0; | 247 n = 0; |
236 » » u[n++] = i; | 248 » » u[n++] = mapUnicode(i); |
237 if(0) // debugging | 249 if(0) // debugging |
238 u[n++] = '|'; | 250 u[n++] = '|'; |
239 g[0] = 0; | 251 g[0] = 0; |
240 CGFontGetGlyphsForUnichars(font, u, g, n); | 252 CGFontGetGlyphsForUnichars(font, u, g, n); |
241 if(g[0] == 0 || !CGFontGetGlyphBBoxes(font, g, n, r)) { | 253 if(g[0] == 0 || !CGFontGetGlyphBBoxes(font, g, n, r)) { |
242 None: | 254 None: |
243 fc->width = 0; | 255 fc->width = 0; |
244 fc->left = 0; | 256 fc->left = 0; |
245 if(i == 0) { | 257 if(i == 0) { |
246 drawpjw(m, fc, x, (int)(bbox.size.width * size /
unit + 0.99999999), y, y - y0); | 258 drawpjw(m, fc, x, (int)(bbox.size.width * size /
unit + 0.99999999), y, y - y0); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 sf->name = nil; | 291 sf->name = nil; |
280 sf->n = hi+1 - lo; | 292 sf->n = hi+1 - lo; |
281 sf->height = Dy(m1->r); | 293 sf->height = Dy(m1->r); |
282 sf->ascent = Dy(m1->r) - y0; | 294 sf->ascent = Dy(m1->r) - y0; |
283 sf->info = fc0; | 295 sf->info = fc0; |
284 sf->bits = m1; | 296 sf->bits = m1; |
285 ········ | 297 ········ |
286 return sf; | 298 return sf; |
287 } | 299 } |
288 | 300 |
LEFT | RIGHT |