| // 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 "../../../foxitlib.h" | |
| #include "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 | |
| ? ((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 | |
| ? (((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 | |
| ? (((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 | |
| ? (((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 ? ((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 | |
| ? (((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 | |
| ? (((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 | |
| ? (((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; | |
| } |