/**************************************************************************//**
 * @file     N9H20_BLT.h
 * @version  V3.00
 * @brief    N9H20 series BLT driver header file
 *
 * SPDX-License-Identifier: Apache-2.0
 * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
 
#ifndef __BLT_H__
#define __BLT_H__

#ifdef  __cplusplus
extern "C"
{
#endif

#include "wblib.h"

#define ERR_BLT_INVALID_INT         (BLT_ERR_ID | 0x01)
#define ERR_BLT_INVALID_SRCFMT      (BLT_ERR_ID | 0x02)
#define ERR_BLT_INVALID_DSTFMT      (BLT_ERR_ID | 0x03)

typedef void (*PFN_BLT_CALLBACK) (void);

typedef enum {
    BLT_INT_CMPLT       = 1
} E_BLT_INT_TYPE;

typedef enum
{
    eDRVBLT_DISABLE,      
    eDRVBLT_ENABLE     
} E_DRVBLT_FILLOP;

typedef enum
{
    eDRVBLT_EFFECTIVE,      
    eDRVBLT_NO_EFFECTIVE     
} E_DRVBLT_REVEAL_ALPHA;

typedef enum
{
    eDRVBLT_NONTRANSPARENCY,     
    eDRVBLT_HASTRANSPARENCY=1,     
    eDRVBLT_HASCOLORTRANSFORM=2, 
    eDRVBLT_HASALPHAONLY=4           
} E_DRVBLT_TRANSFORM_FLAG;

typedef enum
{
    eDRVBLT_SRC_ARGB8888=1,     
    eDRVBLT_SRC_RGB565, 
    eDRVBLT_SRC_1BPP=4,             
    eDRVBLT_SRC_2BPP=8,    
    eDRVBLT_SRC_4BPP=16,     
    eDRVBLT_SRC_8BPP=32
} E_DRVBLT_BMPIXEL_FORMAT;

typedef enum
{
    eDRVBLT_DEST_ARGB8888=1,    
    eDRVBLT_DEST_RGB565, 
    eDRVBLT_DEST_RGB555=4         
} E_DRVBLT_DISPLAY_FORMAT;

typedef enum
{
    eDRVBLT_CLIP_TO_EDGE=1,    
    eDRVBLT_NOTSMOOTH,    
    eDRVBLT_NONE_FILL=4
} E_DRVBLT_FILL_STYLE;

typedef enum
{
    eDRVBLT_BIG_ENDIAN,     
    eDRVBLT_LITTLE_ENDIAN  
} E_DRVBLT_PALETTE_ORDER;


typedef struct {
    INT32 a;
    INT32 b;
    INT32 c;
    INT32 d;
} S_DRVBLT_MATRIX;

typedef struct {
    INT16  i16Blue;
    INT16  i16Green;
    INT16  i16Red;
    INT16  i16Alpha;
} S_DRVBLT_ARGB16;

typedef struct {
    INT16   i16Xmin;
    INT16   i16Xmax;
    INT16   i16Ymin;
    INT16   i16Ymax;
} S_DRVBLT_RECT;

typedef struct {
    UINT8   u8Blue;
    UINT8   u8Green;
    UINT8   u8Red;
    UINT8   u8Alpha;
} S_DRVBLT_ARGB8;

typedef struct {
//    S_DRVBLT_ARGB8*  pSARGB8;
    UINT32              u32SrcImageAddr;
    INT32               i32Stride;    
    INT32               i32XOffset;
    INT32               i32YOffset;
    INT16               i16Width;
    INT16               i16Height;   
} S_DRVBLT_SRC_IMAGE;    

typedef struct {
    UINT32              u32FrameBufAddr;
    INT32               i32XOffset;
    INT32               i32YOffset;
    INT32               i32Stride;     
    INT16               i16Width;
    INT16               i16Height;      
} S_DRVBLT_DEST_FB;    


// APIs declaration

int /* ERRCODE */ bltOpen (void);
void bltClose (void);
void bltSetTransformMatrix (S_DRVBLT_MATRIX sMatrix);

void bltGetTransformMatrix (S_DRVBLT_MATRIX* psMatrix);

int /* ERRCODE */ bltSetSrcFormat (E_DRVBLT_BMPIXEL_FORMAT eSrcFmt);

E_DRVBLT_BMPIXEL_FORMAT 
bltGetSrcFormat(void);

int /* ERRCODE */
bltSetDisplayFormat(
    E_DRVBLT_DISPLAY_FORMAT eDisplayFmt // [in] Display Format 
);

E_DRVBLT_DISPLAY_FORMAT 
bltGetDisplayFormat(void);

