| 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 "SkFontHost.h" | 8 #include "SkFontHost.h" |
| 9 #include "SkFontDescriptor.h" | 9 #include "SkFontDescriptor.h" |
| 10 #include "SkGraphics.h" | 10 #include "SkGraphics.h" |
| 11 #include "SkDescriptor.h" | 11 #include "SkDescriptor.h" |
| 12 #include "SkMMapStream.h" | |
| 13 #include "SkPaint.h" | 12 #include "SkPaint.h" |
| 14 #include "SkString.h" | 13 #include "SkString.h" |
| 15 #include "SkStream.h" | 14 #include "SkStream.h" |
| 16 #include "SkThread.h" | 15 #include "SkThread.h" |
| 17 #include "SkTSearch.h" | 16 #include "SkTSearch.h" |
| 18 #include "SkTypeface_android.h" | 17 #include "SkTypeface_android.h" |
| 19 #include "FontHostConfiguration_android.h" | 18 #include "FontHostConfiguration_android.h" |
| 20 | 19 |
| 21 #ifndef SK_FONT_FILE_PREFIX | 20 #ifndef SK_FONT_FILE_PREFIX |
| 22 #define SK_FONT_FILE_PREFIX "/fonts/" | 21 #define SK_FONT_FILE_PREFIX "/fonts/" |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 363 : INHERITED(style, sysFont, familyMember, isFixedWidth) { | 362 : INHERITED(style, sysFont, familyMember, isFixedWidth) { |
| 364 SkString fullpath; | 363 SkString fullpath; |
| 365 | 364 |
| 366 if (sysFont) { | 365 if (sysFont) { |
| 367 GetFullPathForSysFonts(&fullpath, path); | 366 GetFullPathForSysFonts(&fullpath, path); |
| 368 path = fullpath.c_str(); | 367 path = fullpath.c_str(); |
| 369 } | 368 } |
| 370 fPath.set(path); | 369 fPath.set(path); |
| 371 } | 370 } |
| 372 | 371 |
| 373 // overrides | 372 virtual SkStream* openStream() SK_OVERRIDE { |
| 374 virtual SkStream* openStream() { | 373 return SkStream::NewFromFile(fPath.c_str()); |
| 375 SkStream* stream = SkNEW_ARGS(SkMMAPStream, (fPath.c_str())); | 374 } |
| 376 | 375 |
| 377 // check for failure | 376 virtual const char* getUniqueString() const SK_OVERRIDE { |
| 378 if (stream->getLength() <= 0) { | |
| 379 SkDELETE(stream); | |
| 380 // maybe MMAP isn't supported. try FILE | |
| 381 stream = SkNEW_ARGS(SkFILEStream, (fPath.c_str())); | |
| 382 if (stream->getLength() <= 0) { | |
| 383 SkDELETE(stream); | |
| 384 stream = NULL; | |
| 385 } | |
| 386 } | |
| 387 return stream; | |
| 388 } | |
| 389 virtual const char* getUniqueString() const { | |
| 390 const char* str = strrchr(fPath.c_str(), '/'); | 377 const char* str = strrchr(fPath.c_str(), '/'); |
| 391 if (str) { | 378 if (str) { |
| 392 str += 1; // skip the '/' | 379 str += 1; // skip the '/' |
| 393 } | 380 } |
| 394 return str; | 381 return str; |
| 395 } | 382 } |
| 396 virtual const char* getFilePath() const { | 383 |
| 384 virtual const char* getFilePath() const SK_OVERRIDE { |
| 397 return fPath.c_str(); | 385 return fPath.c_str(); |
| 398 } | 386 } |
| 399 | 387 |
| 400 private: | 388 private: |
| 401 SkString fPath; | 389 SkString fPath; |
| 402 | 390 |
| 403 typedef FamilyTypeface INHERITED; | 391 typedef FamilyTypeface INHERITED; |
| 404 }; | 392 }; |
| 405 | 393 |
| 406 /////////////////////////////////////////////////////////////////////////////// | 394 /////////////////////////////////////////////////////////////////////////////// |
| 407 /////////////////////////////////////////////////////////////////////////////// | 395 /////////////////////////////////////////////////////////////////////////////// |
| 408 | 396 |
| 409 static bool get_name_and_style(const char path[], SkString* name, | 397 static bool get_name_and_style(const char path[], SkString* name, |
| 410 SkTypeface::Style* style, | 398 SkTypeface::Style* style, |
| 411 bool* isFixedWidth, bool isExpected) { | 399 bool* isFixedWidth, bool isExpected) { |
| 412 SkString fullpath; | 400 SkString fullpath; |
| 413 GetFullPathForSysFonts(&fullpath, path); | 401 GetFullPathForSysFonts(&fullpath, path); |
| 414 | 402 |
| 415 SkMMAPStream stream(fullpath.c_str()); | 403 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); |
| 416 if (stream.getLength() > 0) { | 404 if (stream.get()) { |
| 417 return find_name_and_attributes(&stream, name, style, isFixedWidth); | 405 return find_name_and_attributes(stream, name, style, isFixedWidth); |
| 406 } else { |
| 407 if (isExpected) { |
| 408 SkDebugf("---- failed to open <%s> as a font", fullpath.c_str()); |
| 409 } |
| 410 return false; |
| 418 } | 411 } |
| 419 else { | |
| 420 SkFILEStream stream(fullpath.c_str()); | |
| 421 if (stream.getLength() > 0) { | |
| 422 return find_name_and_attributes(&stream, name, style, isFixedWidth); | |
| 423 } | |
| 424 } | |
| 425 | |
| 426 if (isExpected) { | |
| 427 SkDebugf("---- failed to open <%s> as a font", fullpath.c_str()); | |
| 428 } | |
| 429 return false; | |
| 430 } | 412 } |
| 431 | 413 |
| 432 // used to record our notion of the pre-existing fonts | 414 // used to record our notion of the pre-existing fonts |
| 433 struct FontInitRec { | 415 struct FontInitRec { |
| 434 const char* fFileName; | 416 const char* fFileName; |
| 435 const char* const* fNames; // null-terminated list | 417 const char* const* fNames; // null-terminated list |
| 436 }; | 418 }; |
| 437 | 419 |
| 438 // deliberately empty, but we use the address to identify fallback fonts | 420 // deliberately empty, but we use the address to identify fallback fonts |
| 439 static const char* gFBNames[] = { NULL }; | 421 static const char* gFBNames[] = { NULL }; |
| (...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 945 // Make sure system fonts are loaded to comply with the assumption of | 927 // Make sure system fonts are loaded to comply with the assumption of |
| 946 // unique id offset by one in find_uniqueID. | 928 // unique id offset by one in find_uniqueID. |
| 947 load_system_fonts(); | 929 load_system_fonts(); |
| 948 return SkNEW_ARGS(StreamTypeface, (style, false, NULL, stream, isFixedWi
dth)); | 930 return SkNEW_ARGS(StreamTypeface, (style, false, NULL, stream, isFixedWi
dth)); |
| 949 } else { | 931 } else { |
| 950 return NULL; | 932 return NULL; |
| 951 } | 933 } |
| 952 } | 934 } |
| 953 | 935 |
| 954 SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) { | 936 SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) { |
| 955 SkStream* stream = SkNEW_ARGS(SkMMAPStream, (path)); | 937 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); |
| 956 SkTypeface* face = SkFontHost::CreateTypefaceFromStream(stream); | 938 return stream.get() ? SkFontHost::CreateTypefaceFromStream(stream) : NULL; |
| 957 // since we created the stream, we let go of our ref() here | |
| 958 stream->unref(); | |
| 959 return face; | |
| 960 } | 939 } |
| 961 | 940 |
| 962 /////////////////////////////////////////////////////////////////////////////// | 941 /////////////////////////////////////////////////////////////////////////////// |
| 963 // Function from SkTypeface_android.h | 942 // Function from SkTypeface_android.h |
| 964 /////////////////////////////////////////////////////////////////////////////// | 943 /////////////////////////////////////////////////////////////////////////////// |
| 965 | 944 |
| 966 struct FBScriptInfo { | 945 struct FBScriptInfo { |
| 967 const FallbackScripts fScript; | 946 const FallbackScripts fScript; |
| 968 const char* fScriptID; | 947 const char* fScriptID; |
| 969 const SkTypeface::Style fStyle; | 948 const SkTypeface::Style fStyle; |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1142 const char* fontsdir) { | 1121 const char* fontsdir) { |
| 1143 gTestMainConfigFile = mainconf; | 1122 gTestMainConfigFile = mainconf; |
| 1144 gTestFallbackConfigFile = fallbackconf; | 1123 gTestFallbackConfigFile = fallbackconf; |
| 1145 gTestFontFilePrefix = fontsdir; | 1124 gTestFontFilePrefix = fontsdir; |
| 1146 SkASSERT(gTestMainConfigFile); | 1125 SkASSERT(gTestMainConfigFile); |
| 1147 SkASSERT(gTestFallbackConfigFile); | 1126 SkASSERT(gTestFallbackConfigFile); |
| 1148 SkASSERT(gTestFontFilePrefix); | 1127 SkASSERT(gTestFontFilePrefix); |
| 1149 SkDEBUGF(("Use Test Config File Main %s, Fallback %s, Font Dir %s", | 1128 SkDEBUGF(("Use Test Config File Main %s, Fallback %s, Font Dir %s", |
| 1150 gTestMainConfigFile, gTestFallbackConfigFile, gTestFontFilePrefix)
); | 1129 gTestMainConfigFile, gTestFallbackConfigFile, gTestFontFilePrefix)
); |
| 1151 } | 1130 } |
| OLD | NEW |