Snapshot.h revision f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640
1932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/*
2932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Copyright (C) 2010 The Android Open Source Project
3932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *
4932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
5932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * you may not use this file except in compliance with the License.
6932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * You may obtain a copy of the License at
7932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *
8932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
9932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *
10932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Unless required by applicable law or agreed to in writing, software
11932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
12932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * See the License for the specific language governing permissions and
14932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * limitations under the License.
15932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */
16932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
17932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#ifndef ANDROID_UI_SNAPSHOT_H
18932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#define ANDROID_UI_SNAPSHOT_H
19932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
20932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <GLES2/gl2.h>
21932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <GLES2/gl2ext.h>
22932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
23932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <SkXfermode.h>
24932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
25932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <utils/RefBase.h>
26932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
27932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "Matrix.h"
28932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "Rect.h"
29932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
30932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace android {
31932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace uirenderer {
32932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
33932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/**
34932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * A snapshot holds information about the current state of the rendering
35932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * surface. A snapshot is usually created whenever the user calls save()
36932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * and discarded when the user calls restore(). Once a snapshot is created,
37932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * it can hold information for deferred rendering.
38932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *
39932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Each snapshot has a link to a previous snapshot, indicating the previous
40932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * state of the renderer.
41932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */
42932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesclass Snapshot: public LightRefBase<Snapshot> {
43932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinespublic:
44932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    Snapshot() {
45932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    }
46932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
47932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    /**
48932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Copies the specified snapshot. Only the transform and clip rectangle
49932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * are copied. The layer information is set to 0 and the transform is
50932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * assumed to be dirty. The specified snapshot is stored as the previous
51932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * snapshot.
52932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     */
53932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    Snapshot(const sp<Snapshot> s):
54932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            height(s->height),
55932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            transform(s->transform),
56932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            clipRect(s->clipRect),
57932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            flags(kFlagDirtyTransform),
58932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            previous(s),
59932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            layer(0.0f, 0.0f, 0.0f, 0.0f),
60932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            texture(0),
61932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            fbo(0),
62932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            alpha(255) {
63932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    }
64932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
65932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    /**
66932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Various flags set on #flags.
67932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     */
68932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    enum Flags {
69932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines        /**
70932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines         * Indicates that the clip region was modified. When this
71932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines         * snapshot is restored so must the clip.
72932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines         */
73932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines        kFlagClipSet = 0x1,
74932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines        /**
75932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines         * Indicates that the snapshot holds new transform
76932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines         * information.
77932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines         */
78932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines        kFlagDirtyTransform = 0x2,
79932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines        /**
80932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines         * Indicates that this snapshot was created when saving
81932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines         * a new layer.
82932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines         */
83932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines        kFlagIsLayer = 0x4,
84932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines        /**
85932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines         * Indicates that this snapshot has changed the ortho matrix.
86932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines         */
87932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines        kFlagDirtyOrtho = 0x8,
88932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    };
89932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
90932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    /**
91932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Returns the current clip region mapped by the current transform.
92932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     */
93932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    const Rect& getMappedClip() {
94932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines        if (flags & kFlagDirtyTransform) {
95932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            flags &= ~kFlagDirtyTransform;
96932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            mappedClip.set(clipRect);
97932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines            transform.mapRect(mappedClip);
98932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines        }
99932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines        return mappedClip;
100932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    }
101932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
102932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    /**
103932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Height of the framebuffer the snapshot is rendering into.
104932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     */
105932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    int height;
106932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
107932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    /**
108932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Local transformation. Holds the current translation, scale and
109932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * rotation values.
110932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     */
111932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    mat4 transform;
112932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
113932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    /**
114932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Current clip region.
115932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     */
116932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    Rect clipRect;
117932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
118932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    /**
119932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Dirty flags.
120932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     */
121932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    int flags;
122932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
123932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    /**
124932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Previous snapshot.
125932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     */
126932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    sp<Snapshot> previous;
127932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
128932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    /**
129932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Coordinates of the layer corresponding to this snapshot.
130932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Only set when the flag kFlagIsLayer is set.
131932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     */
132932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    Rect layer;
133932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    /**
134932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Name of the texture used to render the layer.
135932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Only set when the flag kFlagIsLayer is set.
136932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     */
137932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    GLuint texture;
138932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    /**
139932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Name of the FBO used to render the layer.
140932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Only set when the flag kFlagIsLayer is set.
141932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     */
142932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    GLuint fbo;
143932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    /**
144932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Opacity of the layer.
145932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Only set when the flag kFlagIsLayer is set.
146932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     */
147932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    float alpha;
148932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    /**
149932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Blending mode of the layer.
150932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Only set when the flag kFlagIsLayer is set.
151932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     */
152932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    SkXfermode::Mode mode;
153932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
154932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    /**
155932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     * Contains the previous ortho matrix.
156932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines     */
157932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    float orthoMatrix[16];
158932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
159932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesprivate:
160932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    // Clipping rectangle mapped with the transform
161932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    Rect mappedClip;
162932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}; // class Snapshot
163932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
164932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}; // namespace uirenderer
165932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}; // namespace android
166932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
167932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#endif // ANDROID_UI_SNAPSHOT_H
168932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines