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