Index: src/ports/SkFontHost_mac.cpp |
diff --git a/src/ports/SkFontHost_mac.cpp b/src/ports/SkFontHost_mac.cpp |
index 69f660c8f1554c1626d0780e28a98888248a619c..f47add08186c23abc0607070c22ac7beb43af90a 100644 |
--- a/src/ports/SkFontHost_mac.cpp |
+++ b/src/ports/SkFontHost_mac.cpp |
@@ -42,6 +42,7 @@ |
#include "SkSFNTHeader.h" |
#include "SkStream.h" |
#include "SkString.h" |
+#include "SkTemplates.h" |
#include "SkTypefaceCache.h" |
#include "SkTypeface_mac.h" |
#include "SkUtils.h" |
@@ -827,7 +828,7 @@ CGRGBPixel* Offscreen::getCG(const SkScalerContext_Mac& context, const SkGlyph& |
// If this font might have color glyphs, disable LCD as there's no way to support it. |
// CoreText doesn't tell us which format it ended up using, so we can't detect it. |
- // A8 will be ugly too (white on transparent), but TODO: we can detect gray and set to A8. |
+ // A8 will end up black on transparent, but TODO: we can detect gray and set to A8. |
if (SkMask::kARGB32_Format == glyph.fMaskFormat) { |
doLCD = false; |
} |
@@ -863,9 +864,14 @@ CGRGBPixel* Offscreen::getCG(const SkScalerContext_Mac& context, const SkGlyph& |
CGContextSetTextDrawingMode(fCG, kCGTextFill); |
+#if SK_IGNORE_MAC_FONT_WEIGHT_FIX |
// Draw white on black to create mask. |
// TODO: Draw black on white and invert, CG has a special case codepath. |
CGContextSetGrayFillColor(fCG, 1.0f, 1.0f); |
+#else |
+ // Draw black on white to create mask. (Special path exists to speed this up in CG.) |
+ CGContextSetGrayFillColor(fCG, 0.0f, 1.0f); |
+#endif |
// force our checks below to happen |
fDoAA = !doAA; |
@@ -893,8 +899,14 @@ CGRGBPixel* Offscreen::getCG(const SkScalerContext_Mac& context, const SkGlyph& |
// skip rows based on the glyph's height |
image += (fSize.fHeight - glyph.fHeight) * fSize.fWidth; |
+#if SK_IGNORE_MAC_FONT_WEIGHT_FIX |
// erase to black |
sk_memset_rect32(image, 0, glyph.fWidth, glyph.fHeight, rowBytes); |
+#else |
+ // Erase to white (or transparent black if it's a color glyph, to not composite against white). |
+ uint32_t bgColor = (SkMask::kARGB32_Format != glyph.fMaskFormat) ? 0xFFFFFFFF : 0x00000000; |
+ sk_memset_rect32(image, bgColor, glyph.fWidth, glyph.fHeight, rowBytes); |
+#endif |
float subX = 0; |
float subY = 0; |
@@ -1139,11 +1151,10 @@ void SkScalerContext_Mac::generateMetrics(SkGlyph* glyph) { |
#include "SkColorPriv.h" |
-static void build_power_table(uint8_t table[], float ee) { |
+static void build_power_table(uint8_t table[]) { |
for (int i = 0; i < 256; i++) { |
float x = i / 255.f; |
- x = sk_float_pow(x, ee); |
- int xx = SkScalarRoundToInt(x * 255); |
+ int xx = SkScalarRoundToInt(x * x * 255); |
table[i] = SkToU8(xx); |
} |
} |
@@ -1159,7 +1170,7 @@ static const uint8_t* getInverseGammaTableCoreGraphicSmoothing() { |
static bool gInited; |
static uint8_t gTableCoreGraphicsSmoothing[256]; |
if (!gInited) { |
- build_power_table(gTableCoreGraphicsSmoothing, 2.0f); |
+ build_power_table(gTableCoreGraphicsSmoothing); |
gInited = true; |
} |
return gTableCoreGraphicsSmoothing; |
@@ -1169,7 +1180,11 @@ static void cgpixels_to_bits(uint8_t dst[], const CGRGBPixel src[], int count) { |
while (count > 0) { |
uint8_t mask = 0; |
for (int i = 7; i >= 0; --i) { |
+#if SK_IGNORE_MAC_FONT_WEIGHT_FIX |
mask |= (CGRGBPixel_getAlpha(*src++) >> 7) << i; |
+#else |
+ mask |= ((CGRGBPixel_getAlpha(*src++) >> 7) ^ 0x1) << i; |
+#endif |
if (0 == --count) { |
break; |
} |
@@ -1180,9 +1195,15 @@ static void cgpixels_to_bits(uint8_t dst[], const CGRGBPixel src[], int count) { |
template<bool APPLY_PREBLEND> |
static inline uint8_t rgb_to_a8(CGRGBPixel rgb, const uint8_t* table8) { |
+#if SK_IGNORE_MAC_FONT_WEIGHT_FIX |
U8CPU r = (rgb >> 16) & 0xFF; |
U8CPU g = (rgb >> 8) & 0xFF; |
U8CPU b = (rgb >> 0) & 0xFF; |
+#else |
+ U8CPU r = 0xFF - ((rgb >> 16) & 0xFF); |
+ U8CPU g = 0xFF - ((rgb >> 8) & 0xFF); |
+ U8CPU b = 0xFF - ((rgb >> 0) & 0xFF); |
+#endif |
U8CPU lum = sk_apply_lut_if<APPLY_PREBLEND>(SkComputeLuminance(r, g, b), table8); |
#if SK_SHOW_TEXT_BLIT_COVERAGE |
lum = SkTMax(lum, (U8CPU)0x30); |
@@ -1209,9 +1230,15 @@ template<bool APPLY_PREBLEND> |
static inline uint16_t rgb_to_lcd16(CGRGBPixel rgb, const uint8_t* tableR, |
const uint8_t* tableG, |
const uint8_t* tableB) { |
+#if SK_IGNORE_MAC_FONT_WEIGHT_FIX |
U8CPU r = sk_apply_lut_if<APPLY_PREBLEND>((rgb >> 16) & 0xFF, tableR); |
U8CPU g = sk_apply_lut_if<APPLY_PREBLEND>((rgb >> 8) & 0xFF, tableG); |
U8CPU b = sk_apply_lut_if<APPLY_PREBLEND>((rgb >> 0) & 0xFF, tableB); |
+#else |
+ U8CPU r = sk_apply_lut_if<APPLY_PREBLEND>(0xFF - ((rgb >> 16) & 0xFF), tableR); |
+ U8CPU g = sk_apply_lut_if<APPLY_PREBLEND>(0xFF - ((rgb >> 8) & 0xFF), tableG); |
+ U8CPU b = sk_apply_lut_if<APPLY_PREBLEND>(0xFF - ((rgb >> 0) & 0xFF), tableB); |
+#endif |
#if SK_SHOW_TEXT_BLIT_COVERAGE |
r = SkTMax(r, (U8CPU)0x30); |
g = SkTMax(g, (U8CPU)0x30); |
@@ -1246,10 +1273,6 @@ static SkPMColor cgpixels_to_pmcolor(CGRGBPixel rgb) { |
return SkPackARGB32(a, r, g, b); |
} |
-template <typename T> T* SkTAddByteOffset(T* ptr, size_t byteOffset) { |
- return (T*)((char*)ptr + byteOffset); |
-} |
- |
void SkScalerContext_Mac::generateImage(const SkGlyph& glyph) { |
CGGlyph cgGlyph = (CGGlyph) glyph.getGlyphID(); |
@@ -1263,10 +1286,6 @@ void SkScalerContext_Mac::generateImage(const SkGlyph& glyph) { |
return; |
} |
- //TODO: see if drawing black on white and inverting is faster (at least in |
- //lcd case) as core graphics appears to have special case code for drawing |
- //black text. |
- |
// Fix the glyph |
const bool isLCD = isLCDFormat(glyph.fMaskFormat); |
if (isLCD || (glyph.fMaskFormat == SkMask::kA8_Format && supports_LCD() && generateA8FromLCD)) { |
@@ -1285,7 +1304,7 @@ void SkScalerContext_Mac::generateImage(const SkGlyph& glyph) { |
int b = (addr[x] >> 0) & 0xFF; |
addr[x] = (table[r] << 16) | (table[g] << 8) | table[b]; |
} |
- addr = SkTAddByteOffset(addr, cgRowBytes); |
+ addr = SkTAddOffset<CGRGBPixel>(addr, cgRowBytes); |
} |
} |