Snapshot.h revision 5e00c7ce063116c11315639f0035aca8ad73e8cc
13a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License.
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License.
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#pragma once
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <GLES2/gl2.h>
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <GLES2/gl2ext.h>
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/LinearAllocator.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/RefBase.h>
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <ui/Region.h>
257562408b2261d38415453378b6188f74fda99d88Mathias Agopian
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <SkRegion.h>
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "ClipArea.h"
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "Layer.h"
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "Matrix.h"
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "Outline.h"
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "Rect.h"
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "utils/Macros.h"
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
355876f2f28f31c1bd99864ba3bb1590e3d6765018Glenn Kastennamespace android {
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace uirenderer {
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/**
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Temporary structure holding information for a single outline clip.
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * These structures are treated as immutable once created, and only exist for a single frame, which
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * is why they may only be allocated with a LinearAllocator.
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass RoundRectClipState {
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static void* operator new(size_t size) = delete;
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    static void* operator new(size_t size, LinearAllocator& allocator) {
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return allocator.alloc<RoundRectClipState>(size);
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
50c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    bool areaRequiresRoundRectClip(const Rect& rect) const {
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return rect.intersects(dangerRects[0])
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                || rect.intersects(dangerRects[1])
54c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                || rect.intersects(dangerRects[2])
55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                || rect.intersects(dangerRects[3]);
56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    bool highPriority;
59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    Matrix4 matrix;
60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    Rect dangerRects[4];
61f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    Rect innerRect;
62342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    float radius;
6305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent};
64be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
65be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent/**
663a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen * A snapshot holds information about the current state of the rendering
673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen * surface. A snapshot is usually created whenever the user calls save()
68be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent * and discarded when the user calls restore(). Once a snapshot is created,
69ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent * it can hold information for deferred rendering.
70be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *
71de070137f11d346fba77605bd76a44c040a618fcEric Laurent * Each snapshot has a link to a previous snapshot, indicating the previous
72a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent * state of the renderer.
73cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten */
74cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kastenclass Snapshot {
75cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kastenpublic:
764182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Snapshot();
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Snapshot(Snapshot* s, int saveFlags);
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /**
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Various flags set on ::flags.
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    enum Flags {
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        /**
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project         * Indicates that the clip region was modified. When this
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project         * snapshot is restored so must the clip.
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project         */
88fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        kFlagClipSet = 0x1,
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        /**
9058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten         * Indicates that this snapshot was created when saving
91dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten         * a new layer.
92e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten         */
93e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten        kFlagIsLayer = 0x2,
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        /**
9572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten         * Indicates that this snapshot is a special type of layer
963acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten         * backed by an FBO. This flag only makes sense when the
97be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent         * flag kFlagIsLayer is also set.
98d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten         *
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project         * Viewport has been modified to fit the new Fbo, and must be
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project         * restored when this snapshot is restored.
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project         */
1025841db78dff14898538200287d246577b1fc37e2Eric Laurent        kFlagIsFboLayer = 0x4,
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    };
104fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /**
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Modifies the current clip with the new clip rectangle and
1070d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi     * the specified operation. The specified rectangle is transformed
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * by this snapshot's trasnformation.
109b26e3e9f2ab0334bff21a4fa4851dbf6e57fba5dGlenn Kasten     */
110e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten    void clip(const Rect& localClip, SkRegion::Op op);
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    /**
1133acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten     * Modifies the current clip with the new clip rectangle and
114be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     * the specified operation. The specified rectangle is considered
115be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     * already transformed.
116be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     */
117be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    void clipTransformed(const Rect& r, SkRegion::Op op = SkRegion::kIntersect_Op);
118be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /**
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Modifies the current clip with the specified region and operation.
12129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block     * The specified region is considered already transformed.
1225841db78dff14898538200287d246577b1fc37e2Eric Laurent     */
123e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten    void clipRegionTransformed(const SkRegion& region, SkRegion::Op op);
124e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten
125e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten    /**
126e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten     * Modifies the current clip with the specified path and operation.
127be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     */
128be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    void clipPath(const SkPath& path, SkRegion::Op op);
129be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
130be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    /**
131d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten     * Sets the current clip.
1325841db78dff14898538200287d246577b1fc37e2Eric Laurent     */
1335841db78dff14898538200287d246577b1fc37e2Eric Laurent    void setClip(float left, float top, float right, float bottom);
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
135507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten    /**
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Returns the current clip in local coordinates. The clip rect is
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * transformed by the inverse transform matrix.
1385841db78dff14898538200287d246577b1fc37e2Eric Laurent     */
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    ANDROID_API const Rect& getLocalClip();
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /**
14272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten     * Returns the current clip in render target coordinates.
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
14458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten    const Rect& getRenderTargetClip() const { return mClipArea->getClipRect(); }
14528b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten
146e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten    /*
147eeca32671896739e84050da5992d5f151a1629deGlenn Kasten     * Accessor functions so that the clip area can stay private
1481879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten     */
149be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    bool clipIsEmpty() const { return mClipArea->isEmpty(); }
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    const SkRegion& getClipRegion() const { return mClipArea->getClipRegion(); }
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    bool clipIsSimple() const { return mClipArea->isSimple(); }
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    const ClipArea& getClipArea() const { return *mClipArea; }
1535841db78dff14898538200287d246577b1fc37e2Eric Laurent    ClipArea& mutateClipArea() { return *mClipArea; }
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    WARN_UNUSED_RESULT const ClipBase* serializeIntersectedClip(LinearAllocator& allocator,
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            const ClipBase* recordedClip, const Matrix4& recordedClipTransform);
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void applyClip(const ClipBase* clip, const Matrix4& transform);
1580d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /**
160eeca32671896739e84050da5992d5f151a1629deGlenn Kasten     * Resets the clip to the specified rect.
161eeca32671896739e84050da5992d5f151a1629deGlenn Kasten     */
1621879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten    void resetClip(float left, float top, float right, float bottom);
163be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
164be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    void initializeViewport(int width, int height) {
165be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        mViewportData.initialize(width, height);
166be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        mClipAreaRoot.setViewportDimensions(width, height);
167be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
1685841db78dff14898538200287d246577b1fc37e2Eric Laurent
1695841db78dff14898538200287d246577b1fc37e2Eric Laurent    int getViewportWidth() const { return mViewportData.mWidth; }
17029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block    int getViewportHeight() const { return mViewportData.mHeight; }
1715841db78dff14898538200287d246577b1fc37e2Eric Laurent    const Matrix4& getOrthoMatrix() const { return mViewportData.mOrthoMatrix; }
172eeca32671896739e84050da5992d5f151a1629deGlenn Kasten
173eeca32671896739e84050da5992d5f151a1629deGlenn Kasten    const Vector3& getRelativeLightCenter() const { return mRelativeLightCenter; }
174eeca32671896739e84050da5992d5f151a1629deGlenn Kasten    void setRelativeLightCenter(const Vector3& lightCenter) { mRelativeLightCenter = lightCenter; }
175eeca32671896739e84050da5992d5f151a1629deGlenn Kasten
176be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    /**
177be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     * Sets (and replaces) the current clipping outline
178be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     *
179be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent     * If the current round rect clip is high priority, the incoming clip is ignored.
1805841db78dff14898538200287d246577b1fc37e2Eric Laurent     */
1815841db78dff14898538200287d246577b1fc37e2Eric Laurent    void setClippingRoundRect(LinearAllocator& allocator, const Rect& bounds,
1825841db78dff14898538200287d246577b1fc37e2Eric Laurent            float radius, bool highPriority);
183507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /**
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Sets (and replaces) the current projection mask
1865841db78dff14898538200287d246577b1fc37e2Eric Laurent     */
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void setProjectionPathMask(const SkPath* path);
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
18972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    /**
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Indicates whether the current transform has perspective components.
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    bool hasPerspectiveTransform() const;
19372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /**
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Dirty flags.
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    int flags;
19872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /**
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Previous snapshot.
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
20272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    Snapshot* previous;
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten    /**
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * A pointer to the currently active layer.
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
20772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten     * This snapshot does not own the layer, this pointer must not be freed.
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Layer* layer;
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    /**
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Target FBO used for rendering. Set to 0 when rendering directly
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * into the framebuffer.
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GLuint fbo;
21672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /**
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Local transformation. Holds the current translation, scale and
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * rotation values.
22072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten     *
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * This is a reference to a matrix owned by this snapshot or another
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *  snapshot. This pointer must not be freed. See ::mTransformRoot.
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mat4* transform;
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /**
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Current alpha value. This value is 1 by default, but may be set by a DisplayList which
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * has translucent rendering in a non-overlapping View. This value will be used by
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * the renderer to set the alpha in the current color being used for ensuing drawing
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * operations. The value is inherited by child snapshots because the same value should
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * be applied to descendants of the current DisplayList (for example, a TextView contains
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * the base alpha value which should be applied to the child DisplayLists used for drawing
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * the actual text).
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    float alpha;
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /**
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Current clipping round rect.
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     *
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Points to data not owned by the snapshot, and may only be replaced by subsequent RR clips,
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * never modified.
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    const RoundRectClipState* roundRectClipState;
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /**
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Current projection masking path - used exclusively to mask projected, tessellated circles.
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    const SkPath* projectionPathMask;
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void dump() const;
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectprivate:
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    struct ViewportData {
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        ViewportData() : mWidth(0), mHeight(0) {}
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        void initialize(int width, int height) {
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mWidth = width;
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mHeight = height;
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
25972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        }
26072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        /*
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project         * Width and height of current viewport.
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project         *
264fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten         * The viewport is always defined to be (0, 0, width, height).
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project         */
26672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        int mWidth;
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        int mHeight;
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        /**
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project         * Contains the current orthographic, projection matrix.
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project         */
271fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        mat4 mOrthoMatrix;
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    };
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mat4 mTransformRoot;
275fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    ClipArea mClipAreaRoot;
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    ClipArea* mClipArea;
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Rect mLocalClip;
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    ViewportData mViewportData;
28172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    Vector3 mRelativeLightCenter;
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // class Snapshot
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
285fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten}; // namespace uirenderer
28672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten}; // namespace android
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project