1 /* 2 * Copyright (C) 2010 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 <GpuMemoryTracker.h> 20 #include <utils/RefBase.h> 21 22 #include <SkColorFilter.h> 23 #include <SkColorSpace.h> 24 #include <SkBlendMode.h> 25 #include <SkPaint.h> 26 27 #include "Matrix.h" 28 29 namespace android { 30 namespace uirenderer { 31 32 /////////////////////////////////////////////////////////////////////////////// 33 // Layers 34 /////////////////////////////////////////////////////////////////////////////// 35 36 class RenderState; 37 38 /** 39 * A layer has dimensions and is backed by a backend specific texture or framebuffer. 40 */ 41 class Layer : public VirtualLightRefBase, GpuMemoryTracker { 42 public: 43 enum class Api { 44 OpenGL = 0, 45 Vulkan = 1, 46 }; 47 getApi()48 Api getApi() const { return mApi; } 49 50 ~Layer(); 51 52 virtual uint32_t getWidth() const = 0; 53 54 virtual uint32_t getHeight() const = 0; 55 56 virtual void setSize(uint32_t width, uint32_t height) = 0; 57 58 virtual void setBlend(bool blend) = 0; 59 60 virtual bool isBlend() const = 0; 61 setForceFilter(bool forceFilter)62 inline void setForceFilter(bool forceFilter) { this->forceFilter = forceFilter; } 63 getForceFilter()64 inline bool getForceFilter() const { return forceFilter; } 65 setAlpha(int alpha)66 inline void setAlpha(int alpha) { this->alpha = alpha; } 67 setAlpha(int alpha,SkBlendMode mode)68 inline void setAlpha(int alpha, SkBlendMode mode) { 69 this->alpha = alpha; 70 this->mode = mode; 71 } 72 getAlpha()73 inline int getAlpha() const { return alpha; } 74 getMode()75 inline SkBlendMode getMode() const { return mode; } 76 getColorFilter()77 inline SkColorFilter* getColorFilter() const { return mColorFilter.get(); } 78 79 void setColorFilter(sk_sp<SkColorFilter> filter); 80 81 void setDataSpace(android_dataspace dataspace); 82 83 void setColorSpace(sk_sp<SkColorSpace> colorSpace); 84 getColorSpaceWithFilter()85 inline sk_sp<SkColorFilter> getColorSpaceWithFilter() const { return mColorSpaceWithFilter; } 86 getTexTransform()87 inline mat4& getTexTransform() { return texTransform; } 88 getTransform()89 inline mat4& getTransform() { return transform; } 90 91 /** 92 * Posts a decStrong call to the appropriate thread. 93 * Thread-safe. 94 */ 95 void postDecStrong(); 96 97 protected: 98 Layer(RenderState& renderState, Api api, sk_sp<SkColorFilter>, int alpha, 99 SkBlendMode mode); 100 101 RenderState& mRenderState; 102 103 private: 104 void buildColorSpaceWithFilter(); 105 106 Api mApi; 107 108 /** 109 * Color filter used to draw this layer. Optional. 110 */ 111 sk_sp<SkColorFilter> mColorFilter; 112 113 /** 114 * Colorspace of the contents of the layer. Optional. 115 */ 116 android_dataspace mCurrentDataspace = HAL_DATASPACE_UNKNOWN; 117 118 /** 119 * A color filter that is the combination of the mColorFilter and mColorSpace. Optional. 120 */ 121 sk_sp<SkColorFilter> mColorSpaceWithFilter; 122 123 /** 124 * Indicates raster data backing the layer is scaled, requiring filtration. 125 */ 126 bool forceFilter = false; 127 128 /** 129 * Opacity of the layer. 130 */ 131 int alpha; 132 133 /** 134 * Blending mode of the layer. 135 */ 136 SkBlendMode mode; 137 138 /** 139 * Optional texture coordinates transform. 140 */ 141 mat4 texTransform; 142 143 /** 144 * Optional transform. 145 */ 146 mat4 transform; 147 148 }; // struct Layer 149 150 }; // namespace uirenderer 151 }; // namespace android 152