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