15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (c) 2006, 2007, 2008, 2009 Google Inc. All rights reserved. 302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 1702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if !OS(WIN) && !OS(ANDROID) 34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "SkFontConfigInterface.h" 35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif 368abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "SkFontMgr.h" 37197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "SkStream.h" 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SkTypeface.h" 39bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/NotImplemented.h" 40a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/AlternateFontFamily.h" 41a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/FontCache.h" 42f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/fonts/FontDescription.h" 43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "platform/fonts/FontFaceCreationParams.h" 44a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/SimpleFontData.h" 45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "public/platform/Platform.h" 46197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "public/platform/linux/WebSandboxSupport.h" 477757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/Assertions.h" 487757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/text/AtomicString.h" 497757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/text/CString.h" 508abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include <unicode/locid.h> 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if !OS(WIN) && !OS(ANDROID) 53197021e6b966cfb06891637935ef33fff06433d1Ben Murdochstatic SkStream* streamForFontconfigInterfaceId(int fontconfigInterfaceId) 54197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 55197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch SkAutoTUnref<SkFontConfigInterface> fci(SkFontConfigInterface::RefGlobal()); 56197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch SkFontConfigInterface::FontIdentity fontIdentity; 57197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch fontIdentity.fID = fontconfigInterfaceId; 58197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return fci->openStream(fontIdentity); 59197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 60197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif 61197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FontCache::platformInit() 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 68197021e6b966cfb06891637935ef33fff06433d1Ben MurdochPassRefPtr<SimpleFontData> FontCache::fallbackOnStandardFontStyle( 69197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const FontDescription& fontDescription, UChar32 character) 70197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 71197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch FontDescription substituteDescription(fontDescription); 72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch substituteDescription.setStyle(FontStyleNormal); 73197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch substituteDescription.setWeight(FontWeightNormal); 74197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 75197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch FontFaceCreationParams creationParams(substituteDescription.family().family()); 76197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch FontPlatformData* substitutePlatformData = getFontPlatformData(substituteDescription, creationParams); 77197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (substitutePlatformData && substitutePlatformData->fontContainsCharacter(character)) { 78197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch FontPlatformData platformData = FontPlatformData(*substitutePlatformData); 79197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch platformData.setSyntheticBold(fontDescription.weight() >= FontWeight600); 80197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch platformData.setSyntheticItalic(fontDescription.style() == FontStyleItalic); 81197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return fontDataFromFontPlatformData(&platformData, DoNotRetain); 82197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 83197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 84197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return nullptr; 85197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 86197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 8706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#if !OS(WIN) && !OS(ANDROID) 885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)PassRefPtr<SimpleFontData> FontCache::fallbackFontForCharacter(const FontDescription& fontDescription, UChar32 c, const SimpleFontData*) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // First try the specified font with standard style & weight. 91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (fontDescription.style() == FontStyleItalic 92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch || fontDescription.weight() >= FontWeight600) { 93197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch RefPtr<SimpleFontData> fontData = fallbackOnStandardFontStyle( 94197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch fontDescription, c); 95197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (fontData) 96197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return fontData; 97197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 98197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) FontCache::PlatformFallbackFont fallbackFont; 1007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FontCache::getFontForCharacter(c, fontDescription.locale().ascii().data(), &fallbackFont); 1015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (fallbackFont.name.isEmpty()) 102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch FontFaceCreationParams creationParams; 105197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch creationParams = FontFaceCreationParams(fallbackFont.filename, fallbackFont.fontconfigInterfaceId, fallbackFont.ttcIndex); 106197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Changes weight and/or italic of given FontDescription depends on 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the result of fontconfig so that keeping the correct font mapping 109f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // of the given character. See http://crbug.com/32109 for details. 11009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool shouldSetSyntheticBold = false; 11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool shouldSetSyntheticItalic = false; 112a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) FontDescription description(fontDescription); 1135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (fallbackFont.isBold && description.weight() < FontWeightBold) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) description.setWeight(FontWeightBold); 1155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!fallbackFont.isBold && description.weight() >= FontWeightBold) { 11609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) shouldSetSyntheticBold = true; 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) description.setWeight(FontWeightNormal); 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (fallbackFont.isItalic && description.style() == FontStyleNormal) 120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) description.setStyle(FontStyleItalic); 1215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!fallbackFont.isItalic && description.style() == FontStyleItalic) { 12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) shouldSetSyntheticItalic = true; 123d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) description.setStyle(FontStyleNormal); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 126197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch FontPlatformData* substitutePlatformData = getFontPlatformData(description, creationParams); 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!substitutePlatformData) 128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FontPlatformData platformData = FontPlatformData(*substitutePlatformData); 13009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) platformData.setSyntheticBold(shouldSetSyntheticBold); 13109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) platformData.setSyntheticItalic(shouldSetSyntheticItalic); 132a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return fontDataFromFontPlatformData(&platformData, DoNotRetain); 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#endif // !OS(WIN) && !OS(ANDROID) 136e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<SimpleFontData> FontCache::getLastResortFallbackFont(const FontDescription& description, ShouldRetain shouldRetain) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 139197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const FontFaceCreationParams fallbackCreationParams(getFallbackFontFamily(description)); 140197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const FontPlatformData* fontPlatformData = getFontPlatformData(description, fallbackCreationParams); 141bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // We should at least have Sans or Arial which is the last resort fallback of SkFontHost ports. 143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!fontPlatformData) { 144197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch DEFINE_STATIC_LOCAL(const FontFaceCreationParams, sansCreationParams, (AtomicString("Sans", AtomicString::ConstructFromLiteral))); 145197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch fontPlatformData = getFontPlatformData(description, sansCreationParams); 146197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 147197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!fontPlatformData) { 148197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch DEFINE_STATIC_LOCAL(const FontFaceCreationParams, arialCreationParams, (AtomicString("Arial", AtomicString::ConstructFromLiteral))); 149197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch fontPlatformData = getFontPlatformData(description, arialCreationParams); 150197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 151197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if OS(WIN) 152197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // Try some more Windows-specific fallbacks. 153197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!fontPlatformData) { 154197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch DEFINE_STATIC_LOCAL(const FontFaceCreationParams, msuigothicCreationParams, (AtomicString("MS UI Gothic", AtomicString::ConstructFromLiteral))); 155197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch fontPlatformData = getFontPlatformData(description, msuigothicCreationParams); 156d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!fontPlatformData) { 158197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch DEFINE_STATIC_LOCAL(const FontFaceCreationParams, mssansserifCreationParams, (AtomicString("Microsoft Sans Serif", AtomicString::ConstructFromLiteral))); 159197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch fontPlatformData = getFontPlatformData(description, mssansserifCreationParams); 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 161197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(fontPlatformData); 164a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return fontDataFromFontPlatformData(fontPlatformData, shouldRetain); 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 167e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#if OS(WIN) 168e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)static inline SkFontStyle fontStyle(const FontDescription& fontDescription) 169e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){ 170e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) int width = static_cast<int>(fontDescription.stretch()); 171e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) int weight = (fontDescription.weight() - FontWeight100 + 1) * 100; 172e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) SkFontStyle::Slant slant = fontDescription.style() == FontStyleItalic 173e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) ? SkFontStyle::kItalic_Slant 174e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) : SkFontStyle::kUpright_Slant; 175e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return SkFontStyle(weight, width, slant); 176e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)} 177e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 1789e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(FontStretchUltraCondensed) == static_cast<int>(SkFontStyle::kUltraCondensed_Width), 179e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) FontStretchUltraCondensedMapsTokUltraCondensed_Width); 1809e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(FontStretchNormal) == static_cast<int>(SkFontStyle::kNormal_Width), 181e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) FontStretchNormalMapsTokNormal_Width); 1829e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(FontStretchUltraExpanded) == static_cast<int>(SkFontStyle::kUltaExpanded_Width), 183e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) FontStretchUltraExpandedMapsTokUltaExpanded_Width); 184e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#endif 185e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 186197021e6b966cfb06891637935ef33fff06433d1Ben MurdochPassRefPtr<SkTypeface> FontCache::createTypeface(const FontDescription& fontDescription, const FontFaceCreationParams& creationParams, CString& name) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 188197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if !OS(WIN) && !OS(ANDROID) 189197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (creationParams.creationType() == CreateFontByFciIdAndTtcIndex) { 190197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // TODO(dro): crbug.com/381620 Use creationParams.ttcIndex() after 191197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // https://code.google.com/p/skia/issues/detail?id=1186 gets fixed. 192197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch SkTypeface* typeface = nullptr; 193e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (Platform::current()->sandboxSupport()) 194197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch typeface = SkTypeface::CreateFromStream(streamForFontconfigInterfaceId(creationParams.fontconfigInterfaceId())); 195197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch else 196197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch typeface = SkTypeface::CreateFromFile(creationParams.filename().data()); 197197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 198197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (typeface) 199197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return adoptRef(typeface); 200e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) else 201e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return nullptr; 202197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 203197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif 204197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 205197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch AtomicString family = creationParams.family(); 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we're creating a fallback font (e.g. "-webkit-monospace"), convert the name into 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the fallback name (like "monospace") that fontconfig understands. 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!family.length() || family.startsWith("-webkit-")) { 209d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) name = getFallbackFontFamily(fontDescription).string().utf8(); 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // convert the name to utf8 21209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) name = family.utf8(); 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int style = SkTypeface::kNormal; 216197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (fontDescription.weight() >= FontWeight600) 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) style |= SkTypeface::kBold; 218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (fontDescription.style()) 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) style |= SkTypeface::kItalic; 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#if OS(WIN) 2226f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if (s_sideloadedFonts) { 2237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci HashMap<String, RefPtr<SkTypeface> >::iterator sideloadedFont = 224e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) s_sideloadedFonts->find(name.data()); 225e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (sideloadedFont != s_sideloadedFonts->end()) 2267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return sideloadedFont->value; 2276f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 228e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 229e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (m_fontManager) { 230e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return adoptRef(useDirectWrite() 231e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) ? m_fontManager->matchFamilyStyle(name.data(), fontStyle(fontDescription)) 232e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) : m_fontManager->legacyCreateTypeface(name.data(), style) 233e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) ); 234e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } 2358abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#endif 2368abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 237e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // FIXME: Use m_fontManager, SkFontStyle and matchFamilyStyle instead of 238e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // CreateFromName on all platforms. 239bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return adoptRef(SkTypeface::CreateFromName(name.data(), static_cast<SkTypeface::Style>(style))); 240e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)} 241e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 2428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if !OS(WIN) 243197021e6b966cfb06891637935ef33fff06433d1Ben MurdochFontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const FontFaceCreationParams& creationParams, float fontSize) 244e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 245e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) CString name; 246197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch RefPtr<SkTypeface> tf(createTypeface(fontDescription, creationParams, name)); 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!tf) 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 250e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) FontPlatformData* result = new FontPlatformData(tf, 251e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) name.data(), 2521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) fontSize, 253197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch (fontDescription.weight() >= FontWeight600 && !tf->isBold()) || fontDescription.isSyntheticBold(), 254d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) (fontDescription.style() && !tf->isItalic()) || fontDescription.isSyntheticItalic(), 25551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) fontDescription.orientation(), 25651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) fontDescription.useSubpixelPositioning()); 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 259d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#endif // !OS(WIN) 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 261c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 262