Snapshot.h revision f86ef57f8bcd8ba43ce222ec6a8b4f67d3600640
10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2010 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#ifndef ANDROID_UI_SNAPSHOT_H
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#define ANDROID_UI_SNAPSHOT_H
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <GLES2/gl2.h>
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <GLES2/gl2ext.h>
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <SkXfermode.h>
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <utils/RefBase.h>
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include "Matrix.h"
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include "Rect.h"
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillenamespace android {
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillenamespace uirenderer {
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * A snapshot holds information about the current state of the rendering
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * surface. A snapshot is usually created whenever the user calls save()
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * and discarded when the user calls restore(). Once a snapshot is created,
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * it can hold information for deferred rendering.
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Each snapshot has a link to a previous snapshot, indicating the previous
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * state of the renderer.
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleclass Snapshot: public LightRefBase<Snapshot> {
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic:
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Snapshot() {
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Copies the specified snapshot. Only the transform and clip rectangle
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * are copied. The layer information is set to 0 and the transform is
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * assumed to be dirty. The specified snapshot is stored as the previous
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * snapshot.
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Snapshot(const sp<Snapshot> s):
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            height(s->height),
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            transform(s->transform),
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            clipRect(s->clipRect),
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            flags(kFlagDirtyTransform),
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            previous(s),
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            layer(0.0f, 0.0f, 0.0f, 0.0f),
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            texture(0),
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            fbo(0),
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            alpha(255) {
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Various flags set on #flags.
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    enum Flags {
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /**
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * Indicates that the clip region was modified. When this
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * snapshot is restored so must the clip.
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         */
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        kFlagClipSet = 0x1,
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /**
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * Indicates that the snapshot holds new transform
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * information.
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         */
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        kFlagDirtyTransform = 0x2,
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /**
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * Indicates that this snapshot was created when saving
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * a new layer.
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         */
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        kFlagIsLayer = 0x4,
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /**
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * Indicates that this snapshot has changed the ortho matrix.
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         */
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        kFlagDirtyOrtho = 0x8,
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    };
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the current clip region mapped by the current transform.
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    const Rect& getMappedClip() {
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (flags & kFlagDirtyTransform) {
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            flags &= ~kFlagDirtyTransform;
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mappedClip.set(clipRect);
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            transform.mapRect(mappedClip);
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mappedClip;
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Height of the framebuffer the snapshot is rendering into.
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    int height;
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Local transformation. Holds the current translation, scale and
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * rotation values.
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    mat4 transform;
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Current clip region.
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Rect clipRect;
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Dirty flags.
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    int flags;
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Previous snapshot.
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    sp<Snapshot> previous;
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Coordinates of the layer corresponding to this snapshot.
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Only set when the flag kFlagIsLayer is set.
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Rect layer;
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Name of the texture used to render the layer.
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Only set when the flag kFlagIsLayer is set.
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    GLuint texture;
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Name of the FBO used to render the layer.
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Only set when the flag kFlagIsLayer is set.
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    GLuint fbo;
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Opacity of the layer.
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Only set when the flag kFlagIsLayer is set.
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    float alpha;
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Blending mode of the layer.
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Only set when the flag kFlagIsLayer is set.
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    SkXfermode::Mode mode;
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Contains the previous ortho matrix.
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    float orthoMatrix[16];
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleprivate:
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Clipping rectangle mapped with the transform
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Rect mappedClip;
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}; // class Snapshot
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}; // namespace uirenderer
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}; // namespace android
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#endif // ANDROID_UI_SNAPSHOT_H
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville