blob: 8b1d10c842e92af99159693489b48327412d8486 [file] [log] [blame]
Romain Guy694b5192010-07-21 21:33:20 -07001/*
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
Romain Guy5b3b3522010-10-27 18:57:51 -070017#ifndef ANDROID_HWUI_FONT_RENDERER_H
18#define ANDROID_HWUI_FONT_RENDERER_H
Romain Guy694b5192010-07-21 21:33:20 -070019
20#include <utils/String8.h>
Alex Sakhartchouk65ef9092010-07-26 11:09:33 -070021#include <utils/String16.h>
Romain Guy694b5192010-07-21 21:33:20 -070022#include <utils/Vector.h>
23#include <utils/KeyedVector.h>
24
25#include <SkScalerContext.h>
26#include <SkPaint.h>
Romain Guy97771732012-02-28 18:17:02 -080027#include <SkPathMeasure.h>
28#include <SkPoint.h>
Romain Guy694b5192010-07-21 21:33:20 -070029
30#include <GLES2/gl2.h>
31
Romain Guy09147fb2010-07-22 13:08:20 -070032#include "Rect.h"
Romain Guy51769a62010-07-23 00:28:00 -070033#include "Properties.h"
Romain Guy09147fb2010-07-22 13:08:20 -070034
Romain Guy694b5192010-07-21 21:33:20 -070035namespace android {
36namespace uirenderer {
37
Romain Guy726aeba2011-06-01 14:52:00 -070038///////////////////////////////////////////////////////////////////////////////
39// Defines
40///////////////////////////////////////////////////////////////////////////////
41
42#if RENDER_TEXT_AS_GLYPHS
43 typedef uint16_t glyph_t;
Romain Guyae91c4c2012-05-14 14:00:27 -070044 #define TO_GLYPH(g) g
Romain Guy726aeba2011-06-01 14:52:00 -070045 #define GET_METRICS(paint, glyph) paint->getGlyphMetrics(glyph)
46 #define GET_GLYPH(text) nextGlyph((const uint16_t**) &text)
47 #define IS_END_OF_STRING(glyph) false
48#else
49 typedef SkUnichar glyph_t;
Romain Guyae91c4c2012-05-14 14:00:27 -070050 #define TO_GLYPH(g) ((SkUnichar) g)
Romain Guy726aeba2011-06-01 14:52:00 -070051 #define GET_METRICS(paint, glyph) paint->getUnicharMetrics(glyph)
52 #define GET_GLYPH(text) SkUTF16_NextUnichar((const uint16_t**) &text)
53 #define IS_END_OF_STRING(glyph) glyph < 0
54#endif
55
Chet Haasee816bae2012-08-09 13:39:02 -070056#define TEXTURE_BORDER_SIZE 1
57
Romain Guy726aeba2011-06-01 14:52:00 -070058///////////////////////////////////////////////////////////////////////////////
59// Declarations
60///////////////////////////////////////////////////////////////////////////////
61
Romain Guy694b5192010-07-21 21:33:20 -070062class FontRenderer;
63
Chet Haase7de0cb12011-12-05 16:35:38 -080064class CacheTexture {
65public:
Romain Guy0aa87bb2012-07-20 11:14:32 -070066 CacheTexture(uint16_t width, uint16_t height) :
67 mTexture(NULL), mTextureId(0), mWidth(width), mHeight(height),
Romain Guy9d9758a2012-05-14 15:19:58 -070068 mLinearFiltering(false) { }
Chet Haase7de0cb12011-12-05 16:35:38 -080069 ~CacheTexture() {
Romain Guy9d9758a2012-05-14 15:19:58 -070070 if (mTexture) {
Chet Haase7de0cb12011-12-05 16:35:38 -080071 delete[] mTexture;
72 }
Romain Guy9d9758a2012-05-14 15:19:58 -070073 if (mTextureId) {
Chet Haase7de0cb12011-12-05 16:35:38 -080074 glDeleteTextures(1, &mTextureId);
75 }
76 }
77
78 uint8_t* mTexture;
79 GLuint mTextureId;
80 uint16_t mWidth;
81 uint16_t mHeight;
Chet Haase2a47c142011-12-14 15:22:56 -080082 bool mLinearFiltering;
Chet Haase7de0cb12011-12-05 16:35:38 -080083};
84
Chet Haasee816bae2012-08-09 13:39:02 -070085/**
86 * CacheBlock is a noce in a linked list of current free space areas in a CacheTextureLine.
87 * Using CacheBlocks enables us to pack the cache line from top to bottom as well as left to right.
88 * When we add a glyph to the cache, we see if it fits within one of the existing columns that
89 * have already been started (this is the case if the glyph fits vertically as well as
90 * horizontally, and if its width is sufficiently close to the column width to avoid
91 * sub-optimal packing of small glyphs into wide columns). If there is no column in which the
92 * glyph fits, we check the final node, which is the remaining space in the cache line, creating
93 * a new column as appropriate.
94 *
95 * As columns fill up, we remove their CacheBlock from the list to avoid having to check
96 * small blocks in the future.
97 */
98struct CacheBlock {
99 uint16_t mX;
100 uint16_t mY;
101 uint16_t mWidth;
102 uint16_t mHeight;
103 CacheBlock* mNext;
104 CacheBlock* mPrev;
105
106 CacheBlock(uint16_t x, uint16_t y, uint16_t width, uint16_t height, bool empty = false):
107 mX(x), mY(y), mWidth(width), mHeight(height), mNext(NULL), mPrev(NULL)
108 {
109 }
110
111 static CacheBlock* insertBlock(CacheBlock* head, CacheBlock *newBlock);
112
113 static CacheBlock* removeBlock(CacheBlock* head, CacheBlock *blockToRemove);
114
115 void output() {
116 CacheBlock *currBlock = this;
117 while (currBlock) {
118 ALOGD("Block: this, x, y, w, h = %p, %d, %d, %d, %d",
119 currBlock, currBlock->mX, currBlock->mY, currBlock->mWidth, currBlock->mHeight);
120 currBlock = currBlock->mNext;
121 }
122 }
123};
124
Chet Haase7de0cb12011-12-05 16:35:38 -0800125class CacheTextureLine {
126public:
127 CacheTextureLine(uint16_t maxWidth, uint16_t maxHeight, uint32_t currentRow,
Chet Haasee816bae2012-08-09 13:39:02 -0700128 CacheTexture* cacheTexture):
Chet Haase7de0cb12011-12-05 16:35:38 -0800129 mMaxHeight(maxHeight),
130 mMaxWidth(maxWidth),
131 mCurrentRow(currentRow),
Chet Haase7de0cb12011-12-05 16:35:38 -0800132 mDirty(false),
Chet Haasee816bae2012-08-09 13:39:02 -0700133 mNumGlyphs(0),
Romain Guy9d9758a2012-05-14 15:19:58 -0700134 mCacheTexture(cacheTexture) {
Chet Haasee816bae2012-08-09 13:39:02 -0700135 mCacheBlocks = new CacheBlock(TEXTURE_BORDER_SIZE, TEXTURE_BORDER_SIZE,
136 maxWidth - TEXTURE_BORDER_SIZE, maxHeight - TEXTURE_BORDER_SIZE, true);
137 }
138
139 ~CacheTextureLine() {
140 reset();
141 }
142
143 void reset() {
144 // Delete existing cache blocks
145 while (mCacheBlocks != NULL) {
146 CacheBlock* tmpBlock = mCacheBlocks;
147 mCacheBlocks = mCacheBlocks->mNext;
148 delete tmpBlock;
149 }
150 mNumGlyphs = 0;
151 }
152
153 void init() {
154 // reset, then create a new remainder space to start again
155 reset();
156 mCacheBlocks = new CacheBlock(TEXTURE_BORDER_SIZE, TEXTURE_BORDER_SIZE,
157 mMaxWidth - TEXTURE_BORDER_SIZE, mMaxHeight - TEXTURE_BORDER_SIZE, true);
Chet Haase7de0cb12011-12-05 16:35:38 -0800158 }
159
160 bool fitBitmap(const SkGlyph& glyph, uint32_t *retOriginX, uint32_t *retOriginY);
161
162 uint16_t mMaxHeight;
163 uint16_t mMaxWidth;
164 uint32_t mCurrentRow;
Chet Haase7de0cb12011-12-05 16:35:38 -0800165 bool mDirty;
Chet Haasee816bae2012-08-09 13:39:02 -0700166 uint16_t mNumGlyphs;
Romain Guyae91c4c2012-05-14 14:00:27 -0700167 CacheTexture* mCacheTexture;
Chet Haasee816bae2012-08-09 13:39:02 -0700168 CacheBlock* mCacheBlocks;
Chet Haase7de0cb12011-12-05 16:35:38 -0800169};
170
171struct CachedGlyphInfo {
172 // Has the cache been invalidated?
173 bool mIsValid;
174 // Location of the cached glyph in the bitmap
175 // in case we need to resize the texture or
176 // render to bitmap
177 uint32_t mStartX;
178 uint32_t mStartY;
179 uint32_t mBitmapWidth;
180 uint32_t mBitmapHeight;
181 // Also cache texture coords for the quad
182 float mBitmapMinU;
183 float mBitmapMinV;
184 float mBitmapMaxU;
185 float mBitmapMaxV;
186 // Minimize how much we call freetype
187 uint32_t mGlyphIndex;
188 uint32_t mAdvanceX;
189 uint32_t mAdvanceY;
190 // Values below contain a glyph's origin in the bitmap
191 int32_t mBitmapLeft;
192 int32_t mBitmapTop;
193 // Auto-kerning
194 SkFixed mLsbDelta;
195 SkFixed mRsbDelta;
196 CacheTextureLine* mCachedTextureLine;
197};
198
199
Romain Guy726aeba2011-06-01 14:52:00 -0700200///////////////////////////////////////////////////////////////////////////////
201// Font
202///////////////////////////////////////////////////////////////////////////////
203
Romain Guy51769a62010-07-23 00:28:00 -0700204/**
205 * Represents a font, defined by a Skia font id and a font size. A font is used
206 * to generate glyphs and cache them in the FontState.
207 */
Romain Guy694b5192010-07-21 21:33:20 -0700208class Font {
209public:
Romain Guy325a0f92011-01-05 15:26:55 -0800210 enum Style {
Romain Guyc7b25be2011-03-23 14:59:20 -0700211 kFakeBold = 1
Romain Guy325a0f92011-01-05 15:26:55 -0800212 };
213
Romain Guy694b5192010-07-21 21:33:20 -0700214 ~Font();
215
Romain Guy51769a62010-07-23 00:28:00 -0700216 /**
217 * Renders the specified string of text.
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700218 * If bitmap is specified, it will be used as the render target
Romain Guy51769a62010-07-23 00:28:00 -0700219 */
Romain Guy726aeba2011-06-01 14:52:00 -0700220 void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len,
221 int numGlyphs, int x, int y, uint8_t *bitmap = NULL,
222 uint32_t bitmapW = 0, uint32_t bitmapH = 0);
Romain Guy671d6cf2012-01-18 12:39:17 -0800223
224 void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len,
225 int numGlyphs, int x, int y, const float* positions);
226
Romain Guy97771732012-02-28 18:17:02 -0800227 void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len,
228 int numGlyphs, SkPath* path, float hOffset, float vOffset);
229
Romain Guy51769a62010-07-23 00:28:00 -0700230 /**
231 * Creates a new font associated with the specified font state.
232 */
Romain Guy2577db12011-01-18 13:02:38 -0800233 static Font* create(FontRenderer* state, uint32_t fontId, float fontSize,
Romain Guybd496bc2011-08-02 17:32:41 -0700234 int flags, uint32_t italicStyle, uint32_t scaleX, SkPaint::Style style,
235 uint32_t strokeWidth);
Romain Guy694b5192010-07-21 21:33:20 -0700236
237protected:
Romain Guy694b5192010-07-21 21:33:20 -0700238 friend class FontRenderer;
Romain Guy671d6cf2012-01-18 12:39:17 -0800239 typedef void (Font::*RenderGlyph)(CachedGlyphInfo*, int, int, uint8_t*,
240 uint32_t, uint32_t, Rect*, const float*);
Romain Guy694b5192010-07-21 21:33:20 -0700241
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700242 enum RenderMode {
243 FRAMEBUFFER,
244 BITMAP,
245 MEASURE,
246 };
247
Chet Haasee816bae2012-08-09 13:39:02 -0700248 void precache(SkPaint* paint, const char* text, int numGlyphs);
249
Romain Guy726aeba2011-06-01 14:52:00 -0700250 void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len,
251 int numGlyphs, int x, int y, RenderMode mode, uint8_t *bitmap,
Romain Guy671d6cf2012-01-18 12:39:17 -0800252 uint32_t bitmapW, uint32_t bitmapH, Rect *bounds, const float* positions);
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700253
Romain Guy726aeba2011-06-01 14:52:00 -0700254 void measure(SkPaint* paint, const char* text, uint32_t start, uint32_t len,
Raph Levien416a8472012-07-19 22:48:17 -0700255 int numGlyphs, Rect *bounds, const float* positions);
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700256
Chet Haase8668f8a2011-03-02 13:51:36 -0800257 Font(FontRenderer* state, uint32_t fontId, float fontSize, int flags, uint32_t italicStyle,
Romain Guybd496bc2011-08-02 17:32:41 -0700258 uint32_t scaleX, SkPaint::Style style, uint32_t strokeWidth);
Romain Guy694b5192010-07-21 21:33:20 -0700259
Romain Guy726aeba2011-06-01 14:52:00 -0700260 // Cache of glyphs
261 DefaultKeyedVector<glyph_t, CachedGlyphInfo*> mCachedGlyphs;
Romain Guy694b5192010-07-21 21:33:20 -0700262
Chet Haase9a824562011-12-16 15:44:59 -0800263 void invalidateTextureCache(CacheTextureLine *cacheLine = NULL);
Romain Guybd0e6aa2010-07-22 18:50:12 -0700264
Romain Guy726aeba2011-06-01 14:52:00 -0700265 CachedGlyphInfo* cacheGlyph(SkPaint* paint, glyph_t glyph);
Romain Guy671d6cf2012-01-18 12:39:17 -0800266 void updateGlyphCache(SkPaint* paint, const SkGlyph& skiaGlyph, CachedGlyphInfo* glyph);
267
268 void measureCachedGlyph(CachedGlyphInfo* glyph, int x, int y,
269 uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH,
270 Rect* bounds, const float* pos);
271 void drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y,
272 uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH,
273 Rect* bounds, const float* pos);
274 void drawCachedGlyphBitmap(CachedGlyphInfo* glyph, int x, int y,
275 uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH,
276 Rect* bounds, const float* pos);
Romain Guy97771732012-02-28 18:17:02 -0800277 void drawCachedGlyph(CachedGlyphInfo* glyph, float x, float hOffset, float vOffset,
278 SkPathMeasure& measure, SkPoint* position, SkVector* tangent);
Romain Guybd0e6aa2010-07-22 18:50:12 -0700279
Romain Guy726aeba2011-06-01 14:52:00 -0700280 CachedGlyphInfo* getCachedGlyph(SkPaint* paint, glyph_t textUnit);
281
282 static glyph_t nextGlyph(const uint16_t** srcPtr) {
283 const uint16_t* src = *srcPtr;
284 glyph_t g = *src++;
285 *srcPtr = src;
286 return g;
287 }
Alex Sakhartchouk65ef9092010-07-26 11:09:33 -0700288
Romain Guybd0e6aa2010-07-22 18:50:12 -0700289 FontRenderer* mState;
290 uint32_t mFontId;
291 float mFontSize;
Romain Guy325a0f92011-01-05 15:26:55 -0800292 int mFlags;
Romain Guy2577db12011-01-18 13:02:38 -0800293 uint32_t mItalicStyle;
Chet Haase8668f8a2011-03-02 13:51:36 -0800294 uint32_t mScaleX;
Romain Guybd496bc2011-08-02 17:32:41 -0700295 SkPaint::Style mStyle;
296 uint32_t mStrokeWidth;
Romain Guy694b5192010-07-21 21:33:20 -0700297};
298
Romain Guy726aeba2011-06-01 14:52:00 -0700299///////////////////////////////////////////////////////////////////////////////
300// Renderer
301///////////////////////////////////////////////////////////////////////////////
302
Romain Guy694b5192010-07-21 21:33:20 -0700303class FontRenderer {
304public:
305 FontRenderer();
306 ~FontRenderer();
307
Chet Haase9a824562011-12-16 15:44:59 -0800308 void flushLargeCaches();
Romain Guy694b5192010-07-21 21:33:20 -0700309
Romain Guyb45c0c92010-08-26 20:35:23 -0700310 void setGammaTable(const uint8_t* gammaTable) {
311 mGammaTable = gammaTable;
312 }
313
Alex Sakhartchouk65ef9092010-07-26 11:09:33 -0700314 void setFont(SkPaint* paint, uint32_t fontId, float fontSize);
Chet Haasee816bae2012-08-09 13:39:02 -0700315
316 void precache(SkPaint* paint, const char* text, int numGlyphs);
317
Romain Guy671d6cf2012-01-18 12:39:17 -0800318 // bounds is an out parameter
Romain Guy5b3b3522010-10-27 18:57:51 -0700319 bool renderText(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
320 uint32_t len, int numGlyphs, int x, int y, Rect* bounds);
Romain Guy671d6cf2012-01-18 12:39:17 -0800321 // bounds is an out parameter
322 bool renderPosText(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
323 uint32_t len, int numGlyphs, int x, int y, const float* positions, Rect* bounds);
Romain Guy97771732012-02-28 18:17:02 -0800324 // bounds is an out parameter
325 bool renderTextOnPath(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
326 uint32_t len, int numGlyphs, SkPath* path, float hOffset, float vOffset, Rect* bounds);
Romain Guy694b5192010-07-21 21:33:20 -0700327
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700328 struct DropShadow {
Romain Guy1e45aae2010-08-13 19:39:53 -0700329 DropShadow() { };
330
331 DropShadow(const DropShadow& dropShadow):
332 width(dropShadow.width), height(dropShadow.height),
333 image(dropShadow.image), penX(dropShadow.penX),
334 penY(dropShadow.penY) {
335 }
336
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700337 uint32_t width;
338 uint32_t height;
339 uint8_t* image;
340 int32_t penX;
341 int32_t penY;
342 };
343
344 // After renderDropShadow returns, the called owns the memory in DropShadow.image
345 // and is responsible for releasing it when it's done with it
346 DropShadow renderDropShadow(SkPaint* paint, const char *text, uint32_t startIndex,
Raph Levien416a8472012-07-19 22:48:17 -0700347 uint32_t len, int numGlyphs, uint32_t radius, const float* positions);
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700348
Romain Guye8cb9c142010-10-04 14:14:11 -0700349 GLuint getTexture(bool linearFiltering = false) {
Romain Guy694b5192010-07-21 21:33:20 -0700350 checkInit();
Romain Guyae91c4c2012-05-14 14:00:27 -0700351
Chet Haase2a47c142011-12-14 15:22:56 -0800352 if (linearFiltering != mCurrentCacheTexture->mLinearFiltering) {
353 mCurrentCacheTexture->mLinearFiltering = linearFiltering;
Romain Guye8cb9c142010-10-04 14:14:11 -0700354 mLinearFiltering = linearFiltering;
355 const GLenum filtering = linearFiltering ? GL_LINEAR : GL_NEAREST;
356
Chet Haase7de0cb12011-12-05 16:35:38 -0800357 glBindTexture(GL_TEXTURE_2D, mCurrentCacheTexture->mTextureId);
Romain Guye8cb9c142010-10-04 14:14:11 -0700358 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);
359 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
360 }
Romain Guyae91c4c2012-05-14 14:00:27 -0700361
Chet Haase7de0cb12011-12-05 16:35:38 -0800362 return mCurrentCacheTexture->mTextureId;
Romain Guy694b5192010-07-21 21:33:20 -0700363 }
364
Chet Haase7de0cb12011-12-05 16:35:38 -0800365 uint32_t getCacheSize() const {
366 uint32_t size = 0;
367 if (mCacheTextureSmall != NULL && mCacheTextureSmall->mTexture != NULL) {
368 size += mCacheTextureSmall->mWidth * mCacheTextureSmall->mHeight;
369 }
370 if (mCacheTexture128 != NULL && mCacheTexture128->mTexture != NULL) {
371 size += mCacheTexture128->mWidth * mCacheTexture128->mHeight;
372 }
373 if (mCacheTexture256 != NULL && mCacheTexture256->mTexture != NULL) {
374 size += mCacheTexture256->mWidth * mCacheTexture256->mHeight;
375 }
376 if (mCacheTexture512 != NULL && mCacheTexture512->mTexture != NULL) {
377 size += mCacheTexture512->mWidth * mCacheTexture512->mHeight;
378 }
379 return size;
Romain Guyc15008e2010-11-10 11:59:15 -0800380 }
381
Romain Guy694b5192010-07-21 21:33:20 -0700382protected:
383 friend class Font;
384
Romain Guyb45c0c92010-08-26 20:35:23 -0700385 const uint8_t* mGammaTable;
386
Chet Haase2a47c142011-12-14 15:22:56 -0800387 void allocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase9a824562011-12-16 15:44:59 -0800388 void deallocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase7de0cb12011-12-05 16:35:38 -0800389 void initTextTexture();
Romain Guy97771732012-02-28 18:17:02 -0800390 CacheTexture* createCacheTexture(int width, int height, bool allocate);
Chet Haase7de0cb12011-12-05 16:35:38 -0800391 void cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph,
392 uint32_t *retOriginX, uint32_t *retOriginY);
Romain Guy694b5192010-07-21 21:33:20 -0700393
394 void flushAllAndInvalidate();
395 void initVertexArrayBuffers();
396
397 void checkInit();
Romain Guy671d6cf2012-01-18 12:39:17 -0800398 void initRender(const Rect* clip, Rect* bounds);
399 void finishRender();
Romain Guy694b5192010-07-21 21:33:20 -0700400
401 void issueDrawCommand();
Romain Guy97771732012-02-28 18:17:02 -0800402 void appendMeshQuadNoClip(float x1, float y1, float u1, float v1,
403 float x2, float y2, float u2, float v2,
404 float x3, float y3, float u3, float v3,
405 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guyd71dd362011-12-12 19:03:35 -0800406 void appendMeshQuad(float x1, float y1, float u1, float v1,
407 float x2, float y2, float u2, float v2,
408 float x3, float y3, float u3, float v3,
Chet Haase7de0cb12011-12-05 16:35:38 -0800409 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy97771732012-02-28 18:17:02 -0800410 void appendRotatedMeshQuad(float x1, float y1, float u1, float v1,
411 float x2, float y2, float u2, float v2,
412 float x3, float y3, float u3, float v3,
413 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy694b5192010-07-21 21:33:20 -0700414
Chet Haase7de0cb12011-12-05 16:35:38 -0800415 uint32_t mSmallCacheWidth;
416 uint32_t mSmallCacheHeight;
Romain Guy694b5192010-07-21 21:33:20 -0700417
Romain Guy694b5192010-07-21 21:33:20 -0700418 Vector<CacheTextureLine*> mCacheLines;
419
Romain Guy09147fb2010-07-22 13:08:20 -0700420 Font* mCurrentFont;
Romain Guy694b5192010-07-21 21:33:20 -0700421 Vector<Font*> mActiveFonts;
422
Chet Haase7de0cb12011-12-05 16:35:38 -0800423 CacheTexture* mCurrentCacheTexture;
424 CacheTexture* mLastCacheTexture;
425 CacheTexture* mCacheTextureSmall;
426 CacheTexture* mCacheTexture128;
427 CacheTexture* mCacheTexture256;
428 CacheTexture* mCacheTexture512;
429
Alex Sakhartchouk9b9902d2010-07-23 14:45:49 -0700430 void checkTextureUpdate();
Romain Guy694b5192010-07-21 21:33:20 -0700431 bool mUploadTexture;
432
433 // Pointer to vertex data to speed up frame to frame work
434 float *mTextMeshPtr;
435 uint32_t mCurrentQuadIndex;
436 uint32_t mMaxNumberOfQuads;
437
438 uint32_t mIndexBufferID;
439
Romain Guy09147fb2010-07-22 13:08:20 -0700440 const Rect* mClip;
Romain Guy5b3b3522010-10-27 18:57:51 -0700441 Rect* mBounds;
442 bool mDrawn;
Romain Guy09147fb2010-07-22 13:08:20 -0700443
Romain Guy694b5192010-07-21 21:33:20 -0700444 bool mInitialized;
Alex Sakhartchouk89a524a2010-08-02 17:52:30 -0700445
Romain Guye8cb9c142010-10-04 14:14:11 -0700446 bool mLinearFiltering;
447
Alex Sakhartchouk89a524a2010-08-02 17:52:30 -0700448 void computeGaussianWeights(float* weights, int32_t radius);
449 void horizontalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700450 int32_t width, int32_t height);
Alex Sakhartchouk89a524a2010-08-02 17:52:30 -0700451 void verticalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700452 int32_t width, int32_t height);
Alex Sakhartchouk89a524a2010-08-02 17:52:30 -0700453 void blurImage(uint8_t* image, int32_t width, int32_t height, int32_t radius);
Romain Guy694b5192010-07-21 21:33:20 -0700454};
455
456}; // namespace uirenderer
457}; // namespace android
458
Romain Guy5b3b3522010-10-27 18:57:51 -0700459#endif // ANDROID_HWUI_FONT_RENDERER_H