blob: 058548abe58354af3ec1bbfbe4ac9fa3d3677b12 [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
34class DisplayList;
35class Layer;
36class Matrix4;
37class SkiaColorFilter;
38class SkiaShader;
39class Patch;
40
41enum DrawOpMode {
42 kDrawOpMode_Immediate,
43 kDrawOpMode_Defer,
44 kDrawOpMode_Flush
45};
46
47/**
48 * Hwui's abstract version of Canvas.
49 *
50 * Provides methods for frame state operations, as well as the SkCanvas style transform/clip state,
51 * and varied drawing operations.
52 *
53 * Should at some point interact with native SkCanvas.
54 */
55class ANDROID_API Renderer {
56public:
57 virtual ~Renderer() {}
58
59 /**
Chris Craikb4589422013-12-26 15:13:13 -080060 * Indicates whether this renderer is recording drawing commands for later playback.
61 * If this method returns true, the drawing commands are deferred.
62 */
63 virtual bool isRecording() const {
64 return false;
65 }
66
67 /**
68 * Safely retrieves the mode from the specified xfermode. If the specified
69 * xfermode is null, the mode is assumed to be SkXfermode::kSrcOver_Mode.
70 */
71 static inline SkXfermode::Mode getXfermode(SkXfermode* mode) {
72 SkXfermode::Mode resultMode;
73 if (!SkXfermode::AsMode(mode, &resultMode)) {
74 resultMode = SkXfermode::kSrcOver_Mode;
75 }
76 return resultMode;
77 }
78
79// ----------------------------------------------------------------------------
80// Frame state operations
81// ----------------------------------------------------------------------------
82 /**
83 * Sets the dimension of the underlying drawing surface. This method must
84 * be called at least once every time the drawing surface changes size.
85 *
86 * @param width The width in pixels of the underlysing surface
87 * @param height The height in pixels of the underlysing surface
88 */
89 virtual void setViewport(int width, int height) = 0;
90
91 /**
92 * Prepares the renderer to draw a frame. This method must be invoked
93 * at the beginning of each frame. When this method is invoked, the
94 * entire drawing surface is assumed to be redrawn.
95 *
96 * @param opaque If true, the target surface is considered opaque
97 * and will not be cleared. If false, the target surface
98 * will be cleared
99 */
100 virtual status_t prepare(bool opaque) = 0;
101
102 /**
103 * Prepares the renderer to draw a frame. This method must be invoked
104 * at the beginning of each frame. Only the specified rectangle of the
105 * frame is assumed to be dirty. A clip will automatically be set to
106 * the specified rectangle.
107 *
108 * @param left The left coordinate of the dirty rectangle
109 * @param top The top coordinate of the dirty rectangle
110 * @param right The right coordinate of the dirty rectangle
111 * @param bottom The bottom coordinate of the dirty rectangle
112 * @param opaque If true, the target surface is considered opaque
113 * and will not be cleared. If false, the target surface
114 * will be cleared in the specified dirty rectangle
115 */
116 virtual status_t prepareDirty(float left, float top, float right, float bottom,
117 bool opaque) = 0;
118
119 /**
120 * Indicates the end of a frame. This method must be invoked whenever
121 * the caller is done rendering a frame.
122 */
123 virtual void finish() = 0;
124
125 /**
126 * This method must be invoked before handing control over to a draw functor.
127 * See callDrawGLFunction() for instance.
128 *
129 * This command must not be recorded inside display lists.
130 */
131 virtual void interrupt() = 0;
132
133 /**
134 * This method must be invoked after getting control back from a draw functor.
135 *
136 * This command must not be recorded inside display lists.
137 */
138 virtual void resume() = 0;
139
140// ----------------------------------------------------------------------------
141// Canvas state operations
142// ----------------------------------------------------------------------------
Chris Craik14e51302013-12-30 15:32:54 -0800143 // Save (layer)
Chris Craikb4589422013-12-26 15:13:13 -0800144 virtual int getSaveCount() const = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800145 virtual int save(int flags) = 0;
146 virtual void restore() = 0;
147 virtual void restoreToCount(int saveCount) = 0;
148
Derek Sollenbergerd44fbe52014-02-05 16:47:00 -0500149 virtual int saveLayer(float left, float top, float right, float bottom,
150 const SkPaint* paint, int flags) = 0;
151
Chris Craikb4589422013-12-26 15:13:13 -0800152 int saveLayerAlpha(float left, float top, float right, float bottom,
153 int alpha, int flags) {
Derek Sollenbergerd44fbe52014-02-05 16:47:00 -0500154 SkPaint paint;
155 paint.setAlpha(alpha);
156 return saveLayer(left, top, right, bottom, &paint, flags);
Chris Craikb4589422013-12-26 15:13:13 -0800157 }
Chris Craikb4589422013-12-26 15:13:13 -0800158
159 // Matrix
Chris Craik14e51302013-12-30 15:32:54 -0800160 virtual void getMatrix(SkMatrix* outMatrix) const = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800161 virtual void translate(float dx, float dy, float dz = 0.0f) = 0;
162 virtual void rotate(float degrees) = 0;
163 virtual void scale(float sx, float sy) = 0;
164 virtual void skew(float sx, float sy) = 0;
165
Chris Craikd218a922014-01-02 17:13:34 -0800166 virtual void setMatrix(const SkMatrix* matrix) = 0;
167 virtual void concatMatrix(const SkMatrix* matrix) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800168
Chris Craik14e51302013-12-30 15:32:54 -0800169 // clip
170 virtual const Rect& getClipBounds() const = 0;
171 virtual bool quickRejectConservative(float left, float top,
172 float right, float bottom) const = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800173 virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op) = 0;
Chris Craikd218a922014-01-02 17:13:34 -0800174 virtual bool clipPath(const SkPath* path, SkRegion::Op op) = 0;
175 virtual bool clipRegion(const SkRegion* region, SkRegion::Op op) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800176
177 // Misc - should be implemented with SkPaint inspection
178 virtual void resetShader() = 0;
179 virtual void setupShader(SkiaShader* shader) = 0;
180
181 virtual void resetColorFilter() = 0;
182 virtual void setupColorFilter(SkiaColorFilter* filter) = 0;
183
184 virtual void resetShadow() = 0;
185 virtual void setupShadow(float radius, float dx, float dy, int color) = 0;
186
187 virtual void resetPaintFilter() = 0;
188 virtual void setupPaintFilter(int clearBits, int setBits) = 0;
189
190// ----------------------------------------------------------------------------
191// Canvas draw operations
192// ----------------------------------------------------------------------------
193 virtual status_t drawColor(int color, SkXfermode::Mode mode) = 0;
194
195 // Bitmap-based
Chris Craikd218a922014-01-02 17:13:34 -0800196 virtual status_t drawBitmap(const SkBitmap* bitmap, float left, float top,
197 const SkPaint* paint) = 0;
198 virtual status_t drawBitmap(const SkBitmap* bitmap, const SkMatrix* matrix,
199 const SkPaint* paint) = 0;
200 virtual status_t drawBitmap(const SkBitmap* bitmap, float srcLeft, float srcTop,
Chris Craikb4589422013-12-26 15:13:13 -0800201 float srcRight, float srcBottom, float dstLeft, float dstTop,
Chris Craikd218a922014-01-02 17:13:34 -0800202 float dstRight, float dstBottom, const SkPaint* paint) = 0;
203 virtual status_t drawBitmapData(const SkBitmap* bitmap, float left, float top,
204 const SkPaint* paint) = 0;
205 virtual status_t drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight,
206 const float* vertices, const int* colors, const SkPaint* paint) = 0;
207 virtual status_t drawPatch(const SkBitmap* bitmap, const Res_png_9patch* patch,
208 float left, float top, float right, float bottom, const SkPaint* paint) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800209
210 // Shapes
Chris Craikd218a922014-01-02 17:13:34 -0800211 virtual status_t drawRect(float left, float top, float right, float bottom,
212 const SkPaint* paint) = 0;
213 virtual status_t drawRects(const float* rects, int count, const SkPaint* paint) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800214 virtual status_t drawRoundRect(float left, float top, float right, float bottom,
Chris Craikd218a922014-01-02 17:13:34 -0800215 float rx, float ry, const SkPaint* paint) = 0;
216 virtual status_t drawCircle(float x, float y, float radius, const SkPaint* paint) = 0;
217 virtual status_t drawOval(float left, float top, float right, float bottom,
218 const SkPaint* paint) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800219 virtual status_t drawArc(float left, float top, float right, float bottom,
Chris Craikd218a922014-01-02 17:13:34 -0800220 float startAngle, float sweepAngle, bool useCenter, const SkPaint* paint) = 0;
221 virtual status_t drawPath(const SkPath* path, const SkPaint* paint) = 0;
222 virtual status_t drawLines(const float* points, int count, const SkPaint* paint) = 0;
223 virtual status_t drawPoints(const float* points, int count, const SkPaint* paint) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800224
225 // Text
226 virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y,
Chris Craikd218a922014-01-02 17:13:34 -0800227 const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds,
Chris Craikb4589422013-12-26 15:13:13 -0800228 DrawOpMode drawOpMode = kDrawOpMode_Immediate) = 0;
Chris Craikd218a922014-01-02 17:13:34 -0800229 virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, const SkPath* path,
230 float hOffset, float vOffset, const SkPaint* paint) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800231 virtual status_t drawPosText(const char* text, int bytesCount, int count,
Chris Craikd218a922014-01-02 17:13:34 -0800232 const float* positions, const SkPaint* paint) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800233
234// ----------------------------------------------------------------------------
235// Canvas draw operations - special
236// ----------------------------------------------------------------------------
237 virtual status_t drawLayer(Layer* layer, float x, float y) = 0;
238 virtual status_t drawDisplayList(DisplayList* displayList, Rect& dirty,
239 int32_t replayFlags) = 0;
240
241 // TODO: rename for consistency
242 virtual status_t callDrawGLFunction(Functor* functor, Rect& dirty) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800243}; // class Renderer
244
245}; // namespace uirenderer
246}; // namespace android
247
248#endif // ANDROID_HWUI_RENDERER_H