/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include "RenderNodeDrawable.h"

#include <SkCanvas.h>
#include <SkDrawable.h>
#include <utils/FatVector.h>

namespace android {
namespace uirenderer {
namespace skiapipeline {

class SkiaDisplayList;
class EndReorderBarrierDrawable;

/**
 * StartReorderBarrierDrawable and EndReorderBarrierDrawable work together to define
 * a sub-list in a display list that need to be drawn out-of-order sorted instead by render
 * node Z index.
 * StartReorderBarrierDrawable will sort the entire range and it will draw
 * render nodes in the range with negative Z index.
 */
class StartReorderBarrierDrawable : public SkDrawable {
public:
    explicit StartReorderBarrierDrawable(SkiaDisplayList* data);

protected:
    virtual SkRect onGetBounds() override { return SkRect::MakeLargest(); }
    virtual void onDraw(SkCanvas* canvas) override;

private:
    int mEndChildIndex;
    int mBeginChildIndex;
    FatVector<RenderNodeDrawable*, 16> mChildren;
    SkiaDisplayList* mDisplayList;

    friend class EndReorderBarrierDrawable;
};

/**
 * See StartReorderBarrierDrawable.
 * EndReorderBarrierDrawable relies on StartReorderBarrierDrawable to host and sort the render
 * nodes by Z index. When EndReorderBarrierDrawable is drawn it will draw all render nodes in the
 * range with positive Z index. It is also responsible for drawing shadows for the nodes
 * corresponding to their z-index.
 */
class EndReorderBarrierDrawable : public SkDrawable {
public:
    explicit EndReorderBarrierDrawable(StartReorderBarrierDrawable* startBarrier);

protected:
    virtual SkRect onGetBounds() override { return SkRect::MakeLargest(); }
    virtual void onDraw(SkCanvas* canvas) override;

private:
    void drawShadow(SkCanvas* canvas, RenderNodeDrawable* caster);
    StartReorderBarrierDrawable* mStartBarrier;
};

};  // namespace skiapipeline
};  // namespace uirenderer
};  // namespace android
