Small style stuff
[zxing.git] / symbian / QQrDecoder / zxing / oned / EAN13Reader.cpp
1 /*
2  *  EAN13Reader.cpp
3  *  ZXing
4  *
5  *  Created by Lukasz Warchol on 10-01-22.
6  *  Copyright 2010 ZXing authors All rights reserved.
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20
21 #include "EAN13Reader.h"
22 #include <zxing/ReaderException.h>
23
24 namespace zxing {
25         namespace oned {
26                 
27                 static const int FIRST_DIGIT_ENCODINGS[10] = {0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A};
28                                 
29                 
30                 EAN13Reader::EAN13Reader() { }
31                 
32                 int EAN13Reader::decodeMiddle(Ref<BitArray> row, int startRange[], int startRangeLen, std::string& resultString){
33                         const int countersLen = 4;
34                         int counters[countersLen] = { 0, 0, 0, 0 };
35                         
36                         
37                         int end = row->getSize();
38                         int rowOffset = startRange[1];
39                         
40                         int lgPatternFound = 0;
41                         
42                         for (int x = 0; x < 6 && rowOffset < end; x++) {
43                                 int bestMatch = decodeDigit(row, counters, countersLen, rowOffset, UPC_EAN_PATTERNS_L_AND_G_PATTERNS);
44                                 resultString.append(1, (char) ('0' + bestMatch % 10));
45                                 for (int i = 0; i < countersLen; i++) {
46                                         rowOffset += counters[i];
47                                 }
48                                 if (bestMatch >= 10) {
49                                         lgPatternFound |= 1 << (5 - x);
50                                 }
51                         }
52                         
53                         determineFirstDigit(resultString, lgPatternFound);
54                         
55                         int* middleRange = findGuardPattern(row, rowOffset, true, (int*)getMIDDLE_PATTERN(), getMIDDLE_PATTERN_LEN());
56                         rowOffset = middleRange[1];
57                         
58                         for (int x = 0; x < 6 && rowOffset < end; x++) {
59                                 int bestMatch = decodeDigit(row, counters, countersLen, rowOffset, UPC_EAN_PATTERNS_L_PATTERNS);
60                                 resultString.append(1, (char) ('0' + bestMatch));
61                                 for (int i = 0; i < countersLen; i++) {
62                                         rowOffset += counters[i];
63                                 }
64                         }
65                         
66                         return rowOffset;
67                 }
68                 
69                 void EAN13Reader::determineFirstDigit(std::string& resultString, int lgPatternFound){
70                         for (int d = 0; d < 10; d++) {
71                                 if (lgPatternFound == FIRST_DIGIT_ENCODINGS[d]) {
72                                         resultString.insert((size_t)0, (size_t)1, (char) ('0' + d));
73                                         return;
74                                 }
75                         }
76                         throw ReaderException("determineFirstDigit");
77                 }
78                 
79                 BarcodeFormat EAN13Reader::getBarcodeFormat(){
80                         return BarcodeFormat_EAN_13;
81                 }
82         }
83 }