• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 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_STATEFUL_BASE_RENDERER_H
18 #define ANDROID_HWUI_STATEFUL_BASE_RENDERER_H
19 
20 #include <utils/RefBase.h>
21 
22 #include "Renderer.h"
23 #include "Snapshot.h"
24 
25 namespace android {
26 namespace uirenderer {
27 
28 /**
29  * Abstract Renderer subclass, which implements Canvas state methods.
30  *
31  * Manages the Snapshot stack, implementing matrix, save/restore, and clipping methods in the
32  * Renderer interface. Drawing and recording classes that extend StatefulBaseRenderer will have
33  * different use cases:
34  *
35  * Drawing subclasses (i.e. OpenGLRenderer) can query attributes (such as transform) or hook into
36  * changes (e.g. save/restore) with minimal surface area for manipulating the stack itself.
37  *
38  * Recording subclasses (i.e. DisplayListRenderer) can both record and pass through state operations
39  * to StatefulBaseRenderer, so that not only will querying operations work (getClip/Matrix), but so
40  * that quickRejection can also be used.
41  */
42 class StatefulBaseRenderer : public Renderer {
43 public:
44     StatefulBaseRenderer();
45 
prepare(bool opaque)46     virtual status_t prepare(bool opaque) {
47         return prepareDirty(0.0f, 0.0f, mWidth, mHeight, opaque);
48     }
49 
50     /**
51      * Initialize the first snapshot, computing the projection matrix, and stores the dimensions of
52      * the render target.
53      */
54     virtual void setViewport(int width, int height);
55     void initializeSaveStack(float clipLeft, float clipTop, float clipRight, float clipBottom,
56             const Vector3& lightCenter);
57 
58     // getters
hasRectToRectTransform()59     bool hasRectToRectTransform() const {
60         return CC_LIKELY(currentTransform()->rectToRect());
61     }
62 
63     // Save (layer)
getSaveCount()64     virtual int getSaveCount() const { return mSaveCount; }
65     virtual int save(int flags);
66     virtual void restore();
67     virtual void restoreToCount(int saveCount);
68     //virtual int saveLayer(float left, float top, float right, float bottom,
69     //        int alpha, SkXfermode::Mode mode, int flags);
70 
71     // Matrix
72     virtual void getMatrix(SkMatrix* outMatrix) const;
73     virtual void translate(float dx, float dy, float dz = 0.0f);
74     virtual void rotate(float degrees);
75     virtual void scale(float sx, float sy);
76     virtual void skew(float sx, float sy);
77 
78     virtual void setMatrix(const SkMatrix& matrix);
79     void setMatrix(const Matrix4& matrix); // internal only convenience method
80     virtual void concatMatrix(const SkMatrix& matrix);
81     void concatMatrix(const Matrix4& matrix); // internal only convenience method
82 
83     // Clip
getLocalClipBounds()84     virtual const Rect& getLocalClipBounds() const { return mSnapshot->getLocalClip(); }
85 
86     virtual bool quickRejectConservative(float left, float top, float right, float bottom) const;
87 
88     virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
89     virtual bool clipPath(const SkPath* path, SkRegion::Op op);
90     virtual bool clipRegion(const SkRegion* region, SkRegion::Op op);
91 
92     /**
93      * Does not support different clipping Ops (that is, every call to setClippingOutline is
94      * effectively using SkRegion::kReplaceOp)
95      *
96      * The clipping outline is independent from the regular clip.
97      */
98     void setClippingOutline(LinearAllocator& allocator, const Outline* outline);
99     void setClippingRoundRect(LinearAllocator& allocator,
100             const Rect& rect, float radius, bool highPriority = true);
101 
currentTransform()102     inline const mat4* currentTransform() const {
103         return mSnapshot->transform;
104     }
105 
106 protected:
getRenderTargetClipBounds()107     const Rect& getRenderTargetClipBounds() const { return mSnapshot->getRenderTargetClip(); }
108 
getWidth()109     int getWidth() { return mWidth; }
getHeight()110     int getHeight() { return mHeight; }
111 
112     // Save
113     int saveSnapshot(int flags);
114     void restoreSnapshot();
115 
116     // allows subclasses to control what value is stored in snapshot's fbo field in
117     // initializeSaveStack
getTargetFbo()118     virtual GLuint getTargetFbo() const {
119         return -1;
120     }
121 
122     // Clip
123     bool calculateQuickRejectForScissor(float left, float top, float right, float bottom,
124             bool* clipRequired, bool* roundRectClipRequired, bool snapOut) const;
125 
126     /**
127      * Called just after a restore has occurred. The 'removed' snapshot popped from the stack,
128      * 'restored' snapshot has become the top/current.
129      *
130      * Subclasses can override this method to handle layer restoration
131      */
onSnapshotRestored(const Snapshot & removed,const Snapshot & restored)132     virtual void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) {};
133 
onViewportInitialized()134     virtual void onViewportInitialized() {};
135 
currentClipRect()136     inline const Rect* currentClipRect() const {
137         return mSnapshot->clipRect;
138     }
139 
currentSnapshot()140     inline const Snapshot* currentSnapshot() const {
141         return mSnapshot != NULL ? mSnapshot.get() : mFirstSnapshot.get();
142     }
143 
firstSnapshot()144     inline const Snapshot* firstSnapshot() const {
145         return mFirstSnapshot.get();
146     }
147 
148     // indicites that the clip has been changed since the last time it was consumed
149     bool mDirtyClip;
150 
151 private:
152     // Dimensions of the drawing surface
153     int mWidth, mHeight;
154 
155     // Number of saved states
156     int mSaveCount;
157 
158     // Base state
159     sp<Snapshot> mFirstSnapshot;
160 
161 protected:
162     // Current state
163     // TODO: should become private, once hooks needed by OpenGLRenderer are added
164     sp<Snapshot> mSnapshot;
165 }; // class StatefulBaseRenderer
166 
167 }; // namespace uirenderer
168 }; // namespace android
169 
170 #endif // ANDROID_HWUI_STATEFUL_BASE_RENDERER_H
171