blob: dedc4944299d693615170e708d30d9040dadf483 [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
Chris Craik5e00c7c2016-07-06 16:10:09 -070017#pragma once
Romain Guy694b5192010-07-21 21:33:20 -070018
Chris Craik96a5c4c2015-01-27 15:46:35 -080019#include "font/FontUtil.h"
20#include "font/CacheTexture.h"
21#include "font/CachedGlyphInfo.h"
22#include "font/Font.h"
Chris Craik96a5c4c2015-01-27 15:46:35 -080023
Romain Guye3a9b242013-01-08 11:15:30 -080024#include <utils/LruCache.h>
Mathias Agopian1f5762e2013-05-06 20:20:34 -070025#include <utils/StrongPointer.h>
Romain Guy694b5192010-07-21 21:33:20 -070026
Romain Guy694b5192010-07-21 21:33:20 -070027#include <SkPaint.h>
28
29#include <GLES2/gl2.h>
30
John Reck272a6852015-07-29 16:48:58 -070031#include <vector>
32
Dan Morrille4d9a012013-03-28 18:10:43 -070033#ifdef ANDROID_ENABLE_RENDERSCRIPT
Tim Murray250b1cf2013-08-01 14:49:22 -070034#include "RenderScript.h"
Chris Craikf2d8ccc2013-02-13 16:14:17 -080035namespace RSC {
36 class Element;
37 class RS;
38 class ScriptIntrinsicBlur;
Tim Murray250b1cf2013-08-01 14:49:22 -070039 class sp;
Chris Craikf2d8ccc2013-02-13 16:14:17 -080040}
Dan Morrille4d9a012013-03-28 18:10:43 -070041#endif
Chris Craikf2d8ccc2013-02-13 16:14:17 -080042
Romain Guy694b5192010-07-21 21:33:20 -070043namespace android {
44namespace uirenderer {
45
Chris Craika1717272015-11-19 13:02:43 -080046class BakedOpState;
47class BakedOpRenderer;
Chris Craike4db79d2015-12-22 16:32:23 -080048struct ClipBase;
Victoria Lease1e546812013-06-25 14:25:17 -070049
Chris Craik82840732015-04-03 09:37:49 -070050class TextDrawFunctor {
Victoria Lease1e546812013-06-25 14:25:17 -070051public:
Chris Craika1717272015-11-19 13:02:43 -080052 TextDrawFunctor(
Chris Craika1717272015-11-19 13:02:43 -080053 BakedOpRenderer* renderer,
54 const BakedOpState* bakedState,
Chris Craike4db79d2015-12-22 16:32:23 -080055 const ClipBase* clip,
Chris Craika1717272015-11-19 13:02:43 -080056 float x, float y, bool pureTranslate,
Chris Craik96a5c4c2015-01-27 15:46:35 -080057 int alpha, SkXfermode::Mode mode, const SkPaint* paint)
58 : renderer(renderer)
Chris Craika1717272015-11-19 13:02:43 -080059 , bakedState(bakedState)
Chris Craik15c3f192015-12-03 12:16:56 -080060 , clip(clip)
Chris Craik96a5c4c2015-01-27 15:46:35 -080061 , x(x)
62 , y(y)
63 , pureTranslate(pureTranslate)
64 , alpha(alpha)
65 , mode(mode)
66 , paint(paint) {
Victoria Lease1e546812013-06-25 14:25:17 -070067 }
Victoria Lease1e546812013-06-25 14:25:17 -070068
Chris Craike2bb3802015-03-13 15:07:52 -070069 void draw(CacheTexture& texture, bool linearFiltering);
Victoria Lease1e546812013-06-25 14:25:17 -070070
Chris Craika1717272015-11-19 13:02:43 -080071 BakedOpRenderer* renderer;
72 const BakedOpState* bakedState;
Chris Craike4db79d2015-12-22 16:32:23 -080073 const ClipBase* clip;
Victoria Lease1e546812013-06-25 14:25:17 -070074 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
Romain Guy694b5192010-07-21 21:33:20 -070082class FontRenderer {
83public:
Chris Craikc08820f2015-09-22 14:22:29 -070084 FontRenderer(const uint8_t* gammaTable);
Romain Guy694b5192010-07-21 21:33:20 -070085 ~FontRenderer();
86
John Reck272a6852015-07-29 16:48:58 -070087 void flushLargeCaches(std::vector<CacheTexture*>& cacheTextures);
Chet Haase9a824562011-12-16 15:44:59 -080088 void flushLargeCaches();
Romain Guy694b5192010-07-21 21:33:20 -070089
Chris Craik59744b72014-07-01 17:56:52 -070090 void setFont(const SkPaint* paint, const SkMatrix& matrix);
Chet Haasee816bae2012-08-09 13:39:02 -070091
Chris Craike8c3c812016-02-05 20:10:50 -080092 void precache(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, const SkMatrix& matrix);
Romain Guycf51a412013-04-08 19:40:31 -070093 void endPrecaching();
Chet Haasee816bae2012-08-09 13:39:02 -070094
Chris Craike8c3c812016-02-05 20:10:50 -080095 bool renderPosText(const SkPaint* paint, const Rect* clip, const glyph_t* glyphs,
Chris Craika1717272015-11-19 13:02:43 -080096 int numGlyphs, int x, int y, const float* positions,
97 Rect* outBounds, TextDrawFunctor* functor, bool forceFinish = true);
Chris Craik527a3aa2013-03-04 10:19:31 -080098
Chris Craike8c3c812016-02-05 20:10:50 -080099 bool renderTextOnPath(const SkPaint* paint, const Rect* clip, const glyph_t* glyphs,
Chris Craika1717272015-11-19 13:02:43 -0800100 int numGlyphs, const SkPath* path,
101 float hOffset, float vOffset, Rect* outBounds, TextDrawFunctor* functor);
Romain Guy694b5192010-07-21 21:33:20 -0700102
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700103 struct DropShadow {
104 uint32_t width;
105 uint32_t height;
106 uint8_t* image;
107 int32_t penX;
108 int32_t penY;
109 };
110
111 // After renderDropShadow returns, the called owns the memory in DropShadow.image
112 // and is responsible for releasing it when it's done with it
Chris Craike8c3c812016-02-05 20:10:50 -0800113 DropShadow renderDropShadow(const SkPaint* paint, const glyph_t *glyphs, int numGlyphs,
Chris Craika1717272015-11-19 13:02:43 -0800114 float radius, const float* positions);
Alex Sakhartchoukf18136c2010-08-06 14:49:04 -0700115
Romain Guy257ae352013-03-20 16:31:12 -0700116 void setTextureFiltering(bool linearFiltering) {
Romain Guy80872462012-09-04 16:42:01 -0700117 mLinearFiltering = linearFiltering;
Romain Guy694b5192010-07-21 21:33:20 -0700118 }
119
Victoria Lease1e546812013-06-25 14:25:17 -0700120 uint32_t getCacheSize(GLenum format) const;
Romain Guyc15008e2010-11-10 11:59:15 -0800121
Romain Guy9b1204b2012-09-04 15:22:57 -0700122private:
Romain Guy694b5192010-07-21 21:33:20 -0700123 friend class Font;
124
Romain Guyb45c0c92010-08-26 20:35:23 -0700125 const uint8_t* mGammaTable;
126
Chet Haase2a47c142011-12-14 15:22:56 -0800127 void allocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase9a824562011-12-16 15:44:59 -0800128 void deallocateTextureMemory(CacheTexture* cacheTexture);
Chet Haase7de0cb12011-12-05 16:35:38 -0800129 void initTextTexture();
Victoria Lease1e546812013-06-25 14:25:17 -0700130 CacheTexture* createCacheTexture(int width, int height, GLenum format, bool allocate);
Chet Haase7de0cb12011-12-05 16:35:38 -0800131 void cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph,
Chet Haasef942cf12012-08-30 09:06:46 -0700132 uint32_t *retOriginX, uint32_t *retOriginY, bool precaching);
John Reck272a6852015-07-29 16:48:58 -0700133 CacheTexture* cacheBitmapInTexture(std::vector<CacheTexture*>& cacheTextures, const SkGlyph& glyph,
Victoria Lease1e546812013-06-25 14:25:17 -0700134 uint32_t* startX, uint32_t* startY);
Romain Guy694b5192010-07-21 21:33:20 -0700135
136 void flushAllAndInvalidate();
Romain Guy694b5192010-07-21 21:33:20 -0700137
138 void checkInit();
Chris Craik82840732015-04-03 09:37:49 -0700139 void initRender(const Rect* clip, Rect* bounds, TextDrawFunctor* functor);
Romain Guy671d6cf2012-01-18 12:39:17 -0800140 void finishRender();
Romain Guy694b5192010-07-21 21:33:20 -0700141
John Reck272a6852015-07-29 16:48:58 -0700142 void issueDrawCommand(std::vector<CacheTexture*>& cacheTextures);
Romain Guy694b5192010-07-21 21:33:20 -0700143 void issueDrawCommand();
Romain Guy97771732012-02-28 18:17:02 -0800144 void appendMeshQuadNoClip(float x1, float y1, float u1, float v1,
145 float x2, float y2, float u2, float v2,
146 float x3, float y3, float u3, float v3,
147 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guyd71dd362011-12-12 19:03:35 -0800148 void appendMeshQuad(float x1, float y1, float u1, float v1,
149 float x2, float y2, float u2, float v2,
150 float x3, float y3, float u3, float v3,
Chet Haase7de0cb12011-12-05 16:35:38 -0800151 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy97771732012-02-28 18:17:02 -0800152 void appendRotatedMeshQuad(float x1, float y1, float u1, float v1,
153 float x2, float y2, float u2, float v2,
154 float x3, float y3, float u3, float v3,
155 float x4, float y4, float u4, float v4, CacheTexture* texture);
Romain Guy694b5192010-07-21 21:33:20 -0700156
Romain Guy9b1204b2012-09-04 15:22:57 -0700157 void checkTextureUpdate();
158
159 void setTextureDirty() {
160 mUploadTexture = true;
161 }
162
Chet Haase7de0cb12011-12-05 16:35:38 -0800163 uint32_t mSmallCacheWidth;
164 uint32_t mSmallCacheHeight;
Chet Haaseeb32a492012-08-31 13:54:03 -0700165 uint32_t mLargeCacheWidth;
166 uint32_t mLargeCacheHeight;
Romain Guy694b5192010-07-21 21:33:20 -0700167
John Reck272a6852015-07-29 16:48:58 -0700168 std::vector<CacheTexture*> mACacheTextures;
169 std::vector<CacheTexture*> mRGBACacheTextures;
Romain Guy694b5192010-07-21 21:33:20 -0700170
Romain Guy09147fb2010-07-22 13:08:20 -0700171 Font* mCurrentFont;
Romain Guye3a9b242013-01-08 11:15:30 -0800172 LruCache<Font::FontDescription, Font*> mActiveFonts;
Romain Guy694b5192010-07-21 21:33:20 -0700173
Chet Haase7de0cb12011-12-05 16:35:38 -0800174 CacheTexture* mCurrentCacheTexture;
Chet Haase7de0cb12011-12-05 16:35:38 -0800175
Romain Guy694b5192010-07-21 21:33:20 -0700176 bool mUploadTexture;
177
Chris Craik82840732015-04-03 09:37:49 -0700178 TextDrawFunctor* mFunctor;
Romain Guy09147fb2010-07-22 13:08:20 -0700179 const Rect* mClip;
Romain Guy5b3b3522010-10-27 18:57:51 -0700180 Rect* mBounds;
181 bool mDrawn;
Romain Guy09147fb2010-07-22 13:08:20 -0700182
Romain Guy694b5192010-07-21 21:33:20 -0700183 bool mInitialized;
Alex Sakhartchouk89a524a2010-08-02 17:52:30 -0700184
Romain Guye8cb9c142010-10-04 14:14:11 -0700185 bool mLinearFiltering;
186
Dan Morrille4d9a012013-03-28 18:10:43 -0700187#ifdef ANDROID_ENABLE_RENDERSCRIPT
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800188 // RS constructs
Tim Murray250b1cf2013-08-01 14:49:22 -0700189 RSC::sp<RSC::RS> mRs;
190 RSC::sp<const RSC::Element> mRsElement;
191 RSC::sp<RSC::ScriptIntrinsicBlur> mRsScript;
Dan Morrille4d9a012013-03-28 18:10:43 -0700192#endif
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800193
Romain Guy9b1204b2012-09-04 15:22:57 -0700194 static void computeGaussianWeights(float* weights, int32_t radius);
195 static void horizontalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700196 int32_t width, int32_t height);
Romain Guy9b1204b2012-09-04 15:22:57 -0700197 static void verticalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
Romain Guy1e45aae2010-08-13 19:39:53 -0700198 int32_t width, int32_t height);
Chris Craikf2d8ccc2013-02-13 16:14:17 -0800199
200 // the input image handle may have its pointer replaced (to avoid copies)
Derek Sollenbergere392c812014-05-21 11:25:22 -0400201 void blurImage(uint8_t** image, int32_t width, int32_t height, float radius);
Romain Guy694b5192010-07-21 21:33:20 -0700202};
203
204}; // namespace uirenderer
205}; // namespace android