GammaFontRenderer.h revision 11718bc17bcfc56dfb9f4362eebf640b025c4415
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#include "Program.h"
24
25namespace android {
26namespace uirenderer {
27
28class GammaFontRenderer {
29public:
30    virtual ~GammaFontRenderer();
31
32    virtual void clear() = 0;
33    virtual void flush() = 0;
34
35    virtual FontRenderer& getFontRenderer(const SkPaint* paint) = 0;
36
37    virtual uint32_t getFontRendererCount() const = 0;
38    virtual uint32_t getFontRendererSize(uint32_t fontRenderer, GLenum format) const = 0;
39
40    virtual void endPrecaching() = 0;
41
42    static GammaFontRenderer* createRenderer();
43
44protected:
45    GammaFontRenderer();
46
47    int mBlackThreshold;
48    int mWhiteThreshold;
49
50    float mGamma;
51};
52
53class LookupGammaFontRenderer: public GammaFontRenderer {
54public:
55    ~LookupGammaFontRenderer() {
56        delete mRenderer;
57    }
58
59    void clear() override {
60        delete mRenderer;
61        mRenderer = nullptr;
62    }
63
64    void flush() override {
65        if (mRenderer) {
66            mRenderer->flushLargeCaches();
67        }
68    }
69
70    FontRenderer& getFontRenderer(const SkPaint* paint) override {
71        if (!mRenderer) {
72            mRenderer = new FontRenderer;
73            mRenderer->setGammaTable(&mGammaTable[0]);
74        }
75        return *mRenderer;
76    }
77
78    uint32_t getFontRendererCount() const override {
79        return 1;
80    }
81
82    uint32_t getFontRendererSize(uint32_t fontRenderer, GLenum format) const override {
83        return mRenderer ? mRenderer->getCacheSize(format) : 0;
84    }
85
86    void endPrecaching() override;
87
88private:
89    LookupGammaFontRenderer();
90
91    FontRenderer* mRenderer;
92    uint8_t mGammaTable[256];
93
94    friend class GammaFontRenderer;
95};
96
97class Lookup3GammaFontRenderer: public GammaFontRenderer {
98public:
99    void clear() override;
100    void flush() override;
101
102    FontRenderer& getFontRenderer(const SkPaint* paint) override;
103
104    uint32_t getFontRendererCount() const override {
105        return kGammaCount;
106    }
107
108    uint32_t getFontRendererSize(uint32_t fontRenderer, GLenum format) const override {
109        if (fontRenderer >= kGammaCount) return 0;
110
111        if (!mRenderers[fontRenderer]) return 0;
112
113        return mRenderers[fontRenderer]->getCacheSize(format);
114    }
115
116    void endPrecaching() override;
117
118private:
119    Lookup3GammaFontRenderer();
120
121    enum Gamma {
122        kGammaDefault = 0,
123        kGammaBlack = 1,
124        kGammaWhite = 2,
125        kGammaCount = 3
126    };
127
128    FontRenderer* getRenderer(Gamma gamma);
129
130    uint32_t mRenderersUsageCount[kGammaCount];
131    std::unique_ptr<FontRenderer> mRenderers[kGammaCount];
132
133    uint8_t mGammaTable[256 * kGammaCount];
134
135    friend class GammaFontRenderer;
136};
137
138}; // namespace uirenderer
139}; // namespace android
140
141#endif // ANDROID_HWUI_GAMMA_FONT_RENDERER_H
142