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