Commit Diff


commit - 1f1ab4ccbbec9c92b780f6a60ff9730126659a87
commit + 711336c348ac9b98cd22464496e6b7e9a109c3a9
blob - d1a31837a6ebaafc98cc61b6b7ced64fcd6cbf0b
blob + f48f5b4967b2b607094cfdac0c41bc36e1512be6
--- src/cmd/fontsrv/osx.c
+++ src/cmd/fontsrv/osx.c
@@ -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 si
 		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 si
 
 //		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) {