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 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/src/fxbarcode/barcode.h"
     24 #include "xfa/src/fxbarcode/BC_Writer.h"
     25 #include "xfa/src/fxbarcode/BC_TwoDimWriter.h"
     26 #include "xfa/src/fxbarcode/BC_Dimension.h"
     27 #include "xfa/src/fxbarcode/BC_BinaryBitmap.h"
     28 #include "xfa/src/fxbarcode/BC_UtilCodingConvert.h"
     29 #include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
     30 #include "xfa/src/fxbarcode/common/BC_CommonByteMatrix.h"
     31 #include "BC_Encoder.h"
     32 #include "BC_DefaultPlacement.h"
     33 #include "BC_SymbolShapeHint.h"
     34 #include "BC_SymbolInfo.h"
     35 #include "BC_DataMatrixSymbolInfo144.h"
     36 #include "BC_ErrorCorrection.h"
     37 #include "BC_EncoderContext.h"
     38 #include "BC_C40Encoder.h"
     39 #include "BC_TextEncoder.h"
     40 #include "BC_X12Encoder.h"
     41 #include "BC_EdifactEncoder.h"
     42 #include "BC_Base256Encoder.h"
     43 #include "BC_ASCIIEncoder.h"
     44 #include "BC_HighLevelEncoder.h"
     45 #include "BC_DataMatrixWriter.h"
     46 CBC_DataMatrixWriter::CBC_DataMatrixWriter() {}
     47 CBC_DataMatrixWriter::~CBC_DataMatrixWriter() {}
     48 FX_BOOL CBC_DataMatrixWriter::SetErrorCorrectionLevel(int32_t level) {
     49   m_iCorrectLevel = level;
     50   return TRUE;
     51 }
     52 uint8_t* CBC_DataMatrixWriter::Encode(const CFX_WideString& contents,
     53                                       int32_t& outWidth,
     54                                       int32_t& outHeight,
     55                                       int32_t& e) {
     56   if (outWidth < 0 || outHeight < 0) {
     57     e = BCExceptionHeightAndWidthMustBeAtLeast1;
     58     BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
     59   }
     60   CBC_SymbolShapeHint::SymbolShapeHint shape =
     61       CBC_SymbolShapeHint::FORCE_SQUARE;
     62   CBC_Dimension* minSize = NULL;
     63   CBC_Dimension* maxSize = NULL;
     64   CFX_WideString ecLevel;
     65   CFX_WideString encoded = CBC_HighLevelEncoder::encodeHighLevel(
     66       contents, ecLevel, shape, minSize, maxSize, e);
     67   BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
     68   CBC_SymbolInfo* symbolInfo = CBC_SymbolInfo::lookup(
     69       encoded.GetLength(), shape, minSize, maxSize, TRUE, e);
     70   BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
     71   CFX_WideString codewords =
     72       CBC_ErrorCorrection::encodeECC200(encoded, symbolInfo, e);
     73   BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
     74   CBC_DefaultPlacement* placement =
     75       new CBC_DefaultPlacement(codewords, symbolInfo->getSymbolDataWidth(e),
     76                                symbolInfo->getSymbolDataHeight(e));
     77   BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
     78   placement->place();
     79   CBC_CommonByteMatrix* bytematrix = encodeLowLevel(placement, symbolInfo, e);
     80   BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
     81   outWidth = bytematrix->GetWidth();
     82   outHeight = bytematrix->GetHeight();
     83   uint8_t* result = FX_Alloc2D(uint8_t, outWidth, outHeight);
     84   FXSYS_memcpy(result, bytematrix->GetArray(), outWidth * outHeight);
     85   delete bytematrix;
     86   delete placement;
     87   return result;
     88 }
     89 CBC_CommonByteMatrix* CBC_DataMatrixWriter::encodeLowLevel(
     90     CBC_DefaultPlacement* placement,
     91     CBC_SymbolInfo* symbolInfo,
     92     int32_t& e) {
     93   int32_t symbolWidth = symbolInfo->getSymbolDataWidth(e);
     94   BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
     95   int32_t symbolHeight = symbolInfo->getSymbolDataHeight(e);
     96   BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
     97   CBC_CommonByteMatrix* matrix = new CBC_CommonByteMatrix(
     98       symbolInfo->getSymbolWidth(e), symbolInfo->getSymbolHeight(e));
     99   BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
    100   matrix->Init();
    101   int32_t matrixY = 0;
    102   for (int32_t y = 0; y < symbolHeight; y++) {
    103     int32_t matrixX;
    104     if ((y % symbolInfo->m_matrixHeight) == 0) {
    105       matrixX = 0;
    106       for (int32_t x = 0; x < symbolInfo->getSymbolWidth(e); x++) {
    107         matrix->Set(matrixX, matrixY, (x % 2) == 0);
    108         matrixX++;
    109       }
    110       matrixY++;
    111     }
    112     matrixX = 0;
    113     for (int32_t x = 0; x < symbolWidth; x++) {
    114       if ((x % symbolInfo->m_matrixWidth) == 0) {
    115         matrix->Set(matrixX, matrixY, TRUE);
    116         matrixX++;
    117       }
    118       matrix->Set(matrixX, matrixY, placement->getBit(x, y));
    119       matrixX++;
    120       if ((x % symbolInfo->m_matrixWidth) == symbolInfo->m_matrixWidth - 1) {
    121         matrix->Set(matrixX, matrixY, (y % 2) == 0);
    122         matrixX++;
    123       }
    124     }
    125     matrixY++;
    126     if ((y % symbolInfo->m_matrixHeight) == symbolInfo->m_matrixHeight - 1) {
    127       matrixX = 0;
    128       for (int32_t x = 0; x < symbolInfo->getSymbolWidth(e); x++) {
    129         matrix->Set(matrixX, matrixY, TRUE);
    130         matrixX++;
    131       }
    132       matrixY++;
    133     }
    134   }
    135   return matrix;
    136 }
    137