Index: Source/core/platform/graphics/mac/FontCacheMac.mm |
diff --git a/Source/core/platform/graphics/mac/FontCacheMac.mm b/Source/core/platform/graphics/mac/FontCacheMac.mm |
deleted file mode 100644 |
index 9389fc35556af62e01a043c0c822b103bc3b538e..0000000000000000000000000000000000000000 |
--- a/Source/core/platform/graphics/mac/FontCacheMac.mm |
+++ /dev/null |
@@ -1,222 +0,0 @@ |
-/* |
- * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. |
- * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions |
- * are met: |
- * |
- * 1. Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * 2. Redistributions in binary form must reproduce the above copyright |
- * notice, this list of conditions and the following disclaimer in the |
- * documentation and/or other materials provided with the distribution. |
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of |
- * its contributors may be used to endorse or promote products derived |
- * from this software without specific prior written permission. |
- * |
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY |
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-#import "config.h" |
-#import "core/platform/graphics/FontCache.h" |
- |
-#import <AppKit/AppKit.h> |
-#import "core/platform/graphics/FontPlatformData.h" |
-#import "core/platform/graphics/SimpleFontData.h" |
-#import "platform/fonts/FontDescription.h" |
-#import "platform/mac/WebFontCache.h" |
-#import <wtf/MainThread.h> |
-#import <wtf/StdLibExtras.h> |
- |
-// Forward declare Mac SPIs. |
-// Request for public API: rdar://13803570 |
-@interface NSFont (WebKitSPI) |
-+ (NSFont*)findFontLike:(NSFont*)font forString:(NSString*)string withRange:(NSRange)range inLanguage:(id)useNil; |
-+ (NSFont*)findFontLike:(NSFont*)font forCharacter:(UniChar)uc inLanguage:(id)useNil; |
-@end |
- |
-namespace WebCore { |
- |
-// The "void*" parameter makes the function match the prototype for callbacks from callOnMainThread. |
-static void invalidateFontCache(void*) |
-{ |
- if (!isMainThread()) { |
- callOnMainThread(&invalidateFontCache, 0); |
- return; |
- } |
- fontCache()->invalidate(); |
-} |
- |
-static void fontCacheRegisteredFontsChangedNotificationCallback(CFNotificationCenterRef, void* observer, CFStringRef name, const void *, CFDictionaryRef) |
-{ |
- ASSERT_UNUSED(observer, observer == fontCache()); |
- ASSERT_UNUSED(name, CFEqual(name, kCTFontManagerRegisteredFontsChangedNotification)); |
- invalidateFontCache(0); |
-} |
- |
-void FontCache::platformInit() |
-{ |
- CFNotificationCenterAddObserver(CFNotificationCenterGetLocalCenter(), this, fontCacheRegisteredFontsChangedNotificationCallback, kCTFontManagerRegisteredFontsChangedNotification, 0, CFNotificationSuspensionBehaviorDeliverImmediately); |
-} |
- |
-static 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]; |
-} |
- |
-static inline bool isAppKitFontWeightBold(NSInteger appKitFontWeight) |
-{ |
- return appKitFontWeight >= 7; |
-} |
- |
-PassRefPtr<SimpleFontData> FontCache::platformFallbackForCharacter(const FontDescription& fontDescription, UChar32 character, const SimpleFontData* fontDataToSubstitute, bool disallowSynthetics) |
-{ |
- // FIXME: We should fix getFallbackFamily to take a UChar32 |
- // and remove this split-to-UChar16 code. |
- UChar codeUnits[2]; |
- int codeUnitsLength; |
- if (character <= 0xFFFF) { |
- codeUnits[0] = character; |
- codeUnitsLength = 1; |
- } else { |
- codeUnits[0] = U16_LEAD(character); |
- codeUnits[1] = U16_TRAIL(character); |
- codeUnitsLength = 2; |
- } |
- |
- const FontPlatformData& platformData = fontDataToSubstitute->platformData(); |
- NSFont *nsFont = platformData.font(); |
- |
- NSString *string = [[NSString alloc] initWithCharactersNoCopy:codeUnits length:codeUnitsLength freeWhenDone:NO]; |
- NSFont *substituteFont = [NSFont findFontLike:nsFont forString:string withRange:NSMakeRange(0, codeUnitsLength) inLanguage:nil]; |
- [string release]; |
- |
- // FIXME: Remove this SPI usage: http://crbug.com/255122 |
- if (!substituteFont && codeUnitsLength == 1) |
- substituteFont = [NSFont findFontLike:nsFont forCharacter:codeUnits[0] inLanguage:nil]; |
- if (!substituteFont) |
- return 0; |
- |
- // Chromium can't render AppleColorEmoji. |
- if ([[substituteFont familyName] isEqual:@"Apple Color Emoji"]) |
- return 0; |
- |
- // Use the family name from the AppKit-supplied substitute font, requesting the |
- // traits, weight, and size we want. One way this does better than the original |
- // AppKit request is that it takes synthetic bold and oblique into account. |
- // But it does create the possibility that we could end up with a font that |
- // doesn't actually cover the characters we need. |
- |
- NSFontManager *fontManager = [NSFontManager sharedFontManager]; |
- |
- NSFontTraitMask traits; |
- NSInteger weight; |
- CGFloat size; |
- |
- if (nsFont) { |
- traits = [fontManager traitsOfFont:nsFont]; |
- if (platformData.m_syntheticBold) |
- traits |= NSBoldFontMask; |
- if (platformData.m_syntheticOblique) |
- traits |= NSFontItalicTrait; |
- weight = [fontManager weightOfFont:nsFont]; |
- size = [nsFont pointSize]; |
- } else { |
- // For custom fonts nsFont is nil. |
- traits = fontDescription.italic() ? NSFontItalicTrait : 0; |
- weight = toAppKitFontWeight(fontDescription.weight()); |
- size = fontDescription.computedPixelSize(); |
- } |
- |
- NSFontTraitMask substituteFontTraits = [fontManager traitsOfFont:substituteFont]; |
- NSInteger substituteFontWeight = [fontManager weightOfFont:substituteFont]; |
- |
- if (traits != substituteFontTraits || weight != substituteFontWeight || !nsFont) { |
- if (NSFont *bestVariation = [fontManager fontWithFamily:[substituteFont familyName] traits:traits weight:weight size:size]) { |
- if (!nsFont || (([fontManager traitsOfFont:bestVariation] != substituteFontTraits || [fontManager weightOfFont:bestVariation] != substituteFontWeight) |
- && [[bestVariation coveredCharacterSet] longCharacterIsMember:character])) |
- substituteFont = bestVariation; |
- } |
- } |
- |
- substituteFont = fontDescription.usePrinterFont() ? [substituteFont printerFont] : [substituteFont screenFont]; |
- |
- substituteFontTraits = [fontManager traitsOfFont:substituteFont]; |
- substituteFontWeight = [fontManager weightOfFont:substituteFont]; |
- |
- FontPlatformData alternateFont(substituteFont, platformData.size(), platformData.isPrinterFont(), |
- !disallowSynthetics && isAppKitFontWeightBold(weight) && !isAppKitFontWeightBold(substituteFontWeight), |
- !disallowSynthetics && (traits & NSFontItalicTrait) && !(substituteFontTraits & NSFontItalicTrait), |
- platformData.m_orientation); |
- |
- return fontDataFromFontPlatformData(&alternateFont, DoNotRetain); |
-} |
- |
-PassRefPtr<SimpleFontData> FontCache::getLastResortFallbackFont(const FontDescription& fontDescription, ShouldRetain shouldRetain) |
-{ |
- DEFINE_STATIC_LOCAL(AtomicString, timesStr, ("Times", AtomicString::ConstructFromLiteral)); |
- |
- // FIXME: Would be even better to somehow get the user's default font here. For now we'll pick |
- // the default that the user would get without changing any prefs. |
- RefPtr<SimpleFontData> simpleFontData = getFontData(fontDescription, timesStr, false, shouldRetain); |
- if (simpleFontData) |
- return simpleFontData.release(); |
- |
- // The Times fallback will almost always work, but in the highly unusual case where |
- // the user doesn't have it, we fall back on Lucida Grande because that's |
- // guaranteed to be there, according to Nathan Taylor. This is good enough |
- // to avoid a crash at least. |
- DEFINE_STATIC_LOCAL(AtomicString, lucidaGrandeStr, ("Lucida Grande", AtomicString::ConstructFromLiteral)); |
- return getFontData(fontDescription, lucidaGrandeStr, false, shouldRetain); |
-} |
- |
-FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family, float fontSize) |
-{ |
- NSFontTraitMask traits = fontDescription.italic() ? NSFontItalicTrait : 0; |
- NSInteger weight = toAppKitFontWeight(fontDescription.weight()); |
- float size = fontSize; |
- |
- NSFont *nsFont = [WebFontCache fontWithFamily:family traits:traits weight:weight size:size]; |
- if (!nsFont) |
- return 0; |
- |
- NSFontManager *fontManager = [NSFontManager sharedFontManager]; |
- NSFontTraitMask actualTraits = 0; |
- if (fontDescription.italic()) |
- actualTraits = [fontManager traitsOfFont:nsFont]; |
- NSInteger actualWeight = [fontManager weightOfFont:nsFont]; |
- |
- NSFont *platformFont = fontDescription.usePrinterFont() ? [nsFont printerFont] : [nsFont screenFont]; |
- bool syntheticBold = (isAppKitFontWeightBold(weight) && !isAppKitFontWeightBold(actualWeight)) || fontDescription.isSyntheticBold(); |
- bool syntheticOblique = ((traits & NSFontItalicTrait) && !(actualTraits & NSFontItalicTrait)) || fontDescription.isSyntheticItalic(); |
- |
- // FontPlatformData::font() can be null for the case of Chromium out-of-process font loading. |
- // In that case, we don't want to use the platformData. |
- OwnPtr<FontPlatformData> platformData = adoptPtr(new FontPlatformData(platformFont, size, fontDescription.usePrinterFont(), syntheticBold, syntheticOblique, fontDescription.orientation(), fontDescription.widthVariant())); |
- if (!platformData->font()) |
- return 0; |
- return platformData.leakPtr(); |
-} |
- |
-} // namespace WebCore |