T168_Backup\T168_111\appl\Graphic文件:

BMP.c  //

/******************************************************************************
 *                                                                            *
 *                         M O D U L E   D E F I N E                          *
 *                                                                            *
 ******************************************************************************/

#define BMP_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         *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *            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 "XFileSys.h"
#include "XGraphic.h"
#include "BMP.h"

/******************************************************************************
 *                                                                            *
 *                         L O C A L   D E F I N E S                          *
 *                                                                            *
 ******************************************************************************/
 

/******************************************************************************
 *                                                                            *
 *                        L O C A L   T Y P E D E F S                         *
 *                                                                            *
 ******************************************************************************/

/******************02-08-99 10:44********************/
/* decode BMP                                        */
/*                                                    */
/* 1. 2 color                                        */
/* 2. 256 color change to 2 color                    */
/*                                                    */
/****************************************************/
typedef struct
{
    WORD    wIdentWord;
    DWORD    dFileSize;
    WORD    wRev;
    WORD    wRev1;
    DWORD    dOffset;

    DWORD    dSize;
    DWORD    dWidth;
    DWORD    dHeight;
    WORD    wPlanes;
    WORD    wBitCount;
    DWORD    dCompression;
    DWORD    dSizeImage;
    DWORD    dXPelsPerMeter;
    DWORD    dYPelsPerMeter;
    DWORD    dClrUsed;
    DWORD    dClrImportant;
}_BMP_Header;

typedef struct
{
    INT  iImageWidth;
    INT  iImageHeight;
    INT  iUseWidth;
    INT  iUseHeight;
    INT  iImageWidthByte;
    INT  iDataWidthByte;
    INT  iUseWidthByte;
    BYTE abPalette[256];
    BYTE bEndFlag;
    BYTE bShiftBit;
    BYTE bShiftBit1;
     BYTE bShiftData;
    BYTE bRemoveData;
     BYTE bRemoveMaskBit;
    BYTE bShiftMaskData;
    BYTE bRemoveMaskData;
}_BMP_Data;

/******************************************************************************
 *                                                                            *
 *             L O C A L   F U N C T I O N   P R O T O T Y P E S              *
 *                                                                            *
 ******************************************************************************/

INT BMPmain(_BMPAttr *sBMPattr);
INT BITMAP(_BMPAttr *sBMPAttr);
INT get_lineB8(BYTE *pbBuf, _BMP_Data *sBMP_Data);
INT decode_BMP1(_BMPAttr *sBMPAttr);
INT decode_BMP8(_BMPAttr *sBMPAttr);

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

/* None */

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

_FileHandle *FBMP;
_BMP_Header sBMP_Header;
BYTE abBMP_Buffer[1024], abBuf[1024 + 0x3F];

/******************************************************************************
 *
 * Function:
 *    
 *
 * Description: 
 *        
 *
 * Input:
 *      None
 *
 * Output:
 *      None.
 *
 ******************************************************************************/
INT get_lineB8(BYTE *pbBuf, _BMP_Data *sBMP_Data)
{
    INT i;
    BYTE *pbPtr, *pbPalette, bBit;

    *pbBuf = 0;
    bBit = 0x80;
    pbPalette = sBMP_Data->abPalette;    

    if ( Fread(abBMP_Buffer, sizeof(BYTE), sBMP_Data->iUseWidth, FBMP) != sBMP_Data->iUseWidth )
        return _ERROR;

    pbPtr = abBMP_Buffer;   
    for ( i = 0 ; i < sBMP_Data->iUseWidth ; i++ )
    {
        if ( *(pbPalette + *pbPtr) == 1 )
            *pbBuf |= bBit;

          pbPtr += 1;
        bBit >>= 1;

        if ( bBit == 0 )
        {
            bBit = 0x80;
            pbBuf += 1;
            *pbBuf = 0;
        }
    }
   
    if ( (sBMP_Data->iDataWidthByte - sBMP_Data->iUseWidth) > 0 )
    {
        i = sBMP_Data->iDataWidthByte - sBMP_Data->iUseWidth;
        if ( Fread(abBMP_Buffer, sizeof(BYTE), i, FBMP) != i )
            return _ERROR;
    }
    return _SUCCESS;
}

INT decode_BMP8(_BMPAttr *sBMPAttr)
{
    BYTE *pbImagePtr, *pbTemp, *pbPalette, bData;
    INT i, j;
    DWORD dOffset;
    _BMP_Data sBMP_Data;

    if ( (sBMP_Data.iImageWidth = sBMP_Header.dWidth) <= 0 )
        return _ERROR;
    if ( (sBMP_Data.iImageHeight = sBMP_Header.dHeight) <= 0 )
        return _ERROR;

    if ( Fread(abBMP_Buffer, sizeof(BYTE), 1024, FBMP) != 1024 )    // 256 * 4 = 1024
        return _ERROR;

    // Get Palette
    pbTemp = abBMP_Buffer;
    pbPalette = sBMP_Data.abPalette; 
    for ( i = 0 ; i < 256 ; i++ )
    {
        if ( ((*pbTemp+0) + (*pbTemp+1) + (*pbTemp+2)) > 384 )   // 256 * 3 / 2 = 384
            *pbPalette = 0;
        else
            *pbPalette = 1;

        pbPalette += 1;
        pbTemp += 4;
    }

    // ImageWidthByte & DataWidthByte
    sBMP_Data.iImageWidthByte = sBMP_Data.iImageWidth;
    sBMP_Data.iDataWidthByte = sBMP_Data.iImageWidth;
    i = sBMP_Data.iDataWidthByte % 4;
    if ( i != 0 )
        sBMP_Data.iDataWidthByte += (4 - i);

    // UseWidth & UseWidthByte
    if ( (sBMPAttr->sCoord.iX + sBMP_Data.iImageWidth) > sBMPAttr->psImageBuffer->iWidth )
    {
        sBMP_Data.bEndFlag = 1;
        sBMP_Data.iUseWidth = sBMPAttr->psImageBuffer->iWidth - sBMPAttr->sCoord.iX;
        if ( sBMP_Data.iUseWidth <= 0 )
            return _SUCCESS;

        if ( (sBMP_Data.iUseWidth % 8) > 0 )
            sBMP_Data.iUseWidthByte = sBMP_Data.iUseWidth / 8 + 1;
        else
            sBMP_Data.iUseWidthByte = sBMP_Data.iUseWidth / 8;
    }
    else
    {
        sBMP_Data.bEndFlag = 0;
        sBMP_Data.iUseWidth = sBMP_Data.iImageWidth;

        if ( (sBMP_Data.iImageWidth % 8) > 0 )
            sBMP_Data.iUseWidthByte = sBMP_Data.iUseWidth / 8 + 1;
        else
            sBMP_Data.iUseWidthByte = sBMP_Data.iUseWidth / 8;
    }

    // Shift Bit
      sBMP_Data.bShiftBit = (BYTE)(sBMPAttr->sCoord.iX % 8);
    sBMP_Data.bShiftBit1 = 8 - sBMP_Data.bShiftBit;

    // UseHeight
    if ( (sBMPAttr->sCoord.iY + sBMP_Data.iImageHeight) > sBMPAttr->psImageBuffer->iHeight )
    {
        sBMP_Data.iUseHeight = sBMPAttr->psImageBuffer->iHeight - sBMPAttr->sCoord.iY;
        if ( sBMP_Data.iUseHeight <= 0 )
            return _SUCCESS;
    }
    else
    {
        sBMP_Data.iUseHeight = sBMP_Data.iImageHeight;
    }

    // The Last Line
    //if ( (i = sBMPAttr->sCoord.iY + sBMP_Data.iUseHeight) > sBMPAttr->psImageBuffer->iLastLine )
    //    sBMPAttr->psImageBuffer->iLastLine = i;
    ModifyImgSection(sBMPAttr->sCoord.iY, sBMP_Data.iUseHeight, sBMPAttr->psImageBuffer);  

   // Image Offset
    dOffset = (DWORD)(sBMPAttr->psImageBuffer->iByteWidth *
                             (sBMPAttr->sCoord.iY + sBMP_Data.iUseHeight - 1) + sBMPAttr->sCoord.iX / 8);

    if ((sBMP_Data.iImageHeight - sBMP_Data.iUseHeight) > 0 )
    {
        // sizeof(sBMP_Header) - 2 + 4 * 256 = 54 + 1024 = 1078
        if ( Fseek(FBMP, 1078 + (sBMP_Data.iImageHeight - sBMP_Data.iUseHeight)
                              * sBMP_Data.iDataWidthByte, SEEK_SET) != 0 )
            return _ERROR;
    }

    // Get Data & Put Data
    sBMP_Data.bShiftData = 0;
    if ( sBMP_Data.bShiftBit == 0 )
    {
        for ( j = 0 ; j < sBMP_Data.iUseHeight ; j++ )
        {
            if ( get_lineB8(abBuf, &sBMP_Data) == _ERROR )
                return _ERROR;

            pbTemp = abBuf;
            pbImagePtr = sBMPAttr->psImageBuffer->pBuffer + dOffset;
            for ( i = 0 ; i < sBMP_Data.iUseWidthByte ; i++ )
            {
                *pbImagePtr |= *pbTemp;
                pbImagePtr += 1;
                pbTemp += 1;
            }
            dOffset -= sBMPAttr->psImageBuffer->iByteWidth;
        }
    }
    else
    {
        for ( j = 0 ; j < sBMP_Data.iUseHeight ; j++ )
        {
            if ( get_lineB8(abBuf, &sBMP_Data) == _ERROR )
                return _ERROR;

            pbTemp = abBuf;
            pbImagePtr = sBMPAttr->psImageBuffer->pBuffer + dOffset;
            for ( i = 0 ; i < sBMP_Data.iUseWidthByte ; i++ )
            {
                bData = *pbTemp;
                *pbImagePtr |= ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
                sBMP_Data.bShiftData = bData << sBMP_Data.bShiftBit1;
                pbImagePtr += 1;
                pbTemp += 1;
            }

            if ( sBMP_Data.bEndFlag == 0 )
                *pbImagePtr |= sBMP_Data.bShiftData;

            sBMP_Data.bShiftData = 0;
            dOffset -= sBMPAttr->psImageBuffer->iByteWidth;
        }
    }
    return _SUCCESS;
}

INT decode_BMP1(_BMPAttr *sBMPAttr)
{
    _BMP_Data sBMP_Data;
    BYTE *pbImagePtr, *pbTemp, bData;
    DWORD dOffset;
    INT i, j;

    if ( Fread(abBuf, sizeof(BYTE), 8, FBMP) != 8 )
        return _ERROR;

    if ( (sBMP_Data.iImageWidth = sBMP_Header.dWidth) <= 0 )
        return _ERROR;
    if ( (sBMP_Data.iImageHeight = sBMP_Header.dHeight) <= 0 )
        return _ERROR;

    // ImageWidthByte & Remove Bit
    if ( sBMP_Data.iImageWidth % 8 == 0 )
    {
        sBMP_Data.iImageWidthByte = sBMP_Data.iImageWidth / 8;
        sBMP_Data.bRemoveData = 0xFF;
    }
    else
    {
        sBMP_Data.iImageWidthByte = sBMP_Data.iImageWidth / 8 + 1;
        sBMP_Data.bRemoveData = 0xFF << (8 - sBMP_Data.iImageWidth % 8);
    }

    // DataWidthByte
    i = sBMP_Data.iImageWidthByte % 4;
    if ( i == 0 )
        sBMP_Data.iDataWidthByte = sBMP_Data.iImageWidthByte;
    else
        sBMP_Data.iDataWidthByte = sBMP_Data.iImageWidthByte + (4 - i);

    // UseWidth & UseWidthByte
    if ( (sBMPAttr->sCoord.iX + sBMP_Data.iImageWidth) > sBMPAttr->psImageBuffer->iWidth )
    {
        sBMP_Data.bEndFlag = 1;
        sBMP_Data.iUseWidth = sBMPAttr->psImageBuffer->iWidth - sBMPAttr->sCoord.iX;
        if ( sBMP_Data.iUseWidth <= 0 )
            return _SUCCESS;

        if ( (sBMP_Data.iUseWidth % 8 ) > 0 )
            sBMP_Data.iUseWidthByte = sBMP_Data.iUseWidth / 8 + 1;
        else
            sBMP_Data.iUseWidthByte = sBMP_Data.iUseWidth / 8;
    }
    else
    {
        sBMP_Data.bEndFlag = 0;
        sBMP_Data.iUseWidthByte = sBMP_Data.iImageWidthByte;
    }

    // Shift Bit
    sBMP_Data.bShiftBit = (BYTE)(sBMPAttr->sCoord.iX % 8);
    sBMP_Data.bShiftBit1 = 8 - sBMP_Data.bShiftBit;

    // UseHeight
    if ( (sBMPAttr->sCoord.iY + sBMP_Data.iImageHeight) > sBMPAttr->psImageBuffer->iHeight )
    {
        sBMP_Data.iUseHeight = sBMPAttr->psImageBuffer->iHeight - sBMPAttr->sCoord.iY;
        if ( sBMP_Data.iUseHeight <= 0 )
            return _SUCCESS;
    }
    else
        sBMP_Data.iUseHeight = sBMP_Data.iImageHeight;

    // The Last Line
    //if ( (i = sBMPAttr->sCoord.iY + sBMP_Data.iUseHeight) > sBMPAttr->psImageBuffer->iLastLine )
    //    sBMPAttr->psImageBuffer->iLastLine = i;
    ModifyImgSection(sBMPAttr->sCoord.iY, sBMP_Data.iUseHeight, sBMPAttr->psImageBuffer);

    dOffset = (DWORD)(sBMPAttr->psImageBuffer->iByteWidth * 
                             (sBMPAttr->sCoord.iY + sBMP_Data.iUseHeight - 1) + sBMPAttr->sCoord.iX / 8);

    if ((sBMP_Data.iImageHeight - sBMP_Data.iUseHeight) > 0 )
    {
        Fseek(FBMP, sizeof(sBMP_Header) - 2 + 8 + (sBMP_Data.iImageHeight - sBMP_Data.iUseHeight)
                    * sBMP_Data.iDataWidthByte, SEEK_SET);
    }

#if defined(TSPL_VER_1)    // AND
    sBMP_Data.bRemoveMaskBit = ( sBMPAttr->sCoord.iX + sBMP_Data.iImageWidth ) % 8;
    if ( sBMP_Data.bRemoveMaskBit == 0 )
        sBMP_Data.bRemoveMaskData = 0;
    else
        sBMP_Data.bRemoveMaskData = 0xFF >> sBMP_Data.bRemoveMaskBit;
#endif

    // Get Data & Put Data
    sBMP_Data.bShiftData = 0;
    if ( sBMP_Data.bShiftBit == 0 )
    {
        for ( j = 0 ; j < sBMP_Data.iUseHeight ; j++ )
        {
            if ( Fread(abBuf, sizeof(BYTE), sBMP_Data.iUseWidthByte, FBMP) != sBMP_Data.iUseWidthByte )
                return _ERROR;

            pbTemp = abBuf;
            pbImagePtr = sBMPAttr->psImageBuffer->pBuffer + dOffset;

#if defined(TSPL_VER_1)    // AND
            for ( i = 0; i < sBMP_Data.iUseWidthByte - 1 ; i++ )
                *pbImagePtr++ = ~(*pbTemp++);

            i += 1;
            if ( i == sBMP_Data.iImageWidthByte )
            {
                *pbImagePtr &= sBMP_Data.bRemoveMaskData;
                *pbImagePtr |= ((~(*pbTemp)) & sBMP_Data.bRemoveData);
            }
            else
                *pbImagePtr = ~(*pbTemp);
#else
            for ( i = 0; i < sBMP_Data.iUseWidthByte - 1 ; i++ )
                *pbImagePtr++ |= ~(*pbTemp++);

            i += 1;
            if ( i == sBMP_Data.iImageWidthByte )
                *pbImagePtr |= ((~(*pbTemp)) & sBMP_Data.bRemoveData);
            else
                *pbImagePtr |= ~(*pbTemp);
#endif
            if ( sBMP_Data.iUseWidthByte < sBMP_Data.iDataWidthByte )
            {
                i = sBMP_Data.iDataWidthByte - sBMP_Data.iUseWidthByte;
                if ( Fread(abBuf, sizeof(BYTE), i, FBMP) != i )
                    return _ERROR;
            }
            dOffset -= sBMPAttr->psImageBuffer->iByteWidth;
        }
    }
    else
    {

#if defined(TSPL_VER_1)    // AND
        sBMP_Data.bShiftMaskData = 0xFF << sBMP_Data.bShiftBit1;
        if ( (sBMP_Data.bShiftBit + sBMP_Data.iImageWidth) <= 8 )
            sBMP_Data.bRemoveMaskData |= sBMP_Data.bShiftMaskData;
#endif
        for ( j = 0 ; j < sBMP_Data.iUseHeight ; j++ )
        {
            if ( Fread(abBuf, sizeof(BYTE), sBMP_Data.iUseWidthByte, FBMP) != sBMP_Data.iUseWidthByte )
                return _ERROR;

            pbTemp = abBuf;
            pbImagePtr = sBMPAttr->psImageBuffer->pBuffer + dOffset;

#if defined(TSPL_VER_1)    // AND
            if ( sBMP_Data.iUseWidthByte != 1 )
            {
                bData = ~(*pbTemp);
                *pbImagePtr &= sBMP_Data.bShiftMaskData;
                *pbImagePtr |= (bData >> sBMP_Data.bShiftBit);
                sBMP_Data.bShiftData = bData << sBMP_Data.bShiftBit1;
                pbImagePtr += 1;
                pbTemp += 1;

                for ( i = 1 ; i < sBMP_Data.iUseWidthByte - 1 ; i++ )
                {
                    bData = ~(*pbTemp);
                    *pbImagePtr = ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
                    sBMP_Data.bShiftData = bData << sBMP_Data.bShiftBit1;
                    pbImagePtr += 1;
                    pbTemp += 1;
                }
            }
            else    // sBMP_Data.iUseWidthByte == 1
                i = 0;

            i += 1;
            if ( i == sBMP_Data.iImageWidthByte )        // sBMP_Data.bEndFlag == 0
            {
                bData = (~(*pbTemp)) & sBMP_Data.bRemoveData;
                if (sBMP_Data.bShiftBit1 >= (sBMP_Data.iImageWidth % 8) && (sBMP_Data.iImageWidth % 8) != 0)
                {
                    *pbImagePtr &= sBMP_Data.bRemoveMaskData;
                    *pbImagePtr |= ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
                }
                else
                {
                    if ( sBMP_Data.iUseWidthByte != 1 )
                        *pbImagePtr = ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
                    else
                    {
                        *pbImagePtr &= sBMP_Data.bShiftMaskData;
                        *pbImagePtr |= (bData >> sBMP_Data.bShiftBit);
                    }
                    sBMP_Data.bShiftData = bData << sBMP_Data.bShiftBit1;
                    pbImagePtr += 1;

                    if ( sBMP_Data.bEndFlag == 0 )
                    {
                        *pbImagePtr &= sBMP_Data.bRemoveMaskData;
                        *pbImagePtr |= sBMP_Data.bShiftData;
                    }
                }
            }
            else                                        // sBMP_Data.bEndFlag == 1
            {
                  bData = ~(*pbTemp);
                *pbImagePtr &= ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
            }
#else
            for ( i = 0 ; i < sBMP_Data.iUseWidthByte - 1 ; i++ )
            {
                bData = ~(*pbTemp);
                *pbImagePtr |= ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
                sBMP_Data.bShiftData = bData << sBMP_Data.bShiftBit1;
                pbImagePtr += 1;
                pbTemp += 1;
            }
            i += 1;
            if ( i == sBMP_Data.iImageWidthByte )        // sBMP_Data.bEndFlag == 0
                bData = (~(*pbTemp)) & sBMP_Data.bRemoveData;   
            else                                        // sBMP_Data.bEndFlag == 1
                  bData = ~(*pbTemp);

            *pbImagePtr |= ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
            sBMP_Data.bShiftData = bData << sBMP_Data.bShiftBit1;
            pbImagePtr += 1;

            if ( sBMP_Data.bEndFlag == 0 )
                *pbImagePtr |= sBMP_Data.bShiftData;
#endif

            if ( sBMP_Data.iUseWidthByte < sBMP_Data.iDataWidthByte )
            {
                i = sBMP_Data.iDataWidthByte - sBMP_Data.iUseWidthByte;
                if ( Fread(abBuf, sizeof(BYTE), i, FBMP) != i )
                    return _ERROR;
            }
            sBMP_Data.bShiftData = 0;
            dOffset -= sBMPAttr->psImageBuffer->iByteWidth;
        }
    }
    return _SUCCESS;
}

