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 2007 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/src/fxbarcode/barcode.h" 24 #include "BC_QRCoderVersion.h" 25 #include "BC_QRCoderMode.h" 26 CBC_QRCoderMode* CBC_QRCoderMode::sBYTE = NULL; 27 CBC_QRCoderMode* CBC_QRCoderMode::sNUMERIC = NULL; 28 CBC_QRCoderMode* CBC_QRCoderMode::sALPHANUMERIC = NULL; 29 CBC_QRCoderMode* CBC_QRCoderMode::sKANJI = NULL; 30 CBC_QRCoderMode* CBC_QRCoderMode::sECI = NULL; 31 CBC_QRCoderMode* CBC_QRCoderMode::sGBK = NULL; 32 CBC_QRCoderMode* CBC_QRCoderMode::sTERMINATOR = NULL; 33 CBC_QRCoderMode* CBC_QRCoderMode::sFNC1_FIRST_POSITION = NULL; 34 CBC_QRCoderMode* CBC_QRCoderMode::sFNC1_SECOND_POSITION = NULL; 35 CBC_QRCoderMode* CBC_QRCoderMode::sSTRUCTURED_APPEND = NULL; 36 CBC_QRCoderMode::CBC_QRCoderMode(int32_t* characterCountBitsForVersions, 37 int32_t x1, 38 int32_t x2, 39 int32_t x3, 40 int32_t bits, 41 CFX_ByteString name) { 42 m_characterCountBitsForVersions = characterCountBitsForVersions; 43 if (m_characterCountBitsForVersions != NULL) { 44 m_characterCountBitsForVersions[0] = x1; 45 m_characterCountBitsForVersions[1] = x2; 46 m_characterCountBitsForVersions[2] = x3; 47 } 48 m_name += name; 49 m_bits = bits; 50 } 51 CBC_QRCoderMode::~CBC_QRCoderMode() { 52 if (m_characterCountBitsForVersions != NULL) { 53 FX_Free(m_characterCountBitsForVersions); 54 } 55 } 56 void CBC_QRCoderMode::Initialize() { 57 sBYTE = new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 8, 16, 16, 0x4, "BYTE"); 58 sALPHANUMERIC = 59 new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 9, 11, 13, 0x2, "ALPHANUMERIC"); 60 sECI = new CBC_QRCoderMode(NULL, 0, 0, 0, 0x7, "ECI"); 61 sKANJI = new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 8, 10, 12, 0x8, "KANJI"); 62 sNUMERIC = 63 new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 10, 12, 14, 0x1, "NUMERIC"); 64 sGBK = new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 8, 10, 12, 0x0D, "GBK"); 65 sTERMINATOR = 66 new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 0, 0, 0, 0x00, "TERMINATOR"); 67 sFNC1_FIRST_POSITION = 68 new CBC_QRCoderMode(NULL, 0, 0, 0, 0x05, "FNC1_FIRST_POSITION"); 69 sFNC1_SECOND_POSITION = 70 new CBC_QRCoderMode(NULL, 0, 0, 0, 0x09, "FNC1_SECOND_POSITION"); 71 sSTRUCTURED_APPEND = new CBC_QRCoderMode(FX_Alloc(int32_t, 3), 0, 0, 0, 0x03, 72 "STRUCTURED_APPEND"); 73 } 74 void CBC_QRCoderMode::Finalize() { 75 delete sBYTE; 76 delete sALPHANUMERIC; 77 delete sECI; 78 delete sKANJI; 79 delete sNUMERIC; 80 delete sGBK; 81 delete sTERMINATOR; 82 delete sFNC1_FIRST_POSITION; 83 delete sFNC1_SECOND_POSITION; 84 delete sSTRUCTURED_APPEND; 85 } 86 CBC_QRCoderMode* CBC_QRCoderMode::ForBits(int32_t bits, int32_t& e) { 87 switch (bits) { 88 case 0x0: 89 return sTERMINATOR; 90 case 0x1: 91 return sNUMERIC; 92 case 0x2: 93 return sALPHANUMERIC; 94 case 0x3: 95 return sSTRUCTURED_APPEND; 96 case 0x4: 97 return sBYTE; 98 case 0x5: 99 return sFNC1_FIRST_POSITION; 100 case 0x7: 101 return sECI; 102 case 0x8: 103 return sKANJI; 104 case 0x9: 105 return sFNC1_SECOND_POSITION; 106 case 0x0D: 107 return sGBK; 108 default: { 109 e = BCExceptionUnsupportedMode; 110 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); 111 } 112 } 113 return NULL; 114 } 115 int32_t CBC_QRCoderMode::GetBits() { 116 return m_bits; 117 } 118 CFX_ByteString CBC_QRCoderMode::GetName() { 119 return m_name; 120 } 121 int32_t CBC_QRCoderMode::GetCharacterCountBits(CBC_QRCoderVersion* version, 122 int32_t& e) { 123 if (m_characterCountBitsForVersions == NULL) { 124 e = BCExceptionCharacterNotThisMode; 125 BC_EXCEPTION_CHECK_ReturnValue(e, 0); 126 } 127 int32_t number = version->GetVersionNumber(); 128 int32_t offset; 129 if (number <= 9) { 130 offset = 0; 131 } else if (number <= 26) { 132 offset = 1; 133 } else { 134 offset = 2; 135 } 136 return m_characterCountBitsForVersions[offset]; 137 } 138 void CBC_QRCoderMode::Destroy() { 139 if (sBYTE) { 140 delete CBC_QRCoderMode::sBYTE; 141 sBYTE = NULL; 142 } 143 if (sNUMERIC) { 144 delete CBC_QRCoderMode::sNUMERIC; 145 sNUMERIC = NULL; 146 } 147 if (sALPHANUMERIC) { 148 delete CBC_QRCoderMode::sALPHANUMERIC; 149 sALPHANUMERIC = NULL; 150 } 151 if (sKANJI) { 152 delete CBC_QRCoderMode::sKANJI; 153 sKANJI = NULL; 154 } 155 if (sECI) { 156 delete CBC_QRCoderMode::sECI; 157 sECI = NULL; 158 } 159 if (sGBK) { 160 delete CBC_QRCoderMode::sGBK; 161 sGBK = NULL; 162 } 163 if (sTERMINATOR) { 164 delete CBC_QRCoderMode::sTERMINATOR; 165 sTERMINATOR = NULL; 166 } 167 if (sFNC1_FIRST_POSITION) { 168 delete CBC_QRCoderMode::sFNC1_FIRST_POSITION; 169 sFNC1_FIRST_POSITION = NULL; 170 } 171 if (sFNC1_SECOND_POSITION) { 172 delete CBC_QRCoderMode::sFNC1_SECOND_POSITION; 173 sFNC1_SECOND_POSITION = NULL; 174 } 175 if (sSTRUCTURED_APPEND) { 176 delete CBC_QRCoderMode::sSTRUCTURED_APPEND; 177 sSTRUCTURED_APPEND = NULL; 178 } 179 } 180