| OLD | NEW |
| 1 /* | 1 /* |
| 2 * This file is part of the internal font implementation. | 2 * This file is part of the internal font implementation. |
| 3 * | 3 * |
| 4 * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. | 4 * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. |
| 5 * Copyright (c) 2010 Google Inc. All rights reserved. | 5 * Copyright (c) 2010 Google Inc. All rights reserved. |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 * | 21 * |
| 22 */ | 22 */ |
| 23 | 23 |
| 24 #import "config.h" | 24 #import "config.h" |
| 25 #import "platform/fonts/FontPlatformData.h" | 25 #import "platform/fonts/FontPlatformData.h" |
| 26 | 26 |
| 27 #import <AppKit/NSFont.h> | 27 #import <AppKit/NSFont.h> |
| 28 #import <AvailabilityMacros.h> | 28 #import <AvailabilityMacros.h> |
| 29 #import <wtf/text/WTFString.h> | 29 #import <wtf/text/WTFString.h> |
| 30 | 30 |
| 31 #if OS(MACOSX) | |
| 32 #import "platform/fonts/harfbuzz/HarfBuzzFace.h" | 31 #import "platform/fonts/harfbuzz/HarfBuzzFace.h" |
| 33 #include "third_party/skia/include/ports/SkTypeface_mac.h" | 32 #include "third_party/skia/include/ports/SkTypeface_mac.h" |
| 34 #endif | |
| 35 | 33 |
| 36 namespace blink { | 34 namespace blink { |
| 37 | 35 |
| 38 unsigned FontPlatformData::hash() const | 36 unsigned FontPlatformData::hash() const |
| 39 { | 37 { |
| 40 ASSERT(m_font || !m_cgFont); | 38 ASSERT(m_font || !m_cgFont); |
| 41 uintptr_t hashCodes[3] = { (uintptr_t)m_font, m_widthVariant, static_cast<ui
ntptr_t>(m_isHashTableDeletedValue << 3 | m_orientation << 2 | m_syntheticBold <
< 1 | m_syntheticItalic) }; | 39 uintptr_t hashCodes[3] = { (uintptr_t)m_font, m_widthVariant, static_cast<ui
ntptr_t>(m_isHashTableDeletedValue << 3 | m_orientation << 2 | m_syntheticBold <
< 1 | m_syntheticItalic) }; |
| 42 return StringHasher::hashMemory<sizeof(hashCodes)>(hashCodes); | 40 return StringHasher::hashMemory<sizeof(hashCodes)>(hashCodes); |
| 43 } | 41 } |
| 44 | 42 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 72 #endif | 70 #endif |
| 73 } | 71 } |
| 74 #endif | 72 #endif |
| 75 | 73 |
| 76 if (m_font) | 74 if (m_font) |
| 77 CFRetain(m_font); | 75 CFRetain(m_font); |
| 78 | 76 |
| 79 m_cgFont.adoptCF(cgFont); | 77 m_cgFont.adoptCF(cgFont); |
| 80 } | 78 } |
| 81 | 79 |
| 82 FontPlatformData:: ~FontPlatformData() | |
| 83 { | |
| 84 if (m_font && m_font != reinterpret_cast<NSFont *>(-1)) | |
| 85 CFRelease(m_font); | |
| 86 } | |
| 87 | |
| 88 void FontPlatformData::platformDataInit(const FontPlatformData& f) | 80 void FontPlatformData::platformDataInit(const FontPlatformData& f) |
| 89 { | 81 { |
| 90 m_font = f.m_font && f.m_font != reinterpret_cast<NSFont *>(-1) ? [f.m_font
retain] : f.m_font; | 82 m_font = f.m_font ? [f.m_font retain] : f.m_font; |
| 91 | 83 |
| 92 m_cgFont = f.m_cgFont; | 84 m_cgFont = f.m_cgFont; |
| 93 m_CTFont = f.m_CTFont; | 85 m_CTFont = f.m_CTFont; |
| 94 | 86 |
| 95 #if OS(MACOSX) | |
| 96 m_inMemoryFont = f.m_inMemoryFont; | 87 m_inMemoryFont = f.m_inMemoryFont; |
| 97 m_harfBuzzFace = f.m_harfBuzzFace; | 88 m_harfBuzzFace = f.m_harfBuzzFace; |
| 98 m_typeface = f.m_typeface; | 89 m_typeface = f.m_typeface; |
| 99 #endif | |
| 100 } | 90 } |
| 101 | 91 |
| 102 const FontPlatformData& FontPlatformData::platformDataAssign(const FontPlatformD
ata& f) | 92 const FontPlatformData& FontPlatformData::platformDataAssign(const FontPlatformD
ata& f) |
| 103 { | 93 { |
| 104 m_cgFont = f.m_cgFont; | 94 m_cgFont = f.m_cgFont; |
| 105 if (m_font == f.m_font) | 95 if (m_font == f.m_font) |
| 106 return *this; | 96 return *this; |
| 107 if (f.m_font && f.m_font != reinterpret_cast<NSFont *>(-1)) | 97 if (f.m_font) |
| 108 CFRetain(f.m_font); | 98 CFRetain(f.m_font); |
| 109 if (m_font && m_font != reinterpret_cast<NSFont *>(-1)) | 99 if (m_font) |
| 110 CFRelease(m_font); | 100 CFRelease(m_font); |
| 111 m_font = f.m_font; | 101 m_font = f.m_font; |
| 112 m_CTFont = f.m_CTFont; | 102 m_CTFont = f.m_CTFont; |
| 113 #if OS(MACOSX) | 103 |
| 114 m_inMemoryFont = f.m_inMemoryFont; | 104 m_inMemoryFont = f.m_inMemoryFont; |
| 115 m_harfBuzzFace = f.m_harfBuzzFace; | 105 m_harfBuzzFace = f.m_harfBuzzFace; |
| 116 m_typeface = f.m_typeface; | 106 m_typeface = f.m_typeface; |
| 117 #endif | 107 |
| 118 return *this; | 108 return *this; |
| 119 } | 109 } |
| 120 | 110 |
| 121 bool FontPlatformData::platformIsEqual(const FontPlatformData& other) const | |
| 122 { | |
| 123 if (m_font || other.m_font) | |
| 124 return m_font == other.m_font; | |
| 125 return m_cgFont == other.m_cgFont; | |
| 126 } | |
| 127 | 111 |
| 128 void FontPlatformData::setFont(NSFont *font) | 112 void FontPlatformData::setFont(NSFont *font) |
| 129 { | 113 { |
| 130 ASSERT_ARG(font, font); | 114 ASSERT_ARG(font, font); |
| 131 ASSERT(m_font != reinterpret_cast<NSFont *>(-1)); | |
| 132 | 115 |
| 133 if (m_font == font) | 116 if (m_font == font) |
| 134 return; | 117 return; |
| 135 | 118 |
| 136 CFRetain(font); | 119 CFRetain(font); |
| 137 if (m_font) | 120 if (m_font) |
| 138 CFRelease(m_font); | 121 CFRelease(m_font); |
| 139 m_font = font; | 122 m_font = font; |
| 140 m_textSize = [font pointSize]; | 123 m_textSize = [font pointSize]; |
| 141 | 124 |
| 142 CGFontRef cgFont = 0; | 125 CGFontRef cgFont = 0; |
| 143 NSFont* loadedFont = 0; | 126 NSFont* loadedFont = 0; |
| 144 loadFont(m_font, m_textSize, loadedFont, cgFont); | 127 loadFont(m_font, m_textSize, loadedFont, cgFont); |
| 145 | 128 |
| 146 #if OS(MACOSX) | |
| 147 // If loadFont replaced m_font with a fallback font, then release the | 129 // If loadFont replaced m_font with a fallback font, then release the |
| 148 // previous font to counter the retain above. Then retain the new font. | 130 // previous font to counter the retain above. Then retain the new font. |
| 149 if (loadedFont != m_font) { | 131 if (loadedFont != m_font) { |
| 150 CFRelease(m_font); | 132 CFRelease(m_font); |
| 151 CFRetain(loadedFont); | 133 CFRetain(loadedFont); |
| 152 m_font = loadedFont; | 134 m_font = loadedFont; |
| 153 } | 135 } |
| 154 #endif | |
| 155 | 136 |
| 156 m_cgFont.adoptCF(cgFont); | 137 m_cgFont.adoptCF(cgFont); |
| 157 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 | 138 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 |
| 158 { | 139 { |
| 159 CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(toCTFontRef(m_font
)); | 140 CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(toCTFontRef(m_font
)); |
| 160 m_isColorBitmapFont = traits & kCTFontColorGlyphsTrait; | 141 m_isColorBitmapFont = traits & kCTFontColorGlyphsTrait; |
| 161 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1080 | 142 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1080 |
| 162 m_isCompositeFontReference = traits & kCTFontCompositeTrait; | 143 m_isCompositeFontReference = traits & kCTFontCompositeTrait; |
| 163 #endif | 144 #endif |
| 164 } | 145 } |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 | 218 |
| 238 const void* keys[] = { kCTFontFeatureSettingsAttribute }; | 219 const void* keys[] = { kCTFontFeatureSettingsAttribute }; |
| 239 const void* values[] = { featureSettings.get() }; | 220 const void* values[] = { featureSettings.get() }; |
| 240 RetainPtr<CFDictionaryRef> attributes(AdoptCF, CFDictionaryCreate(kCFAllocat
orDefault, keys, values, WTF_ARRAY_LENGTH(keys), &kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks)); | 221 RetainPtr<CFDictionaryRef> attributes(AdoptCF, CFDictionaryCreate(kCFAllocat
orDefault, keys, values, WTF_ARRAY_LENGTH(keys), &kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks)); |
| 241 | 222 |
| 242 descriptor = CTFontDescriptorCreateCopyWithAttributes(cascadeToLastResortFon
tDescriptor(), attributes.get()); | 223 descriptor = CTFontDescriptorCreateCopyWithAttributes(cascadeToLastResortFon
tDescriptor(), attributes.get()); |
| 243 | 224 |
| 244 return descriptor; | 225 return descriptor; |
| 245 } | 226 } |
| 246 | 227 |
| 247 String FontPlatformData::fontFamilyName() const | |
| 248 { | |
| 249 return String(CTFontCopyDisplayName(ctFont())); | |
| 250 } | |
| 251 | |
| 252 CTFontRef FontPlatformData::ctFont() const | 228 CTFontRef FontPlatformData::ctFont() const |
| 253 { | 229 { |
| 254 if (m_CTFont) | 230 if (m_CTFont) |
| 255 return m_CTFont.get(); | 231 return m_CTFont.get(); |
| 256 | 232 |
| 257 if (m_inMemoryFont) { | 233 if (m_inMemoryFont) { |
| 258 m_CTFont.adoptCF(CTFontCreateWithGraphicsFont(m_inMemoryFont->cgFont(),
m_textSize, 0, cascadeToLastResortFontDescriptor())); | 234 m_CTFont.adoptCF(CTFontCreateWithGraphicsFont(m_inMemoryFont->cgFont(),
m_textSize, 0, cascadeToLastResortFontDescriptor())); |
| 259 return m_CTFont.get(); | 235 return m_CTFont.get(); |
| 260 } | 236 } |
| 261 | 237 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 281 RetainPtr<CTFontDescriptorRef> newDescriptor(AdoptCF, CTFontDescriptorCr
eateCopyWithFeature(sourceDescriptor.get(), featureType.get(), featureSelector.g
et())); | 257 RetainPtr<CTFontDescriptorRef> newDescriptor(AdoptCF, CTFontDescriptorCr
eateCopyWithFeature(sourceDescriptor.get(), featureType.get(), featureSelector.g
et())); |
| 282 RetainPtr<CTFontRef> newFont(AdoptCF, CTFontCreateWithFontDescriptor(new
Descriptor.get(), m_textSize, 0)); | 258 RetainPtr<CTFontRef> newFont(AdoptCF, CTFontCreateWithFontDescriptor(new
Descriptor.get(), m_textSize, 0)); |
| 283 | 259 |
| 284 if (newFont) | 260 if (newFont) |
| 285 m_CTFont = newFont; | 261 m_CTFont = newFont; |
| 286 } | 262 } |
| 287 | 263 |
| 288 return m_CTFont.get(); | 264 return m_CTFont.get(); |
| 289 } | 265 } |
| 290 | 266 |
| 291 SkTypeface* FontPlatformData::typeface() const { | 267 bool FontPlatformData::isAATFont(CTFontRef ctFont) const |
| 292 if (m_typeface) | |
| 293 return m_typeface.get(); | |
| 294 | |
| 295 m_typeface = adoptRef(SkCreateTypefaceFromCTFont(ctFont())); | |
| 296 return m_typeface.get(); | |
| 297 } | |
| 298 | |
| 299 #if OS(MACOSX) | |
| 300 static bool isAATFont(CTFontRef ctFont) | |
| 301 { | 268 { |
| 302 CFDataRef table = CTFontCopyTable(ctFont, kCTFontTableMort, 0); | 269 CFDataRef table = CTFontCopyTable(ctFont, kCTFontTableMort, 0); |
| 303 if (table) { | 270 if (table) { |
| 304 CFRelease(table); | 271 CFRelease(table); |
| 305 return true; | 272 return true; |
| 306 } | 273 } |
| 307 table = CTFontCopyTable(ctFont, kCTFontTableMorx, 0); | 274 table = CTFontCopyTable(ctFont, kCTFontTableMorx, 0); |
| 308 if (table) { | 275 if (table) { |
| 309 CFRelease(table); | 276 CFRelease(table); |
| 310 return true; | 277 return true; |
| 311 } | 278 } |
| 312 return false; | 279 return false; |
| 313 } | 280 } |
| 314 #endif | |
| 315 | |
| 316 HarfBuzzFace* FontPlatformData::harfBuzzFace() const | |
| 317 { | |
| 318 CTFontRef font = ctFont(); | |
| 319 // HarfBuzz can't handle AAT font | |
| 320 if (isAATFont(font)) | |
| 321 return 0; | |
| 322 | |
| 323 if (!m_harfBuzzFace) { | |
| 324 uint64_t uniqueID = reinterpret_cast<uintptr_t>(font); | |
| 325 m_harfBuzzFace = HarfBuzzFace::create(const_cast<FontPlatformData*>(this
), uniqueID); | |
| 326 } | |
| 327 return m_harfBuzzFace.get(); | |
| 328 } | |
| 329 | |
| 330 | 281 |
| 331 } // namespace blink | 282 } // namespace blink |
| OLD | NEW |