1d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
2d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
3d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// found in the LICENSE file.
4d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
5d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Original code is licensed as follows:
7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann/*
8d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Copyright 2010 ZXing authors
9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *
10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Licensed under the Apache License, Version 2.0 (the "License");
11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * you may not use this file except in compliance with the License.
12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * You may obtain a copy of the License at
13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *
14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *      http://www.apache.org/licenses/LICENSE-2.0
15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *
16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * Unless required by applicable law or agreed to in writing, software
17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * distributed under the License is distributed on an "AS IS" BASIS,
18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * See the License for the specific language governing permissions and
20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann * limitations under the License.
21d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann */
22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxbarcode/oned/BC_OnedCode39Writer.h"
24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <memory>
26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxbarcode/BC_Writer.h"
28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxbarcode/common/BC_CommonBitMatrix.h"
29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxbarcode/oned/BC_OneDimWriter.h"
30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannnamespace {
32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconst char kOnedCode39Alphabet[] = {
34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
36d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    'U', 'V', 'W', 'X', 'Y', 'Z', '-', '.', ' ', '*', '$', '/', '+', '%'};
37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconstexpr size_t kOnedCode39AlphabetLen = FX_ArraySize(kOnedCode39Alphabet);
38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
39d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconst char kOnedCode39Checksum[] = {
40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    'U', 'V', 'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%'};
43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstatic_assert(FX_ArraySize(kOnedCode39Checksum) == 43, "Wrong size");
44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconst int16_t kOnedCode39CharacterEncoding[] = {
46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    0x0034, 0x0121, 0x0061, 0x0160, 0x0031, 0x0130, 0x0070, 0x0025, 0x0124,
47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    0x0064, 0x0109, 0x0049, 0x0148, 0x0019, 0x0118, 0x0058, 0x000D, 0x010C,
48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    0x004C, 0x001C, 0x0103, 0x0043, 0x0142, 0x0013, 0x0112, 0x0052, 0x0007,
49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    0x0106, 0x0046, 0x0016, 0x0181, 0x00C1, 0x01C0, 0x0091, 0x0190, 0x00D0,
50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    0x0085, 0x0184, 0x00C4, 0x0094, 0x00A8, 0x00A2, 0x008A, 0x002A};
51d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstatic_assert(FX_ArraySize(kOnedCode39CharacterEncoding) == 44, "Wrong size");
52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}  // namespace
54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCBC_OnedCode39Writer::CBC_OnedCode39Writer() : m_iWideNarrRatio(3) {}
56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCBC_OnedCode39Writer::~CBC_OnedCode39Writer() {}
58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CBC_OnedCode39Writer::CheckContentValidity(
60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const WideStringView& contents) {
61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (size_t i = 0; i < contents.GetLength(); i++) {
62d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wchar_t ch = contents[i];
63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if ((ch >= L'0' && ch <= L'9') || (ch >= L'A' && ch <= L'Z') ||
64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        ch == L'-' || ch == L'.' || ch == L' ' || ch == L'*' || ch == L'$' ||
65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        ch == L'/' || ch == L'+' || ch == L'%') {
66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CBC_OnedCode39Writer::FilterContents(
74d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const WideStringView& contents) {
75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString filtercontents;
76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (size_t i = 0; i < contents.GetLength(); i++) {
77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wchar_t ch = contents[i];
78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (ch == L'*' && (i == 0 || i == contents.GetLength() - 1)) {
79d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (ch > 175) {
82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      i++;
83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
84d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ch = Upper(ch);
86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if ((ch >= L'0' && ch <= L'9') || (ch >= L'A' && ch <= L'Z') ||
87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        ch == L'-' || ch == L'.' || ch == L' ' || ch == L'*' || ch == L'$' ||
88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        ch == L'/' || ch == L'+' || ch == L'%') {
89d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      filtercontents += ch;
90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return filtercontents;
93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
94d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CBC_OnedCode39Writer::RenderTextContents(
96d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const WideStringView& contents) {
97d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString renderContents;
98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (size_t i = 0; i < contents.GetLength(); i++) {
99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wchar_t ch = contents[i];
100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (ch == L'*' && (i == 0 || i == contents.GetLength() - 1)) {
101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
103d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (ch > 175) {
104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      i++;
105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if ((ch >= L'0' && ch <= L'9') || (ch >= L'A' && ch <= L'Z') ||
108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        (ch >= L'a' && ch <= L'z') || ch == L'-' || ch == L'.' || ch == L' ' ||
109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        ch == L'*' || ch == L'$' || ch == L'/' || ch == L'+' || ch == L'%') {
110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      renderContents += ch;
111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return renderContents;
114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CBC_OnedCode39Writer::SetTextLocation(BC_TEXT_LOC location) {
117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) {
118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_locTextLoc = location;
121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CBC_OnedCode39Writer::SetWideNarrowRatio(int8_t ratio) {
124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (ratio < 2 || ratio > 3)
125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_iWideNarrRatio = ratio;
128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannuint8_t* CBC_OnedCode39Writer::EncodeWithHint(const ByteString& contents,
132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              BCFORMAT format,
133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              int32_t& outWidth,
134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              int32_t& outHeight,
135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              int32_t hints) {
136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (format != BCFORMAT_CODE_39)
137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
138d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return CBC_OneDimWriter::EncodeWithHint(contents, format, outWidth, outHeight,
139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          hints);
140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CBC_OnedCode39Writer::ToIntArray(int16_t a, int8_t* toReturn) {
143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (int32_t i = 0; i < 9; i++) {
144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    toReturn[i] = (a & (1 << i)) == 0 ? 1 : m_iWideNarrRatio;
145d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
147d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannchar CBC_OnedCode39Writer::CalcCheckSum(const ByteString& contents) {
149d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (contents.GetLength() > 80)
150d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return '*';
151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t checksum = 0;
153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (const auto& c : contents) {
154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    size_t j = 0;
155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (; j < kOnedCode39AlphabetLen; j++) {
156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (kOnedCode39Alphabet[j] == c) {
157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (c != '*')
158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          checksum += j;
159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        break;
160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
162d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (j >= kOnedCode39AlphabetLen)
163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return '*';
164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return kOnedCode39Checksum[checksum % FX_ArraySize(kOnedCode39Checksum)];
166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannuint8_t* CBC_OnedCode39Writer::EncodeImpl(const ByteString& contents,
169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          int32_t& outlength) {
170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  char checksum = CalcCheckSum(contents);
171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (checksum == '*')
172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int8_t widths[9] = {0};
175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t wideStrideNum = 3;
176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t narrStrideNum = 9 - wideStrideNum;
177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ByteString encodedContents = contents;
178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_bCalcChecksum)
179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    encodedContents += checksum;
180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_iContentLen = encodedContents.GetLength();
181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t codeWidth = (wideStrideNum * m_iWideNarrRatio + narrStrideNum) * 2 +
182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                      1 + m_iContentLen;
183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (size_t j = 0; j < m_iContentLen; j++) {
184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (size_t i = 0; i < kOnedCode39AlphabetLen; i++) {
185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (kOnedCode39Alphabet[i] != encodedContents[j])
186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        continue;
187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
188d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      ToIntArray(kOnedCode39CharacterEncoding[i], widths);
189d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      for (size_t k = 0; k < 9; k++)
190d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        codeWidth += widths[k];
191d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
192d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
193d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  outlength = codeWidth;
194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::unique_ptr<uint8_t, FxFreeDeleter> result(FX_Alloc(uint8_t, codeWidth));
195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ToIntArray(kOnedCode39CharacterEncoding[39], widths);
196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t e = BCExceptionNO;
197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t pos = AppendPattern(result.get(), 0, widths, 9, 1, e);
198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (e != BCExceptionNO)
199d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int8_t narrowWhite[] = {1};
202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pos += AppendPattern(result.get(), pos, narrowWhite, 1, 0, e);
203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (e != BCExceptionNO)
204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (int32_t l = m_iContentLen - 1; l >= 0; l--) {
207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (size_t i = 0; i < kOnedCode39AlphabetLen; i++) {
208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (kOnedCode39Alphabet[i] != encodedContents[l])
209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        continue;
210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      ToIntArray(kOnedCode39CharacterEncoding[i], widths);
212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pos += AppendPattern(result.get(), pos, widths, 9, 1, e);
213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (e != BCExceptionNO)
214d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return nullptr;
215d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
216d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pos += AppendPattern(result.get(), pos, narrowWhite, 1, 0, e);
217d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (e != BCExceptionNO)
218d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return nullptr;
219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ToIntArray(kOnedCode39CharacterEncoding[39], widths);
221d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pos += AppendPattern(result.get(), pos, widths, 9, 1, e);
222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (e != BCExceptionNO)
223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto* result_ptr = result.get();
226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (int32_t i = 0; i < codeWidth / 2; i++) {
227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    result_ptr[i] ^= result_ptr[codeWidth - 1 - i];
228d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    result_ptr[codeWidth - 1 - i] ^= result_ptr[i];
229d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    result_ptr[i] ^= result_ptr[codeWidth - 1 - i];
230d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
231d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return result.release();
232d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
233d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
234d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CBC_OnedCode39Writer::encodedContents(const WideStringView& contents,
235d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                           WideString* result) {
236d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  *result = WideString(contents);
237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_bCalcChecksum && m_bPrintChecksum) {
238d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString checksumContent = FilterContents(contents);
239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ByteString str = checksumContent.UTF8Encode();
240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    char checksum;
241d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    checksum = CalcCheckSum(str);
242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (checksum == '*')
243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return false;
244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    str += checksum;
245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    *result += checksum;
246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
247d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
248d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
249d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CBC_OnedCode39Writer::RenderResult(const WideStringView& contents,
251d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                        uint8_t* code,
252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                        int32_t codeLength) {
253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString encodedCon;
254d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!encodedContents(contents, &encodedCon))
255d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return CBC_OneDimWriter::RenderResult(encodedCon.AsStringView(), code,
257d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                        codeLength);
258d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
259