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