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