18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This file is part of the internal font implementation.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
55ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Copyright (c) 2010 Google Inc. All rights reserved.
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "config.h"
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "FontPlatformData.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "PlatformString.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebCoreSystemInterface.h"
298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#import <AppKit/NSFont.h>
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// These CoreText Text Spacing feature selectors are not defined in CoreText.
342fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockenum TextSpacingCTFeatureSelector { TextSpacingProportional, TextSpacingFullWidth, TextSpacingHalfWidth, TextSpacingThirdWidth, TextSpacingQuarterWidth };
352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if PLATFORM(MAC)
374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid FontPlatformData::loadFont(NSFont* nsFont, float, NSFont*& outNSFont, CGFontRef& cgFont)
385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    outNSFont = nsFont;
405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#ifndef BUILDING_ON_TIGER
415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    cgFont = CTFontCopyGraphicsFont(toCTFontRef(nsFont), 0);
425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#else
435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    cgFont = wkGetCGFontFromNSFont(nsFont);
445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif  // PLATFORM(MAC)
475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
482bde8e466a4451c7319e3a072d118917957d6554Steve BlockFontPlatformData::FontPlatformData(NSFont *nsFont, float size, bool syntheticBold, bool syntheticOblique, FontOrientation orientation,
492bde8e466a4451c7319e3a072d118917957d6554Steve Block                                   TextOrientation textOrientation, FontWidthVariant widthVariant)
508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    : m_syntheticBold(syntheticBold)
518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    , m_syntheticOblique(syntheticOblique)
522bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_orientation(orientation)
532bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_textOrientation(textOrientation)
546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    , m_size(size)
552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_widthVariant(widthVariant)
568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    , m_font(nsFont)
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // FIXME: Chromium: The following code isn't correct for the Chromium port since the sandbox might
595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // have blocked font loading, in which case we'll only have the real loaded font file after the call to loadFont().
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_isColorBitmapFont(CTFontGetSymbolicTraits(toCTFontRef(nsFont)) & kCTFontColorGlyphsTrait)
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_isColorBitmapFont(false)
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
65e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ASSERT_ARG(nsFont, nsFont);
66e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CGFontRef cgFont = 0;
684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    loadFont(nsFont, size, m_font, cgFont);
69e14391e94c850b8bd03680c23b38978db68687a8John Reck
705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (m_font)
715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        CFRetain(m_font);
725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER
745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_cgFont.adoptCF(cgFont);
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_cgFont = cgFont;
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
802bde8e466a4451c7319e3a072d118917957d6554Steve BlockFontPlatformData:: ~FontPlatformData()
812bde8e466a4451c7319e3a072d118917957d6554Steve Block{
822bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_font && m_font != reinterpret_cast<NSFont *>(-1))
832bde8e466a4451c7319e3a072d118917957d6554Steve Block        CFRelease(m_font);
842bde8e466a4451c7319e3a072d118917957d6554Steve Block}
852bde8e466a4451c7319e3a072d118917957d6554Steve Block
862bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid FontPlatformData::platformDataInit(const FontPlatformData& f)
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_font = f.m_font && f.m_font != reinterpret_cast<NSFont *>(-1) ? const_cast<NSFont *>(static_cast<const NSFont *>(CFRetain(f.m_font))) : f.m_font;
8906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_cgFont = f.m_cgFont;
91dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_CTFont = f.m_CTFont;
922bde8e466a4451c7319e3a072d118917957d6554Steve Block
935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if PLATFORM(CHROMIUM) && OS(DARWIN)
945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_inMemoryFont = f.m_inMemoryFont;
955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
982bde8e466a4451c7319e3a072d118917957d6554Steve Blockconst FontPlatformData& FontPlatformData::platformDataAssign(const FontPlatformData& f)
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_cgFont = f.m_cgFont;
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_font == f.m_font)
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return *this;
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (f.m_font && f.m_font != reinterpret_cast<NSFont *>(-1))
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CFRetain(f.m_font);
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_font && m_font != reinterpret_cast<NSFont *>(-1))
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CFRelease(m_font);
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_font = f.m_font;
108dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_CTFont = f.m_CTFont;
1095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if PLATFORM(CHROMIUM) && OS(DARWIN)
1105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_inMemoryFont = f.m_inMemoryFont;
1115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return *this;
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1152bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool FontPlatformData::platformIsEqual(const FontPlatformData& other) const
1162bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1172bde8e466a4451c7319e3a072d118917957d6554Steve Block    return m_font == other.m_font
1182bde8e466a4451c7319e3a072d118917957d6554Steve Block        && m_cgFont == other.m_cgFont;
1192bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1202bde8e466a4451c7319e3a072d118917957d6554Steve Block
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FontPlatformData::setFont(NSFont *font)
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
123e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ASSERT_ARG(font, font);
124e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ASSERT(m_font != reinterpret_cast<NSFont *>(-1));
125e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_font == font)
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
128e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
129e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    CFRetain(font);
130e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (m_font)
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CFRelease(m_font);
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_font = font;
133e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    m_size = [font pointSize];
1345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    CGFontRef cgFont = 0;
1365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    NSFont* loadedFont = 0;
1374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    loadFont(m_font, m_size, loadedFont, cgFont);
1385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if PLATFORM(CHROMIUM) && OS(DARWIN)
1405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // If loadFont replaced m_font with a fallback font, then release the
1415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // previous font to counter the retain above. Then retain the new font.
1425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (loadedFont != m_font) {
1435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        CFRelease(m_font);
1445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        CFRetain(loadedFont);
1455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_font = loadedFont;
1465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
1475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
1485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER
1505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_cgFont.adoptCF(cgFont);
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
1525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_cgFont = cgFont;
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
1555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_isColorBitmapFont = CTFontGetSymbolicTraits(toCTFontRef(m_font)) & kCTFontColorGlyphsTrait;
156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
157dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_CTFont = 0;
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FontPlatformData::roundsGlyphAdvances() const
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [m_font renderingMode] == NSFontAntialiasedIntegerAdvancementsRenderingMode;
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FontPlatformData::allowsLigatures() const
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return ![[m_font coveredCharacterSet] characterIsMember:'a'];
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1702fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline int mapFontWidthVariantToCTFeatureSelector(FontWidthVariant variant)
1712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    switch(variant) {
1732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case RegularWidth:
1742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return TextSpacingProportional;
1752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case HalfWidth:
1772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return TextSpacingHalfWidth;
1782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case ThirdWidth:
1802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return TextSpacingThirdWidth;
1812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    case QuarterWidth:
1832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return TextSpacingQuarterWidth;
1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT_NOT_REACHED();
1872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return TextSpacingProportional;
1882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
190dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochCTFontRef FontPlatformData::ctFont() const
191dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
1922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_widthVariant == RegularWidth) {
1932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_font)
1942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return toCTFontRef(m_font);
1952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (!m_CTFont)
1962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            m_CTFont.adoptCF(CTFontCreateWithGraphicsFont(m_cgFont.get(), m_size, 0, 0));
1972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return m_CTFont.get();
1982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_CTFont) {
2012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        int featureTypeValue = kTextSpacingType;
2022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        int featureSelectorValue = mapFontWidthVariantToCTFeatureSelector(m_widthVariant);
2032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        RetainPtr<CTFontRef> sourceFont(AdoptCF, CTFontCreateWithGraphicsFont(m_cgFont.get(), m_size, 0, 0));
2042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        RetainPtr<CTFontDescriptorRef> sourceDescriptor(AdoptCF, CTFontCopyFontDescriptor(sourceFont.get()));
2052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        RetainPtr<CFNumberRef> featureType(AdoptCF, CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &featureTypeValue));
2062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        RetainPtr<CFNumberRef> featureSelector(AdoptCF, CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &featureSelectorValue));
2072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        RetainPtr<CTFontDescriptorRef> newDescriptor(AdoptCF, CTFontDescriptorCreateCopyWithFeature(sourceDescriptor.get(), featureType.get(), featureSelector.get()));
2082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        RetainPtr<CTFontRef> newFont(AdoptCF, CTFontCreateWithFontDescriptor(newDescriptor.get(), m_size, 0));
2092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_CTFont = newFont.get() ? newFont : sourceFont;
2112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
212dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return m_CTFont.get();
213dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
214dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
2150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef NDEBUG
2160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochString FontPlatformData::description() const
2170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RetainPtr<CFStringRef> cgFontDescription(AdoptCF, CFCopyDescription(cgFont()));
219e14391e94c850b8bd03680c23b38978db68687a8John Reck    return String(cgFontDescription.get()) + " " + String::number(m_size)
220e14391e94c850b8bd03680c23b38978db68687a8John Reck            + (m_syntheticBold ? " synthetic bold" : "") + (m_syntheticOblique ? " synthetic oblique" : "") + (m_orientation ? " vertical orientation" : "");
2210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
2230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
225