Snapshot.h revision 5cbbce535744b89df5ecea95de21ee3733298260
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 255cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include "Matrix.h" 265cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include "Rect.h" 275cbbce535744b89df5ecea95de21ee3733298260Romain Guy 285cbbce535744b89df5ecea95de21ee3733298260Romain Guynamespace android { 295cbbce535744b89df5ecea95de21ee3733298260Romain Guynamespace uirenderer { 305cbbce535744b89df5ecea95de21ee3733298260Romain Guy 315cbbce535744b89df5ecea95de21ee3733298260Romain Guy/** 325cbbce535744b89df5ecea95de21ee3733298260Romain Guy * A snapshot holds information about the current state of the rendering 335cbbce535744b89df5ecea95de21ee3733298260Romain Guy * surface. A snapshot is usually created whenever the user calls save() 345cbbce535744b89df5ecea95de21ee3733298260Romain Guy * and discarded when the user calls restore(). Once a snapshot is created, 355cbbce535744b89df5ecea95de21ee3733298260Romain Guy * it can hold information for deferred rendering. 365cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 375cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Each snapshot has a link to a previous snapshot, indicating the previous 385cbbce535744b89df5ecea95de21ee3733298260Romain Guy * state of the renderer. 395cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 405cbbce535744b89df5ecea95de21ee3733298260Romain Guyclass Snapshot: public LightRefBase<Snapshot> { 415cbbce535744b89df5ecea95de21ee3733298260Romain Guypublic: 425cbbce535744b89df5ecea95de21ee3733298260Romain Guy Snapshot() { 435cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 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): 525cbbce535744b89df5ecea95de21ee3733298260Romain Guy transform(s->transform), 535cbbce535744b89df5ecea95de21ee3733298260Romain Guy clipRect(s->clipRect), 545cbbce535744b89df5ecea95de21ee3733298260Romain Guy flags(kFlagDirtyTransform), 555cbbce535744b89df5ecea95de21ee3733298260Romain Guy previous(s), 565cbbce535744b89df5ecea95de21ee3733298260Romain Guy layer(0.0f, 0.0f, 0.0f, 0.0f), 575cbbce535744b89df5ecea95de21ee3733298260Romain Guy texture(0), 585cbbce535744b89df5ecea95de21ee3733298260Romain Guy fbo(0), 595cbbce535744b89df5ecea95de21ee3733298260Romain Guy alpha(255) { 605cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 615cbbce535744b89df5ecea95de21ee3733298260Romain Guy 625cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 635cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Various flags set on #flags. 645cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 655cbbce535744b89df5ecea95de21ee3733298260Romain Guy enum Flags { 665cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 675cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Indicates that the clip region was modified. When this 685cbbce535744b89df5ecea95de21ee3733298260Romain Guy * snapshot is restored so must the clip. 695cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 705cbbce535744b89df5ecea95de21ee3733298260Romain Guy kFlagClipSet = 0x1, 715cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 725cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Indicates that the snapshot holds new transform 735cbbce535744b89df5ecea95de21ee3733298260Romain Guy * information. 745cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 755cbbce535744b89df5ecea95de21ee3733298260Romain Guy kFlagDirtyTransform = 0x2, 765cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 775cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Indicates that this snapshot was created when saving 785cbbce535744b89df5ecea95de21ee3733298260Romain Guy * a new layer. 795cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 805cbbce535744b89df5ecea95de21ee3733298260Romain Guy kFlagIsLayer = 0x4, 815cbbce535744b89df5ecea95de21ee3733298260Romain Guy }; 825cbbce535744b89df5ecea95de21ee3733298260Romain Guy 835cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 845cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Returns the current clip region mapped by the current transform. 855cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 865cbbce535744b89df5ecea95de21ee3733298260Romain Guy const Rect& getMappedClip() { 875cbbce535744b89df5ecea95de21ee3733298260Romain Guy if (flags & kFlagDirtyTransform) { 885cbbce535744b89df5ecea95de21ee3733298260Romain Guy flags &= ~kFlagDirtyTransform; 895cbbce535744b89df5ecea95de21ee3733298260Romain Guy mappedClip.set(clipRect); 905cbbce535744b89df5ecea95de21ee3733298260Romain Guy transform.mapRect(mappedClip); 915cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 925cbbce535744b89df5ecea95de21ee3733298260Romain Guy return mappedClip; 935cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 945cbbce535744b89df5ecea95de21ee3733298260Romain Guy 955cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 965cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Local transformation. Holds the current translation, scale and 975cbbce535744b89df5ecea95de21ee3733298260Romain Guy * rotation values. 985cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 995cbbce535744b89df5ecea95de21ee3733298260Romain Guy mat4 transform; 1005cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1015cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1025cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Current clip region. 1035cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1045cbbce535744b89df5ecea95de21ee3733298260Romain Guy Rect clipRect; 1055cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1065cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1075cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Dirty flags. 1085cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1095cbbce535744b89df5ecea95de21ee3733298260Romain Guy int flags; 1105cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1115cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1125cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Previous snapshot. 1135cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1145cbbce535744b89df5ecea95de21ee3733298260Romain Guy sp<Snapshot> previous; 1155cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1165cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1175cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Coordinates of the layer corresponding to this snapshot. 1185cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Only set when the flag kFlagIsLayer is set. 1195cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1205cbbce535744b89df5ecea95de21ee3733298260Romain Guy Rect layer; 1215cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1225cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Name of the texture used to render the layer. 1235cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Only set when the flag kFlagIsLayer is set. 1245cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1255cbbce535744b89df5ecea95de21ee3733298260Romain Guy GLuint texture; 1265cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1275cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Name of the FBO used to render the layer. 1285cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Only set when the flag kFlagIsLayer is set. 1295cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1305cbbce535744b89df5ecea95de21ee3733298260Romain Guy GLuint fbo; 1315cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1325cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Opacity of the layer. 1335cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Only set when the flag kFlagIsLayer is set. 1345cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1355cbbce535744b89df5ecea95de21ee3733298260Romain Guy float alpha; 1365cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1375cbbce535744b89df5ecea95de21ee3733298260Romain Guyprivate: 1385cbbce535744b89df5ecea95de21ee3733298260Romain Guy // Clipping rectangle mapped with the transform 1395cbbce535744b89df5ecea95de21ee3733298260Romain Guy Rect mappedClip; 1405cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // class Snapshot 1415cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1425cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace uirenderer 1435cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace android 1445cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1455cbbce535744b89df5ecea95de21ee3733298260Romain Guy#endif // ANDROID_UI_SNAPSHOT_H 146