OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. |
3 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> | 3 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * | 8 * |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 BOOL candidateHasUnwantedTrait = desired != ((candidateTraits & mask) != 0); | 105 BOOL candidateHasUnwantedTrait = desired != ((candidateTraits & mask) != 0); |
106 if (!candidateHasUnwantedTrait && chosenHasUnwantedTrait) | 106 if (!candidateHasUnwantedTrait && chosenHasUnwantedTrait) |
107 return YES; | 107 return YES; |
108 if (!chosenHasUnwantedTrait && candidateHasUnwantedTrait) | 108 if (!chosenHasUnwantedTrait && candidateHasUnwantedTrait) |
109 return NO; | 109 return NO; |
110 } | 110 } |
111 | 111 |
112 int chosenWeightDeltaMagnitude = abs(chosenWeight - desiredWeight); | 112 int chosenWeightDeltaMagnitude = abs(chosenWeight - desiredWeight); |
113 int candidateWeightDeltaMagnitude = abs(candidateWeight - desiredWeight); | 113 int candidateWeightDeltaMagnitude = abs(candidateWeight - desiredWeight); |
114 | 114 |
115 // If both are the same distance from the desired weight, prefer the candidate
if it is further from medium. | 115 // If both are the same distance from the desired weight, prefer the candidate |
| 116 // if it is further from medium. |
116 if (chosenWeightDeltaMagnitude == candidateWeightDeltaMagnitude) | 117 if (chosenWeightDeltaMagnitude == candidateWeightDeltaMagnitude) |
117 return abs(candidateWeight - 6) > abs(chosenWeight - 6); | 118 return abs(candidateWeight - 6) > abs(chosenWeight - 6); |
118 | 119 |
119 // Otherwise, prefer the one closer to the desired weight. | 120 // Otherwise, prefer the one closer to the desired weight. |
120 return candidateWeightDeltaMagnitude < chosenWeightDeltaMagnitude; | 121 return candidateWeightDeltaMagnitude < chosenWeightDeltaMagnitude; |
121 } | 122 } |
122 | 123 |
123 // Family name is somewhat of a misnomer here. We first attempt to find an exac
t match | 124 // Family name is somewhat of a misnomer here. We first attempt to find an |
124 // comparing the desiredFamily to the PostScript name of the installed fonts. I
f that fails | 125 // exact match comparing the desiredFamily to the PostScript name of the |
125 // we then do a search based on the family names of the installed fonts. | 126 // installed fonts. If that fails we then do a search based on the family |
| 127 // names of the installed fonts. |
126 NSFont* MatchNSFontFamily(NSString* desiredFamily, | 128 NSFont* MatchNSFontFamily(NSString* desiredFamily, |
127 NSFontTraitMask desiredTraits, | 129 NSFontTraitMask desiredTraits, |
128 FontWeight desiredWeight, | 130 FontWeight desiredWeight, |
129 float size) { | 131 float size) { |
130 if ([desiredFamily isEqualToString:@"BlinkMacSystemFont"]) { | 132 if ([desiredFamily isEqualToString:@"BlinkMacSystemFont"]) { |
131 // On OSX 10.9, the default system font depends on the SDK version. When | 133 // On OSX 10.9, the default system font depends on the SDK version. When |
132 // compiled against the OSX 10.10 SDK, the font is .LucidaGrandeUI. When | 134 // compiled against the OSX 10.10 SDK, the font is .LucidaGrandeUI. When |
133 // compiled against the OSX 10.6 SDK, the font is Lucida Grande. Layout | 135 // compiled against the OSX 10.6 SDK, the font is Lucida Grande. Layout |
134 // tests don't support different expectations based on the SDK version, | 136 // tests don't support different expectations based on the SDK version, |
135 // so force layout tests to use "Lucida Grande". Once the 10.10 SDK | 137 // so force layout tests to use "Lucida Grande". Once the 10.10 SDK |
(...skipping 22 matching lines...) Expand all Loading... |
158 if (desiredTraits & IMPORTANT_FONT_TRAITS) | 160 if (desiredTraits & IMPORTANT_FONT_TRAITS) |
159 font = [[NSFontManager sharedFontManager] convertFont:font | 161 font = [[NSFontManager sharedFontManager] convertFont:font |
160 toHaveTrait:desiredTraits]; | 162 toHaveTrait:desiredTraits]; |
161 return font; | 163 return font; |
162 } | 164 } |
163 | 165 |
164 NSFontManager* fontManager = [NSFontManager sharedFontManager]; | 166 NSFontManager* fontManager = [NSFontManager sharedFontManager]; |
165 | 167 |
166 // Do a simple case insensitive search for a matching font family. | 168 // Do a simple case insensitive search for a matching font family. |
167 // NSFontManager requires exact name matches. | 169 // NSFontManager requires exact name matches. |
168 // This addresses the problem of matching arial to Arial, etc., but perhaps no
t all the issues. | 170 // This addresses the problem of matching arial to Arial, etc., but perhaps |
| 171 // not all the issues. |
169 NSEnumerator* e = [[fontManager availableFontFamilies] objectEnumerator]; | 172 NSEnumerator* e = [[fontManager availableFontFamilies] objectEnumerator]; |
170 NSString* availableFamily; | 173 NSString* availableFamily; |
171 while ((availableFamily = [e nextObject])) { | 174 while ((availableFamily = [e nextObject])) { |
172 if ([desiredFamily caseInsensitiveCompare:availableFamily] == NSOrderedSame) | 175 if ([desiredFamily caseInsensitiveCompare:availableFamily] == NSOrderedSame) |
173 break; | 176 break; |
174 } | 177 } |
175 | 178 |
176 int appKitFontWeight = toAppKitFontWeight(desiredWeight); | 179 int appKitFontWeight = toAppKitFontWeight(desiredWeight); |
177 if (!availableFamily) { | 180 if (!availableFamily) { |
178 // Match by PostScript name. | 181 // Match by PostScript name. |
179 NSEnumerator* availableFonts = | 182 NSEnumerator* availableFonts = |
180 [[fontManager availableFonts] objectEnumerator]; | 183 [[fontManager availableFonts] objectEnumerator]; |
181 NSString* availableFont; | 184 NSString* availableFont; |
182 NSFont* nameMatchedFont = nil; | 185 NSFont* nameMatchedFont = nil; |
183 NSFontTraitMask desiredTraitsForNameMatch = | 186 NSFontTraitMask desiredTraitsForNameMatch = |
184 desiredTraits | (appKitFontWeight >= 7 ? NSBoldFontMask : 0); | 187 desiredTraits | (appKitFontWeight >= 7 ? NSBoldFontMask : 0); |
185 while ((availableFont = [availableFonts nextObject])) { | 188 while ((availableFont = [availableFonts nextObject])) { |
186 if ([desiredFamily caseInsensitiveCompare:availableFont] == | 189 if ([desiredFamily caseInsensitiveCompare:availableFont] == |
187 NSOrderedSame) { | 190 NSOrderedSame) { |
188 nameMatchedFont = [NSFont fontWithName:availableFont size:size]; | 191 nameMatchedFont = [NSFont fontWithName:availableFont size:size]; |
189 | 192 |
190 // Special case Osaka-Mono. According to <rdar://problem/3999467>, we n
eed to | 193 // Special case Osaka-Mono. According to <rdar://problem/3999467>, we |
191 // treat Osaka-Mono as fixed pitch. | 194 // need to treat Osaka-Mono as fixed pitch. |
192 if ([desiredFamily caseInsensitiveCompare:@"Osaka-Mono"] == | 195 if ([desiredFamily caseInsensitiveCompare:@"Osaka-Mono"] == |
193 NSOrderedSame && | 196 NSOrderedSame && |
194 desiredTraitsForNameMatch == 0) | 197 desiredTraitsForNameMatch == 0) |
195 return nameMatchedFont; | 198 return nameMatchedFont; |
196 | 199 |
197 NSFontTraitMask traits = [fontManager traitsOfFont:nameMatchedFont]; | 200 NSFontTraitMask traits = [fontManager traitsOfFont:nameMatchedFont]; |
198 if ((traits & desiredTraitsForNameMatch) == desiredTraitsForNameMatch) | 201 if ((traits & desiredTraitsForNameMatch) == desiredTraitsForNameMatch) |
199 return [fontManager convertFont:nameMatchedFont | 202 return [fontManager convertFont:nameMatchedFont |
200 toHaveTrait:desiredTraitsForNameMatch]; | 203 toHaveTrait:desiredTraitsForNameMatch]; |
201 | 204 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 | 256 |
254 NSFontTraitMask actualTraits = 0; | 257 NSFontTraitMask actualTraits = 0; |
255 if (desiredTraits & NSFontItalicTrait) | 258 if (desiredTraits & NSFontItalicTrait) |
256 actualTraits = [fontManager traitsOfFont:font]; | 259 actualTraits = [fontManager traitsOfFont:font]; |
257 int actualWeight = [fontManager weightOfFont:font]; | 260 int actualWeight = [fontManager weightOfFont:font]; |
258 | 261 |
259 bool syntheticBold = appKitFontWeight >= 7 && actualWeight < 7; | 262 bool syntheticBold = appKitFontWeight >= 7 && actualWeight < 7; |
260 bool syntheticItalic = (desiredTraits & NSFontItalicTrait) && | 263 bool syntheticItalic = (desiredTraits & NSFontItalicTrait) && |
261 !(actualTraits & NSFontItalicTrait); | 264 !(actualTraits & NSFontItalicTrait); |
262 | 265 |
263 // There are some malformed fonts that will be correctly returned by -fontWith
Family:traits:weight:size: as a match for a particular trait, | 266 // There are some malformed fonts that will be correctly returned by |
264 // though -[NSFontManager traitsOfFont:] incorrectly claims the font does not
have the specified trait. This could result in applying | 267 // -fontWithFamily:traits:weight:size: as a match for a particular trait, |
265 // synthetic bold on top of an already-bold font, as reported in <http://bugs.
webkit.org/show_bug.cgi?id=6146>. To work around this | 268 // though -[NSFontManager traitsOfFont:] incorrectly claims the font does not |
266 // problem, if we got an apparent exact match, but the requested traits aren't
present in the matched font, we'll try to get a font from | 269 // have the specified trait. This could result in applying |
267 // the same family without those traits (to apply the synthetic traits to late
r). | 270 // synthetic bold on top of an already-bold font, as reported in |
| 271 // <http://bugs.webkit.org/show_bug.cgi?id=6146>. To work around this |
| 272 // problem, if we got an apparent exact match, but the requested traits |
| 273 // aren't present in the matched font, we'll try to get a font from the same |
| 274 // family without those traits (to apply the synthetic traits to later). |
268 NSFontTraitMask nonSyntheticTraits = desiredTraits; | 275 NSFontTraitMask nonSyntheticTraits = desiredTraits; |
269 | 276 |
270 if (syntheticBold) | 277 if (syntheticBold) |
271 nonSyntheticTraits &= ~NSBoldFontMask; | 278 nonSyntheticTraits &= ~NSBoldFontMask; |
272 | 279 |
273 if (syntheticItalic) | 280 if (syntheticItalic) |
274 nonSyntheticTraits &= ~NSItalicFontMask; | 281 nonSyntheticTraits &= ~NSItalicFontMask; |
275 | 282 |
276 if (nonSyntheticTraits != desiredTraits) { | 283 if (nonSyntheticTraits != desiredTraits) { |
277 NSFont* fontWithoutSyntheticTraits = | 284 NSFont* fontWithoutSyntheticTraits = |
(...skipping 17 matching lines...) Expand all Loading... |
295 6, // FontWeight500 | 302 6, // FontWeight500 |
296 8, // FontWeight600 | 303 8, // FontWeight600 |
297 9, // FontWeight700 | 304 9, // FontWeight700 |
298 10, // FontWeight800 | 305 10, // FontWeight800 |
299 12, // FontWeight900 | 306 12, // FontWeight900 |
300 }; | 307 }; |
301 return appKitFontWeights[fontWeight]; | 308 return appKitFontWeights[fontWeight]; |
302 } | 309 } |
303 | 310 |
304 } // namespace blink | 311 } // namespace blink |
OLD | NEW |