INT BMPmain(_BMPAttr *sBMPAttr)
{
    BYTE *pbTemp;

    while ( 1 )
    {
        if ( ( FBMP = Fopen(DRAM_DEVICE, (CHAR *)sBMPAttr->pbFileName, "r") ) != _NULL ){}
        else if ( ( FBMP = Fopen(FLASH_DEVICE, (CHAR *)sBMPAttr->pbFileName, "r") ) != _NULL ){}
        else if ( ( FBMP = Fopen(CARD_DEVICE, (CHAR *)sBMPAttr->pbFileName, "r") ) != _NULL ){}
        if ( FBMP == _NULL )
            break;

        /* get the header -- Start */
        pbTemp = (BYTE *)&sBMP_Header;
        if ( Fread(pbTemp, sizeof(BYTE), 2, FBMP) != 2 )
            break;
        pbTemp += 4;

#if defined(BIG_ENDIAN)
        sBMP_Header.wIdentWord = (sBMP_Header.wIdentWord >> 8) + (sBMP_Header.wIdentWord << 8);
#endif
        if ( sBMP_Header.wIdentWord != 0x4D42 )
            break;
        if ( Fread(pbTemp, sizeof(BYTE), sizeof(sBMP_Header) - 4, FBMP) != sizeof(sBMP_Header) - 4 )
            break;

#if defined(BIG_ENDIAN)
        sBMP_Header.dWidth = (sBMP_Header.dWidth >> 24) + ((sBMP_Header.dWidth >> 8)&0x0000FF00) +
                                    ((sBMP_Header.dWidth << 8)&0x00FF0000) + (sBMP_Header.dWidth << 24);
        sBMP_Header.dHeight = (sBMP_Header.dHeight >> 24) + ((sBMP_Header.dHeight >> 8)&0x0000FF00) +
                                    ((sBMP_Header.dHeight << 8)&0x00FF0000) + (sBMP_Header.dHeight << 24);
        sBMP_Header.wBitCount = (sBMP_Header.wBitCount >> 8) + (sBMP_Header.wBitCount << 8);
#endif    
        /* get the header -- End */

        ModifyImgSection( sBMPAttr->sCoord.iY, sBMP_Header.dHeight, sBMPAttr->psImageBuffer);  

        switch (sBMP_Header.wBitCount)
        {
            case 0x01:     // 2 color
            {
                if ( decode_BMP1(sBMPAttr) == _ERROR )
                {
                    Fclose(FBMP);
                    return _ERROR;
                }
                break;
            }
            case 0x08:     // 256 color
            {
                if ( decode_BMP8(sBMPAttr) == _ERROR )
                {
                    Fclose(FBMP);
                    return _ERROR;
                }
                break;
            }
            default:        // not support the mode
                break;
        }
        Fclose(FBMP);
        return _SUCCESS;
    }
    Fclose(FBMP);
    return _ERROR;
}


INT BITMAP(_BMPAttr *psBMPAttr)
{
    BYTE *pbImagePtr, bData;
    INT i, j;
    DWORD dOffset;
    _BMP_Data sBMP_Data;

    if ( (sBMP_Data.iImageWidth = psBMPAttr->iImageWidth) <= 0 )
        return _ERROR;        
    if ( (sBMP_Data.iImageHeight = psBMPAttr->iImageHeight) <= 0 )
        return _ERROR;

    // ImageWidthByte
    if ( sBMP_Data.iImageWidth % 8 == 0 )
    {
        sBMP_Data.iImageWidthByte = sBMP_Data.iImageWidth / 8;
        sBMP_Data.bRemoveData = 0xFF;
    }
    else
    {
        sBMP_Data.iImageWidthByte = sBMP_Data.iImageWidth / 8 + 1;
        sBMP_Data.bRemoveData = 0xFF << (8 - sBMP_Data.iImageWidth % 8);
    }
   
    // UseWidth & UseWidthByte
    if ( (psBMPAttr->sCoord.iX + sBMP_Data.iImageWidth) > psBMPAttr->psImageBuffer->iWidth )
    {
        sBMP_Data.bEndFlag = 1;
        sBMP_Data.iUseWidth = psBMPAttr->psImageBuffer->iWidth - psBMPAttr->sCoord.iX;
        if ( sBMP_Data.iUseWidth <= 0 )
            return _ERROR;

        if ( (sBMP_Data.iUseWidth % 8 ) > 0 )
            sBMP_Data.iUseWidthByte = sBMP_Data.iUseWidth / 8 + 1;
        else
            sBMP_Data.iUseWidthByte = sBMP_Data.iUseWidth / 8;
    }
    else
    {
        sBMP_Data.bEndFlag = 0;
        sBMP_Data.iUseWidthByte = sBMP_Data.iImageWidthByte;
    }

    // Shift Bit
//    sBMP_Data.bShiftBit = (BYTE)(psBMPAttr->sCoord.iX % 8); // ch_20220523
    sBMP_Data.bShiftBit = (BYTE)(abs(psBMPAttr->sCoord.iX) % 8); // ch_20220523    
    sBMP_Data.bShiftBit1 = 8 - sBMP_Data.bShiftBit;

    // UseHeight
    if ( (psBMPAttr->sCoord.iY + sBMP_Data.iImageHeight) > psBMPAttr->psImageBuffer->iHeight )
    {
        sBMP_Data.iUseHeight = psBMPAttr->psImageBuffer->iHeight - psBMPAttr->sCoord.iY;

        if ( sBMP_Data.iUseHeight <= 0 )
            return _ERROR;
    }
    else
        sBMP_Data.iUseHeight = sBMP_Data.iImageHeight;


    ModifyImgSection( psBMPAttr->sCoord.iY, sBMP_Data.iUseHeight, psBMPAttr->psImageBuffer);

    // Image Offset
    dOffset = (DWORD)(psBMPAttr->psImageBuffer->iByteWidth * psBMPAttr->sCoord.iY + psBMPAttr->sCoord.iX / 8);

    // Decode Data & Put Data
    sBMP_Data.bShiftData = 0;
    if ( psBMPAttr->iMode == 1 )   // OR
    {
        if ( sBMP_Data.bShiftBit == 0 )
        {
            for ( j = 0 ; j < sBMP_Data.iUseHeight ; j++ )
            {
                pbImagePtr = psBMPAttr->psImageBuffer->pBuffer + dOffset;
                for ( i = 0; i < sBMP_Data.iUseWidthByte - 1 ; i++ )
                {
                    *pbImagePtr |= (~ psBMPAttr->ReadByte());
                    pbImagePtr += 1;
                }

                i += 1;
                if ( i == sBMP_Data.iImageWidthByte )
                    *pbImagePtr |= ((~ psBMPAttr->ReadByte()) & sBMP_Data.bRemoveData);
                else
                    *pbImagePtr |= (~ psBMPAttr->ReadByte());

                for ( ; i < sBMP_Data.iImageWidthByte ; i++ )
                    (~ psBMPAttr->ReadByte());

                dOffset += psBMPAttr->psImageBuffer->iByteWidth;
            }
        }
        else
        {
            for ( j = 0 ; j < sBMP_Data.iUseHeight ; j++ )
            {
                pbImagePtr = psBMPAttr->psImageBuffer->pBuffer + dOffset;
                for ( i = 0 ; i < sBMP_Data.iUseWidthByte - 1 ; i++ )
                {
                    bData = (~ psBMPAttr->ReadByte());
                    *pbImagePtr |= ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
                    sBMP_Data.bShiftData = bData << sBMP_Data.bShiftBit1;
                    pbImagePtr += 1;
                }
       
                i += 1;
                if ( i == sBMP_Data.iImageWidthByte )  // sBMP_Data.bEndFlag == 0
                    bData = ((~ psBMPAttr->ReadByte()) & sBMP_Data.bRemoveData);
                else                                   // sBMP_Data.bEndFlag == 1
                    bData = (~ psBMPAttr->ReadByte());

                *pbImagePtr |= ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
                if ( sBMP_Data.bEndFlag != 0 )
                    *(psBMPAttr->psImageBuffer->pBuffer + dOffset + psBMPAttr->psImageBuffer->iByteWidth) |= ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
                sBMP_Data.bShiftData = bData << sBMP_Data.bShiftBit1;
                pbImagePtr += 1;

                if ( sBMP_Data.bEndFlag == 0 )
                    *pbImagePtr |= sBMP_Data.bShiftData;

                for ( ; i < sBMP_Data.iImageWidthByte ; i++ )
                    (~ psBMPAttr->ReadByte());

                sBMP_Data.bShiftData = 0;
                dOffset += psBMPAttr->psImageBuffer->iByteWidth;
            }
        }
    }
    else if ( psBMPAttr->iMode == 0 )      // AND
    {  
        sBMP_Data.bRemoveMaskBit = (psBMPAttr->sCoord.iX + sBMP_Data.iImageWidth) % 8;
        if ( sBMP_Data.bRemoveMaskBit == 0 )
            sBMP_Data.bRemoveMaskData = 0;
        else 
            sBMP_Data.bRemoveMaskData = 0xFF >> sBMP_Data.bRemoveMaskBit;

        if ( sBMP_Data.bShiftBit == 0 )
        {
            for ( j = 0 ; j < sBMP_Data.iUseHeight ; j++ )
            {
                pbImagePtr = psBMPAttr->psImageBuffer->pBuffer + dOffset;
                for ( i = 0; i < sBMP_Data.iUseWidthByte - 1 ; i++ )
                {
                    *pbImagePtr = (~ psBMPAttr->ReadByte());
                    pbImagePtr += 1;
                }

                i += 1;
                if ( i == sBMP_Data.iImageWidthByte )
                {
                    *pbImagePtr &= sBMP_Data.bRemoveMaskData;
                    *pbImagePtr |= ((~ psBMPAttr->ReadByte()) & sBMP_Data.bRemoveData);
                }
                else
                    *pbImagePtr = (~ psBMPAttr->ReadByte());

                for ( ; i < sBMP_Data.iImageWidthByte ; i++ )
                   (~ psBMPAttr->ReadByte());

                 dOffset += psBMPAttr->psImageBuffer->iByteWidth;
            }
        }
        else
        {
            sBMP_Data.bShiftMaskData = 0xFF << sBMP_Data.bShiftBit1;
            if ( (sBMP_Data.bShiftBit + sBMP_Data.iImageWidth) <= 8 )
                sBMP_Data.bRemoveMaskData |= sBMP_Data.bShiftMaskData;

            for ( j = 0 ; j < sBMP_Data.iUseHeight ; j++ )
            {
                pbImagePtr = psBMPAttr->psImageBuffer->pBuffer + dOffset;

                if ( sBMP_Data.iUseWidthByte != 1 )
                {
                    bData = (~ psBMPAttr->ReadByte());
                    *pbImagePtr &= sBMP_Data.bShiftMaskData;
                    *pbImagePtr |= (bData >> sBMP_Data.bShiftBit);
                    sBMP_Data.bShiftData = bData << sBMP_Data.bShiftBit1;
                    pbImagePtr += 1;
                
                    for ( i = 1 ; i < sBMP_Data.iUseWidthByte - 1 ; i++ )
                    {
                        bData = (~ psBMPAttr->ReadByte());
                        *pbImagePtr = ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
                        sBMP_Data.bShiftData = bData << sBMP_Data.bShiftBit1;
                        pbImagePtr += 1;
                    }
                }
                else  // sBMP_Data.iUseWidthByte == 1
                    i = 0;

                i += 1;
                if ( i == sBMP_Data.iImageWidthByte )
                {
                    bData = ((~ psBMPAttr->ReadByte()) & sBMP_Data.bRemoveData);
                    if ((sBMP_Data.bShiftBit1 >= (sBMP_Data.iImageWidth % 8)) &&
                         ((sBMP_Data.iImageWidth % 8) != 0))    
                    {
                          *pbImagePtr &= sBMP_Data.bRemoveMaskData;
                        *pbImagePtr |= ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
                    }
                    else
                    {
                        if ( sBMP_Data.iUseWidthByte != 1 )
                            *pbImagePtr = ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
                        else
                        {
                            *pbImagePtr &= sBMP_Data.bShiftMaskData;
                            *pbImagePtr |= (bData >> sBMP_Data.bShiftBit);
                        }
                        sBMP_Data.bShiftData = bData << sBMP_Data.bShiftBit1;
                        pbImagePtr += 1;

                        if ( sBMP_Data.bEndFlag == 0 )
                        {
                           *pbImagePtr &= sBMP_Data.bRemoveMaskData;
                            *pbImagePtr |= sBMP_Data.bShiftData;
                        }
                    }
                }    
                else // sBMP_Data.bEndFlag == 1
                {
                    bData = (~ psBMPAttr->ReadByte());
                    *pbImagePtr &= ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
                }

                for ( ; i < sBMP_Data.iImageWidthByte ; i++ )
                   (~ psBMPAttr->ReadByte());

                  sBMP_Data.bShiftData = 0;
                dOffset += psBMPAttr->psImageBuffer->iByteWidth;
            }
        }
    }
    else if ( psBMPAttr->iMode == 2 ) // XOR
    {
        if ( sBMP_Data.bShiftBit == 0 )
        {
            for ( j = 0 ; j < sBMP_Data.iUseHeight ; j++ )
            {
                pbImagePtr = psBMPAttr->psImageBuffer->pBuffer + dOffset;
                for ( i = 0; i < sBMP_Data.iUseWidthByte - 1 ; i++ )
                {
                    *pbImagePtr ^= (~ psBMPAttr->ReadByte());
                    pbImagePtr += 1;
                }

                i += 1;
                if ( i == sBMP_Data.iImageWidthByte )
                    *pbImagePtr ^= ((~ psBMPAttr->ReadByte()) & sBMP_Data.bRemoveData);
                else
                    *pbImagePtr ^= (~ psBMPAttr->ReadByte());

                for ( ; i < sBMP_Data.iImageWidthByte ; i++ )
                   (~ psBMPAttr->ReadByte());

                dOffset += psBMPAttr->psImageBuffer->iByteWidth;
            }      
        }
        else
        {
            for ( j = 0 ; j < sBMP_Data.iUseHeight ; j++ )
            {
                pbImagePtr = psBMPAttr->psImageBuffer->pBuffer + dOffset;
                for ( i = 0 ; i < sBMP_Data.iUseWidthByte - 1 ; i++ )
                {
                    bData = (~ psBMPAttr->ReadByte());
                    *pbImagePtr ^= ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
                    sBMP_Data.bShiftData = bData << sBMP_Data.bShiftBit1;
                    pbImagePtr += 1;
                }
       
                i += 1;
                if ( i == sBMP_Data.iImageWidthByte )  // sBMP_Data.bEndFlag == 0
                    bData = ((~ psBMPAttr->ReadByte()) & sBMP_Data.bRemoveData);
                else                                   // sBMP_Data.bEndFlag == 1
                    bData = (~ psBMPAttr->ReadByte());
                    
                *pbImagePtr ^= ((bData >> sBMP_Data.bShiftBit) | sBMP_Data.bShiftData);
                sBMP_Data.bShiftData = bData << sBMP_Data.bShiftBit1;
                pbImagePtr += 1;

                if ( sBMP_Data.bEndFlag == 0 )
                    *pbImagePtr ^= sBMP_Data.bShiftData;

                for ( ; i < sBMP_Data.iImageWidthByte ; i++ )
                   (~ psBMPAttr->ReadByte());

                sBMP_Data.bShiftData = 0;
                dOffset += psBMPAttr->psImageBuffer->iByteWidth;
            }
        }
    }
    return _SUCCESS;
}