void bltEnableInt (E_BLT_INT_TYPE eIntType);
void bltDisableInt (E_BLT_INT_TYPE eIntType);
BOOL bltIsIntEnabled (E_BLT_INT_TYPE eIntType);
BOOL bltPollInt (E_BLT_INT_TYPE eIntType);
void bltInstallCallback (E_BLT_INT_TYPE eIntType, PFN_BLT_CALLBACK pfnCallback, PFN_BLT_CALLBACK *pfnOldCallback);

void bltSetColorMultiplier(
    S_DRVBLT_ARGB16 sARGB16 // [in] ARGB Multiplier 
);

void bltGetColorMultiplier(
    S_DRVBLT_ARGB16* psARGB16   // [out] ARGB Multiplier 
);

void bltSetColorOffset(
    S_DRVBLT_ARGB16 sARGB16 // [in] ARGB offset 
);

void bltGetColorOffset(
    S_DRVBLT_ARGB16* psARGB16   // [out] ARGB offset 
);

void bltSetSrcImage(
    S_DRVBLT_SRC_IMAGE sSrcImage    // [in] Source Image Setting
);

void bltSetDestFrameBuf(
    S_DRVBLT_DEST_FB sFrameBuf  // [in] Frame Buffer Setting
);

void bltSetARGBFillColor(
    S_DRVBLT_ARGB8 sARGB8   // [in] ARGB value for fill operation
);

void bltGetARGBFillColor(
    S_DRVBLT_ARGB8* psARGB8 // [out] ARGB value for fill operation
);

BOOL 
bltGetBusyStatus(void);

void bltSetFillAlpha(
BOOL bEnable
);

BOOL 
bltGetFillAlpha(void);

void bltSetTransformFlag(
    UINT32 u32TransFlag         // [in] A combination of the enum E_DRVBLT_TRANSFORM_FLAG
);

UINT32 
bltGetTransformFlag(void);

void bltSetPaletteEndian(
    E_DRVBLT_PALETTE_ORDER eEndian  // [in] Palette Endian Type
);

E_DRVBLT_PALETTE_ORDER 
bltGetPaletteEndian(void);

void bltSetColorPalette(
    UINT32 u32PaletteInx,       // [in] Color Palette Start index
    UINT32 u32Num,              // [in] Color Palette number to set
    S_DRVBLT_ARGB8* psARGB  // [in] pointer for Color palette from u32PaletteInx
);

void bltSetFillOP(
    E_DRVBLT_FILLOP eOP     // [in] Enable/Disable FillOP
);

BOOL 
bltGetFillOP(void);

void bltSetFillStyle(
    E_DRVBLT_FILL_STYLE eStyle      // [in] Fill Style for Fill Operation
);

E_DRVBLT_FILL_STYLE 
bltGetFillStyle(void);

void bltSetRevealAlpha(
    E_DRVBLT_REVEAL_ALPHA eAlpha        // [in] need / no need un-multiply alpha on source image
);

BOOL 
bltGetRevealAlpha(void);

void bltTrigger(void);

void bltSetRGB565TransparentColor(
    UINT16 u16RGB565    // [in] RGB565 Transparent Color
);

UINT16 
bltGetRGB565TransparentColor(void);

void bltSetRGB565TransparentCtl(
BOOL bEnable
);

BOOL 
bltGetRGB565TransparentCtl(void);

void bltFlush (void);

// Flash Lite BLT I/F
typedef struct {
    S_DRVBLT_MATRIX          sMatrix;
    E_DRVBLT_BMPIXEL_FORMAT  eSrcFmt;
    E_DRVBLT_DISPLAY_FORMAT  eDestFmt;
    
    INT32                       i32Flag;
    S_DRVBLT_ARGB16          sColorMultiplier;
    S_DRVBLT_ARGB16          sColorOffset;
    E_DRVBLT_FILL_STYLE      eFilStyle;
} S_FI_BLITTRANSFORMATION;


typedef struct {
    S_DRVBLT_RECT            sRect;
    S_DRVBLT_ARGB8           sARGB8;
    UINT32                      u32FBAddr;
    INT32                       i32Stride;
    E_DRVBLT_DISPLAY_FORMAT  eDisplayFmt;
    INT32                       i32Blend;
} S_FI_FILLOP;

typedef struct {
    S_DRVBLT_ARGB8          *psARGB8;
    S_DRVBLT_SRC_IMAGE      sDrvSrcImage;
} S_FI_SRC_IMAGE;

typedef struct {
    S_FI_SRC_IMAGE              sFISrcImage;
    S_DRVBLT_DEST_FB         sDestFB;
    S_FI_BLITTRANSFORMATION     *psTransform;
} S_FI_BLITOP;

void bltFIBlit (S_FI_BLITOP sBiltOp);
void bltFIFill (S_FI_FILLOP sFillOp);

#ifdef  __cplusplus
}
#endif

#endif  // __BLT_H__