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