blob: 1da3b6cb3433723b282591756b0759f054efc1bb [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 Guy115096f2013-03-19 11:32:41 -070031#include "utils/SortedList.h"
Romain Guye3a9b242013-01-08 11:15:30 -080032#include "Matrix.h"
Romain Guy51769a62010-07-23 00:28:00 -070033#include "Properties.h"
Romain Guy09147fb2010-07-22 13:08:20 -070034
Chris Craikf2d8ccc2013-02-13 16:14:17 -080035namespace RSC {
36 class Element;
37 class RS;
38 class ScriptIntrinsicBlur;
39}
40
Romain Guy257ae352013-03-20 16:31:12 -070041class Functor;
42
Romain Guy694b5192010-07-21 21:33:20 -070043namespace android {
44namespace uirenderer {
45
Romain Guy726aeba2011-06-01 14:52:00 -070046///////////////////////////////////////////////////////////////////////////////
Romain Guy726aeba2011-06-01 14:52:00 -070047// Renderer
48///////////////////////////////////////////////////////////////////////////////
49
Romain Guy694b5192010-07-21 21:33:20 -070050class FontRenderer {
51public:
52 FontRenderer();
53 ~FontRenderer();
54
Chet Haase9a824562011-12-16 15:44:59 -080055 void flushLargeCaches();
Romain Guy694b5192010-07-21 21:33:20 -070056
Romain Guyb45c0c92010-08-26 20:35:23 -070057 void setGammaTable(const uint8_t* gammaTable) {
58 mGammaTable = gammaTable;
59 }
60
Romain Guye3a9b242013-01-08 11:15:30 -080061 void setFont(SkPaint* paint, const mat4& matrix);
Chet Haasee816bae2012-08-09 13:39:02 -070062
Romain Guye3a9b242013-01-08 11:15:30 -080063 void precache(SkPaint* paint, const char* text, int numGlyphs, const mat4& matrix);
Chet Haasee816bae2012-08-09 13:39:02 -070064
Romain Guy671d6cf2012-01-18 12:39:17 -080065 // bounds is an out parameter
Romain Guy671d6cf2012-01-18 12:39:17 -080066 bool renderPosText(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
Romain Guy257ae352013-03-20 16:31:12 -070067 uint32_t len, int numGlyphs, int x, int y, const float* positions, Rect* bounds,
68 Functor* functor);
Romain Guy97771732012-02-28 18:17:02 -080069 // bounds is an out parameter
70 bool renderTextOnPath(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
71 uint32_t len, int numGlyphs, SkPath* path, float hOffset, float vOffset, Rect* bounds);
Romain Guy694b5192010-07-21 21:33:20 -070072
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -070073 struct DropShadow {
Romain Guy1e45aae2010-08-13 19:39:53 -070074 DropShadow() { };
75
76 DropShadow(const DropShadow& dropShadow):
77 width(dropShadow.width), height(dropShadow.height),
78 image(dropShadow.image), penX(dropShadow.penX),
79 penY(dropShadow.penY) {
80 }
81
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -070082 uint32_t width;
83 uint32_t height;
84 uint8_t* image;
85 int32_t penX;
86 int32_t penY;
87 };
88
89 // After renderDropShadow returns, the called owns the memory in DropShadow.image
90 // and is responsible for releasing it when it's done with it
91 DropShadow renderDropShadow(SkPaint* paint, const char *text, uint32_t startIndex,
Raph Levien416a8472012-07-19 22:48:17 -070092 uint32_t len, int numGlyphs, uint32_t radius, const float* positions);
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -070093
Romain Guy257ae352013-03-20 16:31:12 -070094 void setTextureFiltering(bool linearFiltering) {
Romain Guy80872462012-09-04 16:42:01 -070095 mLinearFiltering = linearFiltering;
Romain Guy694b5192010-07-21 21:33:20 -070096 }
97
Chet Haase7de0cb12011-12-05 16:35:38 -080098 uint32_t getCacheSize() const {
99 uint32_t size = 0;
Chet Haase378e9192012-08-15 15:54:54 -0700100 for (uint32_t i = 0; i < mCacheTextures.size(); i++) {
101 CacheTexture* cacheTexture = mCacheTextures[i];
Romain Guy80872462012-09-04 16:42:01 -0700102 if (cacheTexture && cacheTexture->getTexture()) {
103 size += cacheTexture->getWidth() * cacheTexture->getHeight();
Chet Haase378e9192012-08-15 15:54:54 -0700104 }
Chet Haase7de0cb12011-12-05 16:35:38 -0800105 }
106 return size;
Romain Guyc15008e2010-11-10 11:59:15 -0800107 }
108
Romain Guy9b1204b2012-09-04 15:22:57 -0700109private:
Romain Guy694b5192010-07-21 21:33:20 -0700110 friend class Font;
111
Romain Guyb45c0c92010-08-26 20:35:23 -0700112 const uint8_t* mGammaTable;
113
Chet Haase2a47c142011-12-14 15:22:56 -0800114 void allocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase9a824562011-12-16 15:44:59 -0800115 void deallocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase7de0cb12011-12-05 16:35:38 -0800116 void initTextTexture();
Romain Guy97771732012-02-28 18:17:02 -0800117 CacheTexture* createCacheTexture(int width, int height, bool allocate);
Chet Haase7de0cb12011-12-05 16:35:38 -0800118 void cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph,
Chet Haasef942cf12012-08-30 09:06:46 -0700119 uint32_t *retOriginX, uint32_t *retOriginY, bool precaching);
Chet Haase378e9192012-08-15 15:54:54 -0700120 CacheTexture* cacheBitmapInTexture(const SkGlyph& glyph, uint32_t* startX, uint32_t* startY);
Romain Guy694b5192010-07-21 21:33:20 -0700121
122 void flushAllAndInvalidate();
123 void initVertexArrayBuffers();
124
125 void checkInit();
Romain Guy257ae352013-03-20 16:31:12 -0700126 void initRender(const Rect* clip, Rect* bounds, Functor* functor);
Romain Guy671d6cf2012-01-18 12:39:17 -0800127 void finishRender();
Romain Guy694b5192010-07-21 21:33:20 -0700128
129 void issueDrawCommand();
Romain Guy97771732012-02-28 18:17:02 -0800130 void appendMeshQuadNoClip(float x1, float y1, float u1, float v1,
131 float x2, float y2, float u2, float v2,
132 float x3, float y3, float u3, float v3,
133 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guyd71dd362011-12-12 19:03:35 -0800134 void appendMeshQuad(float x1, float y1, float u1, float v1,
135 float x2, float y2, float u2, float v2,
136 float x3, float y3, float u3, float v3,
Chet Haase7de0cb12011-12-05 16:35:38 -0800137 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy97771732012-02-28 18:17:02 -0800138 void appendRotatedMeshQuad(float x1, float y1, float u1, float v1,
139 float x2, float y2, float u2, float v2,
140 float x3, float y3, float u3, float v3,
141 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy694b5192010-07-21 21:33:20 -0700142
Romain Guy9b1204b2012-09-04 15:22:57 -0700143 void removeFont(const Font* font);
144
145 void checkTextureUpdate();
146
147 void setTextureDirty() {
148 mUploadTexture = true;
149 }
150
Chet Haase7de0cb12011-12-05 16:35:38 -0800151 uint32_t mSmallCacheWidth;
152 uint32_t mSmallCacheHeight;
Chet Haaseeb32a492012-08-31 13:54:03 -0700153 uint32_t mLargeCacheWidth;
154 uint32_t mLargeCacheHeight;
Romain Guy694b5192010-07-21 21:33:20 -0700155
Chet Haase378e9192012-08-15 15:54:54 -0700156 Vector<CacheTexture*> mCacheTextures;
Romain Guy694b5192010-07-21 21:33:20 -0700157
Romain Guy09147fb2010-07-22 13:08:20 -0700158 Font* mCurrentFont;
Romain Guye3a9b242013-01-08 11:15:30 -0800159 LruCache<Font::FontDescription, Font*> mActiveFonts;
Romain Guy694b5192010-07-21 21:33:20 -0700160
Chet Haase7de0cb12011-12-05 16:35:38 -0800161 CacheTexture* mCurrentCacheTexture;
Chet Haase7de0cb12011-12-05 16:35:38 -0800162
Romain Guy694b5192010-07-21 21:33:20 -0700163 bool mUploadTexture;
164
Romain Guy694b5192010-07-21 21:33:20 -0700165 uint32_t mMaxNumberOfQuads;
Romain Guy694b5192010-07-21 21:33:20 -0700166 uint32_t mIndexBufferID;
167
Romain Guy257ae352013-03-20 16:31:12 -0700168 Functor* mFunctor;
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
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800177 // RS constructs
178 sp<RSC::RS> mRs;
179 sp<const RSC::Element> mRsElement;
180 sp<RSC::ScriptIntrinsicBlur> mRsScript;
181
Romain Guy9b1204b2012-09-04 15:22:57 -0700182 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);
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800187
188 // the input image handle may have its pointer replaced (to avoid copies)
189 void blurImage(uint8_t** image, int32_t width, int32_t height, int32_t radius);
Romain Guy694b5192010-07-21 21:33:20 -0700190};
191
192}; // namespace uirenderer
193}; // namespace android
194
Romain Guy5b3b3522010-10-27 18:57:51 -0700195#endif // ANDROID_HWUI_FONT_RENDERER_H