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