Snapshot.h revision 0c0ec26366045e515790a6acdab782965efc63b4
1/* 2 * Copyright (C) 2010 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_SNAPSHOT_H 18#define ANDROID_HWUI_SNAPSHOT_H 19 20#include <GLES2/gl2.h> 21#include <GLES2/gl2ext.h> 22 23#include <utils/RefBase.h> 24#include <ui/Region.h> 25 26#include <SkRegion.h> 27 28#include "Layer.h" 29#include "Matrix.h" 30#include "Rect.h" 31 32namespace android { 33namespace uirenderer { 34 35/** 36 * A snapshot holds information about the current state of the rendering 37 * surface. A snapshot is usually created whenever the user calls save() 38 * and discarded when the user calls restore(). Once a snapshot is created, 39 * it can hold information for deferred rendering. 40 * 41 * Each snapshot has a link to a previous snapshot, indicating the previous 42 * state of the renderer. 43 */ 44class Snapshot: public LightRefBase<Snapshot> { 45public: 46 47 Snapshot(); 48 Snapshot(const sp<Snapshot>& s, int saveFlags); 49 50 /** 51 * Various flags set on ::flags. 52 */ 53 enum Flags { 54 /** 55 * Indicates that the clip region was modified. When this 56 * snapshot is restored so must the clip. 57 */ 58 kFlagClipSet = 0x1, 59 /** 60 * Indicates that this snapshot was created when saving 61 * a new layer. 62 */ 63 kFlagIsLayer = 0x2, 64 /** 65 * Indicates that this snapshot is a special type of layer 66 * backed by an FBO. This flag only makes sense when the 67 * flag kFlagIsLayer is also set. 68 * 69 * Viewport has been modified to fit the new Fbo, and must be 70 * restored when this snapshot is restored. 71 */ 72 kFlagIsFboLayer = 0x4, 73 /** 74 * Indicates that this snapshot or an ancestor snapshot is 75 * an FBO layer. 76 */ 77 kFlagFboTarget = 0x8, 78 }; 79 80 /** 81 * Modifies the current clip with the new clip rectangle and 82 * the specified operation. The specified rectangle is transformed 83 * by this snapshot's trasnformation. 84 */ 85 bool clip(float left, float top, float right, float bottom, 86 SkRegion::Op op = SkRegion::kIntersect_Op); 87 88 /** 89 * Modifies the current clip with the new clip rectangle and 90 * the specified operation. The specified rectangle is considered 91 * already transformed. 92 */ 93 bool clipTransformed(const Rect& r, SkRegion::Op op = SkRegion::kIntersect_Op); 94 95 /** 96 * Modifies the current clip with the specified region and operation. 97 * The specified region is considered already transformed. 98 */ 99 bool clipRegionTransformed(const SkRegion& region, SkRegion::Op op); 100 101 /** 102 * Sets the current clip. 103 */ 104 void setClip(float left, float top, float right, float bottom); 105 106 /** 107 * Returns the current clip in local coordinates. The clip rect is 108 * transformed by the inverse transform matrix. 109 */ 110 const Rect& getLocalClip(); 111 112 /** 113 * Returns the current clip in render target coordinates. 114 */ 115 const Rect& getRenderTargetClip() { return *clipRect; } 116 117 /** 118 * Resets the clip to the specified rect. 119 */ 120 void resetClip(float left, float top, float right, float bottom); 121 122 /** 123 * Resets the current transform to a pure 3D translation. 124 */ 125 void resetTransform(float x, float y, float z); 126 127 /** 128 * Indicates whether this snapshot should be ignored. A snapshot 129 * is typicalled ignored if its layer is invisible or empty. 130 */ 131 bool isIgnored() const; 132 133 /** 134 * Indicates whether the current transform has perspective components. 135 */ 136 bool hasPerspectiveTransform() const; 137 138 /** 139 * Dirty flags. 140 */ 141 int flags; 142 143 /** 144 * Previous snapshot. 145 */ 146 sp<Snapshot> previous; 147 148 /** 149 * A pointer to the currently active layer. 150 * 151 * This snapshot does not own the layer, this pointer must not be freed. 152 */ 153 Layer* layer; 154 155 /** 156 * Target FBO used for rendering. Set to 0 when rendering directly 157 * into the framebuffer. 158 */ 159 GLuint fbo; 160 161 /** 162 * Indicates that this snapshot is invisible and nothing should be drawn 163 * inside it. This flag is set only when the layer clips drawing to its 164 * bounds and is passed to subsequent snapshots. 165 */ 166 bool invisible; 167 168 /** 169 * If set to true, the layer will not be composited. This is similar to 170 * invisible but this flag is not passed to subsequent snapshots. 171 */ 172 bool empty; 173 174 /** 175 * Current viewport. 176 */ 177 Rect viewport; 178 179 /** 180 * Height of the framebuffer the snapshot is rendering into. 181 */ 182 int height; 183 184 /** 185 * Contains the current orthographic, projection matrix. 186 */ 187 mat4 orthoMatrix; 188 189 /** 190 * Local transformation. Holds the current translation, scale and 191 * rotation values. 192 * 193 * This is a reference to a matrix owned by this snapshot or another 194 * snapshot. This pointer must not be freed. See ::mTransformRoot. 195 */ 196 mat4* transform; 197 198 /** 199 * Current clip rect. The clip is stored in canvas-space coordinates, 200 * (screen-space coordinates in the regular case.) 201 * 202 * This is a reference to a rect owned by this snapshot or another 203 * snapshot. This pointer must not be freed. See ::mClipRectRoot. 204 */ 205 Rect* clipRect; 206 207 /** 208 * Current clip region. The clip is stored in canvas-space coordinates, 209 * (screen-space coordinates in the regular case.) 210 * 211 * This is a reference to a region owned by this snapshot or another 212 * snapshot. This pointer must not be freed. See ::mClipRegionRoot. 213 */ 214 SkRegion* clipRegion; 215 216 /** 217 * The ancestor layer's dirty region. 218 * 219 * This is a reference to a region owned by a layer. This pointer must 220 * not be freed. 221 */ 222 Region* region; 223 224 /** 225 * Current alpha value. This value is 1 by default, but may be set by a DisplayList which 226 * has translucent rendering in a non-overlapping View. This value will be used by 227 * the renderer to set the alpha in the current color being used for ensuing drawing 228 * operations. The value is inherited by child snapshots because the same value should 229 * be applied to descendents of the current DisplayList (for example, a TextView contains 230 * the base alpha value which should be applied to the child DisplayLists used for drawing 231 * the actual text). 232 */ 233 float alpha; 234 235 void dump() const; 236 237private: 238 void ensureClipRegion(); 239 void copyClipRectFromRegion(); 240 241 bool clipRegionOp(float left, float top, float right, float bottom, SkRegion::Op op); 242 243 mat4 mTransformRoot; 244 Rect mClipRectRoot; 245 Rect mLocalClip; // don't use directly, call getLocalClip() which initializes this 246 247 SkRegion mClipRegionRoot; 248 249}; // class Snapshot 250 251}; // namespace uirenderer 252}; // namespace android 253 254#endif // ANDROID_HWUI_SNAPSHOT_H 255