Merge branch 'nayuki:master' into master

pull/206/head
Michael Wipplinger 5 months ago committed by GitHub
commit 8ed52def58
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1111,21 +1111,12 @@ impl<'a> QrSegment<'a> {
/// ///
/// Panics if the string contains non-digit characters. /// Panics if the string contains non-digit characters.
pub fn make_numeric(text: &str, buf: &'a mut [u8]) -> Self { pub fn make_numeric(text: &str, buf: &'a mut [u8]) -> Self {
assert!(text.bytes().all(|b| (b'0' ..= b'9').contains(&b)), "String contains non-numeric characters");
let mut bb = BitBuffer::new(buf); let mut bb = BitBuffer::new(buf);
let mut accumdata: u32 = 0; for chunk in text.as_bytes().chunks(3) {
let mut accumcount: u8 = 0; let data: u32 = chunk.iter().fold(0u32,
for b in text.bytes() { |acc, &b| acc * 10 + u32::from(b - b'0'));
assert!((b'0' ..= b'9').contains(&b), "String contains non-numeric characters"); bb.append_bits(data, (chunk.len() as u8) * 3 + 1);
accumdata = accumdata * 10 + u32::from(b - b'0');
accumcount += 1;
if accumcount == 3 {
bb.append_bits(accumdata, 10);
accumdata = 0;
accumcount = 0;
}
}
if accumcount > 0 { // 1 or 2 digits remaining
bb.append_bits(accumdata, accumcount * 3 + 1);
} }
QrSegment::new(QrSegmentMode::Numeric, text.len(), bb.data, bb.length) QrSegment::new(QrSegmentMode::Numeric, text.len(), bb.data, bb.length)
} }
@ -1139,21 +1130,10 @@ impl<'a> QrSegment<'a> {
/// Panics if the string contains non-encodable characters. /// Panics if the string contains non-encodable characters.
pub fn make_alphanumeric(text: &str, buf: &'a mut [u8]) -> Self { pub fn make_alphanumeric(text: &str, buf: &'a mut [u8]) -> Self {
let mut bb = BitBuffer::new(buf); let mut bb = BitBuffer::new(buf);
let mut accumdata: u32 = 0; for chunk in text.as_bytes().chunks(2) {
let mut accumcount: u8 = 0; let data: u32 = chunk.iter().fold(0u32, |acc, &b| acc * 45 + u32::try_from(
for c in text.chars() { ALPHANUMERIC_CHARSET.find(char::from(b)).expect("String contains unencodable characters in alphanumeric mode")).unwrap());
let i: usize = ALPHANUMERIC_CHARSET.find(c) bb.append_bits(data, (chunk.len() as u8) * 5 + 1);
.expect("String contains unencodable characters in alphanumeric mode");
accumdata = accumdata * 45 + u32::try_from(i).unwrap();
accumcount += 1;
if accumcount == 2 {
bb.append_bits(accumdata, 11);
accumdata = 0;
accumcount = 0;
}
}
if accumcount > 0 { // 1 character remaining
bb.append_bits(accumdata, 6);
} }
QrSegment::new(QrSegmentMode::Alphanumeric, text.len(), bb.data, bb.length) QrSegment::new(QrSegmentMode::Alphanumeric, text.len(), bb.data, bb.length)
} }

