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