FontCacheAndroid.cpp revision 8e35f3cfc7fba1d1c829dc557ebad6409cbe16a2
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:
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontCache.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontPlatformData.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Font.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SimpleFontData.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkPaint.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkTypeface.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkUtils.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FontCache::platformInit()
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst SimpleFontData* FontCache::getFontDataForCharacters(const Font& font, const UChar* characters, int length)
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // since all of our fonts logically map to the fallback, we can always claim
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // that each font supports all characters.
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return font.primaryFont();
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFontPlatformData* FontCache::getSimilarFontPlatformData(const Font& font)
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFontPlatformData* FontCache::getLastResortFallbackFont(const FontDescription& font)
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static AtomicString str("sans-serif");
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getCachedFontPlatformData(font, str);
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic char* AtomicStringToUTF8String(const AtomicString& utf16)
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkASSERT(sizeof(uint16_t) == sizeof(utf16.characters()[0]));
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const uint16_t* uni = (uint16_t*)utf16.characters();
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    size_t bytes = SkUTF16_ToUTF8(uni, utf16.length(), NULL);
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    char*  utf8 = (char*)sk_malloc_throw(bytes + 1);
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    (void)SkUTF16_ToUTF8(uni, utf16.length(), utf8);
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    utf8[bytes] = 0;
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return utf8;
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family)
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    char*       storage = 0;
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const char* name = 0;
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (family.length() == 0) {
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const struct {
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription::GenericFamilyType  mType;
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            const char*                         mName;
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } gNames[] = {
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { FontDescription::SerifFamily,     "serif" },
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { FontDescription::SansSerifFamily, "sans-serif" },
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { FontDescription::MonospaceFamily, "monospace" },
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { FontDescription::CursiveFamily,   "cursive" },
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            { FontDescription::FantasyFamily,   "fantasy" }
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        };
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription::GenericFamilyType type = fontDescription.genericFamily();
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (unsigned i = 0; i < SK_ARRAY_COUNT(gNames); i++)
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (type == gNames[i].mType)
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                name = gNames[i].mName;
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // if we fall out of the loop, its ok for name to still be 0
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {    // convert the name to utf8
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        storage = AtomicStringToUTF8String(family);
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        name = storage;
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int style = SkTypeface::kNormal;
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (fontDescription.weight() >= FontWeightBold)
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style |= SkTypeface::kBold;
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (fontDescription.italic())
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style |= SkTypeface::kItalic;
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkTypeface* tf = SkTypeface::Create(name, (SkTypeface::Style)style);
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FontPlatformData* result = new FontPlatformData(tf,
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                    fontDescription.computedSize(),
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                    (style & SkTypeface::kBold) && !tf->isBold(),
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                    (style & SkTypeface::kItalic) && !tf->isItalic());
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    tf->unref();
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sk_free(storage);
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // new as of SVN change 36269, Sept 8, 2008
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FontCache::getTraitsInFamily(const AtomicString& familyName, Vector<unsigned>& traitsMasks)
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't understand this yet, but it seems safe to leave unimplemented
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
135