/*
 * 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 "SkiaUtils.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 SkRectMakeLargest(); }
    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 SkRectMakeLargest(); }
    virtual void onDraw(SkCanvas* canvas) override;

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

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