| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 // Original code is licensed as follows: | 6 // Original code is licensed as follows: |
| 7 /* | 7 /* |
| 8 * Copyright 2008 ZXing authors | 8 * Copyright 2008 ZXing authors |
| 9 * | 9 * |
| 10 * Licensed under the Apache License, Version 2.0 (the "License"); | 10 * Licensed under the Apache License, Version 2.0 (the "License"); |
| 11 * you may not use this file except in compliance with the License. | 11 * you may not use this file except in compliance with the License. |
| 12 * You may obtain a copy of the License at | 12 * You may obtain a copy of the License at |
| 13 * | 13 * |
| 14 * http://www.apache.org/licenses/LICENSE-2.0 | 14 * http://www.apache.org/licenses/LICENSE-2.0 |
| 15 * | 15 * |
| 16 * Unless required by applicable law or agreed to in writing, software | 16 * Unless required by applicable law or agreed to in writing, software |
| 17 * distributed under the License is distributed on an "AS IS" BASIS, | 17 * distributed under the License is distributed on an "AS IS" BASIS, |
| 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 19 * See the License for the specific language governing permissions and | 19 * See the License for the specific language governing permissions and |
| 20 * limitations under the License. | 20 * limitations under the License. |
| 21 */ | 21 */ |
| 22 | 22 |
| 23 #include "xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h" | 23 #include "xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h" |
| 24 | 24 |
| 25 #include <algorithm> | 25 #include <algorithm> |
| 26 #include <memory> | 26 #include <memory> |
| 27 #include <utility> |
| 27 | 28 |
| 28 #include "xfa/fxbarcode/BC_UtilCodingConvert.h" | 29 #include "xfa/fxbarcode/BC_UtilCodingConvert.h" |
| 29 #include "xfa/fxbarcode/common/BC_CommonByteArray.h" | 30 #include "xfa/fxbarcode/common/BC_CommonByteArray.h" |
| 30 #include "xfa/fxbarcode/common/BC_CommonByteMatrix.h" | 31 #include "xfa/fxbarcode/common/BC_CommonByteMatrix.h" |
| 31 #include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h" | 32 #include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h" |
| 32 #include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h" | 33 #include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h" |
| 33 #include "xfa/fxbarcode/qrcode/BC_QRCoder.h" | 34 #include "xfa/fxbarcode/qrcode/BC_QRCoder.h" |
| 34 #include "xfa/fxbarcode/qrcode/BC_QRCoderBitVector.h" | 35 #include "xfa/fxbarcode/qrcode/BC_QRCoderBitVector.h" |
| 35 #include "xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.h" | 36 #include "xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.h" |
| 36 #include "xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.h" | 37 #include "xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.h" |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth())); | 402 qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth())); |
| 402 matrix->Init(); | 403 matrix->Init(); |
| 403 int32_t maskPattern = ChooseMaskPattern( | 404 int32_t maskPattern = ChooseMaskPattern( |
| 404 &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e); | 405 &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e); |
| 405 BC_EXCEPTION_CHECK_ReturnVoid(e); | 406 BC_EXCEPTION_CHECK_ReturnVoid(e); |
| 406 qrCode->SetMaskPattern(maskPattern); | 407 qrCode->SetMaskPattern(maskPattern); |
| 407 CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(), | 408 CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(), |
| 408 qrCode->GetVersion(), | 409 qrCode->GetVersion(), |
| 409 qrCode->GetMaskPattern(), matrix.get(), e); | 410 qrCode->GetMaskPattern(), matrix.get(), e); |
| 410 BC_EXCEPTION_CHECK_ReturnVoid(e); | 411 BC_EXCEPTION_CHECK_ReturnVoid(e); |
| 411 qrCode->SetMatrix(matrix.release()); | 412 qrCode->SetMatrix(std::move(matrix)); |
| 412 if (!qrCode->IsValid()) { | 413 if (!qrCode->IsValid()) { |
| 413 e = BCExceptionInvalidQRCode; | 414 e = BCExceptionInvalidQRCode; |
| 414 BC_EXCEPTION_CHECK_ReturnVoid(e); | 415 BC_EXCEPTION_CHECK_ReturnVoid(e); |
| 415 } | 416 } |
| 416 } | 417 } |
| 417 void CBC_QRCoderEncoder::EncodeWithAutoVersion( | 418 void CBC_QRCoderEncoder::EncodeWithAutoVersion( |
| 418 const CFX_ByteString& content, | 419 const CFX_ByteString& content, |
| 419 CBC_QRCoderErrorCorrectionLevel* ecLevel, | 420 CBC_QRCoderErrorCorrectionLevel* ecLevel, |
| 420 CBC_QRCoder* qrCode, | 421 CBC_QRCoder* qrCode, |
| 421 int32_t& e) { | 422 int32_t& e) { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix( | 486 std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix( |
| 486 qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth())); | 487 qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth())); |
| 487 matrix->Init(); | 488 matrix->Init(); |
| 488 int32_t maskPattern = ChooseMaskPattern( | 489 int32_t maskPattern = ChooseMaskPattern( |
| 489 &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e); | 490 &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e); |
| 490 BC_EXCEPTION_CHECK_ReturnVoid(e); | 491 BC_EXCEPTION_CHECK_ReturnVoid(e); |
| 491 qrCode->SetMaskPattern(maskPattern); | 492 qrCode->SetMaskPattern(maskPattern); |
| 492 CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(), | 493 CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(), |
| 493 qrCode->GetVersion(), | 494 qrCode->GetVersion(), |
| 494 qrCode->GetMaskPattern(), matrix.get(), e); | 495 qrCode->GetMaskPattern(), matrix.get(), e); |
| 495 BC_EXCEPTION_CHECK_ReturnVoid(e) qrCode->SetMatrix(matrix.release()); | 496 BC_EXCEPTION_CHECK_ReturnVoid(e) qrCode->SetMatrix(std::move(matrix)); |
| 496 if (!qrCode->IsValid()) { | 497 if (!qrCode->IsValid()) { |
| 497 e = BCExceptionInvalidQRCode; | 498 e = BCExceptionInvalidQRCode; |
| 498 BC_EXCEPTION_CHECK_ReturnVoid(e); | 499 BC_EXCEPTION_CHECK_ReturnVoid(e); |
| 499 } | 500 } |
| 500 } | 501 } |
| 501 void CBC_QRCoderEncoder::Encode(const CFX_WideString& content, | 502 void CBC_QRCoderEncoder::Encode(const CFX_WideString& content, |
| 502 CBC_QRCoderErrorCorrectionLevel* ecLevel, | 503 CBC_QRCoderErrorCorrectionLevel* ecLevel, |
| 503 CBC_QRCoder* qrCode, | 504 CBC_QRCoder* qrCode, |
| 504 int32_t& e) { | 505 int32_t& e) { |
| 505 CFX_ByteString encoding = "utf8"; | 506 CFX_ByteString encoding = "utf8"; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 535 std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix( | 536 std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix( |
| 536 qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth())); | 537 qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth())); |
| 537 matrix->Init(); | 538 matrix->Init(); |
| 538 int32_t maskPattern = ChooseMaskPattern( | 539 int32_t maskPattern = ChooseMaskPattern( |
| 539 &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e); | 540 &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(), matrix.get(), e); |
| 540 BC_EXCEPTION_CHECK_ReturnVoid(e); | 541 BC_EXCEPTION_CHECK_ReturnVoid(e); |
| 541 qrCode->SetMaskPattern(maskPattern); | 542 qrCode->SetMaskPattern(maskPattern); |
| 542 CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(), | 543 CBC_QRCoderMatrixUtil::BuildMatrix(&finalBits, qrCode->GetECLevel(), |
| 543 qrCode->GetVersion(), | 544 qrCode->GetVersion(), |
| 544 qrCode->GetMaskPattern(), matrix.get(), e); | 545 qrCode->GetMaskPattern(), matrix.get(), e); |
| 545 BC_EXCEPTION_CHECK_ReturnVoid(e) qrCode->SetMatrix(matrix.release()); | 546 BC_EXCEPTION_CHECK_ReturnVoid(e) qrCode->SetMatrix(std::move(matrix)); |
| 546 if (!qrCode->IsValid()) { | 547 if (!qrCode->IsValid()) { |
| 547 e = BCExceptionInvalidQRCode; | 548 e = BCExceptionInvalidQRCode; |
| 548 BC_EXCEPTION_CHECK_ReturnVoid(e); | 549 BC_EXCEPTION_CHECK_ReturnVoid(e); |
| 549 } | 550 } |
| 550 } | 551 } |
| 551 void CBC_QRCoderEncoder::TerminateBits(int32_t numDataBytes, | 552 void CBC_QRCoderEncoder::TerminateBits(int32_t numDataBytes, |
| 552 CBC_QRCoderBitVector* bits, | 553 CBC_QRCoderBitVector* bits, |
| 553 int32_t& e) { | 554 int32_t& e) { |
| 554 int32_t capacity = numDataBytes << 3; | 555 int32_t capacity = numDataBytes << 3; |
| 555 if (bits->Size() > capacity) { | 556 if (bits->Size() > capacity) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 588 } | 589 } |
| 589 } | 590 } |
| 590 int32_t CBC_QRCoderEncoder::ChooseMaskPattern( | 591 int32_t CBC_QRCoderEncoder::ChooseMaskPattern( |
| 591 CBC_QRCoderBitVector* bits, | 592 CBC_QRCoderBitVector* bits, |
| 592 CBC_QRCoderErrorCorrectionLevel* ecLevel, | 593 CBC_QRCoderErrorCorrectionLevel* ecLevel, |
| 593 int32_t version, | 594 int32_t version, |
| 594 CBC_CommonByteMatrix* matrix, | 595 CBC_CommonByteMatrix* matrix, |
| 595 int32_t& e) { | 596 int32_t& e) { |
| 596 int32_t minPenalty = 65535; | 597 int32_t minPenalty = 65535; |
| 597 int32_t bestMaskPattern = -1; | 598 int32_t bestMaskPattern = -1; |
| 598 for (int32_t maskPattern = 0; maskPattern < CBC_QRCoder::NUM_MASK_PATTERNS; | 599 for (int32_t maskPattern = 0; maskPattern < CBC_QRCoder::kNumMaskPatterns; |
| 599 maskPattern++) { | 600 maskPattern++) { |
| 600 CBC_QRCoderMatrixUtil::BuildMatrix(bits, ecLevel, version, maskPattern, | 601 CBC_QRCoderMatrixUtil::BuildMatrix(bits, ecLevel, version, maskPattern, |
| 601 matrix, e); | 602 matrix, e); |
| 602 BC_EXCEPTION_CHECK_ReturnValue(e, 0); | 603 BC_EXCEPTION_CHECK_ReturnValue(e, 0); |
| 603 int32_t penalty = CalculateMaskPenalty(matrix); | 604 int32_t penalty = CalculateMaskPenalty(matrix); |
| 604 if (penalty < minPenalty) { | 605 if (penalty < minPenalty) { |
| 605 minPenalty = penalty; | 606 minPenalty = penalty; |
| 606 bestMaskPattern = maskPattern; | 607 bestMaskPattern = maskPattern; |
| 607 } | 608 } |
| 608 } | 609 } |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 847 int32_t maxNumDataBytes = 0; | 848 int32_t maxNumDataBytes = 0; |
| 848 int32_t maxNumEcBytes = 0; | 849 int32_t maxNumEcBytes = 0; |
| 849 CFX_ArrayTemplate<CBC_QRCoderBlockPair*> blocks; | 850 CFX_ArrayTemplate<CBC_QRCoderBlockPair*> blocks; |
| 850 int32_t i; | 851 int32_t i; |
| 851 for (i = 0; i < numRSBlocks; i++) { | 852 for (i = 0; i < numRSBlocks; i++) { |
| 852 int32_t numDataBytesInBlock; | 853 int32_t numDataBytesInBlock; |
| 853 int32_t numEcBytesInBlosk; | 854 int32_t numEcBytesInBlosk; |
| 854 GetNumDataBytesAndNumECBytesForBlockID(numTotalBytes, numDataBytes, | 855 GetNumDataBytesAndNumECBytesForBlockID(numTotalBytes, numDataBytes, |
| 855 numRSBlocks, i, numDataBytesInBlock, | 856 numRSBlocks, i, numDataBytesInBlock, |
| 856 numEcBytesInBlosk); | 857 numEcBytesInBlosk); |
| 857 CBC_CommonByteArray* dataBytes = new CBC_CommonByteArray; | 858 std::unique_ptr<CBC_CommonByteArray> dataBytes(new CBC_CommonByteArray); |
| 858 dataBytes->Set(bits->GetArray(), dataBytesOffset, numDataBytesInBlock); | 859 dataBytes->Set(bits->GetArray(), dataBytesOffset, numDataBytesInBlock); |
| 859 CBC_CommonByteArray* ecBytes = | 860 std::unique_ptr<CBC_CommonByteArray> ecBytes( |
| 860 GenerateECBytes(dataBytes, numEcBytesInBlosk, e); | 861 GenerateECBytes(dataBytes.get(), numEcBytesInBlosk, e)); |
| 861 BC_EXCEPTION_CHECK_ReturnVoid(e); | 862 BC_EXCEPTION_CHECK_ReturnVoid(e); |
| 862 blocks.Add(new CBC_QRCoderBlockPair(dataBytes, ecBytes)); | 863 blocks.Add( |
| 864 new CBC_QRCoderBlockPair(std::move(dataBytes), std::move(ecBytes))); |
| 863 maxNumDataBytes = std::max(maxNumDataBytes, dataBytes->Size()); | 865 maxNumDataBytes = std::max(maxNumDataBytes, dataBytes->Size()); |
| 864 maxNumEcBytes = std::max(maxNumEcBytes, ecBytes->Size()); | 866 maxNumEcBytes = std::max(maxNumEcBytes, ecBytes->Size()); |
| 865 dataBytesOffset += numDataBytesInBlock; | 867 dataBytesOffset += numDataBytesInBlock; |
| 866 } | 868 } |
| 867 if (numDataBytes != dataBytesOffset) { | 869 if (numDataBytes != dataBytesOffset) { |
| 868 e = BCExceptionBytesNotMatchOffset; | 870 e = BCExceptionBytesNotMatchOffset; |
| 869 BC_EXCEPTION_CHECK_ReturnVoid(e); | 871 BC_EXCEPTION_CHECK_ReturnVoid(e); |
| 870 } | 872 } |
| 871 for (int32_t x = 0; x < maxNumDataBytes; x++) { | 873 for (int32_t x = 0; x < maxNumDataBytes; x++) { |
| 872 for (int32_t j = 0; j < blocks.GetSize(); j++) { | 874 for (int32_t j = 0; j < blocks.GetSize(); j++) { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 933 CBC_ReedSolomonEncoder encode(CBC_ReedSolomonGF256::QRCodeFild); | 935 CBC_ReedSolomonEncoder encode(CBC_ReedSolomonGF256::QRCodeFild); |
| 934 encode.Init(); | 936 encode.Init(); |
| 935 encode.Encode(&toEncode, numEcBytesInBlock, e); | 937 encode.Encode(&toEncode, numEcBytesInBlock, e); |
| 936 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr); | 938 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr); |
| 937 CBC_CommonByteArray* ecBytes = new CBC_CommonByteArray(numEcBytesInBlock); | 939 CBC_CommonByteArray* ecBytes = new CBC_CommonByteArray(numEcBytesInBlock); |
| 938 for (int32_t j = 0; j < numEcBytesInBlock; j++) { | 940 for (int32_t j = 0; j < numEcBytesInBlock; j++) { |
| 939 ecBytes->Set(j, toEncode[numDataBytes + j]); | 941 ecBytes->Set(j, toEncode[numDataBytes + j]); |
| 940 } | 942 } |
| 941 return ecBytes; | 943 return ecBytes; |
| 942 } | 944 } |
| OLD | NEW |