mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-24 11:41:58 +00:00
fontsrv: avoid quote mapping on fonts with indistinguishable quotes
Fixes #86. Change-Id: Id487219a0fcfdb68133fc81b11383365a1431c1c Reviewed-on: https://plan9port-review.googlesource.com/2922 Reviewed-by: Russ Cox <rsc@swtch.com>
This commit is contained in:
parent
1f1ab4ccbb
commit
711336c348
1 changed files with 19 additions and 5 deletions
|
@ -17,17 +17,31 @@
|
|||
|
||||
extern void CGFontGetGlyphsForUnichars(CGFontRef, const UniChar[], const CGGlyph[], size_t);
|
||||
|
||||
// In these fonts, it's too hard to distinguish U+2018 and U+2019,
|
||||
// so don't map the ASCII quotes there.
|
||||
// See https://github.com/9fans/plan9port/issues/86
|
||||
static char *skipquotemap[] = {
|
||||
"Courier",
|
||||
"Osaka",
|
||||
};
|
||||
|
||||
int
|
||||
mapUnicode(int i)
|
||||
mapUnicode(char *name, int i)
|
||||
{
|
||||
int j;
|
||||
|
||||
if(0xd800 <= i && i < 0xe0000) // surrogate pairs, will crash OS X libraries!
|
||||
return 0xfffd;
|
||||
for(j=0; j<nelem(skipquotemap); j++) {
|
||||
if(strstr(name, skipquotemap[j]))
|
||||
return i;
|
||||
}
|
||||
switch(i) {
|
||||
case '\'':
|
||||
return 0x2019;
|
||||
case '`':
|
||||
return 0x2018;
|
||||
}
|
||||
if(0xd800 <= i && i < 0xe0000) // surrogate pairs, will crash OS X libraries!
|
||||
return 0xfffd;
|
||||
return i;
|
||||
}
|
||||
|
||||
|
@ -273,7 +287,7 @@ mksubfont(XFont *f, char *name, int lo, int hi, int size, int antialias)
|
|||
CFStringRef keys[] = { kCTFontAttributeName, kCTForegroundColorAttributeName };
|
||||
CFTypeRef values[] = { font, white };
|
||||
|
||||
sprint(buf, "%C", (Rune)mapUnicode(i));
|
||||
sprint(buf, "%C", (Rune)mapUnicode(name, i));
|
||||
str = c2mac(buf);
|
||||
|
||||
// See https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/CoreText_Programming/LayoutOperations/LayoutOperations.html#//apple_ref/doc/uid/TP40005533-CH12-SW2
|
||||
|
@ -298,7 +312,7 @@ mksubfont(XFont *f, char *name, int lo, int hi, int size, int antialias)
|
|||
|
||||
// fprint(2, "printed %#x: %g %g\n", mapUnicode(i), p1.x, p1.y);
|
||||
p1 = CGContextGetTextPosition(ctxt);
|
||||
if(p1.x <= 0 || mapUnicode(i) == 0xfffd) {
|
||||
if(p1.x <= 0 || mapUnicode(name, i) == 0xfffd) {
|
||||
fc->width = 0;
|
||||
fc->left = 0;
|
||||
if(i == 0) {
|
||||
|
|
Loading…
Reference in a new issue