INT BMP_Info(_BMPAttr *psBMPAttr)
{
    BYTE *pbTemp;
    while( 1 )   
    {
        if ( ( FBMP = Fopen(DRAM_DEVICE, (CHAR *)psBMPAttr->pbFileName, "r") ) != _NULL ){}
        else if ( ( FBMP = Fopen(FLASH_DEVICE, (CHAR *)psBMPAttr->pbFileName, "r") ) != _NULL ){}
        else if ( ( FBMP = Fopen(CARD_DEVICE, (CHAR *)psBMPAttr->pbFileName, "r") ) != _NULL ){}
        if ( FBMP == _NULL )
            break;

        /* get the header -- Start */
        pbTemp = (BYTE *)&sBMP_Header;    
        if ( Fread(pbTemp, sizeof(BYTE), 2, FBMP) != 2 )
            break;
        pbTemp += 4;

#if defined(BIG_ENDIAN)
        sBMP_Header.wIdentWord = (sBMP_Header.wIdentWord >> 8) + (sBMP_Header.wIdentWord << 8);
#endif
        if ( sBMP_Header.wIdentWord != 0x4D42 )
            break;
        if ( Fread(pbTemp, sizeof(BYTE), sizeof(sBMP_Header) - 4, FBMP) != sizeof(sBMP_Header) - 4 )
            break;

#if defined(BIG_ENDIAN)
        psBMPAttr->iTotalWidth = (sBMP_Header.dWidth >> 24) + ((sBMP_Header.dWidth >> 8)&0x0000FF00) +
                                        ((sBMP_Header.dWidth << 8)&0x00FF0000) + (sBMP_Header.dWidth << 24);
        psBMPAttr->iTotalHeight = (sBMP_Header.dHeight >> 24) + ((sBMP_Header.dHeight >> 8)&0x0000FF00) +
                                        ((sBMP_Header.dHeight << 8)&0x00FF0000) + (sBMP_Header.dHeight << 24);
#elif defined(LITTLE_ENDIAN)
        psBMPAttr->iTotalWidth = sBMP_Header.dWidth;
        psBMPAttr->iTotalHeight = sBMP_Header.dHeight;
#endif
        Fclose(FBMP);
        return _SUCCESS;
    }
      Fclose(FBMP);
    return _ERROR;
}

BMP.h  //////

#ifndef BMP_H

/******************************************************************************
 *                                                                            *
 *                         M O D U L E   D E F I N E                          *
 *                                                                            *
 ******************************************************************************/

#define BMP_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             *
 *                                                                            *
 ******************************************************************************/

#include "XImgMgr.h"

#ifdef __cplusplus
extern "C" {            /* Assume C declarations for C++ */
#endif    /* __cplusplus */

/******************************************************************************
 *                                                                            *
 *                        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
{
    _ImgBuf         *psImageBuffer;
    _Coord           sCoord;
    INT              iRotation;
    INT                 iTotalWidth;
    INT                 iTotalHeight;
    INT              iImageWidth;
    INT              iImageHeight;
    INT                 iMode;
    CHAR            (*ReadByte)(VOID);        // Get Data Function
    BYTE             *pbFileName;
}_BMPAttr;
    
/******************************************************************************
 *                                                                            *
 *    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 BITMAP(_BMPAttr *);
INT BMPmain(_BMPAttr *);

#ifdef __cplusplus
}                       /* End of extern "C" { */
#endif    /* __cplusplus */

#endif    

ImgUtil.c  //

/******************************************************************************
 *                                                                            *
 *                         M O D U L E   D E F I N E                          *
 *                                                                            *
 ******************************************************************************/

#define IMAGEUTIL_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         *
 *                                                                            *
 ******************************************************************************/

#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 "XGraphic.h"

/******************************************************************************
 *                                                                            *
 *                         L O C A L   D E F I N E S                          *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *                        L O C A L   T Y P E D E F S                         *
 *                                                                            *
 ******************************************************************************/

/* None */

/******************************************************************************
 *                                                                            *
 *             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 CONST BYTE DupleTab[256 * 2] =
{
    0x00, 0x00, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x30, 0x00, 0x33, 0x00, 0x3C, 0x00, 0x3F,
    0x00, 0xC0, 0x00, 0xC3, 0x00, 0xCC, 0x00, 0xCF, 0x00, 0xF0, 0x00, 0xF3, 0x00, 0xFC, 0x00, 0xFF,
    0x03, 0x00, 0x03, 0x03, 0x03, 0x0C, 0x03, 0x0F, 0x03, 0x30, 0x03, 0x33, 0x03, 0x3C, 0x03, 0x3F,
    0x03, 0xC0, 0x03, 0xC3, 0x03, 0xCC, 0x03, 0xCF, 0x03, 0xF0, 0x03, 0xF3, 0x03, 0xFC, 0x03, 0xFF,
    0x0C, 0x00, 0x0C, 0x03, 0x0C, 0x0C, 0x0C, 0x0F, 0x0C, 0x30, 0x0C, 0x33, 0x0C, 0x3C, 0x0C, 0x3F,
    0x0C, 0xC0, 0x0C, 0xC3, 0x0C, 0xCC, 0x0C, 0xCF, 0x0C, 0xF0, 0x0C, 0xF3, 0x0C, 0xFC, 0x0C, 0xFF,
    0x0F, 0x00, 0x0F, 0x03, 0x0F, 0x0C, 0x0F, 0x0F, 0x0F, 0x30, 0x0F, 0x33, 0x0F, 0x3C, 0x0F, 0x3F,
    0x0F, 0xC0, 0x0F, 0xC3, 0x0F, 0xCC, 0x0F, 0xCF, 0x0F, 0xF0, 0x0F, 0xF3, 0x0F, 0xFC, 0x0F, 0xFF,
    0x30, 0x00, 0x30, 0x03, 0x30, 0x0C, 0x30, 0x0F, 0x30, 0x30, 0x30, 0x33, 0x30, 0x3C, 0x30, 0x3F,
    0x30, 0xC0, 0x30, 0xC3, 0x30, 0xCC, 0x30, 0xCF, 0x30, 0xF0, 0x30, 0xF3, 0x30, 0xFC, 0x30, 0xFF,
    0x33, 0x00, 0x33, 0x03, 0x33, 0x0C, 0x33, 0x0F, 0x33, 0x30, 0x33, 0x33, 0x33, 0x3C, 0x33, 0x3F,
    0x33, 0xC0, 0x33, 0xC3, 0x33, 0xCC, 0x33, 0xCF, 0x33, 0xF0, 0x33, 0xF3, 0x33, 0xFC, 0x33, 0xFF,
    0x3C, 0x00, 0x3C, 0x03, 0x3C, 0x0C, 0x3C, 0x0F, 0x3C, 0x30, 0x3C, 0x33, 0x3C, 0x3C, 0x3C, 0x3F,
    0x3C, 0xC0, 0x3C, 0xC3, 0x3C, 0xCC, 0x3C, 0xCF, 0x3C, 0xF0, 0x3C, 0xF3, 0x3C, 0xFC, 0x3C, 0xFF,
    0x3F, 0x00, 0x3F, 0x03, 0x3F, 0x0C, 0x3F, 0x0F, 0x3F, 0x30, 0x3F, 0x33, 0x3F, 0x3C, 0x3F, 0x3F,
    0x3F, 0xC0, 0x3F, 0xC3, 0x3F, 0xCC, 0x3F, 0xCF, 0x3F, 0xF0, 0x3F, 0xF3, 0x3F, 0xFC, 0x3F, 0xFF,
    0xC0, 0x00, 0xC0, 0x03, 0xC0, 0x0C, 0xC0, 0x0F, 0xC0, 0x30, 0xC0, 0x33, 0xC0, 0x3C, 0xC0, 0x3F,
    0xC0, 0xC0, 0xC0, 0xC3, 0xC0, 0xCC, 0xC0, 0xCF, 0xC0, 0xF0, 0xC0, 0xF3, 0xC0, 0xFC, 0xC0, 0xFF,
    0xC3, 0x00, 0xC3, 0x03, 0xC3, 0x0C, 0xC3, 0x0F, 0xC3, 0x30, 0xC3, 0x33, 0xC3, 0x3C, 0xC3, 0x3F,
    0xC3, 0xC0, 0xC3, 0xC3, 0xC3, 0xCC, 0xC3, 0xCF, 0xC3, 0xF0, 0xC3, 0xF3, 0xC3, 0xFC, 0xC3, 0xFF,
    0xCC, 0x00, 0xCC, 0x03, 0xCC, 0x0C, 0xCC, 0x0F, 0xCC, 0x30, 0xCC, 0x33, 0xCC, 0x3C, 0xCC, 0x3F,
    0xCC, 0xC0, 0xCC, 0xC3, 0xCC, 0xCC, 0xCC, 0xCF, 0xCC, 0xF0, 0xCC, 0xF3, 0xCC, 0xFC, 0xCC, 0xFF,
    0xCF, 0x00, 0xCF, 0x03, 0xCF, 0x0C, 0xCF, 0x0F, 0xCF, 0x30, 0xCF, 0x33, 0xCF, 0x3C, 0xCF, 0x3F,
    0xCF, 0xC0, 0xCF, 0xC3, 0xCF, 0xCC, 0xCF, 0xCF, 0xCF, 0xF0, 0xCF, 0xF3, 0xCF, 0xFC, 0xCF, 0xFF,
    0xF0, 0x00, 0xF0, 0x03, 0xF0, 0x0C, 0xF0, 0x0F, 0xF0, 0x30, 0xF0, 0x33, 0xF0, 0x3C, 0xF0, 0x3F,
    0xF0, 0xC0, 0xF0, 0xC3, 0xF0, 0xCC, 0xF0, 0xCF, 0xF0, 0xF0, 0xF0, 0xF3, 0xF0, 0xFC, 0xF0, 0xFF,
    0xF3, 0x00, 0xF3, 0x03, 0xF3, 0x0C, 0xF3, 0x0F, 0xF3, 0x30, 0xF3, 0x33, 0xF3, 0x3C, 0xF3, 0x3F,
    0xF3, 0xC0, 0xF3, 0xC3, 0xF3, 0xCC, 0xF3, 0xCF, 0xF3, 0xF0, 0xF3, 0xF3, 0xF3, 0xFC, 0xF3, 0xFF,
    0xFC, 0x00, 0xFC, 0x03, 0xFC, 0x0C, 0xFC, 0x0F, 0xFC, 0x30, 0xFC, 0x33, 0xFC, 0x3C, 0xFC, 0x3F,
    0xFC, 0xC0, 0xFC, 0xC3, 0xFC, 0xCC, 0xFC, 0xCF, 0xFC, 0xF0, 0xFC, 0xF3, 0xFC, 0xFC, 0xFC, 0xFF,
    0xFF, 0x00, 0xFF, 0x03, 0xFF, 0x0C, 0xFF, 0x0F, 0xFF, 0x30, 0xFF, 0x33, 0xFF, 0x3C, 0xFF, 0x3F,
    0xFF, 0xC0, 0xFF, 0xC3, 0xFF, 0xCC, 0xFF, 0xCF, 0xFF, 0xF0, 0xFF, 0xF3, 0xFF, 0xFC, 0xFF, 0xFF,
};

STATIC CONST BYTE TripleTab[256 * 3] =
{
    0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x38,0x00,0x00,0x3F,0x00,0x01,0xC0,0x00,0x01,0xC7,0x00,0x01,0xF8,0x00,0x01,0xFF,
    0x00,0x0E,0x00,0x00,0x0E,0x07,0x00,0x0E,0x38,0x00,0x0E,0x3F,0x00,0x0F,0xC0,0x00,0x0F,0xC7,0x00,0x0F,0xF8,0x00,0x0F,0xFF,
    0x00,0x70,0x00,0x00,0x70,0x07,0x00,0x70,0x38,0x00,0x70,0x3F,0x00,0x71,0xC0,0x00,0x71,0xC7,0x00,0x71,0xF8,0x00,0x71,0xFF,
    0x00,0x7E,0x00,0x00,0x7E,0x07,0x00,0x7E,0x38,0x00,0x7E,0x3F,0x00,0x7F,0xC0,0x00,0x7F,0xC7,0x00,0x7F,0xF8,0x00,0x7F,0xFF,
    0x03,0x80,0x00,0x03,0x80,0x07,0x03,0x80,0x38,0x03,0x80,0x3F,0x03,0x81,0xC0,0x03,0x81,0xC7,0x03,0x81,0xF8,0x03,0x81,0xFF,
    0x03,0x8E,0x00,0x03,0x8E,0x07,0x03,0x8E,0x38,0x03,0x8E,0x3F,0x03,0x8F,0xC0,0x03,0x8F,0xC7,0x03,0x8F,0xF8,0x03,0x8F,0xFF,
    0x03,0xF0,0x00,0x03,0xF0,0x07,0x03,0xF0,0x38,0x03,0xF0,0x3F,0x03,0xF1,0xC0,0x03,0xF1,0xC7,0x03,0xF1,0xF8,0x03,0xF1,0xFF,
    0x03,0xFE,0x00,0x03,0xFE,0x07,0x03,0xFE,0x38,0x03,0xFE,0x3F,0x03,0xFF,0xC0,0x03,0xFF,0xC7,0x03,0xFF,0xF8,0x03,0xFF,0xFF,
    0x1C,0x00,0x00,0x1C,0x00,0x07,0x1C,0x00,0x38,0x1C,0x00,0x3F,0x1C,0x01,0xC0,0x1C,0x01,0xC7,0x1C,0x01,0xF8,0x1C,0x01,0xFF,
    0x1C,0x0E,0x00,0x1C,0x0E,0x07,0x1C,0x0E,0x38,0x1C,0x0E,0x3F,0x1C,0x0F,0xC0,0x1C,0x0F,0xC7,0x1C,0x0F,0xF8,0x1C,0x0F,0xFF,
    0x1C,0x70,0x00,0x1C,0x70,0x07,0x1C,0x70,0x38,0x1C,0x70,0x3F,0x1C,0x71,0xC0,0x1C,0x71,0xC7,0x1C,0x71,0xF8,0x1C,0x71,0xFF,
    0x1C,0x7E,0x00,0x1C,0x7E,0x07,0x1C,0x7E,0x38,0x1C,0x7E,0x3F,0x1C,0x7F,0xC0,0x1C,0x7F,0xC7,0x1C,0x7F,0xF8,0x1C,0x7F,0xFF,
    0x1F,0x80,0x00,0x1F,0x80,0x07,0x1F,0x80,0x38,0x1F,0x80,0x3F,0x1F,0x81,0xC0,0x1F,0x81,0xC7,0x1F,0x81,0xF8,0x1F,0x81,0xFF,
    0x1F,0x8E,0x00,0x1F,0x8E,0x07,0x1F,0x8E,0x38,0x1F,0x8E,0x3F,0x1F,0x8F,0xC0,0x1F,0x8F,0xC7,0x1F,0x8F,0xF8,0x1F,0x8F,0xFF,
    0x1F,0xF0,0x00,0x1F,0xF0,0x07,0x1F,0xF0,0x38,0x1F,0xF0,0x3F,0x1F,0xF1,0xC0,0x1F,0xF1,0xC7,0x1F,0xF1,0xF8,0x1F,0xF1,0xFF,
    0x1F,0xFE,0x00,0x1F,0xFE,0x07,0x1F,0xFE,0x38,0x1F,0xFE,0x3F,0x1F,0xFF,0xC0,0x1F,0xFF,0xC7,0x1F,0xFF,0xF8,0x1F,0xFF,0xFF,
    0xE0,0x00,0x00,0xE0,0x00,0x07,0xE0,0x00,0x38,0xE0,0x00,0x3F,0xE0,0x01,0xC0,0xE0,0x01,0xC7,0xE0,0x01,0xF8,0xE0,0x01,0xFF,
    0xE0,0x0E,0x00,0xE0,0x0E,0x07,0xE0,0x0E,0x38,0xE0,0x0E,0x3F,0xE0,0x0F,0xC0,0xE0,0x0F,0xC7,0xE0,0x0F,0xF8,0xE0,0x0F,0xFF,
    0xE0,0x70,0x00,0xE0,0x70,0x07,0xE0,0x70,0x38,0xE0,0x70,0x3F,0xE0,0x71,0xC0,0xE0,0x71,0xC7,0xE0,0x71,0xF8,0xE0,0x71,0xFF,
    0xE0,0x7E,0x00,0xE0,0x7E,0x07,0xE0,0x7E,0x38,0xE0,0x7E,0x3F,0xE0,0x7F,0xC0,0xE0,0x7F,0xC7,0xE0,0x7F,0xF8,0xE0,0x7F,0xFF,
    0xE3,0x80,0x00,0xE3,0x80,0x07,0xE3,0x80,0x38,0xE3,0x80,0x3F,0xE3,0x81,0xC0,0xE3,0x81,0xC7,0xE3,0x81,0xF8,0xE3,0x81,0xFF,
    0xE3,0x8E,0x00,0xE3,0x8E,0x07,0xE3,0x8E,0x38,0xE3,0x8E,0x3F,0xE3,0x8F,0xC0,0xE3,0x8F,0xC7,0xE3,0x8F,0xF8,0xE3,0x8F,0xFF,
    0xE3,0xF0,0x00,0xE3,0xF0,0x07,0xE3,0xF0,0x38,0xE3,0xF0,0x3F,0xE3,0xF1,0xC0,0xE3,0xF1,0xC7,0xE3,0xF1,0xF8,0xE3,0xF1,0xFF,
    0xE3,0xFE,0x00,0xE3,0xFE,0x07,0xE3,0xFE,0x38,0xE3,0xFE,0x3F,0xE3,0xFF,0xC0,0xE3,0xFF,0xC7,0xE3,0xFF,0xF8,0xE3,0xFF,0xFF,
    0xFC,0x00,0x00,0xFC,0x00,0x07,0xFC,0x00,0x38,0xFC,0x00,0x3F,0xFC,0x01,0xC0,0xFC,0x01,0xC7,0xFC,0x01,0xF8,0xFC,0x01,0xFF,
    0xFC,0x0E,0x00,0xFC,0x0E,0x07,0xFC,0x0E,0x38,0xFC,0x0E,0x3F,0xFC,0x0F,0xC0,0xFC,0x0F,0xC7,0xFC,0x0F,0xF8,0xFC,0x0F,0xFF,
    0xFC,0x70,0x00,0xFC,0x70,0x07,0xFC,0x70,0x38,0xFC,0x70,0x3F,0xFC,0x71,0xC0,0xFC,0x71,0xC7,0xFC,0x71,0xF8,0xFC,0x71,0xFF,
    0xFC,0x7E,0x00,0xFC,0x7E,0x07,0xFC,0x7E,0x38,0xFC,0x7E,0x3F,0xFC,0x7F,0xC0,0xFC,0x7F,0xC7,0xFC,0x7F,0xF8,0xFC,0x7F,0xFF,
    0xFF,0x80,0x00,0xFF,0x80,0x07,0xFF,0x80,0x38,0xFF,0x80,0x3F,0xFF,0x81,0xC0,0xFF,0x81,0xC7,0xFF,0x81,0xF8,0xFF,0x81,0xFF,
    0xFF,0x8E,0x00,0xFF,0x8E,0x07,0xFF,0x8E,0x38,0xFF,0x8E,0x3F,0xFF,0x8F,0xC0,0xFF,0x8F,0xC7,0xFF,0x8F,0xF8,0xFF,0x8F,0xFF,
    0xFF,0xF0,0x00,0xFF,0xF0,0x07,0xFF,0xF0,0x38,0xFF,0xF0,0x3F,0xFF,0xF1,0xC0,0xFF,0xF1,0xC7,0xFF,0xF1,0xF8,0xFF,0xF1,0xFF,
    0xFF,0xFE,0x00,0xFF,0xFE,0x07,0xFF,0xFE,0x38,0xFF,0xFE,0x3F,0xFF,0xFF,0xC0,0xFF,0xFF,0xC7,0xFF,0xFF,0xF8,0xFF,0xFF,0xFF,
};

STATIC CONST BYTE QuintupleTab[256 * 5] =
{
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0x03,0xFF,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x7C,0x1F,0x00,0x00,0x00,0x7F,0xE0,0x00,0x00,0x00,0x7F,0xFF,
    0x00,0x00,0x0F,0x80,0x00,0x00,0x00,0x0F,0x80,0x1F,0x00,0x00,0x0F,0x83,0xE0,0x00,0x00,0x0F,0x83,0xFF,0x00,0x00,0x0F,0xFC,0x00,0x00,0x00,0x0F,0xFC,0x1F,0x00,0x00,0x0F,0xFF,0xE0,0x00,0x00,0x0F,0xFF,0xFF,
    0x00,0x01,0xF0,0x00,0x00,0x00,0x01,0xF0,0x00,0x1F,0x00,0x01,0xF0,0x03,0xE0,0x00,0x01,0xF0,0x03,0xFF,0x00,0x01,0xF0,0x7C,0x00,0x00,0x01,0xF0,0x7C,0x1F,0x00,0x01,0xF0,0x7F,0xE0,0x00,0x01,0xF0,0x7F,0xFF,
    0x00,0x01,0xFF,0x80,0x00,0x00,0x01,0xFF,0x80,0x1F,0x00,0x01,0xFF,0x83,0xE0,0x00,0x01,0xFF,0x83,0xFF,0x00,0x01,0xFF,0xFC,0x00,0x00,0x01,0xFF,0xFC,0x1F,0x00,0x01,0xFF,0xFF,0xE0,0x00,0x01,0xFF,0xFF,0xFF,
    0x00,0x3E,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x1F,0x00,0x3E,0x00,0x03,0xE0,0x00,0x3E,0x00,0x03,0xFF,0x00,0x3E,0x00,0x7C,0x00,0x00,0x3E,0x00,0x7C,0x1F,0x00,0x3E,0x00,0x7F,0xE0,0x00,0x3E,0x00,0x7F,0xFF,
    0x00,0x3E,0x0F,0x80,0x00,0x00,0x3E,0x0F,0x80,0x1F,0x00,0x3E,0x0F,0x83,0xE0,0x00,0x3E,0x0F,0x83,0xFF,0x00,0x3E,0x0F,0xFC,0x00,0x00,0x3E,0x0F,0xFC,0x1F,0x00,0x3E,0x0F,0xFF,0xE0,0x00,0x3E,0x0F,0xFF,0xFF,
    0x00,0x3F,0xF0,0x00,0x00,0x00,0x3F,0xF0,0x00,0x1F,0x00,0x3F,0xF0,0x03,0xE0,0x00,0x3F,0xF0,0x03,0xFF,0x00,0x3F,0xF0,0x7C,0x00,0x00,0x3F,0xF0,0x7C,0x1F,0x00,0x3F,0xF0,0x7F,0xE0,0x00,0x3F,0xF0,0x7F,0xFF,
    0x00,0x3F,0xFF,0x80,0x00,0x00,0x3F,0xFF,0x80,0x1F,0x00,0x3F,0xFF,0x83,0xE0,0x00,0x3F,0xFF,0x83,0xFF,0x00,0x3F,0xFF,0xFC,0x00,0x00,0x3F,0xFF,0xFC,0x1F,0x00,0x3F,0xFF,0xFF,0xE0,0x00,0x3F,0xFF,0xFF,0xFF,
    0x07,0xC0,0x00,0x00,0x00,0x07,0xC0,0x00,0x00,0x1F,0x07,0xC0,0x00,0x03,0xE0,0x07,0xC0,0x00,0x03,0xFF,0x07,0xC0,0x00,0x7C,0x00,0x07,0xC0,0x00,0x7C,0x1F,0x07,0xC0,0x00,0x7F,0xE0,0x07,0xC0,0x00,0x7F,0xFF,
    0x07,0xC0,0x0F,0x80,0x00,0x07,0xC0,0x0F,0x80,0x1F,0x07,0xC0,0x0F,0x83,0xE0,0x07,0xC0,0x0F,0x83,0xFF,0x07,0xC0,0x0F,0xFC,0x00,0x07,0xC0,0x0F,0xFC,0x1F,0x07,0xC0,0x0F,0xFF,0xE0,0x07,0xC0,0x0F,0xFF,0xFF,
    0x07,0xC1,0xF0,0x00,0x00,0x07,0xC1,0xF0,0x00,0x1F,0x07,0xC1,0xF0,0x03,0xE0,0x07,0xC1,0xF0,0x03,0xFF,0x07,0xC1,0xF0,0x7C,0x00,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xC1,0xF0,0x7F,0xE0,0x07,0xC1,0xF0,0x7F,0xFF,
    0x07,0xC1,0xFF,0x80,0x00,0x07,0xC1,0xFF,0x80,0x1F,0x07,0xC1,0xFF,0x83,0xE0,0x07,0xC1,0xFF,0x83,0xFF,0x07,0xC1,0xFF,0xFC,0x00,0x07,0xC1,0xFF,0xFC,0x1F,0x07,0xC1,0xFF,0xFF,0xE0,0x07,0xC1,0xFF,0xFF,0xFF,
    0x07,0xFE,0x00,0x00,0x00,0x07,0xFE,0x00,0x00,0x1F,0x07,0xFE,0x00,0x03,0xE0,0x07,0xFE,0x00,0x03,0xFF,0x07,0xFE,0x00,0x7C,0x00,0x07,0xFE,0x00,0x7C,0x1F,0x07,0xFE,0x00,0x7F,0xE0,0x07,0xFE,0x00,0x7F,0xFF,
    0x07,0xFE,0x0F,0x80,0x00,0x07,0xFE,0x0F,0x80,0x1F,0x07,0xFE,0x0F,0x83,0xE0,0x07,0xFE,0x0F,0x83,0xFF,0x07,0xFE,0x0F,0xFC,0x00,0x07,0xFE,0x0F,0xFC,0x1F,0x07,0xFE,0x0F,0xFF,0xE0,0x07,0xFE,0x0F,0xFF,0xFF,
    0x07,0xFF,0xF0,0x00,0x00,0x07,0xFF,0xF0,0x00,0x1F,0x07,0xFF,0xF0,0x03,0xE0,0x07,0xFF,0xF0,0x03,0xFF,0x07,0xFF,0xF0,0x7C,0x00,0x07,0xFF,0xF0,0x7C,0x1F,0x07,0xFF,0xF0,0x7F,0xE0,0x07,0xFF,0xF0,0x7F,0xFF,
    0x07,0xFF,0xFF,0x80,0x00,0x07,0xFF,0xFF,0x80,0x1F,0x07,0xFF,0xFF,0x83,0xE0,0x07,0xFF,0xFF,0x83,0xFF,0x07,0xFF,0xFF,0xFC,0x00,0x07,0xFF,0xFF,0xFC,0x1F,0x07,0xFF,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xFF,0xFF,
    0xF8,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x1F,0xF8,0x00,0x00,0x03,0xE0,0xF8,0x00,0x00,0x03,0xFF,0xF8,0x00,0x00,0x7C,0x00,0xF8,0x00,0x00,0x7C,0x1F,0xF8,0x00,0x00,0x7F,0xE0,0xF8,0x00,0x00,0x7F,0xFF,
    0xF8,0x00,0x0F,0x80,0x00,0xF8,0x00,0x0F,0x80,0x1F,0xF8,0x00,0x0F,0x83,0xE0,0xF8,0x00,0x0F,0x83,0xFF,0xF8,0x00,0x0F,0xFC,0x00,0xF8,0x00,0x0F,0xFC,0x1F,0xF8,0x00,0x0F,0xFF,0xE0,0xF8,0x00,0x0F,0xFF,0xFF,
    0xF8,0x01,0xF0,0x00,0x00,0xF8,0x01,0xF0,0x00,0x1F,0xF8,0x01,0xF0,0x03,0xE0,0xF8,0x01,0xF0,0x03,0xFF,0xF8,0x01,0xF0,0x7C,0x00,0xF8,0x01,0xF0,0x7C,0x1F,0xF8,0x01,0xF0,0x7F,0xE0,0xF8,0x01,0xF0,0x7F,0xFF,
    0xF8,0x01,0xFF,0x80,0x00,0xF8,0x01,0xFF,0x80,0x1F,0xF8,0x01,0xFF,0x83,0xE0,0xF8,0x01,0xFF,0x83,0xFF,0xF8,0x01,0xFF,0xFC,0x00,0xF8,0x01,0xFF,0xFC,0x1F,0xF8,0x01,0xFF,0xFF,0xE0,0xF8,0x01,0xFF,0xFF,0xFF,
    0xF8,0x3E,0x00,0x00,0x00,0xF8,0x3E,0x00,0x00,0x1F,0xF8,0x3E,0x00,0x03,0xE0,0xF8,0x3E,0x00,0x03,0xFF,0xF8,0x3E,0x00,0x7C,0x00,0xF8,0x3E,0x00,0x7C,0x1F,0xF8,0x3E,0x00,0x7F,0xE0,0xF8,0x3E,0x00,0x7F,0xFF,
    0xF8,0x3E,0x0F,0x80,0x00,0xF8,0x3E,0x0F,0x80,0x1F,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xFF,0xF8,0x3E,0x0F,0xFC,0x00,0xF8,0x3E,0x0F,0xFC,0x1F,0xF8,0x3E,0x0F,0xFF,0xE0,0xF8,0x3E,0x0F,0xFF,0xFF,
    0xF8,0x3F,0xF0,0x00,0x00,0xF8,0x3F,0xF0,0x00,0x1F,0xF8,0x3F,0xF0,0x03,0xE0,0xF8,0x3F,0xF0,0x03,0xFF,0xF8,0x3F,0xF0,0x7C,0x00,0xF8,0x3F,0xF0,0x7C,0x1F,0xF8,0x3F,0xF0,0x7F,0xE0,0xF8,0x3F,0xF0,0x7F,0xFF,
    0xF8,0x3F,0xFF,0x80,0x00,0xF8,0x3F,0xFF,0x80,0x1F,0xF8,0x3F,0xFF,0x83,0xE0,0xF8,0x3F,0xFF,0x83,0xFF,0xF8,0x3F,0xFF,0xFC,0x00,0xF8,0x3F,0xFF,0xFC,0x1F,0xF8,0x3F,0xFF,0xFF,0xE0,0xF8,0x3F,0xFF,0xFF,0xFF,
    0xFF,0xC0,0x00,0x00,0x00,0xFF,0xC0,0x00,0x00,0x1F,0xFF,0xC0,0x00,0x03,0xE0,0xFF,0xC0,0x00,0x03,0xFF,0xFF,0xC0,0x00,0x7C,0x00,0xFF,0xC0,0x00,0x7C,0x1F,0xFF,0xC0,0x00,0x7F,0xE0,0xFF,0xC0,0x00,0x7F,0xFF,
    0xFF,0xC0,0x0F,0x80,0x00,0xFF,0xC0,0x0F,0x80,0x1F,0xFF,0xC0,0x0F,0x83,0xE0,0xFF,0xC0,0x0F,0x83,0xFF,0xFF,0xC0,0x0F,0xFC,0x00,0xFF,0xC0,0x0F,0xFC,0x1F,0xFF,0xC0,0x0F,0xFF,0xE0,0xFF,0xC0,0x0F,0xFF,0xFF,
    0xFF,0xC1,0xF0,0x00,0x00,0xFF,0xC1,0xF0,0x00,0x1F,0xFF,0xC1,0xF0,0x03,0xE0,0xFF,0xC1,0xF0,0x03,0xFF,0xFF,0xC1,0xF0,0x7C,0x00,0xFF,0xC1,0xF0,0x7C,0x1F,0xFF,0xC1,0xF0,0x7F,0xE0,0xFF,0xC1,0xF0,0x7F,0xFF,
    0xFF,0xC1,0xFF,0x80,0x00,0xFF,0xC1,0xFF,0x80,0x1F,0xFF,0xC1,0xFF,0x83,0xE0,0xFF,0xC1,0xFF,0x83,0xFF,0xFF,0xC1,0xFF,0xFC,0x00,0xFF,0xC1,0xFF,0xFC,0x1F,0xFF,0xC1,0xFF,0xFF,0xE0,0xFF,0xC1,0xFF,0xFF,0xFF,
    0xFF,0xFE,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x1F,0xFF,0xFE,0x00,0x03,0xE0,0xFF,0xFE,0x00,0x03,0xFF,0xFF,0xFE,0x00,0x7C,0x00,0xFF,0xFE,0x00,0x7C,0x1F,0xFF,0xFE,0x00,0x7F,0xE0,0xFF,0xFE,0x00,0x7F,0xFF,
    0xFF,0xFE,0x0F,0x80,0x00,0xFF,0xFE,0x0F,0x80,0x1F,0xFF,0xFE,0x0F,0x83,0xE0,0xFF,0xFE,0x0F,0x83,0xFF,0xFF,0xFE,0x0F,0xFC,0x00,0xFF,0xFE,0x0F,0xFC,0x1F,0xFF,0xFE,0x0F,0xFF,0xE0,0xFF,0xFE,0x0F,0xFF,0xFF,
    0xFF,0xFF,0xF0,0x00,0x00,0xFF,0xFF,0xF0,0x00,0x1F,0xFF,0xFF,0xF0,0x03,0xE0,0xFF,0xFF,0xF0,0x03,0xFF,0xFF,0xFF,0xF0,0x7C,0x00,0xFF,0xFF,0xF0,0x7C,0x1F,0xFF,0xFF,0xF0,0x7F,0xE0,0xFF,0xFF,0xF0,0x7F,0xFF,
    0xFF,0xFF,0xFF,0x80,0x00,0xFF,0xFF,0xFF,0x80,0x1F,0xFF,0xFF,0xFF,0x83,0xE0,0xFF,0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,
};

STATIC CONST BYTE SeptupleTab[256 * 7] =
{
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,
    0x00,0x00,0x00,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x7F,0x00,0x00,0x00,0x00,0x1F,0xFF,0x80,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,
    0x00,0x00,0x00,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x00,0x7F,0x00,0x00,0x00,0x0F,0xE0,0x3F,0x80,0x00,0x00,0x00,0x0F,0xE0,0x3F,0xFF,
    0x00,0x00,0x00,0x0F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x0F,0xFF,0xC0,0x7F,0x00,0x00,0x00,0x0F,0xFF,0xFF,0x80,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,
    0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x7F,0x00,0x00,0x07,0xF0,0x00,0x3F,0x80,0x00,0x00,0x07,0xF0,0x00,0x3F,0xFF,
    0x00,0x00,0x07,0xF0,0x1F,0xC0,0x00,0x00,0x00,0x07,0xF0,0x1F,0xC0,0x7F,0x00,0x00,0x07,0xF0,0x1F,0xFF,0x80,0x00,0x00,0x07,0xF0,0x1F,0xFF,0xFF,
    0x00,0x00,0x07,0xFF,0xE0,0x00,0x00,0x00,0x00,0x07,0xFF,0xE0,0x00,0x7F,0x00,0x00,0x07,0xFF,0xE0,0x3F,0x80,0x00,0x00,0x07,0xFF,0xE0,0x3F,0xFF,
    0x00,0x00,0x07,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x07,0xFF,0xFF,0xC0,0x7F,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,
    0x00,0x03,0xF8,0x00,0x00,0x00,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0x7F,0x00,0x03,0xF8,0x00,0x00,0x3F,0x80,0x00,0x03,0xF8,0x00,0x00,0x3F,0xFF,
    0x00,0x03,0xF8,0x00,0x1F,0xC0,0x00,0x00,0x03,0xF8,0x00,0x1F,0xC0,0x7F,0x00,0x03,0xF8,0x00,0x1F,0xFF,0x80,0x00,0x03,0xF8,0x00,0x1F,0xFF,0xFF,
    0x00,0x03,0xF8,0x0F,0xE0,0x00,0x00,0x00,0x03,0xF8,0x0F,0xE0,0x00,0x7F,0x00,0x03,0xF8,0x0F,0xE0,0x3F,0x80,0x00,0x03,0xF8,0x0F,0xE0,0x3F,0xFF,
    0x00,0x03,0xF8,0x0F,0xFF,0xC0,0x00,0x00,0x03,0xF8,0x0F,0xFF,0xC0,0x7F,0x00,0x03,0xF8,0x0F,0xFF,0xFF,0x80,0x00,0x03,0xF8,0x0F,0xFF,0xFF,0xFF,
    0x00,0x03,0xFF,0xF0,0x00,0x00,0x00,0x00,0x03,0xFF,0xF0,0x00,0x00,0x7F,0x00,0x03,0xFF,0xF0,0x00,0x3F,0x80,0x00,0x03,0xFF,0xF0,0x00,0x3F,0xFF,
    0x00,0x03,0xFF,0xF0,0x1F,0xC0,0x00,0x00,0x03,0xFF,0xF0,0x1F,0xC0,0x7F,0x00,0x03,0xFF,0xF0,0x1F,0xFF,0x80,0x00,0x03,0xFF,0xF0,0x1F,0xFF,0xFF,
    0x00,0x03,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x03,0xFF,0xFF,0xE0,0x00,0x7F,0x00,0x03,0xFF,0xFF,0xE0,0x3F,0x80,0x00,0x03,0xFF,0xFF,0xE0,0x3F,0xFF,
    0x00,0x03,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xC0,0x7F,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,
    0x01,0xFC,0x00,0x00,0x00,0x00,0x00,0x01,0xFC,0x00,0x00,0x00,0x00,0x7F,0x01,0xFC,0x00,0x00,0x00,0x3F,0x80,0x01,0xFC,0x00,0x00,0x00,0x3F,0xFF,
    0x01,0xFC,0x00,0x00,0x1F,0xC0,0x00,0x01,0xFC,0x00,0x00,0x1F,0xC0,0x7F,0x01,0xFC,0x00,0x00,0x1F,0xFF,0x80,0x01,0xFC,0x00,0x00,0x1F,0xFF,0xFF,
    0x01,0xFC,0x00,0x0F,0xE0,0x00,0x00,0x01,0xFC,0x00,0x0F,0xE0,0x00,0x7F,0x01,0xFC,0x00,0x0F,0xE0,0x3F,0x80,0x01,0xFC,0x00,0x0F,0xE0,0x3F,0xFF,
    0x01,0xFC,0x00,0x0F,0xFF,0xC0,0x00,0x01,0xFC,0x00,0x0F,0xFF,0xC0,0x7F,0x01,0xFC,0x00,0x0F,0xFF,0xFF,0x80,0x01,0xFC,0x00,0x0F,0xFF,0xFF,0xFF,
    0x01,0xFC,0x07,0xF0,0x00,0x00,0x00,0x01,0xFC,0x07,0xF0,0x00,0x00,0x7F,0x01,0xFC,0x07,0xF0,0x00,0x3F,0x80,0x01,0xFC,0x07,0xF0,0x00,0x3F,0xFF,
    0x01,0xFC,0x07,0xF0,0x1F,0xC0,0x00,0x01,0xFC,0x07,0xF0,0x1F,0xC0,0x7F,0x01,0xFC,0x07,0xF0,0x1F,0xFF,0x80,0x01,0xFC,0x07,0xF0,0x1F,0xFF,0xFF,
    0x01,0xFC,0x07,0xFF,0xE0,0x00,0x00,0x01,0xFC,0x07,0xFF,0xE0,0x00,0x7F,0x01,0xFC,0x07,0xFF,0xE0,0x3F,0x80,0x01,0xFC,0x07,0xFF,0xE0,0x3F,0xFF,
    0x01,0xFC,0x07,0xFF,0xFF,0xC0,0x00,0x01,0xFC,0x07,0xFF,0xFF,0xC0,0x7F,0x01,0xFC,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,
    0x01,0xFF,0xF8,0x00,0x00,0x00,0x00,0x01,0xFF,0xF8,0x00,0x00,0x00,0x7F,0x01,0xFF,0xF8,0x00,0x00,0x3F,0x80,0x01,0xFF,0xF8,0x00,0x00,0x3F,0xFF,
    0x01,0xFF,0xF8,0x00,0x1F,0xC0,0x00,0x01,0xFF,0xF8,0x00,0x1F,0xC0,0x7F,0x01,0xFF,0xF8,0x00,0x1F,0xFF,0x80,0x01,0xFF,0xF8,0x00,0x1F,0xFF,0xFF,
    0x01,0xFF,0xF8,0x0F,0xE0,0x00,0x00,0x01,0xFF,0xF8,0x0F,0xE0,0x00,0x7F,0x01,0xFF,0xF8,0x0F,0xE0,0x3F,0x80,0x01,0xFF,0xF8,0x0F,0xE0,0x3F,0xFF,
    0x01,0xFF,0xF8,0x0F,0xFF,0xC0,0x00,0x01,0xFF,0xF8,0x0F,0xFF,0xC0,0x7F,0x01,0xFF,0xF8,0x0F,0xFF,0xFF,0x80,0x01,0xFF,0xF8,0x0F,0xFF,0xFF,0xFF,
    0x01,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x01,0xFF,0xFF,0xF0,0x00,0x00,0x7F,0x01,0xFF,0xFF,0xF0,0x00,0x3F,0x80,0x01,0xFF,0xFF,0xF0,0x00,0x3F,0xFF,
    0x01,0xFF,0xFF,0xF0,0x1F,0xC0,0x00,0x01,0xFF,0xFF,0xF0,0x1F,0xC0,0x7F,0x01,0xFF,0xFF,0xF0,0x1F,0xFF,0x80,0x01,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,
    0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x7F,0x01,0xFF,0xFF,0xFF,0xE0,0x3F,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x3F,0xFF,
    0x01,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xC0,0x7F,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x7F,0xFE,0x00,0x00,0x00,0x00,0x3F,0x80,0xFE,0x00,0x00,0x00,0x00,0x3F,0xFF,
    0xFE,0x00,0x00,0x00,0x1F,0xC0,0x00,0xFE,0x00,0x00,0x00,0x1F,0xC0,0x7F,0xFE,0x00,0x00,0x00,0x1F,0xFF,0x80,0xFE,0x00,0x00,0x00,0x1F,0xFF,0xFF,
    0xFE,0x00,0x00,0x0F,0xE0,0x00,0x00,0xFE,0x00,0x00,0x0F,0xE0,0x00,0x7F,0xFE,0x00,0x00,0x0F,0xE0,0x3F,0x80,0xFE,0x00,0x00,0x0F,0xE0,0x3F,0xFF,
    0xFE,0x00,0x00,0x0F,0xFF,0xC0,0x00,0xFE,0x00,0x00,0x0F,0xFF,0xC0,0x7F,0xFE,0x00,0x00,0x0F,0xFF,0xFF,0x80,0xFE,0x00,0x00,0x0F,0xFF,0xFF,0xFF,
    0xFE,0x00,0x07,0xF0,0x00,0x00,0x00,0xFE,0x00,0x07,0xF0,0x00,0x00,0x7F,0xFE,0x00,0x07,0xF0,0x00,0x3F,0x80,0xFE,0x00,0x07,0xF0,0x00,0x3F,0xFF,
    0xFE,0x00,0x07,0xF0,0x1F,0xC0,0x00,0xFE,0x00,0x07,0xF0,0x1F,0xC0,0x7F,0xFE,0x00,0x07,0xF0,0x1F,0xFF,0x80,0xFE,0x00,0x07,0xF0,0x1F,0xFF,0xFF,
    0xFE,0x00,0x07,0xFF,0xE0,0x00,0x00,0xFE,0x00,0x07,0xFF,0xE0,0x00,0x7F,0xFE,0x00,0x07,0xFF,0xE0,0x3F,0x80,0xFE,0x00,0x07,0xFF,0xE0,0x3F,0xFF,
    0xFE,0x00,0x07,0xFF,0xFF,0xC0,0x00,0xFE,0x00,0x07,0xFF,0xFF,0xC0,0x7F,0xFE,0x00,0x07,0xFF,0xFF,0xFF,0x80,0xFE,0x00,0x07,0xFF,0xFF,0xFF,0xFF,
    0xFE,0x03,0xF8,0x00,0x00,0x00,0x00,0xFE,0x03,0xF8,0x00,0x00,0x00,0x7F,0xFE,0x03,0xF8,0x00,0x00,0x3F,0x80,0xFE,0x03,0xF8,0x00,0x00,0x3F,0xFF,
    0xFE,0x03,0xF8,0x00,0x1F,0xC0,0x00,0xFE,0x03,0xF8,0x00,0x1F,0xC0,0x7F,0xFE,0x03,0xF8,0x00,0x1F,0xFF,0x80,0xFE,0x03,0xF8,0x00,0x1F,0xFF,0xFF,
    0xFE,0x03,0xF8,0x0F,0xE0,0x00,0x00,0xFE,0x03,0xF8,0x0F,0xE0,0x00,0x7F,0xFE,0x03,0xF8,0x0F,0xE0,0x3F,0x80,0xFE,0x03,0xF8,0x0F,0xE0,0x3F,0xFF,
    0xFE,0x03,0xF8,0x0F,0xFF,0xC0,0x00,0xFE,0x03,0xF8,0x0F,0xFF,0xC0,0x7F,0xFE,0x03,0xF8,0x0F,0xFF,0xFF,0x80,0xFE,0x03,0xF8,0x0F,0xFF,0xFF,0xFF,
    0xFE,0x03,0xFF,0xF0,0x00,0x00,0x00,0xFE,0x03,0xFF,0xF0,0x00,0x00,0x7F,0xFE,0x03,0xFF,0xF0,0x00,0x3F,0x80,0xFE,0x03,0xFF,0xF0,0x00,0x3F,0xFF,
    0xFE,0x03,0xFF,0xF0,0x1F,0xC0,0x00,0xFE,0x03,0xFF,0xF0,0x1F,0xC0,0x7F,0xFE,0x03,0xFF,0xF0,0x1F,0xFF,0x80,0xFE,0x03,0xFF,0xF0,0x1F,0xFF,0xFF,
    0xFE,0x03,0xFF,0xFF,0xE0,0x00,0x00,0xFE,0x03,0xFF,0xFF,0xE0,0x00,0x7F,0xFE,0x03,0xFF,0xFF,0xE0,0x3F,0x80,0xFE,0x03,0xFF,0xFF,0xE0,0x3F,0xFF,
    0xFE,0x03,0xFF,0xFF,0xFF,0xC0,0x00,0xFE,0x03,0xFF,0xFF,0xFF,0xC0,0x7F,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0x80,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,
    0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0xFF,0xFC,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFC,0x00,0x00,0x00,0x3F,0x80,0xFF,0xFC,0x00,0x00,0x00,0x3F,0xFF,
    0xFF,0xFC,0x00,0x00,0x1F,0xC0,0x00,0xFF,0xFC,0x00,0x00,0x1F,0xC0,0x7F,0xFF,0xFC,0x00,0x00,0x1F,0xFF,0x80,0xFF,0xFC,0x00,0x00,0x1F,0xFF,0xFF,
    0xFF,0xFC,0x00,0x0F,0xE0,0x00,0x00,0xFF,0xFC,0x00,0x0F,0xE0,0x00,0x7F,0xFF,0xFC,0x00,0x0F,0xE0,0x3F,0x80,0xFF,0xFC,0x00,0x0F,0xE0,0x3F,0xFF,
    0xFF,0xFC,0x00,0x0F,0xFF,0xC0,0x00,0xFF,0xFC,0x00,0x0F,0xFF,0xC0,0x7F,0xFF,0xFC,0x00,0x0F,0xFF,0xFF,0x80,0xFF,0xFC,0x00,0x0F,0xFF,0xFF,0xFF,
    0xFF,0xFC,0x07,0xF0,0x00,0x00,0x00,0xFF,0xFC,0x07,0xF0,0x00,0x00,0x7F,0xFF,0xFC,0x07,0xF0,0x00,0x3F,0x80,0xFF,0xFC,0x07,0xF0,0x00,0x3F,0xFF,
    0xFF,0xFC,0x07,0xF0,0x1F,0xC0,0x00,0xFF,0xFC,0x07,0xF0,0x1F,0xC0,0x7F,0xFF,0xFC,0x07,0xF0,0x1F,0xFF,0x80,0xFF,0xFC,0x07,0xF0,0x1F,0xFF,0xFF,
    0xFF,0xFC,0x07,0xFF,0xE0,0x00,0x00,0xFF,0xFC,0x07,0xFF,0xE0,0x00,0x7F,0xFF,0xFC,0x07,0xFF,0xE0,0x3F,0x80,0xFF,0xFC,0x07,0xFF,0xE0,0x3F,0xFF,
    0xFF,0xFC,0x07,0xFF,0xFF,0xC0,0x00,0xFF,0xFC,0x07,0xFF,0xFF,0xC0,0x7F,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0x80,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xFF,
    0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xF8,0x00,0x00,0x3F,0x80,0xFF,0xFF,0xF8,0x00,0x00,0x3F,0xFF,
    0xFF,0xFF,0xF8,0x00,0x1F,0xC0,0x00,0xFF,0xFF,0xF8,0x00,0x1F,0xC0,0x7F,0xFF,0xFF,0xF8,0x00,0x1F,0xFF,0x80,0xFF,0xFF,0xF8,0x00,0x1F,0xFF,0xFF,
    0xFF,0xFF,0xF8,0x0F,0xE0,0x00,0x00,0xFF,0xFF,0xF8,0x0F,0xE0,0x00,0x7F,0xFF,0xFF,0xF8,0x0F,0xE0,0x3F,0x80,0xFF,0xFF,0xF8,0x0F,0xE0,0x3F,0xFF,
    0xFF,0xFF,0xF8,0x0F,0xFF,0xC0,0x00,0xFF,0xFF,0xF8,0x0F,0xFF,0xC0,0x7F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0x80,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xFF,
    0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xF0,0x00,0x3F,0x80,0xFF,0xFF,0xFF,0xF0,0x00,0x3F,0xFF,
    0xFF,0xFF,0xFF,0xF0,0x1F,0xC0,0x00,0xFF,0xFF,0xFF,0xF0,0x1F,0xC0,0x7F,0xFF,0xFF,0xFF,0xF0,0x1F,0xFF,0x80,0xFF,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,
    0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xE0,0x3F,0x80,0xFF,0xFF,0xFF,0xFF,0xE0,0x3F,0xFF,
    0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};

STATIC CONST BYTE MaskDataR[9] = { 0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00 };
STATIC CONST BYTE MaskDataL[9] = { 0x00,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00 };

STATIC CONST BYTE InvertData[256] = 
{
    0x00,0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0,
    0x08,0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8,
    0x04,0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4,0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4,
    0x0C,0x8C,0x4C,0xCC,0x2C,0xAC,0x6C,0xEC,0x1C,0x9C,0x5C,0xDC,0x3C,0xBC,0x7C,0xFC,
    0x02,0x82,0x42,0xC2,0x22,0xA2,0x62,0xE2,0x12,0x92,0x52,0xD2,0x32,0xB2,0x72,0xF2,
    0x0A,0x8A,0x4A,0xCA,0x2A,0xAA,0x6A,0xEA,0x1A,0x9A,0x5A,0xDA,0x3A,0xBA,0x7A,0xFA,
    0x06,0x86,0x46,0xC6,0x26,0xA6,0x66,0xE6,0x16,0x96,0x56,0xD6,0x36,0xB6,0x76,0xF6,
    0x0E,0x8E,0x4E,0xCE,0x2E,0xAE,0x6E,0xEE,0x1E,0x9E,0x5E,0xDE,0x3E,0xBE,0x7E,0xFE,
    0x01,0x81,0x41,0xC1,0x21,0xA1,0x61,0xE1,0x11,0x91,0x51,0xD1,0x31,0xB1,0x71,0xF1,
    0x09,0x89,0x49,0xC9,0x29,0xA9,0x69,0xE9,0x19,0x99,0x59,0xD9,0x39,0xB9,0x79,0xF9,
    0x05,0x85,0x45,0xC5,0x25,0xA5,0x65,0xE5,0x15,0x95,0x55,0xD5,0x35,0xB5,0x75,0xF5,
    0x0D,0x8D,0x4D,0xCD,0x2D,0xAD,0x6D,0xED,0x1D,0x9D,0x5D,0xDD,0x3D,0xBD,0x7D,0xFD,
    0x03,0x83,0x43,0xC3,0x23,0xA3,0x63,0xE3,0x13,0x93,0x53,0xD3,0x33,0xB3,0x73,0xF3,
    0x0B,0x8B,0x4B,0xCB,0x2B,0xAB,0x6B,0xEB,0x1B,0x9B,0x5B,0xDB,0x3B,0xBB,0x7B,0xFB,
    0x07,0x87,0x47,0xC7,0x27,0xA7,0x67,0xE7,0x17,0x97,0x57,0xD7,0x37,0xB7,0x77,0xF7,
    0x0F,0x8F,0x4F,0xCF,0x2F,0xAF,0x6F,0xEF,0x1F,0x9F,0x5F,0xDF,0x3F,0xBF,0x7F,0xFF
};

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

/******************************************************************************
 *
 * Function:
 *    
 *
 * Description: 
 *        
 *
 * Input:
 *      None
 *
 * Output:
 *      None.
 *
 ******************************************************************************/
INT LineMultiple(BYTE *Source, BYTE *Target, INT XDots, INT XMul, INT YMul, INT Delta)
{
    BYTE Buffer[10], Buffer2[10];
    BYTE *TempPtr;
    INT XLength, Len;
    INT i, j;

    Len = (XDots + 7) / 8;

    TempPtr = Target;
    switch (XMul)
    {
        case 1:
            memcpy(Target, Source, Len);
            break;
        case 2:
            for (i = 0; i < Len; i++)
            {
                memcpy(TempPtr, (BYTE *)&DupleTab[*(Source + i) * 2], XMul);
                TempPtr += XMul;
            }
            break;
        case 3:
            for (i = 0; i < Len; i++)
            {
                memcpy(TempPtr, (BYTE *)&TripleTab[*(Source + i) * 3], XMul);
                TempPtr += XMul;
            }
            break;
        case 4:
            for (i = 0; i < Len; i++)
            {
                memcpy(Buffer, (BYTE *)&DupleTab[*(Source + i ) * 2], 2);

                memcpy(TempPtr, (BYTE *)&DupleTab[(*Buffer) * 2], 2);
                TempPtr += 2;
                memcpy(TempPtr, (BYTE *)&DupleTab[*(Buffer + 1) * 2], 2);
                TempPtr += 2;
            }
            break;
        case 5:
            for (i = 0; i < Len; i++)
            {
                memcpy(TempPtr, (BYTE *)&QuintupleTab[*(Source + i) * 5], XMul);
                TempPtr += XMul;
            }
            break;
        case 6:
            for (i = 0; i < Len; i++)
            {
                memcpy(Buffer, (BYTE *)&DupleTab[*(Source + i) * 2], 2);

                memcpy(TempPtr, (BYTE *)&TripleTab[(*Buffer) * 3], 3);
                TempPtr += 3;
                memcpy(TempPtr, (BYTE *)&TripleTab[*(Buffer + 1) * 3], 3);
                TempPtr += 3;
            }
            break;
        case 7:
            for (i = 0; i < Len; i++)
            {
                memcpy(TempPtr, (BYTE *)&SeptupleTab[*(Source + i) * 7], XMul);
                TempPtr += XMul;
            }
            break;
        case 8:
            for (i = 0; i < Len; i++)
            {
                memcpy(Buffer, (BYTE *)&DupleTab[*(Source + i) * 2], 2);

                memcpy(Buffer2, (BYTE *)&DupleTab[(*Buffer) *2 ], 2 );
                memcpy(Buffer2 + 2, (BYTE *)&DupleTab[(*(Buffer + 1)) *2], 2);
                for (j = 0; j < 4; j++)
                {
                    memcpy(TempPtr, (BYTE *)&DupleTab[ (*(Buffer2 + j)) * 2], 2);
                    TempPtr += 2;
                }
            }
            break;
        case 9:
            for (i = 0; i < Len; i++)
            {
                memcpy(Buffer, (BYTE *)&TripleTab[*(Source + i) * 3], 3);

                for (j = 0; j < 3; j++)
                {
                    memcpy(TempPtr, (BYTE *)&TripleTab[*(Buffer + j) * 3], 3);
                    TempPtr += 3;
                }
            }
            break;
        case 10:
            for (i = 0; i < Len; i++)
            {
                memcpy(Buffer, (BYTE *)&DupleTab[*(Source + i) * 2], 2);

                for (j = 0; j < 2; j++)
                {
                    memcpy(TempPtr, (BYTE *)&QuintupleTab[*(Buffer + j) * 5], 5);
                    TempPtr += 5;
                }
            }
            break;
        default:
            return FALSE;
    }
    XLength = (XDots * XMul + 7) / 8;
    memset(Target + XLength, 0, Delta);

    XLength += Delta;
    for (i = 1; i < YMul; i++)
        memcpy(Target + XLength * i, Target, XLength);

    return XLength * YMul;
}

STATIC VOID EightBit(BYTE *pTraget, BYTE *pSource, BYTE *pShiftData, INT SourceWidth, INT Shitf_Start, INT End_Shift, INT Up_Shift)
{
    BYTE bTemp , bTempArray[8] , bMask;
    INT i,j;

    for ( i=0 ; i<End_Shift ; i++ )
        * ( bTempArray + i)  = *( pSource + i * SourceWidth );

    if ( Shitf_Start == 0 )
    {
        bMask = 0x80;
        End_Shift -= 1;
        
        for ( i=0 ; i<Up_Shift ; i++ )
        {
            bTemp = 0;
            for ( j = End_Shift ; j>=0 ; j-- )
            {
                bTemp >>= 1;
                bTemp |= *( bTempArray + j ) & bMask;
                *( bTempArray + j ) <<= 1;
            }
            *( pTraget + i ) = bTemp;
        }
    }
    else
    {
        bMask = 0x80;
        End_Shift -= 1;
        
        for ( i=0 ; i<Up_Shift ; i++ )
        {
            bTemp = 0;
            for ( j = End_Shift ; j>=0 ; j-- )
            {
                bTemp >>= 1;
                bTemp |= *( bTempArray + j ) & bMask;
                *( bTempArray + j ) <<= 1;
            }
            *( pTraget + i ) = *( pShiftData + i );
            *( pShiftData + i ) = bTemp <<(8 - Shitf_Start );
            *( pTraget + i ) |= ( bTemp >> Shitf_Start ) ;
        }
    }
}

VOID NorOR(INT wWidth, INT wHeight, INT SourceWidByte, INT wWidByte, INT wOffset, INT bShiftBit, BYTE *pImageSource, BYTE *pImageTarget)
{
    BYTE data, shift_data, temp_data;
    INT i, j;

    wWidth = ( wWidth + 7 ) /8;

    i = 0;
    j = 0;
    if ( bShiftBit )
    {
        shift_data = 0;
        pImageTarget += wOffset;
        while ( j != wHeight )
        {
            data = *(pImageSource + i);

            temp_data = data<<(8 - bShiftBit);
            data = data >> bShiftBit;
            data = data | shift_data;
            shift_data = temp_data;
            
            *(pImageTarget + i ) |= data;

            i++;
            if ( i == wWidth )
            {
                *(pImageTarget + i) |= shift_data;
                
                i = 0;
                j++;
                
                shift_data = 0;
                pImageTarget += wWidByte;
                pImageSource += SourceWidByte;
            }
        }
    }
    else
    {
        pImageTarget += wOffset;
        while ( j != wHeight )
        {
            *(pImageTarget + i ) |= *(pImageSource + i);
            i++;

            if ( i == wWidth )                  
            {                                  
                i = 0;
                j++;
                pImageTarget += wWidByte;
                pImageSource += SourceWidByte;
            }
        }
    }
}

VOID NorXOR(INT wWidth, INT wHeight, INT SourceWidByte, INT wWidByte, INT wOffset, INT bShiftBit, BYTE *pImageSource, BYTE *pImageTarget)
{
    BYTE data, shift_data, temp_data , temp_data_end; 
    INT i, j ,full_width;
    INT end_Shift;
    
    end_Shift = ( wWidth + bShiftBit ) % 8;
    full_width = ( wWidth + bShiftBit ) / 8;
    wWidth = ( wWidth +  7 ) / 8;

    pImageTarget += wOffset;
    if ( bShiftBit )
    {
        for ( j=0 ;j<wHeight ; j++ )
        {
            shift_data = 0;
            if ( full_width == 0 )
                temp_data_end = *pImageTarget & MaskDataL[end_Shift];
                    
            for ( i=0 ; i < wWidth  ; i++ )
            {
                temp_data = *(pImageSource + i) << (8 - bShiftBit);
                data = ( *(pImageSource + i) >> bShiftBit ) | shift_data;
                shift_data = temp_data;
            
                //put left image
                if ( i == 0 )
                {
                    temp_data = *pImageTarget & MaskDataR[8 - bShiftBit];
                    *pImageTarget ^= data;
                    *pImageTarget &= MaskDataL[bShiftBit];
                    *pImageTarget |= temp_data;
                }    
                else if ( ( i == full_width ) && end_Shift )
                {
                    temp_data_end = ( *(pImageTarget + i ) ) & MaskDataL[end_Shift];
                    *(pImageTarget + i ) ^= data;
                    *(pImageTarget + i ) &= MaskDataR[8 - end_Shift];
                    *(pImageTarget + i ) |= temp_data_end;
                }
                else
                    *(pImageTarget + i ) ^= data;
            }            
            // put right mask
            if ( end_Shift && ( wWidth <= full_width ))
            {
                temp_data_end = ( *(pImageTarget + full_width ) ) & MaskDataL[end_Shift];
                *(pImageTarget + full_width ) ^= shift_data;
                *(pImageTarget + full_width ) &= MaskDataR[ 8 - end_Shift];
                *(pImageTarget + full_width ) |= temp_data_end;
            }
            else if ( end_Shift && !full_width )
            {
                *pImageTarget &= MaskDataR[ 8 - end_Shift];
                *pImageTarget |= temp_data_end;
            }

            pImageTarget += wWidByte;
            pImageSource += SourceWidByte;
        }
    }
    else
    {
        for ( j=0 ; j<wHeight ; j++ )
        {
            // put full image
            for ( i=0 ; i< ( wWidth-1 ) ; i++ )
                *(pImageTarget + i ) ^= *(pImageSource + i);
            
            // put right mask image
            if ( end_Shift )
            {
                temp_data_end = ( *(pImageTarget + i ) ) & MaskDataL[end_Shift];
                *(pImageTarget + i ) ^= *(pImageSource + i);
                *(pImageTarget + i ) &= MaskDataR[ 8 - end_Shift];
                *(pImageTarget + i ) |= temp_data_end;
            }
            else
                *(pImageTarget + i ) ^= *(pImageSource + i);
                    
            pImageTarget += wWidByte;
            pImageSource += SourceWidByte;
        }
    }
}

VOID NorOW(INT wWidth, INT wHeight, INT SourceWidByte, INT wWidByte, INT wOffset, INT bShiftBit, BYTE *pImageSource, BYTE *pImageTarget)
{
    BYTE data, shift_data, temp_data , temp_data_end; 
    INT i, j ,full_width;
    INT end_Shift;
    
    end_Shift = ( wWidth + bShiftBit ) % 8;
    full_width = ( wWidth + bShiftBit ) / 8;
    wWidth = ( wWidth +  7 ) / 8;

    pImageTarget += wOffset;
    if ( bShiftBit )
    {
        for ( j=0 ;j<wHeight ; j++ )
        {
            shift_data = 0;
            if ( full_width == 0 )
                temp_data_end = *pImageTarget & MaskDataL[end_Shift];
                    
            for ( i=0 ; i < wWidth  ; i++ )
            {
                temp_data = *(pImageSource + i) << (8 - bShiftBit);
                data = ( *(pImageSource + i) >> bShiftBit ) | shift_data;
                shift_data = temp_data;
            
                //put left image
                if ( i == 0 )
                {
                    temp_data = *pImageTarget & MaskDataR[ 8 - bShiftBit ];
                    *pImageTarget = data;
                    *pImageTarget &= MaskDataL[ bShiftBit ];
                    *pImageTarget |= temp_data;
                }    
                else if ( ( i == full_width ) && end_Shift )
                {
                    temp_data_end = ( *(pImageTarget + i ) ) & MaskDataL[end_Shift];
                    *(pImageTarget + i ) = data;
                    *(pImageTarget + i ) &= MaskDataR[ 8 - end_Shift];
                    *(pImageTarget + i ) |= temp_data_end;
                }
                else
                    *(pImageTarget + i ) = data;
            }            
            // put right mask
            if ( end_Shift && ( wWidth <= full_width ))
            {
                temp_data_end = ( *(pImageTarget + full_width ) ) & MaskDataL[end_Shift];
                *(pImageTarget + full_width ) = shift_data;
                *(pImageTarget + full_width ) &= MaskDataR[ 8 - end_Shift];
                *(pImageTarget + full_width ) |= temp_data_end;
            }
            else if ( end_Shift && !full_width )
            {
                *pImageTarget &= MaskDataR[ 8 - end_Shift];
                *pImageTarget |= temp_data_end;
            }
            pImageTarget += wWidByte;
            pImageSource += SourceWidByte;
        }
    }
    else
    {
        for ( j=0 ; j<wHeight ; j++ )
        {
            // put full image
            for ( i=0 ; i< ( wWidth-1 ) ; i++ )
                *(pImageTarget + i ) = *(pImageSource + i);
            
            // put right mask image
            if ( end_Shift )
            {
                temp_data_end = ( *(pImageTarget + i ) ) & MaskDataL[end_Shift];
                *(pImageTarget + i ) = *(pImageSource + i);
                *(pImageTarget + i ) &= MaskDataR[ 8 - end_Shift];
                *(pImageTarget + i ) |= temp_data_end;
            }
            else
                *(pImageTarget + i ) = *(pImageSource + i);
                    
            pImageTarget += wWidByte;
            pImageSource += SourceWidByte;
        }
    }
}

VOID DownOR(INT wWidth, INT wHeight, INT SourceWidByte, INT wWidByte, INT wOffset, BYTE bShiftBit, BYTE *pImageSource, BYTE *pImageTarget)
{
    BYTE data, shift_data , temp_data , temp_data_start , temp_data_end,end_Shift;
    INT i, j , full_width;

    end_Shift = ( wWidth + bShiftBit ) % 8;
    full_width = ( wWidth + bShiftBit ) / 8;
    i = ( bShiftBit + wWidth + 7 ) /8;
    wWidth = ( wWidth +  7 ) / 8;

    pImageTarget += wOffset + i - 1;
        
    pImageSource += ( wWidth * ( wHeight - 1 ) );
    
    
    if ( end_Shift == 0 )
    {
        for ( j=0 ;j<wHeight ; j++ )
        {
            for ( i=0 ; i< ( wWidth-1) ; i++ )
                *(pImageTarget - i ) |= InvertData[ *(pImageSource + i) ];
            if ( bShiftBit )
            {
                temp_data_end = ( *(pImageTarget - i ) ) & MaskDataR[8 - bShiftBit];
                *(pImageTarget - i ) |= InvertData[ *(pImageSource + i) ];
                *(pImageTarget - i ) &= MaskDataL[ bShiftBit];
                *(pImageTarget - i ) |= temp_data_end;
            }
            else
                *(pImageTarget - i ) |= InvertData[ *(pImageSource + i)];
                    
            pImageTarget += wWidByte;
            pImageSource -= SourceWidByte;
        }
    }
    else
    {
        shift_data = 0;
        for ( j=0 ;j<wHeight ; j++ )
        {
            if ( full_width == 0 )
                temp_data_end = *pImageTarget & MaskDataR[ 8 - bShiftBit];
            for ( i=0 ; i <wWidth ; i++ )
            {
                data = InvertData[ *(pImageSource + i)];
                temp_data = data >> end_Shift;
                data = ( data << ( 8 - end_Shift ) ) | shift_data;
                shift_data = temp_data;
            
                if ( i == 0 )
                {
                    temp_data_start = *pImageTarget & MaskDataL[ end_Shift ];
                    *pImageTarget |= data;
                    *pImageTarget &= MaskDataR[ 8 - end_Shift ];
                    *pImageTarget |= temp_data_start;
                }    
                else if ( ( i == full_width ) && bShiftBit  )
                {
                    temp_data_end = ( *(pImageTarget - full_width ) ) & MaskDataR[ 8 - bShiftBit];
                    *(pImageTarget - full_width ) |= data;
                    *(pImageTarget - full_width ) &= MaskDataL[ bShiftBit];
                    *(pImageTarget - full_width ) |= temp_data_end;
                }
                else
                    *(pImageTarget - i ) |= data;
            }            
            
            if ( ( bShiftBit ) && ( wWidth <= full_width ))
            {
                temp_data_end = ( *(pImageTarget - full_width ) ) & MaskDataR[ 8 - bShiftBit];
                *(pImageTarget - full_width ) |= shift_data;
                *(pImageTarget - full_width ) &= MaskDataL[ bShiftBit];
                *(pImageTarget - full_width ) |= temp_data_end;
            }
            else if ( bShiftBit && !full_width )
            {
                *pImageTarget &= MaskDataL[ bShiftBit];
                *pImageTarget |= temp_data_end;
            }
            shift_data = 0;
            pImageTarget += wWidByte;
            pImageSource -= SourceWidByte;
        }
    }
}

VOID DownXOR(INT wWidth, INT wHeight, INT SourceWidByte, INT wWidByte, INT wOffset, BYTE bShiftBit, BYTE *pImageSource, BYTE *pImageTarget)
{
    BYTE data, shift_data , temp_data , temp_data_start , temp_data_end,end_Shift;
    INT i, j , full_width;

    end_Shift = ( wWidth + bShiftBit ) % 8;
    full_width = ( wWidth + bShiftBit ) / 8;
    i = ( bShiftBit + wWidth + 7 ) /8;
    wWidth = ( wWidth +  7 ) / 8;

    pImageTarget += wOffset + i - 1;
        
    pImageSource += ( wWidth * ( wHeight - 1 ) );
    
    
    if ( end_Shift == 0 )
    {
        for ( j=0 ;j<wHeight ; j++ )
        {
            for ( i=0 ; i< ( wWidth-1) ; i++ )
                *(pImageTarget - i ) ^= InvertData[ *(pImageSource + i) ];
            if ( bShiftBit )
            {
                temp_data_end = ( *(pImageTarget - i ) ) & MaskDataR[8 - bShiftBit];
                *(pImageTarget - i ) ^= InvertData[ *(pImageSource + i) ];
                *(pImageTarget - i ) &= MaskDataL[ bShiftBit];
                *(pImageTarget - i ) |= temp_data_end;
            }
            else
                *(pImageTarget - i ) ^= InvertData[ *(pImageSource + i)];
                    
            pImageTarget += wWidByte;
            pImageSource -= SourceWidByte;
        }
    }
    else
    {
        shift_data = 0;
        for ( j=0 ;j<wHeight ; j++ )
        {
            if ( full_width == 0 )
                temp_data_end = *pImageTarget & MaskDataR[ 8 - bShiftBit];
            for ( i=0 ; i <wWidth ; i++ )
            {
                data = InvertData[ *(pImageSource + i)];
                temp_data = data >> end_Shift;
                data = ( data << ( 8 - end_Shift ) ) | shift_data;
                shift_data = temp_data;
            
                if ( i == 0 )
                {
                    temp_data_start = *pImageTarget & MaskDataL[ end_Shift ];
                    *pImageTarget ^= data;
                    *pImageTarget &= MaskDataR[ 8 - end_Shift ];
                    *pImageTarget |= temp_data_start;
                }    
                else if ( ( i == full_width ) && bShiftBit  )
                {
                    temp_data_end = ( *(pImageTarget - full_width ) ) & MaskDataR[ 8 - bShiftBit];
                    *(pImageTarget - full_width ) ^= data;
                    *(pImageTarget - full_width ) &= MaskDataL[ bShiftBit];
                    *(pImageTarget - full_width ) |= temp_data_end;
                }
                else
                    *(pImageTarget - i ) ^= data;
            }            
            
            if ( ( bShiftBit ) && ( wWidth <= full_width ))
            {
                temp_data_end = ( *(pImageTarget - full_width ) ) & MaskDataR[ 8 - bShiftBit];
                *(pImageTarget - full_width ) ^= shift_data;
                *(pImageTarget - full_width ) &= MaskDataL[ bShiftBit];
                *(pImageTarget - full_width ) |= temp_data_end;
            }
            else if ( bShiftBit && !full_width )
            {
                *pImageTarget &= MaskDataL[ bShiftBit];
                *pImageTarget |= temp_data_end;
            }
            shift_data = 0;
            pImageTarget += wWidByte;
            pImageSource -= SourceWidByte;
        }
    }
}

VOID DownOW(INT wWidth, INT wHeight, INT SourceWidByte, INT wWidByte, INT wOffset, BYTE bShiftBit, BYTE *pImageSource, BYTE *pImageTarget)
{
    BYTE data, shift_data , temp_data , temp_data_start , temp_data_end,end_Shift;
    INT i, j , full_width;

    end_Shift = ( wWidth + bShiftBit ) % 8;
    full_width = ( wWidth + bShiftBit ) / 8;
    i = ( bShiftBit + wWidth + 7 ) /8;
    wWidth = ( wWidth +  7 ) / 8;

    pImageTarget += wOffset + i - 1;
        
    pImageSource += ( wWidth * ( wHeight - 1 ) );
    
    
    if ( end_Shift == 0 )
    {
        for ( j=0 ;j<wHeight ; j++ )
        {
            for ( i=0 ; i< ( wWidth-1) ; i++ )
                *(pImageTarget - i ) = InvertData[ *(pImageSource + i) ];
            if ( bShiftBit )
            {
                temp_data_end = ( *(pImageTarget - i ) ) & MaskDataR[8 - bShiftBit];
                *(pImageTarget - i ) = InvertData[ *(pImageSource + i) ];
                *(pImageTarget - i ) &= MaskDataL[ bShiftBit];
                *(pImageTarget - i ) |= temp_data_end;
            }
            else
                *(pImageTarget - i ) = InvertData[ *(pImageSource + i)];
                    
            pImageTarget += wWidByte;
            pImageSource -= SourceWidByte;
        }
    }
    else
    {
        shift_data = 0;
        for ( j=0 ;j<wHeight ; j++ )
        {
            if ( full_width == 0 )
                temp_data_end = *pImageTarget & MaskDataR[ 8 - bShiftBit];
            for ( i=0 ; i <wWidth ; i++ )
            {
                data = InvertData[ *(pImageSource + i)];
                temp_data = data >> end_Shift;
                data = ( data << ( 8 - end_Shift ) ) | shift_data;
                shift_data = temp_data;
            
                if ( i == 0 )
                {
                    temp_data_start = *pImageTarget & MaskDataL[ end_Shift ];
                    *pImageTarget = data;
                    *pImageTarget &= MaskDataR[ 8 - end_Shift ];
                    *pImageTarget |= temp_data_start;
                }    
                else if ( ( i == full_width ) && bShiftBit  )
                {
                    temp_data_end = ( *(pImageTarget - full_width ) ) & MaskDataR[ 8 - bShiftBit];
                    *(pImageTarget - full_width ) = data;
                    *(pImageTarget - full_width ) &= MaskDataL[ bShiftBit];
                    *(pImageTarget - full_width ) |= temp_data_end;
                }
                else
                    *(pImageTarget - i ) = data;
            }            
            
            if ( ( bShiftBit ) && ( wWidth <= full_width ))
            {
                temp_data_end = ( *(pImageTarget - full_width ) ) & MaskDataR[ 8 - bShiftBit];
                *(pImageTarget - full_width ) = shift_data;
                *(pImageTarget - full_width ) &= MaskDataL[ bShiftBit];
                *(pImageTarget - full_width ) |= temp_data_end;
            }
            else if ( bShiftBit && !full_width )
            {
                *pImageTarget &= MaskDataL[ bShiftBit];
                *pImageTarget |= temp_data_end;
            }

            shift_data = 0;
            pImageTarget += wWidByte;
            pImageSource -= SourceWidByte;
        }
    }
}

VOID LeftOR(INT wWidth, INT wHeight, INT SourceWidByte, INT wWidByte, INT wOffset, BYTE bShiftBit, BYTE *pImageSource, BYTE *pImageTarget)
{
    BYTE data[9], shift_data[9], temp_array[9], temp_data, end_Shift;
    INT i, j, k, l, full_width, font_wide, Up_Shift;

    memset(data, 0, sizeof(data));
    memset(shift_data, 0, sizeof(shift_data));
    memset(temp_array, 0, sizeof(temp_array));

    font_wide =  ( wHeight + 7 ) /8;
    Up_Shift = wHeight % 8;
    if ( Up_Shift == 0 )
        Up_Shift = 8;
    end_Shift = ( wWidth + bShiftBit ) % 8;
    full_width = ( wWidth + bShiftBit ) / 8; 
    wWidth = ( wWidth +  7 ) / 8;

    pImageTarget += ( wOffset + wWidByte * (wHeight - 1 ) );

    if ( bShiftBit == 0 )
    {
        for ( i=0 ; i< font_wide ; i++ )
        {
            if ( i == ( font_wide - 1 ) )
                l = Up_Shift ;
            else
                l = 8;

            for ( j=0 ; j<wWidth ; j++ )
            {
                if ( j == ( wWidth - 1 ) && end_Shift != 0 )
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , bShiftBit , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                    {
                        temp_data = *( pImageTarget    - k * wWidByte + j ) & MaskDataL[end_Shift];
                        *( pImageTarget    -  k * wWidByte + j ) |= data[k];
                        *( pImageTarget    -  k * wWidByte + j ) &= MaskDataR[ 8 - end_Shift];
                        *( pImageTarget    -  k * wWidByte + j ) |= temp_data;
                    }
                }
                else
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , bShiftBit , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                        *( pImageTarget    -  k * wWidByte + j ) |= data[k];
                }
            }
            pImageSource += 1;
            pImageTarget -= wWidByte * 8;
        }
    }
    else
    {
        for ( i=0 ; i< font_wide ; i++ )
        {
            if ( i == ( font_wide - 1 ) )
                l = Up_Shift ;
            else
                l = 8;
            
            if ( full_width == 0 )
            {
                for ( j=0 ; j<l ; j++ )
                    temp_array[j] = *( pImageTarget + j * wWidByte ) & MaskDataL[end_Shift];
            }
            for ( j=0 ; j<wWidth ; j++ )
            {
                if ( j == 0 )
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , bShiftBit , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                    {
                        temp_data = *( pImageTarget    - k * wWidByte ) & MaskDataR[ 8 - bShiftBit ];
                        *( pImageTarget    -  k * wWidByte ) |= data[k];
                        *( pImageTarget    -  k * wWidByte ) &= MaskDataL[ bShiftBit ];
                        *( pImageTarget    -  k * wWidByte ) |= temp_data;
                    }
                }
                else 
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , bShiftBit , 8 , l);
                    if ( ( j == full_width ) && ( end_Shift != 0 ) )
                    {
                        for ( k=0 ; k<l ; k++ )
                        {
                            temp_data = *( pImageTarget    - k * wWidByte + j ) & MaskDataL[end_Shift];
                            *( pImageTarget    -  k * wWidByte + j ) |= data[k];
                            *( pImageTarget    -  k * wWidByte + j ) &= MaskDataR[ 8 - end_Shift];
                            *( pImageTarget    -  k * wWidByte + j ) |= temp_data;
                        }
                    }
                    else
                    {
                        for ( k=0 ; k<l ; k++ )
                            *( pImageTarget    -  k * wWidByte + j ) |= data[k];
                    }
                }
            }
            
            if ( ( end_Shift != 0 ) &&( wWidth <= full_width ))
            {
                for ( k=0 ; k<l ; k++ )
                {
                    temp_data = *( pImageTarget    - k * wWidByte + j ) & MaskDataL[end_Shift];
                    *( pImageTarget    -  k * wWidByte + j ) |= shift_data[k];
                    *( pImageTarget    -  k * wWidByte + j ) &= MaskDataR[ 8 - end_Shift];
                    *( pImageTarget    -  k * wWidByte + j ) |= temp_data;
                }
            }
            else if ( ( end_Shift != 0 ) && ( !full_width ) )
            {
                for ( k=0 ; k<l ; k++ )
                {
                    temp_data = temp_array[k];
                    *( pImageTarget -  k * wWidByte ) &= MaskDataR[ 8 - end_Shift];
                    *( pImageTarget -  k * wWidByte ) |= temp_data;
                }
            }
            pImageSource += 1;
            pImageTarget -= wWidByte * 8;
        }

    }
}

