Index: Source/platform/fonts/cocoa/FontPlatformDataCocoa.mm |
diff --git a/Source/platform/fonts/cocoa/FontPlatformDataCocoa.mm b/Source/platform/fonts/cocoa/FontPlatformDataCocoa.mm |
index d76370a4be9d9d0ca630efbc8c70b4a6d2eed4d9..4992cad45bdb2f75c9d68a9d2c03ed19c5d16fa8 100644 |
--- a/Source/platform/fonts/cocoa/FontPlatformDataCocoa.mm |
+++ b/Source/platform/fonts/cocoa/FontPlatformDataCocoa.mm |
@@ -35,18 +35,26 @@ |
namespace blink { |
+unsigned FontPlatformData::hash() const |
+{ |
+ ASSERT(m_font || !m_cgFont); |
+ uintptr_t hashCodes[3] = { (uintptr_t)m_font, m_widthVariant, static_cast<uintptr_t>(m_isHashTableDeletedValue << 3 | m_orientation << 2 | m_syntheticBold << 1 | m_syntheticItalic) }; |
+ return StringHasher::hashMemory<sizeof(hashCodes)>(hashCodes); |
+} |
+ |
// These CoreText Text Spacing feature selectors are not defined in CoreText. |
enum TextSpacingCTFeatureSelector { TextSpacingProportional, TextSpacingFullWidth, TextSpacingHalfWidth, TextSpacingThirdWidth, TextSpacingQuarterWidth }; |
-FontPlatformData::FontPlatformData(NSFont *nsFont, float size, bool syntheticBold, bool syntheticOblique, FontOrientation orientation, FontWidthVariant widthVariant) |
- : m_syntheticBold(syntheticBold) |
- , m_syntheticOblique(syntheticOblique) |
+FontPlatformData::FontPlatformData(NSFont *nsFont, float size, bool syntheticBold, bool syntheticItalic, FontOrientation orientation, FontWidthVariant widthVariant) |
+ : m_textSize(size) |
+ , m_syntheticBold(syntheticBold) |
+ , m_syntheticItalic(syntheticItalic) |
, m_orientation(orientation) |
- , m_size(size) |
- , m_widthVariant(widthVariant) |
- , m_font(nsFont) |
, m_isColorBitmapFont(false) |
, m_isCompositeFontReference(false) |
+ , m_widthVariant(widthVariant) |
+ , m_font(nsFont) |
+ , m_isHashTableDeletedValue(false) |
{ |
ASSERT_ARG(nsFont, nsFont); |
@@ -129,11 +137,11 @@ void FontPlatformData::setFont(NSFont *font) |
if (m_font) |
CFRelease(m_font); |
m_font = font; |
- m_size = [font pointSize]; |
+ m_textSize = [font pointSize]; |
CGFontRef cgFont = 0; |
NSFont* loadedFont = 0; |
- loadFont(m_font, m_size, loadedFont, cgFont); |
+ loadFont(m_font, m_textSize, loadedFont, cgFont); |
#if OS(MACOSX) |
// If loadFont replaced m_font with a fallback font, then release the |
@@ -247,7 +255,7 @@ CTFontRef FontPlatformData::ctFont() const |
return m_CTFont.get(); |
if (m_inMemoryFont) { |
- m_CTFont.adoptCF(CTFontCreateWithGraphicsFont(m_inMemoryFont->cgFont(), m_size, 0, cascadeToLastResortFontDescriptor())); |
+ m_CTFont.adoptCF(CTFontCreateWithGraphicsFont(m_inMemoryFont->cgFont(), m_textSize, 0, cascadeToLastResortFontDescriptor())); |
return m_CTFont.get(); |
} |
@@ -260,9 +268,9 @@ CTFontRef FontPlatformData::ctFont() const |
fontDescriptor = cascadeToLastResortAndDisableSwashesFontDescriptor(); |
else |
fontDescriptor = cascadeToLastResortFontDescriptor(); |
- m_CTFont.adoptCF(CTFontCreateCopyWithAttributes(m_CTFont.get(), m_size, 0, fontDescriptor)); |
+ m_CTFont.adoptCF(CTFontCreateCopyWithAttributes(m_CTFont.get(), m_textSize, 0, fontDescriptor)); |
} else |
- m_CTFont.adoptCF(CTFontCreateWithGraphicsFont(m_cgFont.get(), m_size, 0, cascadeToLastResortFontDescriptor())); |
+ m_CTFont.adoptCF(CTFontCreateWithGraphicsFont(m_cgFont.get(), m_textSize, 0, cascadeToLastResortFontDescriptor())); |
if (m_widthVariant != RegularWidth) { |
int featureTypeValue = kTextSpacingType; |
@@ -271,7 +279,7 @@ CTFontRef FontPlatformData::ctFont() const |
RetainPtr<CFNumberRef> featureType(AdoptCF, CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &featureTypeValue)); |
RetainPtr<CFNumberRef> featureSelector(AdoptCF, CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &featureSelectorValue)); |
RetainPtr<CTFontDescriptorRef> newDescriptor(AdoptCF, CTFontDescriptorCreateCopyWithFeature(sourceDescriptor.get(), featureType.get(), featureSelector.get())); |
- RetainPtr<CTFontRef> newFont(AdoptCF, CTFontCreateWithFontDescriptor(newDescriptor.get(), m_size, 0)); |
+ RetainPtr<CTFontRef> newFont(AdoptCF, CTFontCreateWithFontDescriptor(newDescriptor.get(), m_textSize, 0)); |
if (newFont) |
m_CTFont = newFont; |
@@ -280,7 +288,7 @@ CTFontRef FontPlatformData::ctFont() const |
return m_CTFont.get(); |
} |
-SkTypeface* FontPlatformData::typeface() const{ |
+SkTypeface* FontPlatformData::typeface() const { |
if (m_typeface) |
return m_typeface.get(); |
@@ -303,8 +311,9 @@ static bool isAATFont(CTFontRef ctFont) |
} |
return false; |
} |
+#endif |
-HarfBuzzFace* FontPlatformData::harfBuzzFace() |
+HarfBuzzFace* FontPlatformData::harfBuzzFace() const |
{ |
CTFontRef font = ctFont(); |
// HarfBuzz can't handle AAT font |
@@ -317,14 +326,13 @@ HarfBuzzFace* FontPlatformData::harfBuzzFace() |
} |
return m_harfBuzzFace.get(); |
} |
-#endif |
#ifndef NDEBUG |
String FontPlatformData::description() const |
{ |
RetainPtr<CFStringRef> cgFontDescription(AdoptCF, CFCopyDescription(cgFont())); |
- return String(cgFontDescription.get()) + " " + String::number(m_size) |
- + (m_syntheticBold ? " synthetic bold" : "") + (m_syntheticOblique ? " synthetic oblique" : "") + (m_orientation ? " vertical orientation" : ""); |
+ return String(cgFontDescription.get()) + " " + String::number(m_textSize) |
+ + (m_syntheticBold ? " synthetic bold" : "") + (m_syntheticItalic ? " synthetic oblique" : "") + (m_orientation ? " vertical orientation" : ""); |
} |
#endif |