Add Channel Code

This commit is contained in:
hooper114 2009-05-16 14:19:43 +00:00
parent cd614f42f7
commit 0e560805b4
8 changed files with 232 additions and 17 deletions

View File

@ -73,6 +73,16 @@ static char *C93Table[47] = {"131112", "111213", "111312", "111411", "121113", "
"122121", "123111", "121131", "311112", "311211", "321111", "112131", "113121", "211131", "122121", "123111", "121131", "311112", "311211", "321111", "112131", "113121", "211131",
"121221", "312111", "311121", "122211"}; "121221", "312111", "311121", "122211"};
/* Global Variables for Channel Code */
int S[11], B[11];
long value;
long target_value;
char pattern[30];
/* Function Prototypes */
void NextS(int Chan, int i, int MaxS, int MaxB);
void NextB(int Chan, int i, int MaxB, int MaxS);
/* *********************** CODE 11 ******************** */ /* *********************** CODE 11 ******************** */
int code_11(struct zint_symbol *symbol, unsigned char source[]) int code_11(struct zint_symbol *symbol, unsigned char source[])
@ -88,12 +98,12 @@ int code_11(struct zint_symbol *symbol, unsigned char source[])
strcpy(dest, ""); strcpy(dest, "");
if(ustrlen(source) > 80) { if(ustrlen(source) > 80) {
strcpy(symbol->errtxt, "Input too long [011]"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NASET, source); error_number = is_sane(NASET, source);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data [012]"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
} }
c_weight = 1; c_weight = 1;
@ -170,12 +180,12 @@ int c39(struct zint_symbol *symbol, unsigned char source[])
to_upper(source); to_upper(source);
if(ustrlen(source) > 45) { if(ustrlen(source) > 45) {
strcpy(symbol->errtxt, "Input too long [081]"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(TCSET , source); error_number = is_sane(TCSET , source);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data [082]"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
} }
@ -257,12 +267,12 @@ int pharmazentral(struct zint_symbol *symbol, unsigned char source[])
count = 0; count = 0;
h = ustrlen(source); h = ustrlen(source);
if(h > 6) { if(h > 6) {
strcpy(symbol->errtxt, "Input wrong length [521]"); strcpy(symbol->errtxt, "Input wrong length");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data [522]"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
} }
@ -310,7 +320,7 @@ int ec39(struct zint_symbol *symbol, unsigned char source[])
/* only stops strings which are far too long - actual length of the barcode /* only stops strings which are far too long - actual length of the barcode
depends on the type of data being encoded - if it's too long it's picked up depends on the type of data being encoded - if it's too long it's picked up
by c39() */ by c39() */
strcpy(symbol->errtxt, "Input too long [091]"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
@ -318,7 +328,7 @@ int ec39(struct zint_symbol *symbol, unsigned char source[])
for(i = 0; i < ustrlen(source); i++) { for(i = 0; i < ustrlen(source); i++) {
if(source[i] > 127) { if(source[i] > 127) {
/* Cannot encode extended ASCII */ /* Cannot encode extended ASCII */
strcpy(symbol->errtxt, "Invalid characters in input data [092]"); strcpy(symbol->errtxt, "Invalid characters in input data");
return ERROR_INVALID_DATA; return ERROR_INVALID_DATA;
} }
} }
@ -368,14 +378,14 @@ int c93(struct zint_symbol *symbol, unsigned char source[])
if(ustrlen(source) > 45) { if(ustrlen(source) > 45) {
/* This stops rediculously long input - the actual length of the barcode /* This stops rediculously long input - the actual length of the barcode
depends on the type of data */ depends on the type of data */
strcpy(symbol->errtxt, "Input too long [251]"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
for(i = 0; i < ustrlen(source); i++) { for(i = 0; i < ustrlen(source); i++) {
if(source[i] > 127) { if(source[i] > 127) {
/* Cannot encode extended ASCII */ /* Cannot encode extended ASCII */
strcpy(symbol->errtxt, "Invalid characters in input data [252]"); strcpy(symbol->errtxt, "Invalid characters in input data");
return ERROR_INVALID_DATA; return ERROR_INVALID_DATA;
} }
} }
@ -395,7 +405,7 @@ int c93(struct zint_symbol *symbol, unsigned char source[])
/* Now we can check the true length of the barcode */ /* Now we can check the true length of the barcode */
if(strlen(buffer) > 45) { if(strlen(buffer) > 45) {
strcpy(symbol->errtxt, "Input too long [253]"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
@ -466,3 +476,115 @@ int c93(struct zint_symbol *symbol, unsigned char source[])
} }
return error_number; return error_number;
} }
/* NextS() and NextB() are from ANSI/AIM BC12-1998 and are Copyright (c) AIM 1997 */
/* Their are used here on the understanding that they form part of the specification
for Channel Code and therefore their use is permitted under the following terms
set out in that document:
"It is the intent and understanding of AIM [t]hat the symbology presented in this
specification is entirely in the public domain and free of all use restrictions,
licenses and fees. AIM USA, its memer companies, or individual officers
assume no liability for the use of this document." */
void CheckCharacter() {
int i;
char part[3];
if(value == target_value) {
/* Target reached - save the generated pattern */
strcpy(pattern, "11110");
for(i = 0; i < 11; i++) {
part[0] = itoc(S[i]);
part[1] = itoc(B[i]);
part[2] = '\0';
concat(pattern, part);
}
}
}
void NextB(int Chan, int i, int MaxB, int MaxS) {
int b;
b = (S[i]+B[i-1]+S[i-1]+B[i-2] > 4)? 1:2;
if (i < Chan+2) {
for (; b <= MaxB; b++) {
B[i] = b;
NextS(Chan,i+1,MaxS,MaxB+1-b);
}
} else if (b <= MaxB) {
B[i] = MaxB;
CheckCharacter();
value++;
}
}
void NextS(int Chan, int i, int MaxS, int MaxB) {
int s;
for (s = (i<Chan+2)? 1: MaxS; s <= MaxS; s++) {
S[i] = s;
NextB(Chan,i,MaxB,MaxS+1-s);
}
}
int channel_code(struct zint_symbol *symbol, unsigned char source[]) {
/* Channel Code - According to ANSI/AIM BC12-1998 */
int input_length, channels, i;
int error_number = 0, range = 0, zeroes;
char hrt[9];
input_length = ustrlen(source);
target_value = 0;
if(input_length > 7) {
strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG;
}
error_number = is_sane(NESET, source);
if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data");
return error_number;
}
if((symbol->option_2 < 3) || (symbol->option_2 > 8)) { channels = 0; } else { channels = symbol->option_2; }
if(channels == 0) { channels = input_length + 1; }
if(channels == 2) { channels = 3; }
for(i = 0; i < input_length; i++) {
target_value *= 10;
target_value += ctoi((char) source[i]);
}
switch(channels) {
case 3: if(target_value > 26) { range = 1; } break;
case 4: if(target_value > 292) { range = 1; } break;
case 5: if(target_value > 3493) { range = 1; } break;
case 6: if(target_value > 44072) { range = 1; } break;
case 7: if(target_value > 576688) { range = 1; } break;
case 8: if(target_value > 7742862) { range = 1; } break;
}
if(range) {
strcpy(symbol->errtxt, "Value out of range");
return ERROR_INVALID_DATA;
}
for(i = 0; i < 11; i++) { B[i] = 0; S[i] = 0; }
B[0] = S[1] = B[1] = S[2] = B[2] = 1;
value = 0;
NextS(channels,3,channels,channels);
strcpy(hrt, "");
zeroes = channels - 1 - input_length;
for(i = 0; i < zeroes; i++) {
concat(hrt, "0");
}
concat(hrt, (char *)source);
ustrcpy(symbol->text, (unsigned char *)hrt);
expand(symbol, pattern);
return error_number;
}

View File

@ -194,7 +194,7 @@ float dmroundup(float input)
float fraction, output; float fraction, output;
fraction = input - (int)input; fraction = input - (int)input;
if(fraction > 0.01) { output = (input - fraction) + 1.0; } if(fraction > 0.01) { output = (input - fraction) + 1.0; } else { output = input; }
return output; return output;
} }
@ -538,7 +538,7 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
/* step (e) X12 encodation */ /* step (e) X12 encodation */
if(current_mode == DM_X12) { if(current_mode == DM_X12) {
int value; int value = 0;
next_mode = DM_X12; next_mode = DM_X12;
if(text_p == 0) { if(text_p == 0) {
@ -579,7 +579,7 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
/* step (f) EDIFACT encodation */ /* step (f) EDIFACT encodation */
if(current_mode == DM_EDIFACT) { if(current_mode == DM_EDIFACT) {
int value; int value = 0;
next_mode = DM_EDIFACT; next_mode = DM_EDIFACT;
if(edifact_p == 3) { if(edifact_p == 3) {

View File

@ -121,6 +121,7 @@ extern int aztec_runes(struct zint_symbol *symbol, unsigned char source[]); /* A
extern int korea_post(struct zint_symbol *symbol, unsigned char source[]); /* Korea Post */ extern int korea_post(struct zint_symbol *symbol, unsigned char source[]); /* Korea Post */
extern int japan_post(struct zint_symbol *symbol, unsigned char source[]); /* Japanese Post */ extern int japan_post(struct zint_symbol *symbol, unsigned char source[]); /* Japanese Post */
extern int code_49(struct zint_symbol *symbol, unsigned char source[]); /* Code 49 */ extern int code_49(struct zint_symbol *symbol, unsigned char source[]); /* Code 49 */
extern int channel_code(struct zint_symbol *symbol, unsigned char source[]); /* Channel Code */
#ifndef NO_PNG #ifndef NO_PNG
int png_handle(struct zint_symbol *symbol, int rotate_angle); int png_handle(struct zint_symbol *symbol, int rotate_angle);
@ -429,7 +430,7 @@ int ZBarcode_Encode(struct zint_symbol *symbol, unsigned char *source)
if(symbol->symbology == 111) { symbol->symbology = BARCODE_HIBC_BLOCKF; } if(symbol->symbology == 111) { symbol->symbology = BARCODE_HIBC_BLOCKF; }
if((symbol->symbology >= 112) && (symbol->symbology <= 127)) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; } if((symbol->symbology >= 112) && (symbol->symbology <= 127)) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; }
/* Everything from 128 up is Zint-specific */ /* Everything from 128 up is Zint-specific */
if(symbol->symbology >= 140) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; } if(symbol->symbology >= 141) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; }
if(error_number > 4) { if(error_number > 4) {
error_tag(symbol->errtxt, error_number); error_tag(symbol->errtxt, error_number);
@ -565,6 +566,7 @@ int ZBarcode_Encode(struct zint_symbol *symbol, unsigned char *source)
case BARCODE_HIBC_BLOCKF: error_number = hibc(symbol, preprocessed); break; case BARCODE_HIBC_BLOCKF: error_number = hibc(symbol, preprocessed); break;
case BARCODE_JAPANPOST: error_number = japan_post(symbol, preprocessed); break; case BARCODE_JAPANPOST: error_number = japan_post(symbol, preprocessed); break;
case BARCODE_CODE49: error_number = code_49(symbol, preprocessed); break; case BARCODE_CODE49: error_number = code_49(symbol, preprocessed); break;
case BARCODE_CHANNEL: error_number = channel_code(symbol, preprocessed); break;
} }
if((symbol->symbology == BARCODE_CODE128) || (symbol->symbology == BARCODE_CODE128B)) { if((symbol->symbology == BARCODE_CODE128) || (symbol->symbology == BARCODE_CODE128B)) {

View File

@ -29,7 +29,7 @@
int svg_plot(struct zint_symbol *symbol) int svg_plot(struct zint_symbol *symbol)
{ {
int i, block_width, latch, r, this_row; int i, block_width, latch, r, this_row;
float textpos, large_bar_height, preset_height, row_height, row_posn; float textpos, large_bar_height, preset_height, row_height, row_posn = 0;
FILE *fsvg; FILE *fsvg;
int fgred, fggrn, fgblu, bgred, bggrn, bgblu; int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
float red_ink, green_ink, blue_ink, red_paper, green_paper, blue_paper; float red_ink, green_ink, blue_ink, red_paper, green_paper, blue_paper;

View File

@ -137,6 +137,7 @@ struct zint_symbol {
#define BARCODE_RSS14STACK_CC 137 #define BARCODE_RSS14STACK_CC 137
#define BARCODE_RSS14_OMNI_CC 138 #define BARCODE_RSS14_OMNI_CC 138
#define BARCODE_RSS_EXPSTACK_CC 139 #define BARCODE_RSS_EXPSTACK_CC 139
#define BARCODE_CHANNEL 140
#define BARCODE_NO_ASCII 1 #define BARCODE_NO_ASCII 1
#define BARCODE_BIND 2 #define BARCODE_BIND 2

View File

@ -2227,6 +2227,77 @@ p, li { white-space: pre-wrap; }
</item> </item>
</widget> </widget>
</widget> </widget>
<widget class="QGroupBox" name="grpChannel" >
<property name="geometry" >
<rect>
<x>160</x>
<y>70</y>
<width>235</width>
<height>44</height>
</rect>
</property>
<property name="title" >
<string>Channel Code</string>
</property>
<widget class="QComboBox" name="cmbChannel" >
<property name="geometry" >
<rect>
<x>134</x>
<y>15</y>
<width>87</width>
<height>22</height>
</rect>
</property>
<item>
<property name="text" >
<string>Automatic</string>
</property>
</item>
<item>
<property name="text" >
<string>3</string>
</property>
</item>
<item>
<property name="text" >
<string>4</string>
</property>
</item>
<item>
<property name="text" >
<string>5</string>
</property>
</item>
<item>
<property name="text" >
<string>6</string>
</property>
</item>
<item>
<property name="text" >
<string>7</string>
</property>
</item>
<item>
<property name="text" >
<string>8</string>
</property>
</item>
</widget>
<widget class="QLabel" name="lblChannel" >
<property name="geometry" >
<rect>
<x>7</x>
<y>20</y>
<width>118</width>
<height>16</height>
</rect>
</property>
<property name="text" >
<string>Number of Channels:</string>
</property>
</widget>
</widget>
</widget> </widget>
<widget class="QWidget" name="tabAppear" > <widget class="QWidget" name="tabAppear" >
<property name="geometry" > <property name="geometry" >

View File

@ -33,6 +33,7 @@ MainWindow::MainWindow(QWidget* parent, Qt::WFlags fl)
"Australia Post Redirect Code", "Australia Post Redirect Code",
"Aztec Code", "Aztec Code",
"Aztec Runes", "Aztec Runes",
"Channel Code",
"Code 11", "Code 11",
"Code 128", "Code 128",
"Code 16k", "Code 16k",
@ -95,7 +96,7 @@ MainWindow::MainWindow(QWidget* parent, Qt::WFlags fl)
bstyle->addItem(metaObject()->enumerator(0).key(i)); bstyle->addItem(metaObject()->enumerator(0).key(i));
bstyle->setItemText(i,bstyle_text[i]); bstyle->setItemText(i,bstyle_text[i]);
} }
bstyle->setCurrentIndex(7); bstyle->setCurrentIndex(8);
change_options(); change_options();
update_preview(); update_preview();
view->scene()->addItem(&m_bc); view->scene()->addItem(&m_bc);
@ -164,6 +165,7 @@ MainWindow::MainWindow(QWidget* parent, Qt::WFlags fl)
connect(cmbMaxiMode, SIGNAL(currentIndexChanged( int )), SLOT(maxi_primary())); connect(cmbMaxiMode, SIGNAL(currentIndexChanged( int )), SLOT(maxi_primary()));
connect(txtMaxiPrimary, SIGNAL(textChanged( const QString& )), SLOT(update_preview())); connect(txtMaxiPrimary, SIGNAL(textChanged( const QString& )), SLOT(update_preview()));
connect(spnWhitespace, SIGNAL(valueChanged( int )), SLOT(update_preview())); connect(spnWhitespace, SIGNAL(valueChanged( int )), SLOT(update_preview()));
connect(cmbChannel, SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
@ -297,6 +299,14 @@ void MainWindow::change_options()
grpMaxiCode->hide(); grpMaxiCode->hide();
} }
if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_CHANNEL)
{
options = true;
grpChannel->show();
} else {
grpChannel->hide();
}
if(options == true) { if(options == true) {
lblNoOption->hide(); lblNoOption->hide();
@ -644,6 +654,14 @@ void MainWindow::update_preview()
m_bc.bc.setSecurityLevel(cmbMaxiMode->currentIndex() + 3); m_bc.bc.setSecurityLevel(cmbMaxiMode->currentIndex() + 3);
} }
break; break;
case BARCODE_CHANNEL:
m_bc.bc.setSymbol(BARCODE_CHANNEL);
if(cmbChannel->currentIndex() == 0) {
m_bc.bc.setWidth(0);
} else {
m_bc.bc.setWidth(cmbChannel->currentIndex() + 2);
}
break;
default: default:
m_bc.bc.setSymbol(metaObject()->enumerator(0).value(bstyle->currentIndex())); m_bc.bc.setSymbol(metaObject()->enumerator(0).value(bstyle->currentIndex()));
break; break;

View File

@ -38,6 +38,7 @@ public:
AUSREDIRECT =68, AUSREDIRECT =68,
AZTEC =92, AZTEC =92,
AZRUNE =128, AZRUNE =128,
CHANNEL =140,
CODE11 =1, CODE11 =1,
CODE128 =20, CODE128 =20,
CODE16K =23, CODE16K =23,