|
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 "SkBlitter.h" |
|
13 #include "SkCanvas.h" |
|
14 #include "SkFloat.h" |
|
15 #include "SkGeometry.h" |
|
16 #include "SkMath.h" |
|
17 #include "SkMatrix.h" |
|
18 #include "SkPath.h" |
|
19 #include "SkPathEffect.h" |
|
20 #include "SkPixelRef.h" |
|
21 #include "SkRefCnt.h" |
|
22 #include "SkRTConf.h" |
|
23 #include "SkScalerContext.h" |
|
24 #include "SkShader.h" |
|
25 #include "SkStream.h" |
|
26 #include "SkTSearch.h" |
|
27 #include "SkTime.h" |
|
28 #include "SkUtils.h" |
|
29 #include "SkXfermode.h" |
|
30 |
|
31 void SkGraphics::GetVersion(int32_t* major, int32_t* minor, int32_t* patch) { |
|
32 if (major) { |
|
33 *major = SKIA_VERSION_MAJOR; |
|
34 } |
|
35 if (minor) { |
|
36 *minor = SKIA_VERSION_MINOR; |
|
37 } |
|
38 if (patch) { |
|
39 *patch = SKIA_VERSION_PATCH; |
|
40 } |
|
41 } |
|
42 |
|
43 #define typesizeline(type) { #type , sizeof(type) } |
|
44 |
|
45 #ifdef BUILD_EMBOSS_TABLE |
|
46 extern void SkEmbossMask_BuildTable(); |
|
47 #endif |
|
48 |
|
49 #ifdef BUILD_RADIALGRADIENT_TABLE |
|
50 extern void SkRadialGradient_BuildTable(); |
|
51 #endif |
|
52 |
|
53 void SkGraphics::Init() { |
|
54 #ifdef SK_DEVELOPER |
|
55 skRTConfRegistry().possiblyDumpFile(); |
|
56 skRTConfRegistry().validate(); |
|
57 if (skRTConfRegistry().hasNonDefault()) { |
|
58 SkDebugf("Non-default runtime configuration options:\n"); |
|
59 skRTConfRegistry().printNonDefault(); |
|
60 } |
|
61 #endif |
|
62 |
|
63 #ifdef BUILD_EMBOSS_TABLE |
|
64 SkEmbossMask_BuildTable(); |
|
65 #endif |
|
66 #ifdef BUILD_RADIALGRADIENT_TABLE |
|
67 SkRadialGradient_BuildTable(); |
|
68 #endif |
|
69 |
|
70 #ifdef SK_DEBUGx |
|
71 int i; |
|
72 |
|
73 static const struct { |
|
74 const char* fTypeName; |
|
75 size_t fSizeOf; |
|
76 } gTypeSize[] = { |
|
77 typesizeline(char), |
|
78 typesizeline(short), |
|
79 typesizeline(int), |
|
80 typesizeline(long), |
|
81 typesizeline(size_t), |
|
82 typesizeline(void*), |
|
83 |
|
84 typesizeline(S8CPU), |
|
85 typesizeline(U8CPU), |
|
86 typesizeline(S16CPU), |
|
87 typesizeline(U16CPU), |
|
88 |
|
89 typesizeline(SkPoint), |
|
90 typesizeline(SkRect), |
|
91 typesizeline(SkMatrix), |
|
92 typesizeline(SkPath), |
|
93 typesizeline(SkGlyph), |
|
94 typesizeline(SkRefCnt), |
|
95 |
|
96 typesizeline(SkPaint), |
|
97 typesizeline(SkCanvas), |
|
98 typesizeline(SkBlitter), |
|
99 typesizeline(SkShader), |
|
100 typesizeline(SkXfermode), |
|
101 typesizeline(SkPathEffect) |
|
102 }; |
|
103 |
|
104 #ifdef SK_CPU_BENDIAN |
|
105 SkDebugf("SkGraphics: big-endian\n"); |
|
106 #else |
|
107 SkDebugf("SkGraphics: little-endian\n"); |
|
108 #endif |
|
109 |
|
110 { |
|
111 char test = 0xFF; |
|
112 int itest = test; // promote to int, see if it sign-extended |
|
113 if (itest < 0) |
|
114 SkDebugf("SkGraphics: char is signed\n"); |
|
115 else |
|
116 SkDebugf("SkGraphics: char is unsigned\n"); |
|
117 } |
|
118 for (i = 0; i < (int)SK_ARRAY_COUNT(gTypeSize); i++) { |
|
119 SkDebugf("SkGraphics: sizeof(%s) = %d\n", |
|
120 gTypeSize[i].fTypeName, gTypeSize[i].fSizeOf); |
|
121 } |
|
122 SkDebugf("SkGraphics: font cache limit %dK\n", |
|
123 GetFontCacheLimit() >> 10); |
|
124 |
|
125 #endif |
|
126 |
|
127 } |
|
128 |
|
129 void SkGraphics::Term() { |
|
130 PurgeFontCache(); |
|
131 SkPaint::Term(); |
|
132 SkXfermode::Term(); |
|
133 } |
|
134 |
|
135 /////////////////////////////////////////////////////////////////////////////// |
|
136 |
|
137 static const char kFontCacheLimitStr[] = "font-cache-limit"; |
|
138 static const size_t kFontCacheLimitLen = sizeof(kFontCacheLimitStr) - 1; |
|
139 |
|
140 static const struct { |
|
141 const char* fStr; |
|
142 size_t fLen; |
|
143 size_t (*fFunc)(size_t); |
|
144 } gFlags[] = { |
|
145 { kFontCacheLimitStr, kFontCacheLimitLen, SkGraphics::SetFontCacheLimit } |
|
146 }; |
|
147 |
|
148 /* flags are of the form param; or param=value; */ |
|
149 void SkGraphics::SetFlags(const char* flags) { |
|
150 if (!flags) { |
|
151 return; |
|
152 } |
|
153 const char* nextSemi; |
|
154 do { |
|
155 size_t len = strlen(flags); |
|
156 const char* paramEnd = flags + len; |
|
157 const char* nextEqual = strchr(flags, '='); |
|
158 if (nextEqual && paramEnd > nextEqual) { |
|
159 paramEnd = nextEqual; |
|
160 } |
|
161 nextSemi = strchr(flags, ';'); |
|
162 if (nextSemi && paramEnd > nextSemi) { |
|
163 paramEnd = nextSemi; |
|
164 } |
|
165 size_t paramLen = paramEnd - flags; |
|
166 for (int i = 0; i < (int)SK_ARRAY_COUNT(gFlags); ++i) { |
|
167 if (paramLen != gFlags[i].fLen) { |
|
168 continue; |
|
169 } |
|
170 if (strncmp(flags, gFlags[i].fStr, paramLen) == 0) { |
|
171 size_t val = 0; |
|
172 if (nextEqual) { |
|
173 val = (size_t) atoi(nextEqual + 1); |
|
174 } |
|
175 (gFlags[i].fFunc)(val); |
|
176 break; |
|
177 } |
|
178 } |
|
179 flags = nextSemi + 1; |
|
180 } while (nextSemi); |
|
181 } |