/******************************************************************************
* *
* M O D U L E D E F I N E *
* *
******************************************************************************/
#define CODEMSI_C
/******************************************************************************
* *
* C O M P I L E R D E F I N E D I N C L U D E F I L E S *
* *
******************************************************************************/
#include <string.h>
#include <stdlib.h>
#include <math.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"
#include "Barcode.h"
/******************************************************************************
* *
* L O C A L D E F I N E S *
* *
******************************************************************************/
#define QUIET_MU 0
#define TEXT_DIS 5
/******************************************************************************
* *
* L O C A L T Y P E D E F S *
* *
******************************************************************************/
#define PLESSEY_TEXT_ERROR 0x01
/******************************************************************************
* *
* 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 PLESSEY_START={0x0B};
STATIC CONST BYTE PLESSEY_END={0x03};
STATIC CONST BYTE PLESSEY_TBL[16]=
{
/*-----------------02-23-99 16:14-------------------
0,1,2,3,4,5,6,7
--------------------------------------------------*/
0x00,0x08,0x04,0x0C,0x02,0x0A,0x06,0X0E,
/*-----------------02-23-99 16:14-------------------
8,9,A,B,C,D,E,F
--------------------------------------------------*/
0x01,0x09,0x05,0x0D,0X03,0x0B,0x07,0x0F
};
STATIC CONST BYTE PlesseyCRC[] = {
0x00,0x37,0x6e,0x59,0xdc,0xeb,0xb2,0x85,0x97,0xa0,0xf9,0xce,0x4b,0x7c,0x25,0x12,
0x01,0x36,0x6f,0x58,0xdd,0xea,0xb3,0x84,0x96,0xa1,0xf8,0xcf,0x4a,0x7d,0x24,0x13,
0x02,0x35,0x6c,0x5b,0xde,0xe9,0xb0,0x87,0x95,0xa2,0xfb,0xcc,0x49,0x7e,0x27,0x10,
0x03,0x34,0x6d,0x5a,0xdf,0xe8,0xb1,0x86,0x94,0xa3,0xfa,0xcd,0x48,0x7f,0x26,0x11,
0x04,0x33,0x6a,0x5d,0xd8,0xef,0xb6,0x81,0x93,0xa4,0xfd,0xca,0x4f,0x78,0x21,0x16,
0x05,0x32,0x6b,0x5c,0xd9,0xee,0xb7,0x80,0x92,0xa5,0xfc,0xcb,0x4e,0x79,0x20,0x17,
0x06,0x31,0x68,0x5f,0xda,0xed,0xb4,0x83,0x91,0xa6,0xff,0xc8,0x4d,0x7a,0x23,0x14,
0x07,0x30,0x69,0x5e,0xdb,0xec,0xb5,0x82,0x90,0xa7,0xfe,0xc9,0x4c,0x7b,0x22,0x15,
0x08,0x3f,0x66,0x51,0xd4,0xe3,0xba,0x8d,0x9f,0xa8,0xf1,0xc6,0x43,0x74,0x2d,0x1a,
0x09,0x3e,0x67,0x50,0xd5,0xe2,0xbb,0x8c,0x9e,0xa9,0xf0,0xc7,0x42,0x75,0x2c,0x1b,
0x0a,0x3d,0x64,0x53,0xd6,0xe1,0xb8,0x8f,0x9d,0xaa,0xf3,0xc4,0x41,0x76,0x2f,0x18,
0x0b,0x3c,0x65,0x52,0xd7,0xe0,0xb9,0x8e,0x9c,0xab,0xf2,0xc5,0x40,0x77,0x2e,0x19,
0x0c,0x3b,0x62,0x55,0xd0,0xe7,0xbe,0x89,0x9b,0xac,0xf5,0xc2,0x47,0x70,0x29,0x1e,
0x0d,0x3a,0x63,0x54,0xd1,0xe6,0xbf,0x88,0x9a,0xad,0xf4,0xc3,0x46,0x71,0x28,0x1f,
0x0e,0x39,0x60,0x57,0xd2,0xe5,0xbc,0x8b,0x99,0xae,0xf7,0xc0,0x45,0x72,0x2b,0x1c,
0x0f,0x38,0x61,0x56,0xd3,0xe4,0xbd,0x8a,0x98,0xaf,0xf6,0xc1,0x44,0x73,0x2a,0x1d,
};
/******************************************************************************
* *
* 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 *
* *
******************************************************************************/
/*-----------------02-11-99 13:15-------------------
code plessey
--------------------------------------------------*/
INT CodePlessey(_BarCodeAttr *psBarCodeAttr)
{
/*-----------------08-16-99 17:18-------------------
variables
--------------------------------------------------*/
INT iProcess, iTemp;
ULONG lTemp;
INT i;
BYTE bCodedata, bCodeMask;
BYTE bsHuman[100];
BYTE *pHuman;
BYTE *pExpress;
_BarAttr sBarAttr;
_BarCodeAttr sBarCodeAttr;
BYTE CRC = 0;
sBarCodeAttr = *psBarCodeAttr;
pHuman = bsHuman;
/*-----------------08-16-99 17:19-------------------
ImagePoint initial
--------------------------------------------------*/
sBarAttr.psImageBuffer=sBarCodeAttr.psImageBuffer;
pExpress=sBarCodeAttr.pExp;
iProcess=0;
/*-----------------02-10-99 11:35-------------------
decode
-------------------------------------------------*/
while ( 1 )
{
/*-----------------02-10-99 11:29-------------------
leading quiet zone
--------------------------------------------------*/
if ( iProcess == 0 )
{
switch ( sBarCodeAttr.iRotation )
{
case 90:
sBarCodeAttr.sCoord.iX=sBarCodeAttr.sCoord.iX-sBarCodeAttr.iHeight;
sBarCodeAttr.sCoord.iY=sBarCodeAttr.sCoord.iY+sBarCodeAttr.iNarrow*QUIET_MU;
break;
case 180:
sBarCodeAttr.sCoord.iY=sBarCodeAttr.sCoord.iY-sBarCodeAttr.iHeight;
sBarCodeAttr.sCoord.iX=sBarCodeAttr.sCoord.iX-sBarCodeAttr.iNarrow*QUIET_MU;
break;
case 270:
sBarCodeAttr.sCoord.iY=sBarCodeAttr.sCoord.iY-sBarCodeAttr.iNarrow*QUIET_MU;
break;
case 0:
default:
sBarCodeAttr.sCoord.iX=sBarCodeAttr.sCoord.iX+sBarCodeAttr.iNarrow*QUIET_MU;
break;
}
iProcess=1;
continue;
}
/*-----------------02-10-99 11:35-------------------
start code
--------------------------------------------------*/
else if ( iProcess == 1 )
{
bCodedata = PLESSEY_TBL[PLESSEY_START];
iProcess = 2;
}
/*-----------------02-10-99 12:06-------------------
get data -> encode fisrt byte
--------------------------------------------------*/
else if ( iProcess == 2 )
{
BYTE bData;
if ( (*pExpress >= '0') && (*pExpress <= '9') )
{
bData = *pExpress-'0';
bCodedata = PLESSEY_TBL[bData];
*pHuman = *pExpress;
CRC = PlesseyCRC[CRC ^ bData];
++pExpress;
pHuman++ ;
}
else if ( (*pExpress >= 'A') && (*pExpress <= 'F') )
{
bData = *pExpress - 'A' + 10;
bCodedata=PLESSEY_TBL[bData];
*pHuman = *pExpress;
CRC = PlesseyCRC[CRC ^ bData];
++pExpress;
pHuman++ ;
}
else if ( *pExpress == _NULL )
{
*pHuman = 0;
iProcess = 3;
continue;
}
else
{
/*-----------------02-23-99 17:44-------------------
error
--------------------------------------------------*/
return PLESSEY_TEXT_ERROR;
}
}
/*-----------------02-10-99 14:52-------------------
C check digital
--------------------------------------------------*/
else if( iProcess == 3 )
{
bCodedata = PLESSEY_TBL[CRC & 0x0F];
iProcess = 4;
}
else if( iProcess == 4 )
{
bCodedata = PLESSEY_TBL[(CRC & 0xF0) >> 4];
iProcess = 5;
}
/*-----------------02-10-99 12:07-------------------
termination pitch
--------------------------------------------------*/
else if ( iProcess == 5 )
{
INT iTermination;
iTermination = sBarCodeAttr.iWide + sBarCodeAttr.iNarrow;
sBarAttr.iType = DRAW_BAR;
switch ( psBarCodeAttr->iRotation )
{
case 90:
sBarAttr.sCoord.iX=sBarCodeAttr.sCoord.iX;
sBarAttr.sCoord.iY=sBarCodeAttr.sCoord.iY;
sBarAttr.iWidth=sBarCodeAttr.iHeight;
sBarAttr.iHeight=iTermination;
DrawBar(&sBarAttr);
sBarCodeAttr.sCoord.iY=sBarCodeAttr.sCoord.iY+iTermination;
break;
case 180:
sBarAttr.sCoord.iY=sBarCodeAttr.sCoord.iY;
sBarAttr.iWidth=iTermination;
sBarAttr.sCoord.iX=sBarCodeAttr.sCoord.iX-iTermination;
sBarAttr.iHeight=sBarCodeAttr.iHeight;
DrawBar(&sBarAttr);
sBarCodeAttr.sCoord.iX -= iTermination;
break;
case 270:
sBarAttr.sCoord.iX=sBarCodeAttr.sCoord.iX;
sBarAttr.iWidth=sBarCodeAttr.iHeight;
sBarAttr.iHeight=sBarCodeAttr.iWide;
sBarAttr.sCoord.iY=sBarCodeAttr.sCoord.iY-iTermination;
DrawBar(&sBarAttr);
sBarCodeAttr.sCoord.iY=sBarCodeAttr.sCoord.iY-iTermination;
break;
case 0:
default:
sBarAttr.sCoord.iX=sBarCodeAttr.sCoord.iX;
sBarAttr.sCoord.iY=sBarCodeAttr.sCoord.iY;
sBarAttr.iWidth=iTermination;
sBarAttr.iHeight=sBarCodeAttr.iHeight;
DrawBar(&sBarAttr);
sBarCodeAttr.sCoord.iX += iTermination;
break;
}
iProcess = 6;
continue;
}
/*-----------------02-10-99 12:07-------------------
end code
--------------------------------------------------*/
else if ( iProcess == 6 )
{
bCodedata = PLESSEY_END;
iProcess = 7;
}
/*-----------------02-10-99 11:35-------------------
draw bar
--------------------------------------------------*/
bCodeMask=0x10;
while(bCodeMask>1)
{
bCodeMask=bCodeMask>>1;
sBarAttr.iType=DRAW_BAR;
switch ( sBarCodeAttr.iRotation )
{
case 0:
default:
sBarAttr.sCoord.iX = sBarCodeAttr.sCoord.iX;
sBarAttr.sCoord.iY = sBarCodeAttr.sCoord.iY;
sBarAttr.iHeight = sBarCodeAttr.iHeight;
if ( (bCodedata & bCodeMask)!=0 )
{
sBarAttr.iWidth = sBarCodeAttr.iWide;
if ( iProcess == 7 )
{
sBarCodeAttr.sCoord.iX += sBarCodeAttr.iNarrow;
sBarAttr.sCoord.iX = sBarCodeAttr.sCoord.iX;
}
else
sBarCodeAttr.sCoord.iX += sBarCodeAttr.iWide;
DrawBar(&sBarAttr);
if ( iProcess == 7 )
sBarCodeAttr.sCoord.iX += sBarCodeAttr.iWide;
else
sBarCodeAttr.sCoord.iX += sBarCodeAttr.iNarrow;
}
else
{
sBarAttr.iWidth = sBarCodeAttr.iNarrow;
if ( iProcess == 7 )
{
sBarCodeAttr.sCoord.iX += sBarCodeAttr.iWide;
sBarAttr.sCoord.iX = sBarCodeAttr.sCoord.iX;
}
else
sBarCodeAttr.sCoord.iX += sBarCodeAttr.iNarrow;
DrawBar(&sBarAttr);
if ( iProcess == 7 )
sBarCodeAttr.sCoord.iX += sBarCodeAttr.iNarrow;
else
sBarCodeAttr.sCoord.iX += sBarCodeAttr.iWide;
}
break;
case 90:
sBarAttr.sCoord.iX = sBarCodeAttr.sCoord.iX;
sBarAttr.sCoord.iY = sBarCodeAttr.sCoord.iY;
sBarAttr.iWidth = sBarCodeAttr.iHeight;
if ( (bCodedata & bCodeMask)!=0 )
{
sBarAttr.iHeight = sBarCodeAttr.iWide;
if ( iProcess == 7 )
{
sBarCodeAttr.sCoord.iY += sBarCodeAttr.iNarrow;
sBarAttr.sCoord.iY = sBarCodeAttr.sCoord.iY;
}
else
sBarCodeAttr.sCoord.iY += sBarCodeAttr.iWide;
DrawBar(&sBarAttr);
if ( iProcess == 7 )
sBarCodeAttr.sCoord.iY += sBarCodeAttr.iWide;
else
sBarCodeAttr.sCoord.iY += sBarCodeAttr.iNarrow;
}
else
{
sBarAttr.iHeight = sBarCodeAttr.iNarrow;
if ( iProcess == 7 )
{
sBarCodeAttr.sCoord.iY += sBarCodeAttr.iWide;
sBarAttr.sCoord.iY = sBarCodeAttr.sCoord.iY;
}
else
sBarCodeAttr.sCoord.iY += sBarCodeAttr.iNarrow;
DrawBar(&sBarAttr);
if ( iProcess == 7 )
sBarCodeAttr.sCoord.iY += sBarCodeAttr.iNarrow;
else
sBarCodeAttr.sCoord.iY += sBarCodeAttr.iWide;
}
break;
case 180:
sBarAttr.sCoord.iY = sBarCodeAttr.sCoord.iY;
sBarAttr.iHeight = sBarCodeAttr.iHeight;
if ( (bCodedata & bCodeMask)!=0 )
{
sBarAttr.iWidth = sBarCodeAttr.iWide;
if ( iProcess == 7 )
{
sBarCodeAttr.sCoord.iX -= (sBarCodeAttr.iNarrow + sBarAttr.iWidth);
sBarAttr.sCoord.iX = sBarCodeAttr.sCoord.iX;
}
else
{
sBarAttr.sCoord.iX = sBarCodeAttr.sCoord.iX - sBarCodeAttr.iWide;
sBarCodeAttr.sCoord.iX -= sBarCodeAttr.iWide;
}
DrawBar(&sBarAttr);
if ( iProcess != 7 )
sBarCodeAttr.sCoord.iX -= sBarCodeAttr.iNarrow;
}
else
{
sBarAttr.iWidth = sBarCodeAttr.iNarrow;
if ( iProcess == 7 )
{
sBarCodeAttr.sCoord.iX -= (sBarCodeAttr.iWide+sBarAttr.iWidth);
sBarAttr.sCoord.iX = sBarCodeAttr.sCoord.iX;
}
else
{
sBarAttr.sCoord.iX = sBarCodeAttr.sCoord.iX - sBarCodeAttr.iNarrow;
sBarCodeAttr.sCoord.iX -= sBarCodeAttr.iNarrow;
}
DrawBar(&sBarAttr);
if (iProcess != 7)
sBarCodeAttr.sCoord.iX -= sBarCodeAttr.iWide;
}
break;
case 270:
sBarAttr.sCoord.iX = sBarCodeAttr.sCoord.iX;
sBarAttr.iWidth = sBarCodeAttr.iHeight;
if ( (bCodedata & bCodeMask)!=0 )
{
sBarAttr.iHeight = sBarCodeAttr.iWide;
sBarAttr.sCoord.iY = sBarCodeAttr.sCoord.iY - sBarCodeAttr.iWide;
if ( iProcess == 7 )
{
sBarCodeAttr.sCoord.iY -= (sBarCodeAttr.iNarrow+ sBarAttr.iHeight);
sBarAttr.sCoord.iY = sBarCodeAttr.sCoord.iY;
}
else
sBarCodeAttr.sCoord.iY -= sBarCodeAttr.iWide;
DrawBar(&sBarAttr);
if ( iProcess != 7 )
sBarCodeAttr.sCoord.iY -= sBarCodeAttr.iNarrow;
}
else
{
sBarAttr.iHeight = sBarCodeAttr.iNarrow;
sBarAttr.sCoord.iY = sBarCodeAttr.sCoord.iY - sBarCodeAttr.iNarrow;
if ( iProcess == 7 )
{
sBarCodeAttr.sCoord.iY -= (sBarCodeAttr.iWide + sBarAttr.iHeight);
sBarAttr.sCoord.iY = sBarCodeAttr.sCoord.iY;
}
else
sBarCodeAttr.sCoord.iY = sBarCodeAttr.sCoord.iY - sBarCodeAttr.iNarrow;
DrawBar(&sBarAttr);
if ( iProcess != 7 )
sBarCodeAttr.sCoord.iY -= sBarCodeAttr.iWide;
}
break;
}
}
if ( iProcess == 7 )
break;
}
if ( psBarCodeAttr->iHuman != 0 )
{
_TextAttr sTextAttr;
sTextAttr.sCoord.iX = psBarCodeAttr->sCoord.iX;
sTextAttr.sCoord.iY = psBarCodeAttr->sCoord.iY;
sTextAttr.iDirection = psBarCodeAttr->iRotation;
sTextAttr.iRotation = psBarCodeAttr->iRotation;
sTextAttr.iDistance = 0;
sTextAttr.iHoriMulti = psBarCodeAttr->FontHoriMulti;
sTextAttr.iVertMulti = psBarCodeAttr->FontVertMulti;
sTextAttr.ExpLength = strlen((CHAR *)bsHuman);
sTextAttr.pExp = bsHuman;
sTextAttr.pFont = psBarCodeAttr->pFont;
sTextAttr.eLanguage = psBarCodeAttr->eLanguage;
sTextAttr.ePutWay = psBarCodeAttr->ePutWay;
sTextAttr.psImageBuffer = psBarCodeAttr->psImageBuffer;
PreviewText(&sTextAttr);
switch ( psBarCodeAttr->iRotation )
{
case 90:
if ( psBarCodeAttr->AboveCode )
sTextAttr.sCoord.iX += sTextAttr.iRealHeight + TEXT_DIS;
else
sTextAttr.sCoord.iX -= psBarCodeAttr->iHeight + TEXT_DIS;
sTextAttr.sCoord.iY += psBarCodeAttr->iNarrow * QUIET_MU;
if ( psBarCodeAttr->iHuman == 2 )
sTextAttr.sCoord.iY += (psBarCodeAttr->TotalWidth - sTextAttr.iRealWidth) / 2;
else if ( psBarCodeAttr->iHuman == 3 )
sTextAttr.sCoord.iY = sBarCodeAttr.sCoord.iY - sTextAttr.iRealWidth;
break;
case 180:
if ( psBarCodeAttr->AboveCode )
sTextAttr.sCoord.iY += sTextAttr.iRealHeight + TEXT_DIS;
else
sTextAttr.sCoord.iY -= psBarCodeAttr->iHeight + TEXT_DIS;
sTextAttr.sCoord.iX -= psBarCodeAttr->iNarrow * QUIET_MU;
if ( psBarCodeAttr->iHuman == 2 )
sTextAttr.sCoord.iX -= (psBarCodeAttr->TotalWidth - sTextAttr.iRealWidth) / 2;
else if ( psBarCodeAttr->iHuman == 3 )
sTextAttr.sCoord.iX = sBarCodeAttr.sCoord.iX + sTextAttr.iRealWidth;
break;
case 270:
if ( psBarCodeAttr->AboveCode )
sTextAttr.sCoord.iX -= sTextAttr.iRealHeight + TEXT_DIS;
else
sTextAttr.sCoord.iX += psBarCodeAttr->iHeight + TEXT_DIS;
sTextAttr.sCoord.iY -= psBarCodeAttr->iNarrow * QUIET_MU;
if ( psBarCodeAttr->iHuman == 2 )
sTextAttr.sCoord.iY -= (psBarCodeAttr->TotalWidth - sTextAttr.iRealWidth) / 2;
else if ( psBarCodeAttr->iHuman == 3 )
sTextAttr.sCoord.iY = sBarCodeAttr.sCoord.iY + sTextAttr.iRealWidth;
break;
case 0:
default:
if ( psBarCodeAttr->AboveCode )
sTextAttr.sCoord.iY -= sTextAttr.iRealHeight + TEXT_DIS;
else
sTextAttr.sCoord.iY += psBarCodeAttr->iHeight + TEXT_DIS;
sTextAttr.sCoord.iX += psBarCodeAttr->iNarrow * QUIET_MU;
if ( psBarCodeAttr->iHuman == 2 )
sTextAttr.sCoord.iX += (psBarCodeAttr->TotalWidth - sTextAttr.iRealWidth) / 2;
else if ( psBarCodeAttr->iHuman == 3 )
sTextAttr.sCoord.iX = sBarCodeAttr.sCoord.iX - sTextAttr.iRealWidth;
break;
}
OutText(&sTextAttr);
psBarCodeAttr->TotalHeight += sTextAttr.iRealHeight + TEXT_DIS;
psBarCodeAttr->FontWidth = sTextAttr.iRealWidth;
psBarCodeAttr->FontHeight = sTextAttr.iRealHeight + TEXT_DIS;
}
return TRUE;
}
INT PreviewCodePlessey(_BarCodeAttr *psBarCodeAttr)
{
INT TotalChar;
/* Start + End + CRC*2 */
TotalChar = strlen((CHAR *)psBarCodeAttr->pExp) + 4;
psBarCodeAttr->TotalWidth = TotalChar * (psBarCodeAttr->iNarrow * 4 + psBarCodeAttr->iWide * 4) +
/* termination pitch */
(psBarCodeAttr->iNarrow+ psBarCodeAttr->iWide);
psBarCodeAttr->TotalHeight = psBarCodeAttr->iHeight;
if (psBarCodeAttr->eLanguage == LANG_DPL && psBarCodeAttr->iHuman)
{
_TextAttr sTextAttr;
sTextAttr.sCoord.iX = psBarCodeAttr->sCoord.iX;
sTextAttr.sCoord.iY = psBarCodeAttr->sCoord.iY;
sTextAttr.iDirection = psBarCodeAttr->iRotation;
sTextAttr.iRotation = psBarCodeAttr->iRotation;
sTextAttr.iDistance = 0;
sTextAttr.iHoriMulti = psBarCodeAttr->FontHoriMulti;
sTextAttr.iVertMulti = psBarCodeAttr->FontVertMulti;
sTextAttr.ExpLength = strlen((CHAR *)psBarCodeAttr->pExp);
sTextAttr.pExp = psBarCodeAttr->pExp;
sTextAttr.pFont = psBarCodeAttr->pFont;
sTextAttr.eLanguage = psBarCodeAttr->eLanguage;
sTextAttr.ePutWay = psBarCodeAttr->ePutWay;
sTextAttr.psImageBuffer = psBarCodeAttr->psImageBuffer;
PreviewText(&sTextAttr);
psBarCodeAttr->TotalHeight += sTextAttr.iRealHeight + TEXT_DIS;
psBarCodeAttr->FontWidth = sTextAttr.iRealWidth;
psBarCodeAttr->FontHeight = sTextAttr.iRealHeight + TEXT_DIS;
}
return TRUE;
}