Snapshot.h revision d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895
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) { 593d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy mappedClip.set(s->clipRect); 603d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy transform.mapRect(mappedClip); 615cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 625cbbce535744b89df5ecea95de21ee3733298260Romain Guy 635cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 645cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Various flags set on #flags. 655cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 665cbbce535744b89df5ecea95de21ee3733298260Romain Guy enum Flags { 675cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 685cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Indicates that the clip region was modified. When this 695cbbce535744b89df5ecea95de21ee3733298260Romain Guy * snapshot is restored so must the clip. 705cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 715cbbce535744b89df5ecea95de21ee3733298260Romain Guy kFlagClipSet = 0x1, 725cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 735cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Indicates that the snapshot holds new transform 745cbbce535744b89df5ecea95de21ee3733298260Romain Guy * information. 755cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 765cbbce535744b89df5ecea95de21ee3733298260Romain Guy kFlagDirtyTransform = 0x2, 775cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 785cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Indicates that this snapshot was created when saving 795cbbce535744b89df5ecea95de21ee3733298260Romain Guy * a new layer. 805cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 815cbbce535744b89df5ecea95de21ee3733298260Romain Guy kFlagIsLayer = 0x4, 82f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy /** 83f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy * Indicates that this snapshot has changed the ortho matrix. 84f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy */ 85f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy kFlagDirtyOrtho = 0x8, 865cbbce535744b89df5ecea95de21ee3733298260Romain Guy }; 875cbbce535744b89df5ecea95de21ee3733298260Romain Guy 885cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 895cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Returns the current clip region mapped by the current transform. 905cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 915cbbce535744b89df5ecea95de21ee3733298260Romain Guy const Rect& getMappedClip() { 923d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy return mappedClip; 933d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy } 943d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy 953d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy /** 963d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy * Intersects the current clip with the new clip rectangle. 973d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy */ 983d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy bool clip(float left, float top, float right, float bottom) { 993d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy bool clipped = clipRect.intersect(left, top, right, bottom); 1005cbbce535744b89df5ecea95de21ee3733298260Romain Guy if (flags & kFlagDirtyTransform) { 1015cbbce535744b89df5ecea95de21ee3733298260Romain Guy flags &= ~kFlagDirtyTransform; 1025cbbce535744b89df5ecea95de21ee3733298260Romain Guy mappedClip.set(clipRect); 1035cbbce535744b89df5ecea95de21ee3733298260Romain Guy transform.mapRect(mappedClip); 1045cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 1053d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy return clipped; 1065cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 1075cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1085cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 109d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy * Sets the current clip. 110d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy */ 111d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy void setClip(float left, float top, float right, float bottom) { 112d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy clipRect.set(left, top, right, bottom); 113d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy if (flags & kFlagDirtyTransform) { 114d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy flags &= ~kFlagDirtyTransform; 115d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy mappedClip.set(clipRect); 116d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy transform.mapRect(mappedClip); 117d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy } 118d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy } 119d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy 120d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy /** 121f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy * Height of the framebuffer the snapshot is rendering into. 122f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy */ 123f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy int height; 124f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy 125f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy /** 1265cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Local transformation. Holds the current translation, scale and 1275cbbce535744b89df5ecea95de21ee3733298260Romain Guy * rotation values. 1285cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1295cbbce535744b89df5ecea95de21ee3733298260Romain Guy mat4 transform; 1305cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1315cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1325cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Current clip region. 1335cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1345cbbce535744b89df5ecea95de21ee3733298260Romain Guy Rect clipRect; 1355cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1365cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1375cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Dirty flags. 1385cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1395cbbce535744b89df5ecea95de21ee3733298260Romain Guy int flags; 1405cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1415cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1425cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Previous snapshot. 1435cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1445cbbce535744b89df5ecea95de21ee3733298260Romain Guy sp<Snapshot> previous; 1455cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1465cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1475cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Only set when the flag kFlagIsLayer is set. 1485cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 149dda570201ac851dd85af3861f7e575721d3345daRomain Guy Layer* layer; 1505cbbce535744b89df5ecea95de21ee3733298260Romain Guy GLuint fbo; 1515cbbce535744b89df5ecea95de21ee3733298260Romain Guy 152f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy /** 153f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy * Contains the previous ortho matrix. 154f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy */ 155260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy mat4 orthoMatrix; 156f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy 1575cbbce535744b89df5ecea95de21ee3733298260Romain Guyprivate: 1585cbbce535744b89df5ecea95de21ee3733298260Romain Guy // Clipping rectangle mapped with the transform 1595cbbce535744b89df5ecea95de21ee3733298260Romain Guy Rect mappedClip; 1605cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // class Snapshot 1615cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1625cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace uirenderer 1635cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace android 1645cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1655cbbce535744b89df5ecea95de21ee3733298260Romain Guy#endif // ANDROID_UI_SNAPSHOT_H 166