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
31void 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
53void 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
129void SkGraphics::Term() {
130    PurgeFontCache();
131    PurgeResourceCache();
132    SkPaint::Term();
133}
134
135///////////////////////////////////////////////////////////////////////////////
136
137static const char kFontCacheLimitStr[] = "font-cache-limit";
138static const size_t kFontCacheLimitLen = sizeof(kFontCacheLimitStr) - 1;
139
140static 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; */
149void 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}
182