Index: src/core/SkTypeface.cpp |
=================================================================== |
--- src/core/SkTypeface.cpp (revision 12989) |
+++ src/core/SkTypeface.cpp (working copy) |
@@ -8,6 +8,7 @@ |
#include "SkAdvancedTypefaceMetrics.h" |
#include "SkFontDescriptor.h" |
#include "SkFontHost.h" |
+#include "SkOnce.h" |
#include "SkStream.h" |
#include "SkTypeface.h" |
@@ -69,24 +70,32 @@ |
} |
}; |
-SkTypeface* SkTypeface::GetDefaultTypeface(Style style) { |
- // we keep a reference to this guy for all time, since if we return its |
- // fontID, the font cache may later on ask to resolve that back into a |
- // typeface object. |
- static const uint32_t FONT_STYLE_COUNT = 4; |
- static SkTypeface* gDefaultTypefaces[FONT_STYLE_COUNT]; |
- SkASSERT((unsigned)style < FONT_STYLE_COUNT); |
+static SkTypeface* gDefaultTypefaces[] = { NULL, NULL, NULL, NULL }; |
+static const size_t FONT_STYLE_COUNT = SK_ARRAY_COUNT(gDefaultTypefaces); |
+static SkOnceFlag gDefaultTypefaceOnce[FONT_STYLE_COUNT] = { |
+ SK_ONCE_INIT, SK_ONCE_INIT, SK_ONCE_INIT, SK_ONCE_INIT |
+}; |
+template <uintmax_t N> struct SkTIsPow2 { |
+ static const bool value = (N & (N - 1)) == 0; |
+}; |
+SK_COMPILE_ASSERT(SkTIsPow2<FONT_STYLE_COUNT>::value, FONT_STYLE_COUNT_not_power_of_2); |
mtklein
2014/01/09 17:08:22
Since we're leaving SkTIsPow2 in this file, why no
bungeman-skia
2014/01/09 17:12:57
Because I like naming it (it isn't immediately obv
|
- // mask off any other bits to avoid a crash in SK_RELEASE |
- style = (Style)(style & 0x03); |
- |
+void SkTypeface::create_default_typeface(Style style) { |
if (NULL == gDefaultTypefaces[style]) { |
gDefaultTypefaces[style] = SkFontHost::CreateTypeface(NULL, NULL, style); |
} |
if (NULL == gDefaultTypefaces[style]) { |
gDefaultTypefaces[style] = SkNEW(SkEmptyTypeface); |
} |
+} |
+SkTypeface* SkTypeface::GetDefaultTypeface(Style style) { |
+ SkASSERT((size_t)style < FONT_STYLE_COUNT); |
+ |
+ // mask off any other bits to avoid a crash in SK_RELEASE |
+ style = (Style)(style & (FONT_STYLE_COUNT - 1)); |
+ |
+ SkOnce(&gDefaultTypefaceOnce[style], SkTypeface::create_default_typeface, style); |
return gDefaultTypefaces[style]; |
} |