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