// Copyright 2014 PDFium Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style license that can be | |
// found in the LICENSE file. | |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
#include "xfa/src/foxitlib.h" | |
#include "xfa/src/fwl/src/basewidget/include/fxmath_barcodeimp.h" | |
static CBC_CodeBase* FX_Barcode_CreateBarCodeEngineObject(BC_TYPE type) { | |
switch (type) { | |
case BC_CODE39: | |
return new CBC_Code39(); | |
case BC_CODABAR: | |
return new CBC_Codabar(); | |
case BC_CODE128: | |
return new CBC_Code128(BC_CODE128_B); | |
case BC_CODE128_B: | |
return new CBC_Code128(BC_CODE128_B); | |
case BC_CODE128_C: | |
return new CBC_Code128(BC_CODE128_C); | |
case BC_EAN8: | |
return new CBC_EAN8(); | |
case BC_UPCA: | |
return new CBC_UPCA(); | |
case BC_EAN13: | |
return new CBC_EAN13(); | |
case BC_QR_CODE: | |
return new CBC_QRCode(); | |
case BC_PDF417: | |
return new CBC_PDF417I(); | |
case BC_DATAMATRIX: | |
return new CBC_DataMatrix(); | |
case BC_UNKNOWN: | |
default: | |
return NULL; | |
} | |
} | |
CFX_Barcode::CFX_Barcode() {} | |
CFX_Barcode::~CFX_Barcode() { | |
if (m_pBCEngine) { | |
delete m_pBCEngine; | |
m_pBCEngine = NULL; | |
} | |
} | |
FX_BOOL CFX_Barcode::Crreate(BC_TYPE type) { | |
m_pBCEngine = FX_Barcode_CreateBarCodeEngineObject(type); | |
return m_pBCEngine != NULL; | |
} | |
void CFX_Barcode::Release() { | |
delete this; | |
} | |
BC_TYPE CFX_Barcode::GetType() { | |
return m_pBCEngine ? m_pBCEngine->GetType() : BC_UNKNOWN; | |
} | |
FX_BOOL CFX_Barcode::SetCharEncoding(BC_CHAR_ENCODING encoding) { | |
return m_pBCEngine ? m_pBCEngine->SetCharEncoding(encoding) : FALSE; | |
} | |
FX_BOOL CFX_Barcode::SetModuleHeight(int32_t moduleHeight) { | |
return m_pBCEngine ? m_pBCEngine->SetModuleHeight(moduleHeight) : FALSE; | |
} | |
FX_BOOL CFX_Barcode::SetModuleWidth(int32_t moduleWidth) { | |
return m_pBCEngine ? m_pBCEngine->SetModuleWidth(moduleWidth) : FALSE; | |
} | |
FX_BOOL CFX_Barcode::SetHeight(int32_t height) { | |
return m_pBCEngine ? m_pBCEngine->SetHeight(height) : FALSE; | |
} | |
FX_BOOL CFX_Barcode::SetWidth(int32_t width) { | |
return m_pBCEngine ? m_pBCEngine->SetWidth(width) : FALSE; | |
} | |
FX_BOOL CFX_Barcode::CheckContentValidity(const CFX_WideStringC& contents) { | |
switch (GetType()) { | |
case BC_CODE39: | |
case BC_CODABAR: | |
case BC_CODE128: | |
case BC_CODE128_B: | |
case BC_CODE128_C: | |
case BC_EAN8: | |
case BC_EAN13: | |
case BC_UPCA: | |
return m_pBCEngine | |
? static_cast<CBC_OneCode*>(m_pBCEngine) | |
->CheckContentValidity(contents) | |
: TRUE; | |
default: | |
return TRUE; | |
} | |
} | |
FX_BOOL CFX_Barcode::SetPrintChecksum(FX_BOOL checksum) { | |
switch (GetType()) { | |
case BC_CODE39: | |
case BC_CODABAR: | |
case BC_CODE128: | |
case BC_CODE128_B: | |
case BC_CODE128_C: | |
case BC_EAN8: | |
case BC_EAN13: | |
case BC_UPCA: | |
return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine) | |
->SetPrintChecksum(checksum), | |
TRUE) | |
: FALSE; | |
default: | |
return FALSE; | |
} | |
} | |
FX_BOOL CFX_Barcode::SetDataLength(int32_t length) { | |
switch (GetType()) { | |
case BC_CODE39: | |
case BC_CODABAR: | |
case BC_CODE128: | |
case BC_CODE128_B: | |
case BC_CODE128_C: | |
case BC_EAN8: | |
case BC_EAN13: | |
case BC_UPCA: | |
return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine) | |
->SetDataLength(length), | |
TRUE) | |
: FALSE; | |
default: | |
return FALSE; | |
} | |
} | |
FX_BOOL CFX_Barcode::SetCalChecksum(int32_t state) { | |
switch (GetType()) { | |
case BC_CODE39: | |
case BC_CODABAR: | |
case BC_CODE128: | |
case BC_CODE128_B: | |
case BC_CODE128_C: | |
case BC_EAN8: | |
case BC_EAN13: | |
case BC_UPCA: | |
return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine) | |
->SetCalChecksum(state), | |
TRUE) | |
: FALSE; | |
default: | |
return FALSE; | |
} | |
} | |
FX_BOOL CFX_Barcode::SetFont(CFX_Font* pFont) { | |
switch (GetType()) { | |
case BC_CODE39: | |
case BC_CODABAR: | |
case BC_CODE128: | |
case BC_CODE128_B: | |
case BC_CODE128_C: | |
case BC_EAN8: | |
case BC_EAN13: | |
case BC_UPCA: | |
return m_pBCEngine | |
? static_cast<CBC_OneCode*>(m_pBCEngine)->SetFont(pFont) | |
: FALSE; | |
default: | |
return FALSE; | |
} | |
} | |
FX_BOOL CFX_Barcode::SetFontSize(FX_FLOAT size) { | |
switch (GetType()) { | |
case BC_CODE39: | |
case BC_CODABAR: | |
case BC_CODE128: | |
case BC_CODE128_B: | |
case BC_CODE128_C: | |
case BC_EAN8: | |
case BC_EAN13: | |
case BC_UPCA: | |
return m_pBCEngine | |
? (static_cast<CBC_OneCode*>(m_pBCEngine)->SetFontSize(size), | |
TRUE) | |
: FALSE; | |
default: | |
return FALSE; | |
} | |
} | |
FX_BOOL CFX_Barcode::SetFontStyle(int32_t style) { | |
switch (GetType()) { | |
case BC_CODE39: | |
case BC_CODABAR: | |
case BC_CODE128: | |
case BC_CODE128_B: | |
case BC_CODE128_C: | |
case BC_EAN8: | |
case BC_EAN13: | |
case BC_UPCA: | |
return m_pBCEngine | |
? (static_cast<CBC_OneCode*>(m_pBCEngine)->SetFontStyle(style), | |
TRUE) | |
: FALSE; | |
default: | |
return FALSE; | |
} | |
} | |
FX_BOOL CFX_Barcode::SetFontColor(FX_ARGB color) { | |
switch (GetType()) { | |
case BC_CODE39: | |
case BC_CODABAR: | |
case BC_CODE128: | |
case BC_CODE128_B: | |
case BC_CODE128_C: | |
case BC_EAN8: | |
case BC_EAN13: | |
case BC_UPCA: | |
return m_pBCEngine | |
? (static_cast<CBC_OneCode*>(m_pBCEngine)->SetFontColor(color), | |
TRUE) | |
: FALSE; | |
default: | |
return FALSE; | |
} | |
} | |
FX_BOOL CFX_Barcode::SetTextLocation(BC_TEXT_LOC location) { | |
typedef FX_BOOL (CBC_CodeBase::*memptrtype)(BC_TEXT_LOC); | |
memptrtype memptr = NULL; | |
switch (GetType()) { | |
case BC_CODE39: | |
memptr = (memptrtype)&CBC_Code39::SetTextLocation; | |
break; | |
case BC_CODABAR: | |
memptr = (memptrtype)&CBC_Codabar::SetTextLocation; | |
break; | |
case BC_CODE128: | |
case BC_CODE128_B: | |
case BC_CODE128_C: | |
memptr = (memptrtype)&CBC_Code128::SetTextLocation; | |
break; | |
default: | |
break; | |
} | |
return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(location) : FALSE; | |
} | |
FX_BOOL CFX_Barcode::SetWideNarrowRatio(int32_t ratio) { | |
typedef FX_BOOL (CBC_CodeBase::*memptrtype)(int32_t); | |
memptrtype memptr = NULL; | |
switch (GetType()) { | |
case BC_CODE39: | |
memptr = (memptrtype)&CBC_Code39::SetWideNarrowRatio; | |
break; | |
case BC_CODABAR: | |
memptr = (memptrtype)&CBC_Codabar::SetWideNarrowRatio; | |
break; | |
default: | |
break; | |
} | |
return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(ratio) : FALSE; | |
} | |
FX_BOOL CFX_Barcode::SetStartChar(FX_CHAR start) { | |
typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_CHAR); | |
memptrtype memptr = NULL; | |
switch (GetType()) { | |
case BC_CODABAR: | |
memptr = (memptrtype)&CBC_Codabar::SetStartChar; | |
break; | |
default: | |
break; | |
} | |
return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(start) : FALSE; | |
} | |
FX_BOOL CFX_Barcode::SetEndChar(FX_CHAR end) { | |
typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_CHAR); | |
memptrtype memptr = NULL; | |
switch (GetType()) { | |
case BC_CODABAR: | |
memptr = (memptrtype)&CBC_Codabar::SetEndChar; | |
break; | |
default: | |
break; | |
} | |
return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(end) : FALSE; | |
} | |
FX_BOOL CFX_Barcode::SetVersion(int32_t version) { | |
typedef FX_BOOL (CBC_CodeBase::*memptrtype)(int32_t); | |
memptrtype memptr = NULL; | |
switch (GetType()) { | |
case BC_QR_CODE: | |
memptr = (memptrtype)&CBC_QRCode::SetVersion; | |
break; | |
default: | |
break; | |
} | |
return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(version) : FALSE; | |
} | |
FX_BOOL CFX_Barcode::SetErrorCorrectionLevel(int32_t level) { | |
typedef FX_BOOL (CBC_CodeBase::*memptrtype)(int32_t); | |
memptrtype memptr = NULL; | |
switch (GetType()) { | |
case BC_QR_CODE: | |
memptr = (memptrtype)&CBC_QRCode::SetErrorCorrectionLevel; | |
break; | |
case BC_PDF417: | |
memptr = (memptrtype)&CBC_PDF417I::SetErrorCorrectionLevel; | |
break; | |
default: | |
return FALSE; | |
} | |
return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(level) : FALSE; | |
} | |
FX_BOOL CFX_Barcode::SetTruncated(FX_BOOL truncated) { | |
typedef void (CBC_CodeBase::*memptrtype)(FX_BOOL); | |
memptrtype memptr = NULL; | |
switch (GetType()) { | |
case BC_PDF417: | |
memptr = (memptrtype)&CBC_PDF417I::SetTruncated; | |
break; | |
default: | |
break; | |
} | |
return m_pBCEngine && memptr ? ((m_pBCEngine->*memptr)(truncated), TRUE) | |
: FALSE; | |
} | |
#ifndef BCExceptionNO | |
#define BCExceptionNO 0 | |
#endif | |
#ifndef BCExceptionFormatException | |
#define BCExceptionFormatException 8 | |
#endif | |
#ifndef BCExceptionUnSupportedBarcode | |
#define BCExceptionUnSupportedBarcode 18 | |
#endif | |
FX_BOOL CFX_Barcode::Encode(const CFX_WideStringC& contents, | |
FX_BOOL isDevice, | |
int32_t& e) { | |
if (!m_pBCEngine) { | |
return FALSE; | |
} | |
return m_pBCEngine->Encode(contents, isDevice, e); | |
} | |
FX_BOOL CFX_Barcode::RenderDevice(CFX_RenderDevice* device, | |
const CFX_Matrix* matirx, | |
int32_t& e) { | |
if (!m_pBCEngine) { | |
return FALSE; | |
} | |
return m_pBCEngine->RenderDevice(device, matirx, e); | |
} | |
FX_BOOL CFX_Barcode::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) { | |
if (!m_pBCEngine) { | |
return FALSE; | |
} | |
return m_pBCEngine->RenderBitmap(pOutBitmap, e); | |
} | |
#define BC_TYPE_MIN BC_CODE39 | |
#define BC_TYPE_MAX BC_DATAMATRIX | |
CFX_WideString CFX_Barcode::Decode(uint8_t* buf, | |
int32_t width, | |
int32_t height, | |
int32_t& errorCode) { | |
for (BC_TYPE t = BC_TYPE_MIN; t <= BC_TYPE_MAX; | |
t = (BC_TYPE)((int32_t)t + 1)) { | |
CBC_CodeBase* pTmpEngine = FX_Barcode_CreateBarCodeEngineObject(t); | |
if (!pTmpEngine) { | |
continue; | |
} | |
CFX_WideString ret = pTmpEngine->Decode(buf, width, height, errorCode); | |
if (errorCode == BCExceptionNO) { | |
return ret; | |
} | |
} | |
errorCode = BCExceptionUnSupportedBarcode; | |
return CFX_WideString(); | |
} | |
CFX_WideString CFX_Barcode::Decode(CFX_DIBitmap* pBitmap, int32_t& errorCode) { | |
for (BC_TYPE t = BC_TYPE_MIN; t <= BC_TYPE_MAX; | |
t = (BC_TYPE)((int32_t)t + 1)) { | |
CBC_CodeBase* pTmpEngine = FX_Barcode_CreateBarCodeEngineObject(t); | |
if (!pTmpEngine) { | |
continue; | |
} | |
CFX_WideString ret = pTmpEngine->Decode(pBitmap, errorCode); | |
if (errorCode == BCExceptionNO) { | |
return ret; | |
} | |
} | |
errorCode = BCExceptionUnSupportedBarcode; | |
return CFX_WideString(); | |
} | |
IFX_Barcode* FX_Barcode_Create(BC_TYPE type) { | |
CFX_Barcode* pBarcode = new CFX_Barcode; | |
if (pBarcode->Crreate(type)) { | |
return pBarcode; | |
} | |
pBarcode->Release(); | |
return NULL; | |
} |