1e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)/* 2e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * Copyright (C) 2006, 2007 Apple Computer, Inc. 3e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * Copyright (c) 2006, 2007, 2008, 2009, 2012 Google Inc. All rights reserved. 4e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * 5e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without 6e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * modification, are permitted provided that the following conditions are 7e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * met: 8e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * 9e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * * Redistributions of source code must retain the above copyright 10e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * notice, this list of conditions and the following disclaimer. 11e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * * Redistributions in binary form must reproduce the above 12e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 13e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * in the documentation and/or other materials provided with the 14e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * distribution. 15e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 16e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * contributors may be used to endorse or promote products derived from 17e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * this software without specific prior written permission. 18e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * 19e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) */ 31e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 32e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "config.h" 33a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/FontCache.h" 34e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 358abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "SkFontMgr.h" 368abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "SkTypeface_win.h" 375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h" 38a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/FontDescription.h" 39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "platform/fonts/FontFaceCreationParams.h" 407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/fonts/FontPlatformData.h" 41a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/SimpleFontData.h" 42a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/win/FontFallbackWin.h" 43e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 44c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 45e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciHashMap<String, RefPtr<SkTypeface> >* FontCache::s_sideloadedFonts = 0; 476f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 486f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch// static 496f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochvoid FontCache::addSideloadedFontForTesting(SkTypeface* typeface) 506f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{ 516f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if (!s_sideloadedFonts) 527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci s_sideloadedFonts = new HashMap<String, RefPtr<SkTypeface> >; 536f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch SkString name; 546f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch typeface->getFamilyName(&name); 557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci s_sideloadedFonts->set(name.c_str(), adoptRef(typeface)); 566f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch} 576f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)FontCache::FontCache() 598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) : m_purgePreventCount(0) 608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){ 6107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch SkFontMgr* fontManager; 621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 6307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (s_useDirectWrite) { 64aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch fontManager = SkFontMgr_New_DirectWrite(s_directWriteFactory); 6510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch s_useSubpixelPositioning = RuntimeEnabledFeatures::subpixelFontScalingEnabled(); 6607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } else { 671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) fontManager = SkFontMgr_New_GDI(); 6807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch // Subpixel text positioning is not supported by the GDI backend. 6907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch s_useSubpixelPositioning = false; 7007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 711e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 7207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch ASSERT(fontManager); 731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_fontManager = adoptPtr(fontManager); 748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)} 758abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 76e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 77e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)// Given the desired base font, this will create a SimpleFontData for a specific 78e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)// font that can be used to render the given range of characters. 792fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)PassRefPtr<SimpleFontData> FontCache::fallbackFontForCharacter( 802fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) const FontDescription& fontDescription, UChar32 character, 812fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) const SimpleFontData* originalFontData) 82e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 83197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // First try the specified font with standard style & weight. 84197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (fontDescription.style() == FontStyleItalic 85197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch || fontDescription.weight() >= FontWeightBold) { 86197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch RefPtr<SimpleFontData> fontData = fallbackOnStandardFontStyle( 87197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch fontDescription, character); 88197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (fontData) 89197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return fontData; 90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 92e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // FIXME: Consider passing fontDescription.dominantScript() 93e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // to GetFallbackFamily here. 94e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) UScriptCode script; 95f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) const wchar_t* family = getFallbackFamily(character, 96f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) fontDescription.genericFamily(), 976f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch &script, 986f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch m_fontManager.get()); 99e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) FontPlatformData* data = 0; 100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (family) { 101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch FontFaceCreationParams createByFamily(AtomicString(family, wcslen(family))); 102197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch data = getFontPlatformData(fontDescription, createByFamily); 103197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 104e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 105e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // Last resort font list : PanUnicode. CJK fonts have a pretty 106e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // large repertoire. Eventually, we need to scan all the fonts 107e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // on the system to have a Firefox-like coverage. 108e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // Make sure that all of them are lowercased. 109e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) const static wchar_t* const cjkFonts[] = { 110e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"arial unicode ms", 111e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"ms pgothic", 112e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"simsun", 113e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"gulim", 114e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"pmingliu", 115e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"wenquanyi zen hei", // Partial CJK Ext. A coverage but more widely known to Chinese users. 116e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"ar pl shanheisun uni", 117e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"ar pl zenkai uni", 118e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"han nom a", // Complete CJK Ext. A coverage. 119e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"code2000" // Complete CJK Ext. A coverage. 120e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // CJK Ext. B fonts are not listed here because it's of no use 121e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // with our current non-BMP character handling because we use 122e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // Uniscribe for it and that code path does not go through here. 123e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) }; 124e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 125e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) const static wchar_t* const commonFonts[] = { 126e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"tahoma", 127e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"arial unicode ms", 128e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"lucida sans unicode", 129e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"microsoft sans serif", 130e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"palatino linotype", 131e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // Six fonts below (and code2000 at the end) are not from MS, but 132e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // once installed, cover a very wide range of characters. 133e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"dejavu serif", 134e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"dejavu sasns", 135e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"freeserif", 136e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"freesans", 137e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"gentium", 138e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"gentiumalt", 139e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"ms pgothic", 140e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"simsun", 141e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"gulim", 142e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"pmingliu", 143e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) L"code2000" 144e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) }; 145e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 146e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) const wchar_t* const* panUniFonts = 0; 147e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) int numFonts = 0; 148e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (script == USCRIPT_HAN) { 149e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) panUniFonts = cjkFonts; 150e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) numFonts = WTF_ARRAY_LENGTH(cjkFonts); 151e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } else { 152e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) panUniFonts = commonFonts; 153e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) numFonts = WTF_ARRAY_LENGTH(commonFonts); 154e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 155f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) // Font returned from getFallbackFamily may not cover |character| 156e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // because it's based on script to font mapping. This problem is 157e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // critical enough for non-Latin scripts (especially Han) to 158e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // warrant an additional (real coverage) check with fontCotainsCharacter. 159e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) int i; 160197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch for (i = 0; (!data || !data->fontContainsCharacter(character)) && i < numFonts; ++i) { 161e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) family = panUniFonts[i]; 162197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch FontFaceCreationParams createByFamily(AtomicString(family, wcslen(family))); 163197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch data = getFontPlatformData(fontDescription, createByFamily); 164e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 16507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 1662fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) // For font fallback we want to match the subpixel behavior of the original 1672fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) // font. Mixing subpixel and non-subpixel in the same text run looks really 1682fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) // odd and causes problems with preferred width calculations. 1692fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) if (data && originalFontData) { 1702fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) const FontPlatformData& platformData = originalFontData->platformData(); 1712fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) data->setMinSizeForAntiAlias(platformData.minSizeForAntiAlias()); 1722fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) data->setMinSizeForSubpixel(platformData.minSizeForSubpixel()); 1732fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) } 1742fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles) 175e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // When i-th font (0-base) in |panUniFonts| contains a character and 176e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // we get out of the loop, |i| will be |i + 1|. That is, if only the 177e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // last font in the array covers the character, |i| will be numFonts. 178e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // So, we have to use '<=" rather than '<' to see if we found a font 179e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // covering the character. 180323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (i <= numFonts) 181a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return fontDataFromFontPlatformData(data, DoNotRetain); 182e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 184e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)} 185e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 18606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)static inline bool equalIgnoringCase(const AtomicString& a, const SkString& b) 18706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles){ 18806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) return equalIgnoringCase(a, AtomicString::fromUTF8(b.c_str())); 18906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)} 19006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 191e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)static bool typefacesMatchesFamily(const SkTypeface* tf, const AtomicString& family) 192e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 193e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) SkTypeface::LocalizedStrings* actualFamilies = tf->createFamilyNameIterator(); 194e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) bool matchesRequestedFamily = false; 195e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) SkTypeface::LocalizedString actualFamily; 196e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 197e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) while (actualFamilies->next(&actualFamily)) { 19806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (equalIgnoringCase(family, actualFamily.fString)) { 199e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) matchesRequestedFamily = true; 200e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) break; 201e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 202e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 203e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) actualFamilies->unref(); 204e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 20506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) // getFamilyName may return a name not returned by the createFamilyNameIterator. 20606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) // Specifically in cases where Windows substitutes the font based on the 20706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) // HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes registry entries. 20806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (!matchesRequestedFamily) { 20906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) SkString familyName; 21006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) tf->getFamilyName(&familyName); 21106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (equalIgnoringCase(family, familyName)) 21206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) matchesRequestedFamily = true; 21306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) } 21406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 215e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return matchesRequestedFamily; 216e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)} 217e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 2187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistatic bool typefacesHasWeightSuffix(const AtomicString& family, 2197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci AtomicString& adjustedName, FontWeight& variantWeight) 2207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 2217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci struct FamilyWeightSuffix { 2227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const wchar_t* suffix; 2237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci size_t length; 2247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FontWeight weight; 2257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci }; 2267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Mapping from suffix to weight from the DirectWrite documentation. 2277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // http://msdn.microsoft.com/en-us/library/windows/desktop/dd368082.aspx 2287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const static FamilyWeightSuffix variantForSuffix[] = { 2297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" thin", 5, FontWeight100 }, 2307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" extralight", 11, FontWeight200 }, 2317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" ultralight", 11, FontWeight200 }, 2327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" light", 6, FontWeight300 }, 2337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" medium", 7, FontWeight500 }, 2347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" demibold", 9, FontWeight600 }, 2357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" semibold", 9, FontWeight600 }, 2367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" extrabold", 10, FontWeight800 }, 2377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" ultrabold", 10, FontWeight800 }, 2387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" black", 6, FontWeight900 }, 2397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" heavy", 6, FontWeight900 } 2407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci }; 2417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci size_t numVariants = WTF_ARRAY_LENGTH(variantForSuffix); 2427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool caseSensitive = false; 2437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci for (size_t i = 0; i < numVariants; i++) { 2447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const FamilyWeightSuffix& entry = variantForSuffix[i]; 2457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (family.endsWith(entry.suffix, caseSensitive)) { 2467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci String familyName = family.string(); 2477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci familyName.truncate(family.length() - entry.length); 2487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci adjustedName = AtomicString(familyName); 2497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci variantWeight = entry.weight; 2507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return true; 2517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return false; 2557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 2567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistatic bool typefacesHasStretchSuffix(const AtomicString& family, 2587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci AtomicString& adjustedName, FontStretch& variantStretch) 2597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 2607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci struct FamilyStretchSuffix { 2617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const wchar_t* suffix; 2627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci size_t length; 2637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FontStretch stretch; 2647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci }; 2657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Mapping from suffix to stretch value from the DirectWrite documentation. 2667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // http://msdn.microsoft.com/en-us/library/windows/desktop/dd368078.aspx 2677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Also includes Narrow as a synonym for Condensed to to support Arial 2687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Narrow and other fonts following the same naming scheme. 2697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const static FamilyStretchSuffix variantForSuffix[] = { 2707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" ultracondensed", 15, FontStretchUltraCondensed }, 2717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" extracondensed", 15, FontStretchExtraCondensed }, 2727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" condensed", 10, FontStretchCondensed }, 2737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" narrow", 7, FontStretchCondensed }, 2747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" semicondensed", 14, FontStretchSemiCondensed }, 2757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" semiexpanded", 13, FontStretchSemiExpanded }, 2767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" expanded", 9, FontStretchExpanded }, 2777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" extraexpanded", 14, FontStretchExtraExpanded }, 2787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { L" ultraexpanded", 14, FontStretchUltraExpanded } 2797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci }; 2807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci size_t numVariants = WTF_ARRAY_LENGTH(variantForSuffix); 2817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool caseSensitive = false; 2827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci for (size_t i = 0; i < numVariants; i++) { 2837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const FamilyStretchSuffix& entry = variantForSuffix[i]; 2847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (family.endsWith(entry.suffix, caseSensitive)) { 2857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci String familyName = family.string(); 2867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci familyName.truncate(family.length() - entry.length); 2877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci adjustedName = AtomicString(familyName); 2887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci variantStretch = entry.stretch; 2897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return true; 2907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return false; 2947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 2957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 296197021e6b966cfb06891637935ef33fff06433d1Ben MurdochFontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const FontFaceCreationParams& creationParams, float fontSize) 297e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 298197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ASSERT(creationParams.creationType() == CreateFontByFamily); 2997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 300e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) CString name; 301197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch RefPtr<SkTypeface> tf = createTypeface(fontDescription, creationParams, name); 302e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // Windows will always give us a valid pointer here, even if the face name 303e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // is non-existent. We have to double-check and see if the family name was 304e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // really used. 3057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!tf || !typefacesMatchesFamily(tf.get(), creationParams.family())) { 3067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci AtomicString adjustedName; 3077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FontWeight variantWeight; 3087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FontStretch variantStretch; 3097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (typefacesHasWeightSuffix(creationParams.family(), adjustedName, 3117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci variantWeight)) { 3127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FontFaceCreationParams adjustedParams(adjustedName); 3137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FontDescription adjustedFontDescription = fontDescription; 3147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci adjustedFontDescription.setWeight(variantWeight); 3157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci tf = createTypeface(adjustedFontDescription, adjustedParams, name); 3167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!tf || !typefacesMatchesFamily(tf.get(), adjustedName)) 3177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return 0; 3187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else if (typefacesHasStretchSuffix(creationParams.family(), 3207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci adjustedName, variantStretch)) { 3217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FontFaceCreationParams adjustedParams(adjustedName); 3227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci FontDescription adjustedFontDescription = fontDescription; 3237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci adjustedFontDescription.setStretch(variantStretch); 3247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci tf = createTypeface(adjustedFontDescription, adjustedParams, name); 3257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!tf || !typefacesMatchesFamily(tf.get(), adjustedName)) 3267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return 0; 3277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else { 3297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return 0; 3307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 331e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 332e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 333e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) FontPlatformData* result = new FontPlatformData(tf, 334e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) name.data(), 3351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) fontSize, 336197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch fontDescription.weight() >= FontWeight600 && !tf->isBold() || fontDescription.isSyntheticBold(), 337d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) fontDescription.style() == FontStyleItalic && !tf->isItalic() || fontDescription.isSyntheticItalic(), 338a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) fontDescription.orientation(), 33907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch s_useSubpixelPositioning); 34007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 3415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) struct FamilyMinSize { 3425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) const wchar_t* family; 3435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) unsigned minSize; 3445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) }; 3455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) const static FamilyMinSize minAntiAliasSizeForFont[] = { 346197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch { L"simsun", 11 }, 34776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) { L"dotum", 12 }, 348197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch { L"gulim", 12 }, 349197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch { L"pmingliu", 11 } 3505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) }; 3515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) size_t numFonts = WTF_ARRAY_LENGTH(minAntiAliasSizeForFont); 3525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) for (size_t i = 0; i < numFonts; i++) { 3535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) FamilyMinSize entry = minAntiAliasSizeForFont[i]; 3545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (typefacesMatchesFamily(tf.get(), entry.family)) { 3555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) result->setMinSizeForAntiAlias(entry.minSize); 3565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) break; 3575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 3585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 3595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 3607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // List of fonts that look bad with subpixel text rendering at smaller font 3617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // sizes. This includes all fonts in the Microsoft Core fonts for the Web 3627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // collection. 3637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const static wchar_t* noSubpixelForSmallSizeFont[] = { 3647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci L"andale mono", 3657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci L"arial", 3667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci L"comic sans", 3677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci L"courier new", 3687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci L"georgia", 3697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci L"impact", 3707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci L"lucida console", 3717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci L"tahoma", 3727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci L"times new roman", 3737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci L"trebuchet ms", 3747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci L"verdana", 3757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci L"webdings" 3767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci }; 3777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const static float minSizeForSubpixelForFont = 16.0f; 3787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci numFonts = WTF_ARRAY_LENGTH(noSubpixelForSmallSizeFont); 3797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci for (size_t i = 0; i < numFonts; i++) { 3807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const wchar_t* family = noSubpixelForSmallSizeFont[i]; 3817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (typefacesMatchesFamily(tf.get(), family)) { 3827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci result->setMinSizeForSubpixel(minSizeForSubpixelForFont); 3837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 3847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 3857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 3867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 387e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return result; 388e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)} 389e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 390e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)} // namespace blink 391