Index: xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp |
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp |
index d2cee6f93f18e3f382d35ddfe9dbf9d57af82812..4025c26bb58a634e87e7d42afaea2d69d671acaa 100644 |
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp |
+++ b/xfa/src/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp |
@@ -1,428 +1,428 @@ |
-// 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 |
-// Original code is licensed as follows: |
-/* |
- * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part |
- * |
- * Licensed under the Apache License, Version 2.0 (the "License"); |
- * you may not use this file except in compliance with the License. |
- * You may obtain a copy of the License at |
- * |
- * http://www.apache.org/licenses/LICENSE-2.0 |
- * |
- * Unless required by applicable law or agreed to in writing, software |
- * distributed under the License is distributed on an "AS IS" BASIS, |
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
- * See the License for the specific language governing permissions and |
- * limitations under the License. |
- */ |
- |
-#include "BC_PDF417HighLevelEncoder.h" |
- |
-#include "xfa/src/fxbarcode/BC_UtilCodingConvert.h" |
-#include "xfa/src/fxbarcode/barcode.h" |
-#include "BC_PDF417Compaction.h" |
-#include "third_party/bigint/BigIntegerLibrary.hh" |
- |
-#define SUBMODE_ALPHA 0 |
-#define SUBMODE_LOWER 1 |
-#define SUBMODE_MIXED 2 |
-int32_t CBC_PDF417HighLevelEncoder::TEXT_COMPACTION = 0; |
-int32_t CBC_PDF417HighLevelEncoder::BYTE_COMPACTION = 1; |
-int32_t CBC_PDF417HighLevelEncoder::NUMERIC_COMPACTION = 2; |
-int32_t CBC_PDF417HighLevelEncoder::SUBMODE_PUNCTUATION = 3; |
-int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_TEXT = 900; |
-int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_BYTE_PADDED = 901; |
-int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_NUMERIC = 902; |
-int32_t CBC_PDF417HighLevelEncoder::SHIFT_TO_BYTE = 913; |
-int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_BYTE = 924; |
-uint8_t CBC_PDF417HighLevelEncoder::TEXT_MIXED_RAW[] = { |
- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 38, 13, 9, 44, 58, |
- 35, 45, 46, 36, 47, 43, 37, 42, 61, 94, 0, 32, 0, 0, 0}; |
-uint8_t CBC_PDF417HighLevelEncoder::TEXT_PUNCTUATION_RAW[] = { |
- 59, 60, 62, 64, 91, 92, 93, 95, 96, 126, 33, 13, 9, 44, 58, |
- 10, 45, 46, 36, 47, 34, 124, 42, 40, 41, 63, 123, 125, 39, 0}; |
-int32_t CBC_PDF417HighLevelEncoder::MIXED[128] = {0}; |
-int32_t CBC_PDF417HighLevelEncoder::PUNCTUATION[128] = {0}; |
-void CBC_PDF417HighLevelEncoder::Initialize() { |
- Inverse(); |
-} |
-void CBC_PDF417HighLevelEncoder::Finalize() {} |
-CFX_WideString CBC_PDF417HighLevelEncoder::encodeHighLevel( |
- CFX_WideString wideMsg, |
- Compaction compaction, |
- int32_t& e) { |
- CFX_ByteString bytes; |
- CBC_UtilCodingConvert::UnicodeToUTF8(wideMsg, bytes); |
- CFX_WideString msg; |
- int32_t len = bytes.GetLength(); |
- for (int32_t i = 0; i < len; i++) { |
- FX_WCHAR ch = (FX_WCHAR)(bytes.GetAt(i) & 0xff); |
- if (ch == '?' && bytes.GetAt(i) != '?') { |
- e = BCExceptionCharactersOutsideISO88591Encoding; |
- return (FX_WCHAR*)""; |
- } |
- msg += ch; |
- } |
- CFX_ByteArray byteArr; |
- for (int32_t k = 0; k < bytes.GetLength(); k++) { |
- byteArr.Add(bytes.GetAt(k)); |
- } |
- CFX_WideString sb; |
- len = msg.GetLength(); |
- int32_t p = 0; |
- int32_t textSubMode = SUBMODE_ALPHA; |
- if (compaction == TEXT) { |
- encodeText(msg, p, len, sb, textSubMode); |
- } else if (compaction == BYTES) { |
- encodeBinary(&byteArr, p, byteArr.GetSize(), BYTE_COMPACTION, sb); |
- } else if (compaction == NUMERIC) { |
- sb += (FX_WCHAR)LATCH_TO_NUMERIC; |
- encodeNumeric(msg, p, len, sb); |
- } else { |
- int32_t encodingMode = LATCH_TO_TEXT; |
- while (p < len) { |
- int32_t n = determineConsecutiveDigitCount(msg, p); |
- if (n >= 13) { |
- sb += (FX_WCHAR)LATCH_TO_NUMERIC; |
- encodingMode = NUMERIC_COMPACTION; |
- textSubMode = SUBMODE_ALPHA; |
- encodeNumeric(msg, p, n, sb); |
- p += n; |
- } else { |
- int32_t t = determineConsecutiveTextCount(msg, p); |
- if (t >= 5 || n == len) { |
- if (encodingMode != TEXT_COMPACTION) { |
- sb += (FX_WCHAR)LATCH_TO_TEXT; |
- encodingMode = TEXT_COMPACTION; |
- textSubMode = SUBMODE_ALPHA; |
- } |
- textSubMode = encodeText(msg, p, t, sb, textSubMode); |
- p += t; |
- } else { |
- int32_t b = determineConsecutiveBinaryCount(msg, &byteArr, p, e); |
- BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR)' '); |
- if (b == 0) { |
- b = 1; |
- } |
- if (b == 1 && encodingMode == TEXT_COMPACTION) { |
- encodeBinary(&byteArr, p, 1, TEXT_COMPACTION, sb); |
- } else { |
- encodeBinary(&byteArr, p, b, encodingMode, sb); |
- encodingMode = BYTE_COMPACTION; |
- textSubMode = SUBMODE_ALPHA; |
- } |
- p += b; |
- } |
- } |
- } |
- } |
- return sb; |
-} |
-void CBC_PDF417HighLevelEncoder::Inverse() { |
- uint8_t i = 0; |
- int32_t l = 0; |
- for (l = 0; l < sizeof(MIXED) / sizeof(MIXED[0]); l++) { |
- MIXED[l] = -1; |
- } |
- for (i = 0; i < sizeof(TEXT_MIXED_RAW) / sizeof(TEXT_MIXED_RAW[0]); i++) { |
- uint8_t b = TEXT_MIXED_RAW[i]; |
- if (b > 0) { |
- MIXED[b] = i; |
- } |
- } |
- for (l = 0; l < sizeof(PUNCTUATION) / sizeof(PUNCTUATION[0]); l++) { |
- PUNCTUATION[l] = -1; |
- } |
- for (i = 0; |
- i < sizeof(TEXT_PUNCTUATION_RAW) / sizeof(TEXT_PUNCTUATION_RAW[0]); |
- i++) { |
- uint8_t b = TEXT_PUNCTUATION_RAW[i]; |
- if (b > 0) { |
- PUNCTUATION[b] = i; |
- } |
- } |
-} |
-int32_t CBC_PDF417HighLevelEncoder::encodeText(CFX_WideString msg, |
- int32_t startpos, |
- int32_t count, |
- CFX_WideString& sb, |
- int32_t initialSubmode) { |
- CFX_WideString tmp; |
- int32_t submode = initialSubmode; |
- int32_t idx = 0; |
- while (TRUE) { |
- FX_WCHAR ch = msg.GetAt(startpos + idx); |
- switch (submode) { |
- case SUBMODE_ALPHA: |
- if (isAlphaUpper(ch)) { |
- if (ch == ' ') { |
- tmp += (FX_WCHAR)26; |
- } else { |
- tmp += (FX_WCHAR)(ch - 65); |
- } |
- } else { |
- if (isAlphaLower(ch)) { |
- submode = SUBMODE_LOWER; |
- tmp += (FX_WCHAR)27; |
- continue; |
- } else if (isMixed(ch)) { |
- submode = SUBMODE_MIXED; |
- tmp += (FX_WCHAR)28; |
- continue; |
- } else { |
- tmp += (FX_WCHAR)29; |
- tmp += PUNCTUATION[ch]; |
- break; |
- } |
- } |
- break; |
- case SUBMODE_LOWER: |
- if (isAlphaLower(ch)) { |
- if (ch == ' ') { |
- tmp += (FX_WCHAR)26; |
- } else { |
- tmp += (FX_WCHAR)(ch - 97); |
- } |
- } else { |
- if (isAlphaUpper(ch)) { |
- tmp += (FX_WCHAR)27; |
- tmp += (FX_WCHAR)(ch - 65); |
- break; |
- } else if (isMixed(ch)) { |
- submode = SUBMODE_MIXED; |
- tmp += (FX_WCHAR)28; |
- continue; |
- } else { |
- tmp += (FX_WCHAR)29; |
- tmp += PUNCTUATION[ch]; |
- break; |
- } |
- } |
- break; |
- case SUBMODE_MIXED: |
- if (isMixed(ch)) { |
- tmp += MIXED[ch]; |
- } else { |
- if (isAlphaUpper(ch)) { |
- submode = SUBMODE_ALPHA; |
- tmp += (FX_WCHAR)28; |
- continue; |
- } else if (isAlphaLower(ch)) { |
- submode = SUBMODE_LOWER; |
- tmp += (FX_WCHAR)27; |
- continue; |
- } else { |
- if (startpos + idx + 1 < count) { |
- FX_WCHAR next = msg.GetAt(startpos + idx + 1); |
- if (isPunctuation(next)) { |
- submode = SUBMODE_PUNCTUATION; |
- tmp += (FX_WCHAR)25; |
- continue; |
- } |
- } |
- tmp += (FX_WCHAR)29; |
- tmp += PUNCTUATION[ch]; |
- } |
- } |
- break; |
- default: |
- if (isPunctuation(ch)) { |
- tmp += PUNCTUATION[ch]; |
- } else { |
- submode = SUBMODE_ALPHA; |
- tmp += (FX_WCHAR)29; |
- continue; |
- } |
- } |
- idx++; |
- if (idx >= count) { |
- break; |
- } |
- } |
- FX_WCHAR h = 0; |
- int32_t len = tmp.GetLength(); |
- for (int32_t i = 0; i < len; i++) { |
- FX_BOOL odd = (i % 2) != 0; |
- if (odd) { |
- h = (FX_WCHAR)((h * 30) + tmp.GetAt(i)); |
- sb += h; |
- } else { |
- h = tmp.GetAt(i); |
- } |
- } |
- if ((len % 2) != 0) { |
- sb += (FX_WCHAR)((h * 30) + 29); |
- } |
- return submode; |
-} |
-void CBC_PDF417HighLevelEncoder::encodeBinary(CFX_ByteArray* bytes, |
- int32_t startpos, |
- int32_t count, |
- int32_t startmode, |
- CFX_WideString& sb) { |
- if (count == 1 && startmode == TEXT_COMPACTION) { |
- sb += (FX_WCHAR)SHIFT_TO_BYTE; |
- } |
- int32_t idx = startpos; |
- int32_t i = 0; |
- if (count >= 6) { |
- sb += (FX_WCHAR)LATCH_TO_BYTE; |
- FX_WCHAR chars[5]; |
- while ((startpos + count - idx) >= 6) { |
- int64_t t = 0; |
- for (i = 0; i < 6; i++) { |
- t <<= 8; |
- t += bytes->GetAt(idx + i) & 0xff; |
- } |
- for (i = 0; i < 5; i++) { |
- chars[i] = (FX_WCHAR)(t % 900); |
- t /= 900; |
- } |
- for (i = 4; i >= 0; i--) { |
- sb += (chars[i]); |
- } |
- idx += 6; |
- } |
- } |
- if (idx < startpos + count) { |
- sb += (FX_WCHAR)LATCH_TO_BYTE_PADDED; |
- } |
- for (i = idx; i < startpos + count; i++) { |
- int32_t ch = bytes->GetAt(i) & 0xff; |
- sb += (FX_WCHAR)ch; |
- } |
-} |
-void CBC_PDF417HighLevelEncoder::encodeNumeric(CFX_WideString msg, |
- int32_t startpos, |
- int32_t count, |
- CFX_WideString& sb) { |
- int32_t idx = 0; |
- BigInteger num900 = 900; |
- while (idx < count) { |
- CFX_WideString tmp; |
- int32_t len = 44 < count - idx ? 44 : count - idx; |
- CFX_ByteString part = |
- ((FX_WCHAR)'1' + msg.Mid(startpos + idx, len)).UTF8Encode(); |
- BigInteger bigint = stringToBigInteger(part.c_str()); |
- do { |
- int32_t c = (bigint % num900).toInt(); |
- tmp += (FX_WCHAR)(c); |
- bigint = bigint / num900; |
- } while (!bigint.isZero()); |
- for (int32_t i = tmp.GetLength() - 1; i >= 0; i--) { |
- sb += tmp.GetAt(i); |
- } |
- idx += len; |
- } |
-} |
-FX_BOOL CBC_PDF417HighLevelEncoder::isDigit(FX_WCHAR ch) { |
- return ch >= '0' && ch <= '9'; |
-} |
-FX_BOOL CBC_PDF417HighLevelEncoder::isAlphaUpper(FX_WCHAR ch) { |
- return ch == ' ' || (ch >= 'A' && ch <= 'Z'); |
-} |
-FX_BOOL CBC_PDF417HighLevelEncoder::isAlphaLower(FX_WCHAR ch) { |
- return ch == ' ' || (ch >= 'a' && ch <= 'z'); |
-} |
-FX_BOOL CBC_PDF417HighLevelEncoder::isMixed(FX_WCHAR ch) { |
- return MIXED[ch] != -1; |
-} |
-FX_BOOL CBC_PDF417HighLevelEncoder::isPunctuation(FX_WCHAR ch) { |
- return PUNCTUATION[ch] != -1; |
-} |
-FX_BOOL CBC_PDF417HighLevelEncoder::isText(FX_WCHAR ch) { |
- return ch == '\t' || ch == '\n' || ch == '\r' || (ch >= 32 && ch <= 126); |
-} |
-int32_t CBC_PDF417HighLevelEncoder::determineConsecutiveDigitCount( |
- CFX_WideString msg, |
- int32_t startpos) { |
- int32_t count = 0; |
- int32_t len = msg.GetLength(); |
- int32_t idx = startpos; |
- if (idx < len) { |
- FX_WCHAR ch = msg.GetAt(idx); |
- while (isDigit(ch) && idx < len) { |
- count++; |
- idx++; |
- if (idx < len) { |
- ch = msg.GetAt(idx); |
- } |
- } |
- } |
- return count; |
-} |
-int32_t CBC_PDF417HighLevelEncoder::determineConsecutiveTextCount( |
- CFX_WideString msg, |
- int32_t startpos) { |
- int32_t len = msg.GetLength(); |
- int32_t idx = startpos; |
- while (idx < len) { |
- FX_WCHAR ch = msg.GetAt(idx); |
- int32_t numericCount = 0; |
- while (numericCount < 13 && isDigit(ch) && idx < len) { |
- numericCount++; |
- idx++; |
- if (idx < len) { |
- ch = msg.GetAt(idx); |
- } |
- } |
- if (numericCount >= 13) { |
- return idx - startpos - numericCount; |
- } |
- if (numericCount > 0) { |
- continue; |
- } |
- ch = msg.GetAt(idx); |
- if (!isText(ch)) { |
- break; |
- } |
- idx++; |
- } |
- return idx - startpos; |
-} |
-int32_t CBC_PDF417HighLevelEncoder::determineConsecutiveBinaryCount( |
- CFX_WideString msg, |
- CFX_ByteArray* bytes, |
- int32_t startpos, |
- int32_t& e) { |
- int32_t len = msg.GetLength(); |
- int32_t idx = startpos; |
- while (idx < len) { |
- FX_WCHAR ch = msg.GetAt(idx); |
- int32_t numericCount = 0; |
- while (numericCount < 13 && isDigit(ch)) { |
- numericCount++; |
- int32_t i = idx + numericCount; |
- if (i >= len) { |
- break; |
- } |
- ch = msg.GetAt(i); |
- } |
- if (numericCount >= 13) { |
- return idx - startpos; |
- } |
- int32_t textCount = 0; |
- while (textCount < 5 && isText(ch)) { |
- textCount++; |
- int32_t i = idx + textCount; |
- if (i >= len) { |
- break; |
- } |
- ch = msg.GetAt(i); |
- } |
- if (textCount >= 5) { |
- return idx - startpos; |
- } |
- ch = msg.GetAt(idx); |
- if (bytes->GetAt(idx) == 63 && ch != '?') { |
- e = BCExceptionNonEncodableCharacterDetected; |
- return -1; |
- } |
- idx++; |
- } |
- return idx - startpos; |
-} |
+// 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 |
+// Original code is licensed as follows: |
+/* |
+ * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part |
+ * |
+ * Licensed under the Apache License, Version 2.0 (the "License"); |
+ * you may not use this file except in compliance with the License. |
+ * You may obtain a copy of the License at |
+ * |
+ * http://www.apache.org/licenses/LICENSE-2.0 |
+ * |
+ * Unless required by applicable law or agreed to in writing, software |
+ * distributed under the License is distributed on an "AS IS" BASIS, |
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+ * See the License for the specific language governing permissions and |
+ * limitations under the License. |
+ */ |
+ |
+#include "BC_PDF417HighLevelEncoder.h" |
+ |
+#include "xfa/src/fxbarcode/BC_UtilCodingConvert.h" |
+#include "xfa/src/fxbarcode/barcode.h" |
+#include "BC_PDF417Compaction.h" |
+#include "third_party/bigint/BigIntegerLibrary.hh" |
+ |
+#define SUBMODE_ALPHA 0 |
+#define SUBMODE_LOWER 1 |
+#define SUBMODE_MIXED 2 |
+int32_t CBC_PDF417HighLevelEncoder::TEXT_COMPACTION = 0; |
+int32_t CBC_PDF417HighLevelEncoder::BYTE_COMPACTION = 1; |
+int32_t CBC_PDF417HighLevelEncoder::NUMERIC_COMPACTION = 2; |
+int32_t CBC_PDF417HighLevelEncoder::SUBMODE_PUNCTUATION = 3; |
+int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_TEXT = 900; |
+int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_BYTE_PADDED = 901; |
+int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_NUMERIC = 902; |
+int32_t CBC_PDF417HighLevelEncoder::SHIFT_TO_BYTE = 913; |
+int32_t CBC_PDF417HighLevelEncoder::LATCH_TO_BYTE = 924; |
+uint8_t CBC_PDF417HighLevelEncoder::TEXT_MIXED_RAW[] = { |
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 38, 13, 9, 44, 58, |
+ 35, 45, 46, 36, 47, 43, 37, 42, 61, 94, 0, 32, 0, 0, 0}; |
+uint8_t CBC_PDF417HighLevelEncoder::TEXT_PUNCTUATION_RAW[] = { |
+ 59, 60, 62, 64, 91, 92, 93, 95, 96, 126, 33, 13, 9, 44, 58, |
+ 10, 45, 46, 36, 47, 34, 124, 42, 40, 41, 63, 123, 125, 39, 0}; |
+int32_t CBC_PDF417HighLevelEncoder::MIXED[128] = {0}; |
+int32_t CBC_PDF417HighLevelEncoder::PUNCTUATION[128] = {0}; |
+void CBC_PDF417HighLevelEncoder::Initialize() { |
+ Inverse(); |
+} |
+void CBC_PDF417HighLevelEncoder::Finalize() {} |
+CFX_WideString CBC_PDF417HighLevelEncoder::encodeHighLevel( |
+ CFX_WideString wideMsg, |
+ Compaction compaction, |
+ int32_t& e) { |
+ CFX_ByteString bytes; |
+ CBC_UtilCodingConvert::UnicodeToUTF8(wideMsg, bytes); |
+ CFX_WideString msg; |
+ int32_t len = bytes.GetLength(); |
+ for (int32_t i = 0; i < len; i++) { |
+ FX_WCHAR ch = (FX_WCHAR)(bytes.GetAt(i) & 0xff); |
+ if (ch == '?' && bytes.GetAt(i) != '?') { |
+ e = BCExceptionCharactersOutsideISO88591Encoding; |
+ return (FX_WCHAR*)""; |
+ } |
+ msg += ch; |
+ } |
+ CFX_ByteArray byteArr; |
+ for (int32_t k = 0; k < bytes.GetLength(); k++) { |
+ byteArr.Add(bytes.GetAt(k)); |
+ } |
+ CFX_WideString sb; |
+ len = msg.GetLength(); |
+ int32_t p = 0; |
+ int32_t textSubMode = SUBMODE_ALPHA; |
+ if (compaction == TEXT) { |
+ encodeText(msg, p, len, sb, textSubMode); |
+ } else if (compaction == BYTES) { |
+ encodeBinary(&byteArr, p, byteArr.GetSize(), BYTE_COMPACTION, sb); |
+ } else if (compaction == NUMERIC) { |
+ sb += (FX_WCHAR)LATCH_TO_NUMERIC; |
+ encodeNumeric(msg, p, len, sb); |
+ } else { |
+ int32_t encodingMode = LATCH_TO_TEXT; |
+ while (p < len) { |
+ int32_t n = determineConsecutiveDigitCount(msg, p); |
+ if (n >= 13) { |
+ sb += (FX_WCHAR)LATCH_TO_NUMERIC; |
+ encodingMode = NUMERIC_COMPACTION; |
+ textSubMode = SUBMODE_ALPHA; |
+ encodeNumeric(msg, p, n, sb); |
+ p += n; |
+ } else { |
+ int32_t t = determineConsecutiveTextCount(msg, p); |
+ if (t >= 5 || n == len) { |
+ if (encodingMode != TEXT_COMPACTION) { |
+ sb += (FX_WCHAR)LATCH_TO_TEXT; |
+ encodingMode = TEXT_COMPACTION; |
+ textSubMode = SUBMODE_ALPHA; |
+ } |
+ textSubMode = encodeText(msg, p, t, sb, textSubMode); |
+ p += t; |
+ } else { |
+ int32_t b = determineConsecutiveBinaryCount(msg, &byteArr, p, e); |
+ BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR)' '); |
+ if (b == 0) { |
+ b = 1; |
+ } |
+ if (b == 1 && encodingMode == TEXT_COMPACTION) { |
+ encodeBinary(&byteArr, p, 1, TEXT_COMPACTION, sb); |
+ } else { |
+ encodeBinary(&byteArr, p, b, encodingMode, sb); |
+ encodingMode = BYTE_COMPACTION; |
+ textSubMode = SUBMODE_ALPHA; |
+ } |
+ p += b; |
+ } |
+ } |
+ } |
+ } |
+ return sb; |
+} |
+void CBC_PDF417HighLevelEncoder::Inverse() { |
+ uint8_t i = 0; |
+ int32_t l = 0; |
+ for (l = 0; l < sizeof(MIXED) / sizeof(MIXED[0]); l++) { |
+ MIXED[l] = -1; |
+ } |
+ for (i = 0; i < sizeof(TEXT_MIXED_RAW) / sizeof(TEXT_MIXED_RAW[0]); i++) { |
+ uint8_t b = TEXT_MIXED_RAW[i]; |
+ if (b > 0) { |
+ MIXED[b] = i; |
+ } |
+ } |
+ for (l = 0; l < sizeof(PUNCTUATION) / sizeof(PUNCTUATION[0]); l++) { |
+ PUNCTUATION[l] = -1; |
+ } |
+ for (i = 0; |
+ i < sizeof(TEXT_PUNCTUATION_RAW) / sizeof(TEXT_PUNCTUATION_RAW[0]); |
+ i++) { |
+ uint8_t b = TEXT_PUNCTUATION_RAW[i]; |
+ if (b > 0) { |
+ PUNCTUATION[b] = i; |
+ } |
+ } |
+} |
+int32_t CBC_PDF417HighLevelEncoder::encodeText(CFX_WideString msg, |
+ int32_t startpos, |
+ int32_t count, |
+ CFX_WideString& sb, |
+ int32_t initialSubmode) { |
+ CFX_WideString tmp; |
+ int32_t submode = initialSubmode; |
+ int32_t idx = 0; |
+ while (TRUE) { |
+ FX_WCHAR ch = msg.GetAt(startpos + idx); |
+ switch (submode) { |
+ case SUBMODE_ALPHA: |
+ if (isAlphaUpper(ch)) { |
+ if (ch == ' ') { |
+ tmp += (FX_WCHAR)26; |
+ } else { |
+ tmp += (FX_WCHAR)(ch - 65); |
+ } |
+ } else { |
+ if (isAlphaLower(ch)) { |
+ submode = SUBMODE_LOWER; |
+ tmp += (FX_WCHAR)27; |
+ continue; |
+ } else if (isMixed(ch)) { |
+ submode = SUBMODE_MIXED; |
+ tmp += (FX_WCHAR)28; |
+ continue; |
+ } else { |
+ tmp += (FX_WCHAR)29; |
+ tmp += PUNCTUATION[ch]; |
+ break; |
+ } |
+ } |
+ break; |
+ case SUBMODE_LOWER: |
+ if (isAlphaLower(ch)) { |
+ if (ch == ' ') { |
+ tmp += (FX_WCHAR)26; |
+ } else { |
+ tmp += (FX_WCHAR)(ch - 97); |
+ } |
+ } else { |
+ if (isAlphaUpper(ch)) { |
+ tmp += (FX_WCHAR)27; |
+ tmp += (FX_WCHAR)(ch - 65); |
+ break; |
+ } else if (isMixed(ch)) { |
+ submode = SUBMODE_MIXED; |
+ tmp += (FX_WCHAR)28; |
+ continue; |
+ } else { |
+ tmp += (FX_WCHAR)29; |
+ tmp += PUNCTUATION[ch]; |
+ break; |
+ } |
+ } |
+ break; |
+ case SUBMODE_MIXED: |
+ if (isMixed(ch)) { |
+ tmp += MIXED[ch]; |
+ } else { |
+ if (isAlphaUpper(ch)) { |
+ submode = SUBMODE_ALPHA; |
+ tmp += (FX_WCHAR)28; |
+ continue; |
+ } else if (isAlphaLower(ch)) { |
+ submode = SUBMODE_LOWER; |
+ tmp += (FX_WCHAR)27; |
+ continue; |
+ } else { |
+ if (startpos + idx + 1 < count) { |
+ FX_WCHAR next = msg.GetAt(startpos + idx + 1); |
+ if (isPunctuation(next)) { |
+ submode = SUBMODE_PUNCTUATION; |
+ tmp += (FX_WCHAR)25; |
+ continue; |
+ } |
+ } |
+ tmp += (FX_WCHAR)29; |
+ tmp += PUNCTUATION[ch]; |
+ } |
+ } |
+ break; |
+ default: |
+ if (isPunctuation(ch)) { |
+ tmp += PUNCTUATION[ch]; |
+ } else { |
+ submode = SUBMODE_ALPHA; |
+ tmp += (FX_WCHAR)29; |
+ continue; |
+ } |
+ } |
+ idx++; |
+ if (idx >= count) { |
+ break; |
+ } |
+ } |
+ FX_WCHAR h = 0; |
+ int32_t len = tmp.GetLength(); |
+ for (int32_t i = 0; i < len; i++) { |
+ FX_BOOL odd = (i % 2) != 0; |
+ if (odd) { |
+ h = (FX_WCHAR)((h * 30) + tmp.GetAt(i)); |
+ sb += h; |
+ } else { |
+ h = tmp.GetAt(i); |
+ } |
+ } |
+ if ((len % 2) != 0) { |
+ sb += (FX_WCHAR)((h * 30) + 29); |
+ } |
+ return submode; |
+} |
+void CBC_PDF417HighLevelEncoder::encodeBinary(CFX_ByteArray* bytes, |
+ int32_t startpos, |
+ int32_t count, |
+ int32_t startmode, |
+ CFX_WideString& sb) { |
+ if (count == 1 && startmode == TEXT_COMPACTION) { |
+ sb += (FX_WCHAR)SHIFT_TO_BYTE; |
+ } |
+ int32_t idx = startpos; |
+ int32_t i = 0; |
+ if (count >= 6) { |
+ sb += (FX_WCHAR)LATCH_TO_BYTE; |
+ FX_WCHAR chars[5]; |
+ while ((startpos + count - idx) >= 6) { |
+ int64_t t = 0; |
+ for (i = 0; i < 6; i++) { |
+ t <<= 8; |
+ t += bytes->GetAt(idx + i) & 0xff; |
+ } |
+ for (i = 0; i < 5; i++) { |
+ chars[i] = (FX_WCHAR)(t % 900); |
+ t /= 900; |
+ } |
+ for (i = 4; i >= 0; i--) { |
+ sb += (chars[i]); |
+ } |
+ idx += 6; |
+ } |
+ } |
+ if (idx < startpos + count) { |
+ sb += (FX_WCHAR)LATCH_TO_BYTE_PADDED; |
+ } |
+ for (i = idx; i < startpos + count; i++) { |
+ int32_t ch = bytes->GetAt(i) & 0xff; |
+ sb += (FX_WCHAR)ch; |
+ } |
+} |
+void CBC_PDF417HighLevelEncoder::encodeNumeric(CFX_WideString msg, |
+ int32_t startpos, |
+ int32_t count, |
+ CFX_WideString& sb) { |
+ int32_t idx = 0; |
+ BigInteger num900 = 900; |
+ while (idx < count) { |
+ CFX_WideString tmp; |
+ int32_t len = 44 < count - idx ? 44 : count - idx; |
+ CFX_ByteString part = |
+ ((FX_WCHAR)'1' + msg.Mid(startpos + idx, len)).UTF8Encode(); |
+ BigInteger bigint = stringToBigInteger(part.c_str()); |
+ do { |
+ int32_t c = (bigint % num900).toInt(); |
+ tmp += (FX_WCHAR)(c); |
+ bigint = bigint / num900; |
+ } while (!bigint.isZero()); |
+ for (int32_t i = tmp.GetLength() - 1; i >= 0; i--) { |
+ sb += tmp.GetAt(i); |
+ } |
+ idx += len; |
+ } |
+} |
+FX_BOOL CBC_PDF417HighLevelEncoder::isDigit(FX_WCHAR ch) { |
+ return ch >= '0' && ch <= '9'; |
+} |
+FX_BOOL CBC_PDF417HighLevelEncoder::isAlphaUpper(FX_WCHAR ch) { |
+ return ch == ' ' || (ch >= 'A' && ch <= 'Z'); |
+} |
+FX_BOOL CBC_PDF417HighLevelEncoder::isAlphaLower(FX_WCHAR ch) { |
+ return ch == ' ' || (ch >= 'a' && ch <= 'z'); |
+} |
+FX_BOOL CBC_PDF417HighLevelEncoder::isMixed(FX_WCHAR ch) { |
+ return MIXED[ch] != -1; |
+} |
+FX_BOOL CBC_PDF417HighLevelEncoder::isPunctuation(FX_WCHAR ch) { |
+ return PUNCTUATION[ch] != -1; |
+} |
+FX_BOOL CBC_PDF417HighLevelEncoder::isText(FX_WCHAR ch) { |
+ return ch == '\t' || ch == '\n' || ch == '\r' || (ch >= 32 && ch <= 126); |
+} |
+int32_t CBC_PDF417HighLevelEncoder::determineConsecutiveDigitCount( |
+ CFX_WideString msg, |
+ int32_t startpos) { |
+ int32_t count = 0; |
+ int32_t len = msg.GetLength(); |
+ int32_t idx = startpos; |
+ if (idx < len) { |
+ FX_WCHAR ch = msg.GetAt(idx); |
+ while (isDigit(ch) && idx < len) { |
+ count++; |
+ idx++; |
+ if (idx < len) { |
+ ch = msg.GetAt(idx); |
+ } |
+ } |
+ } |
+ return count; |
+} |
+int32_t CBC_PDF417HighLevelEncoder::determineConsecutiveTextCount( |
+ CFX_WideString msg, |
+ int32_t startpos) { |
+ int32_t len = msg.GetLength(); |
+ int32_t idx = startpos; |
+ while (idx < len) { |
+ FX_WCHAR ch = msg.GetAt(idx); |
+ int32_t numericCount = 0; |
+ while (numericCount < 13 && isDigit(ch) && idx < len) { |
+ numericCount++; |
+ idx++; |
+ if (idx < len) { |
+ ch = msg.GetAt(idx); |
+ } |
+ } |
+ if (numericCount >= 13) { |
+ return idx - startpos - numericCount; |
+ } |
+ if (numericCount > 0) { |
+ continue; |
+ } |
+ ch = msg.GetAt(idx); |
+ if (!isText(ch)) { |
+ break; |
+ } |
+ idx++; |
+ } |
+ return idx - startpos; |
+} |
+int32_t CBC_PDF417HighLevelEncoder::determineConsecutiveBinaryCount( |
+ CFX_WideString msg, |
+ CFX_ByteArray* bytes, |
+ int32_t startpos, |
+ int32_t& e) { |
+ int32_t len = msg.GetLength(); |
+ int32_t idx = startpos; |
+ while (idx < len) { |
+ FX_WCHAR ch = msg.GetAt(idx); |
+ int32_t numericCount = 0; |
+ while (numericCount < 13 && isDigit(ch)) { |
+ numericCount++; |
+ int32_t i = idx + numericCount; |
+ if (i >= len) { |
+ break; |
+ } |
+ ch = msg.GetAt(i); |
+ } |
+ if (numericCount >= 13) { |
+ return idx - startpos; |
+ } |
+ int32_t textCount = 0; |
+ while (textCount < 5 && isText(ch)) { |
+ textCount++; |
+ int32_t i = idx + textCount; |
+ if (i >= len) { |
+ break; |
+ } |
+ ch = msg.GetAt(i); |
+ } |
+ if (textCount >= 5) { |
+ return idx - startpos; |
+ } |
+ ch = msg.GetAt(idx); |
+ if (bytes->GetAt(idx) == 63 && ch != '?') { |
+ e = BCExceptionNonEncodableCharacterDetected; |
+ return -1; |
+ } |
+ idx++; |
+ } |
+ return idx - startpos; |
+} |