OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2008 Google Inc. | 2 * Copyright 2008 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkFontConfigInterface.h" | 8 #include "SkFontConfigInterface.h" |
9 #include "SkFontConfigTypeface.h" | 9 #include "SkFontConfigTypeface.h" |
10 #include "SkFontDescriptor.h" | 10 #include "SkFontDescriptor.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
65 SkTypeface::Style fStyle; | 65 SkTypeface::Style fStyle; |
66 }; | 66 }; |
67 | 67 |
68 static bool find_proc(SkTypeface* face, SkTypeface::Style style, void* ctx) { | 68 static bool find_proc(SkTypeface* face, SkTypeface::Style style, void* ctx) { |
69 FontConfigTypeface* fci = (FontConfigTypeface*)face; | 69 FontConfigTypeface* fci = (FontConfigTypeface*)face; |
70 const FindRec* rec = (const FindRec*)ctx; | 70 const FindRec* rec = (const FindRec*)ctx; |
71 | 71 |
72 return rec->fStyle == style && fci->isFamilyName(rec->fFamilyName); | 72 return rec->fStyle == style && fci->isFamilyName(rec->fFamilyName); |
73 } | 73 } |
74 | 74 |
75 static bool find_proc_by_id(SkTypeface* face, SkTypeface::Style style, void* ctx ) { | |
76 const uint32_t* fontID = (const uint32_t*)ctx; | |
77 uint32_t currFontID = ((FontConfigTypeface*)face)->getIdentity().fID; | |
78 return currFontID == *fontID; | |
79 } | |
80 | |
75 SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace, | 81 SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace, |
76 const char familyName[], | 82 const char familyName[], |
77 SkTypeface::Style style) { | 83 SkTypeface::Style style) { |
78 SkAutoTUnref<SkFontConfigInterface> fci(RefFCI()); | 84 SkAutoTUnref<SkFontConfigInterface> fci(RefFCI()); |
79 if (NULL == fci.get()) { | 85 if (NULL == fci.get()) { |
80 return NULL; | 86 return NULL; |
81 } | 87 } |
82 | 88 |
83 if (familyFace) { | 89 if (familyFace) { |
84 FontConfigTypeface* fct = (FontConfigTypeface*)familyFace; | 90 FontConfigTypeface* fct = (FontConfigTypeface*)familyFace; |
85 familyName = fct->getFamilyName(); | 91 familyName = fct->getFamilyName(); |
86 } | 92 } |
87 | 93 |
88 FindRec rec(familyName, style); | 94 FindRec rec(familyName, style); |
89 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_proc, &rec); | 95 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_proc, &rec); |
90 if (face) { | 96 if (face) { |
91 // SkDebugf("found cached face <%s> <%s> %p [%d]\n", familyName, ((FontCo nfigTypeface*)face)->getFamilyName(), face, face->getRefCnt()); | 97 // SkDebugf("found cached face <%s> <%s> %p [%d]\n", familyName, ((FontCo nfigTypeface*)face)->getFamilyName(), face, face->getRefCnt()); |
92 return face; | 98 return face; |
93 } | 99 } |
94 | 100 |
95 SkFontConfigInterface::FontIdentity indentity; | 101 SkFontConfigInterface::FontIdentity identity; |
96 SkString outFamilyName; | 102 SkString outFamilyName; |
97 SkTypeface::Style outStyle; | 103 SkTypeface::Style outStyle; |
98 | 104 |
99 if (!fci->matchFamilyName(familyName, style, | 105 if (!fci->matchFamilyName(familyName, style, |
100 &indentity, &outFamilyName, &outStyle)) { | 106 &identity, &outFamilyName, &outStyle)) { |
101 return NULL; | 107 return NULL; |
102 } | 108 } |
103 | 109 |
104 face = SkNEW_ARGS(FontConfigTypeface, (outStyle, indentity, outFamilyName)); | 110 face = SkTypefaceCache::FindByProcAndRef(find_proc_by_id, &identity.fID); |
reed1
2013/06/05 13:23:57
this may be correct, but is it strictly needed for
djsollen
2013/06/05 13:51:59
No this is still needed. If an app asks for a font
| |
111 if (face) { | |
112 return face; | |
113 } | |
114 | |
115 face = SkNEW_ARGS(FontConfigTypeface, (outStyle, identity, outFamilyName)); | |
105 SkTypefaceCache::Add(face, style); | 116 SkTypefaceCache::Add(face, style); |
106 // SkDebugf("add face <%s> <%s> %p [%d]\n", familyName, outFamilyName.c_str() , face, face->getRefCnt()); | 117 // SkDebugf("add face <%s> <%s> %p [%d]\n", familyName, outFamilyName.c_str() , face, face->getRefCnt()); |
107 return face; | 118 return face; |
108 } | 119 } |
109 | 120 |
110 SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream* stream) { | 121 SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream* stream) { |
111 if (!stream) { | 122 if (!stream) { |
112 return NULL; | 123 return NULL; |
113 } | 124 } |
114 const size_t length = stream->getLength(); | 125 const size_t length = stream->getLength(); |
115 if (!length) { | 126 if (!length) { |
116 return NULL; | 127 return NULL; |
117 } | 128 } |
118 if (length >= 1024 * 1024 * 1024) { | 129 if (length >= 1024 * 1024 * 1024) { |
119 return NULL; // don't accept too large fonts (>= 1GB) for safety. | 130 return NULL; // don't accept too large fonts (>= 1GB) for safety. |
120 } | 131 } |
121 | 132 |
122 // TODO should the caller give us the style? | 133 // TODO should the caller give us the style? |
123 SkTypeface::Style style = SkTypeface::kNormal; | 134 SkTypeface::Style style = SkTypeface::kNormal; |
124 SkTypeface* face = SkNEW_ARGS(FontConfigTypeface, (style, stream)); | 135 SkTypeface* face = SkNEW_ARGS(FontConfigTypeface, (style, stream)); |
125 SkTypefaceCache::Add(face, style); | |
126 return face; | 136 return face; |
127 } | 137 } |
128 | 138 |
129 SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) { | 139 SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) { |
130 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); | 140 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); |
131 return stream.get() ? CreateTypefaceFromStream(stream) : NULL; | 141 return stream.get() ? CreateTypefaceFromStream(stream) : NULL; |
132 } | 142 } |
133 | 143 |
134 /////////////////////////////////////////////////////////////////////////////// | 144 /////////////////////////////////////////////////////////////////////////////// |
135 | 145 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
189 : 0; | 199 : 0; |
190 } | 200 } |
191 | 201 |
192 void FontConfigTypeface::onGetFontDescriptor(SkFontDescriptor* desc, | 202 void FontConfigTypeface::onGetFontDescriptor(SkFontDescriptor* desc, |
193 bool* isLocalStream) const { | 203 bool* isLocalStream) const { |
194 desc->setFamilyName(this->getFamilyName()); | 204 desc->setFamilyName(this->getFamilyName()); |
195 *isLocalStream = SkToBool(this->getLocalStream()); | 205 *isLocalStream = SkToBool(this->getLocalStream()); |
196 } | 206 } |
197 | 207 |
198 /////////////////////////////////////////////////////////////////////////////// | 208 /////////////////////////////////////////////////////////////////////////////// |
OLD | NEW |