Home | History | Annotate | Download | only in datamatrix
      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_DataMatrixVersion.h"
     25 CFX_PtrArray* CBC_DataMatrixVersion::VERSIONS = NULL;
     26 void CBC_DataMatrixVersion::Initialize() {
     27   VERSIONS = new CFX_PtrArray();
     28 }
     29 void CBC_DataMatrixVersion::Finalize() {
     30   for (int32_t i = 0; i < VERSIONS->GetSize(); i++) {
     31     delete ((CBC_DataMatrixVersion*)(VERSIONS->GetAt(i)));
     32   }
     33   VERSIONS->RemoveAll();
     34   delete VERSIONS;
     35 }
     36 CBC_DataMatrixVersion::CBC_DataMatrixVersion(int32_t versionNumber,
     37                                              int32_t symbolSizeRows,
     38                                              int32_t symbolSizeColumns,
     39                                              int32_t dataRegionSizeRows,
     40                                              int32_t dataRegionSizeColumns,
     41                                              ECBlocks* ecBlocks) {
     42   m_versionNumber = versionNumber;
     43   m_symbolSizeRows = symbolSizeRows;
     44   m_symbolSizeColumns = symbolSizeColumns;
     45   m_dataRegionSizeRows = dataRegionSizeRows;
     46   m_dataRegionSizeColumns = dataRegionSizeColumns;
     47   m_ecBlocks = ecBlocks;
     48   int32_t total = 0;
     49   int32_t ecCodewords = ecBlocks->GetECCodewords();
     50   const CFX_PtrArray& ecbArray = ecBlocks->GetECBlocks();
     51   for (int32_t i = 0; i < ecbArray.GetSize(); i++) {
     52     total += ((ECB*)ecbArray[i])->GetCount() *
     53              (((ECB*)ecbArray[i])->GetDataCodewords() + ecCodewords);
     54   }
     55   m_totalCodewords = total;
     56 }
     57 CBC_DataMatrixVersion::~CBC_DataMatrixVersion() {
     58   if (m_ecBlocks != NULL) {
     59     delete m_ecBlocks;
     60   }
     61   m_ecBlocks = NULL;
     62 }
     63 int32_t CBC_DataMatrixVersion::GetVersionNumber() {
     64   return m_versionNumber;
     65 }
     66 int32_t CBC_DataMatrixVersion::GetSymbolSizeRows() {
     67   return m_symbolSizeRows;
     68 }
     69 int32_t CBC_DataMatrixVersion::GetSymbolSizeColumns() {
     70   return m_symbolSizeColumns;
     71 }
     72 int32_t CBC_DataMatrixVersion::GetDataRegionSizeRows() {
     73   return m_dataRegionSizeRows;
     74 }
     75 int32_t CBC_DataMatrixVersion::GetDataRegionSizeColumns() {
     76   return m_dataRegionSizeColumns;
     77 }
     78 int32_t CBC_DataMatrixVersion::GetTotalCodewords() {
     79   return m_totalCodewords;
     80 }
     81 ECBlocks* CBC_DataMatrixVersion::GetECBlocks() {
     82   return m_ecBlocks;
     83 }
     84 void CBC_DataMatrixVersion::ReleaseAll() {
     85   for (int32_t i = 0; i < VERSIONS->GetSize(); i++) {
     86     delete (CBC_DataMatrixVersion*)VERSIONS->GetAt(i);
     87   }
     88   VERSIONS->RemoveAll();
     89 }
     90 CBC_DataMatrixVersion* CBC_DataMatrixVersion::GetVersionForDimensions(
     91     int32_t numRows,
     92     int32_t numColumns,
     93     int32_t& e) {
     94   if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) {
     95     e = BCExceptionNotFound;
     96     return NULL;
     97   }
     98   if (VERSIONS->GetSize() == 0) {
     99     VERSIONS->Add(new CBC_DataMatrixVersion(1, 10, 10, 8, 8,
    100                                             new ECBlocks(5, new ECB(1, 3))));
    101     VERSIONS->Add(new CBC_DataMatrixVersion(2, 12, 12, 10, 10,
    102                                             new ECBlocks(7, new ECB(1, 5))));
    103     VERSIONS->Add(new CBC_DataMatrixVersion(3, 14, 14, 12, 12,
    104                                             new ECBlocks(10, new ECB(1, 8))));
    105     VERSIONS->Add(new CBC_DataMatrixVersion(4, 16, 16, 14, 14,
    106                                             new ECBlocks(12, new ECB(1, 12))));
    107     VERSIONS->Add(new CBC_DataMatrixVersion(5, 18, 18, 16, 16,
    108                                             new ECBlocks(14, new ECB(1, 18))));
    109     VERSIONS->Add(new CBC_DataMatrixVersion(6, 20, 20, 18, 18,
    110                                             new ECBlocks(18, new ECB(1, 22))));
    111     VERSIONS->Add(new CBC_DataMatrixVersion(7, 22, 22, 20, 20,
    112                                             new ECBlocks(20, new ECB(1, 30))));
    113     VERSIONS->Add(new CBC_DataMatrixVersion(8, 24, 24, 22, 22,
    114                                             new ECBlocks(24, new ECB(1, 36))));
    115     VERSIONS->Add(new CBC_DataMatrixVersion(9, 26, 26, 24, 24,
    116                                             new ECBlocks(28, new ECB(1, 44))));
    117     VERSIONS->Add(new CBC_DataMatrixVersion(10, 32, 32, 14, 14,
    118                                             new ECBlocks(36, new ECB(1, 62))));
    119     VERSIONS->Add(new CBC_DataMatrixVersion(11, 36, 36, 16, 16,
    120                                             new ECBlocks(42, new ECB(1, 86))));
    121     VERSIONS->Add(new CBC_DataMatrixVersion(12, 40, 40, 18, 18,
    122                                             new ECBlocks(48, new ECB(1, 114))));
    123     VERSIONS->Add(new CBC_DataMatrixVersion(13, 44, 44, 20, 20,
    124                                             new ECBlocks(56, new ECB(1, 144))));
    125     VERSIONS->Add(new CBC_DataMatrixVersion(14, 48, 48, 22, 22,
    126                                             new ECBlocks(68, new ECB(1, 174))));
    127     VERSIONS->Add(new CBC_DataMatrixVersion(15, 52, 52, 24, 24,
    128                                             new ECBlocks(42, new ECB(2, 102))));
    129     VERSIONS->Add(new CBC_DataMatrixVersion(16, 64, 64, 14, 14,
    130                                             new ECBlocks(56, new ECB(2, 140))));
    131     VERSIONS->Add(new CBC_DataMatrixVersion(17, 72, 72, 16, 16,
    132                                             new ECBlocks(36, new ECB(4, 92))));
    133     VERSIONS->Add(new CBC_DataMatrixVersion(18, 80, 80, 18, 18,
    134                                             new ECBlocks(48, new ECB(4, 114))));
    135     VERSIONS->Add(new CBC_DataMatrixVersion(19, 88, 88, 20, 20,
    136                                             new ECBlocks(56, new ECB(4, 144))));
    137     VERSIONS->Add(new CBC_DataMatrixVersion(20, 96, 96, 22, 22,
    138                                             new ECBlocks(68, new ECB(4, 174))));
    139     VERSIONS->Add(new CBC_DataMatrixVersion(21, 104, 104, 24, 24,
    140                                             new ECBlocks(56, new ECB(6, 136))));
    141     VERSIONS->Add(new CBC_DataMatrixVersion(22, 120, 120, 18, 18,
    142                                             new ECBlocks(68, new ECB(6, 175))));
    143     VERSIONS->Add(new CBC_DataMatrixVersion(23, 132, 132, 20, 20,
    144                                             new ECBlocks(62, new ECB(8, 163))));
    145     VERSIONS->Add(new CBC_DataMatrixVersion(
    146         24, 144, 144, 22, 22,
    147         new ECBlocks(62, new ECB(8, 156), new ECB(2, 155))));
    148     VERSIONS->Add(new CBC_DataMatrixVersion(25, 8, 18, 6, 16,
    149                                             new ECBlocks(7, new ECB(1, 5))));
    150     VERSIONS->Add(new CBC_DataMatrixVersion(26, 8, 32, 6, 14,
    151                                             new ECBlocks(11, new ECB(1, 10))));
    152     VERSIONS->Add(new CBC_DataMatrixVersion(27, 12, 26, 10, 24,
    153                                             new ECBlocks(14, new ECB(1, 16))));
    154     VERSIONS->Add(new CBC_DataMatrixVersion(28, 12, 36, 10, 16,
    155                                             new ECBlocks(18, new ECB(1, 22))));
    156     VERSIONS->Add(new CBC_DataMatrixVersion(29, 16, 36, 14, 16,
    157                                             new ECBlocks(24, new ECB(1, 32))));
    158     VERSIONS->Add(new CBC_DataMatrixVersion(30, 16, 48, 14, 22,
    159                                             new ECBlocks(28, new ECB(1, 49))));
    160   }
    161   int32_t numVersions = VERSIONS->GetSize();
    162   for (int32_t i = 0; i < numVersions; ++i) {
    163     if (((CBC_DataMatrixVersion*)((*VERSIONS)[i]))->m_symbolSizeRows ==
    164             numRows &&
    165         ((CBC_DataMatrixVersion*)((*VERSIONS)[i]))->m_symbolSizeColumns ==
    166             numColumns) {
    167       return (CBC_DataMatrixVersion*)(*VERSIONS)[i];
    168     }
    169   }
    170   e = BCExceptionNotFound;
    171   return NULL;
    172 }
    173