diff options
author | 2014-06-09 12:04:55 -0700 | |
---|---|---|
committer | 2014-06-09 12:04:55 -0700 | |
commit | 4d517fdbb145cb95e5e935470df331e1b6667cfc (patch) | |
tree | 277a6a4f0296f9a0c49eb6e4f3397bc1ff0d70c1 /src/core/SkGlyphCache.h | |
parent | 8405ef9854858b2527bf03b7e7abb1c0da59411d (diff) |
Gamma correction for distance field text.
Handles both non-LCD and LCD text. Uses a texture to look up the gamma correction values for a given text color or luminance.
BUG=skia:
R=reed@google.com, bungeman@google.com, robertphillips@google.com, bsalomon@google.com
Author: jvanverth@google.com
Review URL: https://codereview.chromium.org/258883002
Diffstat (limited to 'src/core/SkGlyphCache.h')
-rw-r--r-- | src/core/SkGlyphCache.h | 65 |
1 files changed, 50 insertions, 15 deletions
diff --git a/src/core/SkGlyphCache.h b/src/core/SkGlyphCache.h index 8b404dcc09..d18b61a0a9 100644 --- a/src/core/SkGlyphCache.h +++ b/src/core/SkGlyphCache.h @@ -244,37 +244,72 @@ private: friend class SkGlyphCache_Globals; }; -class SkAutoGlyphCache { +class SkAutoGlyphCacheBase { public: - SkAutoGlyphCache(SkGlyphCache* cache) : fCache(cache) {} - SkAutoGlyphCache(SkTypeface* typeface, const SkDescriptor* desc) { + SkGlyphCache* getCache() const { return fCache; } + + void release() { + if (fCache) { + SkGlyphCache::AttachCache(fCache); + fCache = NULL; + } + } + +protected: + // Hide the constructors so we can't create one of these directly. + // Create SkAutoGlyphCache or SkAutoGlyphCacheNoCache instead. + SkAutoGlyphCacheBase(SkGlyphCache* cache) : fCache(cache) {} + SkAutoGlyphCacheBase(SkTypeface* typeface, const SkDescriptor* desc) { fCache = SkGlyphCache::DetachCache(typeface, desc); } + SkAutoGlyphCacheBase(const SkPaint& paint, + const SkDeviceProperties* deviceProperties, + const SkMatrix* matrix) { + fCache = NULL; + } + SkAutoGlyphCacheBase() {} + + SkGlyphCache* fCache; + +private: + static bool DetachProc(const SkGlyphCache*, void*); +}; + +class SkAutoGlyphCache : public SkAutoGlyphCacheBase { +public: + SkAutoGlyphCache(SkGlyphCache* cache) : SkAutoGlyphCacheBase(cache) {} + SkAutoGlyphCache(SkTypeface* typeface, const SkDescriptor* desc) : + SkAutoGlyphCacheBase(typeface, desc) {} SkAutoGlyphCache(const SkPaint& paint, const SkDeviceProperties* deviceProperties, const SkMatrix* matrix) { - fCache = paint.detachCache(deviceProperties, matrix); + fCache = paint.detachCache(deviceProperties, matrix, false); } - ~SkAutoGlyphCache() { + SkAutoGlyphCache() : SkAutoGlyphCacheBase() { if (fCache) { SkGlyphCache::AttachCache(fCache); } } +}; +#define SkAutoGlyphCache(...) SK_REQUIRE_LOCAL_VAR(SkAutoGlyphCache) - SkGlyphCache* getCache() const { return fCache; } - - void release() { +class SkAutoGlyphCacheNoGamma : public SkAutoGlyphCacheBase { +public: + SkAutoGlyphCacheNoGamma(SkGlyphCache* cache) : SkAutoGlyphCacheBase(cache) {} + SkAutoGlyphCacheNoGamma(SkTypeface* typeface, const SkDescriptor* desc) : + SkAutoGlyphCacheBase(typeface, desc) {} + SkAutoGlyphCacheNoGamma(const SkPaint& paint, + const SkDeviceProperties* deviceProperties, + const SkMatrix* matrix) { + fCache = paint.detachCache(deviceProperties, matrix, true); + } + SkAutoGlyphCacheNoGamma() : SkAutoGlyphCacheBase() { if (fCache) { SkGlyphCache::AttachCache(fCache); - fCache = NULL; } } - -private: - SkGlyphCache* fCache; - - static bool DetachProc(const SkGlyphCache*, void*); }; -#define SkAutoGlyphCache(...) SK_REQUIRE_LOCAL_VAR(SkAutoGlyphCache) +#define SkAutoGlyphCacheNoGamma(...) SK_REQUIRE_LOCAL_VAR(SkAutoGlyphCacheNoGamma) + #endif |