1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors 2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file. 4*3ac0a46fSAndroid Build Coastguard Worker 5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6*3ac0a46fSAndroid Build Coastguard Worker // Original code is licensed as follows: 7*3ac0a46fSAndroid Build Coastguard Worker /* 8*3ac0a46fSAndroid Build Coastguard Worker * Copyright 2006-2007 Jeremias Maerki. 9*3ac0a46fSAndroid Build Coastguard Worker * 10*3ac0a46fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 11*3ac0a46fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 12*3ac0a46fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 13*3ac0a46fSAndroid Build Coastguard Worker * 14*3ac0a46fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 15*3ac0a46fSAndroid Build Coastguard Worker * 16*3ac0a46fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 17*3ac0a46fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 18*3ac0a46fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19*3ac0a46fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 20*3ac0a46fSAndroid Build Coastguard Worker * limitations under the License. 21*3ac0a46fSAndroid Build Coastguard Worker */ 22*3ac0a46fSAndroid Build Coastguard Worker 23*3ac0a46fSAndroid Build Coastguard Worker #include "fxbarcode/datamatrix/BC_EncoderContext.h" 24*3ac0a46fSAndroid Build Coastguard Worker 25*3ac0a46fSAndroid Build Coastguard Worker #include <utility> 26*3ac0a46fSAndroid Build Coastguard Worker 27*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_string.h" 28*3ac0a46fSAndroid Build Coastguard Worker #include "fxbarcode/common/BC_CommonBitMatrix.h" 29*3ac0a46fSAndroid Build Coastguard Worker #include "fxbarcode/datamatrix/BC_Encoder.h" 30*3ac0a46fSAndroid Build Coastguard Worker #include "fxbarcode/datamatrix/BC_SymbolInfo.h" 31*3ac0a46fSAndroid Build Coastguard Worker CBC_EncoderContext(const WideString & msg)32*3ac0a46fSAndroid Build Coastguard WorkerCBC_EncoderContext::CBC_EncoderContext(const WideString& msg) { 33*3ac0a46fSAndroid Build Coastguard Worker ByteString dststr = msg.ToUTF8(); 34*3ac0a46fSAndroid Build Coastguard Worker size_t c = dststr.GetLength(); 35*3ac0a46fSAndroid Build Coastguard Worker WideString sb; 36*3ac0a46fSAndroid Build Coastguard Worker sb.Reserve(c); 37*3ac0a46fSAndroid Build Coastguard Worker for (size_t i = 0; i < c; i++) { 38*3ac0a46fSAndroid Build Coastguard Worker wchar_t ch = static_cast<wchar_t>(dststr[i] & 0xff); 39*3ac0a46fSAndroid Build Coastguard Worker if (ch == '?' && dststr[i] != '?') { 40*3ac0a46fSAndroid Build Coastguard Worker m_bHasCharactersOutsideISO88591Encoding = true; 41*3ac0a46fSAndroid Build Coastguard Worker } 42*3ac0a46fSAndroid Build Coastguard Worker sb += ch; 43*3ac0a46fSAndroid Build Coastguard Worker } 44*3ac0a46fSAndroid Build Coastguard Worker m_msg = std::move(sb); 45*3ac0a46fSAndroid Build Coastguard Worker m_codewords.Reserve(m_msg.GetLength()); 46*3ac0a46fSAndroid Build Coastguard Worker } 47*3ac0a46fSAndroid Build Coastguard Worker 48*3ac0a46fSAndroid Build Coastguard Worker CBC_EncoderContext::~CBC_EncoderContext() = default; 49*3ac0a46fSAndroid Build Coastguard Worker setSkipAtEnd(int32_t count)50*3ac0a46fSAndroid Build Coastguard Workervoid CBC_EncoderContext::setSkipAtEnd(int32_t count) { 51*3ac0a46fSAndroid Build Coastguard Worker m_skipAtEnd = count; 52*3ac0a46fSAndroid Build Coastguard Worker } getCurrentChar()53*3ac0a46fSAndroid Build Coastguard Workerwchar_t CBC_EncoderContext::getCurrentChar() { 54*3ac0a46fSAndroid Build Coastguard Worker return m_msg[m_pos]; 55*3ac0a46fSAndroid Build Coastguard Worker } getCurrent()56*3ac0a46fSAndroid Build Coastguard Workerwchar_t CBC_EncoderContext::getCurrent() { 57*3ac0a46fSAndroid Build Coastguard Worker return m_msg[m_pos]; 58*3ac0a46fSAndroid Build Coastguard Worker } 59*3ac0a46fSAndroid Build Coastguard Worker writeCodewords(const WideString & codewords)60*3ac0a46fSAndroid Build Coastguard Workervoid CBC_EncoderContext::writeCodewords(const WideString& codewords) { 61*3ac0a46fSAndroid Build Coastguard Worker m_codewords += codewords; 62*3ac0a46fSAndroid Build Coastguard Worker } 63*3ac0a46fSAndroid Build Coastguard Worker writeCodeword(wchar_t codeword)64*3ac0a46fSAndroid Build Coastguard Workervoid CBC_EncoderContext::writeCodeword(wchar_t codeword) { 65*3ac0a46fSAndroid Build Coastguard Worker m_codewords += codeword; 66*3ac0a46fSAndroid Build Coastguard Worker } 67*3ac0a46fSAndroid Build Coastguard Worker getCodewordCount()68*3ac0a46fSAndroid Build Coastguard Workersize_t CBC_EncoderContext::getCodewordCount() { 69*3ac0a46fSAndroid Build Coastguard Worker return m_codewords.GetLength(); 70*3ac0a46fSAndroid Build Coastguard Worker } 71*3ac0a46fSAndroid Build Coastguard Worker SignalEncoderChange(CBC_HighLevelEncoder::Encoding encoding)72*3ac0a46fSAndroid Build Coastguard Workervoid CBC_EncoderContext::SignalEncoderChange( 73*3ac0a46fSAndroid Build Coastguard Worker CBC_HighLevelEncoder::Encoding encoding) { 74*3ac0a46fSAndroid Build Coastguard Worker m_newEncoding = encoding; 75*3ac0a46fSAndroid Build Coastguard Worker } 76*3ac0a46fSAndroid Build Coastguard Worker ResetEncoderSignal()77*3ac0a46fSAndroid Build Coastguard Workervoid CBC_EncoderContext::ResetEncoderSignal() { 78*3ac0a46fSAndroid Build Coastguard Worker m_newEncoding = CBC_HighLevelEncoder::Encoding::UNKNOWN; 79*3ac0a46fSAndroid Build Coastguard Worker } 80*3ac0a46fSAndroid Build Coastguard Worker hasMoreCharacters()81*3ac0a46fSAndroid Build Coastguard Workerbool CBC_EncoderContext::hasMoreCharacters() { 82*3ac0a46fSAndroid Build Coastguard Worker return m_pos < getTotalMessageCharCount(); 83*3ac0a46fSAndroid Build Coastguard Worker } 84*3ac0a46fSAndroid Build Coastguard Worker getRemainingCharacters()85*3ac0a46fSAndroid Build Coastguard Workersize_t CBC_EncoderContext::getRemainingCharacters() { 86*3ac0a46fSAndroid Build Coastguard Worker return getTotalMessageCharCount() - m_pos; 87*3ac0a46fSAndroid Build Coastguard Worker } 88*3ac0a46fSAndroid Build Coastguard Worker UpdateSymbolInfo()89*3ac0a46fSAndroid Build Coastguard Workerbool CBC_EncoderContext::UpdateSymbolInfo() { 90*3ac0a46fSAndroid Build Coastguard Worker return UpdateSymbolInfo(getCodewordCount()); 91*3ac0a46fSAndroid Build Coastguard Worker } 92*3ac0a46fSAndroid Build Coastguard Worker UpdateSymbolInfo(size_t len)93*3ac0a46fSAndroid Build Coastguard Workerbool CBC_EncoderContext::UpdateSymbolInfo(size_t len) { 94*3ac0a46fSAndroid Build Coastguard Worker if (!m_symbolInfo || len > m_symbolInfo->data_capacity()) { 95*3ac0a46fSAndroid Build Coastguard Worker m_symbolInfo = CBC_SymbolInfo::Lookup(len, m_bAllowRectangular); 96*3ac0a46fSAndroid Build Coastguard Worker if (!m_symbolInfo) 97*3ac0a46fSAndroid Build Coastguard Worker return false; 98*3ac0a46fSAndroid Build Coastguard Worker } 99*3ac0a46fSAndroid Build Coastguard Worker return true; 100*3ac0a46fSAndroid Build Coastguard Worker } 101*3ac0a46fSAndroid Build Coastguard Worker resetSymbolInfo()102*3ac0a46fSAndroid Build Coastguard Workervoid CBC_EncoderContext::resetSymbolInfo() { 103*3ac0a46fSAndroid Build Coastguard Worker m_bAllowRectangular = true; 104*3ac0a46fSAndroid Build Coastguard Worker } 105*3ac0a46fSAndroid Build Coastguard Worker getTotalMessageCharCount()106*3ac0a46fSAndroid Build Coastguard Workersize_t CBC_EncoderContext::getTotalMessageCharCount() { 107*3ac0a46fSAndroid Build Coastguard Worker return m_msg.GetLength() - m_skipAtEnd; 108*3ac0a46fSAndroid Build Coastguard Worker } 109