blob: d0c44ef5b9825c8e20f4c8fc31dc822e89e816ef [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
Chris Craikf2d8ccc2013-02-13 16:14:17 -080034namespace RSC {
35 class Element;
36 class RS;
37 class ScriptIntrinsicBlur;
38}
39
Romain Guy694b5192010-07-21 21:33:20 -070040namespace android {
41namespace uirenderer {
42
Romain Guy726aeba2011-06-01 14:52:00 -070043///////////////////////////////////////////////////////////////////////////////
Romain Guy726aeba2011-06-01 14:52:00 -070044// Renderer
45///////////////////////////////////////////////////////////////////////////////
46
Romain Guy694b5192010-07-21 21:33:20 -070047class FontRenderer {
48public:
49 FontRenderer();
50 ~FontRenderer();
51
Chet Haase9a824562011-12-16 15:44:59 -080052 void flushLargeCaches();
Romain Guy694b5192010-07-21 21:33:20 -070053
Romain Guyb45c0c92010-08-26 20:35:23 -070054 void setGammaTable(const uint8_t* gammaTable) {
55 mGammaTable = gammaTable;
56 }
57
Romain Guye3a9b242013-01-08 11:15:30 -080058 void setFont(SkPaint* paint, const mat4& matrix);
Chet Haasee816bae2012-08-09 13:39:02 -070059
Romain Guye3a9b242013-01-08 11:15:30 -080060 void precache(SkPaint* paint, const char* text, int numGlyphs, const mat4& matrix);
Chet Haasee816bae2012-08-09 13:39:02 -070061
Romain Guy671d6cf2012-01-18 12:39:17 -080062 // bounds is an out parameter
Romain Guy671d6cf2012-01-18 12:39:17 -080063 bool renderPosText(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
64 uint32_t len, int numGlyphs, int x, int y, const float* positions, Rect* bounds);
Romain Guy97771732012-02-28 18:17:02 -080065 // bounds is an out parameter
66 bool renderTextOnPath(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
67 uint32_t len, int numGlyphs, SkPath* path, float hOffset, float vOffset, Rect* bounds);
Romain Guy694b5192010-07-21 21:33:20 -070068
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -070069 struct DropShadow {
Romain Guy1e45aae2010-08-13 19:39:53 -070070 DropShadow() { };
71
72 DropShadow(const DropShadow& dropShadow):
73 width(dropShadow.width), height(dropShadow.height),
74 image(dropShadow.image), penX(dropShadow.penX),
75 penY(dropShadow.penY) {
76 }
77
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -070078 uint32_t width;
79 uint32_t height;
80 uint8_t* image;
81 int32_t penX;
82 int32_t penY;
83 };
84
85 // After renderDropShadow returns, the called owns the memory in DropShadow.image
86 // and is responsible for releasing it when it's done with it
87 DropShadow renderDropShadow(SkPaint* paint, const char *text, uint32_t startIndex,
Raph Levien416a8472012-07-19 22:48:17 -070088 uint32_t len, int numGlyphs, uint32_t radius, const float* positions);
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -070089
Romain Guye8cb9c142010-10-04 14:14:11 -070090 GLuint getTexture(bool linearFiltering = false) {
Romain Guy694b5192010-07-21 21:33:20 -070091 checkInit();
Romain Guyae91c4c2012-05-14 14:00:27 -070092
Romain Guy80872462012-09-04 16:42:01 -070093 mCurrentCacheTexture->setLinearFiltering(linearFiltering);
94 mLinearFiltering = linearFiltering;
Romain Guye8cb9c142010-10-04 14:14:11 -070095
Romain Guy80872462012-09-04 16:42:01 -070096 return mCurrentCacheTexture->getTextureId();
Romain Guy694b5192010-07-21 21:33:20 -070097 }
98
Chet Haase7de0cb12011-12-05 16:35:38 -080099 uint32_t getCacheSize() const {
100 uint32_t size = 0;
Chet Haase378e9192012-08-15 15:54:54 -0700101 for (uint32_t i = 0; i < mCacheTextures.size(); i++) {
102 CacheTexture* cacheTexture = mCacheTextures[i];
Romain Guy80872462012-09-04 16:42:01 -0700103 if (cacheTexture && cacheTexture->getTexture()) {
104 size += cacheTexture->getWidth() * cacheTexture->getHeight();
Chet Haase378e9192012-08-15 15:54:54 -0700105 }
Chet Haase7de0cb12011-12-05 16:35:38 -0800106 }
107 return size;
Romain Guyc15008e2010-11-10 11:59:15 -0800108 }
109
Romain Guy9b1204b2012-09-04 15:22:57 -0700110private:
Romain Guy694b5192010-07-21 21:33:20 -0700111 friend class Font;
112
Romain Guyb45c0c92010-08-26 20:35:23 -0700113 const uint8_t* mGammaTable;
114
Chet Haase2a47c142011-12-14 15:22:56 -0800115 void allocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase9a824562011-12-16 15:44:59 -0800116 void deallocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase7de0cb12011-12-05 16:35:38 -0800117 void initTextTexture();
Romain Guy97771732012-02-28 18:17:02 -0800118 CacheTexture* createCacheTexture(int width, int height, bool allocate);
Chet Haase7de0cb12011-12-05 16:35:38 -0800119 void cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph,
Chet Haasef942cf12012-08-30 09:06:46 -0700120 uint32_t *retOriginX, uint32_t *retOriginY, bool precaching);
Chet Haase378e9192012-08-15 15:54:54 -0700121 CacheTexture* cacheBitmapInTexture(const SkGlyph& glyph, uint32_t* startX, uint32_t* startY);
Romain Guy694b5192010-07-21 21:33:20 -0700122
123 void flushAllAndInvalidate();
124 void initVertexArrayBuffers();
125
126 void checkInit();
Romain Guy671d6cf2012-01-18 12:39:17 -0800127 void initRender(const Rect* clip, Rect* bounds);
128 void finishRender();
Romain Guy694b5192010-07-21 21:33:20 -0700129
130 void issueDrawCommand();
Romain Guy97771732012-02-28 18:17:02 -0800131 void appendMeshQuadNoClip(float x1, float y1, float u1, float v1,
132 float x2, float y2, float u2, float v2,
133 float x3, float y3, float u3, float v3,
134 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guyd71dd362011-12-12 19:03:35 -0800135 void appendMeshQuad(float x1, float y1, float u1, float v1,
136 float x2, float y2, float u2, float v2,
137 float x3, float y3, float u3, float v3,
Chet Haase7de0cb12011-12-05 16:35:38 -0800138 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy97771732012-02-28 18:17:02 -0800139 void appendRotatedMeshQuad(float x1, float y1, float u1, float v1,
140 float x2, float y2, float u2, float v2,
141 float x3, float y3, float u3, float v3,
142 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy694b5192010-07-21 21:33:20 -0700143
Romain Guy9b1204b2012-09-04 15:22:57 -0700144 void removeFont(const Font* font);
145
Sangkyu Lee7bb3cfe2012-11-16 00:03:17 +0900146 void updateDrawParams();
Romain Guy9b1204b2012-09-04 15:22:57 -0700147 void checkTextureUpdate();
148
149 void setTextureDirty() {
150 mUploadTexture = true;
151 }
152
Chet Haase7de0cb12011-12-05 16:35:38 -0800153 uint32_t mSmallCacheWidth;
154 uint32_t mSmallCacheHeight;
Chet Haaseeb32a492012-08-31 13:54:03 -0700155 uint32_t mLargeCacheWidth;
156 uint32_t mLargeCacheHeight;
Romain Guy694b5192010-07-21 21:33:20 -0700157
Chet Haase378e9192012-08-15 15:54:54 -0700158 Vector<CacheTexture*> mCacheTextures;
Romain Guy694b5192010-07-21 21:33:20 -0700159
Romain Guy09147fb2010-07-22 13:08:20 -0700160 Font* mCurrentFont;
Romain Guye3a9b242013-01-08 11:15:30 -0800161 LruCache<Font::FontDescription, Font*> mActiveFonts;
Romain Guy694b5192010-07-21 21:33:20 -0700162
Chet Haase7de0cb12011-12-05 16:35:38 -0800163 CacheTexture* mCurrentCacheTexture;
Chet Haase7de0cb12011-12-05 16:35:38 -0800164
Romain Guy694b5192010-07-21 21:33:20 -0700165 bool mUploadTexture;
166
167 // Pointer to vertex data to speed up frame to frame work
Romain Guy9b1204b2012-09-04 15:22:57 -0700168 float* mTextMesh;
Romain Guy694b5192010-07-21 21:33:20 -0700169 uint32_t mCurrentQuadIndex;
Sangkyu Lee7bb3cfe2012-11-16 00:03:17 +0900170 uint32_t mLastQuadIndex;
Romain Guy694b5192010-07-21 21:33:20 -0700171 uint32_t mMaxNumberOfQuads;
172
173 uint32_t mIndexBufferID;
174
Romain Guy09147fb2010-07-22 13:08:20 -0700175 const Rect* mClip;
Romain Guy5b3b3522010-10-27 18:57:51 -0700176 Rect* mBounds;
177 bool mDrawn;
Romain Guy09147fb2010-07-22 13:08:20 -0700178
Romain Guy694b5192010-07-21 21:33:20 -0700179 bool mInitialized;
Alex Sakhartchouk89a524a2010-08-02 17:52:30 -0700180
Romain Guye8cb9c142010-10-04 14:14:11 -0700181 bool mLinearFiltering;
182
Sangkyu Lee7bb3cfe2012-11-16 00:03:17 +0900183 Vector<uint16_t*> mDrawOffsets;
184 Vector<uint32_t> mDrawCounts;
185 Vector<CacheTexture*> mDrawCacheTextures;
186
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800187 // RS constructs
188 sp<RSC::RS> mRs;
189 sp<const RSC::Element> mRsElement;
190 sp<RSC::ScriptIntrinsicBlur> mRsScript;
191
Romain Guy9b1204b2012-09-04 15:22:57 -0700192 static void computeGaussianWeights(float* weights, int32_t radius);
193 static void horizontalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700194 int32_t width, int32_t height);
Romain Guy9b1204b2012-09-04 15:22:57 -0700195 static void verticalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700196 int32_t width, int32_t height);
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800197
198 // the input image handle may have its pointer replaced (to avoid copies)
199 void blurImage(uint8_t** image, int32_t width, int32_t height, int32_t radius);
Romain Guy694b5192010-07-21 21:33:20 -0700200};
201
202}; // namespace uirenderer
203}; // namespace android
204
Romain Guy5b3b3522010-10-27 18:57:51 -0700205#endif // ANDROID_HWUI_FONT_RENDERER_H