GammaFontRenderer.h revision b1d0a4ed21168fefcb82232c8f22cb95d60acb85
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_HWUI_GAMMA_FONT_RENDERER_H
18#define ANDROID_HWUI_GAMMA_FONT_RENDERER_H
19
20#include <SkPaint.h>
21
22#include "FontRenderer.h"
23
24namespace android {
25namespace uirenderer {
26
27class GammaFontRenderer {
28public:
29    virtual ~GammaFontRenderer();
30
31    virtual void clear() = 0;
32    virtual void flush() = 0;
33
34    virtual FontRenderer& getFontRenderer(const SkPaint* paint) = 0;
35
36    virtual uint32_t getFontRendererCount() const = 0;
37
38    virtual uint32_t getFontRendererSize(uint32_t fontRenderer) const = 0;
39
40    static GammaFontRenderer* createRenderer();
41
42protected:
43    GammaFontRenderer();
44
45    int mBlackThreshold;
46    int mWhiteThreshold;
47
48    float mGamma;
49};
50
51class ShaderGammaFontRenderer: public GammaFontRenderer {
52public:
53    ~ShaderGammaFontRenderer() {
54        delete mRenderer;
55    }
56
57    void clear() {
58        delete mRenderer;
59    }
60
61    void flush() {
62        if (mRenderer) {
63            mRenderer->flushLargeCaches();
64        }
65    }
66
67    FontRenderer& getFontRenderer(const SkPaint* paint) {
68        if (!mRenderer) {
69            mRenderer = new FontRenderer;
70        }
71        return *mRenderer;
72    }
73
74    uint32_t getFontRendererCount() const {
75        return 1;
76    }
77
78    uint32_t getFontRendererSize(uint32_t fontRenderer) const {
79        return mRenderer->getCacheSize();
80    }
81
82private:
83    ShaderGammaFontRenderer();
84
85    FontRenderer* mRenderer;
86
87    friend class GammaFontRenderer;
88};
89
90class LookupGammaFontRenderer: public GammaFontRenderer {
91public:
92    ~LookupGammaFontRenderer();
93
94    void clear();
95    void flush();
96
97    FontRenderer& getFontRenderer(const SkPaint* paint);
98
99    uint32_t getFontRendererCount() const {
100        return kGammaCount;
101    }
102
103    uint32_t getFontRendererSize(uint32_t fontRenderer) const {
104        if (fontRenderer >= kGammaCount) return 0;
105
106        FontRenderer* renderer = mRenderers[fontRenderer];
107        if (!renderer) return 0;
108
109        return renderer->getCacheSize();
110    }
111
112private:
113    LookupGammaFontRenderer();
114
115    enum Gamma {
116        kGammaDefault = 0,
117        kGammaBlack = 1,
118        kGammaWhite = 2,
119        kGammaCount = 3
120    };
121
122    FontRenderer* getRenderer(Gamma gamma);
123
124    uint32_t mRenderersUsageCount[kGammaCount];
125    FontRenderer* mRenderers[kGammaCount];
126
127    uint8_t mGammaTable[256 * kGammaCount];
128
129    friend class GammaFontRenderer;
130};
131
132}; // namespace uirenderer
133}; // namespace android
134
135#endif // ANDROID_HWUI_GAMMA_FONT_RENDERER_H
136