Snapshot.h revision f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640
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 23d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy#include <SkXfermode.h> 24d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy 255cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include <utils/RefBase.h> 265cbbce535744b89df5ecea95de21ee3733298260Romain Guy 275cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include "Matrix.h" 285cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include "Rect.h" 295cbbce535744b89df5ecea95de21ee3733298260Romain Guy 305cbbce535744b89df5ecea95de21ee3733298260Romain Guynamespace android { 315cbbce535744b89df5ecea95de21ee3733298260Romain Guynamespace uirenderer { 325cbbce535744b89df5ecea95de21ee3733298260Romain Guy 335cbbce535744b89df5ecea95de21ee3733298260Romain Guy/** 345cbbce535744b89df5ecea95de21ee3733298260Romain Guy * A snapshot holds information about the current state of the rendering 355cbbce535744b89df5ecea95de21ee3733298260Romain Guy * surface. A snapshot is usually created whenever the user calls save() 365cbbce535744b89df5ecea95de21ee3733298260Romain Guy * and discarded when the user calls restore(). Once a snapshot is created, 375cbbce535744b89df5ecea95de21ee3733298260Romain Guy * it can hold information for deferred rendering. 385cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 395cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Each snapshot has a link to a previous snapshot, indicating the previous 405cbbce535744b89df5ecea95de21ee3733298260Romain Guy * state of the renderer. 415cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 425cbbce535744b89df5ecea95de21ee3733298260Romain Guyclass Snapshot: public LightRefBase<Snapshot> { 435cbbce535744b89df5ecea95de21ee3733298260Romain Guypublic: 445cbbce535744b89df5ecea95de21ee3733298260Romain Guy Snapshot() { 455cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 465cbbce535744b89df5ecea95de21ee3733298260Romain Guy 475cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 485cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Copies the specified snapshot. Only the transform and clip rectangle 495cbbce535744b89df5ecea95de21ee3733298260Romain Guy * are copied. The layer information is set to 0 and the transform is 505cbbce535744b89df5ecea95de21ee3733298260Romain Guy * assumed to be dirty. The specified snapshot is stored as the previous 515cbbce535744b89df5ecea95de21ee3733298260Romain Guy * snapshot. 525cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 535cbbce535744b89df5ecea95de21ee3733298260Romain Guy Snapshot(const sp<Snapshot> s): 54f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy height(s->height), 555cbbce535744b89df5ecea95de21ee3733298260Romain Guy transform(s->transform), 565cbbce535744b89df5ecea95de21ee3733298260Romain Guy clipRect(s->clipRect), 575cbbce535744b89df5ecea95de21ee3733298260Romain Guy flags(kFlagDirtyTransform), 585cbbce535744b89df5ecea95de21ee3733298260Romain Guy previous(s), 595cbbce535744b89df5ecea95de21ee3733298260Romain Guy layer(0.0f, 0.0f, 0.0f, 0.0f), 605cbbce535744b89df5ecea95de21ee3733298260Romain Guy texture(0), 615cbbce535744b89df5ecea95de21ee3733298260Romain Guy fbo(0), 625cbbce535744b89df5ecea95de21ee3733298260Romain Guy alpha(255) { 635cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 645cbbce535744b89df5ecea95de21ee3733298260Romain Guy 655cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 665cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Various flags set on #flags. 675cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 685cbbce535744b89df5ecea95de21ee3733298260Romain Guy enum Flags { 695cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 705cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Indicates that the clip region was modified. When this 715cbbce535744b89df5ecea95de21ee3733298260Romain Guy * snapshot is restored so must the clip. 725cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 735cbbce535744b89df5ecea95de21ee3733298260Romain Guy kFlagClipSet = 0x1, 745cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 755cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Indicates that the snapshot holds new transform 765cbbce535744b89df5ecea95de21ee3733298260Romain Guy * information. 775cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 785cbbce535744b89df5ecea95de21ee3733298260Romain Guy kFlagDirtyTransform = 0x2, 795cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 805cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Indicates that this snapshot was created when saving 815cbbce535744b89df5ecea95de21ee3733298260Romain Guy * a new layer. 825cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 835cbbce535744b89df5ecea95de21ee3733298260Romain Guy kFlagIsLayer = 0x4, 84f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy /** 85f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy * Indicates that this snapshot has changed the ortho matrix. 86f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy */ 87f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy kFlagDirtyOrtho = 0x8, 885cbbce535744b89df5ecea95de21ee3733298260Romain Guy }; 895cbbce535744b89df5ecea95de21ee3733298260Romain Guy 905cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 915cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Returns the current clip region mapped by the current transform. 925cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 935cbbce535744b89df5ecea95de21ee3733298260Romain Guy const Rect& getMappedClip() { 945cbbce535744b89df5ecea95de21ee3733298260Romain Guy if (flags & kFlagDirtyTransform) { 955cbbce535744b89df5ecea95de21ee3733298260Romain Guy flags &= ~kFlagDirtyTransform; 965cbbce535744b89df5ecea95de21ee3733298260Romain Guy mappedClip.set(clipRect); 975cbbce535744b89df5ecea95de21ee3733298260Romain Guy transform.mapRect(mappedClip); 985cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 995cbbce535744b89df5ecea95de21ee3733298260Romain Guy return mappedClip; 1005cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 1015cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1025cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 103f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy * Height of the framebuffer the snapshot is rendering into. 104f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy */ 105f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy int height; 106f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy 107f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy /** 1085cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Local transformation. Holds the current translation, scale and 1095cbbce535744b89df5ecea95de21ee3733298260Romain Guy * rotation values. 1105cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1115cbbce535744b89df5ecea95de21ee3733298260Romain Guy mat4 transform; 1125cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1135cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1145cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Current clip region. 1155cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1165cbbce535744b89df5ecea95de21ee3733298260Romain Guy Rect clipRect; 1175cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1185cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1195cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Dirty flags. 1205cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1215cbbce535744b89df5ecea95de21ee3733298260Romain Guy int flags; 1225cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1235cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1245cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Previous snapshot. 1255cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1265cbbce535744b89df5ecea95de21ee3733298260Romain Guy sp<Snapshot> previous; 1275cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1285cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1295cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Coordinates of the layer corresponding to this snapshot. 1305cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Only set when the flag kFlagIsLayer is set. 1315cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1325cbbce535744b89df5ecea95de21ee3733298260Romain Guy Rect layer; 1335cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1345cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Name of the texture used to render the layer. 1355cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Only set when the flag kFlagIsLayer is set. 1365cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1375cbbce535744b89df5ecea95de21ee3733298260Romain Guy GLuint texture; 1385cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1395cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Name of the FBO used to render the layer. 1405cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Only set when the flag kFlagIsLayer is set. 1415cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1425cbbce535744b89df5ecea95de21ee3733298260Romain Guy GLuint fbo; 1435cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 1445cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Opacity of the layer. 1455cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Only set when the flag kFlagIsLayer is set. 1465cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 1475cbbce535744b89df5ecea95de21ee3733298260Romain Guy float alpha; 148d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy /** 149d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * Blending mode of the layer. 150d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * Only set when the flag kFlagIsLayer is set. 151d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy */ 152d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy SkXfermode::Mode mode; 1535cbbce535744b89df5ecea95de21ee3733298260Romain Guy 154f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy /** 155f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy * Contains the previous ortho matrix. 156f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy */ 157f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy float orthoMatrix[16]; 158f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy 1595cbbce535744b89df5ecea95de21ee3733298260Romain Guyprivate: 1605cbbce535744b89df5ecea95de21ee3733298260Romain Guy // Clipping rectangle mapped with the transform 1615cbbce535744b89df5ecea95de21ee3733298260Romain Guy Rect mappedClip; 1625cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // class Snapshot 1635cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1645cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace uirenderer 1655cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace android 1665cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1675cbbce535744b89df5ecea95de21ee3733298260Romain Guy#endif // ANDROID_UI_SNAPSHOT_H 168