blob: cbbd87106f02de4de6ed91e53626a0ec70a3af3d [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>
Mathias Agopian1f5762e2013-05-06 20:20:34 -070022#include <utils/StrongPointer.h>
Romain Guy694b5192010-07-21 21:33:20 -070023
Romain Guy694b5192010-07-21 21:33:20 -070024#include <SkPaint.h>
25
26#include <GLES2/gl2.h>
27
Romain Guy9f5dab32012-09-04 12:55:44 -070028#include "font/FontUtil.h"
29#include "font/CacheTexture.h"
30#include "font/CachedGlyphInfo.h"
31#include "font/Font.h"
Romain Guy115096f2013-03-19 11:32:41 -070032#include "utils/SortedList.h"
Romain Guye3a9b242013-01-08 11:15:30 -080033#include "Matrix.h"
Romain Guy51769a62010-07-23 00:28:00 -070034#include "Properties.h"
Romain Guy09147fb2010-07-22 13:08:20 -070035
Dan Morrille4d9a012013-03-28 18:10:43 -070036#ifdef ANDROID_ENABLE_RENDERSCRIPT
Chris Craikf2d8ccc2013-02-13 16:14:17 -080037namespace RSC {
38 class Element;
39 class RS;
40 class ScriptIntrinsicBlur;
41}
Dan Morrille4d9a012013-03-28 18:10:43 -070042#endif
Chris Craikf2d8ccc2013-02-13 16:14:17 -080043
Romain Guy257ae352013-03-20 16:31:12 -070044class Functor;
45
Romain Guy694b5192010-07-21 21:33:20 -070046namespace android {
47namespace uirenderer {
48
Romain Guy726aeba2011-06-01 14:52:00 -070049///////////////////////////////////////////////////////////////////////////////
Romain Guy726aeba2011-06-01 14:52:00 -070050// Renderer
51///////////////////////////////////////////////////////////////////////////////
52
Romain Guy694b5192010-07-21 21:33:20 -070053class FontRenderer {
54public:
55 FontRenderer();
56 ~FontRenderer();
57
Chet Haase9a824562011-12-16 15:44:59 -080058 void flushLargeCaches();
Romain Guy694b5192010-07-21 21:33:20 -070059
Romain Guyb45c0c92010-08-26 20:35:23 -070060 void setGammaTable(const uint8_t* gammaTable) {
61 mGammaTable = gammaTable;
62 }
63
Romain Guye3a9b242013-01-08 11:15:30 -080064 void setFont(SkPaint* paint, const mat4& matrix);
Chet Haasee816bae2012-08-09 13:39:02 -070065
Romain Guye3a9b242013-01-08 11:15:30 -080066 void precache(SkPaint* paint, const char* text, int numGlyphs, const mat4& matrix);
Romain Guycf51a412013-04-08 19:40:31 -070067 void endPrecaching();
Chet Haasee816bae2012-08-09 13:39:02 -070068
Romain Guy671d6cf2012-01-18 12:39:17 -080069 // bounds is an out parameter
Romain Guy671d6cf2012-01-18 12:39:17 -080070 bool renderPosText(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
Romain Guy257ae352013-03-20 16:31:12 -070071 uint32_t len, int numGlyphs, int x, int y, const float* positions, Rect* bounds,
Chris Craik527a3aa2013-03-04 10:19:31 -080072 Functor* functor, bool forceFinish = true);
73
Romain Guy97771732012-02-28 18:17:02 -080074 // bounds is an out parameter
75 bool renderTextOnPath(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
76 uint32_t len, int numGlyphs, SkPath* path, float hOffset, float vOffset, Rect* bounds);
Romain Guy694b5192010-07-21 21:33:20 -070077
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -070078 struct DropShadow {
Romain Guy1e45aae2010-08-13 19:39:53 -070079 DropShadow() { };
80
81 DropShadow(const DropShadow& dropShadow):
82 width(dropShadow.width), height(dropShadow.height),
83 image(dropShadow.image), penX(dropShadow.penX),
84 penY(dropShadow.penY) {
85 }
86
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -070087 uint32_t width;
88 uint32_t height;
89 uint8_t* image;
90 int32_t penX;
91 int32_t penY;
92 };
93
94 // After renderDropShadow returns, the called owns the memory in DropShadow.image
95 // and is responsible for releasing it when it's done with it
96 DropShadow renderDropShadow(SkPaint* paint, const char *text, uint32_t startIndex,
Raph Levien416a8472012-07-19 22:48:17 -070097 uint32_t len, int numGlyphs, uint32_t radius, const float* positions);
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -070098
Romain Guy257ae352013-03-20 16:31:12 -070099 void setTextureFiltering(bool linearFiltering) {
Romain Guy80872462012-09-04 16:42:01 -0700100 mLinearFiltering = linearFiltering;
Romain Guy694b5192010-07-21 21:33:20 -0700101 }
102
Romain Guycf51a412013-04-08 19:40:31 -0700103 uint32_t getCacheSize() const;
Romain Guyc15008e2010-11-10 11:59:15 -0800104
Romain Guy9b1204b2012-09-04 15:22:57 -0700105private:
Romain Guy694b5192010-07-21 21:33:20 -0700106 friend class Font;
107
Chris Craik527a3aa2013-03-04 10:19:31 -0800108 static const uint32_t gMaxNumberOfQuads = 2048;
109
Romain Guyb45c0c92010-08-26 20:35:23 -0700110 const uint8_t* mGammaTable;
111
Chet Haase2a47c142011-12-14 15:22:56 -0800112 void allocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase9a824562011-12-16 15:44:59 -0800113 void deallocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase7de0cb12011-12-05 16:35:38 -0800114 void initTextTexture();
Romain Guy97771732012-02-28 18:17:02 -0800115 CacheTexture* createCacheTexture(int width, int height, bool allocate);
Chet Haase7de0cb12011-12-05 16:35:38 -0800116 void cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph,
Chet Haasef942cf12012-08-30 09:06:46 -0700117 uint32_t *retOriginX, uint32_t *retOriginY, bool precaching);
Chet Haase378e9192012-08-15 15:54:54 -0700118 CacheTexture* cacheBitmapInTexture(const SkGlyph& glyph, uint32_t* startX, uint32_t* startY);
Romain Guy694b5192010-07-21 21:33:20 -0700119
120 void flushAllAndInvalidate();
121 void initVertexArrayBuffers();
122
123 void checkInit();
Romain Guy257ae352013-03-20 16:31:12 -0700124 void initRender(const Rect* clip, Rect* bounds, Functor* functor);
Romain Guy671d6cf2012-01-18 12:39:17 -0800125 void finishRender();
Romain Guy694b5192010-07-21 21:33:20 -0700126
127 void issueDrawCommand();
Romain Guy97771732012-02-28 18:17:02 -0800128 void appendMeshQuadNoClip(float x1, float y1, float u1, float v1,
129 float x2, float y2, float u2, float v2,
130 float x3, float y3, float u3, float v3,
131 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guyd71dd362011-12-12 19:03:35 -0800132 void appendMeshQuad(float x1, float y1, float u1, float v1,
133 float x2, float y2, float u2, float v2,
134 float x3, float y3, float u3, float v3,
Chet Haase7de0cb12011-12-05 16:35:38 -0800135 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy97771732012-02-28 18:17:02 -0800136 void appendRotatedMeshQuad(float x1, float y1, float u1, float v1,
137 float x2, float y2, float u2, float v2,
138 float x3, float y3, float u3, float v3,
139 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy694b5192010-07-21 21:33:20 -0700140
Romain Guy9b1204b2012-09-04 15:22:57 -0700141 void removeFont(const Font* font);
142
143 void checkTextureUpdate();
144
145 void setTextureDirty() {
146 mUploadTexture = true;
147 }
148
Chet Haase7de0cb12011-12-05 16:35:38 -0800149 uint32_t mSmallCacheWidth;
150 uint32_t mSmallCacheHeight;
Chet Haaseeb32a492012-08-31 13:54:03 -0700151 uint32_t mLargeCacheWidth;
152 uint32_t mLargeCacheHeight;
Romain Guy694b5192010-07-21 21:33:20 -0700153
Chet Haase378e9192012-08-15 15:54:54 -0700154 Vector<CacheTexture*> mCacheTextures;
Romain Guy694b5192010-07-21 21:33:20 -0700155
Romain Guy09147fb2010-07-22 13:08:20 -0700156 Font* mCurrentFont;
Romain Guye3a9b242013-01-08 11:15:30 -0800157 LruCache<Font::FontDescription, Font*> mActiveFonts;
Romain Guy694b5192010-07-21 21:33:20 -0700158
Chet Haase7de0cb12011-12-05 16:35:38 -0800159 CacheTexture* mCurrentCacheTexture;
Chet Haase7de0cb12011-12-05 16:35:38 -0800160
Romain Guy694b5192010-07-21 21:33:20 -0700161 bool mUploadTexture;
162
Romain Guy694b5192010-07-21 21:33:20 -0700163 uint32_t mIndexBufferID;
164
Romain Guy257ae352013-03-20 16:31:12 -0700165 Functor* mFunctor;
Romain Guy09147fb2010-07-22 13:08:20 -0700166 const Rect* mClip;
Romain Guy5b3b3522010-10-27 18:57:51 -0700167 Rect* mBounds;
168 bool mDrawn;
Romain Guy09147fb2010-07-22 13:08:20 -0700169
Romain Guy694b5192010-07-21 21:33:20 -0700170 bool mInitialized;
Alex Sakhartchouk89a524a2010-08-02 17:52:30 -0700171
Romain Guye8cb9c142010-10-04 14:14:11 -0700172 bool mLinearFiltering;
173
Dan Morrille4d9a012013-03-28 18:10:43 -0700174#ifdef ANDROID_ENABLE_RENDERSCRIPT
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800175 // RS constructs
176 sp<RSC::RS> mRs;
177 sp<const RSC::Element> mRsElement;
178 sp<RSC::ScriptIntrinsicBlur> mRsScript;
Dan Morrille4d9a012013-03-28 18:10:43 -0700179#endif
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800180
Romain Guy9b1204b2012-09-04 15:22:57 -0700181 static void computeGaussianWeights(float* weights, int32_t radius);
182 static void horizontalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700183 int32_t width, int32_t height);
Romain Guy9b1204b2012-09-04 15:22:57 -0700184 static void verticalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700185 int32_t width, int32_t height);
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800186
187 // the input image handle may have its pointer replaced (to avoid copies)
188 void blurImage(uint8_t** image, int32_t width, int32_t height, int32_t radius);
Romain Guy694b5192010-07-21 21:33:20 -0700189};
190
191}; // namespace uirenderer
192}; // namespace android
193
Romain Guy5b3b3522010-10-27 18:57:51 -0700194#endif // ANDROID_HWUI_FONT_RENDERER_H