Snapshot.h revision f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640
10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2010 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#ifndef ANDROID_UI_SNAPSHOT_H 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#define ANDROID_UI_SNAPSHOT_H 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <GLES2/gl2.h> 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <GLES2/gl2ext.h> 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <SkXfermode.h> 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <utils/RefBase.h> 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include "Matrix.h" 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include "Rect.h" 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillenamespace android { 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillenamespace uirenderer { 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * A snapshot holds information about the current state of the rendering 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * surface. A snapshot is usually created whenever the user calls save() 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * and discarded when the user calls restore(). Once a snapshot is created, 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * it can hold information for deferred rendering. 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Each snapshot has a link to a previous snapshot, indicating the previous 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * state of the renderer. 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleclass Snapshot: public LightRefBase<Snapshot> { 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic: 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Snapshot() { 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copies the specified snapshot. Only the transform and clip rectangle 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * are copied. The layer information is set to 0 and the transform is 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * assumed to be dirty. The specified snapshot is stored as the previous 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * snapshot. 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Snapshot(const sp<Snapshot> s): 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville height(s->height), 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville transform(s->transform), 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville clipRect(s->clipRect), 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville flags(kFlagDirtyTransform), 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville previous(s), 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville layer(0.0f, 0.0f, 0.0f, 0.0f), 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville texture(0), 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville fbo(0), 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville alpha(255) { 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Various flags set on #flags. 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville enum Flags { 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Indicates that the clip region was modified. When this 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * snapshot is restored so must the clip. 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville kFlagClipSet = 0x1, 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Indicates that the snapshot holds new transform 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * information. 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville kFlagDirtyTransform = 0x2, 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Indicates that this snapshot was created when saving 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * a new layer. 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville kFlagIsLayer = 0x4, 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Indicates that this snapshot has changed the ortho matrix. 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville kFlagDirtyOrtho = 0x8, 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville }; 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Returns the current clip region mapped by the current transform. 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville const Rect& getMappedClip() { 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (flags & kFlagDirtyTransform) { 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville flags &= ~kFlagDirtyTransform; 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mappedClip.set(clipRect); 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville transform.mapRect(mappedClip); 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mappedClip; 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Height of the framebuffer the snapshot is rendering into. 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int height; 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Local transformation. Holds the current translation, scale and 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * rotation values. 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mat4 transform; 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Current clip region. 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Rect clipRect; 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Dirty flags. 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int flags; 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Previous snapshot. 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sp<Snapshot> previous; 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Coordinates of the layer corresponding to this snapshot. 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Only set when the flag kFlagIsLayer is set. 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Rect layer; 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Name of the texture used to render the layer. 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Only set when the flag kFlagIsLayer is set. 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GLuint texture; 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Name of the FBO used to render the layer. 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Only set when the flag kFlagIsLayer is set. 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GLuint fbo; 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Opacity of the layer. 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Only set when the flag kFlagIsLayer is set. 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville float alpha; 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Blending mode of the layer. 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Only set when the flag kFlagIsLayer is set. 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SkXfermode::Mode mode; 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Contains the previous ortho matrix. 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville float orthoMatrix[16]; 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleprivate: 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Clipping rectangle mapped with the transform 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Rect mappedClip; 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}; // class Snapshot 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}; // namespace uirenderer 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}; // namespace android 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#endif // ANDROID_UI_SNAPSHOT_H 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville