diff options
author | Ben Wagner <bungeman@google.com> | 2017-10-18 11:30:56 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-10-18 19:43:18 +0000 |
commit | 7a0248f738dff64b95dc8e3f13e10984c3c27ebc (patch) | |
tree | 32868e17b911cdc0d6a4689ca0eca559bf2da217 /src/ports/SkFontHost_mac.cpp | |
parent | 62cbb67a028de74c54940da0a63809c1881d5549 (diff) |
Compute inverse gamma table at compile time.
This introduces skstd::index_sequence and skstd::make_index_sequence so
that these can be used in C++11. These are mostly equivalent to their
std:: counterparts. This also introduces SkMakeArray<N, C>
which is constexpr and creates a std::array with N elements with each
element being initialized with the value of C(i) where i is the index of
the element.
These are then used to create inverse gamma table at compile time. This
avoids threading issues.
BUG=skia:7187
Change-Id: I61fb10a778898652e546d54c104a08d6e6bf88d3
Reviewed-on: https://skia-review.googlesource.com/61380
Commit-Queue: Ben Wagner <bungeman@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'src/ports/SkFontHost_mac.cpp')
-rw-r--r-- | src/ports/SkFontHost_mac.cpp | 22 |
1 files changed, 5 insertions, 17 deletions
diff --git a/src/ports/SkFontHost_mac.cpp b/src/ports/SkFontHost_mac.cpp index 8fadb805a2..57a37a11f7 100644 --- a/src/ports/SkFontHost_mac.cpp +++ b/src/ports/SkFontHost_mac.cpp @@ -1056,12 +1056,8 @@ void SkScalerContext_Mac::generateMetrics(SkGlyph* glyph) { #include "SkColorData.h" -static void build_power_table(uint8_t table[]) { - for (int i = 0; i < 256; i++) { - float x = i / 255.f; - int xx = SkScalarRoundToInt(x * x * 255); - table[i] = SkToU8(xx); - } +static constexpr uint8_t sk_pow2_table(size_t i) { + return SkToU8(((i * i + 128) / 255)); } /** @@ -1071,15 +1067,7 @@ static void build_power_table(uint8_t table[]) { * CoreGraphics obscurely defaults to 2.0 as the smoothing gamma value. * The color space used does not appear to affect this choice. */ -static const uint8_t* getInverseGammaTableCoreGraphicSmoothing() { - static bool gInited; - static uint8_t gTableCoreGraphicsSmoothing[256]; - if (!gInited) { - build_power_table(gTableCoreGraphicsSmoothing); - gInited = true; - } - return gTableCoreGraphicsSmoothing; -} +static constexpr auto gLinearCoverageFromCGLCDValue = SkMakeArray<256>(sk_pow2_table); static void cgpixels_to_bits(uint8_t dst[], const CGRGBPixel src[], int count) { while (count > 0) { @@ -1179,7 +1167,7 @@ void SkScalerContext_Mac::generateImage(const SkGlyph& glyph) { if ((glyph.fMaskFormat == SkMask::kLCD16_Format) || (glyph.fMaskFormat == SkMask::kA8_Format && supports_LCD() && generateA8FromLCD)) { - const uint8_t* table = getInverseGammaTableCoreGraphicSmoothing(); + const uint8_t* linear = gLinearCoverageFromCGLCDValue.data(); //Note that the following cannot really be integrated into the //pre-blend, since we may not be applying the pre-blend; when we aren't @@ -1192,7 +1180,7 @@ void SkScalerContext_Mac::generateImage(const SkGlyph& glyph) { int r = (addr[x] >> 16) & 0xFF; int g = (addr[x] >> 8) & 0xFF; int b = (addr[x] >> 0) & 0xFF; - addr[x] = (table[r] << 16) | (table[g] << 8) | table[b]; + addr[x] = (linear[r] << 16) | (linear[g] << 8) | linear[b]; } addr = SkTAddOffset<CGRGBPixel>(addr, cgRowBytes); } |