18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontCache.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Font.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontPlatformData.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SimpleFontData.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FontCache::platformInit()
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst SimpleFontData* FontCache::getFontDataForCharacters(const Font& font, const UChar* characters, int length)
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SimpleFontData* fontData = 0;
4521939df44de1705786c545cd1bf519d47250322dBen Murdoch    fontData = getCachedFontData(font.fontDescription(), font.family().family());
4621939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!fontData->containsCharacters(characters, length))
4721939df44de1705786c545cd1bf519d47250322dBen Murdoch        fontData = getSimilarFontPlatformData(font);
4821939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!fontData->containsCharacters(characters, length))
4921939df44de1705786c545cd1bf519d47250322dBen Murdoch        fontData = getLastResortFallbackFont(font.fontDescription());
5021939df44de1705786c545cd1bf519d47250322dBen Murdoch
51e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    ASSERT(fontData);
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return fontData;
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockSimpleFontData* FontCache::getSimilarFontPlatformData(const Font& font)
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
57e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    SimpleFontData* simpleFontData = 0;
58e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#if OS(DARWIN)
59e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // Attempt to find an appropriate font using a match based on
60e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // the presence of keywords in the the requested names.  For example, we'll
61e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // match any name that contains "Arabic" to Geeza Pro.
62e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    const FontFamily* currFamily = &font.fontDescription().family();
63e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    while (currFamily && !simpleFontData) {
64e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        if (currFamily->family().length()) {
65e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            static String* matchWords[3] = { new String("Arabic"), new String("Pashto"), new String("Urdu") };
66e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            DEFINE_STATIC_LOCAL(AtomicString, geezaStr, ("Geeza Pro"));
67e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            for (int j = 0; j < 3 && !simpleFontData; ++j)
68e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                if (currFamily->family().contains(*matchWords[j], false))
69e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                    simpleFontData = getCachedFontData(font.fontDescription(), geezaStr);
70e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
71e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        currFamily = currFamily->next();
72e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
73e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#endif
74e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (!simpleFontData)
75e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        simpleFontData = getCachedFontData(font.fontDescription(), font.family().family());
76e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
77e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    return simpleFontData;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockSimpleFontData* FontCache::getLastResortFallbackFont(const FontDescription& fontDescription)
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Would be even better to somehow get the user's default font here.  For now we'll pick
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the default that the user would get without changing any prefs.
8421939df44de1705786c545cd1bf519d47250322dBen Murdoch    SimpleFontData* fallback = 0;
85e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#if OS(WINDOWS)
8621939df44de1705786c545cd1bf519d47250322dBen Murdoch    static AtomicString fallbackName("Arial Unicode MS");
8721939df44de1705786c545cd1bf519d47250322dBen Murdoch#else
8821939df44de1705786c545cd1bf519d47250322dBen Murdoch    static AtomicString fallbackName("Times New Roman");
8921939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif
9021939df44de1705786c545cd1bf519d47250322dBen Murdoch    fallback = getCachedFontData(fontDescription, fallbackName);
91e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    ASSERT(fallback);
9221939df44de1705786c545cd1bf519d47250322dBen Murdoch
9321939df44de1705786c545cd1bf519d47250322dBen Murdoch    return fallback;
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family)
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return new FontPlatformData(fontDescription,family);
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FontCache::getTraitsInFamily(const AtomicString& familyName, Vector<unsigned>& traitsMasks)
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
107