//
// Created by lydxh on 24-7-5.
//

#ifndef HW_LIB_SIM_DISPLAY_H
#define HW_LIB_SIM_DISPLAY_H
#ifdef __cplusplus
extern "C" {
#endif

#include "stdint.h"
//是否启用SDL3画图
#define USER_SDL3



/**
 * @brief   定义颜色常量值，用于模拟显示
 */
#define BLACK         0          // 黑色
#define BLUE          0xAA0000    // 蓝色
#define GREEN         0x00AA00    // 绿色
#define CYAN          0xAAAA00    // 青色
#define RED           0x0000AA    // 红色
#define MAGENTA       0xAA00AA    // 品红
#define BROWN         0x0055AA    // 棕色
#define LIGHTGRAY     0xAAAAAA    // 亮灰色
#define DARKGRAY      0x555555    // 暗灰色
#define LIGHTBLUE     0xFF5555    // 亮蓝色
#define LIGHTGREEN    0x55FF55    // 亮绿色
#define LIGHTCYAN     0xFFFF55    // 亮青色
#define LIGHTRED      0x5555FF    // 亮红色
#define LIGHTMAGENTA  0xFF55FF    // 亮品红
#define YELLOW        0x55FFFF    // 黄色
#define WHITE         0xFFFFFF    // 白色

#ifndef USER_SDL3
/**
 * @brief   初始化模拟 显示
 * @param   width: [输入] 显示宽度
 * @param   height: [输入] 显示高度
 * @param   pixcolor: [输入] 像素颜色
 * @param   backcolor: [输入] 背景颜色
 * @param   scale: [输入] 显示缩放比例
 * @param   border: [输入] 是否显示边框
 * @return  void
 * @example SIM_Display_INIT(128, 64, 0xFFFF00, 0x000000, 10, 1);
 **/
void SIM_Display_INIT(int width, int height, uint32_t pixcolor, uint32_t backcolor, int scale, uint8_t border);

/**
 * @brief   开始模拟 显示
 * @return  void
 * @example SIM_Display_START();
 **/
void SIM_Display_START();

/**
 * @brief   停止模拟 显示
 * @return  void
 * @example SIM_OLED_STOP();
 **/
void SIM_Display_STOP();

/**
 * @brief   从缓冲区绘制到单色显示
 * @param   buf: [输入] 缓冲区指针
 * @param   width: [输入] 图像宽度
 * @param   height: [输入] 图像高度
 * @return  void
 * @example SIM_OneColor_DrawFromBuffer(buffer, 128, 64);
 **/
void SIM_OneColor_DrawFromBuffer(uint8_t *buf, uint16_t width, uint16_t height);

/**
 * @brief 在指定的坐标位置绘制一个像素点
 * @param color 颜色
 * @param x x坐标
 * @param y y坐标
 */
void SIM_Color_DrawPiexl(uint32_t color, uint16_t x, uint16_t y);

void SIM_Color_DrawHLineBuffer(uint32_t *buf, uint16_t x, uint16_t y, uint16_t width);

/**
 * @brief   从缓冲区绘制到显示
 * @param   buf: [输入] 缓冲区指针
 * @param   width: [输入] 图像宽度
 * @param   height: [输入] 图像高度
 * @return  void
 * @example SIM_Color_DrawFromBuffer(buffer, 480, 320);
 **/
void SIM_Color_DrawFromBuffer(uint32_t *buf, uint16_t width, uint16_t height);

/**
 * @brief   从缓冲区中填充图像
 * @param   buf: [输入]      缓冲区指针
 * @param   x: [输入]        图像起始横坐标
 * @param   y: [输入]        图像起始纵坐标
 * @param   width: [输入]    图像宽度
 * @param   height: [输入]   图像高度
 * @return  void
 * @example SIM_Color_ImgFromBuffer(buf, 100, 50, 320, 240);
**/
void SIM_Color_ImgFromBuffer(uint32_t* buf, uint16_t x, uint16_t y, uint16_t width, uint16_t height);

/**
 * @brief   从缓冲区中填充颜色
 * @param   buf: [输入]      缓冲区指针
 * @param   xs: [输入]       填充区域起始横坐标
 * @param   ys: [输入]       填充区域起始纵坐标
 * @param   xe: [输入]       填充区域结束横坐标
 * @param   ye: [输入]       填充区域结束纵坐标
 * @return  void
 * @example SIM_Color_FillFromBuffer(buf, 50, 30, 150, 100);
**/
void SIM_Color_FillFromBuffer(uint32_t* buf, uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye);
#else
#include "SDL3/SDL.h"


typedef union {
    struct {
        uint8_t blue;
        uint8_t green;
        uint8_t red;
        uint8_t alpha;
    } ch;
    uint32_t full;
} SIM_Color_t;

typedef struct {
    SDL_Window *window;
    SDL_Renderer *renderer;
    SDL_Event *event;
    int scale;
    SIM_Color_t pixelcolor;
    SIM_Color_t backcolor;
} SIM_Display_t;

/**
 * @brief   初始化模拟 显示
 * @param   name: [输入]  窗口名称
 * @param   width: [输入] 显示宽度
 * @param   height: [输入] 显示高度
 * @param   pixcolor: [输入] 像素颜色
 * @param   backcolor: [输入] 背景颜色
 * @param   scale: [输入] 显示缩放比例
 * @param   display: [输入] 输入窗口实例
 * @return  bool: true[成功] false[失败]
 * @example SIM_Display_Init(128, 64, 0xFFFF00, 0x000000, 10, 1);
 **/
bool SIM_Display_Init(char *name, int width, int height, uint32_t pixcolor, uint32_t backcolor, int scale,
                      SIM_Display_t *display);

/**
 * @brief 在指定的坐标位置绘制一个像素点
 * @param display: [输入] 输入窗口实例
 * @param color 颜色
 * @param x x坐标
 * @param y y坐标
 */
void SIM_Color_DrawPiexl(SIM_Display_t *display, SIM_Color_t color, uint16_t x, uint16_t y);

/**
 * @brief 从颜色缓冲区绘制单色图像到模拟显示器
 * @param display 模拟显示器指针
 * @param buf 颜色缓冲区指针
 * @param width 绘制区域宽度
 * @param height 绘制区域高度
 */
void SIM_OneColor_DrawFromBuffer(SIM_Display_t *display, uint8_t *buf, uint16_t width, uint16_t height);

/**
 * @brief   从缓冲区中填充图像
 * @param   display: [输入] 输入窗口实例
 * @param   buf: [输入]      缓冲区指针
 * @param   x: [输入]        图像起始横坐标
 * @param   y: [输入]        图像起始纵坐标
 * @param   width: [输入]    图像宽度
 * @param   height: [输入]   图像高度
 * @return  void
 * @example SIM_Color_ImgFromBuffer(buf, 100, 50, 320, 240);
**/
void SIM_Color_ImgFromBuffer(SIM_Display_t *display, uint32_t *buf, uint16_t x, uint16_t y,
                             uint16_t width, uint16_t height);

/**
 * @brief   从缓冲区中填充颜色
 * @param   display: [输入] 输入窗口实例
 * @param   buf: [输入]      缓冲区指针
 * @param   xs: [输入]       填充区域起始横坐标
 * @param   ys: [输入]       填充区域起始纵坐标
 * @param   xe: [输入]       填充区域结束横坐标
 * @param   ye: [输入]       填充区域结束纵坐标
 * @return  void
 * @example SIM_Color_FillFromBuffer(buf, 50, 30, 150, 100);
**/
void
SIM_Color_FillFromBuffer(SIM_Display_t *display, uint32_t *buf, uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye);

/**
 * @brief 刷新模拟显示器
 *
 * @param display 模拟显示器指针
 */
void SIM_Display_Refresh(SIM_Display_t *display);

/**
 * @brief   停止模拟 显示
 * @return  void
 * @example SIM_OLED_STOP();
 **/
void SIM_Display_STOP(SIM_Display_t *display);

#endif


uint32_t RGB565_to_ARGB8888(uint16_t rgb565, bool isBGR);

#ifdef __cplusplus
}
#endif
#endif //HW_LIB_SIM_DISPLAY_H
