Home | History | Annotate | Download | only in oned
      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 2010 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 "xfa/src/fxbarcode/BC_Writer.h"
     25 #include "xfa/src/fxbarcode/BC_Reader.h"
     26 #include "BC_OneDReader.h"
     27 #include "BC_OneDimWriter.h"
     28 #include "BC_OnedCode128Reader.h"
     29 #include "BC_OnedCode128Writer.h"
     30 const int32_t CBC_OnedCode128Writer::CODE_CODE_B = 100;
     31 const int32_t CBC_OnedCode128Writer::CODE_CODE_C = 99;
     32 const int32_t CBC_OnedCode128Writer::CODE_START_B = 104;
     33 const int32_t CBC_OnedCode128Writer::CODE_START_C = 105;
     34 const int32_t CBC_OnedCode128Writer::CODE_STOP = 106;
     35 CBC_OnedCode128Writer::CBC_OnedCode128Writer() {
     36   m_codeFormat = BC_CODE128_B;
     37 }
     38 CBC_OnedCode128Writer::CBC_OnedCode128Writer(BC_TYPE type) {
     39   m_codeFormat = type;
     40 }
     41 CBC_OnedCode128Writer::~CBC_OnedCode128Writer() {}
     42 BC_TYPE CBC_OnedCode128Writer::GetType() {
     43   return m_codeFormat;
     44 }
     45 FX_BOOL CBC_OnedCode128Writer::CheckContentValidity(
     46     const CFX_WideStringC& contents) {
     47   FX_BOOL ret = TRUE;
     48   int32_t position = 0;
     49   int32_t patternIndex = -1;
     50   if (m_codeFormat == BC_CODE128_B || m_codeFormat == BC_CODE128_C) {
     51     while (position < contents.GetLength()) {
     52       patternIndex = (int32_t)contents.GetAt(position);
     53       if (patternIndex >= 32 && patternIndex <= 126 && patternIndex != 34) {
     54         position++;
     55         continue;
     56       } else {
     57         ret = FALSE;
     58         break;
     59       }
     60       position++;
     61     }
     62   } else {
     63     ret = FALSE;
     64   }
     65   return ret;
     66 }
     67 CFX_WideString CBC_OnedCode128Writer::FilterContents(
     68     const CFX_WideStringC& contents) {
     69   CFX_WideString filterChineseChar;
     70   FX_WCHAR ch;
     71   for (int32_t i = 0; i < contents.GetLength(); i++) {
     72     ch = contents.GetAt(i);
     73     if (ch > 175) {
     74       i++;
     75       continue;
     76     }
     77     filterChineseChar += ch;
     78   }
     79   CFX_WideString filtercontents;
     80   if (m_codeFormat == BC_CODE128_B) {
     81     for (int32_t i = 0; i < filterChineseChar.GetLength(); i++) {
     82       ch = filterChineseChar.GetAt(i);
     83       if (ch >= 32 && ch <= 126) {
     84         filtercontents += ch;
     85       } else {
     86         continue;
     87       }
     88     }
     89   } else if (m_codeFormat == BC_CODE128_C) {
     90     for (int32_t i = 0; i < filterChineseChar.GetLength(); i++) {
     91       ch = filterChineseChar.GetAt(i);
     92       if (ch >= 32 && ch <= 106) {
     93         filtercontents += ch;
     94       } else {
     95         continue;
     96       }
     97     }
     98   } else {
     99     filtercontents = contents;
    100   }
    101   return filtercontents;
    102 }
    103 FX_BOOL CBC_OnedCode128Writer::SetTextLocation(BC_TEXT_LOC location) {
    104   if (location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) {
    105     return FALSE;
    106   }
    107   m_locTextLoc = location;
    108   return TRUE;
    109 }
    110 uint8_t* CBC_OnedCode128Writer::Encode(const CFX_ByteString& contents,
    111                                        BCFORMAT format,
    112                                        int32_t& outWidth,
    113                                        int32_t& outHeight,
    114                                        int32_t hints,
    115                                        int32_t& e) {
    116   if (format != BCFORMAT_CODE_128) {
    117     e = BCExceptionOnlyEncodeCODE_128;
    118     return NULL;
    119   }
    120   uint8_t* ret =
    121       CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e);
    122   BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
    123   return ret;
    124 }
    125 uint8_t* CBC_OnedCode128Writer::Encode(const CFX_ByteString& contents,
    126                                        BCFORMAT format,
    127                                        int32_t& outWidth,
    128                                        int32_t& outHeight,
    129                                        int32_t& e) {
    130   uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
    131   BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
    132   return ret;
    133 }
    134 FX_BOOL CBC_OnedCode128Writer::IsDigits(const CFX_ByteString& contents,
    135                                         int32_t start,
    136                                         int32_t length) {
    137   int32_t end = start + length;
    138   for (int32_t i = start; i < end; i++) {
    139     if (contents[i] < '0' || contents[i] > '9') {
    140       return FALSE;
    141     }
    142   }
    143   return TRUE;
    144 }
    145 uint8_t* CBC_OnedCode128Writer::Encode(const CFX_ByteString& contents,
    146                                        int32_t& outLength,
    147                                        int32_t& e) {
    148   if (contents.GetLength() < 1 || contents.GetLength() > 80) {
    149     e = BCExceptionContentsLengthShouldBetween1and80;
    150     return NULL;
    151   }
    152   CFX_PtrArray patterns;
    153   int32_t checkSum = 0;
    154   if (m_codeFormat == BC_CODE128_B) {
    155     checkSum = Encode128B(contents, patterns);
    156   } else if (m_codeFormat == BC_CODE128_C) {
    157     checkSum = Encode128C(contents, patterns);
    158   } else {
    159     e = BCExceptionFormatException;
    160     return NULL;
    161   }
    162   checkSum %= 103;
    163   patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[checkSum]);
    164   patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_STOP]);
    165   m_iContentLen = contents.GetLength() + 3;
    166   int32_t codeWidth = 0;
    167   for (int32_t k = 0; k < patterns.GetSize(); k++) {
    168     int32_t* pattern = (int32_t*)patterns[k];
    169     for (int32_t j = 0; j < 7; j++) {
    170       codeWidth += pattern[j];
    171     }
    172   }
    173   outLength = codeWidth;
    174   uint8_t* result = FX_Alloc(uint8_t, outLength);
    175   int32_t pos = 0;
    176   for (int32_t j = 0; j < patterns.GetSize(); j++) {
    177     int32_t* pattern = (int32_t*)patterns[j];
    178     pos += AppendPattern(result, pos, pattern, 7, 1, e);
    179     if (e != BCExceptionNO) {
    180       FX_Free(result);
    181       return NULL;
    182     }
    183   }
    184   return result;
    185 }
    186 int32_t CBC_OnedCode128Writer::Encode128B(const CFX_ByteString& contents,
    187                                           CFX_PtrArray& patterns) {
    188   int32_t checkSum = 0;
    189   int32_t checkWeight = 1;
    190   int32_t position = 0;
    191   patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_START_B]);
    192   checkSum += CODE_START_B * checkWeight;
    193   while (position < contents.GetLength()) {
    194     int32_t patternIndex = 0;
    195     patternIndex = contents[position] - ' ';
    196     position += 1;
    197     patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[patternIndex]);
    198     checkSum += patternIndex * checkWeight;
    199     if (position != 0) {
    200       checkWeight++;
    201     }
    202   }
    203   return checkSum;
    204 }
    205 int32_t CBC_OnedCode128Writer::Encode128C(const CFX_ByteString& contents,
    206                                           CFX_PtrArray& patterns) {
    207   int32_t checkSum = 0;
    208   int32_t checkWeight = 1;
    209   int32_t position = 0;
    210   patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[CODE_START_C]);
    211   checkSum += CODE_START_C * checkWeight;
    212   while (position < contents.GetLength()) {
    213     int32_t patternIndex = 0;
    214     FX_CHAR ch = contents.GetAt(position);
    215     if (ch < '0' || ch > '9') {
    216       patternIndex = (int32_t)ch;
    217       position++;
    218     } else {
    219       patternIndex = FXSYS_atoi(contents.Mid(position, 2));
    220       if (contents.GetAt(position + 1) < '0' ||
    221           contents.GetAt(position + 1) > '9') {
    222         position += 1;
    223       } else {
    224         position += 2;
    225       }
    226     }
    227     patterns.Add((int32_t*)CBC_OnedCode128Reader::CODE_PATTERNS[patternIndex]);
    228     checkSum += patternIndex * checkWeight;
    229     if (position != 0) {
    230       checkWeight++;
    231     }
    232   }
    233   return checkSum;
    234 }
    235