Snapshot.h revision dda570201ac851dd85af3861f7e575721d3345da
15cbbce535744b89df5ecea95de21ee3733298260Romain Guy/* 25cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Copyright (C) 2010 The Android Open Source Project 35cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 45cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 55cbbce535744b89df5ecea95de21ee3733298260Romain Guy * you may not use this file except in compliance with the License. 65cbbce535744b89df5ecea95de21ee3733298260Romain Guy * You may obtain a copy of the License at 75cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 85cbbce535744b89df5ecea95de21ee3733298260Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 95cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 105cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Unless required by applicable law or agreed to in writing, software 115cbbce535744b89df5ecea95de21ee3733298260Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 125cbbce535744b89df5ecea95de21ee3733298260Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135cbbce535744b89df5ecea95de21ee3733298260Romain Guy * See the License for the specific language governing permissions and 145cbbce535744b89df5ecea95de21ee3733298260Romain Guy * limitations under the License. 155cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 165cbbce535744b89df5ecea95de21ee3733298260Romain Guy 175cbbce535744b89df5ecea95de21ee3733298260Romain Guy#ifndef ANDROID_UI_SNAPSHOT_H 185cbbce535744b89df5ecea95de21ee3733298260Romain Guy#define ANDROID_UI_SNAPSHOT_H 195cbbce535744b89df5ecea95de21ee3733298260Romain Guy 205cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include <GLES2/gl2.h> 215cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include <GLES2/gl2ext.h> 225cbbce535744b89df5ecea95de21ee3733298260Romain Guy 235cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include <utils/RefBase.h> 245cbbce535744b89df5ecea95de21ee3733298260Romain Guy 25dda570201ac851dd85af3861f7e575721d3345daRomain Guy#include "Layer.h" 265cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include "Matrix.h" 275cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include "Rect.h" 285cbbce535744b89df5ecea95de21ee3733298260Romain Guy 295cbbce535744b89df5ecea95de21ee3733298260Romain Guynamespace android { 305cbbce535744b89df5ecea95de21ee3733298260Romain Guynamespace uirenderer { 315cbbce535744b89df5ecea95de21ee3733298260Romain Guy 325cbbce535744b89df5ecea95de21ee3733298260Romain Guy/** 335cbbce535744b89df5ecea95de21ee3733298260Romain Guy * A snapshot holds information about the current state of the rendering 345cbbce535744b89df5ecea95de21ee3733298260Romain Guy * surface. A snapshot is usually created whenever the user calls save() 355cbbce535744b89df5ecea95de21ee3733298260Romain Guy * and discarded when the user calls restore(). Once a snapshot is created, 365cbbce535744b89df5ecea95de21ee3733298260Romain Guy * it can hold information for deferred rendering. 375cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 385cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Each snapshot has a link to a previous snapshot, indicating the previous 395cbbce535744b89df5ecea95de21ee3733298260Romain Guy * state of the renderer. 405cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 415cbbce535744b89df5ecea95de21ee3733298260Romain Guyclass Snapshot: public LightRefBase<Snapshot> { 425cbbce535744b89df5ecea95de21ee3733298260Romain Guypublic: 43dda570201ac851dd85af3861f7e575721d3345daRomain Guy Snapshot(): layer(NULL), fbo(0) { } 445cbbce535744b89df5ecea95de21ee3733298260Romain Guy 455cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 465cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Copies the specified snapshot. Only the transform and clip rectangle 475cbbce535744b89df5ecea95de21ee3733298260Romain Guy * are copied. The layer information is set to 0 and the transform is 485cbbce535744b89df5ecea95de21ee3733298260Romain Guy * assumed to be dirty. The specified snapshot is stored as the previous 495cbbce535744b89df5ecea95de21ee3733298260Romain Guy * snapshot. 505cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 515cbbce535744b89df5ecea95de21ee3733298260Romain Guy Snapshot(const sp<Snapshot> s): 52f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy height(s->height), 535cbbce535744b89df5ecea95de21ee3733298260Romain Guy transform(s->transform), 545cbbce535744b89df5ecea95de21ee3733298260Romain Guy clipRect(s->clipRect), 555cbbce535744b89df5ecea95de21ee3733298260Romain Guy flags(kFlagDirtyTransform), 565cbbce535744b89df5ecea95de21ee3733298260Romain Guy previous(s), 57dda570201ac851dd85af3861f7e575721d3345daRomain Guy layer(NULL), 58dda570201ac851dd85af3861f7e575721d3345daRomain Guy fbo(s->fbo) { 595cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 605cbbce535744b89df5ecea95de21ee3733298260Romain Guy 615cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 625cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Various flags set on #flags. 635cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 645cbbce535744b89df5ecea95de21ee3733298260Romain Guy enum Flags { 655cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 665cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Indicates that the clip region was modified. When this 675cbbce535744b89df5ecea95de21ee3733298260Romain Guy * snapshot is restored so must the clip. 685cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 695cbbce535744b89df5ecea95de21ee3733298260Romain Guy kFlagClipSet = 0x1, 705cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 715cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Indicates that the snapshot holds new transform 725cbbce535744b89df5ecea95de21ee3733298260Romain Guy * information. 735cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 745cbbce535744b89df5ecea95de21ee3733298260Romain Guy kFlagDirtyTransform = 0x2, 755cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 765cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Indicates that this snapshot was created when saving 775cbbce535744b89df5ecea95de21ee3733298260Romain Guy * a new layer. 785cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 795cbbce535744b89df5ecea95de21ee3733298260Romain Guy kFlagIsLayer = 0x4, 80f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy /** 81f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy * Indicates that this snapshot has changed the ortho matrix. 82f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy */ 83f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy kFlagDirtyOrtho = 0x8, 845cbbce535744b89df5ecea95de21ee3733298260Romain Guy }; 855cbbce535744b89df5ecea95de21ee3733298260Romain Guy 865cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 875cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Returns the current clip region mapped by the current transform. 885cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 895cbbce535744b89df5ecea95de21ee3733298260Romain Guy const Rect& getMappedClip() { 905cbbce535744b89df5ecea95de21ee3733298260Romain Guy if (flags & kFlagDirtyTransform) { 915cbbce535744b89df5ecea95de21ee3733298260Romain Guy flags &= ~kFlagDirtyTransform; 925cbbce535744b89df5ecea95de21ee3733298260Romain Guy mappedClip.set(clipRect); 935cbbce535744b89df5ecea95de21ee3733298260Romain Guy transform.mapRect(mappedClip); 945cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 955cbbce535744b89df5ecea95de21ee3733298260Romain Guy return mappedClip; 965cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 975cbbce535744b89df5ecea95de21ee3733298260Romain Guy 985cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 99f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy * Height of the framebuffer the snapshot is rendering into. 100f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy */ 101f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy int height; 102f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy 103f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy /** 1045cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Local transformation. Holds the current translation, scale and 1055cbbce535744b89df5ecea95de21ee3733298260Romain Guy * rotation values. 1065cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1075cbbce535744b89df5ecea95de21ee3733298260Romain Guy mat4 transform; 1085cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1095cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1105cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Current clip region. 1115cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1125cbbce535744b89df5ecea95de21ee3733298260Romain Guy Rect clipRect; 1135cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1145cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1155cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Dirty flags. 1165cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1175cbbce535744b89df5ecea95de21ee3733298260Romain Guy int flags; 1185cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1195cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1205cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Previous snapshot. 1215cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1225cbbce535744b89df5ecea95de21ee3733298260Romain Guy sp<Snapshot> previous; 1235cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1245cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1255cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Only set when the flag kFlagIsLayer is set. 1265cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 127dda570201ac851dd85af3861f7e575721d3345daRomain Guy Layer* layer; 1285cbbce535744b89df5ecea95de21ee3733298260Romain Guy GLuint fbo; 1295cbbce535744b89df5ecea95de21ee3733298260Romain Guy 130f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy /** 131f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy * Contains the previous ortho matrix. 132f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy */ 133f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy float orthoMatrix[16]; 134f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy 1355cbbce535744b89df5ecea95de21ee3733298260Romain Guyprivate: 1365cbbce535744b89df5ecea95de21ee3733298260Romain Guy // Clipping rectangle mapped with the transform 1375cbbce535744b89df5ecea95de21ee3733298260Romain Guy Rect mappedClip; 1385cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // class Snapshot 1395cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1405cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace uirenderer 1415cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace android 1425cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1435cbbce535744b89df5ecea95de21ee3733298260Romain Guy#endif // ANDROID_UI_SNAPSHOT_H 144