diff options
Diffstat (limited to 'fxbarcode')
-rw-r--r-- | fxbarcode/common/BC_CommonByteArray.cpp | 101 | ||||
-rw-r--r-- | fxbarcode/common/BC_CommonByteArray.h | 38 | ||||
-rw-r--r-- | fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp | 8 | ||||
-rw-r--r-- | fxbarcode/common/reedsolomon/BC_ReedSolomon.h | 1 | ||||
-rw-r--r-- | fxbarcode/qrcode/BC_QRCoderBlockPair.cpp | 47 | ||||
-rw-r--r-- | fxbarcode/qrcode/BC_QRCoderBlockPair.h | 29 | ||||
-rw-r--r-- | fxbarcode/qrcode/BC_QRCoderEncoder.cpp | 96 |
7 files changed, 55 insertions, 265 deletions
diff --git a/fxbarcode/common/BC_CommonByteArray.cpp b/fxbarcode/common/BC_CommonByteArray.cpp deleted file mode 100644 index bb4fbf8af5..0000000000 --- a/fxbarcode/common/BC_CommonByteArray.cpp +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#include "fxbarcode/common/BC_CommonByteArray.h" - -#include <algorithm> - -#include "core/fxcrt/fx_memory.h" - -CBC_CommonByteArray::CBC_CommonByteArray() { - m_bytes = nullptr; - m_size = 0; - m_index = 0; -} -CBC_CommonByteArray::CBC_CommonByteArray(int32_t size) { - m_size = size; - m_bytes = FX_Alloc(uint8_t, size); - memset(m_bytes, 0, size); - m_index = 0; -} -CBC_CommonByteArray::CBC_CommonByteArray(uint8_t* byteArray, int32_t size) { - m_size = size; - m_bytes = FX_Alloc(uint8_t, size); - memcpy(m_bytes, byteArray, size); - m_index = size; -} -CBC_CommonByteArray::~CBC_CommonByteArray() { - FX_Free(m_bytes); -} -int32_t CBC_CommonByteArray::At(int32_t index) const { - return m_bytes[index] & 0xff; -} -void CBC_CommonByteArray::Set(int32_t index, int32_t value) { - m_bytes[index] = (uint8_t)value; -} -int32_t CBC_CommonByteArray::Size() const { - return m_size; -} -bool CBC_CommonByteArray::IsEmpty() const { - return m_size == 0; -} -void CBC_CommonByteArray::AppendByte(int32_t value) { - if (m_size == 0 || m_index >= m_size) { - int32_t newSize = std::max(32, m_size << 1); - Reserve(newSize); - } - m_bytes[m_index] = (uint8_t)value; - m_index++; -} -void CBC_CommonByteArray::Reserve(int32_t capacity) { - if (!m_bytes || m_size < capacity) { - uint8_t* newArray = FX_Alloc(uint8_t, capacity); - if (m_bytes) { - memcpy(newArray, m_bytes, m_size); - memset(newArray + m_size, 0, capacity - m_size); - } else { - memset(newArray, 0, capacity); - } - FX_Free(m_bytes); - m_bytes = newArray; - m_size = capacity; - } -} -void CBC_CommonByteArray::Set(const uint8_t* source, - int32_t offset, - int32_t count) { - FX_Free(m_bytes); - m_bytes = FX_Alloc(uint8_t, count); - m_size = count; - memcpy(m_bytes, source + offset, count); - m_index = count; -} -void CBC_CommonByteArray::Set(std::vector<uint8_t>* source, - int32_t offset, - int32_t count) { - FX_Free(m_bytes); - m_bytes = FX_Alloc(uint8_t, count); - m_size = count; - int32_t i; - for (i = 0; i < count; i++) - m_bytes[i] = (*source)[i + offset]; - m_index = m_size; -} diff --git a/fxbarcode/common/BC_CommonByteArray.h b/fxbarcode/common/BC_CommonByteArray.h deleted file mode 100644 index 285a567c8e..0000000000 --- a/fxbarcode/common/BC_CommonByteArray.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FXBARCODE_COMMON_BC_COMMONBYTEARRAY_H_ -#define FXBARCODE_COMMON_BC_COMMONBYTEARRAY_H_ - -#include <stdint.h> - -#include <vector> - -// TODO(weili): The usage of this class should be replaced by -// std::vector<uint8_t>. -class CBC_CommonByteArray { - public: - CBC_CommonByteArray(); - explicit CBC_CommonByteArray(int32_t size); - CBC_CommonByteArray(uint8_t* byteArray, int32_t size); - virtual ~CBC_CommonByteArray(); - - int32_t At(int32_t index) const; - int32_t Size() const; - bool IsEmpty() const; - void Set(int32_t index, int32_t value); - void AppendByte(int32_t value); - void Reserve(int32_t capacity); - void Set(const uint8_t* source, int32_t offset, int32_t count); - void Set(std::vector<uint8_t>* source, int32_t offset, int32_t count); - - private: - int32_t m_size; - int32_t m_index; - uint8_t* m_bytes; -}; - -#endif // FXBARCODE_COMMON_BC_COMMONBYTEARRAY_H_ diff --git a/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp b/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp index 2be74c7fa3..8ce4ebf97d 100644 --- a/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp +++ b/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp @@ -30,15 +30,13 @@ #include "third_party/base/ptr_util.h" CBC_ReedSolomonEncoder::CBC_ReedSolomonEncoder(CBC_ReedSolomonGF256* field) - : m_field(field) {} - -CBC_ReedSolomonEncoder::~CBC_ReedSolomonEncoder() {} - -void CBC_ReedSolomonEncoder::Init() { + : m_field(field) { m_cachedGenerators.push_back( pdfium::MakeUnique<CBC_ReedSolomonGF256Poly>(m_field.Get(), 1)); } +CBC_ReedSolomonEncoder::~CBC_ReedSolomonEncoder() {} + CBC_ReedSolomonGF256Poly* CBC_ReedSolomonEncoder::BuildGenerator( size_t degree) { if (degree >= m_cachedGenerators.size()) { diff --git a/fxbarcode/common/reedsolomon/BC_ReedSolomon.h b/fxbarcode/common/reedsolomon/BC_ReedSolomon.h index e45c8a4976..772ca3c041 100644 --- a/fxbarcode/common/reedsolomon/BC_ReedSolomon.h +++ b/fxbarcode/common/reedsolomon/BC_ReedSolomon.h @@ -20,7 +20,6 @@ class CBC_ReedSolomonEncoder { explicit CBC_ReedSolomonEncoder(CBC_ReedSolomonGF256* field); ~CBC_ReedSolomonEncoder(); - void Init(); bool Encode(std::vector<int32_t>* toEncode, size_t ecBytes); private: diff --git a/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp b/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp deleted file mode 100644 index 9ac93e9b14..0000000000 --- a/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -// Original code is licensed as follows: -/* - * Copyright 2008 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "fxbarcode/qrcode/BC_QRCoderBlockPair.h" - -#include <utility> - -#include "fxbarcode/common/BC_CommonByteArray.h" - -CBC_QRCoderBlockPair::CBC_QRCoderBlockPair() {} - -CBC_QRCoderBlockPair::~CBC_QRCoderBlockPair() {} - -const CBC_CommonByteArray* CBC_QRCoderBlockPair::GetDataBytes() const { - return m_dataBytes.get(); -} - -const CBC_CommonByteArray* CBC_QRCoderBlockPair::GetErrorCorrectionBytes() - const { - return m_errorCorrectionBytes.get(); -} - -void CBC_QRCoderBlockPair::SetData( - std::unique_ptr<CBC_CommonByteArray> data, - std::unique_ptr<CBC_CommonByteArray> errorCorrection) { - m_dataBytes = std::move(data); - m_errorCorrectionBytes = std::move(errorCorrection); -} diff --git a/fxbarcode/qrcode/BC_QRCoderBlockPair.h b/fxbarcode/qrcode/BC_QRCoderBlockPair.h deleted file mode 100644 index 9d571f3410..0000000000 --- a/fxbarcode/qrcode/BC_QRCoderBlockPair.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FXBARCODE_QRCODE_BC_QRCODERBLOCKPAIR_H_ -#define FXBARCODE_QRCODE_BC_QRCODERBLOCKPAIR_H_ - -#include <memory> - -class CBC_CommonByteArray; - -class CBC_QRCoderBlockPair { - public: - CBC_QRCoderBlockPair(); - ~CBC_QRCoderBlockPair(); - - const CBC_CommonByteArray* GetDataBytes() const; - const CBC_CommonByteArray* GetErrorCorrectionBytes() const; - void SetData(std::unique_ptr<CBC_CommonByteArray> data, - std::unique_ptr<CBC_CommonByteArray> errorCorrection); - - private: - std::unique_ptr<CBC_CommonByteArray> m_dataBytes; - std::unique_ptr<CBC_CommonByteArray> m_errorCorrectionBytes; -}; - -#endif // FXBARCODE_QRCODE_BC_QRCODERBLOCKPAIR_H_ diff --git a/fxbarcode/qrcode/BC_QRCoderEncoder.cpp b/fxbarcode/qrcode/BC_QRCoderEncoder.cpp index fe911f8635..052ad49a05 100644 --- a/fxbarcode/qrcode/BC_QRCoderEncoder.cpp +++ b/fxbarcode/qrcode/BC_QRCoderEncoder.cpp @@ -28,13 +28,11 @@ #include <vector> #include "fxbarcode/BC_UtilCodingConvert.h" -#include "fxbarcode/common/BC_CommonByteArray.h" #include "fxbarcode/common/BC_CommonByteMatrix.h" #include "fxbarcode/common/reedsolomon/BC_ReedSolomon.h" #include "fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h" #include "fxbarcode/qrcode/BC_QRCoder.h" #include "fxbarcode/qrcode/BC_QRCoderBitVector.h" -#include "fxbarcode/qrcode/BC_QRCoderBlockPair.h" #include "fxbarcode/qrcode/BC_QRCoderECBlocks.h" #include "fxbarcode/qrcode/BC_QRCoderMaskUtil.h" #include "fxbarcode/qrcode/BC_QRCoderMatrixUtil.h" @@ -46,6 +44,11 @@ using ModeStringPair = std::pair<CBC_QRCoderMode*, ByteString>; namespace { +struct QRCoderBlockPair { + std::vector<uint8_t> data; + std::vector<uint8_t> ecc; +}; + // This is a mapping for an ASCII table, starting at an index of 32. const int8_t g_alphaNumericTable[] = { 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, // 32-47 @@ -222,20 +225,20 @@ bool InitQRCode(int32_t numInputBytes, return false; } -std::unique_ptr<CBC_CommonByteArray> GenerateECBytes( - CBC_CommonByteArray* dataBytes, - int32_t numEcBytesInBlock) { - int32_t numDataBytes = dataBytes->Size(); - std::vector<int32_t> toEncode(numDataBytes + numEcBytesInBlock); - for (int32_t i = 0; i < numDataBytes; ++i) - toEncode[i] = dataBytes->At(i); - CBC_ReedSolomonEncoder encode(CBC_ReedSolomonGF256::QRCodeField); - encode.Init(); - if (!encode.Encode(&toEncode, numEcBytesInBlock)) - return nullptr; - auto ecBytes = pdfium::MakeUnique<CBC_CommonByteArray>(numEcBytesInBlock); - for (int32_t i = 0; i < numEcBytesInBlock; ++i) - ecBytes->Set(i, toEncode[numDataBytes + i]); +std::vector<uint8_t> GenerateECBytes(const std::vector<uint8_t>& dataBytes, + size_t numEcBytesInBlock) { + // If |numEcBytesInBlock| is 0, the encoder will fail anyway. + ASSERT(numEcBytesInBlock > 0); + std::vector<int32_t> toEncode(dataBytes.size() + numEcBytesInBlock); + std::copy(dataBytes.begin(), dataBytes.end(), toEncode.begin()); + + std::vector<uint8_t> ecBytes; + CBC_ReedSolomonEncoder encoder(CBC_ReedSolomonGF256::QRCodeField); + if (encoder.Encode(&toEncode, numEcBytesInBlock)) { + ecBytes = std::vector<uint8_t>(toEncode.begin() + dataBytes.size(), + toEncode.end()); + ASSERT(ecBytes.size() == static_cast<size_t>(numEcBytesInBlock)); + } return ecBytes; } @@ -272,8 +275,8 @@ void GetNumDataBytesAndNumECBytesForBlockID(int32_t numTotalBytes, int32_t numDataBytes, int32_t numRSBlocks, int32_t blockID, - int32_t& numDataBytesInBlock, - int32_t& numECBytesInBlock) { + int32_t* numDataBytesInBlock, + int32_t* numECBytesInBlock) { if (blockID >= numRSBlocks) return; @@ -286,11 +289,11 @@ void GetNumDataBytesAndNumECBytesForBlockID(int32_t numTotalBytes, int32_t numEcBytesInGroup1 = numTotalBytesInGroup1 - numDataBytesInGroup1; int32_t numEcBytesInGroup2 = numTotalBytesInGroup2 - numDataBytesInGroup2; if (blockID < numRsBlocksInGroup1) { - numDataBytesInBlock = numDataBytesInGroup1; - numECBytesInBlock = numEcBytesInGroup1; + *numDataBytesInBlock = numDataBytesInGroup1; + *numECBytesInBlock = numEcBytesInGroup1; } else { - numDataBytesInBlock = numDataBytesInGroup2; - numECBytesInBlock = numEcBytesInGroup2; + *numDataBytesInBlock = numDataBytesInGroup2; + *numECBytesInBlock = numEcBytesInGroup2; } } @@ -411,42 +414,47 @@ bool InterleaveWithECBytes(CBC_QRCoderBitVector* bits, return false; int32_t dataBytesOffset = 0; - int32_t maxNumDataBytes = 0; - int32_t maxNumEcBytes = 0; - std::vector<CBC_QRCoderBlockPair> blocks(numRSBlocks); + size_t maxNumDataBytes = 0; + size_t maxNumEcBytes = 0; + std::vector<QRCoderBlockPair> blocks(numRSBlocks); for (int32_t i = 0; i < numRSBlocks; i++) { int32_t numDataBytesInBlock; - int32_t numEcBytesInBlosk; + int32_t numEcBytesInBlock; GetNumDataBytesAndNumECBytesForBlockID(numTotalBytes, numDataBytes, - numRSBlocks, i, numDataBytesInBlock, - numEcBytesInBlosk); - auto dataBytes = pdfium::MakeUnique<CBC_CommonByteArray>(); - dataBytes->Set(bits->GetArray(), dataBytesOffset, numDataBytesInBlock); - std::unique_ptr<CBC_CommonByteArray> ecBytes = - GenerateECBytes(dataBytes.get(), numEcBytesInBlosk); - if (!ecBytes) + numRSBlocks, i, &numDataBytesInBlock, + &numEcBytesInBlock); + if (numDataBytesInBlock < 0 || numEcBytesInBlock <= 0) + return false; + + std::vector<uint8_t> dataBytes(numDataBytesInBlock); + memcpy(dataBytes.data(), bits->GetArray() + dataBytesOffset, + numDataBytesInBlock); + std::vector<uint8_t> ecBytes = + GenerateECBytes(dataBytes, numEcBytesInBlock); + if (ecBytes.empty()) return false; - maxNumDataBytes = std::max(maxNumDataBytes, dataBytes->Size()); - maxNumEcBytes = std::max(maxNumEcBytes, ecBytes->Size()); - blocks[i].SetData(std::move(dataBytes), std::move(ecBytes)); + maxNumDataBytes = std::max(maxNumDataBytes, dataBytes.size()); + maxNumEcBytes = std::max(maxNumEcBytes, ecBytes.size()); + blocks[i].data = std::move(dataBytes); + blocks[i].ecc = std::move(ecBytes); dataBytesOffset += numDataBytesInBlock; } if (numDataBytes != dataBytesOffset) return false; - for (int32_t x = 0; x < maxNumDataBytes; x++) { + for (size_t x = 0; x < maxNumDataBytes; x++) { for (size_t j = 0; j < blocks.size(); j++) { - const CBC_CommonByteArray* dataBytes = blocks[j].GetDataBytes(); - if (x < dataBytes->Size()) - result->AppendBits(dataBytes->At(x), 8); + const std::vector<uint8_t>& dataBytes = blocks[j].data; + if (x < dataBytes.size()) + result->AppendBits(dataBytes[x], 8); } } - for (int32_t y = 0; y < maxNumEcBytes; y++) { + for (size_t y = 0; y < maxNumEcBytes; y++) { for (size_t l = 0; l < blocks.size(); l++) { - const CBC_CommonByteArray* ecBytes = blocks[l].GetErrorCorrectionBytes(); - if (y < ecBytes->Size()) - result->AppendBits(ecBytes->At(y), 8); + const std::vector<uint8_t>& ecBytes = blocks[l].ecc; + if (y < ecBytes.size()) + result->AppendBits(ecBytes[y], 8); } } return static_cast<size_t>(numTotalBytes) == result->sizeInBytes(); |