1 // Copyright 2014 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #ifndef FXBARCODE_PDF417_BC_PDF417HIGHLEVELENCODER_H_ 8 #define FXBARCODE_PDF417_BC_PDF417HIGHLEVELENCODER_H_ 9 10 #include <vector> 11 12 #include "core/fxcrt/fx_string.h" 13 #include "fxbarcode/pdf417/BC_PDF417.h" 14 #include "third_party/base/optional.h" 15 #include "third_party/base/span.h" 16 17 class CBC_PDF417HighLevelEncoder { 18 public: 19 CBC_PDF417HighLevelEncoder() = delete; 20 ~CBC_PDF417HighLevelEncoder() = delete; 21 22 static Optional<WideString> EncodeHighLevel(WideStringView msg); 23 24 private: 25 enum class EncodingMode { kUnknown = 0, kText, kByte, kNumeric }; 26 27 enum class SubMode { kAlpha = 0, kLower, kMixed, kPunctuation }; 28 29 static SubMode EncodeText(const WideString& msg, 30 size_t startpos, 31 size_t count, 32 SubMode initialSubmode, 33 WideString* sb); 34 static void EncodeBinary(pdfium::span<const uint8_t> bytes, 35 size_t startpos, 36 size_t count, 37 EncodingMode startmode, 38 WideString* sb); 39 static void EncodeNumeric(const WideString& msg, 40 size_t startpos, 41 size_t count, 42 WideString* sb); 43 static size_t DetermineConsecutiveDigitCount(WideString msg, size_t startpos); 44 static size_t DetermineConsecutiveTextCount(WideString msg, size_t startpos); 45 static Optional<size_t> DetermineConsecutiveBinaryCount( 46 WideString msg, 47 std::vector<uint8_t>* bytes, 48 size_t startpos); 49 50 friend class PDF417HighLevelEncoderTest_ConsecutiveBinaryCount_Test; 51 friend class PDF417HighLevelEncoderTest_ConsecutiveDigitCount_Test; 52 friend class PDF417HighLevelEncoderTest_ConsecutiveTextCount_Test; 53 friend class PDF417HighLevelEncoderTest_EncodeBinary_Test; 54 friend class PDF417HighLevelEncoderTest_EncodeHighLevel_Test; 55 friend class PDF417HighLevelEncoderTest_EncodeNumeric_Test; 56 friend class PDF417HighLevelEncoderTest_EncodeText_Test; 57 }; 58 59 #endif // FXBARCODE_PDF417_BC_PDF417HIGHLEVELENCODER_H_ 60