add API to change max pointsize for font cache
Bug: skia:6585 Change-Id: I6df8c439dca0a154e8fbfce6d66c536665dff1d7 Reviewed-on: https://skia-review.googlesource.com/18314 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Mike Reed <reed@google.com>
This commit is contained in:
parent
c3cbd734f0
commit
d5bee5d50c
@ -72,6 +72,30 @@ public:
|
|||||||
*/
|
*/
|
||||||
static int SetFontCacheCountLimit(int count);
|
static int SetFontCacheCountLimit(int count);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns the maximum point size for text that may be cached.
|
||||||
|
*
|
||||||
|
* Sizes above this will be drawn directly from the font's outline.
|
||||||
|
* Setting this to a large value may speed up drawing larger text (repeatedly),
|
||||||
|
* but could cause the cache to purge other sizes more often.
|
||||||
|
*
|
||||||
|
* This value is a hint to the font engine, and the actual limit may be different due to
|
||||||
|
* implementation specific details.
|
||||||
|
*/
|
||||||
|
static int GetFontCachePointSizeLimit();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the maximum point size for text that may be cached, returning the previous value.
|
||||||
|
*
|
||||||
|
* Sizes above this will be drawn directly from the font's outline.
|
||||||
|
* Setting this to a large value may speed up drawing larger text (repeatedly),
|
||||||
|
* but could cause the cache to purge other sizes more often.
|
||||||
|
*
|
||||||
|
* This value is a hint to the font engine, and the actual limit may be different due to
|
||||||
|
* implementation specific details.
|
||||||
|
*/
|
||||||
|
static int SetFontCachePointSizeLimit(int maxPointSize);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For debugging purposes, this will attempt to purge the font cache. It
|
* For debugging purposes, this will attempt to purge the font cache. It
|
||||||
* does not change the limit, but will cause subsequent font measures and
|
* does not change the limit, but will cause subsequent font measures and
|
||||||
|
@ -1110,13 +1110,6 @@ private:
|
|||||||
* need not match per-se.
|
* need not match per-se.
|
||||||
*/
|
*/
|
||||||
kCanonicalTextSizeForPaths = 64,
|
kCanonicalTextSizeForPaths = 64,
|
||||||
|
|
||||||
/*
|
|
||||||
* Above this size (taking into account CTM and textSize), we never use
|
|
||||||
* the cache for bits or metrics (we might overflow), so we just ask
|
|
||||||
* for a caononical size and post-transform that.
|
|
||||||
*/
|
|
||||||
kMaxSizeForGlyphCache = 256,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool TooBigToUseCache(const SkMatrix& ctm, const SkMatrix& textM);
|
static bool TooBigToUseCache(const SkMatrix& ctm, const SkMatrix& textM);
|
||||||
@ -1126,11 +1119,7 @@ private:
|
|||||||
// have change it to kCanonicalTextSizeForPaths.
|
// have change it to kCanonicalTextSizeForPaths.
|
||||||
SkScalar setupForAsPaths();
|
SkScalar setupForAsPaths();
|
||||||
|
|
||||||
static SkScalar MaxCacheSize2() {
|
static SkScalar MaxCacheSize2();
|
||||||
static const SkScalar kMaxSize = SkIntToScalar(kMaxSizeForGlyphCache);
|
|
||||||
static const SkScalar kMag2Max = kMaxSize * kMaxSize;
|
|
||||||
return kMag2Max;
|
|
||||||
}
|
|
||||||
|
|
||||||
friend class SkAutoGlyphCache;
|
friend class SkAutoGlyphCache;
|
||||||
friend class SkAutoGlyphCacheNoGamma;
|
friend class SkAutoGlyphCacheNoGamma;
|
||||||
|
@ -448,6 +448,23 @@ int SkGlyphCache_Globals::setCacheCountLimit(int newCount) {
|
|||||||
return prevCount;
|
return prevCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int SkGlyphCache_Globals::getCachePointSizeLimit() const {
|
||||||
|
SkAutoExclusive ac(fLock);
|
||||||
|
return fPointSizeLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SkGlyphCache_Globals::setCachePointSizeLimit(int newLimit) {
|
||||||
|
if (newLimit < 0) {
|
||||||
|
newLimit = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SkAutoExclusive ac(fLock);
|
||||||
|
|
||||||
|
int prevLimit = fPointSizeLimit;
|
||||||
|
fPointSizeLimit = newLimit;
|
||||||
|
return prevLimit;
|
||||||
|
}
|
||||||
|
|
||||||
void SkGlyphCache_Globals::purgeAll() {
|
void SkGlyphCache_Globals::purgeAll() {
|
||||||
SkAutoExclusive ac(fLock);
|
SkAutoExclusive ac(fLock);
|
||||||
this->internalPurge(fTotalMemoryUsed);
|
this->internalPurge(fTotalMemoryUsed);
|
||||||
@ -775,6 +792,14 @@ int SkGraphics::GetFontCacheCountUsed() {
|
|||||||
return get_globals().getCacheCountUsed();
|
return get_globals().getCacheCountUsed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int SkGraphics::GetFontCachePointSizeLimit() {
|
||||||
|
return get_globals().getCachePointSizeLimit();
|
||||||
|
}
|
||||||
|
|
||||||
|
int SkGraphics::SetFontCachePointSizeLimit(int limit) {
|
||||||
|
return get_globals().setCachePointSizeLimit(limit);
|
||||||
|
}
|
||||||
|
|
||||||
void SkGraphics::PurgeFontCache() {
|
void SkGraphics::PurgeFontCache() {
|
||||||
get_globals().purgeAll();
|
get_globals().purgeAll();
|
||||||
SkTypefaceCache::PurgeAll();
|
SkTypefaceCache::PurgeAll();
|
||||||
|
@ -21,6 +21,10 @@
|
|||||||
#define SK_DEFAULT_FONT_CACHE_LIMIT (2 * 1024 * 1024)
|
#define SK_DEFAULT_FONT_CACHE_LIMIT (2 * 1024 * 1024)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef SK_DEFAULT_FONT_CACHE_POINT_SIZE_LIMIT
|
||||||
|
#define SK_DEFAULT_FONT_CACHE_POINT_SIZE_LIMIT 256
|
||||||
|
#endif
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
class SkGlyphCache_Globals {
|
class SkGlyphCache_Globals {
|
||||||
@ -31,6 +35,7 @@ public:
|
|||||||
fCacheSizeLimit = SK_DEFAULT_FONT_CACHE_LIMIT;
|
fCacheSizeLimit = SK_DEFAULT_FONT_CACHE_LIMIT;
|
||||||
fCacheCount = 0;
|
fCacheCount = 0;
|
||||||
fCacheCountLimit = SK_DEFAULT_FONT_CACHE_COUNT_LIMIT;
|
fCacheCountLimit = SK_DEFAULT_FONT_CACHE_COUNT_LIMIT;
|
||||||
|
fPointSizeLimit = SK_DEFAULT_FONT_CACHE_POINT_SIZE_LIMIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
~SkGlyphCache_Globals() {
|
~SkGlyphCache_Globals() {
|
||||||
@ -62,6 +67,9 @@ public:
|
|||||||
size_t getCacheSizeLimit() const;
|
size_t getCacheSizeLimit() const;
|
||||||
size_t setCacheSizeLimit(size_t limit);
|
size_t setCacheSizeLimit(size_t limit);
|
||||||
|
|
||||||
|
int getCachePointSizeLimit() const;
|
||||||
|
int setCachePointSizeLimit(int limit);
|
||||||
|
|
||||||
void purgeAll(); // does not change budget
|
void purgeAll(); // does not change budget
|
||||||
|
|
||||||
// call when a glyphcache is available for caching (i.e. not in use)
|
// call when a glyphcache is available for caching (i.e. not in use)
|
||||||
@ -77,6 +85,7 @@ private:
|
|||||||
size_t fCacheSizeLimit;
|
size_t fCacheSizeLimit;
|
||||||
int32_t fCacheCountLimit;
|
int32_t fCacheCountLimit;
|
||||||
int32_t fCacheCount;
|
int32_t fCacheCount;
|
||||||
|
int32_t fPointSizeLimit;
|
||||||
|
|
||||||
// Checkout budgets, modulated by the specified min-bytes-needed-to-purge,
|
// Checkout budgets, modulated by the specified min-bytes-needed-to-purge,
|
||||||
// and attempt to purge caches to match.
|
// and attempt to purge caches to match.
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include "SkData.h"
|
#include "SkData.h"
|
||||||
#include "SkDraw.h"
|
#include "SkDraw.h"
|
||||||
#include "SkFontDescriptor.h"
|
#include "SkFontDescriptor.h"
|
||||||
|
#include "SkGraphics.h"
|
||||||
#include "SkGlyphCache.h"
|
#include "SkGlyphCache.h"
|
||||||
#include "SkImageFilter.h"
|
#include "SkImageFilter.h"
|
||||||
#include "SkMaskFilter.h"
|
#include "SkMaskFilter.h"
|
||||||
@ -392,6 +393,12 @@ bool SkPaint::TooBigToUseCache(const SkMatrix& ctm, const SkMatrix& textM) {
|
|||||||
return tooBig(matrix, MaxCacheSize2());
|
return tooBig(matrix, MaxCacheSize2());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SkScalar SkPaint::MaxCacheSize2() {
|
||||||
|
// we have a self-imposed maximum, just for memory-usage sanity
|
||||||
|
const int limit = SkMin32(SkGraphics::GetFontCachePointSizeLimit(), 1024);
|
||||||
|
const SkScalar maxSize = SkIntToScalar(limit);
|
||||||
|
return maxSize * maxSize;
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user