SkTypeface.cpp revision cb1bbb375aa4fdd099dc60302ca1712f04607782
1 2/* 3 * Copyright 2011 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10#include "SkAdvancedTypefaceMetrics.h" 11#include "SkTypeface.h" 12#include "SkFontHost.h" 13 14SK_DEFINE_INST_COUNT(SkTypeface) 15 16//#define TRACE_LIFECYCLE 17 18#ifdef TRACE_LIFECYCLE 19 static int32_t gTypefaceCounter; 20#endif 21 22SkTypeface::SkTypeface(Style style, SkFontID fontID, bool isFixedWidth) 23 : fUniqueID(fontID), fStyle(style), fIsFixedWidth(isFixedWidth) { 24#ifdef TRACE_LIFECYCLE 25 SkDebugf("SkTypeface: create %p fontID %d total %d\n", 26 this, fontID, ++gTypefaceCounter); 27#endif 28} 29 30SkTypeface::~SkTypeface() { 31#ifdef TRACE_LIFECYCLE 32 SkDebugf("SkTypeface: destroy %p fontID %d total %d\n", 33 this, fUniqueID, --gTypefaceCounter); 34#endif 35} 36 37/////////////////////////////////////////////////////////////////////////////// 38 39SkTypeface* SkTypeface::GetDefaultTypeface() { 40 // we keep a reference to this guy for all time, since if we return its 41 // fontID, the font cache may later on ask to resolve that back into a 42 // typeface object. 43 static SkTypeface* gDefaultTypeface; 44 45 if (NULL == gDefaultTypeface) { 46 gDefaultTypeface = 47 SkFontHost::CreateTypeface(NULL, NULL, SkTypeface::kNormal); 48 } 49 return gDefaultTypeface; 50} 51 52uint32_t SkTypeface::UniqueID(const SkTypeface* face) { 53 if (NULL == face) { 54 face = GetDefaultTypeface(); 55 } 56 return face->uniqueID(); 57} 58 59bool SkTypeface::Equal(const SkTypeface* facea, const SkTypeface* faceb) { 60 return SkTypeface::UniqueID(facea) == SkTypeface::UniqueID(faceb); 61} 62 63/////////////////////////////////////////////////////////////////////////////// 64 65SkTypeface* SkTypeface::CreateFromName(const char name[], Style style) { 66 return SkFontHost::CreateTypeface(NULL, name, style); 67} 68 69SkTypeface* SkTypeface::CreateFromTypeface(const SkTypeface* family, Style s) { 70 return SkFontHost::CreateTypeface(family, NULL, s); 71} 72 73SkTypeface* SkTypeface::CreateFromStream(SkStream* stream) { 74 return SkFontHost::CreateTypefaceFromStream(stream); 75} 76 77SkTypeface* SkTypeface::CreateFromFile(const char path[]) { 78 return SkFontHost::CreateTypefaceFromFile(path); 79} 80 81/////////////////////////////////////////////////////////////////////////////// 82 83void SkTypeface::serialize(SkWStream* stream) const { 84 SkFontHost::Serialize(this, stream); 85} 86 87SkTypeface* SkTypeface::Deserialize(SkStream* stream) { 88 return SkFontHost::Deserialize(stream); 89} 90 91SkAdvancedTypefaceMetrics* SkTypeface::getAdvancedTypefaceMetrics( 92 SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo, 93 const uint32_t* glyphIDs, 94 uint32_t glyphIDsCount) const { 95 return SkFontHost::GetAdvancedTypefaceMetrics(fUniqueID, 96 perGlyphInfo, 97 glyphIDs, 98 glyphIDsCount); 99} 100 101/////////////////////////////////////////////////////////////////////////////// 102 103int SkTypeface::countTables() const { 104 return SkFontHost::CountTables(fUniqueID); 105} 106 107int SkTypeface::getTableTags(SkFontTableTag tags[]) const { 108 return SkFontHost::GetTableTags(fUniqueID, tags); 109} 110 111size_t SkTypeface::getTableSize(SkFontTableTag tag) const { 112 return SkFontHost::GetTableSize(fUniqueID, tag); 113} 114 115size_t SkTypeface::getTableData(SkFontTableTag tag, size_t offset, size_t length, 116 void* data) const { 117 return SkFontHost::GetTableData(fUniqueID, tag, offset, length, data); 118} 119 120int SkTypeface::getUnitsPerEm() const { 121 int upem = 0; 122 123#ifdef SK_BUILD_FOR_ANDROID 124 upem = SkFontHost::GetUnitsPerEm(fUniqueID); 125#else 126 SkAdvancedTypefaceMetrics* metrics; 127 metrics = SkFontHost::GetAdvancedTypefaceMetrics(fUniqueID, 128 SkAdvancedTypefaceMetrics::kNo_PerGlyphInfo, 129 NULL, 0); 130 if (metrics) { 131 upem = metrics->fEmSize; 132 metrics->unref(); 133 } 134#endif 135 return upem; 136} 137 138