VOID LeftXOR(INT wWidth, INT wHeight, INT SourceWidByte, INT wWidByte, INT wOffset, BYTE bShiftBit, BYTE *pImageSource, BYTE *pImageTarget)
{
    BYTE data[9], shift_data[9], temp_array[9], temp_data, end_Shift;
    INT i, j, k, l, full_width, font_wide, Up_Shift;

    memset(data, 0, sizeof(data));
    memset(shift_data, 0, sizeof(shift_data));
    memset(temp_array, 0, sizeof(temp_array));

    font_wide =  ( wHeight + 7 ) /8;
    Up_Shift = wHeight % 8;
    if ( Up_Shift == 0 )
        Up_Shift = 8;
    end_Shift = ( wWidth + bShiftBit ) % 8;
    full_width = ( wWidth + bShiftBit ) / 8; 
    wWidth = ( wWidth +  7 ) / 8;

    pImageTarget += ( wOffset + wWidByte * (wHeight - 1 ) );

    if ( bShiftBit == 0 )
    {
        for ( i=0 ; i< font_wide ; i++ )
        {
            if ( i == ( font_wide - 1 ) )
                l = Up_Shift ;
            else
                l = 8;
            
            for ( j=0 ; j<wWidth ; j++ )
            {
                if ( j == ( wWidth - 1 ) && end_Shift != 0 )
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , bShiftBit , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                    {
                        temp_data = *( pImageTarget    - k * wWidByte + j ) & MaskDataL[end_Shift];
                        *( pImageTarget    -  k * wWidByte + j ) ^= data[k];
                        *( pImageTarget    -  k * wWidByte + j ) &= MaskDataR[ 8 - end_Shift];
                        *( pImageTarget    -  k * wWidByte + j ) |= temp_data;
                    }
                }
                else
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , bShiftBit , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                        *( pImageTarget    -  k * wWidByte + j ) ^= data[k];
                }
            }
            pImageSource += 1;
            pImageTarget -= wWidByte * 8;
        }
    }
    else
    {
        for ( i=0 ; i< font_wide ; i++ )
        {
            if ( i == ( font_wide - 1 ) )
                l = Up_Shift ;
            else
                l = 8;
            
            if ( full_width == 0 )
            {
                for ( j=0 ; j<l ; j++ )
                    temp_array[j] = *( pImageTarget -  j * wWidByte ) & MaskDataL[end_Shift];
            }
            for ( j=0 ; j<wWidth ; j++ )
            {
                if ( j == 0 )
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , bShiftBit , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                    {
                        temp_data = *( pImageTarget    - k * wWidByte ) & MaskDataR[ 8 - bShiftBit ];
                        *( pImageTarget    -  k * wWidByte ) ^= data[k];
                        *( pImageTarget    -  k * wWidByte ) &= MaskDataL[ bShiftBit ];
                        *( pImageTarget    -  k * wWidByte ) |= temp_data;
                    }
                }
                else 
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , bShiftBit , 8 , l);
                    if ( ( j == full_width ) && ( end_Shift != 0 ) )
                    {
                        for ( k=0 ; k<l ; k++ )
                        {
                            temp_data = *( pImageTarget    - k * wWidByte + j ) & MaskDataL[end_Shift];
                            *( pImageTarget    -  k * wWidByte + j ) ^= data[k];
                            *( pImageTarget    -  k * wWidByte + j ) &= MaskDataR[ 8 - end_Shift];
                            *( pImageTarget    -  k * wWidByte + j ) |= temp_data;
                        }
                    }
                    else
                    {
                        for ( k=0 ; k<l ; k++ )
                            *( pImageTarget    -  k * wWidByte + j ) ^= data[k];
                    }
                }

            }
            
            if ( ( end_Shift != 0 ) &&( wWidth <= full_width ))
            {
                for ( k=0 ; k<l ; k++ )
                {
                    temp_data = *( pImageTarget    - k * wWidByte + j ) & MaskDataL[end_Shift];
                    *( pImageTarget    -  k * wWidByte + j ) ^= shift_data[k];
                    *( pImageTarget    -  k * wWidByte + j ) &= MaskDataR[ 8 - end_Shift];
                    *( pImageTarget    -  k * wWidByte + j ) |= temp_data;
                }
            }
            else if ( ( end_Shift != 0 ) && ( !full_width ) )
            {
                for ( k=0 ; k<l ; k++ )
                {
                    temp_data = temp_array[k];
                    *( pImageTarget -  k * wWidByte ) &= MaskDataR[ 8 - end_Shift];
                    *( pImageTarget -  k * wWidByte ) |= temp_data;
                }
            }
            pImageSource += 1;
            pImageTarget -= wWidByte * 8;
        }

    }
}

VOID LeftOW(INT wWidth, INT wHeight, INT SourceWidByte, INT wWidByte, INT wOffset, BYTE bShiftBit, BYTE *pImageSource, BYTE *pImageTarget)
{
    BYTE data[9], shift_data[9], temp_array[9], temp_data, end_Shift;
    INT i, j, k, l, full_width, font_wide, Up_Shift;

    memset(data, 0, sizeof(data));
    memset(shift_data, 0, sizeof(shift_data));
    memset(temp_array, 0, sizeof(temp_array));

    font_wide =  ( wHeight + 7 ) /8;
    Up_Shift = wHeight % 8;
    if ( Up_Shift == 0 )
        Up_Shift = 8;
    end_Shift = ( wWidth + bShiftBit ) % 8;
    full_width = ( wWidth + bShiftBit ) / 8; 
    wWidth = ( wWidth +  7 ) / 8;
        
    pImageTarget += ( wOffset + wWidByte * (wHeight - 1 ) );

    if ( bShiftBit == 0 )
    {
        for ( i=0 ; i< font_wide ; i++ )
        {
            if ( i == ( font_wide - 1 ) )
                l = Up_Shift ;
            else
                l = 8;

            for ( j=0 ; j<wWidth ; j++ )
            {
                if ( j == ( wWidth - 1 ) && end_Shift != 0 )
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , bShiftBit , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                    {
                        temp_data = *( pImageTarget    - k * wWidByte + j ) & MaskDataL[end_Shift];
                        *( pImageTarget    -  k * wWidByte + j ) = data[k];
                        *( pImageTarget    -  k * wWidByte + j ) &= MaskDataR[ 8 - end_Shift];
                        *( pImageTarget    -  k * wWidByte + j ) |= temp_data;
                    }
                }
                else
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , bShiftBit , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                        *( pImageTarget    -  k * wWidByte + j ) = data[k];
                }
            }
            pImageSource += 1;
            pImageTarget -= wWidByte * 8;
        }
    }
    else
    {
        for ( i=0 ; i< font_wide ; i++ )
        {
            if ( i == ( font_wide - 1 ) )
                l = Up_Shift ;
            else
                l = 8;
            
            if ( full_width == 0 )
            {
                for ( j=0 ; j<l ; j++ )
                    temp_array[j] = *( pImageTarget + j * wWidByte ) & MaskDataL[end_Shift];
            }
            for ( j=0 ; j<wWidth ; j++ )
            {
                if ( j == 0 )
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , bShiftBit , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                    {
                        temp_data = *( pImageTarget    - k * wWidByte ) & MaskDataR[ 8 - bShiftBit ];
                        *( pImageTarget    -  k * wWidByte ) = data[k];
                        *( pImageTarget    -  k * wWidByte ) &= MaskDataL[ bShiftBit ];
                        *( pImageTarget    -  k * wWidByte ) |= temp_data;
                    }
                }
                else 
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , bShiftBit , 8 , l);
                    if ( ( j == full_width ) && ( end_Shift != 0 ) )
                    {
                        for ( k=0 ; k<l ; k++ )
                        {
                            temp_data = *( pImageTarget    - k * wWidByte + j ) & MaskDataL[end_Shift];
                            *( pImageTarget    -  k * wWidByte + j ) = data[k];
                            *( pImageTarget    -  k * wWidByte + j ) &= MaskDataR[ 8 - end_Shift];
                            *( pImageTarget    -  k * wWidByte + j ) |= temp_data;
                        }
                    }
                    else
                    {
                        for ( k=0 ; k<l ; k++ )
                            *( pImageTarget    -  k * wWidByte + j ) = data[k];
                    }
                }

            }
            
            if ( ( end_Shift != 0 ) &&( wWidth <= full_width ))
            {
                for ( k=0 ; k<l ; k++ )
                {
                    temp_data = *( pImageTarget    - k * wWidByte + j ) & MaskDataL[end_Shift];
                    *( pImageTarget    -  k * wWidByte + j ) = shift_data[k];
                    *( pImageTarget    -  k * wWidByte + j ) &= MaskDataR[ 8 - end_Shift];
                    *( pImageTarget    -  k * wWidByte + j ) |= temp_data;
                }
            }
            else if ( ( end_Shift != 0 ) && ( !full_width ) )
            {
                for ( k=0 ; k<l ; k++ )
                {
                    temp_data = temp_array[k];
                    *( pImageTarget -  k * wWidByte ) &= MaskDataR[ 8 - end_Shift];
                    *( pImageTarget -  k * wWidByte ) |= temp_data;
                }
            }
            
            pImageSource += 1;
            pImageTarget -= wWidByte * 8;
        }

    }
}

