StatefulBaseRenderer.h revision 69e5adffb19135d51bde8e458f4907d7265f3e23
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);
5569e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik    void initializeSaveStack(float clipLeft, float clipTop, float clipRight, float clipBottom,
5669e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik            const Vector3& lightCenter);
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
7205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    void getMatrix(Matrix4* outMatrix) const;
7314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void getMatrix(SkMatrix* outMatrix) const;
7414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void translate(float dx, float dy, float dz = 0.0f);
7514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void rotate(float degrees);
7614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void scale(float sx, float sy);
7714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void skew(float sx, float sy);
7814e513058ed4168c94e015638d16f5f87fd8063aChris Craik
79139088228faa7f3c446af7387e017933998a5570Derek Sollenberger    virtual void setMatrix(const SkMatrix& matrix);
8014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    void setMatrix(const Matrix4& matrix); // internal only convenience method
81139088228faa7f3c446af7387e017933998a5570Derek Sollenberger    virtual void concatMatrix(const SkMatrix& matrix);
8214e513058ed4168c94e015638d16f5f87fd8063aChris Craik    void concatMatrix(const Matrix4& matrix); // internal only convenience method
8314e513058ed4168c94e015638d16f5f87fd8063aChris Craik
8414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Clip
853f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    virtual const Rect& getLocalClipBounds() const { return mSnapshot->getLocalClip(); }
863f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik
8714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual bool quickRejectConservative(float left, float top, float right, float bottom) const;
8814e513058ed4168c94e015638d16f5f87fd8063aChris Craik
89d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
90d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual bool clipPath(const SkPath* path, SkRegion::Op op);
91d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual bool clipRegion(const SkRegion* region, SkRegion::Op op);
9214e513058ed4168c94e015638d16f5f87fd8063aChris Craik
93deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    /**
94deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik     * Does not support different clipping Ops (that is, every call to setClippingOutline is
95deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik     * effectively using SkRegion::kReplaceOp)
96deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik     *
97deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik     * The clipping outline is independent from the regular clip.
98deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik     */
99deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik    void setClippingOutline(LinearAllocator& allocator, const Outline* outline);
100af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik    void setClippingRoundRect(LinearAllocator& allocator,
101af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik            const Rect& rect, float radius);
102deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik
10314e513058ed4168c94e015638d16f5f87fd8063aChris Craikprotected:
1043f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik    const Rect& getRenderTargetClipBounds() const { return mSnapshot->getRenderTargetClip(); }
1053f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik
10614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    int getWidth() { return mWidth; }
10714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    int getHeight() { return mHeight; }
10814e513058ed4168c94e015638d16f5f87fd8063aChris Craik
10914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Save
11014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    int saveSnapshot(int flags);
11114e513058ed4168c94e015638d16f5f87fd8063aChris Craik    void restoreSnapshot();
11214e513058ed4168c94e015638d16f5f87fd8063aChris Craik
11314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // allows subclasses to control what value is stored in snapshot's fbo field in
11414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // initializeSaveStack
11514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual GLuint getTargetFbo() const {
11614e513058ed4168c94e015638d16f5f87fd8063aChris Craik        return -1;
11714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    }
11814e513058ed4168c94e015638d16f5f87fd8063aChris Craik
11914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Clip
12014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    bool calculateQuickRejectForScissor(float left, float top, float right, float bottom,
121deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik            bool* clipRequired, bool* roundRectClipRequired, bool snapOut) const;
12214e513058ed4168c94e015638d16f5f87fd8063aChris Craik
12314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    /**
12414e513058ed4168c94e015638d16f5f87fd8063aChris Craik     * Called just after a restore has occurred. The 'removed' snapshot popped from the stack,
12514e513058ed4168c94e015638d16f5f87fd8063aChris Craik     * 'restored' snapshot has become the top/current.
12614e513058ed4168c94e015638d16f5f87fd8063aChris Craik     *
12714e513058ed4168c94e015638d16f5f87fd8063aChris Craik     * Subclasses can override this method to handle layer restoration
12814e513058ed4168c94e015638d16f5f87fd8063aChris Craik     */
12914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) {};
13014e513058ed4168c94e015638d16f5f87fd8063aChris Craik
131797b95b26bbb7557678af78b9a2a61830158920fChris Craik    virtual void onViewportInitialized() {};
132797b95b26bbb7557678af78b9a2a61830158920fChris Craik
133d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    inline const Rect* currentClipRect() const {
134d6b65f67717025b1162f86f04e2caa5723566cacChris Craik        return mSnapshot->clipRect;
135d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    }
136d6b65f67717025b1162f86f04e2caa5723566cacChris Craik
137d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    inline const mat4* currentTransform() const {
138d6b65f67717025b1162f86f04e2caa5723566cacChris Craik        return mSnapshot->transform;
13914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    }
14014e513058ed4168c94e015638d16f5f87fd8063aChris Craik
141d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    inline const Snapshot* currentSnapshot() const {
142d6b65f67717025b1162f86f04e2caa5723566cacChris Craik        return mSnapshot != NULL ? mSnapshot.get() : mFirstSnapshot.get();
14314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    }
14414e513058ed4168c94e015638d16f5f87fd8063aChris Craik
145d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    inline const Snapshot* firstSnapshot() const {
146d6b65f67717025b1162f86f04e2caa5723566cacChris Craik        return mFirstSnapshot.get();
14714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    }
14814e513058ed4168c94e015638d16f5f87fd8063aChris Craik
149d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    // indicites that the clip has been changed since the last time it was consumed
150d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    bool mDirtyClip;
151d6b65f67717025b1162f86f04e2caa5723566cacChris Craik
152d6b65f67717025b1162f86f04e2caa5723566cacChris Craikprivate:
153d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    // Dimensions of the drawing surface
154d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    int mWidth, mHeight;
15514e513058ed4168c94e015638d16f5f87fd8063aChris Craik
15614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Number of saved states
15714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    int mSaveCount;
15814e513058ed4168c94e015638d16f5f87fd8063aChris Craik
15914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Base state
16014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    sp<Snapshot> mFirstSnapshot;
16114e513058ed4168c94e015638d16f5f87fd8063aChris Craik
162d6b65f67717025b1162f86f04e2caa5723566cacChris Craikprotected:
16314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Current state
164d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    // TODO: should become private, once hooks needed by OpenGLRenderer are added
16514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    sp<Snapshot> mSnapshot;
16614e513058ed4168c94e015638d16f5f87fd8063aChris Craik}; // class StatefulBaseRenderer
16714e513058ed4168c94e015638d16f5f87fd8063aChris Craik
16814e513058ed4168c94e015638d16f5f87fd8063aChris Craik}; // namespace uirenderer
16914e513058ed4168c94e015638d16f5f87fd8063aChris Craik}; // namespace android
17014e513058ed4168c94e015638d16f5f87fd8063aChris Craik
17114e513058ed4168c94e015638d16f5f87fd8063aChris Craik#endif // ANDROID_HWUI_STATEFUL_BASE_RENDERER_H
172