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