T168_Backup\T168_111\appl\ImgMgr文件:ImgMgr.c

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

  • 16
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值