mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-27 11:52:03 +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);
|
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
|
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) {
|
switch(i) {
|
||||||
case '\'':
|
case '\'':
|
||||||
return 0x2019;
|
return 0x2019;
|
||||||
case '`':
|
case '`':
|
||||||
return 0x2018;
|
return 0x2018;
|
||||||
}
|
}
|
||||||
if(0xd800 <= i && i < 0xe0000) // surrogate pairs, will crash OS X libraries!
|
|
||||||
return 0xfffd;
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,7 +287,7 @@ mksubfont(XFont *f, char *name, int lo, int hi, int size, int antialias)
|
||||||
CFStringRef keys[] = { kCTFontAttributeName, kCTForegroundColorAttributeName };
|
CFStringRef keys[] = { kCTFontAttributeName, kCTForegroundColorAttributeName };
|
||||||
CFTypeRef values[] = { font, white };
|
CFTypeRef values[] = { font, white };
|
||||||
|
|
||||||
sprint(buf, "%C", (Rune)mapUnicode(i));
|
sprint(buf, "%C", (Rune)mapUnicode(name, i));
|
||||||
str = c2mac(buf);
|
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
|
// 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);
|
// fprint(2, "printed %#x: %g %g\n", mapUnicode(i), p1.x, p1.y);
|
||||||
p1 = CGContextGetTextPosition(ctxt);
|
p1 = CGContextGetTextPosition(ctxt);
|
||||||
if(p1.x <= 0 || mapUnicode(i) == 0xfffd) {
|
if(p1.x <= 0 || mapUnicode(name, i) == 0xfffd) {
|
||||||
fc->width = 0;
|
fc->width = 0;
|
||||||
fc->left = 0;
|
fc->left = 0;
|
||||||
if(i == 0) {
|
if(i == 0) {
|
||||||
|
|
Loading…
Reference in a new issue