Snapshot.h revision d55a86120dd1e8ebcc6906c9ffd463f7460348da
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 <SkXfermode.h> 24 25#include <utils/RefBase.h> 26 27#include "Matrix.h" 28#include "Rect.h" 29 30namespace android { 31namespace uirenderer { 32 33/** 34 * A snapshot holds information about the current state of the rendering 35 * surface. A snapshot is usually created whenever the user calls save() 36 * and discarded when the user calls restore(). Once a snapshot is created, 37 * it can hold information for deferred rendering. 38 * 39 * Each snapshot has a link to a previous snapshot, indicating the previous 40 * state of the renderer. 41 */ 42class Snapshot: public LightRefBase<Snapshot> { 43public: 44 Snapshot() { 45 } 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 transform(s->transform), 55 clipRect(s->clipRect), 56 flags(kFlagDirtyTransform), 57 previous(s), 58 layer(0.0f, 0.0f, 0.0f, 0.0f), 59 texture(0), 60 fbo(0), 61 alpha(255) { 62 } 63 64 /** 65 * Various flags set on #flags. 66 */ 67 enum Flags { 68 /** 69 * Indicates that the clip region was modified. When this 70 * snapshot is restored so must the clip. 71 */ 72 kFlagClipSet = 0x1, 73 /** 74 * Indicates that the snapshot holds new transform 75 * information. 76 */ 77 kFlagDirtyTransform = 0x2, 78 /** 79 * Indicates that this snapshot was created when saving 80 * a new layer. 81 */ 82 kFlagIsLayer = 0x4, 83 }; 84 85 /** 86 * Returns the current clip region mapped by the current transform. 87 */ 88 const Rect& getMappedClip() { 89 if (flags & kFlagDirtyTransform) { 90 flags &= ~kFlagDirtyTransform; 91 mappedClip.set(clipRect); 92 transform.mapRect(mappedClip); 93 } 94 return mappedClip; 95 } 96 97 /** 98 * Local transformation. Holds the current translation, scale and 99 * rotation values. 100 */ 101 mat4 transform; 102 103 /** 104 * Current clip region. 105 */ 106 Rect clipRect; 107 108 /** 109 * Dirty flags. 110 */ 111 int flags; 112 113 /** 114 * Previous snapshot. 115 */ 116 sp<Snapshot> previous; 117 118 /** 119 * Coordinates of the layer corresponding to this snapshot. 120 * Only set when the flag kFlagIsLayer is set. 121 */ 122 Rect layer; 123 /** 124 * Name of the texture used to render the layer. 125 * Only set when the flag kFlagIsLayer is set. 126 */ 127 GLuint texture; 128 /** 129 * Name of the FBO used to render the layer. 130 * Only set when the flag kFlagIsLayer is set. 131 */ 132 GLuint fbo; 133 /** 134 * Opacity of the layer. 135 * Only set when the flag kFlagIsLayer is set. 136 */ 137 float alpha; 138 /** 139 * Blending mode of the layer. 140 * Only set when the flag kFlagIsLayer is set. 141 */ 142 SkXfermode::Mode mode; 143 144private: 145 // Clipping rectangle mapped with the transform 146 Rect mappedClip; 147}; // class Snapshot 148 149}; // namespace uirenderer 150}; // namespace android 151 152#endif // ANDROID_UI_SNAPSHOT_H 153