StatefulBaseRenderer.h revision 3f085429fd47ebd32ac2463b3eae2a5a6c17be25
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef ANDROID_HWUI_STATEFUL_BASE_RENDERER_H 18#define ANDROID_HWUI_STATEFUL_BASE_RENDERER_H 19 20#include <utils/RefBase.h> 21 22#include "Renderer.h" 23#include "Snapshot.h" 24 25namespace android { 26namespace uirenderer { 27 28/** 29 * Abstract Renderer subclass, which implements Canvas state methods. 30 * 31 * Manages the Snapshot stack, implementing matrix, save/restore, and clipping methods in the 32 * Renderer interface. Drawing and recording classes that extend StatefulBaseRenderer will have 33 * different use cases: 34 * 35 * Drawing subclasses (i.e. OpenGLRenderer) can query attributes (such as transform) or hook into 36 * changes (e.g. save/restore) with minimal surface area for manipulating the stack itself. 37 * 38 * Recording subclasses (i.e. DisplayListRenderer) can both record and pass through state operations 39 * to StatefulBaseRenderer, so that not only will querying operations work (getClip/Matrix), but so 40 * that quickRejection can also be used. 41 */ 42class StatefulBaseRenderer : public Renderer { 43public: 44 StatefulBaseRenderer(); 45 46 virtual status_t prepare(bool opaque) { 47 return prepareDirty(0.0f, 0.0f, mWidth, mHeight, opaque); 48 } 49 void initializeViewport(int width, int height); 50 void initializeSaveStack(float clipLeft, float clipTop, float clipRight, float clipBottom); 51 52 // getters 53 bool hasRectToRectTransform() const { 54 return CC_LIKELY(currentTransform()->rectToRect()); 55 } 56 57 // Save (layer) 58 virtual int getSaveCount() const { return mSaveCount; } 59 virtual int save(int flags); 60 virtual void restore(); 61 virtual void restoreToCount(int saveCount); 62 //virtual int saveLayer(float left, float top, float right, float bottom, 63 // int alpha, SkXfermode::Mode mode, int flags); 64 65 // Matrix 66 virtual void getMatrix(SkMatrix* outMatrix) const; 67 virtual void translate(float dx, float dy, float dz = 0.0f); 68 virtual void rotate(float degrees); 69 virtual void scale(float sx, float sy); 70 virtual void skew(float sx, float sy); 71 72 virtual void setMatrix(const SkMatrix* matrix); 73 void setMatrix(const Matrix4& matrix); // internal only convenience method 74 virtual void concatMatrix(const SkMatrix* matrix); 75 void concatMatrix(const Matrix4& matrix); // internal only convenience method 76 77 // Clip 78 virtual const Rect& getLocalClipBounds() const { return mSnapshot->getLocalClip(); } 79 80 virtual bool quickRejectConservative(float left, float top, float right, float bottom) const; 81 82 virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op); 83 virtual bool clipPath(const SkPath* path, SkRegion::Op op); 84 virtual bool clipRegion(const SkRegion* region, SkRegion::Op op); 85 86protected: 87 const Rect& getRenderTargetClipBounds() const { return mSnapshot->getRenderTargetClip(); } 88 89 int getWidth() { return mWidth; } 90 int getHeight() { return mHeight; } 91 92 // Save 93 int saveSnapshot(int flags); 94 void restoreSnapshot(); 95 96 // allows subclasses to control what value is stored in snapshot's fbo field in 97 // initializeSaveStack 98 virtual GLuint getTargetFbo() const { 99 return -1; 100 } 101 102 // Clip 103 bool calculateQuickRejectForScissor(float left, float top, float right, float bottom, 104 bool* clipRequired, bool snapOut) const; 105 106 /** 107 * Called just after a restore has occurred. The 'removed' snapshot popped from the stack, 108 * 'restored' snapshot has become the top/current. 109 * 110 * Subclasses can override this method to handle layer restoration 111 */ 112 virtual void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) {}; 113 114 inline const Rect* currentClipRect() const { 115 return mSnapshot->clipRect; 116 } 117 118 inline const mat4* currentTransform() const { 119 return mSnapshot->transform; 120 } 121 122 inline const Snapshot* currentSnapshot() const { 123 return mSnapshot != NULL ? mSnapshot.get() : mFirstSnapshot.get(); 124 } 125 126 inline const Snapshot* firstSnapshot() const { 127 return mFirstSnapshot.get(); 128 } 129 130 // indicites that the clip has been changed since the last time it was consumed 131 bool mDirtyClip; 132 133private: 134 // Dimensions of the drawing surface 135 int mWidth, mHeight; 136 137 // Number of saved states 138 int mSaveCount; 139 140 // Base state 141 sp<Snapshot> mFirstSnapshot; 142 143protected: 144 // Current state 145 // TODO: should become private, once hooks needed by OpenGLRenderer are added 146 sp<Snapshot> mSnapshot; 147 148}; // class StatefulBaseRenderer 149 150}; // namespace uirenderer 151}; // namespace android 152 153#endif // ANDROID_HWUI_STATEFUL_BASE_RENDERER_H 154