| Index: src/core/SkPaint.cpp
|
| diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
|
| index 78d947020b20442ac8bafcc63f14d752bf2f0c83..b08b2c6da7471ebc72d5447b6f44f6ad6162d45e 100644
|
| --- a/src/core/SkPaint.cpp
|
| +++ b/src/core/SkPaint.cpp
|
| @@ -1814,10 +1814,8 @@ void SkScalerContext::PostMakeRec(const SkPaint&, SkScalerContext::Rec* rec) {
|
|
|
| /*
|
| * ignoreGamma tells us that the caller just wants metrics that are unaffected
|
| - * by gamma correction, so we jam the luminance field to 0 (most common value
|
| - * for black text) in hopes that we get a cache hit easier. A better solution
|
| - * would be for the fontcache lookup to know to ignore the luminance field
|
| - * entirely, but not sure how to do that and keep it fast.
|
| + * by gamma correction, so we set the rec to ignore preblend: i.e. gamma = 1,
|
| + * contrast = 0, luminanceColor = transparent black.
|
| */
|
| void SkPaint::descriptorProc(const SkDeviceProperties* deviceProperties,
|
| const SkMatrix* deviceMatrix,
|
| @@ -1827,7 +1825,7 @@ void SkPaint::descriptorProc(const SkDeviceProperties* deviceProperties,
|
|
|
| SkScalerContext::MakeRec(*this, deviceProperties, deviceMatrix, &rec);
|
| if (ignoreGamma) {
|
| - rec.setLuminanceColor(0);
|
| + rec.ignorePreBlend();
|
| }
|
|
|
| size_t descSize = sizeof(rec);
|
| @@ -1951,9 +1949,10 @@ void SkPaint::descriptorProc(const SkDeviceProperties* deviceProperties,
|
| }
|
|
|
| SkGlyphCache* SkPaint::detachCache(const SkDeviceProperties* deviceProperties,
|
| - const SkMatrix* deviceMatrix) const {
|
| + const SkMatrix* deviceMatrix,
|
| + bool ignoreGamma) const {
|
| SkGlyphCache* cache;
|
| - this->descriptorProc(deviceProperties, deviceMatrix, DetachDescProc, &cache, false);
|
| + this->descriptorProc(deviceProperties, deviceMatrix, DetachDescProc, &cache, ignoreGamma);
|
| return cache;
|
| }
|
|
|
| @@ -1969,6 +1968,33 @@ SkMaskGamma::PreBlend SkScalerContext::GetMaskPreBlend(const SkScalerContext::Re
|
| return maskGamma.preBlend(rec.getLuminanceColor());
|
| }
|
|
|
| +size_t SkScalerContext::GetGammaLUTSize(SkScalar contrast, SkScalar paintGamma,
|
| + SkScalar deviceGamma, int* width, int* height) {
|
| + SkAutoMutexAcquire ama(gMaskGammaCacheMutex);
|
| + const SkMaskGamma& maskGamma = cachedMaskGamma(contrast,
|
| + paintGamma,
|
| + deviceGamma);
|
| +
|
| + maskGamma.getGammaTableDimensions(width, height);
|
| + size_t size = (*width)*(*height)*sizeof(uint8_t);
|
| +
|
| + return size;
|
| +}
|
| +
|
| +void SkScalerContext::GetGammaLUTData(SkScalar contrast, SkScalar paintGamma, SkScalar deviceGamma,
|
| + void* data) {
|
| + SkAutoMutexAcquire ama(gMaskGammaCacheMutex);
|
| + const SkMaskGamma& maskGamma = cachedMaskGamma(contrast,
|
| + paintGamma,
|
| + deviceGamma);
|
| + int width, height;
|
| + maskGamma.getGammaTableDimensions(&width, &height);
|
| + size_t size = width*height*sizeof(uint8_t);
|
| + const uint8_t* gammaTables = maskGamma.getGammaTables();
|
| + memcpy(data, gammaTables, size);
|
| +}
|
| +
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| #include "SkStream.h"
|
| @@ -2557,7 +2583,7 @@ SkTextToPathIter::SkTextToPathIter( const char text[], size_t length,
|
| fPaint.setPathEffect(NULL);
|
| }
|
|
|
| - fCache = fPaint.detachCache(NULL, NULL);
|
| + fCache = fPaint.detachCache(NULL, NULL, false);
|
|
|
| SkPaint::Style style = SkPaint::kFill_Style;
|
| SkPathEffect* pe = NULL;
|
|
|