2 * Copyright (C) 2010 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #ifndef ANDROID_HWUI_SNAPSHOT_H
18 #define ANDROID_HWUI_SNAPSHOT_H
20 #include <GLES2/gl2.h>
21 #include <GLES2/gl2ext.h>
23 #include <utils/LinearAllocator.h>
24 #include <utils/RefBase.h>
25 #include <ui/Region.h>
34 #include "utils/Macros.h"
37 namespace uirenderer {
40 * Temporary structure holding information for a single outline clip.
42 * These structures are treated as immutable once created, and only exist for a single frame, which
43 * is why they may only be allocated with a LinearAllocator.
45 class RoundRectClipState {
47 static void* operator new(size_t size) = delete;
48 static void* operator new(size_t size, LinearAllocator& allocator) {
49 return allocator.alloc<RoundRectClipState>(size);
52 bool areaRequiresRoundRectClip(const Rect& rect) const {
53 return rect.intersects(dangerRects[0])
54 || rect.intersects(dangerRects[1])
55 || rect.intersects(dangerRects[2])
56 || rect.intersects(dangerRects[3]);
66 // TODO: remove for HWUI_NEW_OPS
67 class ProjectionPathMask {
69 static void* operator new(size_t size) = delete;
70 static void* operator new(size_t size, LinearAllocator& allocator) {
71 return allocator.alloc<ProjectionPathMask>(size);
74 const SkPath* projectionMask;
75 Matrix4 projectionMaskTransform;
79 * A snapshot holds information about the current state of the rendering
80 * surface. A snapshot is usually created whenever the user calls save()
81 * and discarded when the user calls restore(). Once a snapshot is created,
82 * it can hold information for deferred rendering.
84 * Each snapshot has a link to a previous snapshot, indicating the previous
85 * state of the renderer.
91 Snapshot(Snapshot* s, int saveFlags);
94 * Various flags set on ::flags.
98 * Indicates that the clip region was modified. When this
99 * snapshot is restored so must the clip.
103 * Indicates that this snapshot was created when saving
108 * Indicates that this snapshot is a special type of layer
109 * backed by an FBO. This flag only makes sense when the
110 * flag kFlagIsLayer is also set.
112 * Viewport has been modified to fit the new Fbo, and must be
113 * restored when this snapshot is restored.
115 kFlagIsFboLayer = 0x4,
117 * Indicates that this snapshot or an ancestor snapshot is
120 kFlagFboTarget = 0x8, // TODO: remove for HWUI_NEW_OPS
124 * Modifies the current clip with the new clip rectangle and
125 * the specified operation. The specified rectangle is transformed
126 * by this snapshot's trasnformation.
128 void clip(const Rect& localClip, SkRegion::Op op);
131 * Modifies the current clip with the new clip rectangle and
132 * the specified operation. The specified rectangle is considered
133 * already transformed.
135 void clipTransformed(const Rect& r, SkRegion::Op op = SkRegion::kIntersect_Op);
138 * Modifies the current clip with the specified region and operation.
139 * The specified region is considered already transformed.
141 void clipRegionTransformed(const SkRegion& region, SkRegion::Op op);
144 * Modifies the current clip with the specified path and operation.
146 void clipPath(const SkPath& path, SkRegion::Op op);
149 * Sets the current clip.
151 void setClip(float left, float top, float right, float bottom);
154 * Returns the current clip in local coordinates. The clip rect is
155 * transformed by the inverse transform matrix.
157 ANDROID_API const Rect& getLocalClip();
160 * Returns the current clip in render target coordinates.
162 const Rect& getRenderTargetClip() const { return mClipArea->getClipRect(); }
165 * Accessor functions so that the clip area can stay private
167 bool clipIsEmpty() const { return mClipArea->isEmpty(); }
168 const SkRegion& getClipRegion() const { return mClipArea->getClipRegion(); }
169 bool clipIsSimple() const { return mClipArea->isSimple(); }
170 const ClipArea& getClipArea() const { return *mClipArea; }
171 ClipArea& mutateClipArea() { return *mClipArea; }
173 WARN_UNUSED_RESULT const ClipBase* serializeIntersectedClip(LinearAllocator& allocator,
174 const ClipBase* recordedClip, const Matrix4& recordedClipTransform);
175 void applyClip(const ClipBase* clip, const Matrix4& transform);
178 * Resets the clip to the specified rect.
180 void resetClip(float left, float top, float right, float bottom);
183 * Resets the current transform to a pure 3D translation.
185 void resetTransform(float x, float y, float z);
187 void initializeViewport(int width, int height) {
188 mViewportData.initialize(width, height);
189 mClipAreaRoot.setViewportDimensions(width, height);
192 int getViewportWidth() const { return mViewportData.mWidth; }
193 int getViewportHeight() const { return mViewportData.mHeight; }
194 const Matrix4& getOrthoMatrix() const { return mViewportData.mOrthoMatrix; }
196 const Vector3& getRelativeLightCenter() const { return mRelativeLightCenter; }
197 void setRelativeLightCenter(const Vector3& lightCenter) { mRelativeLightCenter = lightCenter; }
200 * Sets (and replaces) the current clipping outline
202 * If the current round rect clip is high priority, the incoming clip is ignored.
204 void setClippingRoundRect(LinearAllocator& allocator, const Rect& bounds,
205 float radius, bool highPriority);
208 * Sets (and replaces) the current projection mask
210 void setProjectionPathMask(LinearAllocator& allocator, const SkPath* path);
213 * Indicates whether this snapshot should be ignored. A snapshot
214 * is typically ignored if its layer is invisible or empty.
216 bool isIgnored() const;
219 * Indicates whether the current transform has perspective components.
221 bool hasPerspectiveTransform() const;
224 * Fills outTransform with the current, total transform to screen space,
225 * across layer boundaries.
227 // TODO: remove for HWUI_NEW_OPS
228 void buildScreenSpaceTransform(Matrix4* outTransform) const;
241 * A pointer to the currently active layer.
243 * This snapshot does not own the layer, this pointer must not be freed.
248 * Target FBO used for rendering. Set to 0 when rendering directly
249 * into the framebuffer.
254 * Indicates that this snapshot is invisible and nothing should be drawn
255 * inside it. This flag is set only when the layer clips drawing to its
256 * bounds and is passed to subsequent snapshots.
261 * If set to true, the layer will not be composited. This is similar to
262 * invisible but this flag is not passed to subsequent snapshots.
267 * Local transformation. Holds the current translation, scale and
270 * This is a reference to a matrix owned by this snapshot or another
271 * snapshot. This pointer must not be freed. See ::mTransformRoot.
276 * The ancestor layer's dirty region.
278 * This is a reference to a region owned by a layer. This pointer must
284 * Current alpha value. This value is 1 by default, but may be set by a DisplayList which
285 * has translucent rendering in a non-overlapping View. This value will be used by
286 * the renderer to set the alpha in the current color being used for ensuing drawing
287 * operations. The value is inherited by child snapshots because the same value should
288 * be applied to descendants of the current DisplayList (for example, a TextView contains
289 * the base alpha value which should be applied to the child DisplayLists used for drawing
295 * Current clipping round rect.
297 * Points to data not owned by the snapshot, and may only be replaced by subsequent RR clips,
300 const RoundRectClipState* roundRectClipState;
303 * Current projection masking path - used exclusively to mask projected, tessellated circles.
306 const SkPath* projectionPathMask;
308 const ProjectionPathMask* projectionPathMask;
314 struct ViewportData {
315 ViewportData() : mWidth(0), mHeight(0) {}
316 void initialize(int width, int height) {
319 mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
323 * Width and height of current viewport.
325 * The viewport is always defined to be (0, 0, width, height).
330 * Contains the current orthographic, projection matrix.
337 ClipArea mClipAreaRoot;
341 ViewportData mViewportData;
342 Vector3 mRelativeLightCenter;
346 }; // namespace uirenderer
347 }; // namespace android
349 #endif // ANDROID_HWUI_SNAPSHOT_H