blob: 1e59a966750e48ed4c69c3de071d3ccd231f882d [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
Chris Craik96a5c4c2015-01-27 15:46:35 -080020#include "font/FontUtil.h"
21#include "font/CacheTexture.h"
22#include "font/CachedGlyphInfo.h"
23#include "font/Font.h"
sergeyvaf102be2016-09-09 18:02:07 -070024#ifdef BUGREPORT_FONT_CACHE_USAGE
25#include "font/FontCacheHistoryTracker.h"
26#endif
Chris Craik96a5c4c2015-01-27 15:46:35 -080027
Romain Guye3a9b242013-01-08 11:15:30 -080028#include <utils/LruCache.h>
sergeyvbaf29e72016-09-08 11:09:34 -070029#include <utils/String8.h>
Mathias Agopian1f5762e2013-05-06 20:20:34 -070030#include <utils/StrongPointer.h>
Romain Guy694b5192010-07-21 21:33:20 -070031
Romain Guy694b5192010-07-21 21:33:20 -070032#include <SkPaint.h>
33
34#include <GLES2/gl2.h>
35
John Reck272a6852015-07-29 16:48:58 -070036#include <vector>
37
Dan Morrille4d9a012013-03-28 18:10:43 -070038#ifdef ANDROID_ENABLE_RENDERSCRIPT
Tim Murray250b1cf2013-08-01 14:49:22 -070039#include "RenderScript.h"
Chris Craikf2d8ccc2013-02-13 16:14:17 -080040namespace RSC {
41 class Element;
42 class RS;
43 class ScriptIntrinsicBlur;
Tim Murray250b1cf2013-08-01 14:49:22 -070044 class sp;
Chris Craikf2d8ccc2013-02-13 16:14:17 -080045}
Dan Morrille4d9a012013-03-28 18:10:43 -070046#endif
Chris Craikf2d8ccc2013-02-13 16:14:17 -080047
Romain Guy694b5192010-07-21 21:33:20 -070048namespace android {
49namespace uirenderer {
50
Chris Craika1717272015-11-19 13:02:43 -080051#if HWUI_NEW_OPS
52class BakedOpState;
53class BakedOpRenderer;
Chris Craike4db79d2015-12-22 16:32:23 -080054struct ClipBase;
Chris Craika1717272015-11-19 13:02:43 -080055#else
Victoria Lease1e546812013-06-25 14:25:17 -070056class OpenGLRenderer;
Chris Craika1717272015-11-19 13:02:43 -080057#endif
Victoria Lease1e546812013-06-25 14:25:17 -070058
Chris Craik82840732015-04-03 09:37:49 -070059class TextDrawFunctor {
Victoria Lease1e546812013-06-25 14:25:17 -070060public:
Chris Craika1717272015-11-19 13:02:43 -080061 TextDrawFunctor(
62#if HWUI_NEW_OPS
63 BakedOpRenderer* renderer,
64 const BakedOpState* bakedState,
Chris Craike4db79d2015-12-22 16:32:23 -080065 const ClipBase* clip,
Chris Craika1717272015-11-19 13:02:43 -080066#else
67 OpenGLRenderer* renderer,
68#endif
69 float x, float y, bool pureTranslate,
Chris Craik96a5c4c2015-01-27 15:46:35 -080070 int alpha, SkXfermode::Mode mode, const SkPaint* paint)
71 : renderer(renderer)
Chris Craika1717272015-11-19 13:02:43 -080072#if HWUI_NEW_OPS
73 , bakedState(bakedState)
Chris Craik15c3f192015-12-03 12:16:56 -080074 , clip(clip)
Chris Craika1717272015-11-19 13:02:43 -080075#endif
Chris Craik96a5c4c2015-01-27 15:46:35 -080076 , x(x)
77 , y(y)
78 , pureTranslate(pureTranslate)
79 , alpha(alpha)
80 , mode(mode)
81 , paint(paint) {
Victoria Lease1e546812013-06-25 14:25:17 -070082 }
Victoria Lease1e546812013-06-25 14:25:17 -070083
Chris Craike2bb3802015-03-13 15:07:52 -070084 void draw(CacheTexture& texture, bool linearFiltering);
Victoria Lease1e546812013-06-25 14:25:17 -070085
Chris Craika1717272015-11-19 13:02:43 -080086#if HWUI_NEW_OPS
87 BakedOpRenderer* renderer;
88 const BakedOpState* bakedState;
Chris Craike4db79d2015-12-22 16:32:23 -080089 const ClipBase* clip;
Chris Craika1717272015-11-19 13:02:43 -080090#else
Victoria Lease1e546812013-06-25 14:25:17 -070091 OpenGLRenderer* renderer;
Chris Craika1717272015-11-19 13:02:43 -080092#endif
Victoria Lease1e546812013-06-25 14:25:17 -070093 float x;
94 float y;
95 bool pureTranslate;
96 int alpha;
97 SkXfermode::Mode mode;
Chris Craikd218a922014-01-02 17:13:34 -080098 const SkPaint* paint;
Victoria Lease1e546812013-06-25 14:25:17 -070099};
100
Romain Guy694b5192010-07-21 21:33:20 -0700101class FontRenderer {
102public:
Chih-Hung Hsieha619ec72016-08-29 14:52:43 -0700103 explicit FontRenderer(const uint8_t* gammaTable);
Romain Guy694b5192010-07-21 21:33:20 -0700104 ~FontRenderer();
105
John Reck272a6852015-07-29 16:48:58 -0700106 void flushLargeCaches(std::vector<CacheTexture*>& cacheTextures);
Chet Haase9a824562011-12-16 15:44:59 -0800107 void flushLargeCaches();
Romain Guy694b5192010-07-21 21:33:20 -0700108
Chris Craik59744b72014-07-01 17:56:52 -0700109 void setFont(const SkPaint* paint, const SkMatrix& matrix);
Chet Haasee816bae2012-08-09 13:39:02 -0700110
Chris Craike8c3c812016-02-05 20:10:50 -0800111 void precache(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, const SkMatrix& matrix);
Romain Guycf51a412013-04-08 19:40:31 -0700112 void endPrecaching();
Chet Haasee816bae2012-08-09 13:39:02 -0700113
Chris Craike8c3c812016-02-05 20:10:50 -0800114 bool renderPosText(const SkPaint* paint, const Rect* clip, const glyph_t* glyphs,
Chris Craika1717272015-11-19 13:02:43 -0800115 int numGlyphs, int x, int y, const float* positions,
116 Rect* outBounds, TextDrawFunctor* functor, bool forceFinish = true);
Chris Craik527a3aa2013-03-04 10:19:31 -0800117
Chris Craike8c3c812016-02-05 20:10:50 -0800118 bool renderTextOnPath(const SkPaint* paint, const Rect* clip, const glyph_t* glyphs,
Chris Craika1717272015-11-19 13:02:43 -0800119 int numGlyphs, const SkPath* path,
120 float hOffset, float vOffset, Rect* outBounds, TextDrawFunctor* functor);
Romain Guy694b5192010-07-21 21:33:20 -0700121
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700122 struct DropShadow {
123 uint32_t width;
124 uint32_t height;
125 uint8_t* image;
126 int32_t penX;
127 int32_t penY;
128 };
129
130 // After renderDropShadow returns, the called owns the memory in DropShadow.image
131 // and is responsible for releasing it when it's done with it
Chris Craike8c3c812016-02-05 20:10:50 -0800132 DropShadow renderDropShadow(const SkPaint* paint, const glyph_t *glyphs, int numGlyphs,
Chris Craika1717272015-11-19 13:02:43 -0800133 float radius, const float* positions);
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700134
Romain Guy257ae352013-03-20 16:31:12 -0700135 void setTextureFiltering(bool linearFiltering) {
Romain Guy80872462012-09-04 16:42:01 -0700136 mLinearFiltering = linearFiltering;
Romain Guy694b5192010-07-21 21:33:20 -0700137 }
138
sergeyvbaf29e72016-09-08 11:09:34 -0700139 uint32_t getSize() const;
140 void dumpMemoryUsage(String8& log) const;
Romain Guyc15008e2010-11-10 11:59:15 -0800141
sergeyvaf102be2016-09-09 18:02:07 -0700142#ifdef BUGREPORT_FONT_CACHE_USAGE
143 FontCacheHistoryTracker& historyTracker() { return mHistoryTracker; }
144#endif
145
Romain Guy9b1204b2012-09-04 15:22:57 -0700146private:
Romain Guy694b5192010-07-21 21:33:20 -0700147 friend class Font;
148
Romain Guyb45c0c92010-08-26 20:35:23 -0700149 const uint8_t* mGammaTable;
150
Chet Haase2a47c142011-12-14 15:22:56 -0800151 void allocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase9a824562011-12-16 15:44:59 -0800152 void deallocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase7de0cb12011-12-05 16:35:38 -0800153 void initTextTexture();
Victoria Lease1e546812013-06-25 14:25:17 -0700154 CacheTexture* createCacheTexture(int width, int height, GLenum format, bool allocate);
Chet Haase7de0cb12011-12-05 16:35:38 -0800155 void cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph,
Chet Haasef942cf12012-08-30 09:06:46 -0700156 uint32_t *retOriginX, uint32_t *retOriginY, bool precaching);
John Reck272a6852015-07-29 16:48:58 -0700157 CacheTexture* cacheBitmapInTexture(std::vector<CacheTexture*>& cacheTextures, const SkGlyph& glyph,
Victoria Lease1e546812013-06-25 14:25:17 -0700158 uint32_t* startX, uint32_t* startY);
Romain Guy694b5192010-07-21 21:33:20 -0700159
160 void flushAllAndInvalidate();
Romain Guy694b5192010-07-21 21:33:20 -0700161
162 void checkInit();
Chris Craik82840732015-04-03 09:37:49 -0700163 void initRender(const Rect* clip, Rect* bounds, TextDrawFunctor* functor);
Romain Guy671d6cf2012-01-18 12:39:17 -0800164 void finishRender();
Romain Guy694b5192010-07-21 21:33:20 -0700165
John Reck272a6852015-07-29 16:48:58 -0700166 void issueDrawCommand(std::vector<CacheTexture*>& cacheTextures);
Romain Guy694b5192010-07-21 21:33:20 -0700167 void issueDrawCommand();
Romain Guy97771732012-02-28 18:17:02 -0800168 void appendMeshQuadNoClip(float x1, float y1, float u1, float v1,
169 float x2, float y2, float u2, float v2,
170 float x3, float y3, float u3, float v3,
171 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guyd71dd362011-12-12 19:03:35 -0800172 void appendMeshQuad(float x1, float y1, float u1, float v1,
173 float x2, float y2, float u2, float v2,
174 float x3, float y3, float u3, float v3,
Chet Haase7de0cb12011-12-05 16:35:38 -0800175 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy97771732012-02-28 18:17:02 -0800176 void appendRotatedMeshQuad(float x1, float y1, float u1, float v1,
177 float x2, float y2, float u2, float v2,
178 float x3, float y3, float u3, float v3,
179 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy694b5192010-07-21 21:33:20 -0700180
Romain Guy9b1204b2012-09-04 15:22:57 -0700181 void checkTextureUpdate();
182
183 void setTextureDirty() {
184 mUploadTexture = true;
185 }
186
sergeyvbaf29e72016-09-08 11:09:34 -0700187 const std::vector<CacheTexture*>& cacheTexturesForFormat(GLenum format) const;
188 uint32_t getCacheSize(GLenum format) const;
189 uint32_t getFreeCacheSize(GLenum format) const;
190
Chet Haase7de0cb12011-12-05 16:35:38 -0800191 uint32_t mSmallCacheWidth;
192 uint32_t mSmallCacheHeight;
Chet Haaseeb32a492012-08-31 13:54:03 -0700193 uint32_t mLargeCacheWidth;
194 uint32_t mLargeCacheHeight;
Romain Guy694b5192010-07-21 21:33:20 -0700195
John Reck272a6852015-07-29 16:48:58 -0700196 std::vector<CacheTexture*> mACacheTextures;
197 std::vector<CacheTexture*> mRGBACacheTextures;
Romain Guy694b5192010-07-21 21:33:20 -0700198
Romain Guy09147fb2010-07-22 13:08:20 -0700199 Font* mCurrentFont;
Romain Guye3a9b242013-01-08 11:15:30 -0800200 LruCache<Font::FontDescription, Font*> mActiveFonts;
Romain Guy694b5192010-07-21 21:33:20 -0700201
Chet Haase7de0cb12011-12-05 16:35:38 -0800202 CacheTexture* mCurrentCacheTexture;
Chet Haase7de0cb12011-12-05 16:35:38 -0800203
Romain Guy694b5192010-07-21 21:33:20 -0700204 bool mUploadTexture;
205
Chris Craik82840732015-04-03 09:37:49 -0700206 TextDrawFunctor* mFunctor;
Romain Guy09147fb2010-07-22 13:08:20 -0700207 const Rect* mClip;
Romain Guy5b3b3522010-10-27 18:57:51 -0700208 Rect* mBounds;
209 bool mDrawn;
Romain Guy09147fb2010-07-22 13:08:20 -0700210
Romain Guy694b5192010-07-21 21:33:20 -0700211 bool mInitialized;
Alex Sakhartchouk89a524a2010-08-02 17:52:30 -0700212
Romain Guye8cb9c142010-10-04 14:14:11 -0700213 bool mLinearFiltering;
214
sergeyvaf102be2016-09-09 18:02:07 -0700215#ifdef BUGREPORT_FONT_CACHE_USAGE
216 FontCacheHistoryTracker mHistoryTracker;
217#endif
218
Dan Morrille4d9a012013-03-28 18:10:43 -0700219#ifdef ANDROID_ENABLE_RENDERSCRIPT
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800220 // RS constructs
Tim Murray250b1cf2013-08-01 14:49:22 -0700221 RSC::sp<RSC::RS> mRs;
222 RSC::sp<const RSC::Element> mRsElement;
223 RSC::sp<RSC::ScriptIntrinsicBlur> mRsScript;
Dan Morrille4d9a012013-03-28 18:10:43 -0700224#endif
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800225
Romain Guy9b1204b2012-09-04 15:22:57 -0700226 static void computeGaussianWeights(float* weights, int32_t radius);
227 static void horizontalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700228 int32_t width, int32_t height);
Romain Guy9b1204b2012-09-04 15:22:57 -0700229 static void verticalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700230 int32_t width, int32_t height);
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800231
232 // the input image handle may have its pointer replaced (to avoid copies)
Derek Sollenbergere392c812014-05-21 11:25:22 -0400233 void blurImage(uint8_t** image, int32_t width, int32_t height, float radius);
Romain Guy694b5192010-07-21 21:33:20 -0700234};
235
236}; // namespace uirenderer
237}; // namespace android
238
Romain Guy5b3b3522010-10-27 18:57:51 -0700239#endif // ANDROID_HWUI_FONT_RENDERER_H