blob: 3964bca90646e87a683dd06e01ae1fe084b0a58a [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
Romain Guye3a9b242013-01-08 11:15:30 -080020#include <utils/LruCache.h>
Romain Guy694b5192010-07-21 21:33:20 -070021#include <utils/Vector.h>
Romain Guy694b5192010-07-21 21:33:20 -070022
Romain Guy694b5192010-07-21 21:33:20 -070023#include <SkPaint.h>
24
25#include <GLES2/gl2.h>
26
Romain Guy9f5dab32012-09-04 12:55:44 -070027#include "font/FontUtil.h"
28#include "font/CacheTexture.h"
29#include "font/CachedGlyphInfo.h"
30#include "font/Font.h"
Romain Guye3a9b242013-01-08 11:15:30 -080031#include "Matrix.h"
Romain Guy51769a62010-07-23 00:28:00 -070032#include "Properties.h"
Romain Guy09147fb2010-07-22 13:08:20 -070033
Romain Guy694b5192010-07-21 21:33:20 -070034namespace android {
35namespace uirenderer {
36
Romain Guy726aeba2011-06-01 14:52:00 -070037///////////////////////////////////////////////////////////////////////////////
Romain Guy726aeba2011-06-01 14:52:00 -070038// Renderer
39///////////////////////////////////////////////////////////////////////////////
40
Romain Guy694b5192010-07-21 21:33:20 -070041class FontRenderer {
42public:
43 FontRenderer();
44 ~FontRenderer();
45
Chet Haase9a824562011-12-16 15:44:59 -080046 void flushLargeCaches();
Romain Guy694b5192010-07-21 21:33:20 -070047
Romain Guyb45c0c92010-08-26 20:35:23 -070048 void setGammaTable(const uint8_t* gammaTable) {
49 mGammaTable = gammaTable;
50 }
51
Romain Guye3a9b242013-01-08 11:15:30 -080052 void setFont(SkPaint* paint, const mat4& matrix);
Chet Haasee816bae2012-08-09 13:39:02 -070053
Romain Guye3a9b242013-01-08 11:15:30 -080054 void precache(SkPaint* paint, const char* text, int numGlyphs, const mat4& matrix);
Chet Haasee816bae2012-08-09 13:39:02 -070055
Romain Guy671d6cf2012-01-18 12:39:17 -080056 // bounds is an out parameter
Romain Guy671d6cf2012-01-18 12:39:17 -080057 bool renderPosText(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
58 uint32_t len, int numGlyphs, int x, int y, const float* positions, Rect* bounds);
Romain Guy97771732012-02-28 18:17:02 -080059 // bounds is an out parameter
60 bool renderTextOnPath(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
61 uint32_t len, int numGlyphs, SkPath* path, float hOffset, float vOffset, Rect* bounds);
Romain Guy694b5192010-07-21 21:33:20 -070062
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -070063 struct DropShadow {
Romain Guy1e45aae2010-08-13 19:39:53 -070064 DropShadow() { };
65
66 DropShadow(const DropShadow& dropShadow):
67 width(dropShadow.width), height(dropShadow.height),
68 image(dropShadow.image), penX(dropShadow.penX),
69 penY(dropShadow.penY) {
70 }
71
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -070072 uint32_t width;
73 uint32_t height;
74 uint8_t* image;
75 int32_t penX;
76 int32_t penY;
77 };
78
79 // After renderDropShadow returns, the called owns the memory in DropShadow.image
80 // and is responsible for releasing it when it's done with it
81 DropShadow renderDropShadow(SkPaint* paint, const char *text, uint32_t startIndex,
Raph Levien416a8472012-07-19 22:48:17 -070082 uint32_t len, int numGlyphs, uint32_t radius, const float* positions);
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -070083
Romain Guye8cb9c142010-10-04 14:14:11 -070084 GLuint getTexture(bool linearFiltering = false) {
Romain Guy694b5192010-07-21 21:33:20 -070085 checkInit();
Romain Guyae91c4c2012-05-14 14:00:27 -070086
Romain Guy80872462012-09-04 16:42:01 -070087 mCurrentCacheTexture->setLinearFiltering(linearFiltering);
88 mLinearFiltering = linearFiltering;
Romain Guye8cb9c142010-10-04 14:14:11 -070089
Romain Guy80872462012-09-04 16:42:01 -070090 return mCurrentCacheTexture->getTextureId();
Romain Guy694b5192010-07-21 21:33:20 -070091 }
92
Chet Haase7de0cb12011-12-05 16:35:38 -080093 uint32_t getCacheSize() const {
94 uint32_t size = 0;
Chet Haase378e9192012-08-15 15:54:54 -070095 for (uint32_t i = 0; i < mCacheTextures.size(); i++) {
96 CacheTexture* cacheTexture = mCacheTextures[i];
Romain Guy80872462012-09-04 16:42:01 -070097 if (cacheTexture && cacheTexture->getTexture()) {
98 size += cacheTexture->getWidth() * cacheTexture->getHeight();
Chet Haase378e9192012-08-15 15:54:54 -070099 }
Chet Haase7de0cb12011-12-05 16:35:38 -0800100 }
101 return size;
Romain Guyc15008e2010-11-10 11:59:15 -0800102 }
103
Romain Guy9b1204b2012-09-04 15:22:57 -0700104private:
Romain Guy694b5192010-07-21 21:33:20 -0700105 friend class Font;
106
Romain Guyb45c0c92010-08-26 20:35:23 -0700107 const uint8_t* mGammaTable;
108
Chet Haase2a47c142011-12-14 15:22:56 -0800109 void allocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase9a824562011-12-16 15:44:59 -0800110 void deallocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase7de0cb12011-12-05 16:35:38 -0800111 void initTextTexture();
Romain Guy97771732012-02-28 18:17:02 -0800112 CacheTexture* createCacheTexture(int width, int height, bool allocate);
Chet Haase7de0cb12011-12-05 16:35:38 -0800113 void cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph,
Chet Haasef942cf12012-08-30 09:06:46 -0700114 uint32_t *retOriginX, uint32_t *retOriginY, bool precaching);
Chet Haase378e9192012-08-15 15:54:54 -0700115 CacheTexture* cacheBitmapInTexture(const SkGlyph& glyph, uint32_t* startX, uint32_t* startY);
Romain Guy694b5192010-07-21 21:33:20 -0700116
117 void flushAllAndInvalidate();
118 void initVertexArrayBuffers();
119
120 void checkInit();
Romain Guy671d6cf2012-01-18 12:39:17 -0800121 void initRender(const Rect* clip, Rect* bounds);
122 void finishRender();
Romain Guy694b5192010-07-21 21:33:20 -0700123
124 void issueDrawCommand();
Romain Guy97771732012-02-28 18:17:02 -0800125 void appendMeshQuadNoClip(float x1, float y1, float u1, float v1,
126 float x2, float y2, float u2, float v2,
127 float x3, float y3, float u3, float v3,
128 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guyd71dd362011-12-12 19:03:35 -0800129 void appendMeshQuad(float x1, float y1, float u1, float v1,
130 float x2, float y2, float u2, float v2,
131 float x3, float y3, float u3, float v3,
Chet Haase7de0cb12011-12-05 16:35:38 -0800132 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy97771732012-02-28 18:17:02 -0800133 void appendRotatedMeshQuad(float x1, float y1, float u1, float v1,
134 float x2, float y2, float u2, float v2,
135 float x3, float y3, float u3, float v3,
136 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy694b5192010-07-21 21:33:20 -0700137
Romain Guy9b1204b2012-09-04 15:22:57 -0700138 void removeFont(const Font* font);
139
Sangkyu Lee7bb3cfe2012-11-16 00:03:17 +0900140 void updateDrawParams();
Romain Guy9b1204b2012-09-04 15:22:57 -0700141 void checkTextureUpdate();
142
143 void setTextureDirty() {
144 mUploadTexture = true;
145 }
146
Chet Haase7de0cb12011-12-05 16:35:38 -0800147 uint32_t mSmallCacheWidth;
148 uint32_t mSmallCacheHeight;
Chet Haaseeb32a492012-08-31 13:54:03 -0700149 uint32_t mLargeCacheWidth;
150 uint32_t mLargeCacheHeight;
Romain Guy694b5192010-07-21 21:33:20 -0700151
Chet Haase378e9192012-08-15 15:54:54 -0700152 Vector<CacheTexture*> mCacheTextures;
Romain Guy694b5192010-07-21 21:33:20 -0700153
Romain Guy09147fb2010-07-22 13:08:20 -0700154 Font* mCurrentFont;
Romain Guye3a9b242013-01-08 11:15:30 -0800155 LruCache<Font::FontDescription, Font*> mActiveFonts;
Romain Guy694b5192010-07-21 21:33:20 -0700156
Chet Haase7de0cb12011-12-05 16:35:38 -0800157 CacheTexture* mCurrentCacheTexture;
Chet Haase7de0cb12011-12-05 16:35:38 -0800158
Romain Guy694b5192010-07-21 21:33:20 -0700159 bool mUploadTexture;
160
161 // Pointer to vertex data to speed up frame to frame work
Romain Guy9b1204b2012-09-04 15:22:57 -0700162 float* mTextMesh;
Romain Guy694b5192010-07-21 21:33:20 -0700163 uint32_t mCurrentQuadIndex;
Sangkyu Lee7bb3cfe2012-11-16 00:03:17 +0900164 uint32_t mLastQuadIndex;
Romain Guy694b5192010-07-21 21:33:20 -0700165 uint32_t mMaxNumberOfQuads;
166
167 uint32_t mIndexBufferID;
168
Romain Guy09147fb2010-07-22 13:08:20 -0700169 const Rect* mClip;
Romain Guy5b3b3522010-10-27 18:57:51 -0700170 Rect* mBounds;
171 bool mDrawn;
Romain Guy09147fb2010-07-22 13:08:20 -0700172
Romain Guy694b5192010-07-21 21:33:20 -0700173 bool mInitialized;
Alex Sakhartchouk89a524a2010-08-02 17:52:30 -0700174
Romain Guye8cb9c142010-10-04 14:14:11 -0700175 bool mLinearFiltering;
176
Sangkyu Lee7bb3cfe2012-11-16 00:03:17 +0900177 Vector<uint16_t*> mDrawOffsets;
178 Vector<uint32_t> mDrawCounts;
179 Vector<CacheTexture*> mDrawCacheTextures;
180
Romain Guy9b1204b2012-09-04 15:22:57 -0700181 /** We should consider multi-threading this code or using Renderscript **/
182 static void computeGaussianWeights(float* weights, int32_t radius);
183 static void horizontalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700184 int32_t width, int32_t height);
Romain Guy9b1204b2012-09-04 15:22:57 -0700185 static void verticalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700186 int32_t width, int32_t height);
Romain Guy9b1204b2012-09-04 15:22:57 -0700187 static void blurImage(uint8_t* image, int32_t width, int32_t height, int32_t radius);
Romain Guy694b5192010-07-21 21:33:20 -0700188};
189
190}; // namespace uirenderer
191}; // namespace android
192
Romain Guy5b3b3522010-10-27 18:57:51 -0700193#endif // ANDROID_HWUI_FONT_RENDERER_H