OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 The Android Open Source Project | 2 * Copyright 2011 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 "SkEndian.h" | 9 #include "SkEndian.h" |
10 #include "SkFontDescriptor.h" | 10 #include "SkFontDescriptor.h" |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 return new EmptyLocalizedStrings; | 71 return new EmptyLocalizedStrings; |
72 }; | 72 }; |
73 int onGetTableTags(SkFontTableTag tags[]) const override { return 0; } | 73 int onGetTableTags(SkFontTableTag tags[]) const override { return 0; } |
74 size_t onGetTableData(SkFontTableTag, size_t, size_t, void*) const override
{ | 74 size_t onGetTableData(SkFontTableTag, size_t, size_t, void*) const override
{ |
75 return 0; | 75 return 0; |
76 } | 76 } |
77 }; | 77 }; |
78 | 78 |
79 } | 79 } |
80 | 80 |
81 SK_DECLARE_STATIC_MUTEX(gCreateDefaultMutex); | |
82 | |
83 SkTypeface* SkTypeface::GetDefaultTypeface(Style style) { | 81 SkTypeface* SkTypeface::GetDefaultTypeface(Style style) { |
84 static SkOnce once[4]; | 82 static SkOnce once[4]; |
85 static SkTypeface* defaults[4]; | 83 static SkTypeface* defaults[4]; |
86 | 84 |
87 SkASSERT((int)style < 4); | 85 SkASSERT((int)style < 4); |
88 once[style]([style] { | 86 once[style]([style] { |
89 // It is not safe to call FontConfigTypeface::LegacyCreateTypeface concu
rrently. | |
90 // To be safe, we serialize here with a mutex so only one call to | |
91 // CreateTypeface is happening at any given time. | |
92 // TODO(bungeman, mtklein): This is sad. Make our fontconfig code safe? | |
93 SkAutoMutexAcquire lock(&gCreateDefaultMutex); | |
94 SkAutoTUnref<SkFontMgr> fm(SkFontMgr::RefDefault()); | 87 SkAutoTUnref<SkFontMgr> fm(SkFontMgr::RefDefault()); |
95 SkTypeface* t = fm->legacyCreateTypeface(nullptr, SkFontStyle::FromOldSt
yle(style)); | 88 SkTypeface* t = fm->legacyCreateTypeface(nullptr, SkFontStyle::FromOldSt
yle(style)); |
96 defaults[style] = t ? t : SkEmptyTypeface::Create(); | 89 defaults[style] = t ? t : SkEmptyTypeface::Create(); |
97 }); | 90 }); |
98 return defaults[style]; | 91 return defaults[style]; |
99 } | 92 } |
100 | 93 |
101 sk_sp<SkTypeface> SkTypeface::MakeDefault(Style style) { | 94 sk_sp<SkTypeface> SkTypeface::MakeDefault(Style style) { |
102 return sk_ref_sp(GetDefaultTypeface(style)); | 95 return sk_ref_sp(GetDefaultTypeface(style)); |
103 } | 96 } |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 SkAutoTDelete<SkScalerContext> ctx(this->createScalerContext(noeffects, desc
, true)); | 343 SkAutoTDelete<SkScalerContext> ctx(this->createScalerContext(noeffects, desc
, true)); |
351 if (ctx.get()) { | 344 if (ctx.get()) { |
352 SkPaint::FontMetrics fm; | 345 SkPaint::FontMetrics fm; |
353 ctx->getFontMetrics(&fm); | 346 ctx->getFontMetrics(&fm); |
354 bounds->set(fm.fXMin * invTextSize, fm.fTop * invTextSize, | 347 bounds->set(fm.fXMin * invTextSize, fm.fTop * invTextSize, |
355 fm.fXMax * invTextSize, fm.fBottom * invTextSize); | 348 fm.fXMax * invTextSize, fm.fBottom * invTextSize); |
356 return true; | 349 return true; |
357 } | 350 } |
358 return false; | 351 return false; |
359 } | 352 } |
OLD | NEW |