blob: 1491f99402ba35bdb4df66d939a37cc095042157 [file] [log] [blame]
John Reck04fc5832014-02-05 16:38:25 -08001/*
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 */
Chris Craik5e00c7c2016-07-06 16:10:09 -070016
17#pragma once
John Reck04fc5832014-02-05 16:38:25 -080018
John Reck04fc5832014-02-05 16:38:25 -080019#include <SkColorFilter.h>
Stan Iliev564ca3e2018-09-04 22:00:00 +000020#include <SkImage.h>
John Reck04fc5832014-02-05 16:38:25 -080021#include <SkMatrix.h>
John Reck1bcacfd2017-11-03 10:12:19 -070022#include <cutils/compiler.h>
Stan Iliev564ca3e2018-09-04 22:00:00 +000023#include <map>
Derek Sollenbergerbe3876c2018-04-20 16:13:31 -040024#include <system/graphics.h>
John Reck04fc5832014-02-05 16:38:25 -080025#include <utils/StrongPointer.h>
26
Derek Sollenberger28a4d992018-09-20 13:37:24 -040027#include "renderstate/RenderState.h"
Stan Iliev564ca3e2018-09-04 22:00:00 +000028#include "surfacetexture/SurfaceTexture.h"
John Reck04fc5832014-02-05 16:38:25 -080029#include "Layer.h"
John Reck04fc5832014-02-05 16:38:25 -080030#include "Rect.h"
31
32namespace android {
33namespace uirenderer {
34
sergeyv3e9999b2017-01-19 15:37:02 -080035class RenderState;
36
John Reck04fc5832014-02-05 16:38:25 -080037// Container to hold the properties a layer should be set to at the start
38// of a render pass
Derek Sollenberger28a4d992018-09-20 13:37:24 -040039class DeferredLayerUpdater : public VirtualLightRefBase, public IGpuContextCallback {
John Reck04fc5832014-02-05 16:38:25 -080040public:
John Recka39dd592014-02-14 16:59:37 -080041 // Note that DeferredLayerUpdater assumes it is taking ownership of the layer
42 // and will not call incrementRef on it as a result.
Stan Iliev564ca3e2018-09-04 22:00:00 +000043 ANDROID_API explicit DeferredLayerUpdater(RenderState& renderState);
sergeyv3e9999b2017-01-19 15:37:02 -080044
John Reck04fc5832014-02-05 16:38:25 -080045 ANDROID_API ~DeferredLayerUpdater();
46
Dan Stozaa41f29c2014-11-12 12:35:42 -080047 ANDROID_API bool setSize(int width, int height) {
John Reck04fc5832014-02-05 16:38:25 -080048 if (mWidth != width || mHeight != height) {
49 mWidth = width;
50 mHeight = height;
51 return true;
52 }
53 return false;
54 }
55
John Reck417ed6d2016-03-22 16:01:08 -070056 int getWidth() { return mWidth; }
57 int getHeight() { return mHeight; }
58
John Reck04fc5832014-02-05 16:38:25 -080059 ANDROID_API bool setBlend(bool blend) {
60 if (blend != mBlend) {
61 mBlend = blend;
62 return true;
63 }
64 return false;
65 }
66
Fedor Kudasovd501e102019-06-21 10:22:53 +010067 ANDROID_API void setSurfaceTexture(const sp<SurfaceTexture>& consumer);
John Reck04fc5832014-02-05 16:38:25 -080068
John Reck1bcacfd2017-11-03 10:12:19 -070069 ANDROID_API void updateTexImage() { mUpdateTexImage = true; }
John Reck04fc5832014-02-05 16:38:25 -080070
71 ANDROID_API void setTransform(const SkMatrix* matrix) {
72 delete mTransform;
Chris Craikd41c4d82015-01-05 15:51:13 -080073 mTransform = matrix ? new SkMatrix(*matrix) : nullptr;
John Reck04fc5832014-02-05 16:38:25 -080074 }
75
John Reck1bcacfd2017-11-03 10:12:19 -070076 SkMatrix* getTransform() { return mTransform; }
John Reck417ed6d2016-03-22 16:01:08 -070077
Derek Sollenberger674554f2014-02-19 16:47:32 +000078 ANDROID_API void setPaint(const SkPaint* paint);
John Reck04fc5832014-02-05 16:38:25 -080079
Chris Craikd2dfd8f2015-12-16 14:27:20 -080080 void apply();
John Reck04fc5832014-02-05 16:38:25 -080081
John Reck1bcacfd2017-11-03 10:12:19 -070082 Layer* backingLayer() { return mLayer; }
John Reck04fc5832014-02-05 16:38:25 -080083
Chris Craikd2dfd8f2015-12-16 14:27:20 -080084 void detachSurfaceTexture();
John Reck918ad522014-06-27 14:45:25 -070085
Stan Iliev564ca3e2018-09-04 22:00:00 +000086 void updateLayer(bool forceFilter, const SkMatrix& textureTransform,
Derek Sollenbergerd01b5912018-10-19 15:55:33 -040087 const sk_sp<SkImage>& layerImage);
Derek Sollenberger56ad6ec2016-07-22 12:13:32 -040088
sergeyv3e9999b2017-01-19 15:37:02 -080089 void destroyLayer();
90
Derek Sollenberger28a4d992018-09-20 13:37:24 -040091protected:
92 void onContextDestroyed() override;
93
John Reck04fc5832014-02-05 16:38:25 -080094private:
sergeyv3e9999b2017-01-19 15:37:02 -080095 RenderState& mRenderState;
96
John Reck04fc5832014-02-05 16:38:25 -080097 // Generic properties
sergeyv3e9999b2017-01-19 15:37:02 -080098 int mWidth = 0;
99 int mHeight = 0;
100 bool mBlend = false;
Derek Sollenbergerbe3876c2018-04-20 16:13:31 -0400101 sk_sp<SkColorFilter> mColorFilter;
sergeyv3e9999b2017-01-19 15:37:02 -0800102 int mAlpha = 255;
103 SkBlendMode mMode = SkBlendMode::kSrcOver;
Stan Iliev564ca3e2018-09-04 22:00:00 +0000104 sp<SurfaceTexture> mSurfaceTexture;
John Reck04fc5832014-02-05 16:38:25 -0800105 SkMatrix* mTransform;
sergeyv00eb43d2017-02-13 14:34:15 -0800106 bool mGLContextAttached;
John Reck04fc5832014-02-05 16:38:25 -0800107 bool mUpdateTexImage;
108
109 Layer* mLayer;
John Reck04fc5832014-02-05 16:38:25 -0800110};
111
112} /* namespace uirenderer */
113} /* namespace android */