Index: src/ports/SkFontHost_FreeType.cpp |
diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp |
index ba0ce14560a53666a5c1b491c24a9253d15f7533..9acabbb5c26dbc688464d750bd044713b9c1f163 100644 |
--- a/src/ports/SkFontHost_FreeType.cpp |
+++ b/src/ports/SkFontHost_FreeType.cpp |
@@ -1669,39 +1669,74 @@ size_t SkTypeface_FreeType::onGetTableData(SkFontTableTag tag, size_t offset, |
/////////////////////////////////////////////////////////////////////////////// |
/////////////////////////////////////////////////////////////////////////////// |
-#include "SkTSearch.h" |
-/*static*/ bool SkTypeface_FreeType::ScanFont( |
- SkStream* stream, int ttcIndex, SkString* name, SkFontStyle* style, bool* isFixedPitch) |
+ |
+SkTypeface_FreeType::Scanner::Scanner() { |
+ if (FT_Init_FreeType(&fLibrary)) { |
+ fLibrary = NULL; |
+ } |
+} |
+SkTypeface_FreeType::Scanner::~Scanner() { |
+ FT_Done_FreeType(fLibrary); |
+} |
+ |
+FT_Face SkTypeface_FreeType::Scanner::openFace(SkStream* stream, int ttcIndex, |
+ FT_Stream ftStream) const |
{ |
- FT_Library library; |
- if (FT_Init_FreeType(&library)) { |
- return false; |
+ if (fLibrary == NULL) { |
+ return NULL; |
} |
- FT_Open_Args args; |
+ FT_Open_Args args; |
memset(&args, 0, sizeof(args)); |
const void* memoryBase = stream->getMemoryBase(); |
- FT_StreamRec streamRec; |
if (memoryBase) { |
args.flags = FT_OPEN_MEMORY; |
args.memory_base = (const FT_Byte*)memoryBase; |
args.memory_size = stream->getLength(); |
} else { |
- memset(&streamRec, 0, sizeof(streamRec)); |
- streamRec.size = stream->getLength(); |
- streamRec.descriptor.pointer = stream; |
- streamRec.read = sk_stream_read; |
- streamRec.close = sk_stream_close; |
+ memset(ftStream, 0, sizeof(*ftStream)); |
+ ftStream->size = stream->getLength(); |
+ ftStream->descriptor.pointer = stream; |
+ ftStream->read = sk_stream_read; |
+ ftStream->close = sk_stream_close; |
args.flags = FT_OPEN_STREAM; |
- args.stream = &streamRec; |
+ args.stream = ftStream; |
} |
FT_Face face; |
- if (FT_Open_Face(library, &args, ttcIndex, &face)) { |
- FT_Done_FreeType(library); |
+ if (FT_Open_Face(fLibrary, &args, ttcIndex, &face)) { |
+ return NULL; |
+ } |
+ return face; |
+} |
+ |
+bool SkTypeface_FreeType::Scanner::recognizedFont(SkStream* stream, int* numFaces) const { |
+ SkAutoMutexAcquire libraryLock(fLibraryMutex); |
+ |
+ FT_StreamRec streamRec; |
+ FT_Face face = this->openFace(stream, -1, &streamRec); |
+ if (NULL == face) { |
+ return false; |
+ } |
+ |
+ *numFaces = face->num_faces; |
+ |
+ FT_Done_Face(face); |
+ return true; |
+} |
+ |
+#include "SkTSearch.h" |
+bool SkTypeface_FreeType::Scanner::scanFont( |
+ SkStream* stream, int ttcIndex, SkString* name, SkFontStyle* style, bool* isFixedPitch) const |
+{ |
+ SkAutoMutexAcquire libraryLock(fLibraryMutex); |
+ |
+ FT_StreamRec streamRec; |
+ FT_Face face = this->openFace(stream, ttcIndex, &streamRec); |
+ if (NULL == face) { |
return false; |
} |
@@ -1731,14 +1766,19 @@ size_t SkTypeface_FreeType::onGetTableData(SkFontTableTag tag, size_t offset, |
{ "book", (SkFontStyle::kNormal_Weight + SkFontStyle::kLight_Weight)/2 }, |
{ "demi", SkFontStyle::kSemiBold_Weight }, |
{ "demibold", SkFontStyle::kSemiBold_Weight }, |
+ { "extra", SkFontStyle::kExtraBold_Weight }, |
{ "extrabold", SkFontStyle::kExtraBold_Weight }, |
{ "extralight", SkFontStyle::kExtraLight_Weight }, |
+ { "hairline", SkFontStyle::kThin_Weight }, |
{ "heavy", SkFontStyle::kBlack_Weight }, |
{ "light", SkFontStyle::kLight_Weight }, |
{ "medium", SkFontStyle::kMedium_Weight }, |
{ "normal", SkFontStyle::kNormal_Weight }, |
+ { "plain", SkFontStyle::kNormal_Weight }, |
{ "regular", SkFontStyle::kNormal_Weight }, |
+ { "roman", SkFontStyle::kNormal_Weight }, |
{ "semibold", SkFontStyle::kSemiBold_Weight }, |
+ { "standard", SkFontStyle::kNormal_Weight }, |
{ "thin", SkFontStyle::kThin_Weight }, |
{ "ultra", SkFontStyle::kExtraBold_Weight }, |
{ "ultrablack", 1000 }, |
@@ -1751,7 +1791,7 @@ size_t SkTypeface_FreeType::onGetTableData(SkFontTableTag tag, size_t offset, |
if (index >= 0) { |
weight = commonWeights[index].weight; |
} else { |
- SkDEBUGF(("Do not know weight for: %s\n", psFontInfo.weight)); |
+ SkDEBUGF(("Do not know weight for: %s (%s) \n", face->family_name, psFontInfo.weight)); |
} |
} |
@@ -1766,6 +1806,5 @@ size_t SkTypeface_FreeType::onGetTableData(SkFontTableTag tag, size_t offset, |
} |
FT_Done_Face(face); |
- FT_Done_FreeType(library); |
return true; |
} |