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