summaryrefslogtreecommitdiff
path: root/fxbarcode/pdf417
diff options
context:
space:
mode:
Diffstat (limited to 'fxbarcode/pdf417')
-rw-r--r--fxbarcode/pdf417/BC_PDF417.cpp91
-rw-r--r--fxbarcode/pdf417/BC_PDF417.h10
-rw-r--r--fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp64
-rw-r--r--fxbarcode/pdf417/BC_PDF417ErrorCorrection.h11
-rw-r--r--fxbarcode/pdf417/BC_PDF417Writer.cpp4
5 files changed, 71 insertions, 109 deletions
diff --git a/fxbarcode/pdf417/BC_PDF417.cpp b/fxbarcode/pdf417/BC_PDF417.cpp
index 7907150831..9844798b24 100644
--- a/fxbarcode/pdf417/BC_PDF417.cpp
+++ b/fxbarcode/pdf417/BC_PDF417.cpp
@@ -399,48 +399,49 @@ CBC_BarcodeMatrix* CBC_PDF417::getBarcodeMatrix() {
return m_barcodeMatrix.get();
}
-void CBC_PDF417::generateBarcodeLogic(CFX_WideString msg,
- int32_t errorCorrectionLevel,
- int32_t& e) {
+bool CBC_PDF417::generateBarcodeLogic(CFX_WideString msg,
+ int32_t errorCorrectionLevel) {
int32_t errorCorrectionCodeWords =
CBC_PDF417ErrorCorrection::getErrorCorrectionCodewordCount(
- errorCorrectionLevel, e);
- if (e != BCExceptionNO)
- return;
+ errorCorrectionLevel);
+ if (errorCorrectionCodeWords < 0)
+ return false;
+
+ int32_t e = BCExceptionNO;
CFX_WideString highLevel =
CBC_PDF417HighLevelEncoder::encodeHighLevel(msg, m_compaction, e);
if (e != BCExceptionNO)
- return;
+ return false;
int32_t sourceCodeWords = highLevel.GetLength();
- std::vector<int32_t>* dimension =
- determineDimensions(sourceCodeWords, errorCorrectionCodeWords, e);
- if (e != BCExceptionNO)
- return;
- int32_t cols = (*dimension)[0];
- int32_t rows = (*dimension)[1];
- delete dimension;
+ std::vector<int32_t> dimensions =
+ determineDimensions(sourceCodeWords, errorCorrectionCodeWords);
+ if (dimensions.size() != 2)
+ return false;
+ int32_t cols = dimensions[0];
+ int32_t rows = dimensions[1];
int32_t pad = getNumberOfPadCodewords(sourceCodeWords,
errorCorrectionCodeWords, cols, rows);
- if (sourceCodeWords + errorCorrectionCodeWords + 1 > 929) {
- e = BCExceptionEncodedMessageContainsTooManyCodeWords;
- return;
- }
+ if (sourceCodeWords + errorCorrectionCodeWords + 1 > 929)
+ return false;
+
int32_t n = sourceCodeWords + pad + 1;
CFX_WideString sb;
sb += (wchar_t)n;
sb += highLevel;
- for (int32_t i = 0; i < pad; i++) {
+ for (int32_t i = 0; i < pad; i++)
sb += (wchar_t)900;
- }
+
CFX_WideString dataCodewords(sb);
- CFX_WideString ec = CBC_PDF417ErrorCorrection::generateErrorCorrection(
- dataCodewords, errorCorrectionLevel, e);
- if (e != BCExceptionNO)
- return;
+ CFX_WideString ec;
+ if (!CBC_PDF417ErrorCorrection::generateErrorCorrection(
+ dataCodewords, errorCorrectionLevel, &ec)) {
+ return false;
+ }
CFX_WideString fullCodewords = dataCodewords + ec;
m_barcodeMatrix = pdfium::MakeUnique<CBC_BarcodeMatrix>(rows, cols);
encodeLowLevel(fullCodewords, cols, rows, errorCorrectionLevel,
m_barcodeMatrix.get());
+ return true;
}
void CBC_PDF417::setDimensions(int32_t maxCols,
@@ -536,49 +537,41 @@ void CBC_PDF417::encodeLowLevel(CFX_WideString fullCodewords,
}
}
-std::vector<int32_t>* CBC_PDF417::determineDimensions(
+std::vector<int32_t> CBC_PDF417::determineDimensions(
int32_t sourceCodeWords,
- int32_t errorCorrectionCodeWords,
- int32_t& e) {
+ int32_t errorCorrectionCodeWords) const {
+ std::vector<int32_t> dimensions;
float ratio = 0.0f;
- std::vector<int32_t>* dimension = nullptr;
for (int32_t cols = m_minCols; cols <= m_maxCols; cols++) {
int32_t rows =
calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, cols);
- if (rows < m_minRows) {
+ if (rows < m_minRows)
break;
- }
- if (rows > m_maxRows) {
+ if (rows > m_maxRows)
continue;
- }
float newRatio =
((17 * cols + 69) * DEFAULT_MODULE_WIDTH) / (rows * HEIGHT);
- if (dimension &&
+ if (!dimensions.empty() &&
fabsf(newRatio - PREFERRED_RATIO) > fabsf(ratio - PREFERRED_RATIO)) {
continue;
}
ratio = newRatio;
- delete dimension;
- dimension = new std::vector<int32_t>;
- dimension->push_back(cols);
- dimension->push_back(rows);
+ dimensions.resize(2);
+ dimensions[0] = cols;
+ dimensions[1] = rows;
}
- if (!dimension) {
+ if (dimensions.empty()) {
int32_t rows = calculateNumberOfRows(sourceCodeWords,
errorCorrectionCodeWords, m_minCols);
if (rows < m_minRows) {
- dimension = new std::vector<int32_t>;
- dimension->push_back(m_minCols);
- dimension->push_back(m_minRows);
+ dimensions.resize(2);
+ dimensions[0] = m_minCols;
+ dimensions[1] = m_minRows;
} else if (rows >= 3 && rows <= 90) {
- dimension = new std::vector<int32_t>;
- dimension->push_back(m_minCols);
- dimension->push_back(rows);
+ dimensions.resize(2);
+ dimensions[0] = m_minCols;
+ dimensions[1] = rows;
}
}
- if (!dimension) {
- e = BCExceptionUnableToFitMessageInColumns;
- return nullptr;
- }
- return dimension;
+ return dimensions;
}
diff --git a/fxbarcode/pdf417/BC_PDF417.h b/fxbarcode/pdf417/BC_PDF417.h
index bc36ea5037..f5ca2de60f 100644
--- a/fxbarcode/pdf417/BC_PDF417.h
+++ b/fxbarcode/pdf417/BC_PDF417.h
@@ -23,9 +23,7 @@ class CBC_PDF417 {
virtual ~CBC_PDF417();
CBC_BarcodeMatrix* getBarcodeMatrix();
- void generateBarcodeLogic(CFX_WideString msg,
- int32_t errorCorrectionLevel,
- int32_t& e);
+ bool generateBarcodeLogic(CFX_WideString msg, int32_t errorCorrectionLevel);
void setDimensions(int32_t maxCols,
int32_t minCols,
int32_t maxRows,
@@ -52,9 +50,9 @@ class CBC_PDF417 {
int32_t r,
int32_t errorCorrectionLevel,
CBC_BarcodeMatrix* logic);
- std::vector<int32_t>* determineDimensions(int32_t sourceCodeWords,
- int32_t errorCorrectionCodeWords,
- int32_t& e);
+ std::vector<int32_t> determineDimensions(
+ int32_t sourceCodeWords,
+ int32_t errorCorrectionCodeWords) const;
std::unique_ptr<CBC_BarcodeMatrix> m_barcodeMatrix;
bool m_compact;
diff --git a/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp b/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp
index abdd113911..6f1d7946eb 100644
--- a/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp
+++ b/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp
@@ -21,7 +21,8 @@
*/
#include "fxbarcode/pdf417/BC_PDF417ErrorCorrection.h"
-#include "fxbarcode/utils.h"
+
+#include <vector>
namespace {
@@ -124,47 +125,24 @@ const uint16_t* const EC_COEFFICIENTS[9] = {
CBC_PDF417ErrorCorrection::CBC_PDF417ErrorCorrection() {}
CBC_PDF417ErrorCorrection::~CBC_PDF417ErrorCorrection() {}
int32_t CBC_PDF417ErrorCorrection::getErrorCorrectionCodewordCount(
- int32_t errorCorrectionLevel,
- int32_t& e) {
- if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8) {
- e = BCExceptionErrorCorrectionLevelMustBeBetween0And8;
+ int32_t errorCorrectionLevel) {
+ if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8)
return -1;
- }
return 1 << (errorCorrectionLevel + 1);
}
-int32_t CBC_PDF417ErrorCorrection::getRecommendedMinimumErrorCorrectionLevel(
- int32_t n,
- int32_t& e) {
- if (n <= 0) {
- e = BCExceptionIllegalArgumentnMustBeAbove0;
- return -1;
- }
- if (n <= 40) {
- return 2;
- }
- if (n <= 160) {
- return 3;
- }
- if (n <= 320) {
- return 4;
- }
- if (n <= 863) {
- return 5;
- }
- e = BCExceptionNoRecommendationPossible;
- return -1;
-}
-
-CFX_WideString CBC_PDF417ErrorCorrection::generateErrorCorrection(
- CFX_WideString dataCodewords,
+bool CBC_PDF417ErrorCorrection::generateErrorCorrection(
+ const CFX_WideString& dataCodewords,
int32_t errorCorrectionLevel,
- int32_t& e) {
- int32_t k = getErrorCorrectionCodewordCount(errorCorrectionLevel, e);
- if (e != BCExceptionNO)
- return L" ";
- wchar_t* ech = FX_Alloc(wchar_t, k);
- memset(ech, 0, k * sizeof(wchar_t));
+ CFX_WideString* result) {
+ assert(result);
+ assert(result->IsEmpty());
+
+ int32_t k = getErrorCorrectionCodewordCount(errorCorrectionLevel);
+ if (k < 0)
+ return false;
+
+ std::vector<wchar_t> ech(k);
int32_t sld = dataCodewords.GetLength();
for (int32_t i = 0; i < sld; i++) {
int32_t t1 = (dataCodewords.GetAt(i) + ech[k - 1]) % 929;
@@ -179,13 +157,11 @@ CFX_WideString CBC_PDF417ErrorCorrection::generateErrorCorrection(
t3 = 929 - t2;
ech[0] = (wchar_t)(t3 % 929);
}
- CFX_WideString sb;
+ result->Reserve(k);
for (int32_t j = k - 1; j >= 0; j--) {
- if (ech[j] != 0) {
- ech[j] = (wchar_t)(929 - ech[j]);
- }
- sb += (wchar_t)ech[j];
+ if (ech[j] != 0)
+ ech[j] = static_cast<wchar_t>(929) - ech[j];
+ *result += ech[j];
}
- FX_Free(ech);
- return sb;
+ return true;
}
diff --git a/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h b/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h
index d1c6eed1b3..3a84ef5845 100644
--- a/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h
+++ b/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h
@@ -16,13 +16,10 @@ class CBC_PDF417ErrorCorrection {
CBC_PDF417ErrorCorrection();
virtual ~CBC_PDF417ErrorCorrection();
- static int32_t getErrorCorrectionCodewordCount(int32_t errorCorrectionLevel,
- int32_t& e);
- static int32_t getRecommendedMinimumErrorCorrectionLevel(int32_t n,
- int32_t& e);
- static CFX_WideString generateErrorCorrection(CFX_WideString dataCodewords,
- int32_t errorCorrectionLevel,
- int32_t& e);
+ static int32_t getErrorCorrectionCodewordCount(int32_t errorCorrectionLevel);
+ static bool generateErrorCorrection(const CFX_WideString& dataCodewords,
+ int32_t errorCorrectionLevel,
+ CFX_WideString* result);
};
#endif // FXBARCODE_PDF417_BC_PDF417ERRORCORRECTION_H_
diff --git a/fxbarcode/pdf417/BC_PDF417Writer.cpp b/fxbarcode/pdf417/BC_PDF417Writer.cpp
index 6f06321e82..2f6fc9e1b0 100644
--- a/fxbarcode/pdf417/BC_PDF417Writer.cpp
+++ b/fxbarcode/pdf417/BC_PDF417Writer.cpp
@@ -60,9 +60,7 @@ uint8_t* CBC_PDF417Writer::Encode(const CFX_WideString& contents,
encoder.setDimensions(col, col, 90, 3);
else if (row >= 3 && row <= 90)
encoder.setDimensions(30, 1, row, row);
- int32_t e = BCExceptionNO;
- encoder.generateBarcodeLogic(contents, m_iCorrectLevel, e);
- if (e != BCExceptionNO)
+ if (!encoder.generateBarcodeLogic(contents, m_iCorrectLevel))
return nullptr;
int32_t lineThickness = 2;