@ -973,7 +973,7 @@ impl QrSegment {
/// ///
/// Any text string can be converted to UTF-8 bytes and encoded as a byte mode segment. /// Any text string can be converted to UTF-8 bytes and encoded as a byte mode segment.
pub fn make_bytes(data: &[u8]) -> Self { pub fn make_bytes(data: &[u8]) -> Self {
let mut bb = BitBuffer(Vec::with_capacity(data.len() * 8)); let mut bb = BitBuffer(Vec::with_capacity(data.len().checked_mul(8).unwrap()));
for &b in data { for &b in data {
bb.append_bits(u32::from(b), 8); bb.append_bits(u32::from(b), 8);
} }
@ -985,21 +985,13 @@ impl QrSegment {
/// ///
/// Panics if the string contains non-digit characters. /// Panics if the string contains non-digit characters.
pub fn make_numeric(text: &str) -> Self { pub fn make_numeric(text: &str) -> Self {
let mut bb = BitBuffer(Vec::with_capacity(text.len() * 3 + (text.len() + 2) / 3)); assert!(text.bytes().all(|b| (b'0' ..= b'9').contains(&b)), "String contains non-numeric characters");
let mut accumdata: u32 = 0; let mut bb = BitBuffer(Vec::with_capacity(
let mut accumcount: u8 = 0; text.len().checked_mul(3).unwrap().checked_add(text.len().div_ceil(3)).unwrap()));
for b in text.bytes() { for chunk in text.as_bytes().chunks(3) {
assert!((b'0' ..= b'9').contains(&b), "String contains non-numeric characters"); let data: u32 = chunk.iter().fold(0u32,
accumdata = accumdata * 10 + u32::from(b - b'0'); |acc, &b| acc * 10 + u32::from(b - b'0'));
accumcount += 1; bb.append_bits(data, (chunk.len() as u8) * 3 + 1);
if accumcount == 3 {
bb.append_bits(accumdata, 10);
accumdata = 0;
accumcount = 0;
}
}
if accumcount > 0 { // 1 or 2 digits remaining
bb.append_bits(accumdata, accumcount * 3 + 1);
} }
QrSegment::new(QrSegmentMode::Numeric, text.len(), bb.0) QrSegment::new(QrSegmentMode::Numeric, text.len(), bb.0)
} }
@ -1012,22 +1004,12 @@ impl QrSegment {
/// ///
/// Panics if the string contains non-encodable characters. /// Panics if the string contains non-encodable characters.
pub fn make_alphanumeric(text: &str) -> Self { pub fn make_alphanumeric(text: &str) -> Self {
let mut bb = BitBuffer(Vec::with_capacity(text.len() * 5 + (text.len() + 1) / 2)); let mut bb = BitBuffer(Vec::with_capacity(
let mut accumdata: u32 = 0; text.len().checked_mul(5).unwrap().checked_add(text.len().div_ceil(2)).unwrap()));
let mut accumcount: u32 = 0; for chunk in text.as_bytes().chunks(2) {
for c in text.chars() { let data: u32 = chunk.iter().fold(0u32, |acc, &b| acc * 45 + u32::try_from(
let i: usize = ALPHANUMERIC_CHARSET.find(c) ALPHANUMERIC_CHARSET.find(char::from(b)).expect("String contains unencodable characters in alphanumeric mode")).unwrap());
.expect("String contains unencodable characters in alphanumeric mode"); bb.append_bits(data, (chunk.len() as u8) * 5 + 1);
accumdata = accumdata * 45 + u32::try_from(i).unwrap();
accumcount += 1;
if accumcount == 2 {
bb.append_bits(accumdata, 11);
accumdata = 0;
accumcount = 0;
}
}
if accumcount > 0 { // 1 character remaining
bb.append_bits(accumdata, 6);
} }
QrSegment::new(QrSegmentMode::Alphanumeric, text.len(), bb.0) QrSegment::new(QrSegmentMode::Alphanumeric, text.len(), bb.0)
} }

@ -44,17 +44,16 @@
white-space: pre; white-space: pre;
padding-right: 0.5em; padding-right: 0.5em;
} }
input[type=number], input[type=text], textarea { input, textarea {
font-size: inherit; font-size: inherit;
font-family: inherit; font-family: inherit;
} }
input[type=radio], input[type=checkbox] { input[type=radio], input[type=checkbox] {
margin: 0em; margin: 0em 0.2em 0em 0em;
padding: 0em; padding: 0em;
} }
input[type=radio] + label, input[type=checkbox] + label { label + label {
margin-right: 0.8em; margin-left: 0.8em;
padding-left: 0.2em;
} }
hr { hr {
margin: 2em 0em; margin: 2em 0em;
@ -91,17 +90,17 @@
<tr> <tr>
<td><strong>Error correction:</strong></td> <td><strong>Error correction:</strong></td>
<td> <td>
<input type="radio" name="errcorlvl" id="errcorlvl-low" checked="checked"><label for="errcorlvl-low">Low</label> <label><input type="radio" name="errcorlvl" id="errcorlvl-low" checked="checked">Low</label>
<input type="radio" name="errcorlvl" id="errcorlvl-medium"><label for="errcorlvl-medium">Medium</label> <label><input type="radio" name="errcorlvl" id="errcorlvl-medium">Medium</label>
<input type="radio" name="errcorlvl" id="errcorlvl-quartile"><label for="errcorlvl-quartile">Quartile</label> <label><input type="radio" name="errcorlvl" id="errcorlvl-quartile">Quartile</label>
<input type="radio" name="errcorlvl" id="errcorlvl-high"><label for="errcorlvl-high">High</label> <label><input type="radio" name="errcorlvl" id="errcorlvl-high">High</label>
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Output format:</td> <td>Output format:</td>
<td> <td>
<input type="radio" name="output-format" id="output-format-bitmap" checked="checked"><label for="output-format-bitmap">Bitmap</label> <label><input type="radio" name="output-format" id="output-format-bitmap" checked="checked">Bitmap</label>
<input type="radio" name="output-format" id="output-format-vector"><label for="output-format-vector">Vector</label> <label><input type="radio" name="output-format" id="output-format-vector">Vector</label>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -132,7 +131,7 @@
</tr> </tr>
<tr> <tr>
<td>Boost ECC:</td> <td>Boost ECC:</td>
<td><input type="checkbox" checked="checked" id="boost-ecc-input"><label for="boost-ecc-input">Increase <abbr title="error-correcting code">ECC</abbr> level within same version</label></td> <td><label><input type="checkbox" checked="checked" id="boost-ecc-input">Increase <abbr title="error-correcting code">ECC</abbr> level within same version</label></td>
</tr> </tr>
<tr> <tr>
<td>Statistics:</td> <td>Statistics:</td>

Loading…
Cancel
Save