From 394bfb7263a4685cf4a52d54f179eac6a6533336 Mon Sep 17 00:00:00 2001 From: Jefry Date: Tue, 19 Aug 2014 14:54:16 +0800 Subject: [PATCH] [ColorBitmapFont] add support for OSX, mainly for glyph advancement --- Source/platform/fonts/FontPlatformData.h | 6 +++++ .../fonts/cocoa/FontPlatformDataCocoa.mm | 25 +++++++++++++++++-- .../fonts/mac/ComplexTextController.cpp | 7 ++++++ Source/platform/fonts/mac/FontCacheMac.mm | 4 --- .../platform/fonts/mac/SimpleFontDataMac.mm | 8 ++++-- 5 files changed, 42 insertions(+), 8 deletions(-) diff --git a/Source/platform/fonts/FontPlatformData.h b/Source/platform/fonts/FontPlatformData.h index cb1685709a6..ccb941d883f 100644 --- a/Source/platform/fonts/FontPlatformData.h +++ b/Source/platform/fonts/FontPlatformData.h @@ -43,6 +43,7 @@ typedef const struct __CTFont* CTFontRef; #include #include +#include #endif #include "wtf/Forward.h" @@ -102,6 +103,9 @@ class PLATFORM_EXPORT FontPlatformData { #if OS(MACOSX) CGFontRef cgFont() const { return m_cgFont.get(); } CTFontRef ctFont() const; + CTFontRef ctBitmapColorFont() const; + CGAffineTransform ctBitmapColorFontMat() const { return m_CTColorBitmapFontMat; } + SkTypeface* typeface() const; bool roundsGlyphAdvances() const; @@ -195,6 +199,8 @@ class PLATFORM_EXPORT FontPlatformData { #if OS(MACOSX) RetainPtr m_cgFont; mutable RetainPtr m_CTFont; + mutable RetainPtr m_CTColorBitmapFont; + mutable CGAffineTransform m_CTColorBitmapFontMat; RefPtr m_inMemoryFont; RefPtr m_harfBuzzFace; diff --git a/Source/platform/fonts/cocoa/FontPlatformDataCocoa.mm b/Source/platform/fonts/cocoa/FontPlatformDataCocoa.mm index 9f3bd9fc959..68b0e75fb87 100644 --- a/Source/platform/fonts/cocoa/FontPlatformDataCocoa.mm +++ b/Source/platform/fonts/cocoa/FontPlatformDataCocoa.mm @@ -54,7 +54,7 @@ CGFontRef cgFont = 0; loadFont(nsFont, size, m_font, cgFont); -#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1050 // FIXME: Chromium: The following code isn't correct for the Chromium port since the sandbox might // have blocked font loading, in which case we'll only have the real loaded font file after the call to loadFont(). { @@ -84,6 +84,8 @@ m_cgFont = f.m_cgFont; m_CTFont = f.m_CTFont; + m_CTColorBitmapFont = f.m_CTColorBitmapFont; + m_CTColorBitmapFontMat = f.m_CTColorBitmapFontMat; #if OS(MACOSX) m_inMemoryFont = f.m_inMemoryFont; @@ -103,6 +105,8 @@ CFRelease(m_font); m_font = f.m_font; m_CTFont = f.m_CTFont; + m_CTColorBitmapFont = f.m_CTColorBitmapFont; + m_CTColorBitmapFontMat = f.m_CTColorBitmapFontMat; #if OS(MACOSX) m_inMemoryFont = f.m_inMemoryFont; m_harfBuzzFace = f.m_harfBuzzFace; @@ -147,7 +151,7 @@ #endif m_cgFont.adoptCF(cgFont); -#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1050 { CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(toCTFontRef(m_font)); m_isColorBitmapFont = traits & kCTFontColorGlyphsTrait; @@ -157,6 +161,8 @@ } #endif m_CTFont = 0; + m_CTColorBitmapFont = 0; + m_CTColorBitmapFontMat = CGAffineTransformIdentity; } bool FontPlatformData::roundsGlyphAdvances() const @@ -280,6 +286,21 @@ static CTFontDescriptorRef cascadeToLastResortAndDisableSwashesFontDescriptor() return m_CTFont.get(); } + +CTFontRef FontPlatformData::ctBitmapColorFont() const +{ + if (m_CTColorBitmapFont) + return m_CTColorBitmapFont.get(); + + CTFontRef origFont = ctFont(); + m_CTColorBitmapFont = CTFontCreateCopyWithAttributes(origFont, 1, &CGAffineTransformIdentity, NULL); + + CGAffineTransform fontMat = CTFontGetMatrix(origFont); + CGFloat fontSize = CTFontGetSize(origFont); + m_CTColorBitmapFontMat = CGAffineTransformScale(fontMat, fontSize, fontSize); + + return m_CTColorBitmapFont.get(); +} SkTypeface* FontPlatformData::typeface() const{ if (m_typeface) diff --git a/Source/platform/fonts/mac/ComplexTextController.cpp b/Source/platform/fonts/mac/ComplexTextController.cpp index 4537d16d5de..fae4a8ea1c2 100644 --- a/Source/platform/fonts/mac/ComplexTextController.cpp +++ b/Source/platform/fonts/mac/ComplexTextController.cpp @@ -562,6 +562,13 @@ void ComplexTextController::adjustGlyphsAndAdvances() advance.width = 0; glyph = fontData->spaceGlyph(); } + + if (fontData->platformData().isColorBitmapFont()) { + CTFontRef colorFont = fontData->platformData().ctBitmapColorFont(); + CGAffineTransform fontMat = fontData->platformData().ctBitmapColorFontMat(); + CTFontGetAdvancesForGlyphs(colorFont, kCTFontOrientationHorizontal, &glyph, &advance, 1); + advance = CGSizeApplyAffineTransform(advance, fontMat); + } float roundedAdvanceWidth = roundf(advance.width); if (roundsAdvances) diff --git a/Source/platform/fonts/mac/FontCacheMac.mm b/Source/platform/fonts/mac/FontCacheMac.mm index a2888c347c8..23ae8f2b95a 100644 --- a/Source/platform/fonts/mac/FontCacheMac.mm +++ b/Source/platform/fonts/mac/FontCacheMac.mm @@ -118,10 +118,6 @@ static inline bool isAppKitFontWeightBold(NSInteger appKitFontWeight) if (!substituteFont) return nullptr; - // Chromium can't render AppleColorEmoji. - if ([[substituteFont familyName] isEqual:@"Apple Color Emoji"]) - return nullptr; - // 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. diff --git a/Source/platform/fonts/mac/SimpleFontDataMac.mm b/Source/platform/fonts/mac/SimpleFontDataMac.mm index c8e44219c9c..6683d005bf4 100644 --- a/Source/platform/fonts/mac/SimpleFontDataMac.mm +++ b/Source/platform/fonts/mac/SimpleFontDataMac.mm @@ -377,8 +377,12 @@ static CFDataRef copyFontTableForTag(FontPlatformData& platformData, FourCharCod CGSize advance = CGSizeZero; if (platformData().orientation() == Horizontal || m_isBrokenIdeographFallback) { NSFont *font = platformData().font(); - if (font && platformData().isColorBitmapFont()) - advance = NSSizeToCGSize([font advancementForGlyph:glyph]); + if (font && platformData().isColorBitmapFont()) { + CTFontRef colorFont = platformData().ctBitmapColorFont(); + CGAffineTransform fontMat = platformData().ctBitmapColorFontMat(); + CTFontGetAdvancesForGlyphs(colorFont, kCTFontOrientationHorizontal, &glyph, &advance, 1); + advance = CGSizeApplyAffineTransform(advance, fontMat); + } else { float pointSize = platformData().m_size; CGAffineTransform m = CGAffineTransformMakeScale(pointSize, pointSize);