FontCacheAndroid.cpp revision e03118fd5d9b776df29de3f96232ed6b5395c845
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright 2009, The Android Open Source Project
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
8e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block *  * Redistributions of source code must retain the above copyright
9e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block *    notice, this list of conditions and the following disclaimer.
10e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block *  * Redistributions in binary form must reproduce the above copyright
11e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block *    notice, this list of conditions and the following disclaimer in the
12e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block *    documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
14e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
15e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontCache.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontPlatformData.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Font.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SimpleFontData.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkPaint.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkTypeface.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkUtils.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FontCache::platformInit()
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst SimpleFontData* FontCache::getFontDataForCharacters(const Font& font, const UChar* characters, int length)
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // since all of our fonts logically map to the fallback, we can always claim
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // that each font supports all characters.
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return font.primaryFont();
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFontPlatformData* FontCache::getSimilarFontPlatformData(const Font& font)
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFontPlatformData* FontCache::getLastResortFallbackFont(const FontDescription& font)
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static AtomicString str("sans-serif");
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getCachedFontPlatformData(font, str);
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic char* AtomicStringToUTF8String(const AtomicString& utf16)
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkASSERT(sizeof(uint16_t) == sizeof(utf16.characters()[0]));
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const uint16_t* uni = (uint16_t*)utf16.characters();
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    size_t bytes = SkUTF16_ToUTF8(uni, utf16.length(), NULL);
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    char*  utf8 = (char*)sk_malloc_throw(bytes + 1);
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    (void)SkUTF16_ToUTF8(uni, utf16.length(), utf8);
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    utf8[bytes] = 0;
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return utf8;
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family)
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    char*       storage = 0;
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* name = 0;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (family.length() == 0) {
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const struct {
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription::GenericFamilyType  mType;
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            const char*                         mName;
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } gNames[] = {
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { FontDescription::SerifFamily,     "serif" },
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { FontDescription::SansSerifFamily, "sans-serif" },
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { FontDescription::MonospaceFamily, "monospace" },
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { FontDescription::CursiveFamily,   "cursive" },
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { FontDescription::FantasyFamily,   "fantasy" }
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        };
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription::GenericFamilyType type = fontDescription.genericFamily();
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (unsigned i = 0; i < SK_ARRAY_COUNT(gNames); i++)
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (type == gNames[i].mType)
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                name = gNames[i].mName;
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // if we fall out of the loop, its ok for name to still be 0
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {    // convert the name to utf8
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        storage = AtomicStringToUTF8String(family);
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        name = storage;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int style = SkTypeface::kNormal;
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (fontDescription.weight() >= FontWeightBold)
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style |= SkTypeface::kBold;
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (fontDescription.italic())
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style |= SkTypeface::kItalic;
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
113635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SkTypeface* tf = SkTypeface::CreateFromName(name, (SkTypeface::Style)style);
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FontPlatformData* result = new FontPlatformData(tf,
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                    fontDescription.computedSize(),
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                    (style & SkTypeface::kBold) && !tf->isBold(),
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                    (style & SkTypeface::kItalic) && !tf->isItalic());
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    tf->unref();
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sk_free(storage);
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // new as of SVN change 36269, Sept 8, 2008
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FontCache::getTraitsInFamily(const AtomicString& familyName, Vector<unsigned>& traitsMasks)
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't understand this yet, but it seems safe to leave unimplemented
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
131