mirror of
https://github.com/starovoid/rxing.git
synced 2026-07-26 04:12:34 +00:00
174 lines
7.1 KiB
Rust
174 lines
7.1 KiB
Rust
/*
|
||
* Copyright 2010 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.
|
||
*/
|
||
// package com::google::zxing::oned;
|
||
|
||
/**
|
||
* This object renders a CODE39 code as a {@link BitMatrix}.
|
||
*
|
||
* @author erik.barbara@gmail.com (Erik Barbara)
|
||
*/
|
||
pub struct Code39Writer {
|
||
super: OneDimensionalCodeWriter;
|
||
}
|
||
|
||
impl Code39Writer {
|
||
|
||
pub fn get_supported_write_formats(&self) -> Collection<BarcodeFormat> {
|
||
return Collections::singleton(BarcodeFormat::CODE_39);
|
||
}
|
||
|
||
pub fn encode(&self, contents: &String) -> Vec<bool> {
|
||
let mut length: i32 = contents.length();
|
||
if length > 80 {
|
||
throw IllegalArgumentException::new(format!("Requested contents should be less than 80 digits long, but got {}", length));
|
||
}
|
||
{
|
||
let mut i: i32 = 0;
|
||
while i < length {
|
||
{
|
||
let index_in_string: i32 = Code39Reader::ALPHABET_STRING::index_of(&contents.char_at(i));
|
||
if index_in_string < 0 {
|
||
contents = ::try_to_convert_to_extended_mode(&contents);
|
||
length = contents.length();
|
||
if length > 80 {
|
||
throw IllegalArgumentException::new(format!("Requested contents should be less than 80 digits long, but got {} (extended full ASCII mode)", length));
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
i += 1;
|
||
}
|
||
}
|
||
|
||
let widths: [i32; 9] = [0; 9];
|
||
let code_width: i32 = 24 + 1 + (13 * length);
|
||
let result: [bool; code_width] = [false; code_width];
|
||
::to_int_array(Code39Reader::ASTERISK_ENCODING, &widths);
|
||
let mut pos: i32 = append_pattern(&result, 0, &widths, true);
|
||
let narrow_white: vec![Vec<i32>; 1] = vec![1, ]
|
||
;
|
||
pos += append_pattern(&result, pos, &narrow_white, false);
|
||
//append next character to byte matrix
|
||
{
|
||
let mut i: i32 = 0;
|
||
while i < length {
|
||
{
|
||
let index_in_string: i32 = Code39Reader::ALPHABET_STRING::index_of(&contents.char_at(i));
|
||
::to_int_array(Code39Reader::CHARACTER_ENCODINGS[index_in_string], &widths);
|
||
pos += append_pattern(&result, pos, &widths, true);
|
||
pos += append_pattern(&result, pos, &narrow_white, false);
|
||
}
|
||
i += 1;
|
||
}
|
||
}
|
||
|
||
::to_int_array(Code39Reader::ASTERISK_ENCODING, &widths);
|
||
append_pattern(&result, pos, &widths, true);
|
||
return result;
|
||
}
|
||
|
||
fn to_int_array( a: i32, to_return: &Vec<i32>) {
|
||
{
|
||
let mut i: i32 = 0;
|
||
while i < 9 {
|
||
{
|
||
let temp: i32 = a & (1 << (8 - i));
|
||
to_return[i] = if temp == 0 { 1 } else { 2 };
|
||
}
|
||
i += 1;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
fn try_to_convert_to_extended_mode( contents: &String) -> String {
|
||
let length: i32 = contents.length();
|
||
let extended_content: StringBuilder = StringBuilder::new();
|
||
{
|
||
let mut i: i32 = 0;
|
||
while i < length {
|
||
{
|
||
let character: char = contents.char_at(i);
|
||
match character {
|
||
' |