Files
Slnkdwf/Barcode/Code93.cpp
Jos Groot Lipman 8e894a966f V2.50 barcode39
svn path=/Slnkdwf/trunk/; revision=12501
2011-04-12 09:25:20 +00:00

918 lines
17 KiB
C++

// Code93.cpp: implementation of the CCode93 class.
//
// Copyright 2002 Neil Van Eps
//
/////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Code93.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CCode93::CCode93()
{
// code 93
m_nSymbology = CODE93;
}
CCode93::~CCode93()
{
}
////////////////////////////////////////////////////////////////////////////////////
//
// Name:
// DrawBitmap()
//
// Description:
// draws a barcode using the previously loaded data
//
// Arguments:
// none
//
// Return:
// void
//
// Called by:
// public class interface
//
////////////////////////////////////////////////////////////////////////////////////
void CCode93::DrawBitmap()
{
long i,nFirstNumber,nSecondNumber;
CString csCurrentPattern;
// draw start character
DrawPattern(RetrievePattern(47));
// draw each character in the message
for (i=0;i<m_csMessage.GetLength();i++)
{
// get current ASCII character
ASCIItoCode93Sequence((long)m_csMessage.GetAt(i),&nFirstNumber,&nSecondNumber);
DrawPattern(RetrievePattern(nFirstNumber));
if (nSecondNumber!=-1)
DrawPattern(RetrievePattern(nSecondNumber));
}
// add the check digit characters
DrawCheckDigits();
// draw stop character
DrawPattern(RetrievePattern(48));
return;
}
////////////////////////////////////////////////////////////////////////////////////
//
// Name:
// DrawPattern()
//
// Description:
// draws the passed character pattern at the end of the barcode
//
// Arguments:
// CString csPattern - the bar pattern to draw
//
// Return:
// void
//
// Called by:
// CRationalCodabar::DrawBitmap()
//
////////////////////////////////////////////////////////////////////////////////////
void CCode93::DrawPattern( CString csPattern )
{
int i,nXPixel,nYPixel;
// initialize X pixel value
nXPixel = m_nStartingXPixel;
for (i=0;i<csPattern.GetLength();i++)
{
// X value for loop
for (nXPixel=m_nStartingXPixel;nXPixel<m_nStartingXPixel+m_nNarrowBarPixelWidth;nXPixel++)
{
// Y value for loop
for (nYPixel=m_nStartingYPixel;nYPixel<m_nStartingYPixel+m_nPixelHeight;nYPixel++)
{
// if this is a bar
if (csPattern.GetAt(i)=='b')
SetPixelV(m_hDC, nXPixel,nYPixel,COLORBLACK);
else
SetPixelV(m_hDC, nXPixel,nYPixel,COLORWHITE);
}
}
// advance the starting position
m_nStartingXPixel+= m_nNarrowBarPixelWidth;
}
return;
}
////////////////////////////////////////////////////////////////////////////////////
//
// Name:
// RetrievePattern()
//
// Description:
// retrieves the bar pattern for a given character
//
// Arguments:
// char cInputCharacter - the input character to get the bar pattern for
//
// Return:
// CString - the bar pattern for the input character
//
// Called by:
// CCode93::DrawBitmap()
//
////////////////////////////////////////////////////////////////////////////////////
CString CCode93::RetrievePattern(long c)
{
CString csCharPattern;
// Code93 characters follow are all 9 narrow bar elements wide
// b - bar element
// s - space element
// 9 elements in all
switch (c)
{
case 0:
csCharPattern = "bsssbsbss";
break;
case 1:
csCharPattern = "bsbssbsss";
break;
case 2:
csCharPattern = "bsbsssbss";
break;
case 3:
csCharPattern = "bsbssssbs";
break;
case 4:
csCharPattern = "bssbsbsss";
break;
case 5:
csCharPattern = "bssbssbss";
break;
case 6:
csCharPattern = "bssbsssbs";
break;
case 7:
csCharPattern = "bsbsbssss";
break;
case 8:
csCharPattern = "bsssbssbs";
break;
case 9:
csCharPattern = "bssssbsbs";
break;
case 10:
csCharPattern = "bbsbsbsss";
break;
case 11:
csCharPattern = "bbsbssbss";
break;
case 12:
csCharPattern = "bbsbsssbs";
break;
case 13:
csCharPattern = "bbssbsbss";
break;
case 14:
csCharPattern = "bbssbssbs";
break;
case 15:
csCharPattern = "bbsssbsbs";
break;
case 16:
csCharPattern = "bsbbsbsss";
break;
case 17:
csCharPattern = "bsbbssbss";
break;
case 18:
csCharPattern = "bsbbsssbs";
break;
case 19:
csCharPattern = "bssbbsbss";
break;
case 20:
csCharPattern = "bsssbbsbs";
break;
case 21:
csCharPattern = "bsbsbbsss";
break;
case 22:
csCharPattern = "bsbssbbss";
break;
case 23:
csCharPattern = "bsbsssbbs";
break;
case 24:
csCharPattern = "bssbsbbss";
break;
case 25:
csCharPattern = "bsssbsbbs";
break;
case 26:
csCharPattern = "bbsbbsbss";
break;
case 27:
csCharPattern = "bbsbbssbs";
break;
case 28:
csCharPattern = "bbsbsbbss";
break;
case 29:
csCharPattern = "bbsbssbbs";
break;
case 30:
csCharPattern = "bbssbsbbs";
break;
case 31:
csCharPattern = "bbssbbsbs";
break;
case 32:
csCharPattern = "bsbbsbbss";
break;
case 33:
csCharPattern = "bsbbssbbs";
break;
case 34:
csCharPattern = "bssbbsbbs";
break;
case 35:
csCharPattern = "bssbbbsbs";
break;
case 36:
csCharPattern = "bssbsbbbs";
break;
case 37:
csCharPattern = "bbbsbsbss";
break;
case 38:
csCharPattern = "bbbsbssbs";
break;
case 39:
csCharPattern = "bbbssbsbs";
break;
case 40:
csCharPattern = "bsbbsbbbs";
break;
case 41:
csCharPattern = "bsbbbsbbs";
break;
case 42:
csCharPattern = "bbsbsbbbs";
break;
case 43:
csCharPattern = "bssbssbbs";
break;
case 44:
csCharPattern = "bbbsbbsbs";
break;
case 45:
csCharPattern = "bbbsbsbbs";
break;
case 46:
csCharPattern = "bssbbssbs";
break;
case 47:
csCharPattern = "bsbsbbbbs";
break;
case 48:
csCharPattern = "bsbsbbbbsb";
break;
}
return csCharPattern;
}
////////////////////////////////////////////////////////////////////////////////////
//
// Name:
// AddCheckDigitsToMessage()
//
// Description:
// Adds the two code93 check digits to the end of the message
//
// Arguments:
// none
//
// Return:
// void
//
// Called by:
// CCode93::DrawBitmap()
//
////////////////////////////////////////////////////////////////////////////////////
void CCode93::DrawCheckDigits()
{
long i,nSum,nWeight,nFirstNumber,nSecondNumber;
// "C" check digit character
nWeight = 1;
nSum = 0;
for (i=m_csMessage.GetLength()-1;i>-1;i--)
{
ASCIItoCode93Sequence((long)m_csMessage.GetAt(i),&nFirstNumber,&nSecondNumber);
// add to the sum
nSum += (nWeight * nFirstNumber);
nWeight++;
if (nWeight>20)
nWeight=1;
// if its a two sequence character
if (nSecondNumber!=-1)
{
nSum += (nWeight * nSecondNumber);
nWeight++;
if (nWeight>20)
nWeight=1;
}
}
// draw the "C" check digit character
DrawPattern(RetrievePattern(nSum%47));
// "K" check digit character - include the "C" check digit character in calculations
nWeight = 2;
nSum = nSum%47;
for (i=m_csMessage.GetLength()-1;i>-1;i--)
{
ASCIItoCode93Sequence((long)m_csMessage.GetAt(i),&nFirstNumber,&nSecondNumber);
// add to the sum
nSum += (nWeight * nFirstNumber);
nWeight++;
if (nWeight>15)
nWeight=1;
// if its a two sequence character
if (nSecondNumber!=-1)
{
nSum += (nWeight * nSecondNumber);
nWeight++;
if (nWeight>15)
nWeight=1;
}
}
// draw the "K" check digit character
DrawPattern(RetrievePattern(nSum%47));
return;
}
////////////////////////////////////////////////////////////////////////////////////
//
// Name:
// ASCIItoCode93Sequence()
//
// Description:
// translates an ASCII character into the appropriate CODE93 sequence
//
// Arguments:
// long nFirstNumber - first number of the code93 sequence
// long nSecondNumber - second number of the code93 sequence, -1 if not applicable
//
// Return:
// void
//
// Called by:
// CCode93::DrawBitmap(), CCode93::DrawCheckDigits()
//
////////////////////////////////////////////////////////////////////////////////////
void CCode93::ASCIItoCode93Sequence(long nASCIINumber,long *nFirstNumber, long *nSecondNumber)
{
switch (nASCIINumber)
{
case 0:
*nFirstNumber = 44;
*nSecondNumber = 30;
break;
case 1:
*nFirstNumber = 43;
*nSecondNumber = 10;
break;
case 2:
*nFirstNumber = 43;
*nSecondNumber = 11;
break;
case 3:
*nFirstNumber = 43;
*nSecondNumber = 12;
break;
case 4:
*nFirstNumber = 43;
*nSecondNumber = 13;
break;
case 5:
*nFirstNumber = 43;
*nSecondNumber = 14;
break;
case 6:
*nFirstNumber = 43;
*nSecondNumber = 15;
break;
case 7:
*nFirstNumber = 43;
*nSecondNumber = 16;
break;
case 8:
*nFirstNumber = 43;
*nSecondNumber = 17;
break;
case 9:
*nFirstNumber = 43;
*nSecondNumber = 18;
break;
case 10:
*nFirstNumber = 43;
*nSecondNumber = 19;
break;
case 11:
*nFirstNumber = 43;
*nSecondNumber = 20;
break;
case 12:
*nFirstNumber = 43;
*nSecondNumber = 21;
break;
case 13:
*nFirstNumber = 43;
*nSecondNumber = 22;
break;
case 14:
*nFirstNumber = 43;
*nSecondNumber = 23;
break;
case 15:
*nFirstNumber = 43;
*nSecondNumber = 24;
break;
case 16:
*nFirstNumber = 43;
*nSecondNumber = 25;
break;
case 17:
*nFirstNumber = 43;
*nSecondNumber = 26;
break;
case 18:
*nFirstNumber = 43;
*nSecondNumber = 27;
break;
case 19:
*nFirstNumber = 43;
*nSecondNumber = 28;
break;
case 20:
*nFirstNumber = 43;
*nSecondNumber = 29;
break;
case 21:
*nFirstNumber = 43;
*nSecondNumber = 30;
break;
case 22:
*nFirstNumber = 43;
*nSecondNumber = 31;
break;
case 23:
*nFirstNumber = 43;
*nSecondNumber = 32;
break;
case 24:
*nFirstNumber = 43;
*nSecondNumber = 33;
break;
case 25:
*nFirstNumber = 43;
*nSecondNumber = 34;
break;
case 26:
*nFirstNumber = 43;
*nSecondNumber = 35;
break;
case 27:
*nFirstNumber = 44;
*nSecondNumber = 10;
break;
case 28:
*nFirstNumber = 44;
*nSecondNumber = 11;
break;
case 29:
*nFirstNumber = 44;
*nSecondNumber = 12;
break;
case 30:
*nFirstNumber = 44;
*nSecondNumber = 13;
break;
case 31:
*nFirstNumber = 44;
*nSecondNumber = 14;
break;
case 32:
*nFirstNumber = 38;
*nSecondNumber = -1;
break;
case 33:
*nFirstNumber = 45;
*nSecondNumber = 10;
break;
case 34:
*nFirstNumber = 45;
*nSecondNumber = 11;
break;
case 35:
*nFirstNumber = 45;
*nSecondNumber = 12;
break;
case 36:
*nFirstNumber = 39;
*nSecondNumber = -1;
break;
case 37:
*nFirstNumber = 42;
*nSecondNumber = -1;
break;
case 38:
*nFirstNumber = 45;
*nSecondNumber = 15;
break;
case 39:
*nFirstNumber = 45;
*nSecondNumber = 16;
break;
case 40:
*nFirstNumber = 45;
*nSecondNumber = 17;
break;
case 41:
*nFirstNumber = 45;
*nSecondNumber = 18;
break;
case 42:
*nFirstNumber = 45;
*nSecondNumber = 19;
break;
case 43:
*nFirstNumber = 41;
*nSecondNumber = -1;
break;
case 44:
*nFirstNumber = 45;
*nSecondNumber = 21;
break;
case 45:
*nFirstNumber = 36;
*nSecondNumber = -1;
break;
case 46:
*nFirstNumber = 37;
*nSecondNumber = -1;
break;
case 47:
*nFirstNumber = 40;
*nSecondNumber = -1;
break;
case 48:
*nFirstNumber = 0;
*nSecondNumber = -1;
break;
case 49:
*nFirstNumber = 1;
*nSecondNumber = -1;
break;
case 50:
*nFirstNumber = 2;
*nSecondNumber = -1;
break;
case 51:
*nFirstNumber = 3;
*nSecondNumber = -1;
break;
case 52:
*nFirstNumber = 4;
*nSecondNumber = -1;
break;
case 53:
*nFirstNumber = 5;
*nSecondNumber = -1;
break;
case 54:
*nFirstNumber = 6;
*nSecondNumber = -1;
break;
case 55:
*nFirstNumber = 7;
*nSecondNumber = -1;
break;
case 56:
*nFirstNumber = 8;
*nSecondNumber = -1;
break;
case 57:
*nFirstNumber = 9;
*nSecondNumber = -1;
break;
case 58:
*nFirstNumber = 45;
*nSecondNumber = 35;
break;
case 59:
*nFirstNumber = 44;
*nSecondNumber = 15;
break;
case 60:
*nFirstNumber = 44;
*nSecondNumber = 16;
break;
case 61:
*nFirstNumber = 44;
*nSecondNumber = 17;
break;
case 62:
*nFirstNumber = 44;
*nSecondNumber = 18;
break;
case 63:
*nFirstNumber = 44;
*nSecondNumber = 19;
break;
case 64:
*nFirstNumber = 44;
*nSecondNumber = 31;
break;
case 65:
*nFirstNumber = 10;
*nSecondNumber = -1;
break;
case 66:
*nFirstNumber = 11;
*nSecondNumber = -1;
break;
case 67:
*nFirstNumber = 12;
*nSecondNumber = -1;
break;
case 68:
*nFirstNumber = 13;
*nSecondNumber = -1;
break;
case 69:
*nFirstNumber = 14;
*nSecondNumber = -1;
break;
case 70:
*nFirstNumber = 15;
*nSecondNumber = -1;
break;
case 71:
*nFirstNumber = 16;
*nSecondNumber = -1;
break;
case 72:
*nFirstNumber = 17;
*nSecondNumber = -1;
break;
case 73:
*nFirstNumber = 18;
*nSecondNumber = -1;
break;
case 74:
*nFirstNumber = 19;
*nSecondNumber = -1;
break;
case 75:
*nFirstNumber = 20;
*nSecondNumber = -1;
break;
case 76:
*nFirstNumber = 21;
*nSecondNumber = -1;
break;
case 77:
*nFirstNumber = 22;
*nSecondNumber = -1;
break;
case 78:
*nFirstNumber = 23;
*nSecondNumber = -1;
break;
case 79:
*nFirstNumber = 24;
*nSecondNumber = -1;
break;
case 80:
*nFirstNumber = 25;
*nSecondNumber = -1;
break;
case 81:
*nFirstNumber = 26;
*nSecondNumber = -1;
break;
case 82:
*nFirstNumber = 27;
*nSecondNumber = -1;
break;
case 83:
*nFirstNumber = 28;
*nSecondNumber = -1;
break;
case 84:
*nFirstNumber = 29;
*nSecondNumber = -1;
break;
case 85:
*nFirstNumber = 30;
*nSecondNumber = -1;
break;
case 86:
*nFirstNumber = 31;
*nSecondNumber = -1;
break;
case 87:
*nFirstNumber = 32;
*nSecondNumber = -1;
break;
case 88:
*nFirstNumber = 33;
*nSecondNumber = -1;
break;
case 89:
*nFirstNumber = 34;
*nSecondNumber = -1;
break;
case 90:
*nFirstNumber = 35;
*nSecondNumber = -1;
break;
case 91:
*nFirstNumber = 44;
*nSecondNumber = 20;
break;
case 92:
*nFirstNumber = 44;
*nSecondNumber = 21;
break;
case 93:
*nFirstNumber = 44;
*nSecondNumber = 22;
break;
case 94:
*nFirstNumber = 44;
*nSecondNumber = 23;
break;
case 95:
*nFirstNumber = 44;
*nSecondNumber = 24;
break;
case 96:
*nFirstNumber = 44;
*nSecondNumber = 32;
break;
case 97:
*nFirstNumber = 46;
*nSecondNumber = 10;
break;
case 98:
*nFirstNumber = 46;
*nSecondNumber = 11;
break;
case 99:
*nFirstNumber = 46;
*nSecondNumber = 12;
break;
case 100:
*nFirstNumber = 46;
*nSecondNumber = 13;
break;
case 101:
*nFirstNumber = 46;
*nSecondNumber = 14;
break;
case 102:
*nFirstNumber = 46;
*nSecondNumber = 15;
break;
case 103:
*nFirstNumber = 46;
*nSecondNumber = 16;
break;
case 104:
*nFirstNumber = 46;
*nSecondNumber = 17;
break;
case 105:
*nFirstNumber = 46;
*nSecondNumber = 18;
break;
case 106:
*nFirstNumber = 46;
*nSecondNumber = 19;
break;
case 107:
*nFirstNumber = 46;
*nSecondNumber = 20;
break;
case 108:
*nFirstNumber = 46;
*nSecondNumber = 21;
break;
case 109:
*nFirstNumber = 46;
*nSecondNumber = 22;
break;
case 110:
*nFirstNumber = 46;
*nSecondNumber = 23;
break;
case 111:
*nFirstNumber = 46;
*nSecondNumber = 24;
break;
case 112:
*nFirstNumber = 46;
*nSecondNumber = 25;
break;
case 113:
*nFirstNumber = 46;
*nSecondNumber = 26;
break;
case 114:
*nFirstNumber = 46;
*nSecondNumber = 27;
break;
case 115:
*nFirstNumber = 46;
*nSecondNumber = 28;
break;
case 116:
*nFirstNumber = 46;
*nSecondNumber = 29;
break;
case 117:
*nFirstNumber = 46;
*nSecondNumber = 30;
break;
case 118:
*nFirstNumber = 46;
*nSecondNumber = 31;
break;
case 119:
*nFirstNumber = 46;
*nSecondNumber = 32;
break;
case 120:
*nFirstNumber = 46;
*nSecondNumber = 33;
break;
case 121:
*nFirstNumber = 46;
*nSecondNumber = 34;
break;
case 122:
*nFirstNumber = 46;
*nSecondNumber = 35;
break;
case 123:
*nFirstNumber = 44;
*nSecondNumber = 25;
break;
case 124:
*nFirstNumber = 44;
*nSecondNumber = 26;
break;
case 125:
*nFirstNumber = 44;
*nSecondNumber = 27;
break;
case 126:
*nFirstNumber = 44;
*nSecondNumber = 28;
break;
case 127:
*nFirstNumber = 44;
*nSecondNumber = 29;
break;
}
}