aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ports/SkFontHost_mac.cpp
diff options
context:
space:
mode:
authorGravatar Ben Wagner <bungeman@google.com>2017-10-18 11:30:56 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-10-18 19:43:18 +0000
commit7a0248f738dff64b95dc8e3f13e10984c3c27ebc (patch)
tree32868e17b911cdc0d6a4689ca0eca559bf2da217 /src/ports/SkFontHost_mac.cpp
parent62cbb67a028de74c54940da0a63809c1881d5549 (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.cpp22
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);
}