Snapshot.h revision f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640
1932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/* 2932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Copyright (C) 2010 The Android Open Source Project 3932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 4932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 5932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * you may not use this file except in compliance with the License. 6932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * You may obtain a copy of the License at 7932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 8932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * http://www.apache.org/licenses/LICENSE-2.0 9932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 10932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Unless required by applicable law or agreed to in writing, software 11932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 12932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * See the License for the specific language governing permissions and 14932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * limitations under the License. 15932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 16932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 17932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#ifndef ANDROID_UI_SNAPSHOT_H 18932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#define ANDROID_UI_SNAPSHOT_H 19932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 20932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <GLES2/gl2.h> 21932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <GLES2/gl2ext.h> 22932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 23932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <SkXfermode.h> 24932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 25932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <utils/RefBase.h> 26932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 27932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "Matrix.h" 28932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "Rect.h" 29932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 30932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace android { 31932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace uirenderer { 32932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 33932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/** 34932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * A snapshot holds information about the current state of the rendering 35932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * surface. A snapshot is usually created whenever the user calls save() 36932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * and discarded when the user calls restore(). Once a snapshot is created, 37932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * it can hold information for deferred rendering. 38932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 39932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Each snapshot has a link to a previous snapshot, indicating the previous 40932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * state of the renderer. 41932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 42932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesclass Snapshot: public LightRefBase<Snapshot> { 43932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinespublic: 44932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Snapshot() { 45932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 46932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 47932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 48932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Copies the specified snapshot. Only the transform and clip rectangle 49932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * are copied. The layer information is set to 0 and the transform is 50932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * assumed to be dirty. The specified snapshot is stored as the previous 51932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * snapshot. 52932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 53932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Snapshot(const sp<Snapshot> s): 54932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines height(s->height), 55932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines transform(s->transform), 56932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines clipRect(s->clipRect), 57932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines flags(kFlagDirtyTransform), 58932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines previous(s), 59932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines layer(0.0f, 0.0f, 0.0f, 0.0f), 60932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines texture(0), 61932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines fbo(0), 62932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines alpha(255) { 63932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 64932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 65932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 66932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Various flags set on #flags. 67932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 68932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines enum Flags { 69932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 70932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Indicates that the clip region was modified. When this 71932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * snapshot is restored so must the clip. 72932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 73932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines kFlagClipSet = 0x1, 74932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 75932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Indicates that the snapshot holds new transform 76932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * information. 77932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 78932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines kFlagDirtyTransform = 0x2, 79932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 80932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Indicates that this snapshot was created when saving 81932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * a new layer. 82932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 83932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines kFlagIsLayer = 0x4, 84932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 85932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Indicates that this snapshot has changed the ortho matrix. 86932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 87932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines kFlagDirtyOrtho = 0x8, 88932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines }; 89932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 90932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 91932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Returns the current clip region mapped by the current transform. 92932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 93932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const Rect& getMappedClip() { 94932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (flags & kFlagDirtyTransform) { 95932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines flags &= ~kFlagDirtyTransform; 96932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mappedClip.set(clipRect); 97932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines transform.mapRect(mappedClip); 98932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 99932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return mappedClip; 100932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 101932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 102932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 103932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Height of the framebuffer the snapshot is rendering into. 104932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 105932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines int height; 106932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 107932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 108932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Local transformation. Holds the current translation, scale and 109932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * rotation values. 110932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 111932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mat4 transform; 112932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 113932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 114932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Current clip region. 115932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 116932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Rect clipRect; 117932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 118932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 119932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Dirty flags. 120932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 121932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines int flags; 122932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 123932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 124932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Previous snapshot. 125932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 126932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines sp<Snapshot> previous; 127932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 128932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 129932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Coordinates of the layer corresponding to this snapshot. 130932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Only set when the flag kFlagIsLayer is set. 131932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 132932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Rect layer; 133932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 134932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Name of the texture used to render the layer. 135932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Only set when the flag kFlagIsLayer is set. 136932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 137932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines GLuint texture; 138932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 139932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Name of the FBO used to render the layer. 140932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Only set when the flag kFlagIsLayer is set. 141932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 142932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines GLuint fbo; 143932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 144932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Opacity of the layer. 145932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Only set when the flag kFlagIsLayer is set. 146932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 147932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines float alpha; 148932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 149932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Blending mode of the layer. 150932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Only set when the flag kFlagIsLayer is set. 151932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 152932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines SkXfermode::Mode mode; 153932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 154932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 155932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Contains the previous ortho matrix. 156932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 157932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines float orthoMatrix[16]; 158932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 159932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesprivate: 160932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // Clipping rectangle mapped with the transform 161932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Rect mappedClip; 162932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}; // class Snapshot 163932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 164932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}; // namespace uirenderer 165932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}; // namespace android 166932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 167932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#endif // ANDROID_UI_SNAPSHOT_H 168932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines