/*
 * 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.
 */

#ifndef _HWC2_TEST_LAYER_H
#define _HWC2_TEST_LAYER_H

#include <android-base/unique_fd.h>
#include <unordered_map>

#include "Hwc2TestBuffer.h"
#include "Hwc2TestProperties.h"

#define HWC2_INCLUDE_STRINGIFICATION
#define HWC2_USE_CPP11
#include <hardware/hwcomposer2.h>
#undef HWC2_INCLUDE_STRINGIFICATION
#undef HWC2_USE_CPP11

class Hwc2TestLayer {
public:
    Hwc2TestLayer(Hwc2TestCoverage coverage, const Area& displayArea);

    Hwc2TestLayer(Hwc2TestCoverage coverage, const Area& displayArea,
            const std::unordered_map<Hwc2TestPropertyName,
            Hwc2TestCoverage>& coverage_exceptions);

    std::string dump() const;

    int getBuffer(buffer_handle_t* outHandle,
            android::base::unique_fd* outAcquireFence);
    int getBuffer(buffer_handle_t* outHandle, int32_t* outAcquireFence);

    void setZOrder(uint32_t zOrder);
    void setVisibleRegion(const android::Region& region);

    void reset();
    bool advance();

    hwc2_blend_mode_t      getBlendMode() const;
    Area                   getBufferArea() const;
    hwc_color_t            getColor() const;
    hwc2_composition_t     getComposition() const;
    hwc_rect_t             getCursorPosition() const;
    android::ui::Dataspace     getDataspace() const;
    hwc_rect_t             getDisplayFrame() const;
    float                  getPlaneAlpha() const;
    hwc_frect_t            getSourceCrop() const;
    hwc_region_t           getSurfaceDamage() const;
    hwc_transform_t        getTransform() const;
    hwc_region_t           getVisibleRegion() const;
    uint32_t               getZOrder() const;

    bool advanceBlendMode();
    bool advanceBufferArea();
    bool advanceColor();
    bool advanceComposition();
    bool advanceCursorPosition();
    bool advanceDataspace();
    bool advanceDisplayFrame();
    bool advancePlaneAlpha();
    bool advanceSourceCrop();
    bool advanceSurfaceDamage();
    bool advanceTransform();
    bool advanceVisibleRegion();

private:
    std::array<Hwc2TestContainer*, 10> mProperties = {{
        &mTransform, &mColor, &mDataspace, &mPlaneAlpha, &mSourceCrop,
        &mSurfaceDamage, &mBlendMode, &mBufferArea, &mDisplayFrame,
        &mComposition
    }};

    Hwc2TestBuffer mBuffer;

    Hwc2TestBlendMode mBlendMode;
    Hwc2TestBufferArea mBufferArea;
    Hwc2TestColor mColor;
    Hwc2TestComposition mComposition;
    Hwc2TestDataspace mDataspace;
    Hwc2TestDisplayFrame mDisplayFrame;
    Hwc2TestPlaneAlpha mPlaneAlpha;
    Hwc2TestSourceCrop mSourceCrop;
    Hwc2TestSurfaceDamage mSurfaceDamage;
    Hwc2TestTransform mTransform;
    Hwc2TestVisibleRegion mVisibleRegion;

    uint32_t mZOrder = UINT32_MAX;
};

#endif /* ifndef _HWC2_TEST_LAYER_H */