| Index: Source/platform/fonts/cocoa/FontPlatformDataCocoa.mm
|
| diff --git a/Source/platform/fonts/cocoa/FontPlatformDataCocoa.mm b/Source/platform/fonts/cocoa/FontPlatformDataCocoa.mm
|
| index b7b8f756fe30a5dd845d4418487cec8a7505a20e..88a346095cb4a09964074ce9da7d8e7560687324 100644
|
| --- a/Source/platform/fonts/cocoa/FontPlatformDataCocoa.mm
|
| +++ b/Source/platform/fonts/cocoa/FontPlatformDataCocoa.mm
|
| @@ -28,8 +28,10 @@
|
| #import <AvailabilityMacros.h>
|
| #import <wtf/text/WTFString.h>
|
|
|
| +#if OS(MACOSX)
|
| #import "platform/fonts/harfbuzz/HarfBuzzFace.h"
|
| #include "third_party/skia/include/ports/SkTypeface_mac.h"
|
| +#endif
|
|
|
| namespace blink {
|
|
|
| @@ -77,16 +79,24 @@ FontPlatformData::FontPlatformData(NSFont *nsFont, float size, bool syntheticBol
|
| m_cgFont.adoptCF(cgFont);
|
| }
|
|
|
| +FontPlatformData:: ~FontPlatformData()
|
| +{
|
| + if (m_font && m_font != reinterpret_cast<NSFont *>(-1))
|
| + CFRelease(m_font);
|
| +}
|
| +
|
| void FontPlatformData::platformDataInit(const FontPlatformData& f)
|
| {
|
| - m_font = f.m_font ? [f.m_font retain] : f.m_font;
|
| + m_font = f.m_font && f.m_font != reinterpret_cast<NSFont *>(-1) ? [f.m_font retain] : f.m_font;
|
|
|
| m_cgFont = f.m_cgFont;
|
| m_CTFont = f.m_CTFont;
|
|
|
| +#if OS(MACOSX)
|
| m_inMemoryFont = f.m_inMemoryFont;
|
| m_harfBuzzFace = f.m_harfBuzzFace;
|
| m_typeface = f.m_typeface;
|
| +#endif
|
| }
|
|
|
| const FontPlatformData& FontPlatformData::platformDataAssign(const FontPlatformData& f)
|
| @@ -94,24 +104,31 @@ const FontPlatformData& FontPlatformData::platformDataAssign(const FontPlatformD
|
| m_cgFont = f.m_cgFont;
|
| if (m_font == f.m_font)
|
| return *this;
|
| - if (f.m_font)
|
| + if (f.m_font && f.m_font != reinterpret_cast<NSFont *>(-1))
|
| CFRetain(f.m_font);
|
| - if (m_font)
|
| + if (m_font && m_font != reinterpret_cast<NSFont *>(-1))
|
| CFRelease(m_font);
|
| m_font = f.m_font;
|
| m_CTFont = f.m_CTFont;
|
| -
|
| +#if OS(MACOSX)
|
| m_inMemoryFont = f.m_inMemoryFont;
|
| m_harfBuzzFace = f.m_harfBuzzFace;
|
| m_typeface = f.m_typeface;
|
| -
|
| +#endif
|
| return *this;
|
| }
|
|
|
| +bool FontPlatformData::platformIsEqual(const FontPlatformData& other) const
|
| +{
|
| + if (m_font || other.m_font)
|
| + return m_font == other.m_font;
|
| + return m_cgFont == other.m_cgFont;
|
| +}
|
|
|
| void FontPlatformData::setFont(NSFont *font)
|
| {
|
| ASSERT_ARG(font, font);
|
| + ASSERT(m_font != reinterpret_cast<NSFont *>(-1));
|
|
|
| if (m_font == font)
|
| return;
|
| @@ -126,6 +143,7 @@ void FontPlatformData::setFont(NSFont *font)
|
| NSFont* loadedFont = 0;
|
| loadFont(m_font, m_textSize, loadedFont, cgFont);
|
|
|
| +#if OS(MACOSX)
|
| // If loadFont replaced m_font with a fallback font, then release the
|
| // previous font to counter the retain above. Then retain the new font.
|
| if (loadedFont != m_font) {
|
| @@ -133,6 +151,7 @@ void FontPlatformData::setFont(NSFont *font)
|
| CFRetain(loadedFont);
|
| m_font = loadedFont;
|
| }
|
| +#endif
|
|
|
| m_cgFont.adoptCF(cgFont);
|
| #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
|
| @@ -225,6 +244,11 @@ static CTFontDescriptorRef cascadeToLastResortAndDisableSwashesFontDescriptor()
|
| return descriptor;
|
| }
|
|
|
| +String FontPlatformData::fontFamilyName() const
|
| +{
|
| + return String(CTFontCopyDisplayName(ctFont()));
|
| +}
|
| +
|
| CTFontRef FontPlatformData::ctFont() const
|
| {
|
| if (m_CTFont)
|
| @@ -264,7 +288,16 @@ CTFontRef FontPlatformData::ctFont() const
|
| return m_CTFont.get();
|
| }
|
|
|
| -bool FontPlatformData::isAATFont(CTFontRef ctFont) const
|
| +SkTypeface* FontPlatformData::typeface() const {
|
| + if (m_typeface)
|
| + return m_typeface.get();
|
| +
|
| + m_typeface = adoptRef(SkCreateTypefaceFromCTFont(ctFont()));
|
| + return m_typeface.get();
|
| +}
|
| +
|
| +#if OS(MACOSX)
|
| +static bool isAATFont(CTFontRef ctFont)
|
| {
|
| CFDataRef table = CTFontCopyTable(ctFont, kCTFontTableMort, 0);
|
| if (table) {
|
| @@ -278,5 +311,21 @@ bool FontPlatformData::isAATFont(CTFontRef ctFont) const
|
| }
|
| return false;
|
| }
|
| +#endif
|
| +
|
| +HarfBuzzFace* FontPlatformData::harfBuzzFace() const
|
| +{
|
| + CTFontRef font = ctFont();
|
| + // HarfBuzz can't handle AAT font
|
| + if (isAATFont(font))
|
| + return 0;
|
| +
|
| + if (!m_harfBuzzFace) {
|
| + uint64_t uniqueID = reinterpret_cast<uintptr_t>(font);
|
| + m_harfBuzzFace = HarfBuzzFace::create(const_cast<FontPlatformData*>(this), uniqueID);
|
| + }
|
| + return m_harfBuzzFace.get();
|
| +}
|
| +
|
|
|
| } // namespace blink
|
|
|