15ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen/* 25ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * This file is part of the internal font implementation. 35ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 45ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Copyright (c) 2010 Google Inc. All rights reserved. 55ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 65ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * This library is free software; you can redistribute it and/or 75ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * modify it under the terms of the GNU Library General Public 85ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * License as published by the Free Software Foundation; either 95ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * version 2 of the License, or (at your option) any later version. 105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * This library is distributed in the hope that it will be useful, 125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * but WITHOUT ANY WARRANTY; without even the implied warranty of 135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Library General Public License for more details. 155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * You should have received a copy of the GNU Library General Public License 175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * along with this library; see the file COPYING.LIB. If not, write to 185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Boston, MA 02110-1301, USA. 205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * 215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen */ 225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// This file provides additional functionality to the Mac FontPlatformData class 245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// defined in WebCore/platform/cocoa/FontPlatformDataCocoa.mm . 255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// Because we want to support loading fonts between processes in the face of 265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// font loading being blocked by the sandbox, we need a mechnasim to both 275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// do the loading of in-memory fonts and keep track of them. 285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#import "config.h" 305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#import "CrossProcessFontLoading.h" 315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 322bde8e466a4451c7319e3a072d118917957d6554Steve Block#import "../graphics/FontPlatformData.h" 33ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#import "PlatformBridge.h" 345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#import <AppKit/NSFont.h> 355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#import <wtf/HashMap.h> 365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsennamespace WebCore { 385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsennamespace { 405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsentypedef HashMap<ATSFontContainerRef, MemoryActivatedFont*> FontContainerRefMemoryFontHash; 425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// On 10.5, font loading is not blocked by the sandbox and thus there is no 445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// need for the cross-process font loading mechanim. 455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// On system versions >=10.6 cross-process font loading is required. 465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenbool OutOfProcessFontLoadingEnabled() 475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen static SInt32 systemVersion = 0; 495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!systemVersion) { 505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (Gestalt(gestaltSystemVersion, &systemVersion) != noErr) 515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return false; 525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return systemVersion >= 0x1060; 555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenFontContainerRefMemoryFontHash& fontCacheBySrcFontContainerRef() 585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen DEFINE_STATIC_LOCAL(FontContainerRefMemoryFontHash, srcFontRefCache, ()); 605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return srcFontRefCache; 615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenATSFontContainerRef fontContainerRefFromNSFont(NSFont* srcFont) 645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ATSFontRef fontRef = CTFontGetPlatformFont(toCTFontRef(srcFont), 0); 665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!fontRef) 675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return kATSFontContainerRefUnspecified; 685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ATSFontContainerRef fontContainer = kATSFontContainerRefUnspecified; 695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (ATSFontGetContainer(fontRef, 0, &fontContainer) != noErr) 705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return kATSFontContainerRefUnspecified; 715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return fontContainer; 725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// The only way we can tell that an in-process font has failed to load 755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// is if CTFontCopyGraphicsFont() returns the LastResort font. 765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenbool isLastResortFont(CGFontRef cgFont) 775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen NSString* fontName = (NSString*)CGFontCopyPostScriptName(cgFont); 795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return [fontName isEqualToString:@"LastResort"]; 805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// Given an in-process font which has failed to load, return a 835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// MemoryActivatedFont* corresponding to an in-memory representation of the 845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// same font loaded from the browser process. 855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// On failure this function returns a PassRefPtr pointing to 0. 865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassRefPtr<MemoryActivatedFont> loadFontFromBrowserProcess(NSFont* nsFont) 875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ATSFontContainerRef container; 895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Send cross-process request to load font. 90ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (!PlatformBridge::loadFont(nsFont, &container)) 915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return 0; 925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ATSFontContainerRef srcFontContainerRef = fontContainerRefFromNSFont(nsFont); 945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!srcFontContainerRef) { 955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ATSFontDeactivate(container, 0, kATSOptionFlagsDefault); 965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return 0; 975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen PassRefPtr<MemoryActivatedFont> font = adoptRef(fontCacheBySrcFontContainerRef().get(srcFontContainerRef)); 1005ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (font.get()) 1015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return font; 1025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return MemoryActivatedFont::create(srcFontContainerRef, container); 1045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 1055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} // namespace 1075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassRefPtr<MemoryActivatedFont> MemoryActivatedFont::create(ATSFontContainerRef srcFontContainerRef, ATSFontContainerRef container) 1095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 1105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen MemoryActivatedFont* font = new MemoryActivatedFont(srcFontContainerRef, container); 1115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!font->cgFont()) // Object construction failed. 1125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen { 1135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen delete font; 1145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return 0; 1155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 1165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return adoptRef(font); 1175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 1185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenMemoryActivatedFont::MemoryActivatedFont(ATSFontContainerRef srcFontContainerRef, ATSFontContainerRef container) 1205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen : m_fontContainer(container) 1215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen , m_atsFontRef(kATSFontRefUnspecified) 1225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen , m_srcFontContainerRef(srcFontContainerRef) 1235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 1245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!container) 1255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 1265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Count the number of fonts in the container. 1285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ItemCount fontCount = 0; 1295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen OSStatus err = ATSFontFindFromContainer(container, kATSOptionFlagsDefault, 0, 0, &fontCount); 1305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (err != noErr || fontCount < 1) 1315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 1325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // For now always assume that we want the first font in the container. 1345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ATSFontFindFromContainer(container, kATSOptionFlagsDefault, 1, &m_atsFontRef, 0); 1355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!m_atsFontRef) 1375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 1385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Cache CGFont representation of the font. 1405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen m_cgFont.adoptCF(CGFontCreateWithPlatformFont(&m_atsFontRef)); 1415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!m_cgFont.get()) 1435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 1445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Add ourselves to cache. 1465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen fontCacheBySrcFontContainerRef().add(m_srcFontContainerRef, this); 1475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 1485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// Destructor - Unload font container from memory and remove ourselves 1505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// from cache. 1515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenMemoryActivatedFont::~MemoryActivatedFont() 1525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 1535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (m_cgFont.get()) { 1545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // First remove ourselves from the caches. 1555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ASSERT(fontCacheBySrcFontContainerRef().contains(m_srcFontContainerRef)); 1565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen fontCacheBySrcFontContainerRef().remove(m_srcFontContainerRef); 1585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Make sure the CGFont is destroyed before its font container. 1605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen m_cgFont.releaseRef(); 1615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 1625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (m_fontContainer != kATSFontContainerRefUnspecified) 1645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ATSFontDeactivate(m_fontContainer, 0, kATSOptionFlagsDefault); 1655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 1665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// Given an NSFont, try to load a representation of that font into the cgFont 1685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// parameter. If loading is blocked by the sandbox, the font may be loaded 1695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// cross-process. 1705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// If sandbox loading also fails, a fallback font is loaded. 1715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// 1725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// Considerations: 1735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// * cgFont must be CFRelease()ed by the caller when done. 1745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// 1755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// Parameters: 1765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// * nsFont - The font we wish to load. 1775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// * fontSize - point size of the font we wish to load. 1785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// * outNSFont - The font that was actually loaded, may be different from nsFont 1795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// if a fallback font was used. 1805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// * cgFont - on output this contains the CGFontRef corresponding to the NSFont 1815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// that was picked in the end. The caller is responsible for calling 1825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// CFRelease() on this parameter when done with it. 1835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// * fontID - on output, the ID corresponding to nsFont. 1844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid FontPlatformData::loadFont(NSFont* nsFont, float fontSize, NSFont*& outNSFont, CGFontRef& cgFont) 1855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 1865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen outNSFont = nsFont; 1875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen cgFont = CTFontCopyGraphicsFont(toCTFontRef(outNSFont), 0); 1885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (OutOfProcessFontLoadingEnabled() && outNSFont && cgFont && isLastResortFont(cgFont)) { 1895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Release old CGFontRef since it points at the LastResort font which we don't want. 1905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen CFRelease(cgFont); 1915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen cgFont = 0; 1925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Font loading was blocked by the Sandbox. 1945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen m_inMemoryFont = loadFontFromBrowserProcess(outNSFont); 1955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (m_inMemoryFont.get()) { 1965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen cgFont = m_inMemoryFont->cgFont(); 1975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Need to add an extra retain so output semantics of this function 1995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // are consistent. 2005ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen CFRetain(cgFont); 2015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } else { 2025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // If we still can't load the font, then return Times, 2035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // rather than the LastResort font. 2045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen outNSFont = [NSFont fontWithName:@"Times" size:fontSize]; 2055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen cgFont = CTFontCopyGraphicsFont(toCTFontRef(outNSFont), 0); 2065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 2075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 2085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 2095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 2105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} // namespace WebCore 211