VOID RightOR(INT wWidth, INT wHeight, INT SourceWidByte, INT wWidByte, INT wOffset, BYTE bShiftBit, BYTE *pImageSource, BYTE *pImageTarget)
{
    BYTE data[9], shift_data[9], temp_array[9], temp_data, end_Shift;
    INT i, j, k, l, full_width, font_wide, Up_Shift;

    memset(data, 0, sizeof(data));
    memset(shift_data, 0, sizeof(shift_data));
    memset(temp_array, 0, sizeof(temp_array));

    font_wide =  ( wHeight + 7 ) /8;
    i = ( bShiftBit + wWidth + 7 ) /8;
    Up_Shift = wHeight % 8;
    if ( Up_Shift == 0 )
        Up_Shift = 8;
    end_Shift = ( wWidth + bShiftBit ) % 8;
    full_width = ( wWidth + bShiftBit ) / 8; 
    wWidth = ( wWidth +  7 ) / 8;
        
    pImageTarget += ( wOffset + i - 1 );

    if ( end_Shift == 0 )
    {
        for ( i=0 ; i< font_wide ; i++ )
        {
            if ( i == ( font_wide - 1 ) )
                l = Up_Shift ;
            else
                l = 8;
            
            for ( j=0 ; j<wWidth ; j++ )
            {
                if ( j == ( wWidth - 1 ) && bShiftBit != 0 )
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , ( 8 - end_Shift )% 8 , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                    {
                        temp_data = *( pImageTarget    + k * wWidByte - j ) & MaskDataR[ 8 - bShiftBit ];
                        *( pImageTarget    +  k * wWidByte - j ) |= InvertData[ data[k] ];
                        *( pImageTarget    +  k * wWidByte - j ) &= MaskDataL[ bShiftBit];
                        *( pImageTarget    +  k * wWidByte - j ) |= temp_data;
                    }
                }
                else
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , ( 8 - end_Shift )% 8 , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                    {
                        *( pImageTarget    +  k * wWidByte - j ) |= InvertData[ data[k] ] ;
                    }
                }
            }
            pImageSource += 1;
            pImageTarget += wWidByte * 8;
        }
    }
    else
    {
        for ( i=0 ; i< font_wide ; i++ )
        {
            if ( i == ( font_wide - 1 ) )
                l = Up_Shift ;
            else
                l = 8;
            
            if ( full_width == 0 )
            {
                for ( j=0 ; j<l ; j++ )
                    temp_array[j] = *( pImageTarget    +  j * wWidByte ) & MaskDataR[ 8 - bShiftBit ];
            }
            for ( j=0 ; j<wWidth ; j++ )
            {
                if ( j == 0 )
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , ( 8 - end_Shift )% 8  , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                    {
                        temp_data = *( pImageTarget    + k * wWidByte ) & MaskDataL[ end_Shift ];
                        *( pImageTarget    +  k * wWidByte ) |= InvertData[ data[k] ];
                        *( pImageTarget    +  k * wWidByte ) &= MaskDataR[ 8 - end_Shift ];
                        *( pImageTarget    +  k * wWidByte ) |= temp_data;
                    }
                }
                else 
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , ( 8 - end_Shift )% 8 , 8 , l);
                    if ( ( j == full_width ) && ( bShiftBit != 0 ) )
                    {
                        for ( k=0 ; k<l ; k++ )
                        {
                            temp_data = *( pImageTarget    + k * wWidByte - full_width ) & MaskDataR[ 8 - bShiftBit ];
                            *( pImageTarget    +  k * wWidByte - full_width ) |= InvertData[ data[k] ];
                            *( pImageTarget    +  k * wWidByte - full_width ) &= MaskDataL[ bShiftBit];
                            *( pImageTarget    +  k * wWidByte - full_width ) |= temp_data;
                        }
                    }
                    else
                    {
                        for ( k=0 ; k<l ; k++ )
                            *( pImageTarget    +  k * wWidByte - j ) |= InvertData[ data[k] ];
                    }
                }

            }
            
            if ( ( bShiftBit != 0  ) && ( wWidth <= full_width ) )
            {
                for ( k=0 ; k<l ; k++ )
                {
                    temp_data = *( pImageTarget    + k * wWidByte - full_width ) & MaskDataR[ 8 - bShiftBit ];
                    *( pImageTarget    +  k * wWidByte - full_width ) |= InvertData[ shift_data[k] ];
                    *( pImageTarget    +  k * wWidByte - full_width ) &= MaskDataL[ bShiftBit];
                    *( pImageTarget    +  k * wWidByte - full_width ) |= temp_data;
                }
            }
            else if ( ( bShiftBit != 0 ) && ( !full_width ) )
            {
                for ( k=0 ; k<l ; k++ )
                {
                    temp_data = temp_array[k];
                    *( pImageTarget +  k * wWidByte ) &= MaskDataL[ bShiftBit];
                    *( pImageTarget +  k * wWidByte ) |= temp_data;
                }
            }
            pImageSource += 1;
            pImageTarget += wWidByte * 8;
        }

    }
}

