blob: 8ce22b07d7b60ecccfd2fed2ace167c079672546 [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
Victoria Lease1e546812013-06-25 14:25:17 -070020#include <utils/Functor.h>
Romain Guye3a9b242013-01-08 11:15:30 -080021#include <utils/LruCache.h>
Romain Guy694b5192010-07-21 21:33:20 -070022#include <utils/Vector.h>
Mathias Agopian1f5762e2013-05-06 20:20:34 -070023#include <utils/StrongPointer.h>
Romain Guy694b5192010-07-21 21:33:20 -070024
Romain Guy694b5192010-07-21 21:33:20 -070025#include <SkPaint.h>
26
27#include <GLES2/gl2.h>
28
Romain Guy9f5dab32012-09-04 12:55:44 -070029#include "font/FontUtil.h"
30#include "font/CacheTexture.h"
31#include "font/CachedGlyphInfo.h"
32#include "font/Font.h"
Romain Guy115096f2013-03-19 11:32:41 -070033#include "utils/SortedList.h"
Romain Guye3a9b242013-01-08 11:15:30 -080034#include "Matrix.h"
Romain Guy51769a62010-07-23 00:28:00 -070035#include "Properties.h"
Romain Guy09147fb2010-07-22 13:08:20 -070036
Dan Morrille4d9a012013-03-28 18:10:43 -070037#ifdef ANDROID_ENABLE_RENDERSCRIPT
Tim Murray250b1cf2013-08-01 14:49:22 -070038#include "RenderScript.h"
Chris Craikf2d8ccc2013-02-13 16:14:17 -080039namespace RSC {
40 class Element;
41 class RS;
42 class ScriptIntrinsicBlur;
Tim Murray250b1cf2013-08-01 14:49:22 -070043 class sp;
Chris Craikf2d8ccc2013-02-13 16:14:17 -080044}
Dan Morrille4d9a012013-03-28 18:10:43 -070045#endif
Chris Craikf2d8ccc2013-02-13 16:14:17 -080046
Romain Guy694b5192010-07-21 21:33:20 -070047namespace android {
48namespace uirenderer {
49
Victoria Lease1e546812013-06-25 14:25:17 -070050class OpenGLRenderer;
51
Romain Guy726aeba2011-06-01 14:52:00 -070052///////////////////////////////////////////////////////////////////////////////
Victoria Lease1e546812013-06-25 14:25:17 -070053// TextSetupFunctor
54///////////////////////////////////////////////////////////////////////////////
55class TextSetupFunctor: public Functor {
56public:
57 struct Data {
58 Data(GLenum glyphFormat) : glyphFormat(glyphFormat) {
59 }
60
61 GLenum glyphFormat;
62 };
63
64 TextSetupFunctor(OpenGLRenderer* renderer, float x, float y, bool pureTranslate,
Chris Craikd218a922014-01-02 17:13:34 -080065 int alpha, SkXfermode::Mode mode, const SkPaint* paint): Functor(),
Victoria Lease1e546812013-06-25 14:25:17 -070066 renderer(renderer), x(x), y(y), pureTranslate(pureTranslate),
67 alpha(alpha), mode(mode), paint(paint) {
68 }
69 ~TextSetupFunctor() { }
70
71 status_t operator ()(int what, void* data);
72
73 OpenGLRenderer* renderer;
74 float x;
75 float y;
76 bool pureTranslate;
77 int alpha;
78 SkXfermode::Mode mode;
Chris Craikd218a922014-01-02 17:13:34 -080079 const SkPaint* paint;
Victoria Lease1e546812013-06-25 14:25:17 -070080};
81
82///////////////////////////////////////////////////////////////////////////////
83// FontRenderer
Romain Guy726aeba2011-06-01 14:52:00 -070084///////////////////////////////////////////////////////////////////////////////
85
Romain Guy694b5192010-07-21 21:33:20 -070086class FontRenderer {
87public:
88 FontRenderer();
89 ~FontRenderer();
90
Victoria Lease1e546812013-06-25 14:25:17 -070091 void flushLargeCaches(Vector<CacheTexture*>& cacheTextures);
Chet Haase9a824562011-12-16 15:44:59 -080092 void flushLargeCaches();
Romain Guy694b5192010-07-21 21:33:20 -070093
Romain Guyb45c0c92010-08-26 20:35:23 -070094 void setGammaTable(const uint8_t* gammaTable) {
95 mGammaTable = gammaTable;
96 }
97
Chris Craikd218a922014-01-02 17:13:34 -080098 void setFont(const SkPaint* paint, const mat4& matrix);
Chet Haasee816bae2012-08-09 13:39:02 -070099
Chris Craikd218a922014-01-02 17:13:34 -0800100 void precache(const SkPaint* paint, const char* text, int numGlyphs, const mat4& matrix);
Romain Guycf51a412013-04-08 19:40:31 -0700101 void endPrecaching();
Chet Haasee816bae2012-08-09 13:39:02 -0700102
Romain Guy671d6cf2012-01-18 12:39:17 -0800103 // bounds is an out parameter
Chris Craikd218a922014-01-02 17:13:34 -0800104 bool renderPosText(const SkPaint* paint, const Rect* clip, const char *text,
105 uint32_t startIndex, uint32_t len, int numGlyphs, int x, int y, const float* positions,
106 Rect* bounds, Functor* functor, bool forceFinish = true);
Chris Craik527a3aa2013-03-04 10:19:31 -0800107
Romain Guy97771732012-02-28 18:17:02 -0800108 // bounds is an out parameter
Chris Craikd218a922014-01-02 17:13:34 -0800109 bool renderTextOnPath(const SkPaint* paint, const Rect* clip, const char *text,
110 uint32_t startIndex, uint32_t len, int numGlyphs, const SkPath* path,
111 float hOffset, float vOffset, Rect* bounds, Functor* functor);
Romain Guy694b5192010-07-21 21:33:20 -0700112
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700113 struct DropShadow {
Romain Guy1e45aae2010-08-13 19:39:53 -0700114 DropShadow() { };
115
116 DropShadow(const DropShadow& dropShadow):
117 width(dropShadow.width), height(dropShadow.height),
118 image(dropShadow.image), penX(dropShadow.penX),
119 penY(dropShadow.penY) {
120 }
121
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700122 uint32_t width;
123 uint32_t height;
124 uint8_t* image;
125 int32_t penX;
126 int32_t penY;
127 };
128
129 // After renderDropShadow returns, the called owns the memory in DropShadow.image
130 // and is responsible for releasing it when it's done with it
Chris Craikd218a922014-01-02 17:13:34 -0800131 DropShadow renderDropShadow(const SkPaint* paint, const char *text, uint32_t startIndex,
Derek Sollenbergere392c812014-05-21 11:25:22 -0400132 uint32_t len, int numGlyphs, float radius, const float* positions);
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700133
Romain Guy257ae352013-03-20 16:31:12 -0700134 void setTextureFiltering(bool linearFiltering) {
Romain Guy80872462012-09-04 16:42:01 -0700135 mLinearFiltering = linearFiltering;
Romain Guy694b5192010-07-21 21:33:20 -0700136 }
137
Victoria Lease1e546812013-06-25 14:25:17 -0700138 uint32_t getCacheSize(GLenum format) const;
Romain Guyc15008e2010-11-10 11:59:15 -0800139
Romain Guy9b1204b2012-09-04 15:22:57 -0700140private:
Romain Guy694b5192010-07-21 21:33:20 -0700141 friend class Font;
142
Romain Guyb45c0c92010-08-26 20:35:23 -0700143 const uint8_t* mGammaTable;
144
Chet Haase2a47c142011-12-14 15:22:56 -0800145 void allocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase9a824562011-12-16 15:44:59 -0800146 void deallocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase7de0cb12011-12-05 16:35:38 -0800147 void initTextTexture();
Victoria Lease1e546812013-06-25 14:25:17 -0700148 CacheTexture* createCacheTexture(int width, int height, GLenum format, bool allocate);
Chet Haase7de0cb12011-12-05 16:35:38 -0800149 void cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph,
Chet Haasef942cf12012-08-30 09:06:46 -0700150 uint32_t *retOriginX, uint32_t *retOriginY, bool precaching);
Victoria Lease1e546812013-06-25 14:25:17 -0700151 CacheTexture* cacheBitmapInTexture(Vector<CacheTexture*>& cacheTextures, const SkGlyph& glyph,
152 uint32_t* startX, uint32_t* startY);
Romain Guy694b5192010-07-21 21:33:20 -0700153
154 void flushAllAndInvalidate();
Romain Guy694b5192010-07-21 21:33:20 -0700155
156 void checkInit();
Romain Guy257ae352013-03-20 16:31:12 -0700157 void initRender(const Rect* clip, Rect* bounds, Functor* functor);
Romain Guy671d6cf2012-01-18 12:39:17 -0800158 void finishRender();
Romain Guy694b5192010-07-21 21:33:20 -0700159
Victoria Lease1e546812013-06-25 14:25:17 -0700160 void issueDrawCommand(Vector<CacheTexture*>& cacheTextures);
Romain Guy694b5192010-07-21 21:33:20 -0700161 void issueDrawCommand();
Romain Guy97771732012-02-28 18:17:02 -0800162 void appendMeshQuadNoClip(float x1, float y1, float u1, float v1,
163 float x2, float y2, float u2, float v2,
164 float x3, float y3, float u3, float v3,
165 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guyd71dd362011-12-12 19:03:35 -0800166 void appendMeshQuad(float x1, float y1, float u1, float v1,
167 float x2, float y2, float u2, float v2,
168 float x3, float y3, float u3, float v3,
Chet Haase7de0cb12011-12-05 16:35:38 -0800169 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy97771732012-02-28 18:17:02 -0800170 void appendRotatedMeshQuad(float x1, float y1, float u1, float v1,
171 float x2, float y2, float u2, float v2,
172 float x3, float y3, float u3, float v3,
173 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy694b5192010-07-21 21:33:20 -0700174
Romain Guy9b1204b2012-09-04 15:22:57 -0700175 void removeFont(const Font* font);
176
177 void checkTextureUpdate();
178
179 void setTextureDirty() {
180 mUploadTexture = true;
181 }
182
Chet Haase7de0cb12011-12-05 16:35:38 -0800183 uint32_t mSmallCacheWidth;
184 uint32_t mSmallCacheHeight;
Chet Haaseeb32a492012-08-31 13:54:03 -0700185 uint32_t mLargeCacheWidth;
186 uint32_t mLargeCacheHeight;
Romain Guy694b5192010-07-21 21:33:20 -0700187
Victoria Lease1e546812013-06-25 14:25:17 -0700188 Vector<CacheTexture*> mACacheTextures;
189 Vector<CacheTexture*> mRGBACacheTextures;
Romain Guy694b5192010-07-21 21:33:20 -0700190
Romain Guy09147fb2010-07-22 13:08:20 -0700191 Font* mCurrentFont;
Romain Guye3a9b242013-01-08 11:15:30 -0800192 LruCache<Font::FontDescription, Font*> mActiveFonts;
Romain Guy694b5192010-07-21 21:33:20 -0700193
Chet Haase7de0cb12011-12-05 16:35:38 -0800194 CacheTexture* mCurrentCacheTexture;
Chet Haase7de0cb12011-12-05 16:35:38 -0800195
Romain Guy694b5192010-07-21 21:33:20 -0700196 bool mUploadTexture;
197
Romain Guy257ae352013-03-20 16:31:12 -0700198 Functor* mFunctor;
Romain Guy09147fb2010-07-22 13:08:20 -0700199 const Rect* mClip;
Romain Guy5b3b3522010-10-27 18:57:51 -0700200 Rect* mBounds;
201 bool mDrawn;
Romain Guy09147fb2010-07-22 13:08:20 -0700202
Romain Guy694b5192010-07-21 21:33:20 -0700203 bool mInitialized;
Alex Sakhartchouk89a524a2010-08-02 17:52:30 -0700204
Romain Guye8cb9c142010-10-04 14:14:11 -0700205 bool mLinearFiltering;
206
Dan Morrille4d9a012013-03-28 18:10:43 -0700207#ifdef ANDROID_ENABLE_RENDERSCRIPT
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800208 // RS constructs
Tim Murray250b1cf2013-08-01 14:49:22 -0700209 RSC::sp<RSC::RS> mRs;
210 RSC::sp<const RSC::Element> mRsElement;
211 RSC::sp<RSC::ScriptIntrinsicBlur> mRsScript;
Dan Morrille4d9a012013-03-28 18:10:43 -0700212#endif
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800213
Romain Guy9b1204b2012-09-04 15:22:57 -0700214 static void computeGaussianWeights(float* weights, int32_t radius);
215 static void horizontalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700216 int32_t width, int32_t height);
Romain Guy9b1204b2012-09-04 15:22:57 -0700217 static void verticalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700218 int32_t width, int32_t height);
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800219
220 // the input image handle may have its pointer replaced (to avoid copies)
Derek Sollenbergere392c812014-05-21 11:25:22 -0400221 void blurImage(uint8_t** image, int32_t width, int32_t height, float radius);
Romain Guy694b5192010-07-21 21:33:20 -0700222};
223
224}; // namespace uirenderer
225}; // namespace android
226
Romain Guy5b3b3522010-10-27 18:57:51 -0700227#endif // ANDROID_HWUI_FONT_RENDERER_H