Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(257)

Side by Side Diff: xfa/fxbarcode/qrcode/BC_QRCoderEncoder.cpp

Issue 2595203002: Remove CFX_ArrayTemplate in BC_QRCoderEncoder. (Closed)
Patch Set: numberic Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 // Original code is licensed as follows: 6 // Original code is licensed as follows:
7 /* 7 /*
8 * Copyright 2008 ZXing authors 8 * Copyright 2008 ZXing authors
9 * 9 *
10 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * Licensed under the Apache License, Version 2.0 (the "License");
(...skipping 22 matching lines...) Expand all
33 #include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h" 33 #include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
34 #include "xfa/fxbarcode/qrcode/BC_QRCoder.h" 34 #include "xfa/fxbarcode/qrcode/BC_QRCoder.h"
35 #include "xfa/fxbarcode/qrcode/BC_QRCoderBitVector.h" 35 #include "xfa/fxbarcode/qrcode/BC_QRCoderBitVector.h"
36 #include "xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.h" 36 #include "xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.h"
37 #include "xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.h" 37 #include "xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.h"
38 #include "xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.h" 38 #include "xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.h"
39 #include "xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h" 39 #include "xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h"
40 #include "xfa/fxbarcode/qrcode/BC_QRCoderMode.h" 40 #include "xfa/fxbarcode/qrcode/BC_QRCoderMode.h"
41 #include "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h" 41 #include "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h"
42 42
43 const int32_t CBC_QRCoderEncoder::m_alphaNumbericTable[] = { 43 namespace {
44
45 const int8_t g_alphaNumericTable[] = {
44 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 46 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
45 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 47 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
46 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, 48 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43,
47 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, 49 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1,
48 -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 50 -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
49 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1}; 51 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1};
50 52
53 } // namespace
54
51 CBC_QRCoderEncoder::CBC_QRCoderEncoder() {} 55 CBC_QRCoderEncoder::CBC_QRCoderEncoder() {}
52 56
53 CBC_QRCoderEncoder::~CBC_QRCoderEncoder() {} 57 CBC_QRCoderEncoder::~CBC_QRCoderEncoder() {}
54 58
55 class Make_Pair {
56 public:
57 CBC_QRCoderMode* m_mode;
58 CFX_ByteString m_string;
59
60 private:
61 Make_Pair(const Make_Pair& mode_string) {}
62 Make_Pair& operator=(Make_Pair& mode_string) {
63 if (this == &mode_string) {
64 return *this;
65 }
66 m_mode = mode_string.m_mode;
67 m_string = mode_string.m_string;
68 return *this;
69 }
70
71 public:
72 Make_Pair(CBC_QRCoderMode* mode, const CFX_ByteString& str)
73 : m_mode(mode), m_string(str) {}
74 ~Make_Pair() {}
75 };
76 void CBC_QRCoderEncoder::Encode(const CFX_ByteString& content, 59 void CBC_QRCoderEncoder::Encode(const CFX_ByteString& content,
77 CBC_QRCoderErrorCorrectionLevel* ecLevel, 60 CBC_QRCoderErrorCorrectionLevel* ecLevel,
78 CBC_QRCoder* qrCode, 61 CBC_QRCoder* qrCode,
79 int32_t& e, 62 int32_t& e,
80 int32_t versionSpecify) { 63 int32_t versionSpecify) {
81 if (versionSpecify == 0) { 64 if (versionSpecify == 0) {
82 EncodeWithAutoVersion(content, ecLevel, qrCode, e); 65 EncodeWithAutoVersion(content, ecLevel, qrCode, e);
83 BC_EXCEPTION_CHECK_ReturnVoid(e) 66 BC_EXCEPTION_CHECK_ReturnVoid(e)
84 } else if (versionSpecify > 0 && versionSpecify <= 40) { 67 } else if (versionSpecify > 0 && versionSpecify <= 40) {
85 EncodeWithSpecifyVersion(content, ecLevel, qrCode, versionSpecify, e); 68 EncodeWithSpecifyVersion(content, ecLevel, qrCode, versionSpecify, e);
86 BC_EXCEPTION_CHECK_ReturnVoid(e); 69 BC_EXCEPTION_CHECK_ReturnVoid(e);
87 } else { 70 } else {
88 e = BCExceptionVersionMust1_40; 71 e = BCExceptionVersionMust1_40;
89 BC_EXCEPTION_CHECK_ReturnVoid(e); 72 BC_EXCEPTION_CHECK_ReturnVoid(e);
90 } 73 }
91 } 74 }
92 75
93 void CBC_QRCoderEncoder::AppendECI(CBC_QRCoderBitVector* bits) {} 76 void CBC_QRCoderEncoder::AppendECI(CBC_QRCoderBitVector* bits) {}
94 77
95 void CBC_QRCoderEncoder::AppendDataModeLenghInfo( 78 void CBC_QRCoderEncoder::AppendDataModeLenghInfo(
96 const CFX_ArrayTemplate<Make_Pair*>& splitResult, 79 const std::vector<std::pair<CBC_QRCoderMode*, CFX_ByteString>>&
80 splitResults,
97 CBC_QRCoderBitVector& headerAndDataBits, 81 CBC_QRCoderBitVector& headerAndDataBits,
98 CBC_QRCoderMode* tempMode, 82 CBC_QRCoderMode* tempMode,
99 CBC_QRCoder* qrCode, 83 CBC_QRCoder* qrCode,
100 CFX_ByteString& encoding, 84 CFX_ByteString& encoding,
101 int32_t& e) { 85 int32_t& e) {
102 for (int32_t i = 0; i < splitResult.GetSize(); i++) { 86 for (const auto& splitResult : splitResults) {
103 tempMode = splitResult[i]->m_mode; 87 tempMode = splitResult.first;
104 if (tempMode == CBC_QRCoderMode::sGBK) { 88 if (tempMode == CBC_QRCoderMode::sGBK) {
105 AppendModeInfo(tempMode, &headerAndDataBits, e); 89 AppendModeInfo(tempMode, &headerAndDataBits, e);
106 BC_EXCEPTION_CHECK_ReturnVoid(e); 90 BC_EXCEPTION_CHECK_ReturnVoid(e);
107 AppendLengthInfo(splitResult[i]->m_string.GetLength(), 91 AppendLengthInfo(splitResult.second.GetLength(), qrCode->GetVersion(),
dsinclair 2017/01/02 18:06:17 Is it worth making a tempString = splitResults.sec
Tom Sepez 2017/01/03 22:25:59 Prolly not, the type of splitResults is explicit o
108 qrCode->GetVersion(), tempMode, &headerAndDataBits, e); 92 tempMode, &headerAndDataBits, e);
109 BC_EXCEPTION_CHECK_ReturnVoid(e); 93 BC_EXCEPTION_CHECK_ReturnVoid(e);
110 AppendBytes(splitResult[i]->m_string, tempMode, &headerAndDataBits, 94 AppendBytes(splitResult.second, tempMode, &headerAndDataBits, encoding,
111 encoding, e); 95 e);
112 BC_EXCEPTION_CHECK_ReturnVoid(e); 96 BC_EXCEPTION_CHECK_ReturnVoid(e);
113 } else if (tempMode == CBC_QRCoderMode::sBYTE) { 97 } else if (tempMode == CBC_QRCoderMode::sBYTE) {
114 CFX_ByteArray bytes; 98 CFX_ByteArray bytes;
115 CBC_UtilCodingConvert::LocaleToUtf8(splitResult[i]->m_string, bytes); 99 CBC_UtilCodingConvert::LocaleToUtf8(splitResult.second, bytes);
116 AppendModeInfo(tempMode, &headerAndDataBits, e); 100 AppendModeInfo(tempMode, &headerAndDataBits, e);
117 BC_EXCEPTION_CHECK_ReturnVoid(e); 101 BC_EXCEPTION_CHECK_ReturnVoid(e);
118 AppendLengthInfo(bytes.GetSize(), qrCode->GetVersion(), tempMode, 102 AppendLengthInfo(bytes.GetSize(), qrCode->GetVersion(), tempMode,
119 &headerAndDataBits, e); 103 &headerAndDataBits, e);
120 BC_EXCEPTION_CHECK_ReturnVoid(e); 104 BC_EXCEPTION_CHECK_ReturnVoid(e);
121 Append8BitBytes(bytes, &headerAndDataBits, e); 105 Append8BitBytes(bytes, &headerAndDataBits, e);
122 BC_EXCEPTION_CHECK_ReturnVoid(e); 106 BC_EXCEPTION_CHECK_ReturnVoid(e);
123 } else if (tempMode == CBC_QRCoderMode::sALPHANUMERIC) { 107 } else if (tempMode == CBC_QRCoderMode::sALPHANUMERIC) {
124 AppendModeInfo(tempMode, &headerAndDataBits, e); 108 AppendModeInfo(tempMode, &headerAndDataBits, e);
125 BC_EXCEPTION_CHECK_ReturnVoid(e); 109 BC_EXCEPTION_CHECK_ReturnVoid(e);
126 AppendLengthInfo(splitResult[i]->m_string.GetLength(), 110 AppendLengthInfo(splitResult.second.GetLength(), qrCode->GetVersion(),
127 qrCode->GetVersion(), tempMode, &headerAndDataBits, e); 111 tempMode, &headerAndDataBits, e);
128 BC_EXCEPTION_CHECK_ReturnVoid(e); 112 BC_EXCEPTION_CHECK_ReturnVoid(e);
129 AppendBytes(splitResult[i]->m_string, tempMode, &headerAndDataBits, 113 AppendBytes(splitResult.second, tempMode, &headerAndDataBits, encoding,
130 encoding, e); 114 e);
131 BC_EXCEPTION_CHECK_ReturnVoid(e); 115 BC_EXCEPTION_CHECK_ReturnVoid(e);
132 } else if (tempMode == CBC_QRCoderMode::sNUMERIC) { 116 } else if (tempMode == CBC_QRCoderMode::sNUMERIC) {
133 AppendModeInfo(tempMode, &headerAndDataBits, e); 117 AppendModeInfo(tempMode, &headerAndDataBits, e);
134 BC_EXCEPTION_CHECK_ReturnVoid(e); 118 BC_EXCEPTION_CHECK_ReturnVoid(e);
135 AppendLengthInfo(splitResult[i]->m_string.GetLength(), 119 AppendLengthInfo(splitResult.second.GetLength(), qrCode->GetVersion(),
136 qrCode->GetVersion(), tempMode, &headerAndDataBits, e); 120 tempMode, &headerAndDataBits, e);
137 BC_EXCEPTION_CHECK_ReturnVoid(e); 121 BC_EXCEPTION_CHECK_ReturnVoid(e);
138 AppendBytes(splitResult[i]->m_string, tempMode, &headerAndDataBits, 122 AppendBytes(splitResult.second, tempMode, &headerAndDataBits, encoding,
139 encoding, e); 123 e);
140 BC_EXCEPTION_CHECK_ReturnVoid(e); 124 BC_EXCEPTION_CHECK_ReturnVoid(e);
141 } else { 125 } else {
142 e = BCExceptionUnknown; 126 e = BCExceptionUnknown;
143 BC_EXCEPTION_CHECK_ReturnVoid(e); 127 BC_EXCEPTION_CHECK_ReturnVoid(e);
144 } 128 }
145 } 129 }
146 } 130 }
147 131
148 void CBC_QRCoderEncoder::SplitString(const CFX_ByteString& content, 132 void CBC_QRCoderEncoder::SplitString(
149 CFX_ArrayTemplate<Make_Pair*>* result) { 133 const CFX_ByteString& content,
134 std::vector<std::pair<CBC_QRCoderMode*, CFX_ByteString>>* result) {
150 int32_t index = 0, flag = 0; 135 int32_t index = 0, flag = 0;
151 while ( 136 while (
152 (((uint8_t)content[index] >= 0xA1 && (uint8_t)content[index] <= 0xAA) || 137 (((uint8_t)content[index] >= 0xA1 && (uint8_t)content[index] <= 0xAA) ||
153 ((uint8_t)content[index] >= 0xB0 && (uint8_t)content[index] <= 0xFA)) && 138 ((uint8_t)content[index] >= 0xB0 && (uint8_t)content[index] <= 0xFA)) &&
154 (index < content.GetLength())) { 139 (index < content.GetLength())) {
155 index += 2; 140 index += 2;
156 } 141 }
157 if (index != flag) { 142 if (index != flag) {
158 result->Add( 143 result->push_back({CBC_QRCoderMode::sGBK, content.Mid(flag, index - flag)});
159 new Make_Pair(CBC_QRCoderMode::sGBK, content.Mid(flag, index - flag)));
160 } 144 }
161 flag = index; 145 flag = index;
162 if (index >= content.GetLength()) { 146 if (index >= content.GetLength()) {
163 return; 147 return;
164 } 148 }
165 while ( 149 while (
166 GetAlphaNumericCode((uint8_t)content[index]) == -1 && 150 GetAlphaNumericCode((uint8_t)content[index]) == -1 &&
167 !(((uint8_t)content[index] >= 0xA1 && (uint8_t)content[index] <= 0xAA) || 151 !(((uint8_t)content[index] >= 0xA1 && (uint8_t)content[index] <= 0xAA) ||
168 ((uint8_t)content[index] >= 0xB0 && (uint8_t)content[index] <= 0xFA)) && 152 ((uint8_t)content[index] >= 0xB0 && (uint8_t)content[index] <= 0xFA)) &&
169 (index < content.GetLength())) { 153 (index < content.GetLength())) {
170 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 154 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
171 if (IsDBCSLeadByte((uint8_t)content[index])) 155 if (IsDBCSLeadByte((uint8_t)content[index]))
172 #else 156 #else
173 if ((uint8_t)content[index] > 127) 157 if ((uint8_t)content[index] > 127)
174 #endif 158 #endif
175 { 159 {
176 index += 2; 160 index += 2;
177 } else { 161 } else {
178 index++; 162 index++;
179 } 163 }
180 } 164 }
181 if (index != flag) { 165 if (index != flag) {
182 result->Add( 166 result->push_back(
183 new Make_Pair(CBC_QRCoderMode::sBYTE, content.Mid(flag, index - flag))); 167 {CBC_QRCoderMode::sBYTE, content.Mid(flag, index - flag)});
184 } 168 }
185 flag = index; 169 flag = index;
186 if (index >= content.GetLength()) { 170 if (index >= content.GetLength()) {
187 return; 171 return;
188 } 172 }
189 while (FXSYS_Isdigit((uint8_t)content[index]) && 173 while (FXSYS_Isdigit((uint8_t)content[index]) &&
190 (index < content.GetLength())) { 174 (index < content.GetLength())) {
191 index++; 175 index++;
192 } 176 }
193 if (index != flag) { 177 if (index != flag) {
194 result->Add(new Make_Pair(CBC_QRCoderMode::sNUMERIC, 178 result->push_back(
195 content.Mid(flag, index - flag))); 179 {CBC_QRCoderMode::sNUMERIC, content.Mid(flag, index - flag)});
196 } 180 }
197 flag = index; 181 flag = index;
198 if (index >= content.GetLength()) { 182 if (index >= content.GetLength()) {
199 return; 183 return;
200 } 184 }
201 while (GetAlphaNumericCode((uint8_t)content[index]) != -1 && 185 while (GetAlphaNumericCode((uint8_t)content[index]) != -1 &&
202 (index < content.GetLength())) { 186 (index < content.GetLength())) {
203 index++; 187 index++;
204 } 188 }
205 if (index != flag) { 189 if (index != flag) {
206 result->Add(new Make_Pair(CBC_QRCoderMode::sALPHANUMERIC, 190 result->push_back(
207 content.Mid(flag, index - flag))); 191 {CBC_QRCoderMode::sALPHANUMERIC, content.Mid(flag, index - flag)});
208 } 192 }
209 flag = index; 193 flag = index;
210 if (index < content.GetLength()) 194 if (index < content.GetLength())
211 SplitString(content.Mid(index, content.GetLength() - index), result); 195 SplitString(content.Mid(index, content.GetLength() - index), result);
212 } 196 }
213 197
214 int32_t CBC_QRCoderEncoder::GetSpanByVersion(CBC_QRCoderMode* modeFirst, 198 int32_t CBC_QRCoderEncoder::GetSpanByVersion(CBC_QRCoderMode* modeFirst,
215 CBC_QRCoderMode* modeSecond, 199 CBC_QRCoderMode* modeSecond,
216 int32_t versionNum, 200 int32_t versionNum,
217 int32_t& e) { 201 int32_t& e) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 } else if (versionNum >= 27 && versionNum <= 40) { 235 } else if (versionNum >= 27 && versionNum <= 40) {
252 return 9; 236 return 9;
253 } else { 237 } else {
254 e = BCExceptionNoSuchVersion; 238 e = BCExceptionNoSuchVersion;
255 BC_EXCEPTION_CHECK_ReturnValue(e, 0); 239 BC_EXCEPTION_CHECK_ReturnValue(e, 0);
256 } 240 }
257 } 241 }
258 return -1; 242 return -1;
259 } 243 }
260 244
261 void CBC_QRCoderEncoder::MergeString(CFX_ArrayTemplate<Make_Pair*>* result, 245 void CBC_QRCoderEncoder::MergeString(
262 int32_t versionNum, 246 std::vector<std::pair<CBC_QRCoderMode*, CFX_ByteString>>* result,
263 int32_t& e) { 247 int32_t versionNum,
264 Make_Pair* first = nullptr; 248 int32_t& e) {
265 Make_Pair* second = nullptr;
266 size_t mergeNum = 0; 249 size_t mergeNum = 0;
267 int32_t i; 250 for (size_t i = 0; i + 1 < result->size(); i++) {
268 for (i = 0; ((i < result->GetSize()) && (i + 1 < result->GetSize())); i++) { 251 auto element1 = &(*result)[i];
269 first = (*result)[i]; 252 auto element2 = &(*result)[i + 1];
270 second = (*result)[i + 1]; 253 if (element1->first == CBC_QRCoderMode::sALPHANUMERIC) {
271 if (first->m_mode == CBC_QRCoderMode::sALPHANUMERIC) {
272 int32_t tmp = GetSpanByVersion(CBC_QRCoderMode::sALPHANUMERIC, 254 int32_t tmp = GetSpanByVersion(CBC_QRCoderMode::sALPHANUMERIC,
273 CBC_QRCoderMode::sBYTE, versionNum, e); 255 CBC_QRCoderMode::sBYTE, versionNum, e);
274 BC_EXCEPTION_CHECK_ReturnVoid(e); 256 BC_EXCEPTION_CHECK_ReturnVoid(e);
275 if ((second->m_mode == CBC_QRCoderMode::sBYTE) && 257 if (element2->first == CBC_QRCoderMode::sBYTE &&
276 (first->m_string.GetLength() < tmp)) { 258 element1->second.GetLength() < tmp) {
277 CFX_ByteString str = first->m_string + second->m_string; 259 element2->second = element1->second + element2->second;
278 second->m_string = str; 260 result->erase(result->begin() + i);
279 delete first;
280 result->RemoveAt(i);
281 i--; 261 i--;
282 mergeNum++; 262 mergeNum++;
283 } 263 }
284 } else if (first->m_mode == CBC_QRCoderMode::sBYTE) { 264 } else if (element1->first == CBC_QRCoderMode::sBYTE) {
285 if (second->m_mode == CBC_QRCoderMode::sBYTE) { 265 if (element2->first == CBC_QRCoderMode::sBYTE) {
286 first->m_string += second->m_string; 266 element1->second += element2->second;
287 delete second; 267 result->erase(result->begin() + i + 1);
288 result->RemoveAt(i + 1);
289 i--; 268 i--;
290 mergeNum++; 269 mergeNum++;
291 } 270 }
292 } else if (first->m_mode == CBC_QRCoderMode::sNUMERIC) { 271 } else if (element1->first == CBC_QRCoderMode::sNUMERIC) {
293 int32_t tmp = GetSpanByVersion(CBC_QRCoderMode::sNUMERIC, 272 int32_t tmp = GetSpanByVersion(CBC_QRCoderMode::sNUMERIC,
294 CBC_QRCoderMode::sBYTE, versionNum, e); 273 CBC_QRCoderMode::sBYTE, versionNum, e);
295 BC_EXCEPTION_CHECK_ReturnVoid(e); 274 BC_EXCEPTION_CHECK_ReturnVoid(e);
296 if ((second->m_mode == CBC_QRCoderMode::sBYTE) && 275 if (element2->first == CBC_QRCoderMode::sBYTE &&
297 (first->m_string.GetLength() < tmp)) { 276 element1->second.GetLength() < tmp) {
298 CFX_ByteString str = first->m_string + second->m_string; 277 element2->second = element1->second + element2->second;
299 second->m_string = str; 278 result->erase(result->begin() + i);
300 delete first;
301 result->RemoveAt(i);
302 i--; 279 i--;
303 mergeNum++; 280 mergeNum++;
304 } 281 }
305 tmp = GetSpanByVersion(CBC_QRCoderMode::sNUMERIC, 282 tmp = GetSpanByVersion(CBC_QRCoderMode::sNUMERIC,
306 CBC_QRCoderMode::sALPHANUMERIC, versionNum, e); 283 CBC_QRCoderMode::sALPHANUMERIC, versionNum, e);
307 BC_EXCEPTION_CHECK_ReturnVoid(e); 284 BC_EXCEPTION_CHECK_ReturnVoid(e);
308 if ((second->m_mode == CBC_QRCoderMode::sALPHANUMERIC) && 285 if (element2->first == CBC_QRCoderMode::sALPHANUMERIC &&
309 (first->m_string.GetLength() < tmp)) { 286 element1->second.GetLength() < tmp) {
310 CFX_ByteString str = first->m_string + second->m_string; 287 element2->second = element1->second + element2->second;
311 second->m_string = str; 288 result->erase(result->begin() + i);
312 delete first;
313 result->RemoveAt(i);
314 i--; 289 i--;
315 mergeNum++; 290 mergeNum++;
316 } 291 }
317 } 292 }
318 } 293 }
319 if (mergeNum == 0) { 294 if (mergeNum == 0) {
320 return; 295 return;
321 } 296 }
322 MergeString(result, versionNum, e); 297 MergeString(result, versionNum, e);
323 BC_EXCEPTION_CHECK_ReturnVoid(e); 298 BC_EXCEPTION_CHECK_ReturnVoid(e);
(...skipping 29 matching lines...) Expand all
353 } 328 }
354 329
355 void CBC_QRCoderEncoder::EncodeWithSpecifyVersion( 330 void CBC_QRCoderEncoder::EncodeWithSpecifyVersion(
356 const CFX_ByteString& content, 331 const CFX_ByteString& content,
357 CBC_QRCoderErrorCorrectionLevel* ecLevel, 332 CBC_QRCoderErrorCorrectionLevel* ecLevel,
358 CBC_QRCoder* qrCode, 333 CBC_QRCoder* qrCode,
359 int32_t versionSpecify, 334 int32_t versionSpecify,
360 int32_t& e) { 335 int32_t& e) {
361 CFX_ByteString encoding = "utf8"; 336 CFX_ByteString encoding = "utf8";
362 CBC_QRCoderMode* mode = CBC_QRCoderMode::sBYTE; 337 CBC_QRCoderMode* mode = CBC_QRCoderMode::sBYTE;
363 CFX_ArrayTemplate<Make_Pair*> splitResult; 338 std::vector<std::pair<CBC_QRCoderMode*, CFX_ByteString>> splitResult;
364 CBC_QRCoderBitVector dataBits; 339 CBC_QRCoderBitVector dataBits;
365 dataBits.Init(); 340 dataBits.Init();
366 SplitString(content, &splitResult); 341 SplitString(content, &splitResult);
367 MergeString(&splitResult, versionSpecify, e); 342 MergeString(&splitResult, versionSpecify, e);
368 BC_EXCEPTION_CHECK_ReturnVoid(e) CBC_QRCoderMode* tempMode = nullptr; 343 BC_EXCEPTION_CHECK_ReturnVoid(e) CBC_QRCoderMode* tempMode = nullptr;
369 for (int32_t i = 0; i < splitResult.GetSize(); i++) { 344 for (const auto& result : splitResult) {
370 AppendBytes(splitResult[i]->m_string, splitResult[i]->m_mode, &dataBits, 345 AppendBytes(result.second, result.first, &dataBits, encoding, e);
371 encoding, e); 346 if (e != BCExceptionNO)
372 if (e != BCExceptionNO) {
373 for (int32_t y = 0; y < splitResult.GetSize(); y++)
374 delete splitResult[y];
375 return; 347 return;
376 }
377 } 348 }
378 int32_t numInputBytes = dataBits.sizeInBytes(); 349 int32_t numInputBytes = dataBits.sizeInBytes();
379 CBC_QRCoderBitVector headerAndDataBits; 350 CBC_QRCoderBitVector headerAndDataBits;
380 headerAndDataBits.Init(); 351 headerAndDataBits.Init();
381 InitQRCode(numInputBytes, versionSpecify, ecLevel, mode, qrCode, e); 352 InitQRCode(numInputBytes, versionSpecify, ecLevel, mode, qrCode, e);
382 if (e != BCExceptionNO) {
383 for (int32_t k = 0; k < splitResult.GetSize(); k++)
384 delete splitResult[k];
385 return;
386 }
387 AppendDataModeLenghInfo(splitResult, headerAndDataBits, tempMode, qrCode,
388 encoding, e);
389 if (e != BCExceptionNO) {
390 for (int32_t k = 0; k < splitResult.GetSize(); k++)
391 delete splitResult[k];
392 return;
393 }
394 numInputBytes = headerAndDataBits.sizeInBytes();
395 TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e);
396 for (int32_t j = 0; j < splitResult.GetSize(); j++) {
397 delete splitResult[j];
398 }
399 if (e != BCExceptionNO) 353 if (e != BCExceptionNO)
400 return; 354 return;
401 355
356 AppendDataModeLenghInfo(splitResult, headerAndDataBits, tempMode, qrCode,
357 encoding, e);
358 if (e != BCExceptionNO)
359 return;
360
361 numInputBytes = headerAndDataBits.sizeInBytes();
362 TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e);
363 if (e != BCExceptionNO)
364 return;
365
402 CBC_QRCoderBitVector finalBits; 366 CBC_QRCoderBitVector finalBits;
403 finalBits.Init(); 367 finalBits.Init();
404 InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(), 368 InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(),
405 qrCode->GetNumDataBytes(), qrCode->GetNumRSBlocks(), 369 qrCode->GetNumDataBytes(), qrCode->GetNumRSBlocks(),
406 &finalBits, e); 370 &finalBits, e);
407 BC_EXCEPTION_CHECK_ReturnVoid(e); 371 BC_EXCEPTION_CHECK_ReturnVoid(e);
408 std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix( 372 std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix(
409 qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth())); 373 qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()));
410 matrix->Init(); 374 matrix->Init();
411 int32_t maskPattern = ChooseMaskPattern( 375 int32_t maskPattern = ChooseMaskPattern(
(...skipping 11 matching lines...) Expand all
423 } 387 }
424 } 388 }
425 389
426 void CBC_QRCoderEncoder::EncodeWithAutoVersion( 390 void CBC_QRCoderEncoder::EncodeWithAutoVersion(
427 const CFX_ByteString& content, 391 const CFX_ByteString& content,
428 CBC_QRCoderErrorCorrectionLevel* ecLevel, 392 CBC_QRCoderErrorCorrectionLevel* ecLevel,
429 CBC_QRCoder* qrCode, 393 CBC_QRCoder* qrCode,
430 int32_t& e) { 394 int32_t& e) {
431 CFX_ByteString encoding = "utf8"; 395 CFX_ByteString encoding = "utf8";
432 CBC_QRCoderMode* mode = CBC_QRCoderMode::sBYTE; 396 CBC_QRCoderMode* mode = CBC_QRCoderMode::sBYTE;
433 CFX_ArrayTemplate<Make_Pair*> splitResult; 397 std::vector<std::pair<CBC_QRCoderMode*, CFX_ByteString>> splitResult;
434 CBC_QRCoderBitVector dataBits; 398 CBC_QRCoderBitVector dataBits;
435 dataBits.Init(); 399 dataBits.Init();
436 SplitString(content, &splitResult); 400 SplitString(content, &splitResult);
437 MergeString(&splitResult, 8, e); 401 MergeString(&splitResult, 8, e);
438 BC_EXCEPTION_CHECK_ReturnVoid(e); 402 BC_EXCEPTION_CHECK_ReturnVoid(e);
439 CBC_QRCoderMode* tempMode = nullptr; 403 CBC_QRCoderMode* tempMode = nullptr;
440 for (int32_t i = 0; i < splitResult.GetSize(); i++) { 404 for (const auto& result : splitResult) {
441 AppendBytes(splitResult[i]->m_string, splitResult[i]->m_mode, &dataBits, 405 AppendBytes(result.second, result.first, &dataBits, encoding, e);
442 encoding, e); 406 if (e != BCExceptionNO)
443 if (e != BCExceptionNO) {
444 for (int32_t l = 0; l < splitResult.GetSize(); l++)
445 delete splitResult[l];
446 return; 407 return;
447 }
448 } 408 }
449 int32_t numInputBytes = dataBits.sizeInBytes(); 409 int32_t numInputBytes = dataBits.sizeInBytes();
450 InitQRCode(numInputBytes, ecLevel, mode, qrCode, e); 410 InitQRCode(numInputBytes, ecLevel, mode, qrCode, e);
451 BC_EXCEPTION_CHECK_ReturnVoid(e) CBC_QRCoderBitVector headerAndDataBits; 411 BC_EXCEPTION_CHECK_ReturnVoid(e) CBC_QRCoderBitVector headerAndDataBits;
452 headerAndDataBits.Init(); 412 headerAndDataBits.Init();
453 tempMode = nullptr; 413 tempMode = nullptr;
454 int32_t versionNum = qrCode->GetVersion(); 414 int32_t versionNum = qrCode->GetVersion();
455 sign: 415 sign:
456 AppendDataModeLenghInfo(splitResult, headerAndDataBits, tempMode, qrCode, 416 AppendDataModeLenghInfo(splitResult, headerAndDataBits, tempMode, qrCode,
457 encoding, e); 417 encoding, e);
(...skipping 12 matching lines...) Expand all
470 if (e1 != BCExceptionNO) { 430 if (e1 != BCExceptionNO) {
471 e = e1; 431 e = e1;
472 return; 432 return;
473 } 433 }
474 versionNum++; 434 versionNum++;
475 if (versionNum <= 40) { 435 if (versionNum <= 40) {
476 headerAndDataBits.Clear(); 436 headerAndDataBits.Clear();
477 e = BCExceptionNO; 437 e = BCExceptionNO;
478 goto sign; 438 goto sign;
479 } else { 439 } else {
480 for (int32_t j = 0; j < splitResult.GetSize(); j++)
481 delete splitResult[j];
482 return; 440 return;
483 } 441 }
484 } 442 }
485 for (int32_t k = 0; k < splitResult.GetSize(); k++)
486 delete splitResult[k];
487 443
488 CBC_QRCoderBitVector finalBits; 444 CBC_QRCoderBitVector finalBits;
489 finalBits.Init(); 445 finalBits.Init();
490 InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(), 446 InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(),
491 qrCode->GetNumDataBytes(), qrCode->GetNumRSBlocks(), 447 qrCode->GetNumDataBytes(), qrCode->GetNumRSBlocks(),
492 &finalBits, e); 448 &finalBits, e);
493 BC_EXCEPTION_CHECK_ReturnVoid(e); 449 BC_EXCEPTION_CHECK_ReturnVoid(e);
494 std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix( 450 std::unique_ptr<CBC_CommonByteMatrix> matrix(new CBC_CommonByteMatrix(
495 qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth())); 451 qrCode->GetMatrixWidth(), qrCode->GetMatrixWidth()));
496 matrix->Init(); 452 matrix->Init();
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 } 604 }
649 if (hasAlphaNumeric) { 605 if (hasAlphaNumeric) {
650 return CBC_QRCoderMode::sALPHANUMERIC; 606 return CBC_QRCoderMode::sALPHANUMERIC;
651 } else if (hasNumeric) { 607 } else if (hasNumeric) {
652 return CBC_QRCoderMode::sNUMERIC; 608 return CBC_QRCoderMode::sNUMERIC;
653 } 609 }
654 return CBC_QRCoderMode::sBYTE; 610 return CBC_QRCoderMode::sBYTE;
655 } 611 }
656 612
657 int32_t CBC_QRCoderEncoder::GetAlphaNumericCode(int32_t code) { 613 int32_t CBC_QRCoderEncoder::GetAlphaNumericCode(int32_t code) {
658 if (code < 96 && code >= 0) { 614 return (code >= 0 && code < 96) ? g_alphaNumericTable[code] : -1;
659 return m_alphaNumbericTable[code];
660 }
661 return -1;
662 } 615 }
663 616
664 void CBC_QRCoderEncoder::AppendBytes(const CFX_ByteString& content, 617 void CBC_QRCoderEncoder::AppendBytes(const CFX_ByteString& content,
665 CBC_QRCoderMode* mode, 618 CBC_QRCoderMode* mode,
666 CBC_QRCoderBitVector* bits, 619 CBC_QRCoderBitVector* bits,
667 CFX_ByteString encoding, 620 CFX_ByteString encoding,
668 int32_t& e) { 621 int32_t& e) {
669 if (mode == CBC_QRCoderMode::sNUMERIC) { 622 if (mode == CBC_QRCoderMode::sNUMERIC) {
670 AppendNumericBytes(content, bits, e); 623 AppendNumericBytes(content, bits, e);
671 BC_EXCEPTION_CHECK_ReturnVoid(e); 624 BC_EXCEPTION_CHECK_ReturnVoid(e);
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
962 CBC_ReedSolomonEncoder encode(CBC_ReedSolomonGF256::QRCodeField); 915 CBC_ReedSolomonEncoder encode(CBC_ReedSolomonGF256::QRCodeField);
963 encode.Init(); 916 encode.Init();
964 encode.Encode(&toEncode, numEcBytesInBlock, e); 917 encode.Encode(&toEncode, numEcBytesInBlock, e);
965 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr); 918 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
966 CBC_CommonByteArray* ecBytes = new CBC_CommonByteArray(numEcBytesInBlock); 919 CBC_CommonByteArray* ecBytes = new CBC_CommonByteArray(numEcBytesInBlock);
967 for (int32_t j = 0; j < numEcBytesInBlock; j++) { 920 for (int32_t j = 0; j < numEcBytesInBlock; j++) {
968 ecBytes->Set(j, toEncode[numDataBytes + j]); 921 ecBytes->Set(j, toEncode[numDataBytes + j]);
969 } 922 }
970 return ecBytes; 923 return ecBytes;
971 } 924 }
OLDNEW
« no previous file with comments | « xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698