/*
 * Copyright (c) 2022 Arm Limited. All rights reserved.
 * SPDX-License-Identifier: Apache-2.0
 *
 * 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 IMAGE_UTILS_HPP
#define IMAGE_UTILS_HPP

#include <cstddef>
#include <cstdint>
#include <forward_list>
#include <vector>

/* Helper macro to convert RGB888 to RGB565 format. */
#define RGB888_TO_RGB565(R8,G8,B8)  ((((R8>>3) & 0x1F) << 11) |     \
                                     (((G8>>2) & 0x3F) << 5)  |     \
                                     ((B8>>3) & 0x1F))

constexpr uint16_t COLOR_BLACK  = 0;
constexpr uint16_t COLOR_GREEN  = RGB888_TO_RGB565(  0, 255,  0); // 2016;
constexpr uint16_t COLOR_YELLOW = RGB888_TO_RGB565(255, 255,  0); // 65504;


namespace arm {
namespace app {
namespace image {

    /**
     * Contains the x,y co-ordinates of a box centre along with the box width and height.
     */
    struct Box {
        float x;
        float y;
        float w;
        float h;
    };

    struct Detection {
        Box bbox;
        std::vector<float> prob;
        float objectness;
    };

    /**
     * @brief       Calculate the 1D overlap.
     * @param[in]   x1Center   First center point.
     * @param[in]   width1     First width.
     * @param[in]   x2Center   Second center point.
     * @param[in]   width2     Second width.
     * @return      The overlap between the two lines.
     **/
    float Calculate1DOverlap(float x1Center, float width1, float x2Center, float width2);

    /**
     * @brief       Calculate the intersection between the two given boxes.
     * @param[in]   box1   First box.
     * @param[in]   box2   Second box.
     * @return      The intersection value.
     **/
    float CalculateBoxIntersect(Box& box1, Box& box2);

    /**
     * @brief       Calculate the union between the two given boxes.
     * @param[in]   box1   First box.
     * @param[in]   box2   Second box.
     * @return      The two given boxes union value.
     **/
    float CalculateBoxUnion(Box& box1, Box& box2);

    /**
     * @brief       Calculate the intersection over union between the two given boxes.
     * @param[in]   box1   First box.
     * @param[in]   box2   Second box.
     * @return      The intersection over union value.
     **/
    float CalculateBoxIOU(Box& box1, Box& box2);

    /**
     * @brief       Calculate the Non-Maxima suppression on the given detection boxes.
     * @param[in]   detections    List of Detection boxes.
     * @param[in]   classes       Number of classes.
     * @param[in]   iouThreshold  Intersection over union threshold.
     **/
    void CalculateNMS(std::forward_list<Detection>& detections, int classes, float iouThreshold);

    /**
     * @brief           Helper function to convert a UINT8 image to INT8 format.
     * @param[in,out]   data            Pointer to the data start.
     * @param[in]       kMaxImageSize   Total number of pixels in the image.
     **/
    void ConvertImgToInt8(void* data, size_t kMaxImageSize);

    /**
     * @brief       Converts RGB image to grayscale.
     * @param[in]   srcPtr   Pointer to RGB source image.
     * @param[out]  dstPtr   Pointer to grayscale destination image.
     * @param[in]   imgSz    Destination image size.
     **/
    void RgbToGrayscale(const uint8_t* srcPtr, uint8_t* dstPtr, size_t dstImgSz);

} /* namespace image */
} /* namespace app */
} /* namespace arm */

#endif /* IMAGE_UTILS_HPP */