blob: 2ec99c9cf43fa481133224b46bf078bd9072f1c9 [file] [log] [blame]
Chris Craikb4589422013-12-26 15:13:13 -08001/*
2 * Copyright (C) 2013 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
17#ifndef ANDROID_HWUI_RENDERER_H
18#define ANDROID_HWUI_RENDERER_H
19
Chris Craik14e51302013-12-30 15:32:54 -080020#include <SkRegion.h>
21
22#include <utils/String8.h>
23
Chris Craikb4589422013-12-26 15:13:13 -080024#include "AssetAtlas.h"
25#include "SkPaint.h"
26
27namespace android {
Chris Craik14e51302013-12-30 15:32:54 -080028
29class Functor;
Chris Craik564acf72014-01-02 16:46:18 -080030struct Res_png_9patch;
Chris Craik14e51302013-12-30 15:32:54 -080031
Chris Craikb4589422013-12-26 15:13:13 -080032namespace uirenderer {
33
John Recke18264b2014-03-12 13:56:30 -070034class RenderNode;
Chris Craikb4589422013-12-26 15:13:13 -080035class Layer;
36class Matrix4;
37class SkiaColorFilter;
Chris Craikb4589422013-12-26 15:13:13 -080038class Patch;
39
40enum DrawOpMode {
41 kDrawOpMode_Immediate,
42 kDrawOpMode_Defer,
43 kDrawOpMode_Flush
44};
45
46/**
47 * Hwui's abstract version of Canvas.
48 *
49 * Provides methods for frame state operations, as well as the SkCanvas style transform/clip state,
50 * and varied drawing operations.
51 *
52 * Should at some point interact with native SkCanvas.
53 */
54class ANDROID_API Renderer {
55public:
56 virtual ~Renderer() {}
57
58 /**
Chris Craikb4589422013-12-26 15:13:13 -080059 * Indicates whether this renderer is recording drawing commands for later playback.
60 * If this method returns true, the drawing commands are deferred.
61 */
62 virtual bool isRecording() const {
63 return false;
64 }
65
66 /**
67 * Safely retrieves the mode from the specified xfermode. If the specified
68 * xfermode is null, the mode is assumed to be SkXfermode::kSrcOver_Mode.
69 */
70 static inline SkXfermode::Mode getXfermode(SkXfermode* mode) {
71 SkXfermode::Mode resultMode;
72 if (!SkXfermode::AsMode(mode, &resultMode)) {
73 resultMode = SkXfermode::kSrcOver_Mode;
74 }
75 return resultMode;
76 }
77
78// ----------------------------------------------------------------------------
79// Frame state operations
80// ----------------------------------------------------------------------------
81 /**
82 * Sets the dimension of the underlying drawing surface. This method must
83 * be called at least once every time the drawing surface changes size.
84 *
85 * @param width The width in pixels of the underlysing surface
86 * @param height The height in pixels of the underlysing surface
87 */
88 virtual void setViewport(int width, int height) = 0;
89
90 /**
Chris Craik797b95b22014-05-20 18:10:25 -070091 * Sets the position and size of the spot shadow casting light.
92 *
93 * @param lightCenter The light's Y position, relative to the render target's top left
94 * @param lightRadius The light's radius
95 */
96 virtual void initializeLight(const Vector3& lightCenter, float lightRadius) = 0;
97
98 /**
Chris Craikb4589422013-12-26 15:13:13 -080099 * Prepares the renderer to draw a frame. This method must be invoked
100 * at the beginning of each frame. When this method is invoked, the
101 * entire drawing surface is assumed to be redrawn.
102 *
103 * @param opaque If true, the target surface is considered opaque
104 * and will not be cleared. If false, the target surface
105 * will be cleared
106 */
107 virtual status_t prepare(bool opaque) = 0;
108
109 /**
110 * Prepares the renderer to draw a frame. This method must be invoked
111 * at the beginning of each frame. Only the specified rectangle of the
112 * frame is assumed to be dirty. A clip will automatically be set to
113 * the specified rectangle.
114 *
115 * @param left The left coordinate of the dirty rectangle
116 * @param top The top coordinate of the dirty rectangle
117 * @param right The right coordinate of the dirty rectangle
118 * @param bottom The bottom coordinate of the dirty rectangle
119 * @param opaque If true, the target surface is considered opaque
120 * and will not be cleared. If false, the target surface
121 * will be cleared in the specified dirty rectangle
122 */
123 virtual status_t prepareDirty(float left, float top, float right, float bottom,
124 bool opaque) = 0;
125
126 /**
127 * Indicates the end of a frame. This method must be invoked whenever
128 * the caller is done rendering a frame.
129 */
130 virtual void finish() = 0;
131
Chris Craikb4589422013-12-26 15:13:13 -0800132// ----------------------------------------------------------------------------
133// Canvas state operations
134// ----------------------------------------------------------------------------
Chris Craik14e51302013-12-30 15:32:54 -0800135 // Save (layer)
Chris Craikb4589422013-12-26 15:13:13 -0800136 virtual int getSaveCount() const = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800137 virtual int save(int flags) = 0;
138 virtual void restore() = 0;
139 virtual void restoreToCount(int saveCount) = 0;
140
Derek Sollenbergerd44fbe52014-02-05 16:47:00 -0500141 virtual int saveLayer(float left, float top, float right, float bottom,
142 const SkPaint* paint, int flags) = 0;
143
Chris Craikb4589422013-12-26 15:13:13 -0800144 int saveLayerAlpha(float left, float top, float right, float bottom,
145 int alpha, int flags) {
Derek Sollenbergerd44fbe52014-02-05 16:47:00 -0500146 SkPaint paint;
147 paint.setAlpha(alpha);
148 return saveLayer(left, top, right, bottom, &paint, flags);
Chris Craikb4589422013-12-26 15:13:13 -0800149 }
Chris Craikb4589422013-12-26 15:13:13 -0800150
151 // Matrix
Chris Craik14e51302013-12-30 15:32:54 -0800152 virtual void getMatrix(SkMatrix* outMatrix) const = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800153 virtual void translate(float dx, float dy, float dz = 0.0f) = 0;
154 virtual void rotate(float degrees) = 0;
155 virtual void scale(float sx, float sy) = 0;
156 virtual void skew(float sx, float sy) = 0;
157
Derek Sollenberger13908822013-12-10 12:28:58 -0500158 virtual void setMatrix(const SkMatrix& matrix) = 0;
159 virtual void concatMatrix(const SkMatrix& matrix) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800160
Chris Craik14e51302013-12-30 15:32:54 -0800161 // clip
Chris Craik3f0854292014-04-15 16:18:08 -0700162 virtual const Rect& getLocalClipBounds() const = 0;
Chris Craik14e51302013-12-30 15:32:54 -0800163 virtual bool quickRejectConservative(float left, float top,
164 float right, float bottom) const = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800165 virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op) = 0;
Chris Craikd218a922014-01-02 17:13:34 -0800166 virtual bool clipPath(const SkPath* path, SkRegion::Op op) = 0;
167 virtual bool clipRegion(const SkRegion* region, SkRegion::Op op) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800168
169 // Misc - should be implemented with SkPaint inspection
Chris Craikb4589422013-12-26 15:13:13 -0800170 virtual void resetPaintFilter() = 0;
171 virtual void setupPaintFilter(int clearBits, int setBits) = 0;
172
173// ----------------------------------------------------------------------------
174// Canvas draw operations
175// ----------------------------------------------------------------------------
176 virtual status_t drawColor(int color, SkXfermode::Mode mode) = 0;
177
178 // Bitmap-based
Chris Craikd218a922014-01-02 17:13:34 -0800179 virtual status_t drawBitmap(const SkBitmap* bitmap, float left, float top,
180 const SkPaint* paint) = 0;
Derek Sollenberger13908822013-12-10 12:28:58 -0500181 virtual status_t drawBitmap(const SkBitmap* bitmap, const SkMatrix& matrix,
Chris Craikd218a922014-01-02 17:13:34 -0800182 const SkPaint* paint) = 0;
183 virtual status_t drawBitmap(const SkBitmap* bitmap, float srcLeft, float srcTop,
Chris Craikb4589422013-12-26 15:13:13 -0800184 float srcRight, float srcBottom, float dstLeft, float dstTop,
Chris Craikd218a922014-01-02 17:13:34 -0800185 float dstRight, float dstBottom, const SkPaint* paint) = 0;
186 virtual status_t drawBitmapData(const SkBitmap* bitmap, float left, float top,
187 const SkPaint* paint) = 0;
188 virtual status_t drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight,
189 const float* vertices, const int* colors, const SkPaint* paint) = 0;
190 virtual status_t drawPatch(const SkBitmap* bitmap, const Res_png_9patch* patch,
191 float left, float top, float right, float bottom, const SkPaint* paint) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800192
193 // Shapes
Chris Craikd218a922014-01-02 17:13:34 -0800194 virtual status_t drawRect(float left, float top, float right, float bottom,
195 const SkPaint* paint) = 0;
196 virtual status_t drawRects(const float* rects, int count, const SkPaint* paint) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800197 virtual status_t drawRoundRect(float left, float top, float right, float bottom,
Chris Craikd218a922014-01-02 17:13:34 -0800198 float rx, float ry, const SkPaint* paint) = 0;
199 virtual status_t drawCircle(float x, float y, float radius, const SkPaint* paint) = 0;
200 virtual status_t drawOval(float left, float top, float right, float bottom,
201 const SkPaint* paint) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800202 virtual status_t drawArc(float left, float top, float right, float bottom,
Chris Craikd218a922014-01-02 17:13:34 -0800203 float startAngle, float sweepAngle, bool useCenter, const SkPaint* paint) = 0;
204 virtual status_t drawPath(const SkPath* path, const SkPaint* paint) = 0;
205 virtual status_t drawLines(const float* points, int count, const SkPaint* paint) = 0;
206 virtual status_t drawPoints(const float* points, int count, const SkPaint* paint) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800207
208 // Text
209 virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y,
Chris Craikd218a922014-01-02 17:13:34 -0800210 const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds,
Chris Craikb4589422013-12-26 15:13:13 -0800211 DrawOpMode drawOpMode = kDrawOpMode_Immediate) = 0;
Chris Craikd218a922014-01-02 17:13:34 -0800212 virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, const SkPath* path,
213 float hOffset, float vOffset, const SkPaint* paint) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800214 virtual status_t drawPosText(const char* text, int bytesCount, int count,
Chris Craikd218a922014-01-02 17:13:34 -0800215 const float* positions, const SkPaint* paint) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800216
217// ----------------------------------------------------------------------------
218// Canvas draw operations - special
219// ----------------------------------------------------------------------------
220 virtual status_t drawLayer(Layer* layer, float x, float y) = 0;
Chris Craika7090e02014-06-20 16:01:00 -0700221 virtual status_t drawRenderNode(RenderNode* renderNode, Rect& dirty,
Chris Craikb4589422013-12-26 15:13:13 -0800222 int32_t replayFlags) = 0;
223
224 // TODO: rename for consistency
225 virtual status_t callDrawGLFunction(Functor* functor, Rect& dirty) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800226}; // class Renderer
227
228}; // namespace uirenderer
229}; // namespace android
230
231#endif // ANDROID_HWUI_RENDERER_H