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 #pragma once
18 
19 #include <SkColorFilter.h>
20 #include <SkImage.h>
21 #include <SkMatrix.h>
22 #include <cutils/compiler.h>
23 #include <map>
24 #include <system/graphics.h>
25 #include <utils/StrongPointer.h>
26 
27 #include <GLES2/gl2.h>
28 #include <GLES2/gl2ext.h>
29 
30 #include "renderstate/RenderState.h"
31 #include "surfacetexture/SurfaceTexture.h"
32 #include "Layer.h"
33 #include "Rect.h"
34 
35 namespace android {
36 namespace uirenderer {
37 
38 class RenderState;
39 
40 // Container to hold the properties a layer should be set to at the start
41 // of a render pass
42 class DeferredLayerUpdater : public VirtualLightRefBase, public IGpuContextCallback {
43 public:
44     // Note that DeferredLayerUpdater assumes it is taking ownership of the layer
45     // and will not call incrementRef on it as a result.
46     ANDROID_API explicit DeferredLayerUpdater(RenderState& renderState);
47 
48     ANDROID_API ~DeferredLayerUpdater();
49 
setSize(int width,int height)50     ANDROID_API bool setSize(int width, int height) {
51         if (mWidth != width || mHeight != height) {
52             mWidth = width;
53             mHeight = height;
54             return true;
55         }
56         return false;
57     }
58 
getWidth()59     int getWidth() { return mWidth; }
getHeight()60     int getHeight() { return mHeight; }
61 
setBlend(bool blend)62     ANDROID_API bool setBlend(bool blend) {
63         if (blend != mBlend) {
64             mBlend = blend;
65             return true;
66         }
67         return false;
68     }
69 
setSurfaceTexture(const sp<SurfaceTexture> & consumer)70     ANDROID_API void setSurfaceTexture(const sp<SurfaceTexture>& consumer) {
71         if (consumer.get() != mSurfaceTexture.get()) {
72             mSurfaceTexture = consumer;
73 
74             GLenum target = consumer->getCurrentTextureTarget();
75             LOG_ALWAYS_FATAL_IF(target != GL_TEXTURE_2D && target != GL_TEXTURE_EXTERNAL_OES,
76                                 "set unsupported SurfaceTexture with target %x", target);
77         }
78     }
79 
updateTexImage()80     ANDROID_API void updateTexImage() { mUpdateTexImage = true; }
81 
setTransform(const SkMatrix * matrix)82     ANDROID_API void setTransform(const SkMatrix* matrix) {
83         delete mTransform;
84         mTransform = matrix ? new SkMatrix(*matrix) : nullptr;
85     }
86 
getTransform()87     SkMatrix* getTransform() { return mTransform; }
88 
89     ANDROID_API void setPaint(const SkPaint* paint);
90 
91     void apply();
92 
backingLayer()93     Layer* backingLayer() { return mLayer; }
94 
95     void detachSurfaceTexture();
96 
97     void updateLayer(bool forceFilter, const SkMatrix& textureTransform,
98                      const sk_sp<SkImage>& layerImage);
99 
100     void destroyLayer();
101 
102 protected:
103     void onContextDestroyed() override;
104 
105 private:
106     RenderState& mRenderState;
107 
108     // Generic properties
109     int mWidth = 0;
110     int mHeight = 0;
111     bool mBlend = false;
112     sk_sp<SkColorFilter> mColorFilter;
113     int mAlpha = 255;
114     SkBlendMode mMode = SkBlendMode::kSrcOver;
115     sp<SurfaceTexture> mSurfaceTexture;
116     SkMatrix* mTransform;
117     bool mGLContextAttached;
118     bool mUpdateTexImage;
119 
120     Layer* mLayer;
121 };
122 
123 } /* namespace uirenderer */
124 } /* namespace android */
125