Files
rxing/src/common/cpp_essentials/base_extentions/bitmatrix.rs
Henry Schimke c2ca7fa2b0 port find bounding box
though it might not need to be ported, evaluate removing later.
2023-03-21 11:59:56 -05:00

103 lines
2.6 KiB
Rust

use crate::common::BitMatrix;
use crate::common::Result;
use crate::point;
use crate::Point;
impl BitMatrix {
pub fn Deflate(
&self,
width: u32,
height: u32,
top: f32,
left: f32,
subSampling: f32,
) -> Result<Self> {
let mut result = BitMatrix::new(width, height)?;
for y in 0..result.height() {
// for (int y = 0; y < result.height(); y++) {
let yOffset = top + y as f32 * subSampling;
for x in 0..result.width() {
// for (int x = 0; x < result.width(); x++) {
if self.get_point(point(left + x as f32 * subSampling, yOffset)) {
result.set(x, y);
}
}
}
Ok(result)
}
pub fn getTopLeftOnBitWithPosition(&self, left: &mut u32, top: &mut u32) -> bool {
let Some(Point{x,y}) = self.getTopLeftOnBit() else {
return false;
};
*left = x as u32;
*top = y as u32;
true
}
pub fn getBottomRightOnBitWithPosition(&self, right: &mut u32, bottom: &mut u32) -> bool {
let Some(Point{x,y}) = self.getBottomRightOnBit() else {
return false;
};
*right = x as u32;
*bottom = y as u32;
true
}
pub fn findBoundingBox(
&self,
left: u32,
top: u32,
width: u32,
height: u32,
minSize: u32,
) -> (bool, u32, u32, u32, u32) {
let mut left = left;
let mut top = top;
let mut width = width;
let mut height = height;
let mut right = 0;
let mut bottom = 0;
if (!self.getTopLeftOnBitWithPosition(&mut left, &mut top)
|| !self.getBottomRightOnBitWithPosition(&mut right, &mut bottom)
|| bottom - top + 1 < minSize)
{
return (false, left, top, width, height);
}
for y in top..=bottom {
// for (int y = top; y <= bottom; y++ ) {
for x in 0..left {
// for (int x = 0; x < left; ++x){
if (self.get(x, y)) {
left = x;
break;
}
}
for x in (right..(self.width() - 1)).rev() {
// for (int x = _width-1; x > right; x--){
if (self.get(x, y)) {
right = x;
break;
}
}
}
width = right - left + 1;
height = bottom - top + 1;
(
width >= minSize && height >= minSize,
left,
top,
width,
height,
)
}
}