blob: 3a40e0130b48edcc512e17025b0c1db6302e3c91 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
vandebo@chromium.org2a22e102011-01-25 21:01:34 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2011 The Android Open Source Project
vandebo@chromium.org2a22e102011-01-25 21:01:34 +00004 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00005 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
vandebo@chromium.org2a22e102011-01-25 21:01:34 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
vandebo@chromium.org325cb9a2011-03-30 18:36:29 +000010#include "SkAdvancedTypefaceMetrics.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000011#include "SkTypeface.h"
12#include "SkFontHost.h"
13
reed@google.comfcb57b52012-06-26 17:55:30 +000014SK_DEFINE_INST_COUNT(SkTypeface)
15
reed@google.come4959052011-05-02 17:35:04 +000016//#define TRACE_LIFECYCLE
reed@google.com2f3dc9d2011-05-02 17:33:45 +000017
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
reed@google.com538f7842011-12-16 17:56:23 +000039static SkTypeface* get_default_typeface() {
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 =
reed@google.com0389d932012-05-07 21:06:55 +000047 SkFontHost::CreateTypeface(NULL, NULL, SkTypeface::kNormal);
reed@google.com538f7842011-12-16 17:56:23 +000048 }
49 return gDefaultTypeface;
50}
51
reed@android.comef772dd2009-03-03 21:20:49 +000052uint32_t SkTypeface::UniqueID(const SkTypeface* face) {
reed@google.com538f7842011-12-16 17:56:23 +000053 if (NULL == face) {
54 face = get_default_typeface();
reed@android.comb1d9d2e2009-03-04 17:37:51 +000055 }
reed@google.com538f7842011-12-16 17:56:23 +000056 return face->uniqueID();
reed@android.com8a1c16f2008-12-17 15:59:43 +000057}
58
reed@android.comef772dd2009-03-03 21:20:49 +000059bool SkTypeface::Equal(const SkTypeface* facea, const SkTypeface* faceb) {
reed@android.comb1d9d2e2009-03-04 17:37:51 +000060 return SkTypeface::UniqueID(facea) == SkTypeface::UniqueID(faceb);
reed@android.com8a1c16f2008-12-17 15:59:43 +000061}
62
63///////////////////////////////////////////////////////////////////////////////
64
reed@android.com069b8272009-03-04 15:31:48 +000065SkTypeface* SkTypeface::CreateFromName(const char name[], Style style) {
reed@google.com0389d932012-05-07 21:06:55 +000066 return SkFontHost::CreateTypeface(NULL, name, style);
reed@android.com8a1c16f2008-12-17 15:59:43 +000067}
68
reed@android.comef772dd2009-03-03 21:20:49 +000069SkTypeface* SkTypeface::CreateFromTypeface(const SkTypeface* family, Style s) {
reed@google.com0389d932012-05-07 21:06:55 +000070 return SkFontHost::CreateTypeface(family, NULL, s);
reed@android.com8a1c16f2008-12-17 15:59:43 +000071}
72
reed@android.comef772dd2009-03-03 21:20:49 +000073SkTypeface* SkTypeface::CreateFromStream(SkStream* stream) {
reed@android.comb1d9d2e2009-03-04 17:37:51 +000074 return SkFontHost::CreateTypefaceFromStream(stream);
reed@android.com8a1c16f2008-12-17 15:59:43 +000075}
76
reed@android.comef772dd2009-03-03 21:20:49 +000077SkTypeface* SkTypeface::CreateFromFile(const char path[]) {
reed@android.com03ca3d12008-12-22 15:35:46 +000078 return SkFontHost::CreateTypefaceFromFile(path);
reed@android.com8a1c16f2008-12-17 15:59:43 +000079}
80
81///////////////////////////////////////////////////////////////////////////////
82
83void SkTypeface::serialize(SkWStream* stream) const {
84 SkFontHost::Serialize(this, stream);
85}
86
87SkTypeface* SkTypeface::Deserialize(SkStream* stream) {
reed@android.com62533ed2009-03-06 15:57:26 +000088 return SkFontHost::Deserialize(stream);
reed@android.com8a1c16f2008-12-17 15:59:43 +000089}
90
vandebo@chromium.orgc48b2b32011-02-02 02:11:22 +000091SkAdvancedTypefaceMetrics* SkTypeface::getAdvancedTypefaceMetrics(
vandebo@chromium.org37ad8fb2011-08-18 02:38:50 +000092 SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo,
93 const uint32_t* glyphIDs,
94 uint32_t glyphIDsCount) const {
95 return SkFontHost::GetAdvancedTypefaceMetrics(fUniqueID,
96 perGlyphInfo,
97 glyphIDs,
98 glyphIDsCount);
vandebo@chromium.org2a22e102011-01-25 21:01:34 +000099}
reed@google.comf11508d2012-04-17 18:01:31 +0000100
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
reed@google.com4b2af9c2012-07-31 17:24:44 +0000120int 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