GammaFontRenderer.h revision cf51a4199835e9604aa4c8b3854306f8fbabbf33
1b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy/*
2b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy * Copyright (C) 2010 The Android Open Source Project
3b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy *
4b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy * you may not use this file except in compliance with the License.
6b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy * You may obtain a copy of the License at
7b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy *
8b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy *
10b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy * Unless required by applicable law or agreed to in writing, software
11b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy * See the License for the specific language governing permissions and
14b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy * limitations under the License.
15b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy */
16b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_GAMMA_FONT_RENDERER_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_GAMMA_FONT_RENDERER_H
19b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy
20b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy#include <SkPaint.h>
21b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy
22b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy#include "FontRenderer.h"
234121063313ac0d6f69f6253cac821d0c1c122086Romain Guy#include "Program.h"
24b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy
25b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guynamespace android {
26b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guynamespace uirenderer {
27b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy
28b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guyclass GammaFontRenderer {
29b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guypublic:
30b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    virtual ~GammaFontRenderer();
31b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
32b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    virtual void clear() = 0;
33b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    virtual void flush() = 0;
34b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
35b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    virtual FontRenderer& getFontRenderer(const SkPaint* paint) = 0;
36b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
37b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    virtual uint32_t getFontRendererCount() const = 0;
38b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    virtual uint32_t getFontRendererSize(uint32_t fontRenderer) const = 0;
39b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
404121063313ac0d6f69f6253cac821d0c1c122086Romain Guy    virtual void describe(ProgramDescription& description, const SkPaint* paint) const = 0;
414121063313ac0d6f69f6253cac821d0c1c122086Romain Guy    virtual void setupProgram(ProgramDescription& description, Program* program) const = 0;
424121063313ac0d6f69f6253cac821d0c1c122086Romain Guy
43cf51a4199835e9604aa4c8b3854306f8fbabbf33Romain Guy    virtual void endPrecaching() = 0;
44cf51a4199835e9604aa4c8b3854306f8fbabbf33Romain Guy
45b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    static GammaFontRenderer* createRenderer();
46b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
47b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guyprotected:
48b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy    GammaFontRenderer();
49eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy
50b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    int mBlackThreshold;
51b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    int mWhiteThreshold;
52b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
53b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    float mGamma;
54b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy};
55b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
56b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guyclass ShaderGammaFontRenderer: public GammaFontRenderer {
57b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guypublic:
58b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    ~ShaderGammaFontRenderer() {
59b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy        delete mRenderer;
60b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    }
61b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
62b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    void clear() {
63b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy        delete mRenderer;
640aa87bbfc41e8b5f52de701ac17b4e66a7a7b609Romain Guy        mRenderer = NULL;
65b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    }
66b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
67b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    void flush() {
68b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy        if (mRenderer) {
69b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy            mRenderer->flushLargeCaches();
70b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy        }
71b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    }
72b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
73b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    FontRenderer& getFontRenderer(const SkPaint* paint) {
74b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy        if (!mRenderer) {
75b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy            mRenderer = new FontRenderer;
76b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy        }
77b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy        return *mRenderer;
78b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    }
79b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
80b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    uint32_t getFontRendererCount() const {
81b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy        return 1;
82b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    }
83b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
84b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    uint32_t getFontRendererSize(uint32_t fontRenderer) const {
856e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy        return mRenderer ? mRenderer->getCacheSize() : 0;
86b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    }
87b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
884121063313ac0d6f69f6253cac821d0c1c122086Romain Guy    void describe(ProgramDescription& description, const SkPaint* paint) const;
894121063313ac0d6f69f6253cac821d0c1c122086Romain Guy    void setupProgram(ProgramDescription& description, Program* program) const;
904121063313ac0d6f69f6253cac821d0c1c122086Romain Guy
91cf51a4199835e9604aa4c8b3854306f8fbabbf33Romain Guy    void endPrecaching();
92cf51a4199835e9604aa4c8b3854306f8fbabbf33Romain Guy
93b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guyprivate:
946e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    ShaderGammaFontRenderer(bool multiGamma);
95b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
96b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    FontRenderer* mRenderer;
976e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    bool mMultiGamma;
98b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
99b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    friend class GammaFontRenderer;
100b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy};
101b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
102b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guyclass LookupGammaFontRenderer: public GammaFontRenderer {
103b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guypublic:
1046e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    ~LookupGammaFontRenderer() {
1056e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy        delete mRenderer;
1066e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    }
1076e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy
1086e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    void clear() {
1096e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy        delete mRenderer;
1108801b2fef3bc54db1bbb24748d91c909b901116aRomain Guy        mRenderer = NULL;
1116e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    }
1126e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy
1136e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    void flush() {
1146e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy        if (mRenderer) {
1156e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy            mRenderer->flushLargeCaches();
1166e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy        }
1176e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    }
1186e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy
1196e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    FontRenderer& getFontRenderer(const SkPaint* paint) {
1206e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy        if (!mRenderer) {
1216e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy            mRenderer = new FontRenderer;
1226e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy            mRenderer->setGammaTable(&mGammaTable[0]);
1236e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy        }
1246e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy        return *mRenderer;
1256e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    }
1266e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy
1276e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    uint32_t getFontRendererCount() const {
1286e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy        return 1;
1296e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    }
1306e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy
1316e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    uint32_t getFontRendererSize(uint32_t fontRenderer) const {
1326e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy        return mRenderer ? mRenderer->getCacheSize() : 0;
1336e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    }
1346e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy
1356e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    void describe(ProgramDescription& description, const SkPaint* paint) const {
1366e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    }
1376e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy
1386e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    void setupProgram(ProgramDescription& description, Program* program) const {
1396e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    }
1406e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy
141cf51a4199835e9604aa4c8b3854306f8fbabbf33Romain Guy    void endPrecaching();
142cf51a4199835e9604aa4c8b3854306f8fbabbf33Romain Guy
1436e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guyprivate:
1446e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    LookupGammaFontRenderer();
1456e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy
1466e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    FontRenderer* mRenderer;
1476e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    uint8_t mGammaTable[256];
1486e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy
1496e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    friend class GammaFontRenderer;
1506e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy};
1516e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy
1526e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guyclass Lookup3GammaFontRenderer: public GammaFontRenderer {
1536e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guypublic:
1546e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    ~Lookup3GammaFontRenderer();
155eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy
156eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy    void clear();
157eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy    void flush();
158b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy
159b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy    FontRenderer& getFontRenderer(const SkPaint* paint);
160b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy
161c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    uint32_t getFontRendererCount() const {
162eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy        return kGammaCount;
163c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    }
164c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
165c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    uint32_t getFontRendererSize(uint32_t fontRenderer) const {
166eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy        if (fontRenderer >= kGammaCount) return 0;
167eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy
168eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy        FontRenderer* renderer = mRenderers[fontRenderer];
169eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy        if (!renderer) return 0;
170eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy
1717de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase        return renderer->getCacheSize();
172c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    }
173c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
1744121063313ac0d6f69f6253cac821d0c1c122086Romain Guy    void describe(ProgramDescription& description, const SkPaint* paint) const {
1754121063313ac0d6f69f6253cac821d0c1c122086Romain Guy    }
1764121063313ac0d6f69f6253cac821d0c1c122086Romain Guy
1774121063313ac0d6f69f6253cac821d0c1c122086Romain Guy    void setupProgram(ProgramDescription& description, Program* program) const {
1784121063313ac0d6f69f6253cac821d0c1c122086Romain Guy    }
1794121063313ac0d6f69f6253cac821d0c1c122086Romain Guy
180cf51a4199835e9604aa4c8b3854306f8fbabbf33Romain Guy    void endPrecaching();
181cf51a4199835e9604aa4c8b3854306f8fbabbf33Romain Guy
182b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guyprivate:
1836e25e38e43f9e7f71397dfab7ed32c81c7bf7d46Romain Guy    Lookup3GammaFontRenderer();
184b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
185b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    enum Gamma {
186b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy        kGammaDefault = 0,
187b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy        kGammaBlack = 1,
188b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy        kGammaWhite = 2,
189b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy        kGammaCount = 3
190b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    };
191b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
192eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy    FontRenderer* getRenderer(Gamma gamma);
193eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy
194eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy    uint32_t mRenderersUsageCount[kGammaCount];
195eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy    FontRenderer* mRenderers[kGammaCount];
196b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy
197eca0ca2424afc1e98912405906edfc32f7733e16Romain Guy    uint8_t mGammaTable[256 * kGammaCount];
198b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
199b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    friend class GammaFontRenderer;
200b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy};
201b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy
202b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy}; // namespace uirenderer
203b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy}; // namespace android
204b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy
2055b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_GAMMA_FONT_RENDERER_H
206