StatefulBaseRenderer.h revision 139088228faa7f3c446af7387e017933998a5570
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    /**
51797b95b26bbb7557678af78b9a2a61830158920fChris Craik     * Initialize the first snapshot, computing the projection matrix, and stores the dimensions of
52797b95b26bbb7557678af78b9a2a61830158920fChris Craik     * the render target.
53a64a2bef1048db5a742843f1e3bea9e80d0defc5Chris Craik     */
54797b95b26bbb7557678af78b9a2a61830158920fChris Craik    virtual void setViewport(int width, int height);
55797b95b26bbb7557678af78b9a2a61830158920fChris Craik    virtual void initializeLight(const Vector3& lightCenter, float lightRadius);
5614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    void initializeSaveStack(float clipLeft, float clipTop, float clipRight, float clipBottom);
5714e513058ed4168c94e015638d16f5f87fd8063aChris Craik
5814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // getters
5914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    bool hasRectToRectTransform() const {
60d6b65f67717025b1162f86f04e2caa5723566cacChris Craik        return CC_LIKELY(currentTransform()->rectToRect());
6114e513058ed4168c94e015638d16f5f87fd8063aChris Craik    }
6214e513058ed4168c94e015638d16f5f87fd8063aChris Craik
6314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Save (layer)
6414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual int getSaveCount() const { return mSaveCount; }
6514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual int save(int flags);
6614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void restore();
6714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void restoreToCount(int saveCount);
6814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    //virtual int saveLayer(float left, float top, float right, float bottom,
6914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    //        int alpha, SkXfermode::Mode mode, int flags);
7014e513058ed4168c94e015638d16f5f87fd8063aChris Craik
7114e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Matrix
7214e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void getMatrix(SkMatrix* outMatrix) const;
7314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void translate(float dx, float dy, float dz = 0.0f);
7414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void rotate(float degrees);
7514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void scale(float sx, float sy);
7614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void skew(float sx, float sy);
7714e513058ed4168c94e015638d16f5f87fd8063aChris Craik
78139088228faa7f3c446af7387e017933998a5570Derek Sollenberger    virtual void setMatrix(const SkMatrix& matrix);
7914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    void setMatrix(const Matrix4& matrix); // internal only convenience method
80139088228faa7f3c446af7387e017933998a5570Derek Sollenberger    virtual void concatMatrix(const SkMatrix& matrix);
8114e513058ed4168c94e015638d16f5f87fd8063aChris Craik    void concatMatrix(const Matrix4& matrix); // internal only convenience method
8214e513058ed4168c94e015638d16f5f87fd8063aChris Craik
8314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Clip
843f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    virtual const Rect& getLocalClipBounds() const { return mSnapshot->getLocalClip(); }
853f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik
8614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual bool quickRejectConservative(float left, float top, float right, float bottom) const;
8714e513058ed4168c94e015638d16f5f87fd8063aChris Craik
88d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
89d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual bool clipPath(const SkPath* path, SkRegion::Op op);
90d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual bool clipRegion(const SkRegion* region, SkRegion::Op op);
9114e513058ed4168c94e015638d16f5f87fd8063aChris Craik
92deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    /**
93deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik     * Does not support different clipping Ops (that is, every call to setClippingOutline is
94deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik     * effectively using SkRegion::kReplaceOp)
95deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik     *
96deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik     * The clipping outline is independent from the regular clip.
97deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik     */
98deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    void setClippingOutline(LinearAllocator& allocator, const Outline* outline);
99deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
10014e513058ed4168c94e015638d16f5f87fd8063aChris Craikprotected:
1013f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    const Rect& getRenderTargetClipBounds() const { return mSnapshot->getRenderTargetClip(); }
1023f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik
10314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    int getWidth() { return mWidth; }
10414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    int getHeight() { return mHeight; }
10514e513058ed4168c94e015638d16f5f87fd8063aChris Craik
10614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Save
10714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    int saveSnapshot(int flags);
10814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    void restoreSnapshot();
10914e513058ed4168c94e015638d16f5f87fd8063aChris Craik
11014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // allows subclasses to control what value is stored in snapshot's fbo field in
11114e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // initializeSaveStack
11214e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual GLuint getTargetFbo() const {
11314e513058ed4168c94e015638d16f5f87fd8063aChris Craik        return -1;
11414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    }
11514e513058ed4168c94e015638d16f5f87fd8063aChris Craik
11614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Clip
11714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    bool calculateQuickRejectForScissor(float left, float top, float right, float bottom,
118deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik            bool* clipRequired, bool* roundRectClipRequired, bool snapOut) const;
11914e513058ed4168c94e015638d16f5f87fd8063aChris Craik
12014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    /**
12114e513058ed4168c94e015638d16f5f87fd8063aChris Craik     * Called just after a restore has occurred. The 'removed' snapshot popped from the stack,
12214e513058ed4168c94e015638d16f5f87fd8063aChris Craik     * 'restored' snapshot has become the top/current.
12314e513058ed4168c94e015638d16f5f87fd8063aChris Craik     *
12414e513058ed4168c94e015638d16f5f87fd8063aChris Craik     * Subclasses can override this method to handle layer restoration
12514e513058ed4168c94e015638d16f5f87fd8063aChris Craik     */
12614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) {};
12714e513058ed4168c94e015638d16f5f87fd8063aChris Craik
128797b95b26bbb7557678af78b9a2a61830158920fChris Craik    virtual void onViewportInitialized() {};
129797b95b26bbb7557678af78b9a2a61830158920fChris Craik
130d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    inline const Rect* currentClipRect() const {
131d6b65f67717025b1162f86f04e2caa5723566cacChris Craik        return mSnapshot->clipRect;
132d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    }
133d6b65f67717025b1162f86f04e2caa5723566cacChris Craik
134d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    inline const mat4* currentTransform() const {
135d6b65f67717025b1162f86f04e2caa5723566cacChris Craik        return mSnapshot->transform;
13614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    }
13714e513058ed4168c94e015638d16f5f87fd8063aChris Craik
138d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    inline const Snapshot* currentSnapshot() const {
139d6b65f67717025b1162f86f04e2caa5723566cacChris Craik        return mSnapshot != NULL ? mSnapshot.get() : mFirstSnapshot.get();
14014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    }
14114e513058ed4168c94e015638d16f5f87fd8063aChris Craik
142d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    inline const Snapshot* firstSnapshot() const {
143d6b65f67717025b1162f86f04e2caa5723566cacChris Craik        return mFirstSnapshot.get();
14414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    }
14514e513058ed4168c94e015638d16f5f87fd8063aChris Craik
146d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    // indicites that the clip has been changed since the last time it was consumed
147d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    bool mDirtyClip;
148d6b65f67717025b1162f86f04e2caa5723566cacChris Craik
149d6b65f67717025b1162f86f04e2caa5723566cacChris Craikprivate:
150d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    // Dimensions of the drawing surface
151d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    int mWidth, mHeight;
15214e513058ed4168c94e015638d16f5f87fd8063aChris Craik
15314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Number of saved states
15414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    int mSaveCount;
15514e513058ed4168c94e015638d16f5f87fd8063aChris Craik
15614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Base state
15714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    sp<Snapshot> mFirstSnapshot;
15814e513058ed4168c94e015638d16f5f87fd8063aChris Craik
159d6b65f67717025b1162f86f04e2caa5723566cacChris Craikprotected:
16014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Current state
161d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    // TODO: should become private, once hooks needed by OpenGLRenderer are added
16214e513058ed4168c94e015638d16f5f87fd8063aChris Craik    sp<Snapshot> mSnapshot;
16314e513058ed4168c94e015638d16f5f87fd8063aChris Craik
164797b95b26bbb7557678af78b9a2a61830158920fChris Craik    Vector3 mLightCenter;
165797b95b26bbb7557678af78b9a2a61830158920fChris Craik    float mLightRadius;
166797b95b26bbb7557678af78b9a2a61830158920fChris Craik
16714e513058ed4168c94e015638d16f5f87fd8063aChris Craik}; // class StatefulBaseRenderer
16814e513058ed4168c94e015638d16f5f87fd8063aChris Craik
16914e513058ed4168c94e015638d16f5f87fd8063aChris Craik}; // namespace uirenderer
17014e513058ed4168c94e015638d16f5f87fd8063aChris Craik}; // namespace android
17114e513058ed4168c94e015638d16f5f87fd8063aChris Craik
17214e513058ed4168c94e015638d16f5f87fd8063aChris Craik#endif // ANDROID_HWUI_STATEFUL_BASE_RENDERER_H
173