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