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_FONT_RENDERER_H 18 #define ANDROID_HWUI_FONT_RENDERER_H 19 20 #include <utils/Functor.h> 21 #include <utils/LruCache.h> 22 #include <utils/Vector.h> 23 #include <utils/StrongPointer.h> 24 25 #include <SkPaint.h> 26 27 #include <GLES2/gl2.h> 28 29 #include "font/FontUtil.h" 30 #include "font/CacheTexture.h" 31 #include "font/CachedGlyphInfo.h" 32 #include "font/Font.h" 33 #include "utils/SortedList.h" 34 #include "Matrix.h" 35 #include "Properties.h" 36 37 #ifdef ANDROID_ENABLE_RENDERSCRIPT 38 #include "RenderScript.h" 39 namespace RSC { 40 class Element; 41 class RS; 42 class ScriptIntrinsicBlur; 43 class sp; 44 } 45 #endif 46 47 namespace android { 48 namespace uirenderer { 49 50 class OpenGLRenderer; 51 52 /////////////////////////////////////////////////////////////////////////////// 53 // TextSetupFunctor 54 /////////////////////////////////////////////////////////////////////////////// 55 class TextSetupFunctor: public Functor { 56 public: 57 struct Data { DataData58 Data(GLenum glyphFormat) : glyphFormat(glyphFormat) { 59 } 60 61 GLenum glyphFormat; 62 }; 63 TextSetupFunctor(OpenGLRenderer * renderer,float x,float y,bool pureTranslate,int alpha,SkXfermode::Mode mode,const SkPaint * paint)64 TextSetupFunctor(OpenGLRenderer* renderer, float x, float y, bool pureTranslate, 65 int alpha, SkXfermode::Mode mode, const SkPaint* paint): Functor(), 66 renderer(renderer), x(x), y(y), pureTranslate(pureTranslate), 67 alpha(alpha), mode(mode), paint(paint) { 68 } ~TextSetupFunctor()69 ~TextSetupFunctor() { } 70 71 status_t operator ()(int what, void* data); 72 73 OpenGLRenderer* renderer; 74 float x; 75 float y; 76 bool pureTranslate; 77 int alpha; 78 SkXfermode::Mode mode; 79 const SkPaint* paint; 80 }; 81 82 /////////////////////////////////////////////////////////////////////////////// 83 // FontRenderer 84 /////////////////////////////////////////////////////////////////////////////// 85 86 class FontRenderer { 87 public: 88 FontRenderer(); 89 ~FontRenderer(); 90 91 void flushLargeCaches(Vector<CacheTexture*>& cacheTextures); 92 void flushLargeCaches(); 93 setGammaTable(const uint8_t * gammaTable)94 void setGammaTable(const uint8_t* gammaTable) { 95 mGammaTable = gammaTable; 96 } 97 98 void setFont(const SkPaint* paint, const SkMatrix& matrix); 99 100 void precache(const SkPaint* paint, const char* text, int numGlyphs, const SkMatrix& matrix); 101 void endPrecaching(); 102 103 // bounds is an out parameter 104 bool renderPosText(const SkPaint* paint, const Rect* clip, const char *text, 105 uint32_t startIndex, uint32_t len, int numGlyphs, int x, int y, const float* positions, 106 Rect* bounds, Functor* functor, bool forceFinish = true); 107 108 // bounds is an out parameter 109 bool renderTextOnPath(const SkPaint* paint, const Rect* clip, const char *text, 110 uint32_t startIndex, uint32_t len, int numGlyphs, const SkPath* path, 111 float hOffset, float vOffset, Rect* bounds, Functor* functor); 112 113 struct DropShadow { DropShadowDropShadow114 DropShadow() { }; 115 DropShadowDropShadow116 DropShadow(const DropShadow& dropShadow): 117 width(dropShadow.width), height(dropShadow.height), 118 image(dropShadow.image), penX(dropShadow.penX), 119 penY(dropShadow.penY) { 120 } 121 122 uint32_t width; 123 uint32_t height; 124 uint8_t* image; 125 int32_t penX; 126 int32_t penY; 127 }; 128 129 // After renderDropShadow returns, the called owns the memory in DropShadow.image 130 // and is responsible for releasing it when it's done with it 131 DropShadow renderDropShadow(const SkPaint* paint, const char *text, uint32_t startIndex, 132 uint32_t len, int numGlyphs, float radius, const float* positions); 133 setTextureFiltering(bool linearFiltering)134 void setTextureFiltering(bool linearFiltering) { 135 mLinearFiltering = linearFiltering; 136 } 137 138 uint32_t getCacheSize(GLenum format) const; 139 140 private: 141 friend class Font; 142 143 const uint8_t* mGammaTable; 144 145 void allocateTextureMemory(CacheTexture* cacheTexture); 146 void deallocateTextureMemory(CacheTexture* cacheTexture); 147 void initTextTexture(); 148 CacheTexture* createCacheTexture(int width, int height, GLenum format, bool allocate); 149 void cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph, 150 uint32_t *retOriginX, uint32_t *retOriginY, bool precaching); 151 CacheTexture* cacheBitmapInTexture(Vector<CacheTexture*>& cacheTextures, const SkGlyph& glyph, 152 uint32_t* startX, uint32_t* startY); 153 154 void flushAllAndInvalidate(); 155 156 void checkInit(); 157 void initRender(const Rect* clip, Rect* bounds, Functor* functor); 158 void finishRender(); 159 160 void issueDrawCommand(Vector<CacheTexture*>& cacheTextures); 161 void issueDrawCommand(); 162 void appendMeshQuadNoClip(float x1, float y1, float u1, float v1, 163 float x2, float y2, float u2, float v2, 164 float x3, float y3, float u3, float v3, 165 float x4, float y4, float u4, float v4, CacheTexture* texture); 166 void appendMeshQuad(float x1, float y1, float u1, float v1, 167 float x2, float y2, float u2, float v2, 168 float x3, float y3, float u3, float v3, 169 float x4, float y4, float u4, float v4, CacheTexture* texture); 170 void appendRotatedMeshQuad(float x1, float y1, float u1, float v1, 171 float x2, float y2, float u2, float v2, 172 float x3, float y3, float u3, float v3, 173 float x4, float y4, float u4, float v4, CacheTexture* texture); 174 175 void removeFont(const Font* font); 176 177 void checkTextureUpdate(); 178 setTextureDirty()179 void setTextureDirty() { 180 mUploadTexture = true; 181 } 182 183 uint32_t mSmallCacheWidth; 184 uint32_t mSmallCacheHeight; 185 uint32_t mLargeCacheWidth; 186 uint32_t mLargeCacheHeight; 187 188 Vector<CacheTexture*> mACacheTextures; 189 Vector<CacheTexture*> mRGBACacheTextures; 190 191 Font* mCurrentFont; 192 LruCache<Font::FontDescription, Font*> mActiveFonts; 193 194 CacheTexture* mCurrentCacheTexture; 195 196 bool mUploadTexture; 197 198 Functor* mFunctor; 199 const Rect* mClip; 200 Rect* mBounds; 201 bool mDrawn; 202 203 bool mInitialized; 204 205 bool mLinearFiltering; 206 207 #ifdef ANDROID_ENABLE_RENDERSCRIPT 208 // RS constructs 209 RSC::sp<RSC::RS> mRs; 210 RSC::sp<const RSC::Element> mRsElement; 211 RSC::sp<RSC::ScriptIntrinsicBlur> mRsScript; 212 #endif 213 214 static void computeGaussianWeights(float* weights, int32_t radius); 215 static void horizontalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest, 216 int32_t width, int32_t height); 217 static void verticalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest, 218 int32_t width, int32_t height); 219 220 // the input image handle may have its pointer replaced (to avoid copies) 221 void blurImage(uint8_t** image, int32_t width, int32_t height, float radius); 222 }; 223 224 }; // namespace uirenderer 225 }; // namespace android 226 227 #endif // ANDROID_HWUI_FONT_RENDERER_H 228