15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
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:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
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.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
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"
3251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "public/platform/linux/WebFontInfo.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/linux/WebFontFamily.h"
3551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "public/platform/linux/WebFontRenderStyle.h"
36f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#include <fontconfig/fontconfig.h>
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <string.h>
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <unicode/utf16.h>
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool useSubpixelPositioning = false;
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebFontInfo::setSubpixelPositioning(bool subpixelPositioning)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    useSubpixelPositioning = subpixelPositioning;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
498abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void WebFontInfo::familyForChar(WebUChar32 c, const char* preferredLocale, WebFontFamily* family)
508abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
518abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FcCharSet* cset = FcCharSetCreate();
528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FcCharSetAddChar(cset, c);
538abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FcPattern* pattern = FcPatternCreate();
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FcValue fcvalue;
568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    fcvalue.type = FcTypeCharSet;
578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    fcvalue.u.c = cset;
588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FcPatternAdd(pattern, FC_CHARSET, fcvalue, FcFalse);
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    fcvalue.type = FcTypeBool;
618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    fcvalue.u.b = FcTrue;
628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FcPatternAdd(pattern, FC_SCALABLE, fcvalue, FcFalse);
638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
648abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (preferredLocale) {
658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        FcLangSet* langset = FcLangSetCreate();
668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        FcLangSetAdd(langset, reinterpret_cast<const FcChar8 *>(preferredLocale));
678abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        FcPatternAddLangSet(pattern, FC_LANG, langset);
688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        FcLangSetDestroy(langset);
69f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    }
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FcConfigSubstitute(0, pattern, FcMatchPattern);
728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FcDefaultSubstitute(pattern);
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FcResult result;
758abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FcFontSet* fontSet = FcFontSort(0, pattern, 0, 0, &result);
768abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FcPatternDestroy(pattern);
778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FcCharSetDestroy(cset);
78f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
798abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!fontSet) {
808abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        family->name = WebCString();
818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        family->isBold = false;
828abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        family->isItalic = false;
838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return;
84f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    }
858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    // Older versions of fontconfig have a bug where they cannot select
868abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    // only scalable fonts so we have to manually filter the results.
878abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    for (int i = 0; i < fontSet->nfont; ++i) {
888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        FcPattern* current = fontSet->fonts[i];
898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        FcBool isScalable;
90f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (FcPatternGetBool(current, FC_SCALABLE, 0, &isScalable) != FcResultMatch
928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            || !isScalable)
938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            continue;
94f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
958abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        // fontconfig can also return fonts which are unreadable
968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        FcChar8* cFilename;
978abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (FcPatternGetString(current, FC_FILE, 0, &cFilename) != FcResultMatch)
988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            continue;
9923e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
1008abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (access(reinterpret_cast<char*>(cFilename), R_OK))
1018abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            continue;
102f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
1038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        FcChar8* familyName;
1048abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (FcPatternGetString(current, FC_FAMILY, 0, &familyName) == FcResultMatch) {
1058abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            const char* charFamily = reinterpret_cast<char*>(familyName);
1068abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            family->name = WebCString(charFamily, strlen(charFamily));
107f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        }
1088abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        int weight;
1098abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (FcPatternGetInteger(current, FC_WEIGHT, 0, &weight) == FcResultMatch)
1108abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            family->isBold = weight >= FC_WEIGHT_BOLD;
1118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        else
1128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            family->isBold = false;
1138abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        int slant;
1148abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (FcPatternGetInteger(current, FC_SLANT, 0, &slant) == FcResultMatch)
1158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            family->isItalic = slant != FC_SLANT_ROMAN;
1168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        else
1178abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            family->isItalic = false;
1188abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        FcFontSetDestroy(fontSet);
1198abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return;
120f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    }
121f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
1228abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FcFontSetDestroy(fontSet);
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebFontInfo::renderStyleForStrike(const char* family, int sizeAndStyle, WebFontRenderStyle* out)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isBold = sizeAndStyle & 1;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isItalic = sizeAndStyle & 2;
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int pixelSize = sizeAndStyle >> 2;
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FcPattern* pattern = FcPatternCreate();
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FcValue fcvalue;
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fcvalue.type = FcTypeString;
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fcvalue.u.s = reinterpret_cast<const FcChar8 *>(family);
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FcPatternAdd(pattern, FC_FAMILY, fcvalue, FcFalse);
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fcvalue.type = FcTypeInteger;
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fcvalue.u.i = isBold ? FC_WEIGHT_BOLD : FC_WEIGHT_NORMAL;
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FcPatternAdd(pattern, FC_WEIGHT, fcvalue, FcFalse);
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fcvalue.type = FcTypeInteger;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fcvalue.u.i = isItalic ? FC_SLANT_ITALIC : FC_SLANT_ROMAN;
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FcPatternAdd(pattern, FC_SLANT, fcvalue, FcFalse);
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fcvalue.type = FcTypeBool;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fcvalue.u.b = FcTrue;
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FcPatternAdd(pattern, FC_SCALABLE, fcvalue, FcFalse);
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fcvalue.type = FcTypeDouble;
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fcvalue.u.d = pixelSize;
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FcPatternAdd(pattern, FC_SIZE, fcvalue, FcFalse);
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FcConfigSubstitute(0, pattern, FcMatchPattern);
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FcDefaultSubstitute(pattern);
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FcResult result;
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Some versions of fontconfig don't actually write a value into result.
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // However, it's not clear from the documentation if result should be a
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // non-0 pointer: future versions might expect to be able to write to
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // it. So we pass in a valid pointer and ignore it.
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FcPattern* match = FcFontMatch(0, pattern, &result);
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FcPatternDestroy(pattern);
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    out->setDefaults();
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!match)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FcBool b;
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int i;
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FcPatternGetBool(match, FC_ANTIALIAS, 0, &b) == FcResultMatch)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        out->useAntiAlias = b;
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FcPatternGetBool(match, FC_EMBEDDED_BITMAP, 0, &b) == FcResultMatch)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        out->useBitmaps = b;
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FcPatternGetBool(match, FC_AUTOHINT, 0, &b) == FcResultMatch)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        out->useAutoHint = b;
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FcPatternGetBool(match, FC_HINTING, 0, &b) == FcResultMatch)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        out->useHinting = b;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FcPatternGetInteger(match, FC_HINT_STYLE, 0, &i) == FcResultMatch)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        out->hintStyle = i;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FcPatternGetInteger(match, FC_RGBA, 0, &i) == FcResultMatch) {
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch (i) {
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case FC_RGBA_NONE:
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            out->useSubpixelRendering = 0;
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case FC_RGBA_RGB:
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case FC_RGBA_BGR:
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case FC_RGBA_VRGB:
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case FC_RGBA_VBGR:
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            out->useSubpixelRendering = 1;
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // This includes FC_RGBA_UNKNOWN.
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            out->useSubpixelRendering = 2;
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FontConfig doesn't provide parameters to configure whether subpixel
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // positioning should be used or not, so we just use a global setting.
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    out->useSubpixelPositioning = useSubpixelPositioning;
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FcPatternDestroy(match);
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
209