8
9
10
11
12
13
14
15
16
17
18
19
20
21
23#include "fxbarcode/oned/BC_OnedCodaBarWriter.h"
28#include "core/fxcrt/containers/contains.h"
29#include "core/fxcrt/fx_2d_size.h"
30#include "core/fxcrt/fx_extension.h"
31#include "core/fxcrt/stl_util.h"
32#include "fxbarcode/BC_Writer.h"
33#include "fxbarcode/oned/BC_OneDimWriter.h"
37constexpr auto kOnedCodaAlphabet =
fxcrt::ToArray<
const char>(
38 {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'-',
39 '$',
':',
'/',
'.',
'+',
'A',
'B',
'C',
'D',
'T',
'N'});
40static_assert(
std::size(kOnedCodaAlphabet) == 22,
"Wrong size");
42constexpr auto kOnedCodaCharacterEncoding =
fxcrt::ToArray<
const int8_t>(
43 {0x03, 0x06, 0x09, 0x60, 0x12, 0x42, 0x21, 0x24, 0x30, 0x48, 0x0c,
44 0x18, 0x45, 0x51, 0x54, 0x15, 0x1A, 0x29, 0x0B, 0x0E, 0x1A, 0x29});
45static_assert(
std::size(kOnedCodaCharacterEncoding) == 22,
"Wrong size");
47const char kStartEndChars[] = {
'A',
'B',
'C',
'D',
'T',
'N',
'*',
'E',
48 'a',
'b',
'c',
'd',
't',
'n',
'e'};
49const char kContentChars[] = {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
50 '8',
'9',
'-',
'$',
'/',
':',
'+',
'.'};
52bool IsValidChar(
wchar_t ch,
bool isContent) {
56 char narrow_ch =
static_cast<
char>(ch);
57 return pdfium::Contains(kContentChars, narrow_ch) ||
58 (isContent &&
pdfium::Contains(kStartEndChars, narrow_ch));
68 if (!
pdfium::Contains(kStartEndChars, start))
76 if (!
pdfium::Contains(kStartEndChars, end))
92 if (ratio < 2 || ratio > 3)
95 m_iWideNarrRatio = ratio;
101 std::all_of(contents.begin(), contents.end(),
102 [](
const wchar_t& ch) {
return IsValidChar(ch,
false); });
107 filtercontents.Reserve(contents.GetLength());
109 for (size_t index = 0; index < contents.GetLength(); index++) {
110 ch = contents[index];
115 if (!IsValidChar(ch,
true))
117 filtercontents
+= ch;
119 return filtercontents;
124 m_iContentLen = data.GetLength();
125 DataVector<uint8_t> result(
126 Fx2DSizeOrDie(m_iWideNarrRatio * 7, data.GetLength()));
128 int32_t position = 0;
129 for (size_t index = 0; index < data.GetLength(); index++) {
130 ch = FXSYS_ToUpperASCII(data[index]);
148 for (size_t i = 0; i <
std::size(kOnedCodaAlphabet); i++) {
149 if (ch == kOnedCodaAlphabet[i]) {
150 code = kOnedCodaCharacterEncoding[i];
158 result[position] = color;
160 if (((code >> (6 - bit)) & 1) == 0 || counter == m_iWideNarrRatio - 1) {
168 if (index < data.GetLength() - 1) {
169 result[position] = 0;
173 result.resize(position);
180 return strStart + contents + strEnd;
184 pdfium::span<
const uint8_t> code) {
185 return CBC_OneDimWriter::RenderResult(
186 encodedContents(contents).AsStringView(), code);
fxcrt::ByteString ByteString
static bool HasValidContentSize(WideStringView contents)
bool SetEndChar(char end) override
WideString encodedContents(WideStringView contents)
void SetTextLocation(BC_TEXT_LOC location) override
void SetDataLength(int32_t length) override
bool SetWideNarrowRatio(int8_t ratio) override
bool RenderResult(WideStringView contents, pdfium::span< const uint8_t > code) override
DataVector< uint8_t > Encode(const ByteString &contents) override
bool CheckContentValidity(WideStringView contents) override
bool SetStartChar(char start) override
~CBC_OnedCodaBarWriter() override
WideString FilterContents(WideStringView contents) override
WideString & operator+=(wchar_t ch)
ByteString operator+(const ByteString &str1, char ch)
ByteString operator+(char ch, const ByteString &str2)
fxcrt::WideStringView WideStringView
fxcrt::WideString WideString