OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
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 "SkAdvancedTypefaceMetrics.h" | 8 #include "SkAdvancedTypefaceMetrics.h" |
9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 void updateGlyphIfLCD(SkGlyph* glyph); | 226 void updateGlyphIfLCD(SkGlyph* glyph); |
227 // Caller must lock gFTMutex before calling this function. | 227 // Caller must lock gFTMutex before calling this function. |
228 // update FreeType2 glyph slot with glyph emboldened | 228 // update FreeType2 glyph slot with glyph emboldened |
229 void emboldenIfNeeded(FT_Face face, FT_GlyphSlot glyph); | 229 void emboldenIfNeeded(FT_Face face, FT_GlyphSlot glyph); |
230 }; | 230 }; |
231 | 231 |
232 /////////////////////////////////////////////////////////////////////////// | 232 /////////////////////////////////////////////////////////////////////////// |
233 /////////////////////////////////////////////////////////////////////////// | 233 /////////////////////////////////////////////////////////////////////////// |
234 | 234 |
235 struct SkFaceRec { | 235 struct SkFaceRec { |
236 SkFaceRec* fNext; | 236 SkFaceRec* fNext; |
237 FT_Face fFace; | 237 FT_Face fFace; |
238 FT_StreamRec fFTStream; | 238 FT_StreamRec fFTStream; |
239 SkAutoTDelete<SkStream> fSkStream; | 239 SkAutoTDelete<SkStreamAsset> fSkStream; |
240 uint32_t fRefCnt; | 240 uint32_t fRefCnt; |
241 uint32_t fFontID; | 241 uint32_t fFontID; |
242 | 242 |
243 // assumes ownership of the stream, will delete when its done | 243 // assumes ownership of the stream, will delete when its done |
244 SkFaceRec(SkStream* strm, uint32_t fontID); | 244 SkFaceRec(SkStreamAsset* strm, uint32_t fontID); |
245 }; | 245 }; |
246 | 246 |
247 extern "C" { | 247 extern "C" { |
248 static unsigned long sk_ft_stream_io(FT_Stream stream, | 248 static unsigned long sk_ft_stream_io(FT_Stream ftStream, |
249 unsigned long offset, | 249 unsigned long offset, |
250 unsigned char* buffer, | 250 unsigned char* buffer, |
251 unsigned long count) | 251 unsigned long count) |
252 { | 252 { |
253 SkStream* str = (SkStream*)stream->descriptor.pointer; | 253 SkStreamAsset* stream = static_cast<SkStreamAsset*>(ftStream->descriptor
.pointer); |
254 | 254 |
255 if (count) { | 255 if (count) { |
256 if (!str->rewind()) { | 256 if (!stream->seek(offset)) { |
257 return 0; | 257 return 0; |
258 } | 258 } |
259 if (offset) { | 259 count = stream->read(buffer, count); |
260 if (str->skip(offset) != offset) { | |
261 return 0; | |
262 } | |
263 } | |
264 count = str->read(buffer, count); | |
265 } | 260 } |
266 return count; | 261 return count; |
267 } | 262 } |
268 | 263 |
269 static void sk_ft_stream_close(FT_Stream) {} | 264 static void sk_ft_stream_close(FT_Stream) {} |
270 } | 265 } |
271 | 266 |
272 SkFaceRec::SkFaceRec(SkStream* strm, uint32_t fontID) | 267 SkFaceRec::SkFaceRec(SkStreamAsset* stream, uint32_t fontID) |
273 : fNext(NULL), fSkStream(strm), fRefCnt(1), fFontID(fontID) { | 268 : fNext(NULL), fSkStream(stream), fRefCnt(1), fFontID(fontID) |
274 // SkDEBUGF(("SkFaceRec: opening %s (%p)\n", key.c_str(), strm)); | 269 { |
275 | |
276 sk_bzero(&fFTStream, sizeof(fFTStream)); | 270 sk_bzero(&fFTStream, sizeof(fFTStream)); |
277 fFTStream.size = fSkStream->getLength(); | 271 fFTStream.size = fSkStream->getLength(); |
278 fFTStream.descriptor.pointer = fSkStream; | 272 fFTStream.descriptor.pointer = fSkStream; |
279 fFTStream.read = sk_ft_stream_io; | 273 fFTStream.read = sk_ft_stream_io; |
280 fFTStream.close = sk_ft_stream_close; | 274 fFTStream.close = sk_ft_stream_close; |
281 } | 275 } |
282 | 276 |
283 // Will return 0 on failure | 277 // Will return 0 on failure |
284 // Caller must lock gFTMutex before calling this function. | 278 // Caller must lock gFTMutex before calling this function. |
285 static SkFaceRec* ref_ft_face(const SkTypeface* typeface) { | 279 static SkFaceRec* ref_ft_face(const SkTypeface* typeface) { |
286 gFTMutex.assertHeld(); | 280 gFTMutex.assertHeld(); |
287 | 281 |
288 const SkFontID fontID = typeface->uniqueID(); | 282 const SkFontID fontID = typeface->uniqueID(); |
289 SkFaceRec* rec = gFaceRecHead; | 283 SkFaceRec* rec = gFaceRecHead; |
290 while (rec) { | 284 while (rec) { |
291 if (rec->fFontID == fontID) { | 285 if (rec->fFontID == fontID) { |
292 SkASSERT(rec->fFace); | 286 SkASSERT(rec->fFace); |
293 rec->fRefCnt += 1; | 287 rec->fRefCnt += 1; |
294 return rec; | 288 return rec; |
295 } | 289 } |
296 rec = rec->fNext; | 290 rec = rec->fNext; |
297 } | 291 } |
298 | 292 |
299 int face_index; | 293 int face_index; |
300 SkStream* strm = typeface->openStream(&face_index); | 294 SkStreamAsset* stream = typeface->openStream(&face_index); |
301 if (NULL == strm) { | 295 if (NULL == stream) { |
302 return NULL; | 296 return NULL; |
303 } | 297 } |
304 | 298 |
305 // this passes ownership of strm to the rec | 299 // this passes ownership of stream to the rec |
306 rec = SkNEW_ARGS(SkFaceRec, (strm, fontID)); | 300 rec = SkNEW_ARGS(SkFaceRec, (stream, fontID)); |
307 | 301 |
308 FT_Open_Args args; | 302 FT_Open_Args args; |
309 memset(&args, 0, sizeof(args)); | 303 memset(&args, 0, sizeof(args)); |
310 const void* memoryBase = strm->getMemoryBase(); | 304 const void* memoryBase = stream->getMemoryBase(); |
311 | |
312 if (memoryBase) { | 305 if (memoryBase) { |
313 args.flags = FT_OPEN_MEMORY; | 306 args.flags = FT_OPEN_MEMORY; |
314 args.memory_base = (const FT_Byte*)memoryBase; | 307 args.memory_base = (const FT_Byte*)memoryBase; |
315 args.memory_size = strm->getLength(); | 308 args.memory_size = stream->getLength(); |
316 } else { | 309 } else { |
317 args.flags = FT_OPEN_STREAM; | 310 args.flags = FT_OPEN_STREAM; |
318 args.stream = &rec->fFTStream; | 311 args.stream = &rec->fFTStream; |
319 } | 312 } |
320 | 313 |
321 FT_Error err = FT_Open_Face(gFTLibrary->library(), &args, face_index, &rec->
fFace); | 314 FT_Error err = FT_Open_Face(gFTLibrary->library(), &args, face_index, &rec->
fFace); |
322 if (err) { // bad filename, try the default font | 315 if (err) { // bad filename, try the default font |
323 SkDEBUGF(("ERROR: unable to open font '%x'\n", fontID)); | 316 SkDEBUGF(("ERROR: unable to open font '%x'\n", fontID)); |
324 SkDELETE(rec); | 317 SkDELETE(rec); |
325 return NULL; | 318 return NULL; |
(...skipping 1392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1718 if (style) { | 1711 if (style) { |
1719 *style = SkFontStyle(weight, width, slant); | 1712 *style = SkFontStyle(weight, width, slant); |
1720 } | 1713 } |
1721 if (isFixedPitch) { | 1714 if (isFixedPitch) { |
1722 *isFixedPitch = FT_IS_FIXED_WIDTH(face); | 1715 *isFixedPitch = FT_IS_FIXED_WIDTH(face); |
1723 } | 1716 } |
1724 | 1717 |
1725 FT_Done_Face(face); | 1718 FT_Done_Face(face); |
1726 return true; | 1719 return true; |
1727 } | 1720 } |
OLD | NEW |