diff --git a/src/qrcode/detector/FinderPattern.java b/src/qrcode/detector/FinderPattern.java deleted file mode 100644 index 2c256fa..0000000 --- a/src/qrcode/detector/FinderPattern.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2007 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.qrcode.detector; - -import com.google.zxing.RXingResultPoint; - -/** - *

Encapsulates a finder pattern, which are the three square patterns found in - * the corners of QR Codes. It also encapsulates a count of similar finder patterns, - * as a convenience to the finder's bookkeeping.

- * - * @author Sean Owen - */ -public final class FinderPattern extends RXingResultPoint { - - private final float estimatedModuleSize; - private final int count; - - FinderPattern(float posX, float posY, float estimatedModuleSize) { - this(posX, posY, estimatedModuleSize, 1); - } - - private FinderPattern(float posX, float posY, float estimatedModuleSize, int count) { - super(posX, posY); - this.estimatedModuleSize = estimatedModuleSize; - this.count = count; - } - - public float getEstimatedModuleSize() { - return estimatedModuleSize; - } - - public int getCount() { - return count; - } - - /** - *

Determines if this finder pattern "about equals" a finder pattern at the stated - * position and size -- meaning, it is at nearly the same center with nearly the same size.

- */ - boolean aboutEquals(float moduleSize, float i, float j) { - if (Math.abs(i - getY()) <= moduleSize && Math.abs(j - getX()) <= moduleSize) { - float moduleSizeDiff = Math.abs(moduleSize - estimatedModuleSize); - return moduleSizeDiff <= 1.0f || moduleSizeDiff <= estimatedModuleSize; - } - return false; - } - - /** - * Combines this object's current estimate of a finder pattern position and module size - * with a new estimate. It returns a new {@code FinderPattern} containing a weighted average - * based on count. - */ - FinderPattern combineEstimate(float i, float j, float newModuleSize) { - int combinedCount = count + 1; - float combinedX = (count * getX() + j) / combinedCount; - float combinedY = (count * getY() + i) / combinedCount; - float combinedModuleSize = (count * estimatedModuleSize + newModuleSize) / combinedCount; - return new FinderPattern(combinedX, combinedY, combinedModuleSize, combinedCount); - } - -} diff --git a/src/qrcode/detector/finder_pattern.rs b/src/qrcode/detector/finder_pattern.rs new file mode 100644 index 0000000..2f82baf --- /dev/null +++ b/src/qrcode/detector/finder_pattern.rs @@ -0,0 +1,85 @@ +/* + * Copyright 2007 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. + */ + +use crate::RXingResultPoint; + +/** + *

Encapsulates a finder pattern, which are the three square patterns found in + * the corners of QR Codes. It also encapsulates a count of similar finder patterns, + * as a convenience to the finder's bookkeeping.

+ * + * @author Sean Owen + */ +pub struct FinderPattern { + estimatedModuleSize: f32, + count: usize, + internal_result_point: RXingResultPoint, +} + +impl FinderPattern { + pub fn new(posX: f32, posY: f32, estimatedModuleSize: f32) -> Self { + Self::private_new(posX, posY, estimatedModuleSize, 1) + } + + fn private_new(posX: f32, posY: f32, estimatedModuleSize: f32, count: usize) -> Self { + Self { + estimatedModuleSize, + count, + internal_result_point: RXingResultPoint::new(posX, posY), + } + } + + pub fn getEstimatedModuleSize(&self) -> f32 { + self.estimatedModuleSize + } + + pub fn getCount(&self) -> usize { + self.count + } + + /** + *

Determines if this finder pattern "about equals" a finder pattern at the stated + * position and size -- meaning, it is at nearly the same center with nearly the same size.

+ */ + pub fn aboutEquals(&self, moduleSize: f32, i: f32, j: f32) -> bool { + if (i - self.internal_result_point.getY()).abs() <= moduleSize + && (j - self.internal_result_point.getX()).abs() <= moduleSize + { + let moduleSizeDiff = (moduleSize - self.estimatedModuleSize).abs(); + return moduleSizeDiff <= 1.0 || moduleSizeDiff <= self.estimatedModuleSize; + } + return false; + } + + /** + * Combines this object's current estimate of a finder pattern position and module size + * with a new estimate. It returns a new {@code FinderPattern} containing a weighted average + * based on count. + */ + pub fn combineEstimate(&self, i: f32, j: f32, newModuleSize: f32) -> FinderPattern { + let combinedCount = self.count as f32 + 1.0; + let combinedX = (self.count as f32 * self.internal_result_point.getX() + j) / combinedCount; + let combinedY = (self.count as f32 * self.internal_result_point.getY() + i) / combinedCount; + let combinedModuleSize = + (self.count as f32 * self.estimatedModuleSize + newModuleSize) / combinedCount; + FinderPattern::private_new( + combinedX, + combinedY, + combinedModuleSize, + combinedCount.floor() as usize, + ) + } +} diff --git a/src/qrcode/detector/FinderPatternInfo.java b/src/qrcode/detector/finder_pattern_info.rs similarity index 55% rename from src/qrcode/detector/FinderPatternInfo.java rename to src/qrcode/detector/finder_pattern_info.rs index 3c34010..c16264f 100644 --- a/src/qrcode/detector/FinderPatternInfo.java +++ b/src/qrcode/detector/finder_pattern_info.rs @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.zxing.qrcode.detector; +use super::FinderPattern; /** *

Encapsulates information about finder patterns in an image, including the location of @@ -22,28 +22,30 @@ package com.google.zxing.qrcode.detector; * * @author Sean Owen */ -public final class FinderPatternInfo { - - private final FinderPattern bottomLeft; - private final FinderPattern topLeft; - private final FinderPattern topRight; - - public FinderPatternInfo(FinderPattern[] patternCenters) { - this.bottomLeft = patternCenters[0]; - this.topLeft = patternCenters[1]; - this.topRight = patternCenters[2]; - } - - public FinderPattern getBottomLeft() { - return bottomLeft; - } - - public FinderPattern getTopLeft() { - return topLeft; - } - - public FinderPattern getTopRight() { - return topRight; - } - +pub struct FinderPatternInfo { + bottomLeft: FinderPattern, + topLeft: FinderPattern, + topRight: FinderPattern, +} + +impl FinderPatternInfo { + pub fn new(patternCenters: [FinderPattern; 3]) -> Self { + Self { + bottomLeft: patternCenters[0], + topLeft: patternCenters[1], + topRight: patternCenters[2], + } + } + + pub fn getBottomLeft(&self) -> &FinderPattern { + &self.bottomLeft + } + + pub fn getTopLeft(&self) -> &FinderPattern { + &self.topLeft + } + + pub fn getTopRight(&self) -> &FinderPattern { + &self.topRight + } } diff --git a/src/qrcode/detector/mod.rs b/src/qrcode/detector/mod.rs index e69de29..2f000c7 100644 --- a/src/qrcode/detector/mod.rs +++ b/src/qrcode/detector/mod.rs @@ -0,0 +1,5 @@ +mod finder_pattern_info; +mod finder_pattern; + +pub use finder_pattern_info::*; +pub use finder_pattern::*; \ No newline at end of file