Home | History | Annotate | Download | only in hwui
      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 
     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 
     59     int getWidth() { return mWidth; }
     60     int getHeight() { return mHeight; }
     61 
     62     ANDROID_API bool setBlend(bool blend) {
     63         if (blend != mBlend) {
     64             mBlend = blend;
     65             return true;
     66         }
     67         return false;
     68     }
     69 
     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 
     80     ANDROID_API void updateTexImage() { mUpdateTexImage = true; }
     81 
     82     ANDROID_API void setTransform(const SkMatrix* matrix) {
     83         delete mTransform;
     84         mTransform = matrix ? new SkMatrix(*matrix) : nullptr;
     85     }
     86 
     87     SkMatrix* getTransform() { return mTransform; }
     88 
     89     ANDROID_API void setPaint(const SkPaint* paint);
     90 
     91     void apply();
     92 
     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