| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 | 253 |
| 254 sk_bzero(&fFTStream, sizeof(fFTStream)); | 254 sk_bzero(&fFTStream, sizeof(fFTStream)); |
| 255 fFTStream.size = fSkStream->getLength(); | 255 fFTStream.size = fSkStream->getLength(); |
| 256 fFTStream.descriptor.pointer = fSkStream; | 256 fFTStream.descriptor.pointer = fSkStream; |
| 257 fFTStream.read = sk_stream_read; | 257 fFTStream.read = sk_stream_read; |
| 258 fFTStream.close = sk_stream_close; | 258 fFTStream.close = sk_stream_close; |
| 259 } | 259 } |
| 260 | 260 |
| 261 // Will return 0 on failure | 261 // Will return 0 on failure |
| 262 // Caller must lock gFTMutex before calling this function. | 262 // Caller must lock gFTMutex before calling this function. |
| 263 static SkFaceRec* ref_ft_face(uint32_t fontID) { | 263 static SkFaceRec* ref_ft_face(const SkTypeface* typeface) { |
| 264 const SkFontID fontID = typeface->uniqueID(); |
| 264 SkFaceRec* rec = gFaceRecHead; | 265 SkFaceRec* rec = gFaceRecHead; |
| 265 while (rec) { | 266 while (rec) { |
| 266 if (rec->fFontID == fontID) { | 267 if (rec->fFontID == fontID) { |
| 267 SkASSERT(rec->fFace); | 268 SkASSERT(rec->fFace); |
| 268 rec->fRefCnt += 1; | 269 rec->fRefCnt += 1; |
| 269 return rec; | 270 return rec; |
| 270 } | 271 } |
| 271 rec = rec->fNext; | 272 rec = rec->fNext; |
| 272 } | 273 } |
| 273 | 274 |
| 274 SkStream* strm = SkFontHost::OpenStream(fontID); | 275 int face_index; |
| 276 SkStream* strm = typeface->openStream(&face_index); |
| 275 if (NULL == strm) { | 277 if (NULL == strm) { |
| 276 SkDEBUGF(("SkFontHost::OpenStream failed opening %x\n", fontID)); | 278 return NULL; |
| 277 return 0; | |
| 278 } | 279 } |
| 279 | 280 |
| 280 // this passes ownership of strm to the rec | 281 // this passes ownership of strm to the rec |
| 281 rec = SkNEW_ARGS(SkFaceRec, (strm, fontID)); | 282 rec = SkNEW_ARGS(SkFaceRec, (strm, fontID)); |
| 282 | 283 |
| 283 FT_Open_Args args; | 284 FT_Open_Args args; |
| 284 memset(&args, 0, sizeof(args)); | 285 memset(&args, 0, sizeof(args)); |
| 285 const void* memoryBase = strm->getMemoryBase(); | 286 const void* memoryBase = strm->getMemoryBase(); |
| 286 | 287 |
| 287 if (NULL != memoryBase) { | 288 if (NULL != memoryBase) { |
| 288 //printf("mmap(%s)\n", keyString.c_str()); | 289 //printf("mmap(%s)\n", keyString.c_str()); |
| 289 args.flags = FT_OPEN_MEMORY; | 290 args.flags = FT_OPEN_MEMORY; |
| 290 args.memory_base = (const FT_Byte*)memoryBase; | 291 args.memory_base = (const FT_Byte*)memoryBase; |
| 291 args.memory_size = strm->getLength(); | 292 args.memory_size = strm->getLength(); |
| 292 } else { | 293 } else { |
| 293 //printf("fopen(%s)\n", keyString.c_str()); | 294 //printf("fopen(%s)\n", keyString.c_str()); |
| 294 args.flags = FT_OPEN_STREAM; | 295 args.flags = FT_OPEN_STREAM; |
| 295 args.stream = &rec->fFTStream; | 296 args.stream = &rec->fFTStream; |
| 296 } | 297 } |
| 297 | 298 |
| 298 int face_index; | 299 FT_Error err = FT_Open_Face(gFTLibrary, &args, face_index, &rec->fFace); |
| 299 int length = SkFontHost::GetFileName(fontID, NULL, 0, &face_index); | |
| 300 FT_Error err = FT_Open_Face(gFTLibrary, &args, length ? face_index : 0, | |
| 301 &rec->fFace); | |
| 302 | |
| 303 if (err) { // bad filename, try the default font | 300 if (err) { // bad filename, try the default font |
| 304 fprintf(stderr, "ERROR: unable to open font '%x'\n", fontID); | 301 fprintf(stderr, "ERROR: unable to open font '%x'\n", fontID); |
| 305 SkDELETE(rec); | 302 SkDELETE(rec); |
| 306 return 0; | 303 return NULL; |
| 307 } else { | 304 } else { |
| 308 SkASSERT(rec->fFace); | 305 SkASSERT(rec->fFace); |
| 309 //fprintf(stderr, "Opened font '%s'\n", filename.c_str()); | 306 //fprintf(stderr, "Opened font '%s'\n", filename.c_str()); |
| 310 rec->fNext = gFaceRecHead; | 307 rec->fNext = gFaceRecHead; |
| 311 gFaceRecHead = rec; | 308 gFaceRecHead = rec; |
| 312 return rec; | 309 return rec; |
| 313 } | 310 } |
| 314 } | 311 } |
| 315 | 312 |
| 316 // Caller must lock gFTMutex before calling this function. | 313 // Caller must lock gFTMutex before calling this function. |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 return NULL; | 452 return NULL; |
| 456 #else | 453 #else |
| 457 SkAutoMutexAcquire ac(gFTMutex); | 454 SkAutoMutexAcquire ac(gFTMutex); |
| 458 FT_Library libInit = NULL; | 455 FT_Library libInit = NULL; |
| 459 if (gFTCount == 0) { | 456 if (gFTCount == 0) { |
| 460 if (!InitFreetype()) | 457 if (!InitFreetype()) |
| 461 sk_throw(); | 458 sk_throw(); |
| 462 libInit = gFTLibrary; | 459 libInit = gFTLibrary; |
| 463 } | 460 } |
| 464 SkAutoTCallIProc<struct FT_LibraryRec_, FT_Done_FreeType> ftLib(libInit); | 461 SkAutoTCallIProc<struct FT_LibraryRec_, FT_Done_FreeType> ftLib(libInit); |
| 465 SkFaceRec* rec = ref_ft_face(this->uniqueID()); | 462 SkFaceRec* rec = ref_ft_face(this); |
| 466 if (NULL == rec) | 463 if (NULL == rec) |
| 467 return NULL; | 464 return NULL; |
| 468 FT_Face face = rec->fFace; | 465 FT_Face face = rec->fFace; |
| 469 | 466 |
| 470 SkAdvancedTypefaceMetrics* info = new SkAdvancedTypefaceMetrics; | 467 SkAdvancedTypefaceMetrics* info = new SkAdvancedTypefaceMetrics; |
| 471 info->fFontName.set(FT_Get_Postscript_Name(face)); | 468 info->fFontName.set(FT_Get_Postscript_Name(face)); |
| 472 info->fMultiMaster = FT_HAS_MULTIPLE_MASTERS(face); | 469 info->fMultiMaster = FT_HAS_MULTIPLE_MASTERS(face); |
| 473 info->fLastGlyphID = face->num_glyphs - 1; | 470 info->fLastGlyphID = face->num_glyphs - 1; |
| 474 info->fEmSize = 1000; | 471 info->fEmSize = 1000; |
| 475 | 472 |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 | 697 |
| 701 int SkTypeface_FreeType::onGetUPEM() const { | 698 int SkTypeface_FreeType::onGetUPEM() const { |
| 702 SkAutoMutexAcquire ac(gFTMutex); | 699 SkAutoMutexAcquire ac(gFTMutex); |
| 703 FT_Library libInit = NULL; | 700 FT_Library libInit = NULL; |
| 704 if (gFTCount == 0) { | 701 if (gFTCount == 0) { |
| 705 if (!InitFreetype()) | 702 if (!InitFreetype()) |
| 706 sk_throw(); | 703 sk_throw(); |
| 707 libInit = gFTLibrary; | 704 libInit = gFTLibrary; |
| 708 } | 705 } |
| 709 SkAutoTCallIProc<struct FT_LibraryRec_, FT_Done_FreeType> ftLib(libInit); | 706 SkAutoTCallIProc<struct FT_LibraryRec_, FT_Done_FreeType> ftLib(libInit); |
| 710 SkFaceRec *rec = ref_ft_face(this->uniqueID()); | 707 SkFaceRec *rec = ref_ft_face(this); |
| 711 int unitsPerEm = 0; | 708 int unitsPerEm = 0; |
| 712 | 709 |
| 713 if (rec != NULL && rec->fFace != NULL) { | 710 if (rec != NULL && rec->fFace != NULL) { |
| 714 unitsPerEm = rec->fFace->units_per_EM; | 711 unitsPerEm = rec->fFace->units_per_EM; |
| 715 unref_ft_face(rec->fFace); | 712 unref_ft_face(rec->fFace); |
| 716 } | 713 } |
| 717 | 714 |
| 718 return unitsPerEm; | 715 return unitsPerEm; |
| 719 } | 716 } |
| 720 | 717 |
| 721 SkScalerContext_FreeType::SkScalerContext_FreeType(SkTypeface* typeface, | 718 SkScalerContext_FreeType::SkScalerContext_FreeType(SkTypeface* typeface, |
| 722 const SkDescriptor* desc) | 719 const SkDescriptor* desc) |
| 723 : SkScalerContext_FreeType_Base(typeface, desc) { | 720 : SkScalerContext_FreeType_Base(typeface, desc) { |
| 724 SkAutoMutexAcquire ac(gFTMutex); | 721 SkAutoMutexAcquire ac(gFTMutex); |
| 725 | 722 |
| 726 if (gFTCount == 0) { | 723 if (gFTCount == 0) { |
| 727 if (!InitFreetype()) { | 724 if (!InitFreetype()) { |
| 728 sk_throw(); | 725 sk_throw(); |
| 729 } | 726 } |
| 730 } | 727 } |
| 731 ++gFTCount; | 728 ++gFTCount; |
| 732 | 729 |
| 733 // load the font file | 730 // load the font file |
| 734 fFTSize = NULL; | 731 fFTSize = NULL; |
| 735 fFace = NULL; | 732 fFace = NULL; |
| 736 fFaceRec = ref_ft_face(fRec.fFontID); | 733 fFaceRec = ref_ft_face(typeface); |
| 737 if (NULL == fFaceRec) { | 734 if (NULL == fFaceRec) { |
| 738 return; | 735 return; |
| 739 } | 736 } |
| 740 fFace = fFaceRec->fFace; | 737 fFace = fFaceRec->fFace; |
| 741 | 738 |
| 742 // compute our factors from the record | 739 // compute our factors from the record |
| 743 | 740 |
| 744 SkMatrix m; | 741 SkMatrix m; |
| 745 | 742 |
| 746 fRec.getSingleMatrix(&m); | 743 fRec.getSingleMatrix(&m); |
| (...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1361 *style = (SkTypeface::Style) tempStyle; | 1358 *style = (SkTypeface::Style) tempStyle; |
| 1362 } | 1359 } |
| 1363 if (isFixedWidth) { | 1360 if (isFixedWidth) { |
| 1364 *isFixedWidth = FT_IS_FIXED_WIDTH(face); | 1361 *isFixedWidth = FT_IS_FIXED_WIDTH(face); |
| 1365 } | 1362 } |
| 1366 | 1363 |
| 1367 FT_Done_Face(face); | 1364 FT_Done_Face(face); |
| 1368 FT_Done_FreeType(library); | 1365 FT_Done_FreeType(library); |
| 1369 return true; | 1366 return true; |
| 1370 } | 1367 } |
| OLD | NEW |