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 #ifndef DEFERREDLAYERUPDATE_H_
17 #define DEFERREDLAYERUPDATE_H_
18 
19 #include <cutils/compiler.h>
20 #include <gui/GLConsumer.h>
21 #include <SkColorFilter.h>
22 #include <SkMatrix.h>
23 #include <utils/StrongPointer.h>
24 
25 #include "Layer.h"
26 #include "Rect.h"
27 #include "RenderNode.h"
28 #include "renderthread/RenderThread.h"
29 
30 namespace android {
31 namespace uirenderer {
32 
33 // Container to hold the properties a layer should be set to at the start
34 // of a render pass
35 class DeferredLayerUpdater : public VirtualLightRefBase {
36 public:
37     // Note that DeferredLayerUpdater assumes it is taking ownership of the layer
38     // and will not call incrementRef on it as a result.
39     ANDROID_API DeferredLayerUpdater(renderthread::RenderThread& thread, Layer* layer);
40     ANDROID_API ~DeferredLayerUpdater();
41 
setSize(uint32_t width,uint32_t height)42     ANDROID_API bool setSize(uint32_t width, uint32_t height) {
43         if (mWidth != width || mHeight != height) {
44             mWidth = width;
45             mHeight = height;
46             return true;
47         }
48         return false;
49     }
50 
setBlend(bool blend)51     ANDROID_API bool setBlend(bool blend) {
52         if (blend != mBlend) {
53             mBlend = blend;
54             return true;
55         }
56         return false;
57     }
58 
setSurfaceTexture(const sp<GLConsumer> & texture,bool needsAttach)59     ANDROID_API void setSurfaceTexture(const sp<GLConsumer>& texture, bool needsAttach) {
60         if (texture.get() != mSurfaceTexture.get()) {
61             mNeedsGLContextAttach = needsAttach;
62             mSurfaceTexture = texture;
63         }
64     }
65 
updateTexImage()66     ANDROID_API void updateTexImage() {
67         mUpdateTexImage = true;
68     }
69 
setTransform(const SkMatrix * matrix)70     ANDROID_API void setTransform(const SkMatrix* matrix) {
71         delete mTransform;
72         mTransform = matrix ? new SkMatrix(*matrix) : 0;
73     }
74 
75     ANDROID_API void setPaint(const SkPaint* paint);
76 
77     ANDROID_API bool apply();
78 
backingLayer()79     Layer* backingLayer() {
80         return mLayer;
81     }
82 
83     ANDROID_API void detachSurfaceTexture();
84 
85 private:
86     // Generic properties
87     uint32_t mWidth;
88     uint32_t mHeight;
89     bool mBlend;
90     SkColorFilter* mColorFilter;
91     int mAlpha;
92     SkXfermode::Mode mMode;
93 
94     sp<GLConsumer> mSurfaceTexture;
95     SkMatrix* mTransform;
96     bool mNeedsGLContextAttach;
97     bool mUpdateTexImage;
98 
99     Layer* mLayer;
100     Caches& mCaches;
101     renderthread::RenderThread& mRenderThread;
102 
103     void doUpdateTexImage();
104 };
105 
106 } /* namespace uirenderer */
107 } /* namespace android */
108 
109 #endif /* DEFERREDLAYERUPDATE_H_ */
110