blob: e102a2f04aefba081e14de924755d763c78ffe0b [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"
Chris Craik96a5c4c2015-01-27 15:46:35 -080024
Romain Guye3a9b242013-01-08 11:15:30 -080025#include <utils/LruCache.h>
sergeyvbaf29e72016-09-08 11:09:34 -070026#include <utils/String8.h>
Mathias Agopian1f5762e2013-05-06 20:20:34 -070027#include <utils/StrongPointer.h>
Romain Guy694b5192010-07-21 21:33:20 -070028
Romain Guy694b5192010-07-21 21:33:20 -070029#include <SkPaint.h>
30
31#include <GLES2/gl2.h>
32
John Reck272a6852015-07-29 16:48:58 -070033#include <vector>
34
Dan Morrille4d9a012013-03-28 18:10:43 -070035#ifdef ANDROID_ENABLE_RENDERSCRIPT
Tim Murray250b1cf2013-08-01 14:49:22 -070036#include "RenderScript.h"
Chris Craikf2d8ccc2013-02-13 16:14:17 -080037namespace RSC {
38 class Element;
39 class RS;
40 class ScriptIntrinsicBlur;
Tim Murray250b1cf2013-08-01 14:49:22 -070041 class sp;
Chris Craikf2d8ccc2013-02-13 16:14:17 -080042}
Dan Morrille4d9a012013-03-28 18:10:43 -070043#endif
Chris Craikf2d8ccc2013-02-13 16:14:17 -080044
Romain Guy694b5192010-07-21 21:33:20 -070045namespace android {
46namespace uirenderer {
47
Chris Craika1717272015-11-19 13:02:43 -080048#if HWUI_NEW_OPS
49class BakedOpState;
50class BakedOpRenderer;
Chris Craike4db79d2015-12-22 16:32:23 -080051struct ClipBase;
Chris Craika1717272015-11-19 13:02:43 -080052#else
Victoria Lease1e546812013-06-25 14:25:17 -070053class OpenGLRenderer;
Chris Craika1717272015-11-19 13:02:43 -080054#endif
Victoria Lease1e546812013-06-25 14:25:17 -070055
Chris Craik82840732015-04-03 09:37:49 -070056class TextDrawFunctor {
Victoria Lease1e546812013-06-25 14:25:17 -070057public:
Chris Craika1717272015-11-19 13:02:43 -080058 TextDrawFunctor(
59#if HWUI_NEW_OPS
60 BakedOpRenderer* renderer,
61 const BakedOpState* bakedState,
Chris Craike4db79d2015-12-22 16:32:23 -080062 const ClipBase* clip,
Chris Craika1717272015-11-19 13:02:43 -080063#else
64 OpenGLRenderer* renderer,
65#endif
66 float x, float y, bool pureTranslate,
Chris Craik96a5c4c2015-01-27 15:46:35 -080067 int alpha, SkXfermode::Mode mode, const SkPaint* paint)
68 : renderer(renderer)
Chris Craika1717272015-11-19 13:02:43 -080069#if HWUI_NEW_OPS
70 , bakedState(bakedState)
Chris Craik15c3f192015-12-03 12:16:56 -080071 , clip(clip)
Chris Craika1717272015-11-19 13:02:43 -080072#endif
Chris Craik96a5c4c2015-01-27 15:46:35 -080073 , x(x)
74 , y(y)
75 , pureTranslate(pureTranslate)
76 , alpha(alpha)
77 , mode(mode)
78 , paint(paint) {
Victoria Lease1e546812013-06-25 14:25:17 -070079 }
Victoria Lease1e546812013-06-25 14:25:17 -070080
Chris Craike2bb3802015-03-13 15:07:52 -070081 void draw(CacheTexture& texture, bool linearFiltering);
Victoria Lease1e546812013-06-25 14:25:17 -070082
Chris Craika1717272015-11-19 13:02:43 -080083#if HWUI_NEW_OPS
84 BakedOpRenderer* renderer;
85 const BakedOpState* bakedState;
Chris Craike4db79d2015-12-22 16:32:23 -080086 const ClipBase* clip;
Chris Craika1717272015-11-19 13:02:43 -080087#else
Victoria Lease1e546812013-06-25 14:25:17 -070088 OpenGLRenderer* renderer;
Chris Craika1717272015-11-19 13:02:43 -080089#endif
Victoria Lease1e546812013-06-25 14:25:17 -070090 float x;
91 float y;
92 bool pureTranslate;
93 int alpha;
94 SkXfermode::Mode mode;
Chris Craikd218a922014-01-02 17:13:34 -080095 const SkPaint* paint;
Victoria Lease1e546812013-06-25 14:25:17 -070096};
97
Romain Guy694b5192010-07-21 21:33:20 -070098class FontRenderer {
99public:
Chris Craikc08820f2015-09-22 14:22:29 -0700100 FontRenderer(const uint8_t* gammaTable);
Romain Guy694b5192010-07-21 21:33:20 -0700101 ~FontRenderer();
102
John Reck272a6852015-07-29 16:48:58 -0700103 void flushLargeCaches(std::vector<CacheTexture*>& cacheTextures);
Chet Haase9a824562011-12-16 15:44:59 -0800104 void flushLargeCaches();
Romain Guy694b5192010-07-21 21:33:20 -0700105
Chris Craik59744b72014-07-01 17:56:52 -0700106 void setFont(const SkPaint* paint, const SkMatrix& matrix);
Chet Haasee816bae2012-08-09 13:39:02 -0700107
Chris Craike8c3c812016-02-05 20:10:50 -0800108 void precache(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, const SkMatrix& matrix);
Romain Guycf51a412013-04-08 19:40:31 -0700109 void endPrecaching();
Chet Haasee816bae2012-08-09 13:39:02 -0700110
Chris Craike8c3c812016-02-05 20:10:50 -0800111 bool renderPosText(const SkPaint* paint, const Rect* clip, const glyph_t* glyphs,
Chris Craika1717272015-11-19 13:02:43 -0800112 int numGlyphs, int x, int y, const float* positions,
113 Rect* outBounds, TextDrawFunctor* functor, bool forceFinish = true);
Chris Craik527a3aa2013-03-04 10:19:31 -0800114
Chris Craike8c3c812016-02-05 20:10:50 -0800115 bool renderTextOnPath(const SkPaint* paint, const Rect* clip, const glyph_t* glyphs,
Chris Craika1717272015-11-19 13:02:43 -0800116 int numGlyphs, const SkPath* path,
117 float hOffset, float vOffset, Rect* outBounds, TextDrawFunctor* functor);
Romain Guy694b5192010-07-21 21:33:20 -0700118
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700119 struct DropShadow {
120 uint32_t width;
121 uint32_t height;
122 uint8_t* image;
123 int32_t penX;
124 int32_t penY;
125 };
126
127 // After renderDropShadow returns, the called owns the memory in DropShadow.image
128 // and is responsible for releasing it when it's done with it
Chris Craike8c3c812016-02-05 20:10:50 -0800129 DropShadow renderDropShadow(const SkPaint* paint, const glyph_t *glyphs, int numGlyphs,
Chris Craika1717272015-11-19 13:02:43 -0800130 float radius, const float* positions);
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700131
Romain Guy257ae352013-03-20 16:31:12 -0700132 void setTextureFiltering(bool linearFiltering) {
Romain Guy80872462012-09-04 16:42:01 -0700133 mLinearFiltering = linearFiltering;
Romain Guy694b5192010-07-21 21:33:20 -0700134 }
135
sergeyvbaf29e72016-09-08 11:09:34 -0700136 uint32_t getSize() const;
137 void dumpMemoryUsage(String8& log) const;
Romain Guyc15008e2010-11-10 11:59:15 -0800138
Romain Guy9b1204b2012-09-04 15:22:57 -0700139private:
Romain Guy694b5192010-07-21 21:33:20 -0700140 friend class Font;
141
Romain Guyb45c0c92010-08-26 20:35:23 -0700142 const uint8_t* mGammaTable;
143
Chet Haase2a47c142011-12-14 15:22:56 -0800144 void allocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase9a824562011-12-16 15:44:59 -0800145 void deallocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase7de0cb12011-12-05 16:35:38 -0800146 void initTextTexture();
Victoria Lease1e546812013-06-25 14:25:17 -0700147 CacheTexture* createCacheTexture(int width, int height, GLenum format, bool allocate);
Chet Haase7de0cb12011-12-05 16:35:38 -0800148 void cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph,
Chet Haasef942cf12012-08-30 09:06:46 -0700149 uint32_t *retOriginX, uint32_t *retOriginY, bool precaching);
John Reck272a6852015-07-29 16:48:58 -0700150 CacheTexture* cacheBitmapInTexture(std::vector<CacheTexture*>& cacheTextures, const SkGlyph& glyph,
Victoria Lease1e546812013-06-25 14:25:17 -0700151 uint32_t* startX, uint32_t* startY);
Romain Guy694b5192010-07-21 21:33:20 -0700152
153 void flushAllAndInvalidate();
Romain Guy694b5192010-07-21 21:33:20 -0700154
155 void checkInit();
Chris Craik82840732015-04-03 09:37:49 -0700156 void initRender(const Rect* clip, Rect* bounds, TextDrawFunctor* functor);
Romain Guy671d6cf2012-01-18 12:39:17 -0800157 void finishRender();
Romain Guy694b5192010-07-21 21:33:20 -0700158
John Reck272a6852015-07-29 16:48:58 -0700159 void issueDrawCommand(std::vector<CacheTexture*>& cacheTextures);
Romain Guy694b5192010-07-21 21:33:20 -0700160 void issueDrawCommand();
Romain Guy97771732012-02-28 18:17:02 -0800161 void appendMeshQuadNoClip(float x1, float y1, float u1, float v1,
162 float x2, float y2, float u2, float v2,
163 float x3, float y3, float u3, float v3,
164 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guyd71dd362011-12-12 19:03:35 -0800165 void appendMeshQuad(float x1, float y1, float u1, float v1,
166 float x2, float y2, float u2, float v2,
167 float x3, float y3, float u3, float v3,
Chet Haase7de0cb12011-12-05 16:35:38 -0800168 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy97771732012-02-28 18:17:02 -0800169 void appendRotatedMeshQuad(float x1, float y1, float u1, float v1,
170 float x2, float y2, float u2, float v2,
171 float x3, float y3, float u3, float v3,
172 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy694b5192010-07-21 21:33:20 -0700173
Romain Guy9b1204b2012-09-04 15:22:57 -0700174 void checkTextureUpdate();
175
176 void setTextureDirty() {
177 mUploadTexture = true;
178 }
179
sergeyvbaf29e72016-09-08 11:09:34 -0700180 const std::vector<CacheTexture*>& cacheTexturesForFormat(GLenum format) const;
181 uint32_t getCacheSize(GLenum format) const;
182 uint32_t getFreeCacheSize(GLenum format) const;
183
Chet Haase7de0cb12011-12-05 16:35:38 -0800184 uint32_t mSmallCacheWidth;
185 uint32_t mSmallCacheHeight;
Chet Haaseeb32a492012-08-31 13:54:03 -0700186 uint32_t mLargeCacheWidth;
187 uint32_t mLargeCacheHeight;
Romain Guy694b5192010-07-21 21:33:20 -0700188
John Reck272a6852015-07-29 16:48:58 -0700189 std::vector<CacheTexture*> mACacheTextures;
190 std::vector<CacheTexture*> mRGBACacheTextures;
Romain Guy694b5192010-07-21 21:33:20 -0700191
Romain Guy09147fb2010-07-22 13:08:20 -0700192 Font* mCurrentFont;
Romain Guye3a9b242013-01-08 11:15:30 -0800193 LruCache<Font::FontDescription, Font*> mActiveFonts;
Romain Guy694b5192010-07-21 21:33:20 -0700194
Chet Haase7de0cb12011-12-05 16:35:38 -0800195 CacheTexture* mCurrentCacheTexture;
Chet Haase7de0cb12011-12-05 16:35:38 -0800196
Romain Guy694b5192010-07-21 21:33:20 -0700197 bool mUploadTexture;
198
Chris Craik82840732015-04-03 09:37:49 -0700199 TextDrawFunctor* mFunctor;
Romain Guy09147fb2010-07-22 13:08:20 -0700200 const Rect* mClip;
Romain Guy5b3b3522010-10-27 18:57:51 -0700201 Rect* mBounds;
202 bool mDrawn;
Romain Guy09147fb2010-07-22 13:08:20 -0700203
Romain Guy694b5192010-07-21 21:33:20 -0700204 bool mInitialized;
Alex Sakhartchouk89a524a2010-08-02 17:52:30 -0700205
Romain Guye8cb9c142010-10-04 14:14:11 -0700206 bool mLinearFiltering;
207
Dan Morrille4d9a012013-03-28 18:10:43 -0700208#ifdef ANDROID_ENABLE_RENDERSCRIPT
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800209 // RS constructs
Tim Murray250b1cf2013-08-01 14:49:22 -0700210 RSC::sp<RSC::RS> mRs;
211 RSC::sp<const RSC::Element> mRsElement;
212 RSC::sp<RSC::ScriptIntrinsicBlur> mRsScript;
Dan Morrille4d9a012013-03-28 18:10:43 -0700213#endif
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800214
Romain Guy9b1204b2012-09-04 15:22:57 -0700215 static void computeGaussianWeights(float* weights, int32_t radius);
216 static void horizontalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700217 int32_t width, int32_t height);
Romain Guy9b1204b2012-09-04 15:22:57 -0700218 static void verticalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700219 int32_t width, int32_t height);
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800220
221 // the input image handle may have its pointer replaced (to avoid copies)
Derek Sollenbergere392c812014-05-21 11:25:22 -0400222 void blurImage(uint8_t** image, int32_t width, int32_t height, float radius);
Romain Guy694b5192010-07-21 21:33:20 -0700223};
224
225}; // namespace uirenderer
226}; // namespace android
227
Romain Guy5b3b3522010-10-27 18:57:51 -0700228#endif // ANDROID_HWUI_FONT_RENDERER_H