/******************************************************************************
* *
* M O D U L E D E F I N E *
* *
******************************************************************************/
#define IMGMGR_C
/******************************************************************************
* *
* C O M P I L E R D E F I N E D I N C L U D E F I L E S *
* *
******************************************************************************/
#include <stdlib.h>
#include <string.h>
/******************************************************************************
* *
* U S E R D E F I N E D I N C L U D E F I L E S *
* *
******************************************************************************/
#include "Common.h"
#include "XCore.h"
#include "XNutOS.h"
#include "XProFile.h"
#include "ImgMgr.h"
/******************************************************************************
* *
* L O C A L D E F I N E S *
* *
******************************************************************************/
#define IMAGE_NUM 12
#define UNUSE_BUFFER_HANDLE 0xff
/******************************************************************************
* *
* L O C A L T Y P E D E F S *
* *
******************************************************************************/
typedef struct
{
BYTE *pImage;
INT UseHandle;
}_ImageCtrl;
/******************************************************************************
* *
* L O C A L F U N C T I O N P R O T O T Y P E S *
* *
******************************************************************************/
/* None */
/******************************************************************************
* *
* L O C A L I N I T I A L I Z E D D A T A D E F I N I T I O N S *
* *
******************************************************************************/
STATIC _ImageCtrl *ImageCtrl = _NULL;
STATIC BYTE *ImgMgrBuf = _NULL;
/******************************************************************************
* *
* L O C A L U N I T I A L I Z E D D A T A D E F I N I T I O N S *
* *
******************************************************************************/
STATIC INT ImageNumber;
STATIC INT ImgMgrBufSize;
STATIC INT ImageBlockSize;
/******************************************************************************
*
* Function:
* InitialImgEng
*
* Description:
* This global function initializes the library subsystem for the Image Engine.
*
* Input:
* None
*
* Output:
* Return TRUE or FALSE.
*
******************************************************************************/
INT InitialImgEng(INT BufferSzie)
{
FLOAT data;
INT allign;
INT i;
if (ImageCtrl || ImgMgrBuf)
return FALSE;
if (GetProfileInt("LENGTH IMAGE", &data) && (INT)data >= 4)
BufferSzie = (INT)(data * TPH_DPI) * TPH_WIDTH_BYTE;
ImageNumber = IMAGE_NUM;
if (GetProfileInt("NUMBER IMAGE", &data) && (INT)data >= 1)
ImageNumber = (INT)data;
if ((ImageCtrl = malloc(ImageNumber * sizeof(_ImageCtrl))) == _NULL)
{
ImageNumber = 0;
return FALSE;
}
// must use the multiple of ImageNumber and DWORD
allign = ImageNumber * sizeof(DWORD);
ImgMgrBufSize = (BufferSzie + allign - 1) / allign * allign;
if ((ImgMgrBuf = malloc(ImgMgrBufSize)) == _NULL)
{
ImgMgrBufSize = 0;
return FALSE;
}
ImageBlockSize = ImgMgrBufSize / ImageNumber;
for (i = 0; i < ImageNumber; i++)
{
ImageCtrl[i].UseHandle = UNUSE_BUFFER_HANDLE;
ImageCtrl[i].pImage = ImgMgrBuf + (ImageBlockSize * i);
}
return TRUE;
}
/******************************************************************************
*
* Function:
* ReleaseImgEng
*
* Description:
* This global function release Image Engine.
*
* Input:
* None
*
* Output:
* None
*
******************************************************************************/
VOID ReleaseImgEng(VOID)
{
ImgMgrBufSize = 0;
ImageBlockSize = 0;
ImageNumber = 0;
free(ImgMgrBuf);
free(ImageCtrl);
}
/******************************************************************************
*
* Function:
* GetImgMgrBuf
*
* Description:
* This global function return image buffer point.
*
* Input:
* None
*
* Output:
* Return image engine buffer point
*
******************************************************************************/
VOID *GetImgMgrBuf(VOID)
{
return (VOID *)ImgMgrBuf;
}
/******************************************************************************
*
* Function:
* GetImgMgrBufSize
*
* Description:
* This global function return image buffer size.
*
* Input:
* None
*
* Output:
* Return image engine buffer size
*
******************************************************************************/
INT GetImgMgrBufSize(VOID)
{
return ImgMgrBufSize;
}
/******************************************************************************
*
* Function:
* AllocImageBuffer
*
* Description:
* This global function alloc image buffer.
*
* Input:
* ImageBuffer structure
* if Get Image Buffer success will set image point to pBuffer, handle
* number to UseHandle
*
* Output:
* Return TRUE or FALSE.
*
******************************************************************************/
BOOL AllocImageBuffer(_ImgBuf *pImgBuf)
{
BOOL ret;
INT NeedBlock , FreeBlock , FreeBlockStart;
INT i, imask;
NeedBlock = pImgBuf->iByteWidth * pImgBuf->iHeight;
NeedBlock = (NeedBlock + ImageBlockSize - 1) / ImageBlockSize;
imask = DisableInterrupt(MOTION_IMASK);
// check free block
FreeBlock = 0;
for (i = pImgBuf->iBufferHandle; i < ImageNumber; i++)
{
if (ImageCtrl[i].UseHandle == UNUSE_BUFFER_HANDLE)
{
if (FreeBlock == 0)
FreeBlockStart = i;
FreeBlock += 1;
if (FreeBlock == NeedBlock)
break;
}
else if (FreeBlock)
break;
}
if (FreeBlock != NeedBlock)
{
// Check the free block and start anew
FreeBlock = 0;
for (i = 0; i < ImageNumber; i++)
{
if (ImageCtrl[i].UseHandle == UNUSE_BUFFER_HANDLE)
{
if (FreeBlock == 0)
FreeBlockStart = i;
FreeBlock += 1;
if (FreeBlock == NeedBlock)
break;
}
else if (FreeBlock)
break;
}
}
// if need block enough
if (FreeBlock == NeedBlock)
{
// set image point
pImgBuf->iBufferHandle = FreeBlockStart;
pImgBuf->pDriverImgPtr = pImgBuf->pBuffer = ImageCtrl[FreeBlockStart].pImage;
// set use flag
for (i = FreeBlockStart; i < (FreeBlockStart + NeedBlock); i++)
ImageCtrl[i].UseHandle = FreeBlockStart;
ret = TRUE;
}
else
ret = FALSE;
EnableInterrupt(imask);
return ret;
}
/******************************************************************************
*
* Function:
* FreeImageBuffer
*
* Description:
* This global function release Image Engine.
*
* Input:
* ImageBuffer structure
*
* Output:
*
******************************************************************************/
VOID FreeImageBuffer(_ImgBuf *pImgBuf)
{
INT i;
for (i = 0; i < ImageNumber; i++)
{
if (ImageCtrl[i].UseHandle == pImgBuf->iBufferHandle)
ImageCtrl[i].UseHandle = UNUSE_BUFFER_HANDLE;
}
}
/******************************************************************************
*
* Function:
* ReallocImageBuffer
*
* Description:
*
*
* Input:
*
*
* Output:
*
*
******************************************************************************/
VOID ReallocImageBuffer(_ImgBuf *pImgBuf, WORD Height)
{
INT BackupHeight = pImgBuf->iHeight;
if (pImgBuf->iHeight == Height)
return;
FreeImageBuffer(pImgBuf);
if (Height > MAX_IMAGE_LENGTH)
Height = MAX_IMAGE_LENGTH;
pImgBuf->iHeight = Height;
while (!AllocImageBuffer(pImgBuf))
NutSleep(10);
if (pImgBuf->iLastLine > pImgBuf->iHeight - 1)
pImgBuf->iLastLine = pImgBuf->iHeight - 1;
if (pImgBuf->iHeight > BackupHeight)
memset(pImgBuf->pBuffer + BackupHeight * pImgBuf->iByteWidth, 0,
(pImgBuf->iHeight - BackupHeight) * pImgBuf->iByteWidth);
}
/******************************************************************************
*
* Function:
* ClearImageBuffer
*
* Description:
* This global function Clear Image Engine.
*
* Input:
* ImageBuffer structure
*
* Output:
* None.
*
******************************************************************************/
VOID ClearImageBuffer(_ImgBuf *pImgBuf)
{
memset(pImgBuf->pBuffer, 0, pImgBuf->iByteWidth * pImgBuf->iHeight);
pImgBuf->iFirstLine = pImgBuf->iHeight - 1;
pImgBuf->iLastLine = 0;
}
/******************************************************************************
*
* Function:
* IsEnoughImageBuffer
*
* Description:
* This global function Check the buffer is enough.
*
* Input:
* ImageBuffer structure
*
* Output:
* Return TRUE or FALSE.
*
******************************************************************************/
BOOL IsEnoughImageBuffer(_ImgBuf *pUse, _ImgBuf *pWant)
{
INT WantBlock = (pWant->iByteWidth * pWant->iHeight + ImageBlockSize - 1) / ImageBlockSize;
INT FreeBlock = 0;
INT i;
for (i = 0; i < ImageNumber; i++)
{
FreeBlock += 1;
if (ImageCtrl[i].UseHandle == pUse->iBufferHandle)
FreeBlock = 0;
if (FreeBlock >= WantBlock)
return TRUE;
}
return FALSE;
}
ImgMgr.h 、
#ifndef IMGMGR_H
/******************************************************************************
* *
* M O D U L E D E F I N E *
* *
******************************************************************************/
#define IMGMGR_H
/******************************************************************************
* *
* C O M P I L E R D E F I N E D I N C L U D E F I L E S *
* *
******************************************************************************/
/* None */
/******************************************************************************
* *
* U S E R D E F I N E D I N C L U D E F I L E S *
* *
******************************************************************************/
#ifdef __cplusplus
extern "C" { /* Assume C declarations for C++ */
#endif /* __cplusplus */
#include "Common.h"
/******************************************************************************
* *
* G L O B A L D E F I N E S *
* *
******************************************************************************/
/* None */
/******************************************************************************
* *
* S T R U C T U R E D E F I N I T I O N S *
* *
******************************************************************************/
typedef struct
{
SHORT iX; // X coordinate
SHORT iY; // Y coordinate
}_Coord;
typedef struct
{
BYTE *pBuffer; // Image Point
BYTE *pDriverImgPtr; // Imgae Point for driver
INT iBufferHandle; // Image Buffer Handle
SHORT iWidth; // Image Width
SHORT iHeight; // Image Height
SHORT iByteWidth; // Image Width Byte
SHORT iFirstLine; // Imgae Buffer First Draw Line
SHORT iLastLine; // Imgae Buffer Last Draw Line
}_ImgBuf;
typedef struct
{
SHORT iX;
SHORT iY;
SHORT iWidth;
SHORT iHeight;
}_EraseBox;
typedef enum
{
CLEAR_LABEL_IMAGE,
CLEAR_FULL_IMAGE,
}_eClsImgMode;
/******************************************************************************
* *
* G L O B A L V A R I A B L E S - N O I N I T I A L I Z E R S *
* *
******************************************************************************/
/* None */
/******************************************************************************
* *
* G L O B A L V A R I A B L E S - I N I T I A L I Z E R S *
* *
******************************************************************************/
/* None */
/******************************************************************************
* *
* F U N C T I O N P R O T O T Y P E S *
* *
******************************************************************************/
INT InitialImgEng(INT);
VOID ReleaseImgEng(VOID);
VOID *GetImgMgrBuf(VOID);
INT GetImgMgrBufSize(VOID);
BOOL AllocImageBuffer(_ImgBuf *);
VOID FreeImageBuffer(_ImgBuf *);
VOID ReallocImageBuffer(_ImgBuf *, WORD);
VOID ClearImageBuffer(_ImgBuf *);
BOOL IsEnoughImageBuffer(_ImgBuf *, _ImgBuf *);
#ifdef __cplusplus
} /* End of extern "C" { */
#endif /* __cplusplus */
#endif