1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2006 The Android Open Source Project 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkGraphics.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 11cb93a386Sopenharmony_ci#include "include/core/SkMath.h" 12cb93a386Sopenharmony_ci#include "include/core/SkMatrix.h" 13cb93a386Sopenharmony_ci#include "include/core/SkPath.h" 14cb93a386Sopenharmony_ci#include "include/core/SkPathEffect.h" 15cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 16cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 17cb93a386Sopenharmony_ci#include "include/core/SkStream.h" 18cb93a386Sopenharmony_ci#include "include/core/SkTime.h" 19cb93a386Sopenharmony_ci#include "src/core/SkBlitter.h" 20cb93a386Sopenharmony_ci#include "src/core/SkCpu.h" 21cb93a386Sopenharmony_ci#include "src/core/SkGeometry.h" 22cb93a386Sopenharmony_ci#include "src/core/SkImageFilter_Base.h" 23cb93a386Sopenharmony_ci#include "src/core/SkOpts.h" 24cb93a386Sopenharmony_ci#include "src/core/SkResourceCache.h" 25cb93a386Sopenharmony_ci#include "src/core/SkScalerContext.h" 26cb93a386Sopenharmony_ci#include "src/core/SkStrikeCache.h" 27cb93a386Sopenharmony_ci#include "src/core/SkTSearch.h" 28cb93a386Sopenharmony_ci#include "src/core/SkTypefaceCache.h" 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci#include <stdlib.h> 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_civoid SkGraphics::Init() { 33cb93a386Sopenharmony_ci // SkGraphics::Init() must be thread-safe and idempotent. 34cb93a386Sopenharmony_ci SkCpu::CacheRuntimeFeatures(); 35cb93a386Sopenharmony_ci SkOpts::Init(); 36cb93a386Sopenharmony_ci} 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_civoid SkGraphics::DumpMemoryStatistics(SkTraceMemoryDump* dump) { 41cb93a386Sopenharmony_ci SkResourceCache::DumpMemoryStatistics(dump); 42cb93a386Sopenharmony_ci SkStrikeCache::DumpMemoryStatistics(dump); 43cb93a386Sopenharmony_ci} 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_civoid SkGraphics::PurgeAllCaches() { 46cb93a386Sopenharmony_ci SkGraphics::PurgeFontCache(); 47cb93a386Sopenharmony_ci SkGraphics::PurgeResourceCache(); 48cb93a386Sopenharmony_ci SkImageFilter_Base::PurgeCache(); 49cb93a386Sopenharmony_ci} 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_cistatic const char kFontCacheLimitStr[] = "font-cache-limit"; 54cb93a386Sopenharmony_cistatic const size_t kFontCacheLimitLen = sizeof(kFontCacheLimitStr) - 1; 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_cistatic const struct { 57cb93a386Sopenharmony_ci const char* fStr; 58cb93a386Sopenharmony_ci size_t fLen; 59cb93a386Sopenharmony_ci size_t (*fFunc)(size_t); 60cb93a386Sopenharmony_ci} gFlags[] = { 61cb93a386Sopenharmony_ci { kFontCacheLimitStr, kFontCacheLimitLen, SkGraphics::SetFontCacheLimit } 62cb93a386Sopenharmony_ci}; 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci/* flags are of the form param; or param=value; */ 65cb93a386Sopenharmony_civoid SkGraphics::SetFlags(const char* flags) { 66cb93a386Sopenharmony_ci if (!flags) { 67cb93a386Sopenharmony_ci return; 68cb93a386Sopenharmony_ci } 69cb93a386Sopenharmony_ci const char* nextSemi; 70cb93a386Sopenharmony_ci do { 71cb93a386Sopenharmony_ci size_t len = strlen(flags); 72cb93a386Sopenharmony_ci const char* paramEnd = flags + len; 73cb93a386Sopenharmony_ci const char* nextEqual = strchr(flags, '='); 74cb93a386Sopenharmony_ci if (nextEqual && paramEnd > nextEqual) { 75cb93a386Sopenharmony_ci paramEnd = nextEqual; 76cb93a386Sopenharmony_ci } 77cb93a386Sopenharmony_ci nextSemi = strchr(flags, ';'); 78cb93a386Sopenharmony_ci if (nextSemi && paramEnd > nextSemi) { 79cb93a386Sopenharmony_ci paramEnd = nextSemi; 80cb93a386Sopenharmony_ci } 81cb93a386Sopenharmony_ci size_t paramLen = paramEnd - flags; 82cb93a386Sopenharmony_ci for (int i = 0; i < (int)SK_ARRAY_COUNT(gFlags); ++i) { 83cb93a386Sopenharmony_ci if (paramLen != gFlags[i].fLen) { 84cb93a386Sopenharmony_ci continue; 85cb93a386Sopenharmony_ci } 86cb93a386Sopenharmony_ci if (strncmp(flags, gFlags[i].fStr, paramLen) == 0) { 87cb93a386Sopenharmony_ci size_t val = 0; 88cb93a386Sopenharmony_ci if (nextEqual) { 89cb93a386Sopenharmony_ci val = (size_t) atoi(nextEqual + 1); 90cb93a386Sopenharmony_ci } 91cb93a386Sopenharmony_ci (gFlags[i].fFunc)(val); 92cb93a386Sopenharmony_ci break; 93cb93a386Sopenharmony_ci } 94cb93a386Sopenharmony_ci } 95cb93a386Sopenharmony_ci flags = nextSemi + 1; 96cb93a386Sopenharmony_ci } while (nextSemi); 97cb93a386Sopenharmony_ci} 98cb93a386Sopenharmony_ci 99cb93a386Sopenharmony_cisize_t SkGraphics::GetFontCacheLimit() { 100cb93a386Sopenharmony_ci return SkStrikeCache::GlobalStrikeCache()->getCacheSizeLimit(); 101cb93a386Sopenharmony_ci} 102cb93a386Sopenharmony_ci 103cb93a386Sopenharmony_cisize_t SkGraphics::SetFontCacheLimit(size_t bytes) { 104cb93a386Sopenharmony_ci return SkStrikeCache::GlobalStrikeCache()->setCacheSizeLimit(bytes); 105cb93a386Sopenharmony_ci} 106cb93a386Sopenharmony_ci 107cb93a386Sopenharmony_cisize_t SkGraphics::GetFontCacheUsed() { 108cb93a386Sopenharmony_ci return SkStrikeCache::GlobalStrikeCache()->getTotalMemoryUsed(); 109cb93a386Sopenharmony_ci} 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ciint SkGraphics::GetFontCacheCountLimit() { 112cb93a386Sopenharmony_ci return SkStrikeCache::GlobalStrikeCache()->getCacheCountLimit(); 113cb93a386Sopenharmony_ci} 114cb93a386Sopenharmony_ci 115cb93a386Sopenharmony_ciint SkGraphics::SetFontCacheCountLimit(int count) { 116cb93a386Sopenharmony_ci return SkStrikeCache::GlobalStrikeCache()->setCacheCountLimit(count); 117cb93a386Sopenharmony_ci} 118cb93a386Sopenharmony_ci 119cb93a386Sopenharmony_ciint SkGraphics::GetFontCacheCountUsed() { 120cb93a386Sopenharmony_ci return SkStrikeCache::GlobalStrikeCache()->getCacheCountUsed(); 121cb93a386Sopenharmony_ci} 122cb93a386Sopenharmony_ci 123cb93a386Sopenharmony_civoid SkGraphics::PurgeFontCache() { 124cb93a386Sopenharmony_ci SkStrikeCache::GlobalStrikeCache()->purgeAll(); 125cb93a386Sopenharmony_ci SkTypefaceCache::PurgeAll(); 126cb93a386Sopenharmony_ci} 127cb93a386Sopenharmony_ci 128cb93a386Sopenharmony_ciextern bool gSkVMAllowJIT; 129cb93a386Sopenharmony_ci 130cb93a386Sopenharmony_civoid SkGraphics::AllowJIT() { 131cb93a386Sopenharmony_ci gSkVMAllowJIT = true; 132cb93a386Sopenharmony_ci} 133