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