📄 sgxbarcode.cpp
字号:
/**
*** Class Name : SGXBarCode
*** Version : 1.0.0
***
*** Author : Sophia Cradle Incorporated
*** Platform : x86, ARM
*** OS : BREW 2.1, BREW 3.1
*** Target SophiaFramework Version : 3.0
*** Compiler : Visual C++ 6.0, Visual C++ .NET 2003,
*** RVCTB 1.2
**/
/*
=== 僶乕偺 2 抣壔偵偮偄偰 ===
崟 -> true
敀 -> false
=============================
*/
#include "SGXBarCode.hpp"
#define DEFAULT_HEIGHT 5 // 撉傒庢傝偵巊梡偡傞夋憸偺廲曽岦偺僒僀僘偺婛掕抣
#define BAR_LENGTH_ERROR 4 // 僶乕偺挿偝偺岆嵎偺嫋梕
#define BARLENGTH_JAN8 67
#define BARLENGTH_JAN13 95
SGXBarCode::SGXBarCode(Void) : _barcodeType(BARCODE_JAN13), _barBitSize(0), _barBit(null), _height(DEFAULT_HEIGHT), _grayscale(null)
{
}
SGXBarCode::SGXBarCode(SGXBarCode::BarCodeEnum barcodeType) : _barcodeType(barcodeType), _barBitSize(0), _barBit(null), _height(DEFAULT_HEIGHT), _grayscale(null)
{
}
SGXBarCode::SGXBarCode(SGXBarCodeConstRef ob) : _barBitSize(0), _barBit(null), _height(DEFAULT_HEIGHT), _grayscale(null)
{
Copy(ob);
}
SGXBarCode::~SGXBarCode(Void)
{
Clear();
}
SGXBarCodeConstRef SGXBarCode::operator =(SGXBarCodeConstRef ob)
{
Copy(ob);
return *this;
}
Void SGXBarCode::Clear(Void)
{
if (_barBit) {
delete [] _barBit;
}
_barBit = null;
_barBitSize = 0;
if (_grayscale) {
delete [] _grayscale;
}
_grayscale = null;
}
Void SGXBarCode::Copy(SGXBarCodeConstRef ob) static_throws
{
Clear();
_barcodeType = ob._barcodeType;
_result = ob._result;
static_throw(SFERR_NO_ERROR);
}
Void SGXBarCode::SetType(BarCodeEnum barcodeType)
{
_barcodeType = barcodeType;
}
SGXBarCode::BarCodeEnum SGXBarCode::GetType(Void) const
{
return _barcodeType;
}
// 撉傒庢傞夋憸偺廲曽岦偺戝偒偝傪愝掕
Void SGXBarCode::SetHeight(UInt16 height)
{
_height = height;
}
// 撉傒庢傞夋憸偺廲曽岦偺戝偒偝傪庢摼
UInt16 SGXBarCode::GetHeight(Void) const
{
return _height;
}
// JAN-13 傪張棟偡傞
Void SGXBarCode::ProcessJAN13(Void) static_throws
{
UInt08 code[13], c;
UInt08 parity(0);
SInt16 i;
UInt32 odd(0), even(0), checkDigit;
BarTypeEnum barType;
if (_barBitSize != BARLENGTH_JAN13) {
static_throw(ERR_INVALID_BARCODE);
return;
}
if (!(_barBit[0] && !_barBit[1] && _barBit[2] && !_barBit[45] && _barBit[46] && !_barBit[47] && _barBit[48] && !_barBit[49] && _barBit[92] && !_barBit[93] && _barBit[94])) {
static_throw(ERR_INVALID_BARCODE);
return;
}
// 嵍敿暘傪張棟
for (i = 0; i < 6; ) {
if (!ReadJANBar(_barBit + 3 + 7 * i, &c, &barType) || (barType != BARTYPE_JAN_LO && barType != BARTYPE_JAN_LE)) {
static_throw(ERR_INVALID_BARCODE);
return;
}
code[++i] = c;
parity <<= 1;
parity |= ((barType == BARTYPE_JAN_LE) ? 1 : 0);
}
switch (parity) {
case 0x00:
code[0] = 0;
break;
case 0x0B:
code[0] = 1;
break;
case 0x0D:
code[0] = 2;
break;
case 0x0E:
code[0] = 3;
break;
case 0x13:
code[0] = 4;
break;
case 0x19:
code[0] = 5;
break;
case 0x1C:
code[0] = 6;
break;
case 0x15:
code[0] = 7;
break;
case 0x16:
code[0] = 8;
break;
case 0x1A:
code[0] = 9;
break;
default:
static_throw(ERR_INVALID_BARCODE);
return;
}
// 塃敿暘傪張棟
for (i = 0; i < 6; ++i) {
if (!ReadJANBar(_barBit + 50 + 7 * i, &c, &barType) || barType != BARTYPE_JAN_RE) {
static_throw(ERR_INVALID_BARCODE);
return;
}
code[i + 7] = c;
}
// 寢壥傪暥帤楍偵曄姺
for (i = 0; i < 13; ++i) {
_result += '0' + code[i];
}
// 僨乕僞偺惍崌惈傪僠僃僢僋 (儌僕儏儔僗10 / 僂僃僀僩 3)
for (i = 0; i < 12; i += 2) {
odd += code[i + 1];
even += code[i];
}
checkDigit = 10 - ((3 * odd + even) % 10);
if (code[12] != static_cast<UInt08>(checkDigit)) {
static_throw(ERR_MISMATCH);
}
}
Void SGXBarCode::ProcessJAN8(Void) static_throws
{
UInt08 code[8], c;
SInt16 i;
UInt32 odd(0), even(0), checkDigit;
BarTypeEnum barType;
if (_barBitSize != BARLENGTH_JAN8) {
static_throw(ERR_INVALID_BARCODE);
return;
}
if (!(_barBit[0] && !_barBit[1] && _barBit[2] && !_barBit[31] && _barBit[32] && !_barBit[33] && _barBit[34] && !_barBit[35] && _barBit[64] && !_barBit[65] && _barBit[66])) {
static_throw(ERR_INVALID_BARCODE);
return;
}
// 嵍敿暘傪張棟
for (i = 0; i < 4; ++i) {
if (!ReadJANBar(_barBit + 3 + 7 * i, &c, &barType) || barType != BARTYPE_JAN_LO) {
static_throw(ERR_INVALID_BARCODE);
return;
}
code[i] = c;
}
// 塃敿暘傪張棟
for (i = 0; i < 4; ++i) {
if (!ReadJANBar(_barBit + 36 + 7 * i, &c, &barType) || barType != BARTYPE_JAN_RE) {
static_throw(ERR_INVALID_BARCODE);
return;
}
code[i + 4] = c;
}
// 寢壥傪暥帤楍偵曄姺
for (i = 0; i < 8; ++i) {
_result += '0' + code[i];
}
// 僨乕僞偺惍崌惈傪僠僃僢僋 (儌僕儏儔僗10 / 僂僃僀僩 3)
odd = code[0];
for (i = 1; i < 7; i += 2) {
odd += code[i + 1];
even += code[i];
}
checkDigit = 10 - ((3 * odd + even) % 10);
if (code[7] != static_cast<UInt08>(checkDigit)) {
static_throw(ERR_MISMATCH);
}
}
// JAN-8 / JAN-13 偺僶乕偺僷僞乕儞傪悢帤偵曄姺
Bool SGXBarCode::ReadJANBar(BoolConstPtr bar, UInt08Ptr pVal, SGXBarCode::BarTypeEnum *pBarType)
{
Bool result(true);
UInt08 pattern(0);
SInt16 i;
for (i = 0; i < 7; ++i) {
pattern <<= 1;
pattern |= (bar[i] ? 1 : 0);
}
switch (pattern) {
case 0x0D:
*pVal = 0;
*pBarType = BARTYPE_JAN_LO;
break;
case 0x19:
*pVal = 1;
*pBarType = BARTYPE_JAN_LO;
break;
case 0x13:
*pVal = 2;
*pBarType = BARTYPE_JAN_LO;
break;
case 0x3D:
*pVal = 3;
*pBarType = BARTYPE_JAN_LO;
break;
case 0x23:
*pVal = 4;
*pBarType = BARTYPE_JAN_LO;
break;
case 0x31:
*pVal = 5;
*pBarType = BARTYPE_JAN_LO;
break;
case 0x2F:
*pVal = 6;
*pBarType = BARTYPE_JAN_LO;
break;
case 0x3B:
*pVal = 7;
*pBarType = BARTYPE_JAN_LO;
break;
case 0x37:
*pVal = 8;
*pBarType = BARTYPE_JAN_LO;
break;
case 0x0B:
*pVal = 9;
*pBarType = BARTYPE_JAN_LO;
break;
case 0x27:
*pVal = 0;
*pBarType = BARTYPE_JAN_LE;
break;
case 0x33:
*pVal = 1;
*pBarType = BARTYPE_JAN_LE;
break;
case 0x1B:
*pVal = 2;
*pBarType = BARTYPE_JAN_LE;
break;
case 0x21:
*pVal = 3;
*pBarType = BARTYPE_JAN_LE;
break;
case 0x1D:
*pVal = 4;
*pBarType = BARTYPE_JAN_LE;
break;
case 0x39:
*pVal = 5;
*pBarType = BARTYPE_JAN_LE;
break;
case 0x05:
*pVal = 6;
*pBarType = BARTYPE_JAN_LE;
break;
case 0x11:
*pVal = 7;
*pBarType = BARTYPE_JAN_LE;
break;
case 0x09:
*pVal = 8;
*pBarType = BARTYPE_JAN_LE;
break;
case 0x17:
*pVal = 9;
*pBarType = BARTYPE_JAN_LE;
break;
case 0x72:
*pVal = 0;
*pBarType = BARTYPE_JAN_RE;
break;
case 0x66:
*pVal = 1;
*pBarType = BARTYPE_JAN_RE;
break;
case 0x6C:
*pVal = 2;
*pBarType = BARTYPE_JAN_RE;
break;
case 0x42:
*pVal = 3;
*pBarType = BARTYPE_JAN_RE;
break;
case 0x5C:
*pVal = 4;
*pBarType = BARTYPE_JAN_RE;
break;
case 0x4E:
*pVal = 5;
*pBarType = BARTYPE_JAN_RE;
break;
case 0x50:
*pVal = 6;
*pBarType = BARTYPE_JAN_RE;
break;
case 0x44:
*pVal = 7;
*pBarType = BARTYPE_JAN_RE;
break;
case 0x48:
*pVal = 8;
*pBarType = BARTYPE_JAN_RE;
break;
case 0x74:
*pVal = 9;
*pBarType = BARTYPE_JAN_RE;
break;
default:
result = false;
}
return result;
}
SFXAnsiStringConstRef SGXBarCode::Read(SFBBitmapSmpConstRef bitmap) static_throws
{
AEEBitmapInfo info;
bitmap->GetInfo(&info);
return Read(bitmap, static_cast<UInt16>(info.cy / 2));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -