1
2 /*
3 * Copyright 2006 The Android Open Source Project
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
10 #include "SkGraphics.h"
11
12 #include "Sk64.h"
13 #include "SkBlitter.h"
14 #include "SkCanvas.h"
15 #include "SkFloat.h"
16 #include "SkGeometry.h"
17 #include "SkMath.h"
18 #include "SkMatrix.h"
19 #include "SkPath.h"
20 #include "SkPathEffect.h"
21 #include "SkPixelRef.h"
22 #include "SkRandom.h"
23 #include "SkRefCnt.h"
24 #include "SkScalerContext.h"
25 #include "SkShader.h"
26 #include "SkStream.h"
27 #include "SkTSearch.h"
28 #include "SkTime.h"
29 #include "SkUtils.h"
30 #include "SkXfermode.h"
31
GetVersion(int32_t * major,int32_t * minor,int32_t * patch)32 void SkGraphics::GetVersion(int32_t* major, int32_t* minor, int32_t* patch) {
33 if (major) {
34 *major = SKIA_VERSION_MAJOR;
35 }
36 if (minor) {
37 *minor = SKIA_VERSION_MINOR;
38 }
39 if (patch) {
40 *patch = SKIA_VERSION_PATCH;
41 }
42 }
43
44 #define typesizeline(type) { #type , sizeof(type) }
45
46 #ifdef BUILD_EMBOSS_TABLE
47 extern void SkEmbossMask_BuildTable();
48 #endif
49
50 #ifdef BUILD_RADIALGRADIENT_TABLE
51 extern void SkRadialGradient_BuildTable();
52 #endif
53
Init()54 void SkGraphics::Init() {
55 #if !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
56 SkFlattenable::InitializeFlattenables();
57 SkPixelRef::InitializeFlattenables();
58 #endif
59 #ifdef BUILD_EMBOSS_TABLE
60 SkEmbossMask_BuildTable();
61 #endif
62 #ifdef BUILD_RADIALGRADIENT_TABLE
63 SkRadialGradient_BuildTable();
64 #endif
65
66 #ifdef SK_DEBUGx
67 int i;
68
69 static const struct {
70 const char* fTypeName;
71 size_t fSizeOf;
72 } gTypeSize[] = {
73 typesizeline(char),
74 typesizeline(short),
75 typesizeline(int),
76 typesizeline(long),
77 typesizeline(size_t),
78 typesizeline(void*),
79
80 typesizeline(S8CPU),
81 typesizeline(U8CPU),
82 typesizeline(S16CPU),
83 typesizeline(U16CPU),
84
85 typesizeline(SkPoint),
86 typesizeline(SkRect),
87 typesizeline(SkMatrix),
88 typesizeline(SkPath),
89 typesizeline(SkGlyph),
90 typesizeline(SkRefCnt),
91
92 typesizeline(SkPaint),
93 typesizeline(SkCanvas),
94 typesizeline(SkBlitter),
95 typesizeline(SkShader),
96 typesizeline(SkXfermode),
97 typesizeline(SkPathEffect)
98 };
99
100 #ifdef SK_CPU_BENDIAN
101 SkDebugf("SkGraphics: big-endian\n");
102 #else
103 SkDebugf("SkGraphics: little-endian\n");
104 #endif
105
106 {
107 char test = 0xFF;
108 int itest = test; // promote to int, see if it sign-extended
109 if (itest < 0)
110 SkDebugf("SkGraphics: char is signed\n");
111 else
112 SkDebugf("SkGraphics: char is unsigned\n");
113 }
114 for (i = 0; i < (int)SK_ARRAY_COUNT(gTypeSize); i++) {
115 SkDebugf("SkGraphics: sizeof(%s) = %d\n",
116 gTypeSize[i].fTypeName, gTypeSize[i].fSizeOf);
117 }
118 SkDebugf("SkGraphics: font cache limit %dK\n",
119 GetFontCacheLimit() >> 10);
120
121 #endif
122 }
123
124 ///////////////////////////////////////////////////////////////////////////////
125
126 #include "SkGlyphCache.h"
127 #include "SkTypefaceCache.h"
128
Term()129 void SkGraphics::Term() {
130 PurgeFontCache();
131 }
132
133 #ifndef SK_DEFAULT_FONT_CACHE_LIMIT
134 #define SK_DEFAULT_FONT_CACHE_LIMIT (2 * 1024 * 1024)
135 #endif
136
137 #define SK_MIN_FONT_CACHE_LIMIT (256 * 1024)
138
139 static size_t gFontCacheLimit = SK_DEFAULT_FONT_CACHE_LIMIT;
140
GetFontCacheLimit()141 size_t SkGraphics::GetFontCacheLimit() {
142 return gFontCacheLimit;
143 }
144
SetFontCacheLimit(size_t bytes)145 size_t SkGraphics::SetFontCacheLimit(size_t bytes) {
146 size_t prev = gFontCacheLimit;
147
148 if (bytes < SK_MIN_FONT_CACHE_LIMIT) {
149 bytes = SK_MIN_FONT_CACHE_LIMIT;
150 }
151 gFontCacheLimit = bytes;
152
153 // trigger a purge if the new size is smaller that our currently used amount
154 if (bytes < SkGlyphCache::GetCacheUsed()) {
155 SkGlyphCache::SetCacheUsed(bytes);
156 }
157 return prev;
158 }
159
PurgeFontCache()160 void SkGraphics::PurgeFontCache() {
161 SkGlyphCache::SetCacheUsed(0);
162 SkTypefaceCache::PurgeAll();
163 }
164
165 ///////////////////////////////////////////////////////////////////////////////
166
167 static const char kFontCacheLimitStr[] = "font-cache-limit";
168 static const size_t kFontCacheLimitLen = sizeof(kFontCacheLimitStr) - 1;
169
170 static const struct {
171 const char* fStr;
172 size_t fLen;
173 size_t (*fFunc)(size_t);
174 } gFlags[] = {
175 {kFontCacheLimitStr, kFontCacheLimitLen, SkGraphics::SetFontCacheLimit}
176 };
177
178 /* flags are of the form param; or param=value; */
SetFlags(const char * flags)179 void SkGraphics::SetFlags(const char* flags) {
180 if (!flags) {
181 return;
182 }
183 const char* nextSemi;
184 do {
185 size_t len = strlen(flags);
186 const char* paramEnd = flags + len;
187 const char* nextEqual = strchr(flags, '=');
188 if (nextEqual && paramEnd > nextEqual) {
189 paramEnd = nextEqual;
190 }
191 nextSemi = strchr(flags, ';');
192 if (nextSemi && paramEnd > nextSemi) {
193 paramEnd = nextSemi;
194 }
195 size_t paramLen = paramEnd - flags;
196 for (int i = 0; i < (int)SK_ARRAY_COUNT(gFlags); ++i) {
197 if (paramLen != gFlags[i].fLen) {
198 continue;
199 }
200 if (strncmp(flags, gFlags[i].fStr, paramLen) == 0) {
201 size_t val = 0;
202 if (nextEqual) {
203 val = (size_t) atoi(nextEqual + 1);
204 }
205 (gFlags[i].fFunc)(val);
206 break;
207 }
208 }
209 flags = nextSemi + 1;
210 } while (nextSemi);
211 }
212