1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/*
2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2007 Apple Computer, Inc.
3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (c) 2007, 2008, 2009, Google Inc. All rights reserved.
4e14391e94c850b8bd03680c23b38978db68687a8John Reck * Copyright (C) 2010 Company 100, Inc.
5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without
7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions are
8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * met:
9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Redistributions of source code must retain the above copyright
11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer.
12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Redistributions in binary form must reproduce the above
13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * copyright notice, this list of conditions and the following disclaimer
14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * in the documentation and/or other materials provided with the
15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * distribution.
16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Neither the name of Google Inc. nor the names of its
17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * contributors may be used to endorse or promote products derived from
18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * this software without specific prior written permission.
19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "config.h"
34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FontCustomPlatformData.h"
35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
36d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINDOWS)
37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Base64.h"
38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "OpenTypeUtilities.h"
39ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "PlatformBridge.h"
40e14391e94c850b8bd03680c23b38978db68687a8John Reck#elif OS(LINUX) || OS(FREEBSD) || PLATFORM(BREWMP)
410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "SkStream.h"
42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FontPlatformData.h"
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "NotImplemented.h"
46643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "OpenTypeSanitizer.h"
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "SharedBuffer.h"
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
49d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINDOWS)
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <objbase.h>
51e14391e94c850b8bd03680c23b38978db68687a8John Reck#elif OS(LINUX) || OS(FREEBSD) || PLATFORM(BREWMP)
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <cstring>
53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore {
56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectFontCustomPlatformData::~FontCustomPlatformData()
58635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
59d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINDOWS)
60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_fontReference)
61643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        RemoveFontMemResourceEx(m_fontReference);
62e14391e94c850b8bd03680c23b38978db68687a8John Reck#elif OS(LINUX) || OS(FREEBSD) || PLATFORM(BREWMP)
630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_fontReference)
640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_fontReference->unref();
65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
682bde8e466a4451c7319e3a072d118917957d6554Steve BlockFontPlatformData FontCustomPlatformData::fontPlatformData(int size, bool bold, bool italic, FontOrientation orientation,
692bde8e466a4451c7319e3a072d118917957d6554Steve Block                                                          TextOrientation textOrientation, FontWidthVariant, FontRenderingMode mode)
70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
71d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINDOWS)
72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(m_fontReference);
73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    LOGFONT logFont;
75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // m_name comes from createUniqueFontName, which, in turn, gets
76643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // it from base64-encoded uuid (128-bit). So, m_name
77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // can never be longer than LF_FACESIZE (32).
78643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_name.length() + 1 >= LF_FACESIZE) {
79643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ASSERT_NOT_REACHED();
80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return FontPlatformData();
81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    memcpy(logFont.lfFaceName, m_name.charactersWithNullTermination(),
83643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           sizeof(logFont.lfFaceName[0]) * (1 + m_name.length()));
84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // FIXME: almost identical to FillLogFont in FontCacheWin.cpp.
86635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Need to refactor.
87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    logFont.lfHeight = -size;
88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    logFont.lfWidth = 0;
89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    logFont.lfEscapement = 0;
90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    logFont.lfOrientation = 0;
91635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    logFont.lfUnderline = false;
92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    logFont.lfStrikeOut = false;
93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    logFont.lfCharSet = DEFAULT_CHARSET;
94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    logFont.lfOutPrecision = OUT_TT_ONLY_PRECIS;
95ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    logFont.lfQuality = PlatformBridge::layoutTestMode() ?
96635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        NONANTIALIASED_QUALITY :
97635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        DEFAULT_QUALITY; // Honor user's desktop settings.
98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    logFont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    logFont.lfItalic = italic;
100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    logFont.lfWeight = bold ? 700 : 400;
101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    HFONT hfont = CreateFontIndirect(&logFont);
103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return FontPlatformData(hfont, size);
104e14391e94c850b8bd03680c23b38978db68687a8John Reck#elif OS(LINUX) || OS(FREEBSD) || PLATFORM(BREWMP)
1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(m_fontReference);
1062bde8e466a4451c7319e3a072d118917957d6554Steve Block    return FontPlatformData(m_fontReference, "", size, bold && !m_fontReference->isBold(), italic && !m_fontReference->isItalic(), orientation, textOrientation);
107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#else
108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    notImplemented();
109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return FontPlatformData();
110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
113d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINDOWS)
114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// Creates a unique and unpredictable font name, in order to avoid collisions and to
115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// not allow access from CSS.
116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic String createUniqueFontName()
117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
1182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    GUID fontUuid;
1192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CoCreateGuid(&fontUuid);
120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    String fontName = base64Encode(reinterpret_cast<char*>(&fontUuid), sizeof(fontUuid));
1222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(fontName.length() < LF_FACESIZE);
1232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return fontName;
124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
127e14391e94c850b8bd03680c23b38978db68687a8John Reck#if OS(LINUX) || OS(FREEBSD) || PLATFORM(BREWMP)
1280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochclass RemoteFontStream : public SkStream {
1290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochpublic:
1300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    explicit RemoteFontStream(PassRefPtr<SharedBuffer> buffer)
1310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        : m_buffer(buffer)
1320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        , m_offset(0)
1330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
1340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
1350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    virtual ~RemoteFontStream()
1370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
1380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
1390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    virtual bool rewind()
1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
1420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_offset = 0;
1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return true;
1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    virtual size_t read(void* buffer, size_t size)
1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!buffer && !size) {
1490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // This is request for the length of the stream.
1500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return m_buffer->size();
1510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
152cad810f21b803229eb11403f9209855525a25d57Steve Block        // This is a request to read bytes or skip bytes (when buffer is 0).
1530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!m_buffer->data() || !m_buffer->size())
1540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return 0;
1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        size_t left = m_buffer->size() - m_offset;
156cad810f21b803229eb11403f9209855525a25d57Steve Block        size_t bytesToConsume = std::min(left, size);
157cad810f21b803229eb11403f9209855525a25d57Steve Block        if (buffer)
158cad810f21b803229eb11403f9209855525a25d57Steve Block            std::memcpy(buffer, m_buffer->data() + m_offset, bytesToConsume);
159cad810f21b803229eb11403f9209855525a25d57Steve Block        m_offset += bytesToConsume;
160cad810f21b803229eb11403f9209855525a25d57Steve Block        return bytesToConsume;
1610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochprivate:
1640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<SharedBuffer> m_buffer;
1650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    size_t m_offset;
1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch};
1670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
169635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectFontCustomPlatformData* createFontCustomPlatformData(SharedBuffer* buffer)
170635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
171635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT_ARG(buffer, buffer);
172635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
173643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if ENABLE(OPENTYPE_SANITIZER)
174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    OpenTypeSanitizer sanitizer(buffer);
175643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RefPtr<SharedBuffer> transcodeBuffer = sanitizer.sanitize();
176643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!transcodeBuffer)
177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0; // validation failed.
178643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    buffer = transcodeBuffer.get();
179643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
180643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
181d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINDOWS)
182643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Introduce the font to GDI. AddFontMemResourceEx should be used with care, because it will pollute the process's
183635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // font namespace (Windows has no API for creating an HFONT from data without exposing the font to the
184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // entire process first).
185635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    String fontName = createUniqueFontName();
186643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    HANDLE fontReference = renameAndActivateFont(buffer, fontName);
187643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!fontReference)
188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return 0;
189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return new FontCustomPlatformData(fontReference, fontName);
190e14391e94c850b8bd03680c23b38978db68687a8John Reck#elif OS(LINUX) || OS(FREEBSD) || PLATFORM(BREWMP)
191d0825bca7fe65beaee391d30da42e937db621564Steve Block    RemoteFontStream* stream = new RemoteFontStream(buffer);
192d0825bca7fe65beaee391d30da42e937db621564Steve Block    SkTypeface* typeface = SkTypeface::CreateFromStream(stream);
1930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!typeface)
1940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return 0;
1950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return new FontCustomPlatformData(typeface);
196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#else
1970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    notImplemented();
198635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return 0;
199635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
200635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
201635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
202db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockbool FontCustomPlatformData::supportsFormat(const String& format)
203db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{
204db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    return equalIgnoringCase(format, "truetype") || equalIgnoringCase(format, "opentype")
205db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#if ENABLE(OPENTYPE_SANITIZER)
206db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        || equalIgnoringCase(format, "woff")
207db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#endif
208db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    ;
209db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block}
210db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
211635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
212