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