xref: /aosp_15_r20/frameworks/base/libs/hwui/Layer.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2010 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #pragma once
18*d57664e9SAndroid Build Coastguard Worker 
19*d57664e9SAndroid Build Coastguard Worker #include <utils/RefBase.h>
20*d57664e9SAndroid Build Coastguard Worker 
21*d57664e9SAndroid Build Coastguard Worker #include <SkBlendMode.h>
22*d57664e9SAndroid Build Coastguard Worker #include <SkColorFilter.h>
23*d57664e9SAndroid Build Coastguard Worker #include <SkColorSpace.h>
24*d57664e9SAndroid Build Coastguard Worker #include <SkCanvas.h>
25*d57664e9SAndroid Build Coastguard Worker #include <SkPaint.h>
26*d57664e9SAndroid Build Coastguard Worker #include <SkImage.h>
27*d57664e9SAndroid Build Coastguard Worker #include <SkMatrix.h>
28*d57664e9SAndroid Build Coastguard Worker #include <system/graphics.h>
29*d57664e9SAndroid Build Coastguard Worker 
30*d57664e9SAndroid Build Coastguard Worker namespace android {
31*d57664e9SAndroid Build Coastguard Worker namespace uirenderer {
32*d57664e9SAndroid Build Coastguard Worker 
33*d57664e9SAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
34*d57664e9SAndroid Build Coastguard Worker // Layers
35*d57664e9SAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
36*d57664e9SAndroid Build Coastguard Worker 
37*d57664e9SAndroid Build Coastguard Worker class RenderState;
38*d57664e9SAndroid Build Coastguard Worker 
39*d57664e9SAndroid Build Coastguard Worker /**
40*d57664e9SAndroid Build Coastguard Worker  * A layer has dimensions and is backed by a backend specific texture or framebuffer.
41*d57664e9SAndroid Build Coastguard Worker  */
42*d57664e9SAndroid Build Coastguard Worker class Layer : public VirtualLightRefBase {
43*d57664e9SAndroid Build Coastguard Worker public:
44*d57664e9SAndroid Build Coastguard Worker     Layer(RenderState& renderState, sk_sp<SkColorFilter>, int alpha, SkBlendMode mode);
45*d57664e9SAndroid Build Coastguard Worker 
46*d57664e9SAndroid Build Coastguard Worker     ~Layer();
47*d57664e9SAndroid Build Coastguard Worker 
getWidth()48*d57664e9SAndroid Build Coastguard Worker     uint32_t getWidth() const { return mWidth; }
49*d57664e9SAndroid Build Coastguard Worker 
getHeight()50*d57664e9SAndroid Build Coastguard Worker     uint32_t getHeight() const { return mHeight; }
51*d57664e9SAndroid Build Coastguard Worker 
setSize(uint32_t width,uint32_t height)52*d57664e9SAndroid Build Coastguard Worker     void setSize(uint32_t width, uint32_t height) { mWidth = width; mHeight = height; }
53*d57664e9SAndroid Build Coastguard Worker 
setBlend(bool blend)54*d57664e9SAndroid Build Coastguard Worker     void setBlend(bool blend) { mBlend = blend; }
55*d57664e9SAndroid Build Coastguard Worker 
isBlend()56*d57664e9SAndroid Build Coastguard Worker     bool isBlend() const { return mBlend; }
57*d57664e9SAndroid Build Coastguard Worker 
setForceFilter(bool forceFilter)58*d57664e9SAndroid Build Coastguard Worker     inline void setForceFilter(bool forceFilter) { this->forceFilter = forceFilter; }
59*d57664e9SAndroid Build Coastguard Worker 
getForceFilter()60*d57664e9SAndroid Build Coastguard Worker     inline bool getForceFilter() const { return forceFilter; }
61*d57664e9SAndroid Build Coastguard Worker 
setAlpha(int alpha)62*d57664e9SAndroid Build Coastguard Worker     inline void setAlpha(int alpha) { this->alpha = alpha; }
63*d57664e9SAndroid Build Coastguard Worker 
setAlpha(int alpha,SkBlendMode mode)64*d57664e9SAndroid Build Coastguard Worker     inline void setAlpha(int alpha, SkBlendMode mode) {
65*d57664e9SAndroid Build Coastguard Worker         this->alpha = alpha;
66*d57664e9SAndroid Build Coastguard Worker         this->mode = mode;
67*d57664e9SAndroid Build Coastguard Worker     }
68*d57664e9SAndroid Build Coastguard Worker 
getAlpha()69*d57664e9SAndroid Build Coastguard Worker     inline int getAlpha() const { return alpha; }
70*d57664e9SAndroid Build Coastguard Worker 
71*d57664e9SAndroid Build Coastguard Worker     SkBlendMode getMode() const;
72*d57664e9SAndroid Build Coastguard Worker 
getColorFilter()73*d57664e9SAndroid Build Coastguard Worker     inline sk_sp<SkColorFilter> getColorFilter() const { return mColorFilter; }
74*d57664e9SAndroid Build Coastguard Worker 
setColorFilter(sk_sp<SkColorFilter> filter)75*d57664e9SAndroid Build Coastguard Worker     void setColorFilter(sk_sp<SkColorFilter> filter) { mColorFilter = filter; };
76*d57664e9SAndroid Build Coastguard Worker 
getTransform()77*d57664e9SAndroid Build Coastguard Worker     inline SkMatrix& getTransform() { return transform; }
78*d57664e9SAndroid Build Coastguard Worker 
getCurrentCropRect()79*d57664e9SAndroid Build Coastguard Worker     inline SkRect getCurrentCropRect() { return mCurrentCropRect; }
80*d57664e9SAndroid Build Coastguard Worker 
setCurrentCropRect(const SkRect currentCropRect)81*d57664e9SAndroid Build Coastguard Worker     inline void setCurrentCropRect(const SkRect currentCropRect) {
82*d57664e9SAndroid Build Coastguard Worker         mCurrentCropRect = currentCropRect;
83*d57664e9SAndroid Build Coastguard Worker     }
84*d57664e9SAndroid Build Coastguard Worker 
setWindowTransform(uint32_t windowTransform)85*d57664e9SAndroid Build Coastguard Worker     inline void setWindowTransform(uint32_t windowTransform) { mWindowTransform = windowTransform; }
86*d57664e9SAndroid Build Coastguard Worker 
getWindowTransform()87*d57664e9SAndroid Build Coastguard Worker     inline uint32_t getWindowTransform() { return mWindowTransform; }
88*d57664e9SAndroid Build Coastguard Worker 
89*d57664e9SAndroid Build Coastguard Worker     /**
90*d57664e9SAndroid Build Coastguard Worker      * Posts a decStrong call to the appropriate thread.
91*d57664e9SAndroid Build Coastguard Worker      * Thread-safe.
92*d57664e9SAndroid Build Coastguard Worker      */
93*d57664e9SAndroid Build Coastguard Worker     void postDecStrong();
94*d57664e9SAndroid Build Coastguard Worker 
setImage(const sk_sp<SkImage> & image)95*d57664e9SAndroid Build Coastguard Worker     inline void setImage(const sk_sp<SkImage>& image) { this->layerImage = image; }
96*d57664e9SAndroid Build Coastguard Worker 
getImage()97*d57664e9SAndroid Build Coastguard Worker     inline sk_sp<SkImage> getImage() const { return this->layerImage; }
98*d57664e9SAndroid Build Coastguard Worker 
setMaxLuminanceNits(float maxLuminanceNits)99*d57664e9SAndroid Build Coastguard Worker     inline void setMaxLuminanceNits(float maxLuminanceNits) {
100*d57664e9SAndroid Build Coastguard Worker         mMaxLuminanceNits = maxLuminanceNits;
101*d57664e9SAndroid Build Coastguard Worker     }
102*d57664e9SAndroid Build Coastguard Worker 
getMaxLuminanceNits()103*d57664e9SAndroid Build Coastguard Worker     inline float getMaxLuminanceNits() { return mMaxLuminanceNits; }
104*d57664e9SAndroid Build Coastguard Worker 
setBufferFormat(uint32_t format)105*d57664e9SAndroid Build Coastguard Worker     void setBufferFormat(uint32_t format) { mBufferFormat = format; }
106*d57664e9SAndroid Build Coastguard Worker 
getBufferFormat()107*d57664e9SAndroid Build Coastguard Worker     uint32_t getBufferFormat() const { return mBufferFormat; }
108*d57664e9SAndroid Build Coastguard Worker 
109*d57664e9SAndroid Build Coastguard Worker     void draw(SkCanvas* canvas);
110*d57664e9SAndroid Build Coastguard Worker 
111*d57664e9SAndroid Build Coastguard Worker protected:
112*d57664e9SAndroid Build Coastguard Worker 
113*d57664e9SAndroid Build Coastguard Worker     RenderState& mRenderState;
114*d57664e9SAndroid Build Coastguard Worker 
115*d57664e9SAndroid Build Coastguard Worker private:
116*d57664e9SAndroid Build Coastguard Worker     /**
117*d57664e9SAndroid Build Coastguard Worker      * Color filter used to draw this layer. Optional.
118*d57664e9SAndroid Build Coastguard Worker      */
119*d57664e9SAndroid Build Coastguard Worker     sk_sp<SkColorFilter> mColorFilter;
120*d57664e9SAndroid Build Coastguard Worker 
121*d57664e9SAndroid Build Coastguard Worker     /**
122*d57664e9SAndroid Build Coastguard Worker      * Indicates raster data backing the layer is scaled, requiring filtration.
123*d57664e9SAndroid Build Coastguard Worker      */
124*d57664e9SAndroid Build Coastguard Worker     bool forceFilter = false;
125*d57664e9SAndroid Build Coastguard Worker 
126*d57664e9SAndroid Build Coastguard Worker     /**
127*d57664e9SAndroid Build Coastguard Worker      * Opacity of the layer.
128*d57664e9SAndroid Build Coastguard Worker      */
129*d57664e9SAndroid Build Coastguard Worker     int alpha;
130*d57664e9SAndroid Build Coastguard Worker 
131*d57664e9SAndroid Build Coastguard Worker     /**
132*d57664e9SAndroid Build Coastguard Worker      * Blending mode of the layer.
133*d57664e9SAndroid Build Coastguard Worker      */
134*d57664e9SAndroid Build Coastguard Worker     SkBlendMode mode;
135*d57664e9SAndroid Build Coastguard Worker 
136*d57664e9SAndroid Build Coastguard Worker     /**
137*d57664e9SAndroid Build Coastguard Worker      * Optional transform.
138*d57664e9SAndroid Build Coastguard Worker      */
139*d57664e9SAndroid Build Coastguard Worker     SkMatrix transform;
140*d57664e9SAndroid Build Coastguard Worker 
141*d57664e9SAndroid Build Coastguard Worker     /**
142*d57664e9SAndroid Build Coastguard Worker      * Optional crop
143*d57664e9SAndroid Build Coastguard Worker      */
144*d57664e9SAndroid Build Coastguard Worker     SkRect mCurrentCropRect;
145*d57664e9SAndroid Build Coastguard Worker 
146*d57664e9SAndroid Build Coastguard Worker     /**
147*d57664e9SAndroid Build Coastguard Worker      * Optional transform
148*d57664e9SAndroid Build Coastguard Worker      */
149*d57664e9SAndroid Build Coastguard Worker     uint32_t mWindowTransform;
150*d57664e9SAndroid Build Coastguard Worker 
151*d57664e9SAndroid Build Coastguard Worker     /**
152*d57664e9SAndroid Build Coastguard Worker      * An image backing the layer.
153*d57664e9SAndroid Build Coastguard Worker      */
154*d57664e9SAndroid Build Coastguard Worker     sk_sp<SkImage> layerImage;
155*d57664e9SAndroid Build Coastguard Worker 
156*d57664e9SAndroid Build Coastguard Worker     /**
157*d57664e9SAndroid Build Coastguard Worker      * layer width.
158*d57664e9SAndroid Build Coastguard Worker      */
159*d57664e9SAndroid Build Coastguard Worker     uint32_t mWidth = 0;
160*d57664e9SAndroid Build Coastguard Worker 
161*d57664e9SAndroid Build Coastguard Worker     /**
162*d57664e9SAndroid Build Coastguard Worker      * layer height.
163*d57664e9SAndroid Build Coastguard Worker      */
164*d57664e9SAndroid Build Coastguard Worker     uint32_t mHeight = 0;
165*d57664e9SAndroid Build Coastguard Worker 
166*d57664e9SAndroid Build Coastguard Worker     /**
167*d57664e9SAndroid Build Coastguard Worker      * enable blending
168*d57664e9SAndroid Build Coastguard Worker      */
169*d57664e9SAndroid Build Coastguard Worker     bool mBlend = false;
170*d57664e9SAndroid Build Coastguard Worker 
171*d57664e9SAndroid Build Coastguard Worker     /**
172*d57664e9SAndroid Build Coastguard Worker      * Max input luminance if the layer is HDR
173*d57664e9SAndroid Build Coastguard Worker      */
174*d57664e9SAndroid Build Coastguard Worker     float mMaxLuminanceNits = -1;
175*d57664e9SAndroid Build Coastguard Worker 
176*d57664e9SAndroid Build Coastguard Worker     uint32_t mBufferFormat = 0;
177*d57664e9SAndroid Build Coastguard Worker 
178*d57664e9SAndroid Build Coastguard Worker };  // struct Layer
179*d57664e9SAndroid Build Coastguard Worker 
180*d57664e9SAndroid Build Coastguard Worker }  // namespace uirenderer
181*d57664e9SAndroid Build Coastguard Worker }  // namespace android
182