• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
20 #include <SkRegion.h>
21 
22 #include <utils/String8.h>
23 
24 #include "AssetAtlas.h"
25 #include "SkPaint.h"
26 
27 namespace android {
28 
29 class Functor;
30 struct Res_png_9patch;
31 
32 namespace uirenderer {
33 
34 class RenderNode;
35 class Layer;
36 class Matrix4;
37 class SkiaColorFilter;
38 class Patch;
39 
40 enum 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  */
54 class ANDROID_API Renderer {
55 public:
~Renderer()56     virtual ~Renderer() {}
57 
58     /**
59      * Safely retrieves the mode from the specified xfermode. If the specified
60      * xfermode is null, the mode is assumed to be SkXfermode::kSrcOver_Mode.
61      */
getXfermode(SkXfermode * mode)62     static inline SkXfermode::Mode getXfermode(SkXfermode* mode) {
63         SkXfermode::Mode resultMode;
64         if (!SkXfermode::AsMode(mode, &resultMode)) {
65             resultMode = SkXfermode::kSrcOver_Mode;
66         }
67         return resultMode;
68     }
69 
70     // TODO: move to a method on android:Paint
paintWillNotDraw(const SkPaint & paint)71     static inline bool paintWillNotDraw(const SkPaint& paint) {
72         return paint.getAlpha() == 0
73                 && !paint.getColorFilter()
74                 && getXfermode(paint.getXfermode()) == SkXfermode::kSrcOver_Mode;
75     }
76 
77     // TODO: move to a method on android:Paint
paintWillNotDrawText(const SkPaint & paint)78     static inline bool paintWillNotDrawText(const SkPaint& paint) {
79         return paint.getAlpha() == 0
80                 && paint.getLooper() == NULL
81                 && !paint.getColorFilter()
82                 && getXfermode(paint.getXfermode()) == SkXfermode::kSrcOver_Mode;
83     }
84 // ----------------------------------------------------------------------------
85 // Frame state operations
86 // ----------------------------------------------------------------------------
87     /**
88      * Sets the dimension of the underlying drawing surface. This method must
89      * be called at least once every time the drawing surface changes size.
90      *
91      * @param width The width in pixels of the underlysing surface
92      * @param height The height in pixels of the underlysing surface
93      */
94     virtual void setViewport(int width, int height) = 0;
95 
96     /**
97      * Prepares the renderer to draw a frame. This method must be invoked
98      * at the beginning of each frame. When this method is invoked, the
99      * entire drawing surface is assumed to be redrawn.
100      *
101      * @param opaque If true, the target surface is considered opaque
102      *               and will not be cleared. If false, the target surface
103      *               will be cleared
104      */
105     virtual status_t prepare(bool opaque) = 0;
106 
107     /**
108      * Prepares the renderer to draw a frame. This method must be invoked
109      * at the beginning of each frame. Only the specified rectangle of the
110      * frame is assumed to be dirty. A clip will automatically be set to
111      * the specified rectangle.
112      *
113      * @param left The left coordinate of the dirty rectangle
114      * @param top The top coordinate of the dirty rectangle
115      * @param right The right coordinate of the dirty rectangle
116      * @param bottom The bottom coordinate of the dirty rectangle
117      * @param opaque If true, the target surface is considered opaque
118      *               and will not be cleared. If false, the target surface
119      *               will be cleared in the specified dirty rectangle
120      */
121     virtual status_t prepareDirty(float left, float top, float right, float bottom,
122             bool opaque) = 0;
123 
124     /**
125      * Indicates the end of a frame. This method must be invoked whenever
126      * the caller is done rendering a frame.
127      */
128     virtual void finish() = 0;
129 
130 // ----------------------------------------------------------------------------
131 // Canvas state operations
132 // ----------------------------------------------------------------------------
133     // Save (layer)
134     virtual int getSaveCount() const = 0;
135     virtual int save(int flags) = 0;
136     virtual void restore() = 0;
137     virtual void restoreToCount(int saveCount) = 0;
138 
139     virtual int saveLayer(float left, float top, float right, float bottom,
140             const SkPaint* paint, int flags) = 0;
141 
saveLayerAlpha(float left,float top,float right,float bottom,int alpha,int flags)142     int saveLayerAlpha(float left, float top, float right, float bottom,
143             int alpha, int flags) {
144         SkPaint paint;
145         paint.setAlpha(alpha);
146         return saveLayer(left, top, right, bottom, &paint, flags);
147     }
148 
149     // Matrix
150     virtual void getMatrix(SkMatrix* outMatrix) const = 0;
151     virtual void translate(float dx, float dy, float dz = 0.0f) = 0;
152     virtual void rotate(float degrees) = 0;
153     virtual void scale(float sx, float sy) = 0;
154     virtual void skew(float sx, float sy) = 0;
155 
156     virtual void setMatrix(const SkMatrix& matrix) = 0;
157     virtual void concatMatrix(const SkMatrix& matrix) = 0;
158 
159     // clip
160     virtual const Rect& getLocalClipBounds() const = 0;
161     virtual bool quickRejectConservative(float left, float top,
162             float right, float bottom) const = 0;
163     virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op) = 0;
164     virtual bool clipPath(const SkPath* path, SkRegion::Op op) = 0;
165     virtual bool clipRegion(const SkRegion* region, SkRegion::Op op) = 0;
166 
167     // Misc - should be implemented with SkPaint inspection
168     virtual void resetPaintFilter() = 0;
169     virtual void setupPaintFilter(int clearBits, int setBits) = 0;
170 
171 // ----------------------------------------------------------------------------
172 // Canvas draw operations
173 // ----------------------------------------------------------------------------
174     virtual status_t drawColor(int color, SkXfermode::Mode mode) = 0;
175 
176     // Bitmap-based
177     virtual status_t drawBitmap(const SkBitmap* bitmap, const SkPaint* paint) = 0;
178     virtual status_t drawBitmap(const SkBitmap* bitmap, float srcLeft, float srcTop,
179             float srcRight, float srcBottom, float dstLeft, float dstTop,
180             float dstRight, float dstBottom, const SkPaint* paint) = 0;
181     virtual status_t drawBitmapData(const SkBitmap* bitmap, const SkPaint* paint) = 0;
182     virtual status_t drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight,
183             const float* vertices, const int* colors, const SkPaint* paint) = 0;
184     virtual status_t drawPatch(const SkBitmap* bitmap, const Res_png_9patch* patch,
185             float left, float top, float right, float bottom, const SkPaint* paint) = 0;
186 
187     // Shapes
188     virtual status_t drawRect(float left, float top, float right, float bottom,
189             const SkPaint* paint) = 0;
190     virtual status_t drawRects(const float* rects, int count, const SkPaint* paint) = 0;
191     virtual status_t drawRoundRect(float left, float top, float right, float bottom,
192             float rx, float ry, const SkPaint* paint) = 0;
193     virtual status_t drawCircle(float x, float y, float radius, const SkPaint* paint) = 0;
194     virtual status_t drawOval(float left, float top, float right, float bottom,
195             const SkPaint* paint) = 0;
196     virtual status_t drawArc(float left, float top, float right, float bottom,
197             float startAngle, float sweepAngle, bool useCenter, const SkPaint* paint) = 0;
198     virtual status_t drawPath(const SkPath* path, const SkPaint* paint) = 0;
199     virtual status_t drawLines(const float* points, int count, const SkPaint* paint) = 0;
200     virtual status_t drawPoints(const float* points, int count, const SkPaint* paint) = 0;
201 
202     // Text
203     virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y,
204             const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds,
205             DrawOpMode drawOpMode = kDrawOpMode_Immediate) = 0;
206     virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, const SkPath* path,
207             float hOffset, float vOffset, const SkPaint* paint) = 0;
208     virtual status_t drawPosText(const char* text, int bytesCount, int count,
209             const float* positions, const SkPaint* paint) = 0;
210 
211 // ----------------------------------------------------------------------------
212 // Canvas draw operations - special
213 // ----------------------------------------------------------------------------
214     virtual status_t drawLayer(Layer* layer, float x, float y) = 0;
215     virtual status_t drawRenderNode(RenderNode* renderNode, Rect& dirty,
216             int32_t replayFlags) = 0;
217 
218     // TODO: rename for consistency
219     virtual status_t callDrawGLFunction(Functor* functor, Rect& dirty) = 0;
220 }; // class Renderer
221 
222 }; // namespace uirenderer
223 }; // namespace android
224 
225 #endif // ANDROID_HWUI_RENDERER_H
226