blob: ee44d7a6aadb7cd0d90b060ed836a82e3e49d88d [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 Craikc5b5f052014-10-01 16:40:16 -070020#include <SkColorFilter.h>
21#include <SkPaint.h>
Chris Craik14e51302013-12-30 15:32:54 -080022#include <SkRegion.h>
Chris Craik14e51302013-12-30 15:32:54 -080023#include <utils/String8.h>
24
Chris Craikb4589422013-12-26 15:13:13 -080025#include "AssetAtlas.h"
Chris Craikb4589422013-12-26 15:13:13 -080026
Derek Sollenberger09c2d4f2014-10-15 09:21:10 -040027class SkDrawFilter;
28
Chris Craikb4589422013-12-26 15:13:13 -080029namespace android {
Chris Craik14e51302013-12-30 15:32:54 -080030
31class Functor;
Chris Craik564acf72014-01-02 16:46:18 -080032struct Res_png_9patch;
Chris Craik14e51302013-12-30 15:32:54 -080033
Chris Craikb4589422013-12-26 15:13:13 -080034namespace uirenderer {
35
John Recke18264b2014-03-12 13:56:30 -070036class RenderNode;
Chris Craikb4589422013-12-26 15:13:13 -080037class Layer;
38class Matrix4;
39class SkiaColorFilter;
Chris Craikb4589422013-12-26 15:13:13 -080040class Patch;
41
42enum DrawOpMode {
43 kDrawOpMode_Immediate,
44 kDrawOpMode_Defer,
45 kDrawOpMode_Flush
46};
47
48/**
49 * Hwui's abstract version of Canvas.
50 *
51 * Provides methods for frame state operations, as well as the SkCanvas style transform/clip state,
52 * and varied drawing operations.
53 *
54 * Should at some point interact with native SkCanvas.
55 */
56class ANDROID_API Renderer {
57public:
58 virtual ~Renderer() {}
59
60 /**
Chris Craikb4589422013-12-26 15:13:13 -080061 * Safely retrieves the mode from the specified xfermode. If the specified
62 * xfermode is null, the mode is assumed to be SkXfermode::kSrcOver_Mode.
63 */
64 static inline SkXfermode::Mode getXfermode(SkXfermode* mode) {
65 SkXfermode::Mode resultMode;
66 if (!SkXfermode::AsMode(mode, &resultMode)) {
67 resultMode = SkXfermode::kSrcOver_Mode;
68 }
69 return resultMode;
70 }
71
Chris Craik947eabf2014-08-19 10:21:12 -070072 // TODO: move to a method on android:Paint
73 static inline bool paintWillNotDraw(const SkPaint& paint) {
74 return paint.getAlpha() == 0
Chris Craik73821c82014-09-16 17:32:13 -070075 && !paint.getColorFilter()
Chris Craikbc341912014-09-22 18:17:39 -070076 && getXfermode(paint.getXfermode()) == SkXfermode::kSrcOver_Mode;
Chris Craik947eabf2014-08-19 10:21:12 -070077 }
78
79 // TODO: move to a method on android:Paint
80 static inline bool paintWillNotDrawText(const SkPaint& paint) {
81 return paint.getAlpha() == 0
Chris Craike84a2082014-12-22 14:28:49 -080082 && paint.getLooper() == nullptr
Chris Craik73821c82014-09-16 17:32:13 -070083 && !paint.getColorFilter()
Chris Craik947eabf2014-08-19 10:21:12 -070084 && getXfermode(paint.getXfermode()) == SkXfermode::kSrcOver_Mode;
85 }
Chris Craikc5b5f052014-10-01 16:40:16 -070086
87 static bool isBlendedColorFilter(const SkColorFilter* filter) {
Chris Craike84a2082014-12-22 14:28:49 -080088 if (filter == nullptr) {
Chris Craikc5b5f052014-10-01 16:40:16 -070089 return false;
90 }
91 return (filter->getFlags() & SkColorFilter::kAlphaUnchanged_Flag) == 0;
92 }
93
Chris Craikb4589422013-12-26 15:13:13 -080094// ----------------------------------------------------------------------------
95// Frame state operations
96// ----------------------------------------------------------------------------
97 /**
98 * Sets the dimension of the underlying drawing surface. This method must
99 * be called at least once every time the drawing surface changes size.
100 *
101 * @param width The width in pixels of the underlysing surface
102 * @param height The height in pixels of the underlysing surface
103 */
104 virtual void setViewport(int width, int height) = 0;
105
106 /**
107 * Prepares the renderer to draw a frame. This method must be invoked
108 * at the beginning of each frame. When this method is invoked, the
109 * entire drawing surface is assumed to be redrawn.
110 *
111 * @param opaque If true, the target surface is considered opaque
112 * and will not be cleared. If false, the target surface
113 * will be cleared
114 */
Tom Hudson107843d2014-09-08 11:26:26 -0400115 virtual void prepare(bool opaque) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800116
117 /**
118 * Prepares the renderer to draw a frame. This method must be invoked
119 * at the beginning of each frame. Only the specified rectangle of the
120 * frame is assumed to be dirty. A clip will automatically be set to
121 * the specified rectangle.
122 *
123 * @param left The left coordinate of the dirty rectangle
124 * @param top The top coordinate of the dirty rectangle
125 * @param right The right coordinate of the dirty rectangle
126 * @param bottom The bottom coordinate of the dirty rectangle
127 * @param opaque If true, the target surface is considered opaque
128 * and will not be cleared. If false, the target surface
129 * will be cleared in the specified dirty rectangle
130 */
Tom Hudson107843d2014-09-08 11:26:26 -0400131 virtual void prepareDirty(float left, float top, float right, float bottom,
Chris Craikb4589422013-12-26 15:13:13 -0800132 bool opaque) = 0;
133
134 /**
135 * Indicates the end of a frame. This method must be invoked whenever
136 * the caller is done rendering a frame.
Tom Hudson107843d2014-09-08 11:26:26 -0400137 * Returns true if any drawing was done during the frame (the output
138 * has changed / is "dirty" and should be displayed to the user).
Chris Craikb4589422013-12-26 15:13:13 -0800139 */
Tom Hudson107843d2014-09-08 11:26:26 -0400140 virtual bool finish() = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800141
Chris Craikb4589422013-12-26 15:13:13 -0800142// ----------------------------------------------------------------------------
143// Canvas state operations
144// ----------------------------------------------------------------------------
Chris Craik14e51302013-12-30 15:32:54 -0800145 // Save (layer)
Chris Craikb4589422013-12-26 15:13:13 -0800146 virtual int getSaveCount() const = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800147 virtual int save(int flags) = 0;
148 virtual void restore() = 0;
149 virtual void restoreToCount(int saveCount) = 0;
150
Derek Sollenbergerd44fbe52014-02-05 16:47:00 -0500151 virtual int saveLayer(float left, float top, float right, float bottom,
152 const SkPaint* paint, int flags) = 0;
153
Chris Craikb4589422013-12-26 15:13:13 -0800154 int saveLayerAlpha(float left, float top, float right, float bottom,
155 int alpha, int flags) {
Derek Sollenbergerd44fbe52014-02-05 16:47:00 -0500156 SkPaint paint;
157 paint.setAlpha(alpha);
158 return saveLayer(left, top, right, bottom, &paint, flags);
Chris Craikb4589422013-12-26 15:13:13 -0800159 }
Chris Craikb4589422013-12-26 15:13:13 -0800160
161 // Matrix
Chris Craik14e51302013-12-30 15:32:54 -0800162 virtual void getMatrix(SkMatrix* outMatrix) const = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800163 virtual void translate(float dx, float dy, float dz = 0.0f) = 0;
164 virtual void rotate(float degrees) = 0;
165 virtual void scale(float sx, float sy) = 0;
166 virtual void skew(float sx, float sy) = 0;
167
Derek Sollenberger13908822013-12-10 12:28:58 -0500168 virtual void setMatrix(const SkMatrix& matrix) = 0;
169 virtual void concatMatrix(const SkMatrix& matrix) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800170
Chris Craik14e51302013-12-30 15:32:54 -0800171 // clip
Chris Craik3f0854292014-04-15 16:18:08 -0700172 virtual const Rect& getLocalClipBounds() const = 0;
Chris Craik14e51302013-12-30 15:32:54 -0800173 virtual bool quickRejectConservative(float left, float top,
174 float right, float bottom) const = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800175 virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op) = 0;
Chris Craikd218a922014-01-02 17:13:34 -0800176 virtual bool clipPath(const SkPath* path, SkRegion::Op op) = 0;
177 virtual bool clipRegion(const SkRegion* region, SkRegion::Op op) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800178
Derek Sollenberger09c2d4f2014-10-15 09:21:10 -0400179 // Misc
180 virtual void setDrawFilter(SkDrawFilter* filter) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800181
182// ----------------------------------------------------------------------------
183// Canvas draw operations
184// ----------------------------------------------------------------------------
Tom Hudson107843d2014-09-08 11:26:26 -0400185 virtual void drawColor(int color, SkXfermode::Mode mode) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800186
187 // Bitmap-based
Tom Hudson107843d2014-09-08 11:26:26 -0400188 virtual void drawBitmap(const SkBitmap* bitmap, const SkPaint* paint) = 0;
189 virtual void drawBitmap(const SkBitmap* bitmap, float srcLeft, float srcTop,
Chris Craikb4589422013-12-26 15:13:13 -0800190 float srcRight, float srcBottom, float dstLeft, float dstTop,
Chris Craikd218a922014-01-02 17:13:34 -0800191 float dstRight, float dstBottom, const SkPaint* paint) = 0;
Tom Hudson107843d2014-09-08 11:26:26 -0400192 virtual void drawBitmapData(const SkBitmap* bitmap, const SkPaint* paint) = 0;
193 virtual void drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight,
Chris Craikd218a922014-01-02 17:13:34 -0800194 const float* vertices, const int* colors, const SkPaint* paint) = 0;
Tom Hudson107843d2014-09-08 11:26:26 -0400195 virtual void drawPatch(const SkBitmap* bitmap, const Res_png_9patch* patch,
Chris Craikd218a922014-01-02 17:13:34 -0800196 float left, float top, float right, float bottom, const SkPaint* paint) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800197
198 // Shapes
Tom Hudson107843d2014-09-08 11:26:26 -0400199 virtual void drawRect(float left, float top, float right, float bottom,
Chris Craikd218a922014-01-02 17:13:34 -0800200 const SkPaint* paint) = 0;
Tom Hudson107843d2014-09-08 11:26:26 -0400201 virtual void drawRects(const float* rects, int count, const SkPaint* paint) = 0;
202 virtual void drawRoundRect(float left, float top, float right, float bottom,
Chris Craikd218a922014-01-02 17:13:34 -0800203 float rx, float ry, const SkPaint* paint) = 0;
Tom Hudson107843d2014-09-08 11:26:26 -0400204 virtual void drawCircle(float x, float y, float radius, const SkPaint* paint) = 0;
205 virtual void drawOval(float left, float top, float right, float bottom,
Chris Craikd218a922014-01-02 17:13:34 -0800206 const SkPaint* paint) = 0;
Tom Hudson107843d2014-09-08 11:26:26 -0400207 virtual void drawArc(float left, float top, float right, float bottom,
Chris Craikd218a922014-01-02 17:13:34 -0800208 float startAngle, float sweepAngle, bool useCenter, const SkPaint* paint) = 0;
Tom Hudson107843d2014-09-08 11:26:26 -0400209 virtual void drawPath(const SkPath* path, const SkPaint* paint) = 0;
210 virtual void drawLines(const float* points, int count, const SkPaint* paint) = 0;
211 virtual void drawPoints(const float* points, int count, const SkPaint* paint) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800212
213 // Text
Tom Hudson107843d2014-09-08 11:26:26 -0400214 virtual void drawText(const char* text, int bytesCount, int count, float x, float y,
Chris Craikd218a922014-01-02 17:13:34 -0800215 const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds,
Chris Craikb4589422013-12-26 15:13:13 -0800216 DrawOpMode drawOpMode = kDrawOpMode_Immediate) = 0;
Tom Hudson107843d2014-09-08 11:26:26 -0400217 virtual void drawTextOnPath(const char* text, int bytesCount, int count, const SkPath* path,
Chris Craikd218a922014-01-02 17:13:34 -0800218 float hOffset, float vOffset, const SkPaint* paint) = 0;
Tom Hudson107843d2014-09-08 11:26:26 -0400219 virtual void drawPosText(const char* text, int bytesCount, int count,
Chris Craikd218a922014-01-02 17:13:34 -0800220 const float* positions, const SkPaint* paint) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800221
222// ----------------------------------------------------------------------------
223// Canvas draw operations - special
224// ----------------------------------------------------------------------------
Tom Hudson107843d2014-09-08 11:26:26 -0400225 virtual void drawRenderNode(RenderNode* renderNode, Rect& dirty,
Chris Craikb4589422013-12-26 15:13:13 -0800226 int32_t replayFlags) = 0;
227
228 // TODO: rename for consistency
Tom Hudson107843d2014-09-08 11:26:26 -0400229 virtual void callDrawGLFunction(Functor* functor, Rect& dirty) = 0;
Chris Craikb4589422013-12-26 15:13:13 -0800230}; // class Renderer
231
232}; // namespace uirenderer
233}; // namespace android
234
235#endif // ANDROID_HWUI_RENDERER_H