summaryrefslogtreecommitdiff
path: root/xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.cpp
blob: 24d81070f3c6f904032729734bafeee7400e1476 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
// Original code is licensed as follows:
/*
 * Copyright 2013 ZXing authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
#include "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h"
#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"

int32_t CBC_DetectionResultColumn::MAX_NEARBY_DISTANCE = 5;

CBC_DetectionResultColumn::CBC_DetectionResultColumn(
    CBC_BoundingBox* boundingBox) {
  m_boundingBox = boundingBox;
  m_codewords = new CFX_PtrArray;
  m_codewords->SetSize(boundingBox->getMaxY() - boundingBox->getMinY() + 1);
}
CBC_DetectionResultColumn::~CBC_DetectionResultColumn() {
  for (int32_t i = 0; i < m_codewords->GetSize(); i++) {
    delete (CBC_Codeword*)m_codewords->GetAt(i);
  }
  m_codewords->RemoveAll();
  delete m_codewords;
}
CBC_Codeword* CBC_DetectionResultColumn::getCodewordNearby(int32_t imageRow) {
  CBC_Codeword* codeword = getCodeword(imageRow);
  if (codeword) {
    return codeword;
  }
  for (int32_t i = 1; i < MAX_NEARBY_DISTANCE; i++) {
    int32_t nearImageRow = imageRowToCodewordIndex(imageRow) - i;
    if (nearImageRow >= 0) {
      codeword = (CBC_Codeword*)m_codewords->GetAt(nearImageRow);
      if (codeword) {
        return codeword;
      }
    }
    nearImageRow = imageRowToCodewordIndex(imageRow) + i;
    if (nearImageRow < m_codewords->GetSize()) {
      codeword = (CBC_Codeword*)m_codewords->GetAt(nearImageRow);
      if (codeword) {
        return codeword;
      }
    }
  }
  return NULL;
}
int32_t CBC_DetectionResultColumn::imageRowToCodewordIndex(int32_t imageRow) {
  return imageRow - m_boundingBox->getMinY();
}
int32_t CBC_DetectionResultColumn::codewordIndexToImageRow(
    int32_t codewordIndex) {
  return m_boundingBox->getMinY() + codewordIndex;
}
void CBC_DetectionResultColumn::setCodeword(int32_t imageRow,
                                            CBC_Codeword* codeword) {
  m_codewords->SetAt(imageRowToCodewordIndex(imageRow), codeword);
}
CBC_Codeword* CBC_DetectionResultColumn::getCodeword(int32_t imageRow) {
  return (CBC_Codeword*)m_codewords->GetAt(imageRowToCodewordIndex(imageRow));
}
CBC_BoundingBox* CBC_DetectionResultColumn::getBoundingBox() {
  return m_boundingBox;
}
CFX_PtrArray* CBC_DetectionResultColumn::getCodewords() {
  return m_codewords;
}
CFX_ByteString CBC_DetectionResultColumn::toString() {
  CFX_ByteString result;
  int32_t row = 0;
  for (int32_t i = 0; i < m_codewords->GetSize(); i++) {
    CBC_Codeword* codeword = (CBC_Codeword*)m_codewords->GetAt(i);
    if (codeword == NULL) {
      result += (FX_CHAR)row;
      row++;
      continue;
    }
    result += (FX_CHAR)row;
    result += codeword->getRowNumber();
    result += codeword->getValue();
    row++;
  }
  return result;
}