1/* 2 * Copyright (C) 2016 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 "RenderNodeDrawable.h" 20 21#include <SkCanvas.h> 22#include <SkDrawable.h> 23#include <utils/FatVector.h> 24 25namespace android { 26namespace uirenderer { 27namespace skiapipeline { 28 29class SkiaDisplayList; 30class EndReorderBarrierDrawable; 31 32/** 33 * StartReorderBarrierDrawable and EndReorderBarrierDrawable work together to define 34 * a sub-list in a display list that need to be drawn out-of-order sorted instead by render 35 * node Z index. 36 * StartReorderBarrierDrawable will sort the entire range and it will draw 37 * render nodes in the range with negative Z index. 38 */ 39class StartReorderBarrierDrawable : public SkDrawable { 40public: 41 explicit StartReorderBarrierDrawable(SkiaDisplayList* data); 42 43protected: 44 virtual SkRect onGetBounds() override { 45 return SkRect::MakeLargest(); 46 } 47 virtual void onDraw(SkCanvas* canvas) override; 48 49private: 50 int mEndChildIndex; 51 int mBeginChildIndex; 52 FatVector<RenderNodeDrawable*, 16> mChildren; 53 SkiaDisplayList* mDisplayList; 54 55 friend class EndReorderBarrierDrawable; 56}; 57 58/** 59 * See StartReorderBarrierDrawable. 60 * EndReorderBarrierDrawable relies on StartReorderBarrierDrawable to host and sort the render 61 * nodes by Z index. When EndReorderBarrierDrawable is drawn it will draw all render nodes in the 62 * range with positive Z index. It is also responsible for drawing shadows for the nodes 63 * corresponding to their z-index. 64 */ 65class EndReorderBarrierDrawable : public SkDrawable { 66public: 67 explicit EndReorderBarrierDrawable(StartReorderBarrierDrawable* startBarrier); 68protected: 69 virtual SkRect onGetBounds() override { 70 return SkRect::MakeLargest(); 71 } 72 virtual void onDraw(SkCanvas* canvas) override; 73private: 74 void drawShadow(SkCanvas* canvas, RenderNodeDrawable* caster); 75 StartReorderBarrierDrawable* mStartBarrier; 76}; 77 78}; // namespace skiapipeline 79}; // namespace uirenderer 80}; // namespace android 81