• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The PDFium Authors
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 <optional>
11 
12 #include "core/fxcrt/span.h"
13 #include "core/fxcrt/widestring.h"
14 #include "fxbarcode/pdf417/BC_PDF417.h"
15 
16 class CBC_PDF417HighLevelEncoder {
17  public:
18   CBC_PDF417HighLevelEncoder() = delete;
19   ~CBC_PDF417HighLevelEncoder() = delete;
20 
21   static std::optional<WideString> EncodeHighLevel(WideStringView msg);
22 
23  private:
24   enum class EncodingMode { kUnknown = 0, kText, kByte, kNumeric };
25 
26   enum class SubMode { kAlpha = 0, kLower, kMixed, kPunctuation };
27 
28   static SubMode EncodeText(const WideString& msg,
29                             size_t startpos,
30                             size_t count,
31                             SubMode initialSubmode,
32                             WideString* sb);
33   static void EncodeBinary(pdfium::span<const uint8_t> bytes,
34                            size_t startpos,
35                            size_t count,
36                            EncodingMode startmode,
37                            WideString* sb);
38   static void EncodeNumeric(const WideString& msg,
39                             size_t startpos,
40                             size_t count,
41                             WideString* sb);
42   static size_t DetermineConsecutiveDigitCount(WideString msg, size_t startpos);
43   static size_t DetermineConsecutiveTextCount(WideString msg, size_t startpos);
44   static std::optional<size_t> DetermineConsecutiveBinaryCount(
45       WideString msg,
46       pdfium::span<const uint8_t> bytes,
47       size_t startpos);
48 
49   friend class PDF417HighLevelEncoderTest_ConsecutiveBinaryCount_Test;
50   friend class PDF417HighLevelEncoderTest_ConsecutiveDigitCount_Test;
51   friend class PDF417HighLevelEncoderTest_ConsecutiveTextCount_Test;
52   friend class PDF417HighLevelEncoderTest_EncodeBinary_Test;
53   friend class PDF417HighLevelEncoderTest_EncodeHighLevel_Test;
54   friend class PDF417HighLevelEncoderTest_EncodeNumeric_Test;
55   friend class PDF417HighLevelEncoderTest_EncodeText_Test;
56 };
57 
58 #endif  // FXBARCODE_PDF417_BC_PDF417HIGHLEVELENCODER_H_
59