Snapshot.h revision 8b55f377655d13a445b08a0a8ed09b6e95c752b0
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_UI_SNAPSHOT_H 18#define ANDROID_UI_SNAPSHOT_H 19 20#include <GLES2/gl2.h> 21#include <GLES2/gl2ext.h> 22 23#include <utils/RefBase.h> 24 25#include <SkRegion.h> 26 27#include "Layer.h" 28#include "Matrix.h" 29#include "Rect.h" 30 31namespace android { 32namespace uirenderer { 33 34/** 35 * A snapshot holds information about the current state of the rendering 36 * surface. A snapshot is usually created whenever the user calls save() 37 * and discarded when the user calls restore(). Once a snapshot is created, 38 * it can hold information for deferred rendering. 39 * 40 * Each snapshot has a link to a previous snapshot, indicating the previous 41 * state of the renderer. 42 */ 43class Snapshot: public LightRefBase<Snapshot> { 44public: 45 Snapshot(): invisible(false), flags(0), previous(NULL), layer(NULL), fbo(0) { } 46 47 /** 48 * Copies the specified snapshot. Only the transform and clip rectangle 49 * are copied. The layer information is set to 0 and the transform is 50 * assumed to be dirty. The specified snapshot is stored as the previous 51 * snapshot. 52 */ 53 Snapshot(const sp<Snapshot>& s): 54 height(s->height), 55 transform(s->transform), 56 clipRect(s->clipRect), 57 invisible(s->invisible), 58 flags(0), 59 previous(s), 60 layer(NULL), 61 fbo(s->fbo), 62 viewport(s->viewport) { 63 if ((s->flags & Snapshot::kFlagClipSet) && 64 !(s->flags & Snapshot::kFlagDirtyLocalClip)) { 65 localClip.set(s->localClip); 66 } else { 67 flags |= Snapshot::kFlagDirtyLocalClip; 68 } 69 } 70 71 /** 72 * Various flags set on #flags. 73 */ 74 enum Flags { 75 /** 76 * Indicates that the clip region was modified. When this 77 * snapshot is restored so must the clip. 78 */ 79 kFlagClipSet = 0x1, 80 /** 81 * Indicates that this snapshot was created when saving 82 * a new layer. 83 */ 84 kFlagIsLayer = 0x2, 85 /** 86 * Indicates that this snapshot has changed the ortho matrix. 87 */ 88 kFlagDirtyOrtho = 0x4, 89 /** 90 * Indicates that the local clip should be recomputed. 91 */ 92 kFlagDirtyLocalClip = 0x8, 93 }; 94 95 /** 96 * Intersects the current clip with the new clip rectangle. 97 */ 98 bool clip(float left, float top, float right, float bottom, SkRegion::Op op) { 99 bool clipped = false; 100 101 Rect r(left, top, right, bottom); 102 transform.mapRect(r); 103 104 switch (op) { 105 case SkRegion::kDifference_Op: 106 break; 107 case SkRegion::kIntersect_Op: 108 clipped = clipRect.intersect(r); 109 break; 110 case SkRegion::kUnion_Op: 111 clipped = clipRect.unionWith(r); 112 break; 113 case SkRegion::kXOR_Op: 114 break; 115 case SkRegion::kReverseDifference_Op: 116 break; 117 case SkRegion::kReplace_Op: 118 clipRect.set(r); 119 clipped = true; 120 break; 121 } 122 123 if (clipped) { 124 flags |= Snapshot::kFlagClipSet | Snapshot::kFlagDirtyLocalClip; 125 } 126 127 return clipped; 128 } 129 130 /** 131 * Sets the current clip. 132 */ 133 void setClip(float left, float top, float right, float bottom) { 134 clipRect.set(left, top, right, bottom); 135 flags |= Snapshot::kFlagClipSet | Snapshot::kFlagDirtyLocalClip; 136 } 137 138 const Rect& getLocalClip() { 139 if (flags & Snapshot::kFlagDirtyLocalClip) { 140 mat4 inverse; 141 inverse.loadInverse(transform); 142 143 localClip.set(clipRect); 144 inverse.mapRect(localClip); 145 146 flags &= ~Snapshot::kFlagDirtyLocalClip; 147 } 148 return localClip; 149 } 150 151 /** 152 * Height of the framebuffer the snapshot is rendering into. 153 */ 154 int height; 155 156 /** 157 * Local transformation. Holds the current translation, scale and 158 * rotation values. 159 */ 160 mat4 transform; 161 162 /** 163 * Current clip region. The clip is stored in canvas-space coordinates, 164 * (screen-space coordinates in the regular case.) 165 */ 166 Rect clipRect; 167 168 /** 169 * If true, the layer won't be rendered. 170 */ 171 bool invisible; 172 173 /** 174 * Dirty flags. 175 */ 176 int flags; 177 178 /** 179 * Previous snapshot. 180 */ 181 sp<Snapshot> previous; 182 183 /** 184 * Only set when the flag kFlagIsLayer is set. 185 */ 186 Layer* layer; 187 GLuint fbo; 188 189 /** 190 * Current viewport. 191 */ 192 Rect viewport; 193 194 /** 195 * Contains the previous ortho matrix. 196 */ 197 mat4 orthoMatrix; 198 199private: 200 Rect localClip; 201 202}; // class Snapshot 203 204}; // namespace uirenderer 205}; // namespace android 206 207#endif // ANDROID_UI_SNAPSHOT_H 208