11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 The Android Open Source Project
440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger */
840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "SkAdvancedTypefaceMetrics.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTypeface.h"
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkFontHost.h"
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger//#define TRACE_LIFECYCLE
1535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
1635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#ifdef TRACE_LIFECYCLE
1735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    static int32_t gTypefaceCounter;
1835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#endif
1935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
2035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerSkTypeface::SkTypeface(Style style, SkFontID fontID, bool isFixedWidth)
2135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    : fUniqueID(fontID), fStyle(style), fIsFixedWidth(isFixedWidth) {
2235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#ifdef TRACE_LIFECYCLE
2335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    SkDebugf("SkTypeface: create  %p fontID %d total %d\n",
2435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger             this, fontID, ++gTypefaceCounter);
2535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#endif
2635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger}
2735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
2835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerSkTypeface::~SkTypeface() {
2935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#ifdef TRACE_LIFECYCLE
3035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    SkDebugf("SkTypeface: destroy %p fontID %d total %d\n",
3135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger             this, fUniqueID, --gTypefaceCounter);
3235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#endif
3335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger}
3435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
3535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger///////////////////////////////////////////////////////////////////////////////
3635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkTypeface* get_default_typeface() {
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // we keep a reference to this guy for all time, since if we return its
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // fontID, the font cache may later on ask to resolve that back into a
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // typeface object.
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static SkTypeface* gDefaultTypeface;
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (NULL == gDefaultTypeface) {
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        gDefaultTypeface =
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkFontHost::CreateTypeface(NULL, NULL, NULL, 0,
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                   SkTypeface::kNormal);
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return gDefaultTypeface;
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergeruint32_t SkTypeface::UniqueID(const SkTypeface* face) {
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (NULL == face) {
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        face = get_default_typeface();
543298d565d8a70b84f28b455f6289293883c85494The Android Open Source Project    }
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return face->uniqueID();
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
583298d565d8a70b84f28b455f6289293883c85494The Android Open Source Projectbool SkTypeface::Equal(const SkTypeface* facea, const SkTypeface* faceb) {
593298d565d8a70b84f28b455f6289293883c85494The Android Open Source Project    return SkTypeface::UniqueID(facea) == SkTypeface::UniqueID(faceb);
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
643298d565d8a70b84f28b455f6289293883c85494The Android Open Source ProjectSkTypeface* SkTypeface::CreateFromName(const char name[], Style style) {
6540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    return SkFontHost::CreateTypeface(NULL, name, NULL, 0, style);
6640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger}
6740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
6840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek SollenbergerSkTypeface* SkTypeface::CreateForChars(const void* data, size_t bytelength,
6940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                                       Style s) {
7040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    return SkFontHost::CreateTypeface(NULL, NULL, data, bytelength, s);
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
733298d565d8a70b84f28b455f6289293883c85494The Android Open Source ProjectSkTypeface* SkTypeface::CreateFromTypeface(const SkTypeface* family, Style s) {
7440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    return SkFontHost::CreateTypeface(family, NULL, NULL, 0, s);
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
773298d565d8a70b84f28b455f6289293883c85494The Android Open Source ProjectSkTypeface* SkTypeface::CreateFromStream(SkStream* stream) {
783298d565d8a70b84f28b455f6289293883c85494The Android Open Source Project    return SkFontHost::CreateTypefaceFromStream(stream);
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
813298d565d8a70b84f28b455f6289293883c85494The Android Open Source ProjectSkTypeface* SkTypeface::CreateFromFile(const char path[]) {
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return SkFontHost::CreateTypefaceFromFile(path);
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkTypeface::serialize(SkWStream* stream) const {
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFontHost::Serialize(this, stream);
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkTypeface* SkTypeface::Deserialize(SkStream* stream) {
924b86a58dcecc030f2220cb91f4744f8099e7dfe6The Android Open Source Project    return SkFontHost::Deserialize(stream);
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
9540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek SollenbergerSkAdvancedTypefaceMetrics* SkTypeface::getAdvancedTypefaceMetrics(
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo,
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const uint32_t* glyphIDs,
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        uint32_t glyphIDsCount) const {
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return SkFontHost::GetAdvancedTypefaceMetrics(fUniqueID,
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                  perGlyphInfo,
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                  glyphIDs,
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                  glyphIDsCount);
10340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger}
104