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 13 matching lines...) Expand all Loading... |
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 */ | 28 */ |
29 | 29 |
30 #import "config.h" | 30 #import "config.h" |
31 #import "platform/fonts/FontCache.h" | 31 #import "platform/fonts/FontCache.h" |
32 | 32 |
33 #import <AppKit/AppKit.h> | 33 #import <AppKit/AppKit.h> |
| 34 #import "RuntimeEnabledFeatures.h" |
34 #import "platform/LayoutTestSupport.h" | 35 #import "platform/LayoutTestSupport.h" |
35 #import "platform/fonts/FontDescription.h" | 36 #import "platform/fonts/FontDescription.h" |
36 #import "platform/fonts/FontPlatformData.h" | 37 #import "platform/fonts/FontPlatformData.h" |
37 #import "platform/fonts/SimpleFontData.h" | 38 #import "platform/fonts/SimpleFontData.h" |
38 #import "platform/mac/WebFontCache.h" | 39 #import "platform/mac/WebFontCache.h" |
39 #import <wtf/MainThread.h> | 40 #import <wtf/MainThread.h> |
40 #import <wtf/StdLibExtras.h> | 41 #import <wtf/StdLibExtras.h> |
41 | 42 |
42 // Forward declare Mac SPIs. | 43 // Forward declare Mac SPIs. |
43 // Request for public API: rdar://13803570 | 44 // Request for public API: rdar://13803570 |
(...skipping 14 matching lines...) Expand all Loading... |
58 FontCache::fontCache()->invalidate(); | 59 FontCache::fontCache()->invalidate(); |
59 } | 60 } |
60 | 61 |
61 static void fontCacheRegisteredFontsChangedNotificationCallback(CFNotificationCe
nterRef, void* observer, CFStringRef name, const void *, CFDictionaryRef) | 62 static void fontCacheRegisteredFontsChangedNotificationCallback(CFNotificationCe
nterRef, void* observer, CFStringRef name, const void *, CFDictionaryRef) |
62 { | 63 { |
63 ASSERT_UNUSED(observer, observer == FontCache::fontCache()); | 64 ASSERT_UNUSED(observer, observer == FontCache::fontCache()); |
64 ASSERT_UNUSED(name, CFEqual(name, kCTFontManagerRegisteredFontsChangedNotifi
cation)); | 65 ASSERT_UNUSED(name, CFEqual(name, kCTFontManagerRegisteredFontsChangedNotifi
cation)); |
65 invalidateFontCache(0); | 66 invalidateFontCache(0); |
66 } | 67 } |
67 | 68 |
| 69 static bool useHinting() |
| 70 { |
| 71 // Enable hinting when subpixel font scaling is disabled or |
| 72 // when running the set of standard non-subpixel layout tests, |
| 73 // otherwise use subpixel glyph positioning. |
| 74 return (isRunningLayoutTest() && !isFontAntialiasingEnabledForTest()) || !Ru
ntimeEnabledFeatures::subpixelFontScalingEnabled(); |
| 75 } |
| 76 |
68 void FontCache::platformInit() | 77 void FontCache::platformInit() |
69 { | 78 { |
70 CFNotificationCenterAddObserver(CFNotificationCenterGetLocalCenter(), this,
fontCacheRegisteredFontsChangedNotificationCallback, kCTFontManagerRegisteredFon
tsChangedNotification, 0, CFNotificationSuspensionBehaviorDeliverImmediately); | 79 CFNotificationCenterAddObserver(CFNotificationCenterGetLocalCenter(), this,
fontCacheRegisteredFontsChangedNotificationCallback, kCTFontManagerRegisteredFon
tsChangedNotification, 0, CFNotificationSuspensionBehaviorDeliverImmediately); |
71 } | 80 } |
72 | 81 |
73 static int toAppKitFontWeight(FontWeight fontWeight) | 82 static int toAppKitFontWeight(FontWeight fontWeight) |
74 { | 83 { |
75 static int appKitFontWeights[] = { | 84 static int appKitFontWeights[] = { |
76 2, // FontWeight100 | 85 2, // FontWeight100 |
77 3, // FontWeight200 | 86 3, // FontWeight200 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 NSInteger substituteFontWeight = [fontManager weightOfFont:substituteFont]; | 163 NSInteger substituteFontWeight = [fontManager weightOfFont:substituteFont]; |
155 | 164 |
156 if (traits != substituteFontTraits || weight != substituteFontWeight || !nsF
ont) { | 165 if (traits != substituteFontTraits || weight != substituteFontWeight || !nsF
ont) { |
157 if (NSFont *bestVariation = [fontManager fontWithFamily:[substituteFont
familyName] traits:traits weight:weight size:size]) { | 166 if (NSFont *bestVariation = [fontManager fontWithFamily:[substituteFont
familyName] traits:traits weight:weight size:size]) { |
158 if (!nsFont || (([fontManager traitsOfFont:bestVariation] != substit
uteFontTraits || [fontManager weightOfFont:bestVariation] != substituteFontWeigh
t) | 167 if (!nsFont || (([fontManager traitsOfFont:bestVariation] != substit
uteFontTraits || [fontManager weightOfFont:bestVariation] != substituteFontWeigh
t) |
159 && [[bestVariation coveredCharacterSet] longCharacterIsMember:ch
aracter])) | 168 && [[bestVariation coveredCharacterSet] longCharacterIsMember:ch
aracter])) |
160 substituteFont = bestVariation; | 169 substituteFont = bestVariation; |
161 } | 170 } |
162 } | 171 } |
163 | 172 |
164 // Enable hinting, which is equivalent to using the screen font, | 173 substituteFont = useHinting() ? [substituteFont screenFont] : [substituteFon
t printerFont]; |
165 // only when running the set of standard non-subpixel layout tests, | |
166 // otherwise use subpixel glyph positioning. | |
167 substituteFont = !isRunningLayoutTest() || isFontAntialiasingEnabledForTest(
) ? [substituteFont printerFont] : [substituteFont screenFont]; | |
168 | 174 |
169 substituteFontTraits = [fontManager traitsOfFont:substituteFont]; | 175 substituteFontTraits = [fontManager traitsOfFont:substituteFont]; |
170 substituteFontWeight = [fontManager weightOfFont:substituteFont]; | 176 substituteFontWeight = [fontManager weightOfFont:substituteFont]; |
171 | 177 |
172 FontPlatformData alternateFont(substituteFont, platformData.size(), | 178 FontPlatformData alternateFont(substituteFont, platformData.size(), |
173 isAppKitFontWeightBold(weight) && !isAppKitFontWeightBold(substituteFont
Weight), | 179 isAppKitFontWeightBold(weight) && !isAppKitFontWeightBold(substituteFont
Weight), |
174 (traits & NSFontItalicTrait) && !(substituteFontTraits & NSFontItalicTra
it), | 180 (traits & NSFontItalicTrait) && !(substituteFontTraits & NSFontItalicTra
it), |
175 platformData.m_orientation); | 181 platformData.m_orientation); |
176 | 182 |
177 return fontDataFromFontPlatformData(&alternateFont, DoNotRetain); | 183 return fontDataFromFontPlatformData(&alternateFont, DoNotRetain); |
(...skipping 26 matching lines...) Expand all Loading... |
204 NSFont *nsFont = [WebFontCache fontWithFamily:family traits:traits weight:we
ight size:size]; | 210 NSFont *nsFont = [WebFontCache fontWithFamily:family traits:traits weight:we
ight size:size]; |
205 if (!nsFont) | 211 if (!nsFont) |
206 return 0; | 212 return 0; |
207 | 213 |
208 NSFontManager *fontManager = [NSFontManager sharedFontManager]; | 214 NSFontManager *fontManager = [NSFontManager sharedFontManager]; |
209 NSFontTraitMask actualTraits = 0; | 215 NSFontTraitMask actualTraits = 0; |
210 if (fontDescription.style()) | 216 if (fontDescription.style()) |
211 actualTraits = [fontManager traitsOfFont:nsFont]; | 217 actualTraits = [fontManager traitsOfFont:nsFont]; |
212 NSInteger actualWeight = [fontManager weightOfFont:nsFont]; | 218 NSInteger actualWeight = [fontManager weightOfFont:nsFont]; |
213 | 219 |
214 // Enable hinting, which is equivalent to using the screen font, | 220 NSFont *platformFont = useHinting() ? [nsFont screenFont] : [nsFont printerF
ont]; |
215 // only when running the set of standard non-subpixel layout tests, | |
216 // otherwise use subpixel glyph positioning. | |
217 NSFont *platformFont = !isRunningLayoutTest() || isFontAntialiasingEnabledFo
rTest() ? [nsFont printerFont] : [nsFont screenFont]; | |
218 bool syntheticBold = (isAppKitFontWeightBold(weight) && !isAppKitFontWeightB
old(actualWeight)) || fontDescription.isSyntheticBold(); | 221 bool syntheticBold = (isAppKitFontWeightBold(weight) && !isAppKitFontWeightB
old(actualWeight)) || fontDescription.isSyntheticBold(); |
219 bool syntheticOblique = ((traits & NSFontItalicTrait) && !(actualTraits & NS
FontItalicTrait)) || fontDescription.isSyntheticItalic(); | 222 bool syntheticOblique = ((traits & NSFontItalicTrait) && !(actualTraits & NS
FontItalicTrait)) || fontDescription.isSyntheticItalic(); |
220 | 223 |
221 // FontPlatformData::font() can be null for the case of Chromium out-of-proc
ess font loading. | 224 // FontPlatformData::font() can be null for the case of Chromium out-of-proc
ess font loading. |
222 // In that case, we don't want to use the platformData. | 225 // In that case, we don't want to use the platformData. |
223 OwnPtr<FontPlatformData> platformData = adoptPtr(new FontPlatformData(platfo
rmFont, size, syntheticBold, syntheticOblique, fontDescription.orientation(), fo
ntDescription.widthVariant())); | 226 OwnPtr<FontPlatformData> platformData = adoptPtr(new FontPlatformData(platfo
rmFont, size, syntheticBold, syntheticOblique, fontDescription.orientation(), fo
ntDescription.widthVariant())); |
224 if (!platformData->font()) | 227 if (!platformData->font()) |
225 return 0; | 228 return 0; |
226 return platformData.leakPtr(); | 229 return platformData.leakPtr(); |
227 } | 230 } |
228 | 231 |
229 } // namespace WebCore | 232 } // namespace WebCore |
OLD | NEW |