Snapshot.h revision f219da5e32e85deb442468ee9a63bb28eb198557
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 175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_SNAPSHOT_H 185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_SNAPSHOT_H 195cbbce535744b89df5ecea95de21ee3733298260Romain Guy 205cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include <GLES2/gl2.h> 215cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include <GLES2/gl2ext.h> 225cbbce535744b89df5ecea95de21ee3733298260Romain Guy 235cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include <utils/RefBase.h> 245b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#include <ui/Region.h> 255cbbce535744b89df5ecea95de21ee3733298260Romain Guy 268aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy#include <SkCanvas.h> 27079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy 28dda570201ac851dd85af3861f7e575721d3345daRomain Guy#include "Layer.h" 295cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include "Matrix.h" 305cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include "Rect.h" 315cbbce535744b89df5ecea95de21ee3733298260Romain Guy 325cbbce535744b89df5ecea95de21ee3733298260Romain Guynamespace android { 335cbbce535744b89df5ecea95de21ee3733298260Romain Guynamespace uirenderer { 345cbbce535744b89df5ecea95de21ee3733298260Romain Guy 355cbbce535744b89df5ecea95de21ee3733298260Romain Guy/** 365cbbce535744b89df5ecea95de21ee3733298260Romain Guy * A snapshot holds information about the current state of the rendering 375cbbce535744b89df5ecea95de21ee3733298260Romain Guy * surface. A snapshot is usually created whenever the user calls save() 385cbbce535744b89df5ecea95de21ee3733298260Romain Guy * and discarded when the user calls restore(). Once a snapshot is created, 395cbbce535744b89df5ecea95de21ee3733298260Romain Guy * it can hold information for deferred rendering. 405cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 415cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Each snapshot has a link to a previous snapshot, indicating the previous 425cbbce535744b89df5ecea95de21ee3733298260Romain Guy * state of the renderer. 435cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 445cbbce535744b89df5ecea95de21ee3733298260Romain Guyclass Snapshot: public LightRefBase<Snapshot> { 455cbbce535744b89df5ecea95de21ee3733298260Romain Guypublic: 46af636ebf5feb2837683fbfe965040cb706b32ec1Romain Guy Snapshot(): flags(0), previous(NULL), layer(NULL), fbo(0), invisible(false), empty(false) { 478aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy transform = &mTransformRoot; 488aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy clipRect = &mClipRectRoot; 495b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy region = NULL; 508aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy } 515cbbce535744b89df5ecea95de21ee3733298260Romain Guy 525cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 538aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy * Copies the specified snapshot/ The specified snapshot is stored as 548aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy * the previous snapshot. 555cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 568aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy Snapshot(const sp<Snapshot>& s, int saveFlags): 57dbc26d2ba13f80a7590c57de2d80530d96832969Romain Guy flags(0), previous(s), layer(NULL), fbo(s->fbo), 58af636ebf5feb2837683fbfe965040cb706b32ec1Romain Guy invisible(s->invisible), empty(false), viewport(s->viewport), height(s->height) { 598aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy if (saveFlags & SkCanvas::kMatrix_SaveFlag) { 608aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy mTransformRoot.load(*s->transform); 618aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy transform = &mTransformRoot; 628aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy } else { 638aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy transform = s->transform; 648aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy } 658aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy 668aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy if (saveFlags & SkCanvas::kClip_SaveFlag) { 678aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy mClipRectRoot.set(*s->clipRect); 688aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy clipRect = &mClipRectRoot; 698aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy } else { 708aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy clipRect = s->clipRect; 718aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy } 728aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy 73b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy if ((s->flags & Snapshot::kFlagClipSet) && 74b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy !(s->flags & Snapshot::kFlagDirtyLocalClip)) { 758aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy mLocalClip.set(s->mLocalClip); 76b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy } else { 77b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy flags |= Snapshot::kFlagDirtyLocalClip; 78b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy } 795b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 805b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy if (s->flags & Snapshot::kFlagFboTarget) { 815b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy flags |= Snapshot::kFlagFboTarget; 825b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy region = s->region; 835b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy } else { 845b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy region = NULL; 855b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy } 865cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 875cbbce535744b89df5ecea95de21ee3733298260Romain Guy 885cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 895cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Various flags set on #flags. 905cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 915cbbce535744b89df5ecea95de21ee3733298260Romain Guy enum Flags { 925cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 935cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Indicates that the clip region was modified. When this 945cbbce535744b89df5ecea95de21ee3733298260Romain Guy * snapshot is restored so must the clip. 955cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 965cbbce535744b89df5ecea95de21ee3733298260Romain Guy kFlagClipSet = 0x1, 975cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 985cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Indicates that this snapshot was created when saving 995cbbce535744b89df5ecea95de21ee3733298260Romain Guy * a new layer. 1005cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 101079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy kFlagIsLayer = 0x2, 102f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy /** 103eb99356a0548684a501766e6a524529ab93304c8Romain Guy * Indicates that this snapshot is a special type of layer 104eb99356a0548684a501766e6a524529ab93304c8Romain Guy * backed by an FBO. This flag only makes sense when the 105eb99356a0548684a501766e6a524529ab93304c8Romain Guy * flag kFlagIsLayer is also set. 106eb99356a0548684a501766e6a524529ab93304c8Romain Guy */ 107eb99356a0548684a501766e6a524529ab93304c8Romain Guy kFlagIsFboLayer = 0x4, 108eb99356a0548684a501766e6a524529ab93304c8Romain Guy /** 10909147fbdc8206a0cac78bfe9083e7e15b3c5689cRomain Guy * Indicates that the local clip should be recomputed. 11009147fbdc8206a0cac78bfe9083e7e15b3c5689cRomain Guy */ 111eb99356a0548684a501766e6a524529ab93304c8Romain Guy kFlagDirtyLocalClip = 0x8, 112eb99356a0548684a501766e6a524529ab93304c8Romain Guy /** 113eb99356a0548684a501766e6a524529ab93304c8Romain Guy * Indicates that this snapshot has changed the ortho matrix. 114eb99356a0548684a501766e6a524529ab93304c8Romain Guy */ 115eb99356a0548684a501766e6a524529ab93304c8Romain Guy kFlagDirtyOrtho = 0x10, 1165b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy /** 1175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * Indicates that this snapshot or an ancestor snapshot is 1185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * an FBO layer. 1195b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 1205b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy kFlagFboTarget = 0x20 1215cbbce535744b89df5ecea95de21ee3733298260Romain Guy }; 1225cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1235cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 124f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy * Modifies the current clip with the new clip rectangle and 125f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy * the specified operation. The specified rectangle is transformed 126f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy * by this snapshot's trasnformation. 1273d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy */ 128f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy bool clip(float left, float top, float right, float bottom, 129f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy SkRegion::Op op = SkRegion::kIntersect_Op) { 130af28b514964861d81b48902f942f706050936d38Romain Guy Rect r(left, top, right, bottom); 1318aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy transform->mapRect(r); 132f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy return clipTransformed(r, op); 133f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy } 134f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy 135f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy /** 136f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy * Modifies the current clip with the new clip rectangle and 137f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy * the specified operation. The specified rectangle is considered 138f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy * already transformed. 139f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy */ 140f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy bool clipTransformed(const Rect& r, SkRegion::Op op = SkRegion::kIntersect_Op) { 141f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy bool clipped = false; 142079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy 14387a76578f76f4a6bceb187da6b7a01899ca0d85aRomain Guy // NOTE: The unimplemented operations require support for regions 14487a76578f76f4a6bceb187da6b7a01899ca0d85aRomain Guy // Supporting regions would require using a stencil buffer instead 14587a76578f76f4a6bceb187da6b7a01899ca0d85aRomain Guy // of the scissor. The stencil buffer itself is not too expensive 14687a76578f76f4a6bceb187da6b7a01899ca0d85aRomain Guy // (memory cost excluded) but on fillrate limited devices, managing 14787a76578f76f4a6bceb187da6b7a01899ca0d85aRomain Guy // the stencil might have a negative impact on the framerate. 148079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy switch (op) { 1497fac2e18339f765320d759e8d4c090f92431959eRomain Guy case SkRegion::kDifference_Op: 1507fac2e18339f765320d759e8d4c090f92431959eRomain Guy break; 1517fac2e18339f765320d759e8d4c090f92431959eRomain Guy case SkRegion::kIntersect_Op: 1528aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy clipped = clipRect->intersect(r); 1537fac2e18339f765320d759e8d4c090f92431959eRomain Guy break; 1547fac2e18339f765320d759e8d4c090f92431959eRomain Guy case SkRegion::kUnion_Op: 1558aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy clipped = clipRect->unionWith(r); 1567fac2e18339f765320d759e8d4c090f92431959eRomain Guy break; 1577fac2e18339f765320d759e8d4c090f92431959eRomain Guy case SkRegion::kXOR_Op: 1587fac2e18339f765320d759e8d4c090f92431959eRomain Guy break; 1597fac2e18339f765320d759e8d4c090f92431959eRomain Guy case SkRegion::kReverseDifference_Op: 1607fac2e18339f765320d759e8d4c090f92431959eRomain Guy break; 1617fac2e18339f765320d759e8d4c090f92431959eRomain Guy case SkRegion::kReplace_Op: 1628aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy clipRect->set(r); 1637fac2e18339f765320d759e8d4c090f92431959eRomain Guy clipped = true; 1647fac2e18339f765320d759e8d4c090f92431959eRomain Guy break; 1655cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 166079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy 167079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy if (clipped) { 16809147fbdc8206a0cac78bfe9083e7e15b3c5689cRomain Guy flags |= Snapshot::kFlagClipSet | Snapshot::kFlagDirtyLocalClip; 169079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy } 170079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy 1713d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy return clipped; 1725cbbce535744b89df5ecea95de21ee3733298260Romain Guy } 1735cbbce535744b89df5ecea95de21ee3733298260Romain Guy 1745cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 175d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy * Sets the current clip. 176d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy */ 177d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy void setClip(float left, float top, float right, float bottom) { 1788aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy clipRect->set(left, top, right, bottom); 17909147fbdc8206a0cac78bfe9083e7e15b3c5689cRomain Guy flags |= Snapshot::kFlagClipSet | Snapshot::kFlagDirtyLocalClip; 180079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy } 181079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy 182079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy const Rect& getLocalClip() { 18309147fbdc8206a0cac78bfe9083e7e15b3c5689cRomain Guy if (flags & Snapshot::kFlagDirtyLocalClip) { 18409147fbdc8206a0cac78bfe9083e7e15b3c5689cRomain Guy mat4 inverse; 1858aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy inverse.loadInverse(*transform); 186959c91f7f7b4f921d341264f5b4ef54e702a0df0Romain Guy 1878aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy mLocalClip.set(*clipRect); 1888aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy inverse.mapRect(mLocalClip); 189959c91f7f7b4f921d341264f5b4ef54e702a0df0Romain Guy 19009147fbdc8206a0cac78bfe9083e7e15b3c5689cRomain Guy flags &= ~Snapshot::kFlagDirtyLocalClip; 19109147fbdc8206a0cac78bfe9083e7e15b3c5689cRomain Guy } 1928aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy return mLocalClip; 193d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy } 194d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy 195eb99356a0548684a501766e6a524529ab93304c8Romain Guy void resetTransform(float x, float y, float z) { 196eb99356a0548684a501766e6a524529ab93304c8Romain Guy transform = &mTransformRoot; 197eb99356a0548684a501766e6a524529ab93304c8Romain Guy transform->loadTranslate(x, y, z); 198eb99356a0548684a501766e6a524529ab93304c8Romain Guy } 199eb99356a0548684a501766e6a524529ab93304c8Romain Guy 200eb99356a0548684a501766e6a524529ab93304c8Romain Guy void resetClip(float left, float top, float right, float bottom) { 201eb99356a0548684a501766e6a524529ab93304c8Romain Guy clipRect = &mClipRectRoot; 202eb99356a0548684a501766e6a524529ab93304c8Romain Guy clipRect->set(left, top, right, bottom); 203eb99356a0548684a501766e6a524529ab93304c8Romain Guy flags |= Snapshot::kFlagClipSet | Snapshot::kFlagDirtyLocalClip; 204eb99356a0548684a501766e6a524529ab93304c8Romain Guy } 205eb99356a0548684a501766e6a524529ab93304c8Romain Guy 206af636ebf5feb2837683fbfe965040cb706b32ec1Romain Guy bool isIgnored() const { 207af636ebf5feb2837683fbfe965040cb706b32ec1Romain Guy return invisible || empty; 208af636ebf5feb2837683fbfe965040cb706b32ec1Romain Guy } 209af636ebf5feb2837683fbfe965040cb706b32ec1Romain Guy 2108b55f377655d13a445b08a0a8ed09b6e95c752b0Romain Guy /** 2115cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Dirty flags. 2125cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 2135cbbce535744b89df5ecea95de21ee3733298260Romain Guy int flags; 2145cbbce535744b89df5ecea95de21ee3733298260Romain Guy 2155cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 2165cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Previous snapshot. 2175cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 2185cbbce535744b89df5ecea95de21ee3733298260Romain Guy sp<Snapshot> previous; 2195cbbce535744b89df5ecea95de21ee3733298260Romain Guy 2205cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 2215cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Only set when the flag kFlagIsLayer is set. 2225cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 223dda570201ac851dd85af3861f7e575721d3345daRomain Guy Layer* layer; 224f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640Romain Guy 2258aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy /** 226eb99356a0548684a501766e6a524529ab93304c8Romain Guy * Only set when the flag kFlagIsFboLayer is set. 227eb99356a0548684a501766e6a524529ab93304c8Romain Guy */ 228eb99356a0548684a501766e6a524529ab93304c8Romain Guy GLuint fbo; 229eb99356a0548684a501766e6a524529ab93304c8Romain Guy 230eb99356a0548684a501766e6a524529ab93304c8Romain Guy /** 231dbc26d2ba13f80a7590c57de2d80530d96832969Romain Guy * Indicates that this snapshot is invisible and nothing should be drawn 232af636ebf5feb2837683fbfe965040cb706b32ec1Romain Guy * inside it. This flag is set only when the layer clips drawing to its 233af636ebf5feb2837683fbfe965040cb706b32ec1Romain Guy * bounds and is passed to subsequent snapshots. 234dbc26d2ba13f80a7590c57de2d80530d96832969Romain Guy */ 235dbc26d2ba13f80a7590c57de2d80530d96832969Romain Guy bool invisible; 236dbc26d2ba13f80a7590c57de2d80530d96832969Romain Guy 237dbc26d2ba13f80a7590c57de2d80530d96832969Romain Guy /** 238af636ebf5feb2837683fbfe965040cb706b32ec1Romain Guy * If set to true, the layer will not be composited. This is similar to 239af636ebf5feb2837683fbfe965040cb706b32ec1Romain Guy * invisible but this flag is not passed to subsequent snapshots. 240af636ebf5feb2837683fbfe965040cb706b32ec1Romain Guy */ 241af636ebf5feb2837683fbfe965040cb706b32ec1Romain Guy bool empty; 242af636ebf5feb2837683fbfe965040cb706b32ec1Romain Guy 243af636ebf5feb2837683fbfe965040cb706b32ec1Romain Guy /** 244eb99356a0548684a501766e6a524529ab93304c8Romain Guy * Current viewport. 245eb99356a0548684a501766e6a524529ab93304c8Romain Guy */ 246eb99356a0548684a501766e6a524529ab93304c8Romain Guy Rect viewport; 247eb99356a0548684a501766e6a524529ab93304c8Romain Guy 248eb99356a0548684a501766e6a524529ab93304c8Romain Guy /** 249eb99356a0548684a501766e6a524529ab93304c8Romain Guy * Height of the framebuffer the snapshot is rendering into. 250eb99356a0548684a501766e6a524529ab93304c8Romain Guy */ 251eb99356a0548684a501766e6a524529ab93304c8Romain Guy int height; 252eb99356a0548684a501766e6a524529ab93304c8Romain Guy 253eb99356a0548684a501766e6a524529ab93304c8Romain Guy /** 254eb99356a0548684a501766e6a524529ab93304c8Romain Guy * Contains the previous ortho matrix. 255eb99356a0548684a501766e6a524529ab93304c8Romain Guy */ 256eb99356a0548684a501766e6a524529ab93304c8Romain Guy mat4 orthoMatrix; 257eb99356a0548684a501766e6a524529ab93304c8Romain Guy 258eb99356a0548684a501766e6a524529ab93304c8Romain Guy /** 2598aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy * Local transformation. Holds the current translation, scale and 2608aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy * rotation values. 2618aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy */ 2628aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy mat4* transform; 2638aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy 2648aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy /** 2658aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy * Current clip region. The clip is stored in canvas-space coordinates, 2668aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy * (screen-space coordinates in the regular case.) 2678aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy */ 2688aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy Rect* clipRect; 2698aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy 2705b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy /** 271f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy * The ancestor layer's dirty region. 2725b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 2735b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy Region* region; 2745b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 2755cbbce535744b89df5ecea95de21ee3733298260Romain Guyprivate: 2768aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy mat4 mTransformRoot; 2778aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy Rect mClipRectRoot; 2788aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy Rect mLocalClip; 279079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy 2805cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // class Snapshot 2815cbbce535744b89df5ecea95de21ee3733298260Romain Guy 2825cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace uirenderer 2835cbbce535744b89df5ecea95de21ee3733298260Romain Guy}; // namespace android 2845cbbce535744b89df5ecea95de21ee3733298260Romain Guy 2855b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_SNAPSHOT_H 286