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 14 //#define TRACE_LIFECYCLE 15 16 #ifdef TRACE_LIFECYCLE 17 static int32_t gTypefaceCounter; 18 #endif 19 20 SkTypeface::SkTypeface(Style style, SkFontID fontID, bool isFixedWidth) 21 : fUniqueID(fontID), fStyle(style), fIsFixedWidth(isFixedWidth) { 22 #ifdef TRACE_LIFECYCLE 23 SkDebugf("SkTypeface: create %p fontID %d total %d\n", 24 this, fontID, ++gTypefaceCounter); 25 #endif 26 } 27 28 SkTypeface::~SkTypeface() { 29 #ifdef TRACE_LIFECYCLE 30 SkDebugf("SkTypeface: destroy %p fontID %d total %d\n", 31 this, fUniqueID, --gTypefaceCounter); 32 #endif 33 } 34 35 /////////////////////////////////////////////////////////////////////////////// 36 37 static SkTypeface* get_default_typeface() { 38 // we keep a reference to this guy for all time, since if we return its 39 // fontID, the font cache may later on ask to resolve that back into a 40 // typeface object. 41 static SkTypeface* gDefaultTypeface; 42 43 if (NULL == gDefaultTypeface) { 44 gDefaultTypeface = 45 SkFontHost::CreateTypeface(NULL, NULL, NULL, 0, 46 SkTypeface::kNormal); 47 } 48 return gDefaultTypeface; 49 } 50 51 uint32_t SkTypeface::UniqueID(const SkTypeface* face) { 52 if (NULL == face) { 53 face = get_default_typeface(); 54 } 55 return face->uniqueID(); 56 } 57 58 bool SkTypeface::Equal(const SkTypeface* facea, const SkTypeface* faceb) { 59 return SkTypeface::UniqueID(facea) == SkTypeface::UniqueID(faceb); 60 } 61 62 /////////////////////////////////////////////////////////////////////////////// 63 64 SkTypeface* SkTypeface::CreateFromName(const char name[], Style style) { 65 return SkFontHost::CreateTypeface(NULL, name, NULL, 0, style); 66 } 67 68 SkTypeface* SkTypeface::CreateForChars(const void* data, size_t bytelength, 69 Style s) { 70 return SkFontHost::CreateTypeface(NULL, NULL, data, bytelength, s); 71 } 72 73 SkTypeface* SkTypeface::CreateFromTypeface(const SkTypeface* family, Style s) { 74 return SkFontHost::CreateTypeface(family, NULL, NULL, 0, s); 75 } 76 77 SkTypeface* SkTypeface::CreateFromStream(SkStream* stream) { 78 return SkFontHost::CreateTypefaceFromStream(stream); 79 } 80 81 SkTypeface* SkTypeface::CreateFromFile(const char path[]) { 82 return SkFontHost::CreateTypefaceFromFile(path); 83 } 84 85 /////////////////////////////////////////////////////////////////////////////// 86 87 void SkTypeface::serialize(SkWStream* stream) const { 88 SkFontHost::Serialize(this, stream); 89 } 90 91 SkTypeface* SkTypeface::Deserialize(SkStream* stream) { 92 return SkFontHost::Deserialize(stream); 93 } 94 95 SkAdvancedTypefaceMetrics* SkTypeface::getAdvancedTypefaceMetrics( 96 SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo, 97 const uint32_t* glyphIDs, 98 uint32_t glyphIDsCount) const { 99 return SkFontHost::GetAdvancedTypefaceMetrics(fUniqueID, 100 perGlyphInfo, 101 glyphIDs, 102 glyphIDsCount); 103 } 104