Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2808)

Unified Diff: Source/platform/fonts/mac/FontFamilyMatcherMac.mm

Issue 1292593003: Revert "Revert "Reland 2: mac: Use a placeholder string for the family name of the system font." Br… (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/platform/fonts/mac/FontFamilyMatcherMac.mm
diff --git a/Source/platform/fonts/mac/FontFamilyMatcherMac.mm b/Source/platform/fonts/mac/FontFamilyMatcherMac.mm
index dc23f8e68874eb0709cf30dcdfe64b02760de326..d71d4b223a1fff0288e7b4ddaca238a49ca1f2a5 100644
--- a/Source/platform/fonts/mac/FontFamilyMatcherMac.mm
+++ b/Source/platform/fonts/mac/FontFamilyMatcherMac.mm
@@ -36,6 +36,35 @@
#import <wtf/HashSet.h>
#import <wtf/text/AtomicStringHash.h>
+#include "platform/fonts/FontTraits.h"
+#include "platform/LayoutTestSupport.h"
+#include "platform/mac/VersionUtilMac.h"
+
+ @interface NSFont (YosemiteAdditions)
+ + (NSFont*)systemFontOfSize:(CGFloat)size weight:(CGFloat)weight;
+ @end
+
+ namespace {
+
+ static CGFloat toYosemiteFontWeight(blink::FontWeight fontWeight)
+ {
+ static uint64_t nsFontWeights[] = {
+ 0xbfe99999a0000000, // NSFontWeightUltraLight
+ 0xbfe3333340000000, // NSFontWeightThin
+ 0xbfd99999a0000000, // NSFontWeightLight
+ 0x0000000000000000, // NSFontWeightRegular
+ 0x3fcd70a3e0000000, // NSFontWeightMedium
+ 0x3fd3333340000000, // NSFontWeightSemibold
+ 0x3fd99999a0000000, // NSFontWeightBold
+ 0x3fe1eb8520000000, // NSFontWeightHeavy
+ 0x3fe3d70a40000000, // NSFontWeightBlack
+ };
+ ASSERT(fontWeight >= 0 && fontWeight <= 8);
+ CGFloat* weight = reinterpret_cast<CGFloat*>(&nsFontWeights[fontWeight]);
+ return *weight;
+ }
+ }
+
namespace blink {
const NSFontTraitMask SYNTHESIZED_FONT_TRAITS = (NSBoldFontMask | NSItalicFontMask);
@@ -101,8 +130,41 @@ static BOOL betterChoice(NSFontTraitMask desiredTraits, int desiredWeight,
// Family name is somewhat of a misnomer here. We first attempt to find an exact match
// comparing the desiredFamily to the PostScript name of the installed fonts. If that fails
// we then do a search based on the family names of the installed fonts.
-NSFont* MatchNSFontFamily(NSString* desiredFamily, NSFontTraitMask desiredTraits, int desiredWeight, float size)
+NSFont* MatchNSFontFamily(NSString* desiredFamily, NSFontTraitMask desiredTraits, FontWeight desiredWeight, float size)
{
+ if ([desiredFamily isEqualToString:@"BlinkMacSystemFont"]) {
+ // On OSX 10.9, the default system font depends on the SDK version. When
+ // compiled against the OSX 10.10 SDK, the font is .LucidaGrandeUI. When
+ // compiled against the OSX 10.6 SDK, the font is Lucida Grande. Layout
+ // tests don't support different expectations based on the SDK version,
+ // so force layout tests to use "Lucida Grande". Once the 10.10 SDK
+ // switch is made, this should be changed to return .LucidaGrandeUI and
+ // the Layout Expectations should be updated. http://crbug.com/515836.
+ if (LayoutTestSupport::isRunningLayoutTest() && IsOSMavericks()) {
+ if (desiredWeight >= blink::FontWeightBold)
+ return [NSFont fontWithName:@"Lucida Grande Bold" size:size];
+ else
+ return [NSFont fontWithName:@"Lucida Grande" size:size];
+ }
+
+ NSFont* font = nil;
+ if (IsOSMavericksOrEarlier()) {
+ // On older OSX versions, only bold and regular are available.
+ if (desiredWeight >= blink::FontWeightBold)
+ font = [NSFont boldSystemFontOfSize:size];
+ else
+ font = [NSFont systemFontOfSize:size];
+ }
+ else {
+ // On OSX 10.10+, the default system font has more weights.
+ font = [NSFont systemFontOfSize:size weight:toYosemiteFontWeight(desiredWeight)];
+ }
+
+ if (desiredTraits & IMPORTANT_FONT_TRAITS)
+ font = [[NSFontManager sharedFontManager] convertFont:font toHaveTrait:desiredTraits];
+ return font;
+ }
+
NSFontManager *fontManager = [NSFontManager sharedFontManager];
// Do a simple case insensitive search for a matching font family.
@@ -115,12 +177,13 @@ NSFont* MatchNSFontFamily(NSString* desiredFamily, NSFontTraitMask desiredTraits
break;
}
+ int appKitFontWeight = toAppKitFontWeight(desiredWeight);
if (!availableFamily) {
// Match by PostScript name.
NSEnumerator *availableFonts = [[fontManager availableFonts] objectEnumerator];
NSString *availableFont;
NSFont *nameMatchedFont = nil;
- NSFontTraitMask desiredTraitsForNameMatch = desiredTraits | (desiredWeight >= 7 ? NSBoldFontMask : 0);
+ NSFontTraitMask desiredTraitsForNameMatch = desiredTraits | (appKitFontWeight >= 7 ? NSBoldFontMask : 0);
while ((availableFont = [availableFonts nextObject])) {
if ([desiredFamily caseInsensitiveCompare:availableFont] == NSOrderedSame) {
nameMatchedFont = [NSFont fontWithName:availableFont size:size];
@@ -162,7 +225,7 @@ NSFont* MatchNSFontFamily(NSString* desiredFamily, NSFontTraitMask desiredTraits
if (!choseFont)
newWinner = acceptableChoice(desiredTraits, fontTraits);
else
- newWinner = betterChoice(desiredTraits, desiredWeight, chosenTraits, chosenWeight, fontTraits, fontWeight);
+ newWinner = betterChoice(desiredTraits, appKitFontWeight, chosenTraits, chosenWeight, fontTraits, fontWeight);
if (newWinner) {
choseFont = YES;
@@ -170,7 +233,7 @@ NSFont* MatchNSFontFamily(NSString* desiredFamily, NSFontTraitMask desiredTraits
chosenTraits = fontTraits;
chosenFullName = fontFullName;
- if (chosenWeight == desiredWeight && (chosenTraits & IMPORTANT_FONT_TRAITS) == (desiredTraits & IMPORTANT_FONT_TRAITS))
+ if (chosenWeight == appKitFontWeight && (chosenTraits & IMPORTANT_FONT_TRAITS) == (desiredTraits & IMPORTANT_FONT_TRAITS))
break;
}
}
@@ -188,7 +251,7 @@ NSFont* MatchNSFontFamily(NSString* desiredFamily, NSFontTraitMask desiredTraits
actualTraits = [fontManager traitsOfFont:font];
int actualWeight = [fontManager weightOfFont:font];
- bool syntheticBold = desiredWeight >= 7 && actualWeight < 7;
+ bool syntheticBold = appKitFontWeight >= 7 && actualWeight < 7;
bool syntheticItalic = (desiredTraits & NSFontItalicTrait) && !(actualTraits & NSFontItalicTrait);
// There are some malformed fonts that will be correctly returned by -fontWithFamily:traits:weight:size: as a match for a particular trait,
@@ -213,4 +276,20 @@ NSFont* MatchNSFontFamily(NSString* desiredFamily, NSFontTraitMask desiredTraits
return font;
}
+int toAppKitFontWeight(FontWeight fontWeight)
+{
+ static int appKitFontWeights[] = {
+ 2, // FontWeight100
+ 3, // FontWeight200
+ 4, // FontWeight300
+ 5, // FontWeight400
+ 6, // FontWeight500
+ 8, // FontWeight600
+ 9, // FontWeight700
+ 10, // FontWeight800
+ 12, // FontWeight900
+ };
+ return appKitFontWeights[fontWeight];
+}
+
} // namespace blink
« no previous file with comments | « Source/platform/fonts/mac/FontFamilyMatcherMac.h ('k') | Source/platform/fonts/mac/FontFamilyMatcherMacTest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698