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