VOID RightXOR(INT wWidth, INT wHeight, INT SourceWidByte, INT wWidByte, INT wOffset, BYTE bShiftBit, BYTE *pImageSource, BYTE *pImageTarget)
{
    BYTE data[9], shift_data[9], temp_array[9], temp_data, end_Shift;
    INT i, j, k, l, full_width, font_wide, Up_Shift;

    memset(data, 0, sizeof(data));
    memset(shift_data, 0, sizeof(shift_data));
    memset(temp_array, 0, sizeof(temp_array));

    font_wide =  ( wHeight + 7 ) /8;
    i = ( bShiftBit + wWidth + 7 ) /8;
    Up_Shift = wHeight % 8;
    if ( Up_Shift == 0 )
        Up_Shift = 8;
    end_Shift = ( wWidth + bShiftBit ) % 8;
    full_width = ( wWidth + bShiftBit ) / 8; 
    wWidth = ( wWidth +  7 ) / 8;
        
    pImageTarget += ( wOffset + i - 1 );

    if ( end_Shift == 0 )
    {
        for ( i=0 ; i< font_wide ; i++ )
        {
            if ( i == ( font_wide - 1 ) )
                l = Up_Shift ;
            else
                l = 8;
            
            for ( j=0 ; j<wWidth ; j++ )
            {
                if ( j == ( wWidth - 1 ) && bShiftBit != 0 )
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , ( 8 - end_Shift )% 8 , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                    {
                        temp_data = *( pImageTarget    + k * wWidByte - j ) & MaskDataR[ 8 - bShiftBit ];
                        *( pImageTarget    +  k * wWidByte - j ) ^= InvertData[ data[k] ];
                        *( pImageTarget    +  k * wWidByte - j ) &= MaskDataL[ bShiftBit];
                        *( pImageTarget    +  k * wWidByte - j ) |= temp_data;
                    }
                }
                else
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , ( 8 - end_Shift )% 8 , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                    {
                        *( pImageTarget    +  k * wWidByte - j ) ^= InvertData[ data[k] ] ;
                    }
                }
            }
            pImageSource += 1;
            pImageTarget += wWidByte * 8;
        }
    }
    else
    {
        for ( i=0 ; i< font_wide ; i++ )
        {
            if ( i == ( font_wide - 1 ) )
                l = Up_Shift ;
            else
                l = 8;
            
            if ( full_width == 0 )
            {
                for ( j=0 ; j<l ; j++ )
                    temp_array[j] = *( pImageTarget +  j * wWidByte ) & MaskDataR[ 8 - bShiftBit ];
            }
            for ( j=0 ; j<wWidth ; j++ )
            {
                if ( j == 0 )
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , ( 8 - end_Shift )% 8  , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                    {
                        temp_data = *( pImageTarget    + k * wWidByte ) & MaskDataL[ end_Shift ];
                        *( pImageTarget +  k * wWidByte ) ^= InvertData[ data[k] ];
                        *( pImageTarget +  k * wWidByte ) &= MaskDataR[ 8 - end_Shift ];
                        *( pImageTarget +  k * wWidByte ) |= temp_data;
                    }
                }
                else 
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , ( 8 - end_Shift )% 8 , 8 , l);
                    if ( ( j == full_width ) && ( bShiftBit != 0 ) )
                    {
                        for ( k=0 ; k<l ; k++ )
                        {
                            temp_data = *( pImageTarget    + k * wWidByte - full_width ) & MaskDataR[ 8 - bShiftBit ];
                            *( pImageTarget    +  k * wWidByte - full_width ) ^= InvertData[ data[k] ];
                            *( pImageTarget    +  k * wWidByte - full_width ) &= MaskDataL[ bShiftBit];
                            *( pImageTarget    +  k * wWidByte - full_width ) |= temp_data;
                        }
                    }
                    else
                    {
                        for ( k=0 ; k<l ; k++ )
                            *( pImageTarget    +  k * wWidByte - j ) ^= InvertData[ data[k] ];
                    }
                }

            }
            
            if ( ( bShiftBit != 0  ) && ( wWidth <= full_width ) )
            {
                for ( k=0 ; k<l ; k++ )
                {
                    temp_data = *( pImageTarget    + k * wWidByte - full_width ) & MaskDataR[ 8 - bShiftBit ];
                    *( pImageTarget    +  k * wWidByte - full_width ) ^= InvertData[ shift_data[k] ];
                    *( pImageTarget    +  k * wWidByte - full_width ) &= MaskDataL[ bShiftBit];
                    *( pImageTarget    +  k * wWidByte - full_width ) |= temp_data;
                }
            }
            else if ( ( bShiftBit != 0 ) && ( !full_width ) )
            {
                for ( k=0 ; k<l ; k++ )
                {
                    temp_data = temp_array[k];
                    *( pImageTarget +  k * wWidByte ) &= MaskDataL[ bShiftBit];
                    *( pImageTarget +  k * wWidByte ) |= temp_data;
                }
            }
            pImageSource += 1;
            pImageTarget += wWidByte * 8;
        }

    }
}

VOID RightOW(INT wWidth, INT wHeight, INT SourceWidByte, INT wWidByte, INT wOffset, BYTE bShiftBit, BYTE *pImageSource, BYTE *pImageTarget)
{
    BYTE data[9], shift_data[9], temp_array[9], temp_data, end_Shift;
    INT i, j, k, l, full_width, font_wide, Up_Shift;

    memset(data, 0, sizeof(data));
    memset(shift_data, 0, sizeof(shift_data));
    memset(temp_array, 0, sizeof(temp_array));

    font_wide =  ( wHeight + 7 ) /8;
    i = ( bShiftBit + wWidth + 7 ) /8;
    Up_Shift = wHeight % 8;
    if ( Up_Shift == 0 )
        Up_Shift = 8;
    end_Shift = ( wWidth + bShiftBit ) % 8;
    full_width = ( wWidth + bShiftBit ) / 8;
    wWidth = ( wWidth +  7 ) / 8;

    pImageTarget += ( wOffset + i - 1 );

    if ( end_Shift == 0 )
    {
        for ( i=0 ; i< font_wide ; i++ )
        {
            if ( i == ( font_wide - 1 ) )
                l = Up_Shift ;
            else
                l = 8;
            
            for ( j=0 ; j<wWidth ; j++ )
            {
                if ( j == ( wWidth - 1 ) && bShiftBit != 0 )
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , ( 8 - end_Shift )% 8 , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                    {
                        temp_data = *( pImageTarget    + k * wWidByte - j ) & MaskDataR[ 8 - bShiftBit ];
                        *( pImageTarget    +  k * wWidByte - j ) = InvertData[ data[k] ];
                        *( pImageTarget    +  k * wWidByte - j ) &= MaskDataL[ bShiftBit];
                        *( pImageTarget    +  k * wWidByte - j ) |= temp_data;
                    }
                }
                else
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , ( 8 - end_Shift )% 8 , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                    {
                        *( pImageTarget    +  k * wWidByte - j ) = InvertData[ data[k] ] ;
                    }
                }
            }
            pImageSource += 1;
            pImageTarget += wWidByte * 8;
        }
    }
    else
    {
        for ( i=0 ; i< font_wide ; i++ )
        {
            if ( i == ( font_wide - 1 ) )
                l = Up_Shift ;
            else
                l = 8;
            
            if ( full_width == 0 )
            {
                for ( j=0 ; j<l ; j++ )
                    temp_array[j] = *( pImageTarget +  j * wWidByte ) & MaskDataR[ 8 - bShiftBit ];
            }
            for ( j=0 ; j<wWidth ; j++ )
            {
                if ( j == 0 )
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , ( 8 - end_Shift )% 8  , 8 , l);
                    for ( k=0 ; k<l ; k++ )
                    {
                        temp_data = *( pImageTarget    + k * wWidByte ) & MaskDataL[ end_Shift ];
                        *( pImageTarget +  k * wWidByte ) = InvertData[ data[k] ];
                        *( pImageTarget +  k * wWidByte ) &= MaskDataR[ 8 - end_Shift ];
                        *( pImageTarget +  k * wWidByte ) |= temp_data;
                    }
                }
                else 
                {
                    EightBit ( data , pImageSource + j * 8 * SourceWidByte ,shift_data, SourceWidByte , ( 8 - end_Shift )% 8 , 8 , l);
                    if ( ( j == full_width ) && ( bShiftBit != 0 ) )
                    {
                        for ( k=0 ; k<l ; k++ )
                        {
                            temp_data = *( pImageTarget    + k * wWidByte - full_width ) & MaskDataR[ 8 - bShiftBit ];
                            *( pImageTarget +  k * wWidByte - full_width ) = InvertData[ data[k] ];
                            *( pImageTarget +  k * wWidByte - full_width ) &= MaskDataL[ bShiftBit];
                            *( pImageTarget +  k * wWidByte - full_width ) |= temp_data;
                        }
                    }
                    else
                    {
                        for ( k=0 ; k<l ; k++ )
                            *( pImageTarget +  k * wWidByte - j ) = InvertData[ data[k] ];
                    }
                }

            }
            
            if ( ( bShiftBit != 0  ) && ( wWidth <= full_width ) )
            {
                for ( k=0 ; k<l ; k++ )
                {
                    temp_data = *( pImageTarget    + k * wWidByte - full_width ) & MaskDataR[ 8 - bShiftBit ];
                    *( pImageTarget    +  k * wWidByte - full_width ) = InvertData[ shift_data[k] ];
                    *( pImageTarget    +  k * wWidByte - full_width ) &= MaskDataL[ bShiftBit];
                    *( pImageTarget    +  k * wWidByte - full_width ) |= temp_data;
                }
            }
            else if ( ( bShiftBit != 0 ) && ( !full_width ) )
            {
                for ( k=0 ; k<l ; k++ )
                {
                    temp_data = temp_array[k];
                    *( pImageTarget +  k * wWidByte ) &= MaskDataL[ bShiftBit];
                    *( pImageTarget +  k * wWidByte ) |= temp_data;
                }
            }
            pImageSource += 1;
            pImageTarget += wWidByte * 8;
        }

    }
}

VOID PutImage(_ImgBuf *Dst, _ImgBuf *Src, INT X, INT Y, INT Rotate, _ePutWay PutWay)
{
    BYTE *SrcImg = Src->pBuffer;
    INT Height, Width, WidthByte;
    INT Offset, ShiftBit;

    if (Rotate == 90 || Rotate == 270)
    {
        Height = Src->iWidth;
        Width  = Src->iHeight;
        if (Src->iByteWidth > (Src->iWidth + 7) / 8)
        {
            if (Rotate == 270)
                Y -= 1;
            Height += 1;
        }
        WidthByte = (Height + 7) / 8;
    }
       else
       {
        Height = Src->iHeight;
        Width  = Src->iWidth;
        if (Src->iByteWidth > (Src->iWidth + 7) / 8)
        {
            if (Rotate == 180)
                X -= 1;
            Width += 1;
        }
        WidthByte = (Width + 7) / 8;
    }

    if (X < 0)
    {
        if (Rotate == 0)
            return;
        if (Rotate == 270)
            SrcImg += WidthByte * (0 - X);
        Width -= (0 - X);
        X = 0;
    }
    if (Y < 0)
    {
        if (Rotate == 90)
            return;
        if (Rotate == 0)
            SrcImg += WidthByte * (0 - Y);
        Height -= (0 - Y);
        Y = 0;
    }

    if (X + Width > Dst->iWidth)
        Width = Dst->iWidth - X;
    if (Width <= 0)
        return;
    if (Y + Height > Dst->iHeight)
        Height = Dst->iHeight - Y;
    if (Height <= 0)
        return;

    ModifyImgSection(Y, Height, Dst);  

    Offset   = (Dst->iWidth + 7) / 8 * Y +  X / 8;
    ShiftBit = X % 8;

    switch (Rotate)
    {
        case 0:
            if (PutWay == PUT_XOR)
                NorXOR(Width, Height, WidthByte, Dst->iByteWidth, Offset, ShiftBit, SrcImg, Dst->pBuffer);
            else if (PutWay == PUT_OW)
                NorOW(Width, Height, WidthByte, Dst->iByteWidth, Offset, ShiftBit, SrcImg, Dst->pBuffer);
            else
                NorOR(Width, Height, WidthByte, Dst->iByteWidth, Offset, ShiftBit, SrcImg, Dst->pBuffer);
            break;

        case 90:
            if (PutWay == PUT_XOR)
                RightXOR(Width, Height, WidthByte, Dst->iByteWidth, Offset, ShiftBit, SrcImg, Dst->pBuffer);
            else if (PutWay == PUT_OW)
                RightOW(Width, Height, WidthByte, Dst->iByteWidth, Offset, ShiftBit, SrcImg, Dst->pBuffer);
            else
                RightOR(Width, Height, WidthByte, Dst->iByteWidth, Offset, ShiftBit, SrcImg, Dst->pBuffer);
            break;

        case 180:
            if (PutWay == PUT_XOR)
                DownXOR(Width, Height, WidthByte, Dst->iByteWidth, Offset, ShiftBit, SrcImg, Dst->pBuffer);
            else if (PutWay == PUT_OW)
                DownOW(Width, Height, WidthByte, Dst->iByteWidth, Offset, ShiftBit, SrcImg, Dst->pBuffer);
            else
                DownOR(Width, Height, WidthByte, Dst->iByteWidth, Offset, ShiftBit, SrcImg, Dst->pBuffer);
            break;

        case 270:
            if (PutWay == PUT_XOR)
                LeftXOR(Width, Height, WidthByte, Dst->iByteWidth, Offset, ShiftBit, SrcImg, Dst->pBuffer);
            else if (PutWay == PUT_OW)
                LeftOW(Width, Height, WidthByte, Dst->iByteWidth, Offset, ShiftBit, SrcImg, Dst->pBuffer);
            else
                LeftOR(Width, Height, WidthByte, Dst->iByteWidth, Offset, ShiftBit, SrcImg, Dst->pBuffer);
            break;
    }
}

VOID ModifyImgSection(INT Y, INT Height, _ImgBuf *pImgBuf)
{
    INT LastDotLine;

    if (Y < pImgBuf->iFirstLine)
        pImgBuf->iFirstLine = Y;

    LastDotLine = Y + Height - 1;

    if (LastDotLine > (pImgBuf->iHeight - 1))
        pImgBuf->iLastLine = pImgBuf->iHeight - 1;
    else if (LastDotLine > pImgBuf->iLastLine)
        pImgBuf->iLastLine = LastDotLine;
}

ImgUtil.h  /

#ifndef IMGUTIL_H

/******************************************************************************
 *                                                                            *
 *                         M O D U L E   D E F I N E                          *
 *                                                                            *
 ******************************************************************************/

#define IMGUTIL_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             *
 *                                                                            *
 ******************************************************************************/

#include "XImgMgr.h"

#ifdef __cplusplus
extern "C" {            /* Assume C declarations for C++ */
#endif    /* __cplusplus */

/******************************************************************************
 *                                                                            *
 *                        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 enum
{
    PUT_OR,
    PUT_OW,
    PUT_XOR,
}_ePutWay;

/******************************************************************************
 *                                                                            *
 *    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 LineMultiple(BYTE *, BYTE *, INT, INT, INT, INT);
VOID NorOR(INT, INT, INT, INT, INT, INT, BYTE *, BYTE *);
VOID NorXOR(INT, INT, INT, INT, INT, INT, BYTE *, BYTE *);
VOID NorOW(INT, INT, INT, INT, INT, INT, BYTE *, BYTE *);
VOID DownOR(INT, INT, INT, INT, INT, BYTE, BYTE *, BYTE *);
VOID DownXOR(INT, INT, INT, INT, INT, BYTE, BYTE *, BYTE *);
VOID DownOW(INT, INT, INT, INT, INT, BYTE, BYTE *, BYTE *);
VOID LeftOR(INT, INT, INT, INT, INT, BYTE, BYTE *, BYTE *);
VOID LeftXOR(INT, INT, INT, INT, INT, BYTE, BYTE *, BYTE *);
VOID LeftOW(INT, INT, INT, INT, INT, BYTE, BYTE *, BYTE *);
VOID RightOR(INT, INT, INT, INT, INT, BYTE, BYTE *, BYTE *);
VOID RightXOR(INT, INT, INT, INT, INT, BYTE, BYTE *, BYTE *);
VOID RightOW(INT, INT, INT, INT, INT, BYTE,  BYTE *, BYTE *);
VOID PutImage(_ImgBuf *, _ImgBuf *, INT, INT, INT, _ePutWay);
VOID ModifyImgSection(INT,  INT, _ImgBuf *);

#ifdef __cplusplus
}                       /* End of extern "C" { */
#endif    /* __cplusplus */

#endif    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值