• 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 <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