1 // Copyright 2014 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 // Original code is licensed as follows: 7 /* 8 * Copyright 2008 ZXing authors 9 * 10 * Licensed under the Apache License, Version 2.0 (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 13 * 14 * http://www.apache.org/licenses/LICENSE-2.0 15 * 16 * Unless required by applicable law or agreed to in writing, software 17 * distributed under the License is distributed on an "AS IS" BASIS, 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 * See the License for the specific language governing permissions and 20 * limitations under the License. 21 */ 22 23 #include "xfa/fxbarcode/BC_TwoDimWriter.h" 24 #include "xfa/fxbarcode/common/BC_CommonByteMatrix.h" 25 #include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h" 26 #include "xfa/fxbarcode/qrcode/BC_QRCodeWriter.h" 27 #include "xfa/fxbarcode/qrcode/BC_QRCoder.h" 28 #include "xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h" 29 #include "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h" 30 #include "xfa/fxbarcode/qrcode/BC_QRCoderMode.h" 31 #include "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h" 32 33 CBC_QRCodeWriter::CBC_QRCodeWriter() { 34 m_bFixedSize = true; 35 m_iCorrectLevel = 1; 36 m_iVersion = 0; 37 } 38 39 CBC_QRCodeWriter::~CBC_QRCodeWriter() {} 40 41 void CBC_QRCodeWriter::ReleaseAll() { 42 delete CBC_ReedSolomonGF256::QRCodeField; 43 CBC_ReedSolomonGF256::QRCodeField = nullptr; 44 delete CBC_ReedSolomonGF256::DataMatrixField; 45 CBC_ReedSolomonGF256::DataMatrixField = nullptr; 46 CBC_QRCoderMode::Destroy(); 47 CBC_QRCoderErrorCorrectionLevel::Destroy(); 48 CBC_QRCoderVersion::Destroy(); 49 } 50 51 bool CBC_QRCodeWriter::SetVersion(int32_t version) { 52 if (version < 0 || version > 40) { 53 return false; 54 } 55 m_iVersion = version; 56 return true; 57 } 58 59 bool CBC_QRCodeWriter::SetErrorCorrectionLevel(int32_t level) { 60 if (level < 0 || level > 3) { 61 return false; 62 } 63 m_iCorrectLevel = level; 64 return true; 65 } 66 67 uint8_t* CBC_QRCodeWriter::Encode(const CFX_WideString& contents, 68 int32_t ecLevel, 69 int32_t& outWidth, 70 int32_t& outHeight, 71 int32_t& e) { 72 CBC_QRCoderErrorCorrectionLevel* ec = nullptr; 73 switch (ecLevel) { 74 case 0: 75 ec = CBC_QRCoderErrorCorrectionLevel::L; 76 break; 77 case 1: 78 ec = CBC_QRCoderErrorCorrectionLevel::M; 79 break; 80 case 2: 81 ec = CBC_QRCoderErrorCorrectionLevel::Q; 82 break; 83 case 3: 84 ec = CBC_QRCoderErrorCorrectionLevel::H; 85 break; 86 default: { 87 e = BCExceptionUnSupportEclevel; 88 return nullptr; 89 } 90 } 91 CBC_QRCoder qr; 92 if (m_iVersion > 0 && m_iVersion < 41) { 93 CFX_ByteString byteStr = contents.UTF8Encode(); 94 CBC_QRCoderEncoder::Encode(byteStr, ec, &qr, e, m_iVersion); 95 } else { 96 CBC_QRCoderEncoder::Encode(contents, ec, &qr, e); 97 } 98 if (e != BCExceptionNO) 99 return nullptr; 100 outWidth = qr.GetMatrixWidth(); 101 outHeight = qr.GetMatrixWidth(); 102 uint8_t* result = FX_Alloc2D(uint8_t, outWidth, outHeight); 103 FXSYS_memcpy(result, qr.GetMatrix()->GetArray(), outWidth * outHeight); 104 return result; 105 } 106 107 uint8_t* CBC_QRCodeWriter::Encode(const CFX_ByteString& contents, 108 BCFORMAT format, 109 int32_t& outWidth, 110 int32_t& outHeight, 111 int32_t hints, 112 int32_t& e) { 113 return nullptr; 114 } 115 116 uint8_t* CBC_QRCodeWriter::Encode(const CFX_ByteString& contents, 117 BCFORMAT format, 118 int32_t& outWidth, 119 int32_t& outHeight, 120 int32_t& e) { 121 return nullptr; 122 } 123