StatefulBaseRenderer.h revision a64a2bef1048db5a742843f1e3bea9e80d0defc5
114e513058ed4168c94e015638d16f5f87fd8063aChris Craik/*
214e513058ed4168c94e015638d16f5f87fd8063aChris Craik * Copyright (C) 2014 The Android Open Source Project
314e513058ed4168c94e015638d16f5f87fd8063aChris Craik *
414e513058ed4168c94e015638d16f5f87fd8063aChris Craik * Licensed under the Apache License, Version 2.0 (the "License");
514e513058ed4168c94e015638d16f5f87fd8063aChris Craik * you may not use this file except in compliance with the License.
614e513058ed4168c94e015638d16f5f87fd8063aChris Craik * You may obtain a copy of the License at
714e513058ed4168c94e015638d16f5f87fd8063aChris Craik *
814e513058ed4168c94e015638d16f5f87fd8063aChris Craik *      http://www.apache.org/licenses/LICENSE-2.0
914e513058ed4168c94e015638d16f5f87fd8063aChris Craik *
1014e513058ed4168c94e015638d16f5f87fd8063aChris Craik * Unless required by applicable law or agreed to in writing, software
1114e513058ed4168c94e015638d16f5f87fd8063aChris Craik * distributed under the License is distributed on an "AS IS" BASIS,
1214e513058ed4168c94e015638d16f5f87fd8063aChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1314e513058ed4168c94e015638d16f5f87fd8063aChris Craik * See the License for the specific language governing permissions and
1414e513058ed4168c94e015638d16f5f87fd8063aChris Craik * limitations under the License.
1514e513058ed4168c94e015638d16f5f87fd8063aChris Craik */
1614e513058ed4168c94e015638d16f5f87fd8063aChris Craik
1714e513058ed4168c94e015638d16f5f87fd8063aChris Craik#ifndef ANDROID_HWUI_STATEFUL_BASE_RENDERER_H
1814e513058ed4168c94e015638d16f5f87fd8063aChris Craik#define ANDROID_HWUI_STATEFUL_BASE_RENDERER_H
1914e513058ed4168c94e015638d16f5f87fd8063aChris Craik
2014e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include <utils/RefBase.h>
2114e513058ed4168c94e015638d16f5f87fd8063aChris Craik
2214e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include "Renderer.h"
2314e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include "Snapshot.h"
2414e513058ed4168c94e015638d16f5f87fd8063aChris Craik
2514e513058ed4168c94e015638d16f5f87fd8063aChris Craiknamespace android {
2614e513058ed4168c94e015638d16f5f87fd8063aChris Craiknamespace uirenderer {
2714e513058ed4168c94e015638d16f5f87fd8063aChris Craik
2814e513058ed4168c94e015638d16f5f87fd8063aChris Craik/**
29d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * Abstract Renderer subclass, which implements Canvas state methods.
3014e513058ed4168c94e015638d16f5f87fd8063aChris Craik *
31d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * Manages the Snapshot stack, implementing matrix, save/restore, and clipping methods in the
32d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * Renderer interface. Drawing and recording classes that extend StatefulBaseRenderer will have
33d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * different use cases:
34d6b65f67717025b1162f86f04e2caa5723566cacChris Craik *
35d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * Drawing subclasses (i.e. OpenGLRenderer) can query attributes (such as transform) or hook into
36d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * changes (e.g. save/restore) with minimal surface area for manipulating the stack itself.
37d6b65f67717025b1162f86f04e2caa5723566cacChris Craik *
38d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * Recording subclasses (i.e. DisplayListRenderer) can both record and pass through state operations
39d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * to StatefulBaseRenderer, so that not only will querying operations work (getClip/Matrix), but so
40d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * that quickRejection can also be used.
4114e513058ed4168c94e015638d16f5f87fd8063aChris Craik */
4214e513058ed4168c94e015638d16f5f87fd8063aChris Craikclass StatefulBaseRenderer : public Renderer {
4314e513058ed4168c94e015638d16f5f87fd8063aChris Craikpublic:
4414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer();
4514e513058ed4168c94e015638d16f5f87fd8063aChris Craik
4614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual status_t prepare(bool opaque) {
4714e513058ed4168c94e015638d16f5f87fd8063aChris Craik        return prepareDirty(0.0f, 0.0f, mWidth, mHeight, opaque);
4814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    }
49a64a2bef1048db5a742843f1e3bea9e80d0defc5Chris Craik
50a64a2bef1048db5a742843f1e3bea9e80d0defc5Chris Craik    /**
51a64a2bef1048db5a742843f1e3bea9e80d0defc5Chris Craik     * Initialize the first snapshot, computing the projection matrix,
52a64a2bef1048db5a742843f1e3bea9e80d0defc5Chris Craik     * and stores the dimensions of the render target.
53a64a2bef1048db5a742843f1e3bea9e80d0defc5Chris Craik     */
5414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    void initializeViewport(int width, int height);
5514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    void initializeSaveStack(float clipLeft, float clipTop, float clipRight, float clipBottom);
5614e513058ed4168c94e015638d16f5f87fd8063aChris Craik
5714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // getters
5814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    bool hasRectToRectTransform() const {
59d6b65f67717025b1162f86f04e2caa5723566cacChris Craik        return CC_LIKELY(currentTransform()->rectToRect());
6014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    }
6114e513058ed4168c94e015638d16f5f87fd8063aChris Craik
6214e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Save (layer)
6314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual int getSaveCount() const { return mSaveCount; }
6414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual int save(int flags);
6514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void restore();
6614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void restoreToCount(int saveCount);
6714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    //virtual int saveLayer(float left, float top, float right, float bottom,
6814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    //        int alpha, SkXfermode::Mode mode, int flags);
6914e513058ed4168c94e015638d16f5f87fd8063aChris Craik
7014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Matrix
7114e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void getMatrix(SkMatrix* outMatrix) const;
7214e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void translate(float dx, float dy, float dz = 0.0f);
7314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void rotate(float degrees);
7414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void scale(float sx, float sy);
7514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void skew(float sx, float sy);
7614e513058ed4168c94e015638d16f5f87fd8063aChris Craik
77d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual void setMatrix(const SkMatrix* matrix);
7814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    void setMatrix(const Matrix4& matrix); // internal only convenience method
79d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual void concatMatrix(const SkMatrix* matrix);
8014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    void concatMatrix(const Matrix4& matrix); // internal only convenience method
8114e513058ed4168c94e015638d16f5f87fd8063aChris Craik
8214e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Clip
833f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    virtual const Rect& getLocalClipBounds() const { return mSnapshot->getLocalClip(); }
843f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik
8514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual bool quickRejectConservative(float left, float top, float right, float bottom) const;
8614e513058ed4168c94e015638d16f5f87fd8063aChris Craik
87d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
88d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual bool clipPath(const SkPath* path, SkRegion::Op op);
89d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual bool clipRegion(const SkRegion* region, SkRegion::Op op);
9014e513058ed4168c94e015638d16f5f87fd8063aChris Craik
9114e513058ed4168c94e015638d16f5f87fd8063aChris Craikprotected:
923f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    const Rect& getRenderTargetClipBounds() const { return mSnapshot->getRenderTargetClip(); }
933f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik
9414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    int getWidth() { return mWidth; }
9514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    int getHeight() { return mHeight; }
9614e513058ed4168c94e015638d16f5f87fd8063aChris Craik
9714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Save
9814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    int saveSnapshot(int flags);
9914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    void restoreSnapshot();
10014e513058ed4168c94e015638d16f5f87fd8063aChris Craik
10114e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // allows subclasses to control what value is stored in snapshot's fbo field in
10214e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // initializeSaveStack
10314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual GLuint getTargetFbo() const {
10414e513058ed4168c94e015638d16f5f87fd8063aChris Craik        return -1;
10514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    }
10614e513058ed4168c94e015638d16f5f87fd8063aChris Craik
10714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Clip
10814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    bool calculateQuickRejectForScissor(float left, float top, float right, float bottom,
10914e513058ed4168c94e015638d16f5f87fd8063aChris Craik            bool* clipRequired, bool snapOut) const;
11014e513058ed4168c94e015638d16f5f87fd8063aChris Craik
11114e513058ed4168c94e015638d16f5f87fd8063aChris Craik    /**
11214e513058ed4168c94e015638d16f5f87fd8063aChris Craik     * Called just after a restore has occurred. The 'removed' snapshot popped from the stack,
11314e513058ed4168c94e015638d16f5f87fd8063aChris Craik     * 'restored' snapshot has become the top/current.
11414e513058ed4168c94e015638d16f5f87fd8063aChris Craik     *
11514e513058ed4168c94e015638d16f5f87fd8063aChris Craik     * Subclasses can override this method to handle layer restoration
11614e513058ed4168c94e015638d16f5f87fd8063aChris Craik     */
11714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) {};
11814e513058ed4168c94e015638d16f5f87fd8063aChris Craik
119d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    inline const Rect* currentClipRect() const {
120d6b65f67717025b1162f86f04e2caa5723566cacChris Craik        return mSnapshot->clipRect;
121d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    }
122d6b65f67717025b1162f86f04e2caa5723566cacChris Craik
123d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    inline const mat4* currentTransform() const {
124d6b65f67717025b1162f86f04e2caa5723566cacChris Craik        return mSnapshot->transform;
12514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    }
12614e513058ed4168c94e015638d16f5f87fd8063aChris Craik
127d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    inline const Snapshot* currentSnapshot() const {
128d6b65f67717025b1162f86f04e2caa5723566cacChris Craik        return mSnapshot != NULL ? mSnapshot.get() : mFirstSnapshot.get();
12914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    }
13014e513058ed4168c94e015638d16f5f87fd8063aChris Craik
131d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    inline const Snapshot* firstSnapshot() const {
132d6b65f67717025b1162f86f04e2caa5723566cacChris Craik        return mFirstSnapshot.get();
13314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    }
13414e513058ed4168c94e015638d16f5f87fd8063aChris Craik
135d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    // indicites that the clip has been changed since the last time it was consumed
136d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    bool mDirtyClip;
137d6b65f67717025b1162f86f04e2caa5723566cacChris Craik
138d6b65f67717025b1162f86f04e2caa5723566cacChris Craikprivate:
139d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    // Dimensions of the drawing surface
140d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    int mWidth, mHeight;
14114e513058ed4168c94e015638d16f5f87fd8063aChris Craik
14214e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Number of saved states
14314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    int mSaveCount;
14414e513058ed4168c94e015638d16f5f87fd8063aChris Craik
14514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Base state
14614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    sp<Snapshot> mFirstSnapshot;
14714e513058ed4168c94e015638d16f5f87fd8063aChris Craik
148d6b65f67717025b1162f86f04e2caa5723566cacChris Craikprotected:
14914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Current state
150d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    // TODO: should become private, once hooks needed by OpenGLRenderer are added
15114e513058ed4168c94e015638d16f5f87fd8063aChris Craik    sp<Snapshot> mSnapshot;
15214e513058ed4168c94e015638d16f5f87fd8063aChris Craik
15314e513058ed4168c94e015638d16f5f87fd8063aChris Craik}; // class StatefulBaseRenderer
15414e513058ed4168c94e015638d16f5f87fd8063aChris Craik
15514e513058ed4168c94e015638d16f5f87fd8063aChris Craik}; // namespace uirenderer
15614e513058ed4168c94e015638d16f5f87fd8063aChris Craik}; // namespace android
15714e513058ed4168c94e015638d16f5f87fd8063aChris Craik
15814e513058ed4168c94e015638d16f5f87fd8063aChris Craik#endif // ANDROID_HWUI_STATEFUL_BASE_RENDERER_H
159