• 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/Vector.h>
21 
22 #include <SkPaint.h>
23 
24 #include <GLES2/gl2.h>
25 
26 #include "font/FontUtil.h"
27 #include "font/CacheTexture.h"
28 #include "font/CachedGlyphInfo.h"
29 #include "font/Font.h"
30 #include "Properties.h"
31 
32 namespace android {
33 namespace uirenderer {
34 
35 ///////////////////////////////////////////////////////////////////////////////
36 // Renderer
37 ///////////////////////////////////////////////////////////////////////////////
38 
39 class FontRenderer {
40 public:
41     FontRenderer();
42     ~FontRenderer();
43 
44     void flushLargeCaches();
45 
setGammaTable(const uint8_t * gammaTable)46     void setGammaTable(const uint8_t* gammaTable) {
47         mGammaTable = gammaTable;
48     }
49 
50     void setFont(SkPaint* paint, uint32_t fontId, float fontSize);
51 
52     void precache(SkPaint* paint, const char* text, int numGlyphs);
53 
54     // bounds is an out parameter
55     bool renderText(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
56             uint32_t len, int numGlyphs, int x, int y, Rect* bounds);
57     // bounds is an out parameter
58     bool renderPosText(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
59             uint32_t len, int numGlyphs, int x, int y, const float* positions, Rect* bounds);
60     // bounds is an out parameter
61     bool renderTextOnPath(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
62             uint32_t len, int numGlyphs, SkPath* path, float hOffset, float vOffset, Rect* bounds);
63 
64     struct DropShadow {
DropShadowDropShadow65         DropShadow() { };
66 
DropShadowDropShadow67         DropShadow(const DropShadow& dropShadow):
68             width(dropShadow.width), height(dropShadow.height),
69             image(dropShadow.image), penX(dropShadow.penX),
70             penY(dropShadow.penY) {
71         }
72 
73         uint32_t width;
74         uint32_t height;
75         uint8_t* image;
76         int32_t penX;
77         int32_t penY;
78     };
79 
80     // After renderDropShadow returns, the called owns the memory in DropShadow.image
81     // and is responsible for releasing it when it's done with it
82     DropShadow renderDropShadow(SkPaint* paint, const char *text, uint32_t startIndex,
83             uint32_t len, int numGlyphs, uint32_t radius, const float* positions);
84 
85     GLuint getTexture(bool linearFiltering = false) {
86         checkInit();
87 
88         mCurrentCacheTexture->setLinearFiltering(linearFiltering);
89         mLinearFiltering = linearFiltering;
90 
91         return mCurrentCacheTexture->getTextureId();
92     }
93 
getCacheSize()94     uint32_t getCacheSize() const {
95         uint32_t size = 0;
96         for (uint32_t i = 0; i < mCacheTextures.size(); i++) {
97             CacheTexture* cacheTexture = mCacheTextures[i];
98             if (cacheTexture && cacheTexture->getTexture()) {
99                 size += cacheTexture->getWidth() * cacheTexture->getHeight();
100             }
101         }
102         return size;
103     }
104 
105 private:
106     friend class Font;
107 
108     const uint8_t* mGammaTable;
109 
110     void allocateTextureMemory(CacheTexture* cacheTexture);
111     void deallocateTextureMemory(CacheTexture* cacheTexture);
112     void initTextTexture();
113     CacheTexture* createCacheTexture(int width, int height, bool allocate);
114     void cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph,
115             uint32_t *retOriginX, uint32_t *retOriginY, bool precaching);
116     CacheTexture* cacheBitmapInTexture(const SkGlyph& glyph, uint32_t* startX, uint32_t* startY);
117 
118     void flushAllAndInvalidate();
119     void initVertexArrayBuffers();
120 
121     void checkInit();
122     void initRender(const Rect* clip, Rect* bounds);
123     void finishRender();
124 
125     void issueDrawCommand();
126     void appendMeshQuadNoClip(float x1, float y1, float u1, float v1,
127             float x2, float y2, float u2, float v2,
128             float x3, float y3, float u3, float v3,
129             float x4, float y4, float u4, float v4, CacheTexture* texture);
130     void appendMeshQuad(float x1, float y1, float u1, float v1,
131             float x2, float y2, float u2, float v2,
132             float x3, float y3, float u3, float v3,
133             float x4, float y4, float u4, float v4, CacheTexture* texture);
134     void appendRotatedMeshQuad(float x1, float y1, float u1, float v1,
135             float x2, float y2, float u2, float v2,
136             float x3, float y3, float u3, float v3,
137             float x4, float y4, float u4, float v4, CacheTexture* texture);
138 
139     void removeFont(const Font* font);
140 
141     void checkTextureUpdate();
142 
setTextureDirty()143     void setTextureDirty() {
144         mUploadTexture = true;
145     }
146 
147     uint32_t mSmallCacheWidth;
148     uint32_t mSmallCacheHeight;
149     uint32_t mLargeCacheWidth;
150     uint32_t mLargeCacheHeight;
151 
152     Vector<CacheTexture*> mCacheTextures;
153 
154     Font* mCurrentFont;
155     Vector<Font*> mActiveFonts;
156 
157     CacheTexture* mCurrentCacheTexture;
158     CacheTexture* mLastCacheTexture;
159 
160     bool mUploadTexture;
161 
162     // Pointer to vertex data to speed up frame to frame work
163     float* mTextMesh;
164     uint32_t mCurrentQuadIndex;
165     uint32_t mMaxNumberOfQuads;
166 
167     uint32_t mIndexBufferID;
168 
169     const Rect* mClip;
170     Rect* mBounds;
171     bool mDrawn;
172 
173     bool mInitialized;
174 
175     bool mLinearFiltering;
176 
177     /** We should consider multi-threading this code or using Renderscript **/
178     static void computeGaussianWeights(float* weights, int32_t radius);
179     static void horizontalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
180             int32_t width, int32_t height);
181     static void verticalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
182             int32_t width, int32_t height);
183     static void blurImage(uint8_t* image, int32_t width, int32_t height, int32_t radius);
184 };
185 
186 }; // namespace uirenderer
187 }; // namespace android
188 
189 #endif // ANDROID_HWUI_FONT_RENDERER_H
190