"Split" ReaderException into subclasses to enable more useful error reporting

git-svn-id: https://zxing.googlecode.com/svn/trunk@1195 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
srowen 2010-02-02 08:23:46 +00:00
parent f9b648c131
commit 5ef5f3b02d
88 changed files with 663 additions and 454 deletions

View file

@ -55,7 +55,7 @@ public abstract class Binarizer {
* If used, the Binarizer will call BitArray.clear(). Always use the returned object. * If used, the Binarizer will call BitArray.clear(). Always use the returned object.
* @return The array of bits for this row (true means black). * @return The array of bits for this row (true means black).
*/ */
public abstract BitArray getBlackRow(int y, BitArray row) throws ReaderException; public abstract BitArray getBlackRow(int y, BitArray row) throws NotFoundException;
/** /**
* Converts a 2D array of luminance data to 1 bit data. As above, assume this method is expensive * Converts a 2D array of luminance data to 1 bit data. As above, assume this method is expensive
@ -65,7 +65,7 @@ public abstract class Binarizer {
* *
* @return The 2D array of bits for the image (true means black). * @return The 2D array of bits for the image (true means black).
*/ */
public abstract BitMatrix getBlackMatrix() throws ReaderException; public abstract BitMatrix getBlackMatrix() throws NotFoundException;
/** /**
* Creates a new object with the same type as this Binarizer implementation, but with pristine * Creates a new object with the same type as this Binarizer implementation, but with pristine

View file

@ -62,7 +62,7 @@ public final class BinaryBitmap {
* If used, the Binarizer will call BitArray.clear(). Always use the returned object. * If used, the Binarizer will call BitArray.clear(). Always use the returned object.
* @return The array of bits for this row (true means black). * @return The array of bits for this row (true means black).
*/ */
public BitArray getBlackRow(int y, BitArray row) throws ReaderException { public BitArray getBlackRow(int y, BitArray row) throws NotFoundException {
return binarizer.getBlackRow(y, row); return binarizer.getBlackRow(y, row);
} }
@ -74,7 +74,7 @@ public final class BinaryBitmap {
* *
* @return The 2D array of bits for the image (true means black). * @return The 2D array of bits for the image (true means black).
*/ */
public BitMatrix getBlackMatrix() throws ReaderException { public BitMatrix getBlackMatrix() throws NotFoundException {
// The matrix is created on demand the first time it is requested, then cached. There are two // The matrix is created on demand the first time it is requested, then cached. There are two
// reasons for this: // reasons for this:
// 1. This work will never be done if the caller only installs 1D Reader objects, or if a // 1. This work will never be done if the caller only installs 1D Reader objects, or if a

View file

@ -0,0 +1,37 @@
/*
* 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;
/**
* Thrown when a barcode was successfully detected and decoded, but
* was not returned because its checksum feature failed.
*
* @author Sean Owen
*/
public final class ChecksumException extends ReaderException {
private static final ChecksumException instance = new ChecksumException();
private ChecksumException() {
// do nothing
}
public static ChecksumException getChecksumInstance() {
return instance;
}
}

View file

@ -0,0 +1,38 @@
/*
* 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;
/**
* Thrown when a barcode was successfully detected, but some aspect of
* the content did not conform to the barcode's format rules. This could have
* been due to a mis-detection.
*
* @author Sean Owen
*/
public final class FormatException extends ReaderException {
private static final FormatException instance = new FormatException();
private FormatException() {
// do nothing
}
public static FormatException getFormatInstance() {
return instance;
}
}

View file

@ -16,10 +16,10 @@
package com.google.zxing; package com.google.zxing;
import com.google.zxing.datamatrix.DataMatrixReader;
import com.google.zxing.oned.MultiFormatOneDReader; import com.google.zxing.oned.MultiFormatOneDReader;
import com.google.zxing.pdf417.PDF417Reader; import com.google.zxing.pdf417.PDF417Reader;
import com.google.zxing.qrcode.QRCodeReader; import com.google.zxing.qrcode.QRCodeReader;
import com.google.zxing.datamatrix.DataMatrixReader;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Vector; import java.util.Vector;
@ -44,9 +44,9 @@ public final class MultiFormatReader implements Reader {
* *
* @param image The pixel data to decode * @param image The pixel data to decode
* @return The contents of the image * @return The contents of the image
* @throws ReaderException Any errors which occurred * @throws NotFoundException Any errors which occurred
*/ */
public Result decode(BinaryBitmap image) throws ReaderException { public Result decode(BinaryBitmap image) throws NotFoundException {
setHints(null); setHints(null);
return decodeInternal(image); return decodeInternal(image);
} }
@ -57,9 +57,9 @@ public final class MultiFormatReader implements Reader {
* @param image The pixel data to decode * @param image The pixel data to decode
* @param hints The hints to use, clearing the previous state. * @param hints The hints to use, clearing the previous state.
* @return The contents of the image * @return The contents of the image
* @throws ReaderException Any errors which occurred * @throws NotFoundException Any errors which occurred
*/ */
public Result decode(BinaryBitmap image, Hashtable hints) throws ReaderException { public Result decode(BinaryBitmap image, Hashtable hints) throws NotFoundException {
setHints(hints); setHints(hints);
return decodeInternal(image); return decodeInternal(image);
} }
@ -70,9 +70,9 @@ public final class MultiFormatReader implements Reader {
* *
* @param image The pixel data to decode * @param image The pixel data to decode
* @return The contents of the image * @return The contents of the image
* @throws ReaderException Any errors which occurred * @throws NotFoundException Any errors which occurred
*/ */
public Result decodeWithState(BinaryBitmap image) throws ReaderException { public Result decodeWithState(BinaryBitmap image) throws NotFoundException {
// Make sure to set up the default state so we don't crash // Make sure to set up the default state so we don't crash
if (readers == null) { if (readers == null) {
setHints(null); setHints(null);
@ -147,7 +147,7 @@ public final class MultiFormatReader implements Reader {
} }
} }
private Result decodeInternal(BinaryBitmap image) throws ReaderException { private Result decodeInternal(BinaryBitmap image) throws NotFoundException {
int size = readers.size(); int size = readers.size();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
Reader reader = (Reader) readers.elementAt(i); Reader reader = (Reader) readers.elementAt(i);
@ -158,7 +158,7 @@ public final class MultiFormatReader implements Reader {
} }
} }
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
} }

View file

@ -0,0 +1,37 @@
/*
* 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;
/**
* Thrown when a barcode was not found in the image. It might have been
* partially detected but could not be confirmed.
*
* @author Sean Owen
*/
public final class NotFoundException extends ReaderException {
private static final NotFoundException instance = new NotFoundException();
private NotFoundException() {
// do nothing
}
public static NotFoundException getNotFoundInstance() {
return instance;
}
}

View file

@ -37,9 +37,9 @@ public interface Reader {
* *
* @param image image of barcode to decode * @param image image of barcode to decode
* @return String which the barcode encodes * @return String which the barcode encodes
* @throws ReaderException if the barcode cannot be located or decoded for any reason * @throws NotFoundException if the barcode cannot be located or decoded for any reason
*/ */
Result decode(BinaryBitmap image) throws ReaderException; Result decode(BinaryBitmap image) throws NotFoundException, ChecksumException, FormatException;
/** /**
* Locates and decodes a barcode in some format within an image. This method also accepts * Locates and decodes a barcode in some format within an image. This method also accepts
@ -51,9 +51,9 @@ public interface Reader {
* meaning of the data depends upon the hint type. The implementation may or may not do * meaning of the data depends upon the hint type. The implementation may or may not do
* anything with these hints. * anything with these hints.
* @return String which the barcode encodes * @return String which the barcode encodes
* @throws ReaderException if the barcode cannot be located or decoded for any reason * @throws NotFoundException if the barcode cannot be located or decoded for any reason
*/ */
Result decode(BinaryBitmap image, Hashtable hints) throws ReaderException; Result decode(BinaryBitmap image, Hashtable hints) throws NotFoundException, ChecksumException, FormatException;
/** /**
* Resets any internal state the implementation has after a decode, to prepare it * Resets any internal state the implementation has after a decode, to prepare it

View file

@ -23,7 +23,7 @@ package com.google.zxing;
* *
* @author Sean Owen * @author Sean Owen
*/ */
public final class ReaderException extends Exception { public abstract class ReaderException extends Exception {
// TODO: Currently we throw up to 400 ReaderExceptions while scanning a single 240x240 image before // TODO: Currently we throw up to 400 ReaderExceptions while scanning a single 240x240 image before
// rejecting it. This involves a lot of overhead and memory allocation, and affects both performance // rejecting it. This involves a lot of overhead and memory allocation, and affects both performance
@ -34,7 +34,7 @@ public final class ReaderException extends Exception {
// by disabling the generation of stack traces, which is especially time consuming. These are just // by disabling the generation of stack traces, which is especially time consuming. These are just
// temporary measures, pending the big cleanup. // temporary measures, pending the big cleanup.
private static final ReaderException instance = new ReaderException(); //private static final ReaderException instance = new ReaderException();
// EXCEPTION TRACKING SUPPORT // EXCEPTION TRACKING SUPPORT
// Identifies who is throwing exceptions and how often. To use: // Identifies who is throwing exceptions and how often. To use:
@ -45,11 +45,11 @@ public final class ReaderException extends Exception {
// private static int exceptionCount = 0; // private static int exceptionCount = 0;
// private static Map<String,Integer> throwers = new HashMap<String,Integer>(32); // private static Map<String,Integer> throwers = new HashMap<String,Integer>(32);
private ReaderException() { ReaderException() {
// do nothing // do nothing
} }
public static ReaderException getInstance() { //public static ReaderException getInstance() {
// Exception e = new Exception(); // Exception e = new Exception();
// // Take the stack frame before this one. // // Take the stack frame before this one.
// StackTraceElement stack = e.getStackTrace()[1]; // StackTraceElement stack = e.getStackTrace()[1];
@ -64,8 +64,8 @@ public final class ReaderException extends Exception {
// } // }
// exceptionCount++; // exceptionCount++;
return instance; //return instance;
} //}
// public static int getExceptionCountAndReset() { // public static int getExceptionCountAndReset() {
// int temp = exceptionCount; // int temp = exceptionCount;
@ -91,7 +91,7 @@ public final class ReaderException extends Exception {
// Prevent stack traces from being taken // Prevent stack traces from being taken
// srowen says: huh, my IDE is saying this is not an override. native methods can't be overridden? // srowen says: huh, my IDE is saying this is not an override. native methods can't be overridden?
// This, at least, does not hurt. Because we use a singleton pattern here, it doesn't matter anyhow. // This, at least, does not hurt. Because we use a singleton pattern here, it doesn't matter anyhow.
public Throwable fillInStackTrace() { public final Throwable fillInStackTrace() {
return null; return null;
} }

View file

@ -16,7 +16,7 @@
package com.google.zxing.common; package com.google.zxing.common;
import com.google.zxing.ReaderException; import com.google.zxing.NotFoundException;
/** /**
* @author Sean Owen * @author Sean Owen
@ -32,7 +32,7 @@ public final class DefaultGridSampler extends GridSampler {
float p1FromX, float p1FromY, float p1FromX, float p1FromY,
float p2FromX, float p2FromY, float p2FromX, float p2FromY,
float p3FromX, float p3FromY, float p3FromX, float p3FromY,
float p4FromX, float p4FromY) throws ReaderException { float p4FromX, float p4FromY) throws NotFoundException {
PerspectiveTransform transform = PerspectiveTransform.quadrilateralToQuadrilateral( PerspectiveTransform transform = PerspectiveTransform.quadrilateralToQuadrilateral(
p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY, p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY,
@ -43,7 +43,7 @@ public final class DefaultGridSampler extends GridSampler {
public BitMatrix sampleGrid(BitMatrix image, public BitMatrix sampleGrid(BitMatrix image,
int dimension, int dimension,
PerspectiveTransform transform) throws ReaderException { PerspectiveTransform transform) throws NotFoundException {
BitMatrix bits = new BitMatrix(dimension); BitMatrix bits = new BitMatrix(dimension);
float[] points = new float[dimension << 1]; float[] points = new float[dimension << 1];
for (int y = 0; y < dimension; y++) { for (int y = 0; y < dimension; y++) {
@ -72,7 +72,7 @@ public final class DefaultGridSampler extends GridSampler {
// This results in an ugly runtime exception despite our clever checks above -- can't have // This results in an ugly runtime exception despite our clever checks above -- can't have
// that. We could check each point's coordinates but that feels duplicative. We settle for // that. We could check each point's coordinates but that feels duplicative. We settle for
// catching and wrapping ArrayIndexOutOfBoundsException. // catching and wrapping ArrayIndexOutOfBoundsException.
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
} }
return bits; return bits;

View file

@ -18,7 +18,7 @@ package com.google.zxing.common;
import com.google.zxing.Binarizer; import com.google.zxing.Binarizer;
import com.google.zxing.LuminanceSource; import com.google.zxing.LuminanceSource;
import com.google.zxing.ReaderException; import com.google.zxing.NotFoundException;
/** /**
* This Binarizer implementation uses the old ZXing global histogram approach. It is suitable * This Binarizer implementation uses the old ZXing global histogram approach. It is suitable
@ -45,7 +45,7 @@ public class GlobalHistogramBinarizer extends Binarizer {
} }
// Applies simple sharpening to the row data to improve performance of the 1D Readers. // Applies simple sharpening to the row data to improve performance of the 1D Readers.
public BitArray getBlackRow(int y, BitArray row) throws ReaderException { public BitArray getBlackRow(int y, BitArray row) throws NotFoundException {
LuminanceSource source = getLuminanceSource(); LuminanceSource source = getLuminanceSource();
int width = source.getWidth(); int width = source.getWidth();
if (row == null || row.getSize() < width) { if (row == null || row.getSize() < width) {
@ -79,7 +79,7 @@ public class GlobalHistogramBinarizer extends Binarizer {
} }
// Does not sharpen the data, as this call is intended to only be used by 2D Readers. // Does not sharpen the data, as this call is intended to only be used by 2D Readers.
public BitMatrix getBlackMatrix() throws ReaderException { public BitMatrix getBlackMatrix() throws NotFoundException {
LuminanceSource source = getLuminanceSource(); LuminanceSource source = getLuminanceSource();
int width = source.getWidth(); int width = source.getWidth();
int height = source.getHeight(); int height = source.getHeight();
@ -134,7 +134,7 @@ public class GlobalHistogramBinarizer extends Binarizer {
} }
} }
private static int estimateBlackPoint(int[] buckets) throws ReaderException { private static int estimateBlackPoint(int[] buckets) throws NotFoundException {
// Find the tallest peak in the histogram. // Find the tallest peak in the histogram.
int numBuckets = buckets.length; int numBuckets = buckets.length;
int maxBucketCount = 0; int maxBucketCount = 0;
@ -175,7 +175,7 @@ public class GlobalHistogramBinarizer extends Binarizer {
// TODO: It might be worth comparing the brightest and darkest pixels seen, rather than the // TODO: It might be worth comparing the brightest and darkest pixels seen, rather than the
// two peaks, to determine the contrast. // two peaks, to determine the contrast.
if (secondPeak - firstPeak <= numBuckets >> 4) { if (secondPeak - firstPeak <= numBuckets >> 4) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
// Find a valley between them that is low and closer to the white peak. // Find a valley between them that is low and closer to the white peak.

View file

@ -16,7 +16,7 @@
package com.google.zxing.common; package com.google.zxing.common;
import com.google.zxing.ReaderException; import com.google.zxing.NotFoundException;
/** /**
* Implementations of this class can, given locations of finder patterns for a QR code in an * Implementations of this class can, given locations of finder patterns for a QR code in an
@ -78,7 +78,7 @@ public abstract class GridSampler {
* @param dimension width/height of {@link BitMatrix} to sample from image * @param dimension width/height of {@link BitMatrix} to sample from image
* @return {@link BitMatrix} representing a grid of points sampled from the image within a region * @return {@link BitMatrix} representing a grid of points sampled from the image within a region
* defined by the "from" parameters * defined by the "from" parameters
* @throws ReaderException if image can't be sampled, for example, if the transformation defined * @throws NotFoundException if image can't be sampled, for example, if the transformation defined
* by the given points is invalid or results in sampling outside the image boundaries * by the given points is invalid or results in sampling outside the image boundaries
*/ */
public abstract BitMatrix sampleGrid(BitMatrix image, public abstract BitMatrix sampleGrid(BitMatrix image,
@ -90,11 +90,11 @@ public abstract class GridSampler {
float p1FromX, float p1FromY, float p1FromX, float p1FromY,
float p2FromX, float p2FromY, float p2FromX, float p2FromY,
float p3FromX, float p3FromY, float p3FromX, float p3FromY,
float p4FromX, float p4FromY) throws ReaderException; float p4FromX, float p4FromY) throws NotFoundException;
public BitMatrix sampleGrid(BitMatrix image, public BitMatrix sampleGrid(BitMatrix image,
int dimension, int dimension,
PerspectiveTransform transform) throws ReaderException { PerspectiveTransform transform) throws NotFoundException {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@ -112,10 +112,10 @@ public abstract class GridSampler {
* *
* @param image image into which the points should map * @param image image into which the points should map
* @param points actual points in x1,y1,...,xn,yn form * @param points actual points in x1,y1,...,xn,yn form
* @throws ReaderException if an endpoint is lies outside the image boundaries * @throws NotFoundException if an endpoint is lies outside the image boundaries
*/ */
protected static void checkAndNudgePoints(BitMatrix image, float[] points) protected static void checkAndNudgePoints(BitMatrix image, float[] points)
throws ReaderException { throws NotFoundException {
int width = image.getWidth(); int width = image.getWidth();
int height = image.getHeight(); int height = image.getHeight();
// Check and nudge points from start until we see some that are OK: // Check and nudge points from start until we see some that are OK:
@ -124,7 +124,7 @@ public abstract class GridSampler {
int x = (int) points[offset]; int x = (int) points[offset];
int y = (int) points[offset + 1]; int y = (int) points[offset + 1];
if (x < -1 || x > width || y < -1 || y > height) { if (x < -1 || x > width || y < -1 || y > height) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
nudged = false; nudged = false;
if (x == -1) { if (x == -1) {
@ -148,7 +148,7 @@ public abstract class GridSampler {
int x = (int) points[offset]; int x = (int) points[offset];
int y = (int) points[offset + 1]; int y = (int) points[offset + 1];
if (x < -1 || x > width || y < -1 || y > height) { if (x < -1 || x > width || y < -1 || y > height) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
nudged = false; nudged = false;
if (x == -1) { if (x == -1) {

View file

@ -18,7 +18,7 @@ package com.google.zxing.common;
import com.google.zxing.Binarizer; import com.google.zxing.Binarizer;
import com.google.zxing.LuminanceSource; import com.google.zxing.LuminanceSource;
import com.google.zxing.ReaderException; import com.google.zxing.NotFoundException;
/** /**
* This class implements a local thresholding algorithm, which while slower than the * This class implements a local thresholding algorithm, which while slower than the
@ -49,7 +49,7 @@ public final class HybridBinarizer extends GlobalHistogramBinarizer {
super(source); super(source);
} }
public BitMatrix getBlackMatrix() throws ReaderException { public BitMatrix getBlackMatrix() throws NotFoundException {
binarizeEntireImage(); binarizeEntireImage();
return matrix; return matrix;
} }
@ -61,7 +61,7 @@ public final class HybridBinarizer extends GlobalHistogramBinarizer {
// Calculates the final BitMatrix once for all requests. This could be called once from the // Calculates the final BitMatrix once for all requests. This could be called once from the
// constructor instead, but there are some advantages to doing it lazily, such as making // constructor instead, but there are some advantages to doing it lazily, such as making
// profiling easier, and not doing heavy lifting when callers don't expect it. // profiling easier, and not doing heavy lifting when callers don't expect it.
private void binarizeEntireImage() throws ReaderException { private void binarizeEntireImage() throws NotFoundException {
if (matrix == null) { if (matrix == null) {
LuminanceSource source = getLuminanceSource(); LuminanceSource source = getLuminanceSource();
if (source.getWidth() >= MINIMUM_DIMENSION && source.getHeight() >= MINIMUM_DIMENSION) { if (source.getWidth() >= MINIMUM_DIMENSION && source.getHeight() >= MINIMUM_DIMENSION) {

View file

@ -16,7 +16,7 @@
package com.google.zxing.common.detector; package com.google.zxing.common.detector;
import com.google.zxing.ReaderException; import com.google.zxing.NotFoundException;
import com.google.zxing.ResultPoint; import com.google.zxing.ResultPoint;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
@ -45,9 +45,9 @@ public final class MonochromeRectangleDetector {
* last points are opposed on the diagonal, as are the second and third. The first point will be * last points are opposed on the diagonal, as are the second and third. The first point will be
* the topmost point and the last, the bottommost. The second point will be leftmost and the * the topmost point and the last, the bottommost. The second point will be leftmost and the
* third, the rightmost * third, the rightmost
* @throws ReaderException if no Data Matrix Code can be found * @throws NotFoundException if no Data Matrix Code can be found
*/ */
public ResultPoint[] detect() throws ReaderException { public ResultPoint[] detect() throws NotFoundException {
int height = image.getHeight(); int height = image.getHeight();
int width = image.getWidth(); int width = image.getWidth();
int halfHeight = height >> 1; int halfHeight = height >> 1;
@ -95,10 +95,10 @@ public final class MonochromeRectangleDetector {
* @param maxWhiteRun maximum run of white pixels that can still be considered to be within * @param maxWhiteRun maximum run of white pixels that can still be considered to be within
* the barcode * the barcode
* @return a {@link com.google.zxing.ResultPoint} encapsulating the corner that was found * @return a {@link com.google.zxing.ResultPoint} encapsulating the corner that was found
* @throws com.google.zxing.ReaderException if such a point cannot be found * @throws NotFoundException if such a point cannot be found
*/ */
private ResultPoint findCornerFromCenter(int centerX, int deltaX, int left, int right, private ResultPoint findCornerFromCenter(int centerX, int deltaX, int left, int right,
int centerY, int deltaY, int top, int bottom, int maxWhiteRun) throws ReaderException { int centerY, int deltaY, int top, int bottom, int maxWhiteRun) throws NotFoundException {
int[] lastRange = null; int[] lastRange = null;
for (int y = centerY, x = centerX; for (int y = centerY, x = centerX;
y < bottom && y >= top && x < right && x >= left; y < bottom && y >= top && x < right && x >= left;
@ -113,7 +113,7 @@ public final class MonochromeRectangleDetector {
} }
if (range == null) { if (range == null) {
if (lastRange == null) { if (lastRange == null) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
// lastRange was found // lastRange was found
if (deltaX == 0) { if (deltaX == 0) {
@ -141,7 +141,7 @@ public final class MonochromeRectangleDetector {
} }
lastRange = range; lastRange = range;
} }
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
/** /**

View file

@ -17,13 +17,15 @@
package com.google.zxing.datamatrix; package com.google.zxing.datamatrix;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.DecodeHintType;
import com.google.zxing.BinaryBitmap; import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.DecodeHintType;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.Reader; import com.google.zxing.Reader;
import com.google.zxing.ReaderException;
import com.google.zxing.Result; import com.google.zxing.Result;
import com.google.zxing.ResultPoint;
import com.google.zxing.ResultMetadataType; import com.google.zxing.ResultMetadataType;
import com.google.zxing.ResultPoint;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.DecoderResult; import com.google.zxing.common.DecoderResult;
import com.google.zxing.common.DetectorResult; import com.google.zxing.common.DetectorResult;
@ -47,14 +49,16 @@ public final class DataMatrixReader implements Reader {
* Locates and decodes a Data Matrix code in an image. * Locates and decodes a Data Matrix code in an image.
* *
* @return a String representing the content encoded by the Data Matrix code * @return a String representing the content encoded by the Data Matrix code
* @throws ReaderException if a Data Matrix code cannot be found, or cannot be decoded * @throws NotFoundException if a Data Matrix code cannot be found
* @throws FormatException if a Data Matrix code cannot be decoded
* @throws ChecksumException if error correction fails
*/ */
public Result decode(BinaryBitmap image) throws ReaderException { public Result decode(BinaryBitmap image) throws NotFoundException, ChecksumException, FormatException {
return decode(image, null); return decode(image, null);
} }
public Result decode(BinaryBitmap image, Hashtable hints) public Result decode(BinaryBitmap image, Hashtable hints)
throws ReaderException { throws NotFoundException, ChecksumException, FormatException {
DecoderResult decoderResult; DecoderResult decoderResult;
ResultPoint[] points; ResultPoint[] points;
if (hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE)) { if (hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE)) {
@ -86,7 +90,7 @@ public final class DataMatrixReader implements Reader {
* around it. This is a specialized method that works exceptionally fast in this special * around it. This is a specialized method that works exceptionally fast in this special
* case. * case.
*/ */
private static BitMatrix extractPureBits(BitMatrix image) throws ReaderException { private static BitMatrix extractPureBits(BitMatrix image) throws NotFoundException {
// Now need to determine module size in pixels // Now need to determine module size in pixels
int height = image.getHeight(); int height = image.getHeight();
@ -99,7 +103,7 @@ public final class DataMatrixReader implements Reader {
borderWidth++; borderWidth++;
} }
if (borderWidth == minDimension) { if (borderWidth == minDimension) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
// And then keep tracking across the top-left black module to determine module size // And then keep tracking across the top-left black module to determine module size
@ -108,7 +112,7 @@ public final class DataMatrixReader implements Reader {
moduleEnd++; moduleEnd++;
} }
if (moduleEnd == width) { if (moduleEnd == width) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
int moduleSize = moduleEnd - borderWidth; int moduleSize = moduleEnd - borderWidth;
@ -119,13 +123,13 @@ public final class DataMatrixReader implements Reader {
columnEndOfSymbol--; columnEndOfSymbol--;
} }
if (columnEndOfSymbol < 0) { if (columnEndOfSymbol < 0) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
columnEndOfSymbol++; columnEndOfSymbol++;
// Make sure width of barcode is a multiple of module size // Make sure width of barcode is a multiple of module size
if ((columnEndOfSymbol - borderWidth) % moduleSize != 0) { if ((columnEndOfSymbol - borderWidth) % moduleSize != 0) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
int dimension = (columnEndOfSymbol - borderWidth) / moduleSize; int dimension = (columnEndOfSymbol - borderWidth) / moduleSize;
@ -136,7 +140,7 @@ public final class DataMatrixReader implements Reader {
int sampleDimension = borderWidth + (dimension - 1) * moduleSize; int sampleDimension = borderWidth + (dimension - 1) * moduleSize;
if (sampleDimension >= width || sampleDimension >= height) { if (sampleDimension >= width || sampleDimension >= height) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
// Now just read off the bits // Now just read off the bits

View file

@ -16,7 +16,7 @@
package com.google.zxing.datamatrix.decoder; package com.google.zxing.datamatrix.decoder;
import com.google.zxing.ReaderException; import com.google.zxing.FormatException;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
/** /**
@ -30,12 +30,12 @@ final class BitMatrixParser {
/** /**
* @param bitMatrix {@link BitMatrix} to parse * @param bitMatrix {@link BitMatrix} to parse
* @throws ReaderException if dimension is < 10 or > 144 or not 0 mod 2 * @throws FormatException if dimension is < 10 or > 144 or not 0 mod 2
*/ */
BitMatrixParser(BitMatrix bitMatrix) throws ReaderException { BitMatrixParser(BitMatrix bitMatrix) throws FormatException {
int dimension = bitMatrix.getDimension(); int dimension = bitMatrix.getDimension();
if (dimension < 10 || dimension > 144 || (dimension & 0x01) != 0) { if (dimension < 10 || dimension > 144 || (dimension & 0x01) != 0) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
version = readVersion(bitMatrix); version = readVersion(bitMatrix);
@ -52,10 +52,10 @@ final class BitMatrixParser {
* *
* @param bitMatrix Original {@link BitMatrix} including alignment patterns * @param bitMatrix Original {@link BitMatrix} including alignment patterns
* @return {@link Version} encapsulating the Data Matrix Code's "version" * @return {@link Version} encapsulating the Data Matrix Code's "version"
* @throws ReaderException if the dimensions of the mapping matrix are not valid * @throws FormatException if the dimensions of the mapping matrix are not valid
* Data Matrix dimensions. * Data Matrix dimensions.
*/ */
Version readVersion(BitMatrix bitMatrix) throws ReaderException { Version readVersion(BitMatrix bitMatrix) throws FormatException {
if (version != null) { if (version != null) {
return version; return version;
@ -74,9 +74,9 @@ final class BitMatrixParser {
* Data Matrix Code.</p> * Data Matrix Code.</p>
* *
* @return bytes encoded within the Data Matrix Code * @return bytes encoded within the Data Matrix Code
* @throws ReaderException if the exact number of bytes expected is not read * @throws FormatException if the exact number of bytes expected is not read
*/ */
byte[] readCodewords() throws ReaderException { byte[] readCodewords() throws FormatException {
byte[] result = new byte[version.getTotalCodewords()]; byte[] result = new byte[version.getTotalCodewords()];
int resultOffset = 0; int resultOffset = 0;
@ -141,7 +141,7 @@ final class BitMatrixParser {
} while ((row < numRows) || (column < numColumns)); } while ((row < numRows) || (column < numColumns));
if (resultOffset != version.getTotalCodewords()) { if (resultOffset != version.getTotalCodewords()) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
return result; return result;
} }

View file

@ -16,12 +16,12 @@
package com.google.zxing.datamatrix.decoder; package com.google.zxing.datamatrix.decoder;
import com.google.zxing.ReaderException; import com.google.zxing.FormatException;
import com.google.zxing.common.BitSource; import com.google.zxing.common.BitSource;
import com.google.zxing.common.DecoderResult; import com.google.zxing.common.DecoderResult;
import java.util.Vector;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.Vector;
/** /**
* <p>Data Matrix Codes can encode text as bits in one of several modes, and can use multiple modes * <p>Data Matrix Codes can encode text as bits in one of several modes, and can use multiple modes
@ -75,7 +75,7 @@ final class DecodedBitStreamParser {
private DecodedBitStreamParser() { private DecodedBitStreamParser() {
} }
static DecoderResult decode(byte[] bytes) throws ReaderException { static DecoderResult decode(byte[] bytes) throws FormatException {
BitSource bits = new BitSource(bytes); BitSource bits = new BitSource(bytes);
StringBuffer result = new StringBuffer(100); StringBuffer result = new StringBuffer(100);
StringBuffer resultTrailer = new StringBuffer(0); StringBuffer resultTrailer = new StringBuffer(0);
@ -102,7 +102,7 @@ final class DecodedBitStreamParser {
decodeBase256Segment(bits, result, byteSegments); decodeBase256Segment(bits, result, byteSegments);
break; break;
default: default:
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
mode = ASCII_ENCODE; mode = ASCII_ENCODE;
} }
@ -117,12 +117,12 @@ final class DecodedBitStreamParser {
* See ISO 16022:2006, 5.2.3 and Annex C, Table C.2 * See ISO 16022:2006, 5.2.3 and Annex C, Table C.2
*/ */
private static int decodeAsciiSegment(BitSource bits, StringBuffer result, StringBuffer resultTrailer) private static int decodeAsciiSegment(BitSource bits, StringBuffer result, StringBuffer resultTrailer)
throws ReaderException { throws FormatException {
boolean upperShift = false; boolean upperShift = false;
do { do {
int oneByte = bits.readBits(8); int oneByte = bits.readBits(8);
if (oneByte == 0) { if (oneByte == 0) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} else if (oneByte <= 128) { // ASCII data (ASCII value + 1) } else if (oneByte <= 128) { // ASCII data (ASCII value + 1)
oneByte = upperShift ? (oneByte + 128) : oneByte; oneByte = upperShift ? (oneByte + 128) : oneByte;
upperShift = false; upperShift = false;
@ -168,7 +168,7 @@ final class DecodedBitStreamParser {
//throw ReaderException.getInstance(); //throw ReaderException.getInstance();
// Ignore this symbol for now // Ignore this symbol for now
} else if (oneByte >= 242) { // Not to be used in ASCII encodation } else if (oneByte >= 242) { // Not to be used in ASCII encodation
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
} while (bits.available() > 0); } while (bits.available() > 0);
return ASCII_ENCODE; return ASCII_ENCODE;
@ -177,7 +177,7 @@ final class DecodedBitStreamParser {
/** /**
* See ISO 16022:2006, 5.2.5 and Annex C, Table C.1 * See ISO 16022:2006, 5.2.5 and Annex C, Table C.1
*/ */
private static void decodeC40Segment(BitSource bits, StringBuffer result) throws ReaderException { private static void decodeC40Segment(BitSource bits, StringBuffer result) throws FormatException {
// Three C40 values are encoded in a 16-bit value as // Three C40 values are encoded in a 16-bit value as
// (1600 * C1) + (40 * C2) + C3 + 1 // (1600 * C1) + (40 * C2) + C3 + 1
// TODO(bbrown): The Upper Shift with C40 doesn't work in the 4 value scenario all the time // TODO(bbrown): The Upper Shift with C40 doesn't work in the 4 value scenario all the time
@ -230,11 +230,11 @@ final class DecodedBitStreamParser {
result.append(C40_SHIFT2_SET_CHARS[cValue]); result.append(C40_SHIFT2_SET_CHARS[cValue]);
} }
} else if (cValue == 27) { // FNC1 } else if (cValue == 27) { // FNC1
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} else if (cValue == 30) { // Upper Shift } else if (cValue == 30) { // Upper Shift
upperShift = true; upperShift = true;
} else { } else {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
shift = 0; shift = 0;
break; break;
@ -248,7 +248,7 @@ final class DecodedBitStreamParser {
shift = 0; shift = 0;
break; break;
default: default:
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
} }
} while (bits.available() > 0); } while (bits.available() > 0);
@ -257,7 +257,7 @@ final class DecodedBitStreamParser {
/** /**
* See ISO 16022:2006, 5.2.6 and Annex C, Table C.2 * See ISO 16022:2006, 5.2.6 and Annex C, Table C.2
*/ */
private static void decodeTextSegment(BitSource bits, StringBuffer result) throws ReaderException { private static void decodeTextSegment(BitSource bits, StringBuffer result) throws FormatException {
// Three Text values are encoded in a 16-bit value as // Three Text values are encoded in a 16-bit value as
// (1600 * C1) + (40 * C2) + C3 + 1 // (1600 * C1) + (40 * C2) + C3 + 1
// TODO(bbrown): The Upper Shift with Text doesn't work in the 4 value scenario all the time // TODO(bbrown): The Upper Shift with Text doesn't work in the 4 value scenario all the time
@ -311,11 +311,11 @@ final class DecodedBitStreamParser {
result.append(C40_SHIFT2_SET_CHARS[cValue]); result.append(C40_SHIFT2_SET_CHARS[cValue]);
} }
} else if (cValue == 27) { // FNC1 } else if (cValue == 27) { // FNC1
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} else if (cValue == 30) { // Upper Shift } else if (cValue == 30) { // Upper Shift
upperShift = true; upperShift = true;
} else { } else {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
shift = 0; shift = 0;
break; break;
@ -329,7 +329,7 @@ final class DecodedBitStreamParser {
shift = 0; shift = 0;
break; break;
default: default:
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
} }
} while (bits.available() > 0); } while (bits.available() > 0);
@ -338,7 +338,7 @@ final class DecodedBitStreamParser {
/** /**
* See ISO 16022:2006, 5.2.7 * See ISO 16022:2006, 5.2.7
*/ */
private static void decodeAnsiX12Segment(BitSource bits, StringBuffer result) throws ReaderException { private static void decodeAnsiX12Segment(BitSource bits, StringBuffer result) throws FormatException {
// Three ANSI X12 values are encoded in a 16-bit value as // Three ANSI X12 values are encoded in a 16-bit value as
// (1600 * C1) + (40 * C2) + C3 + 1 // (1600 * C1) + (40 * C2) + C3 + 1
@ -370,7 +370,7 @@ final class DecodedBitStreamParser {
} else if (cValue < 40) { // A - Z } else if (cValue < 40) { // A - Z
result.append((char) (cValue + 51)); result.append((char) (cValue + 51));
} else { } else {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
} }
} while (bits.available() > 0); } while (bits.available() > 0);

View file

@ -16,7 +16,8 @@
package com.google.zxing.datamatrix.decoder; package com.google.zxing.datamatrix.decoder;
import com.google.zxing.ReaderException; import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.DecoderResult; import com.google.zxing.common.DecoderResult;
import com.google.zxing.common.reedsolomon.GF256; import com.google.zxing.common.reedsolomon.GF256;
@ -43,9 +44,10 @@ public final class Decoder {
* *
* @param image booleans representing white/black Data Matrix Code modules * @param image booleans representing white/black Data Matrix Code modules
* @return text and bytes encoded within the Data Matrix Code * @return text and bytes encoded within the Data Matrix Code
* @throws ReaderException if the Data Matrix Code cannot be decoded * @throws FormatException if the Data Matrix Code cannot be decoded
* @throws ChecksumException if error correction fails
*/ */
public DecoderResult decode(boolean[][] image) throws ReaderException { public DecoderResult decode(boolean[][] image) throws FormatException, ChecksumException {
int dimension = image.length; int dimension = image.length;
BitMatrix bits = new BitMatrix(dimension); BitMatrix bits = new BitMatrix(dimension);
for (int i = 0; i < dimension; i++) { for (int i = 0; i < dimension; i++) {
@ -64,9 +66,10 @@ public final class Decoder {
* *
* @param bits booleans representing white/black Data Matrix Code modules * @param bits booleans representing white/black Data Matrix Code modules
* @return text and bytes encoded within the Data Matrix Code * @return text and bytes encoded within the Data Matrix Code
* @throws ReaderException if the Data Matrix Code cannot be decoded * @throws FormatException if the Data Matrix Code cannot be decoded
* @throws ChecksumException if error correction fails
*/ */
public DecoderResult decode(BitMatrix bits) throws ReaderException { public DecoderResult decode(BitMatrix bits) throws FormatException, ChecksumException {
// Construct a parser and read version, error-correction level // Construct a parser and read version, error-correction level
BitMatrixParser parser = new BitMatrixParser(bits); BitMatrixParser parser = new BitMatrixParser(bits);
@ -106,9 +109,9 @@ public final class Decoder {
* *
* @param codewordBytes data and error correction codewords * @param codewordBytes data and error correction codewords
* @param numDataCodewords number of codewords that are data bytes * @param numDataCodewords number of codewords that are data bytes
* @throws ReaderException if error correction fails * @throws ChecksumException if error correction fails
*/ */
private void correctErrors(byte[] codewordBytes, int numDataCodewords) throws ReaderException { private void correctErrors(byte[] codewordBytes, int numDataCodewords) throws ChecksumException {
int numCodewords = codewordBytes.length; int numCodewords = codewordBytes.length;
// First read into an array of ints // First read into an array of ints
int[] codewordsInts = new int[numCodewords]; int[] codewordsInts = new int[numCodewords];
@ -119,7 +122,7 @@ public final class Decoder {
try { try {
rsDecoder.decode(codewordsInts, numECCodewords); rsDecoder.decode(codewordsInts, numECCodewords);
} catch (ReedSolomonException rse) { } catch (ReedSolomonException rse) {
throw ReaderException.getInstance(); throw ChecksumException.getChecksumInstance();
} }
// Copy back into array of bytes -- only need to worry about the bytes that were data // Copy back into array of bytes -- only need to worry about the bytes that were data
// We don't care about errors in the error-correction codewords // We don't care about errors in the error-correction codewords

View file

@ -16,7 +16,7 @@
package com.google.zxing.datamatrix.decoder; package com.google.zxing.datamatrix.decoder;
import com.google.zxing.ReaderException; import com.google.zxing.FormatException;
/** /**
* The Version object encapsulates attributes about a particular * The Version object encapsulates attributes about a particular
@ -94,11 +94,11 @@ public final class Version {
* @param numRows Number of rows in modules * @param numRows Number of rows in modules
* @param numColumns Number of columns in modules * @param numColumns Number of columns in modules
* @return {@link Version} for a Data Matrix Code of those dimensions * @return {@link Version} for a Data Matrix Code of those dimensions
* @throws ReaderException if dimensions do correspond to a valid Data Matrix size * @throws FormatException if dimensions do correspond to a valid Data Matrix size
*/ */
public static Version getVersionForDimensions(int numRows, int numColumns) throws ReaderException { public static Version getVersionForDimensions(int numRows, int numColumns) throws FormatException {
if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) { if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
// TODO(bbrown): This is doing a linear search through the array of versions. // TODO(bbrown): This is doing a linear search through the array of versions.
@ -112,7 +112,7 @@ public final class Version {
} }
} }
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
/** /**

View file

@ -16,7 +16,7 @@
package com.google.zxing.datamatrix.detector; package com.google.zxing.datamatrix.detector;
import com.google.zxing.ReaderException; import com.google.zxing.NotFoundException;
import com.google.zxing.ResultPoint; import com.google.zxing.ResultPoint;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.Collections; import com.google.zxing.common.Collections;
@ -57,9 +57,9 @@ public final class Detector {
* <p>Detects a Data Matrix Code in an image.</p> * <p>Detects a Data Matrix Code in an image.</p>
* *
* @return {@link DetectorResult} encapsulating results of detecting a QR Code * @return {@link DetectorResult} encapsulating results of detecting a QR Code
* @throws ReaderException if no Data Matrix Code can be found * @throws NotFoundException if no Data Matrix Code can be found
*/ */
public DetectorResult detect() throws ReaderException { public DetectorResult detect() throws NotFoundException {
ResultPoint[] cornerPoints = rectangleDetector.detect(); ResultPoint[] cornerPoints = rectangleDetector.detect();
ResultPoint pointA = cornerPoints[0]; ResultPoint pointA = cornerPoints[0];
@ -110,7 +110,7 @@ public final class Detector {
} }
if (maybeTopLeft == null || bottomLeft == null || maybeBottomRight == null) { if (maybeTopLeft == null || bottomLeft == null || maybeBottomRight == null) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
// Bottom left is correct but top left and bottom right might be switched // Bottom left is correct but top left and bottom right might be switched
@ -169,7 +169,7 @@ public final class Detector {
ResultPoint topLeft, ResultPoint topLeft,
ResultPoint bottomLeft, ResultPoint bottomLeft,
ResultPoint bottomRight, ResultPoint bottomRight,
int dimension) throws ReaderException { int dimension) throws NotFoundException {
// We make up the top right point for now, based on the others. // We make up the top right point for now, based on the others.
// TODO: we actually found a fourth corner above and figured out which of two modules // TODO: we actually found a fourth corner above and figured out which of two modules

View file

@ -17,8 +17,10 @@
package com.google.zxing.multi; package com.google.zxing.multi;
import com.google.zxing.BinaryBitmap; import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.Reader; import com.google.zxing.Reader;
import com.google.zxing.ReaderException;
import com.google.zxing.Result; import com.google.zxing.Result;
import java.util.Hashtable; import java.util.Hashtable;
@ -40,11 +42,13 @@ public final class ByQuadrantReader implements Reader {
this.delegate = delegate; this.delegate = delegate;
} }
public Result decode(BinaryBitmap image) throws ReaderException { public Result decode(BinaryBitmap image)
throws NotFoundException, ChecksumException, FormatException {
return decode(image, null); return decode(image, null);
} }
public Result decode(BinaryBitmap image, Hashtable hints) throws ReaderException { public Result decode(BinaryBitmap image, Hashtable hints)
throws NotFoundException, ChecksumException, FormatException {
int width = image.getWidth(); int width = image.getWidth();
int height = image.getHeight(); int height = image.getHeight();
@ -54,28 +58,28 @@ public final class ByQuadrantReader implements Reader {
BinaryBitmap topLeft = image.crop(0, 0, halfWidth, halfHeight); BinaryBitmap topLeft = image.crop(0, 0, halfWidth, halfHeight);
try { try {
return delegate.decode(topLeft, hints); return delegate.decode(topLeft, hints);
} catch (ReaderException re) { } catch (NotFoundException re) {
// continue // continue
} }
BinaryBitmap topRight = image.crop(halfWidth, 0, halfWidth, halfHeight); BinaryBitmap topRight = image.crop(halfWidth, 0, halfWidth, halfHeight);
try { try {
return delegate.decode(topRight, hints); return delegate.decode(topRight, hints);
} catch (ReaderException re) { } catch (NotFoundException re) {
// continue // continue
} }
BinaryBitmap bottomLeft = image.crop(0, halfHeight, halfWidth, halfHeight); BinaryBitmap bottomLeft = image.crop(0, halfHeight, halfWidth, halfHeight);
try { try {
return delegate.decode(bottomLeft, hints); return delegate.decode(bottomLeft, hints);
} catch (ReaderException re) { } catch (NotFoundException re) {
// continue // continue
} }
BinaryBitmap bottomRight = image.crop(halfWidth, halfHeight, halfWidth, halfHeight); BinaryBitmap bottomRight = image.crop(halfWidth, halfHeight, halfWidth, halfHeight);
try { try {
return delegate.decode(bottomRight, hints); return delegate.decode(bottomRight, hints);
} catch (ReaderException re) { } catch (NotFoundException re) {
// continue // continue
} }

View file

@ -16,10 +16,11 @@
package com.google.zxing.multi; package com.google.zxing.multi;
import com.google.zxing.Reader;
import com.google.zxing.Result;
import com.google.zxing.BinaryBitmap; import com.google.zxing.BinaryBitmap;
import com.google.zxing.NotFoundException;
import com.google.zxing.Reader;
import com.google.zxing.ReaderException; import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.ResultPoint; import com.google.zxing.ResultPoint;
import java.util.Hashtable; import java.util.Hashtable;
@ -49,16 +50,16 @@ public final class GenericMultipleBarcodeReader implements MultipleBarcodeReader
this.delegate = delegate; this.delegate = delegate;
} }
public Result[] decodeMultiple(BinaryBitmap image) throws ReaderException { public Result[] decodeMultiple(BinaryBitmap image) throws NotFoundException {
return decodeMultiple(image, null); return decodeMultiple(image, null);
} }
public Result[] decodeMultiple(BinaryBitmap image, Hashtable hints) public Result[] decodeMultiple(BinaryBitmap image, Hashtable hints)
throws ReaderException { throws NotFoundException {
Vector results = new Vector(); Vector results = new Vector();
doDecodeMultiple(image, hints, results, 0, 0); doDecodeMultiple(image, hints, results, 0, 0);
if (results.isEmpty()) { if (results.isEmpty()) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
int numResults = results.size(); int numResults = results.size();
Result[] resultArray = new Result[numResults]; Result[] resultArray = new Result[numResults];

View file

@ -16,9 +16,9 @@
package com.google.zxing.multi; package com.google.zxing.multi;
import com.google.zxing.Result;
import com.google.zxing.BinaryBitmap; import com.google.zxing.BinaryBitmap;
import com.google.zxing.ReaderException; import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import java.util.Hashtable; import java.util.Hashtable;
@ -30,8 +30,8 @@ import java.util.Hashtable;
*/ */
public interface MultipleBarcodeReader { public interface MultipleBarcodeReader {
Result[] decodeMultiple(BinaryBitmap image) throws ReaderException; Result[] decodeMultiple(BinaryBitmap image) throws NotFoundException;
Result[] decodeMultiple(BinaryBitmap image, Hashtable hints) throws ReaderException; Result[] decodeMultiple(BinaryBitmap image, Hashtable hints) throws NotFoundException;
} }

View file

@ -18,6 +18,7 @@ package com.google.zxing.multi.qrcode;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap; import com.google.zxing.BinaryBitmap;
import com.google.zxing.NotFoundException;
import com.google.zxing.ReaderException; import com.google.zxing.ReaderException;
import com.google.zxing.Result; import com.google.zxing.Result;
import com.google.zxing.ResultMetadataType; import com.google.zxing.ResultMetadataType;
@ -41,11 +42,11 @@ public final class QRCodeMultiReader extends QRCodeReader implements MultipleBar
private static final Result[] EMPTY_RESULT_ARRAY = new Result[0]; private static final Result[] EMPTY_RESULT_ARRAY = new Result[0];
public Result[] decodeMultiple(BinaryBitmap image) throws ReaderException { public Result[] decodeMultiple(BinaryBitmap image) throws NotFoundException {
return decodeMultiple(image, null); return decodeMultiple(image, null);
} }
public Result[] decodeMultiple(BinaryBitmap image, Hashtable hints) throws ReaderException { public Result[] decodeMultiple(BinaryBitmap image, Hashtable hints) throws NotFoundException {
Vector results = new Vector(); Vector results = new Vector();
DetectorResult[] detectorResult = new MultiDetector(image.getBlackMatrix()).detectMulti(hints); DetectorResult[] detectorResult = new MultiDetector(image.getBlackMatrix()).detectMulti(hints);
for (int i = 0; i < detectorResult.length; i++) { for (int i = 0; i < detectorResult.length; i++) {

View file

@ -16,9 +16,10 @@
package com.google.zxing.multi.qrcode.detector; package com.google.zxing.multi.qrcode.detector;
import com.google.zxing.ReaderException; import com.google.zxing.FormatException;
import com.google.zxing.common.DetectorResult; import com.google.zxing.NotFoundException;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.DetectorResult;
import com.google.zxing.qrcode.detector.Detector; import com.google.zxing.qrcode.detector.Detector;
import com.google.zxing.qrcode.detector.FinderPatternInfo; import com.google.zxing.qrcode.detector.FinderPatternInfo;
@ -40,20 +41,20 @@ public final class MultiDetector extends Detector {
super(image); super(image);
} }
public DetectorResult[] detectMulti(Hashtable hints) throws ReaderException { public DetectorResult[] detectMulti(Hashtable hints) throws NotFoundException {
BitMatrix image = getImage(); BitMatrix image = getImage();
MultiFinderPatternFinder finder = new MultiFinderPatternFinder(image); MultiFinderPatternFinder finder = new MultiFinderPatternFinder(image);
FinderPatternInfo[] info = finder.findMulti(hints); FinderPatternInfo[] info = finder.findMulti(hints);
if (info == null || info.length == 0) { if (info == null || info.length == 0) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
Vector result = new Vector(); Vector result = new Vector();
for (int i = 0; i < info.length; i++) { for (int i = 0; i < info.length; i++) {
try { try {
result.addElement(processFinderPatternInfo(info[i])); result.addElement(processFinderPatternInfo(info[i]));
} catch (ReaderException e) { } catch (FormatException e) {
// ignore // ignore
} }
} }

View file

@ -17,12 +17,12 @@
package com.google.zxing.multi.qrcode.detector; package com.google.zxing.multi.qrcode.detector;
import com.google.zxing.DecodeHintType; import com.google.zxing.DecodeHintType;
import com.google.zxing.ReaderException; import com.google.zxing.NotFoundException;
import com.google.zxing.ResultPoint; import com.google.zxing.ResultPoint;
import com.google.zxing.ResultPointCallback; import com.google.zxing.ResultPointCallback;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.Collections; import com.google.zxing.common.Collections;
import com.google.zxing.common.Comparator; import com.google.zxing.common.Comparator;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.detector.FinderPattern; import com.google.zxing.qrcode.detector.FinderPattern;
import com.google.zxing.qrcode.detector.FinderPatternFinder; import com.google.zxing.qrcode.detector.FinderPatternFinder;
import com.google.zxing.qrcode.detector.FinderPatternInfo; import com.google.zxing.qrcode.detector.FinderPatternInfo;
@ -99,15 +99,15 @@ final class MultiFinderPatternFinder extends FinderPatternFinder {
* @return the 3 best {@link FinderPattern}s from our list of candidates. The "best" are * @return the 3 best {@link FinderPattern}s from our list of candidates. The "best" are
* those that have been detected at least {@link #CENTER_QUORUM} times, and whose module * those that have been detected at least {@link #CENTER_QUORUM} times, and whose module
* size differs from the average among those patterns the least * size differs from the average among those patterns the least
* @throws ReaderException if 3 such finder patterns do not exist * @throws NotFoundException if 3 such finder patterns do not exist
*/ */
private FinderPattern[][] selectBestPatterns() throws ReaderException { private FinderPattern[][] selectBestPatterns() throws NotFoundException {
Vector possibleCenters = getPossibleCenters(); Vector possibleCenters = getPossibleCenters();
int size = possibleCenters.size(); int size = possibleCenters.size();
if (size < 3) { if (size < 3) {
// Couldn't find enough finder patterns // Couldn't find enough finder patterns
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
/* /*
@ -227,10 +227,10 @@ final class MultiFinderPatternFinder extends FinderPatternFinder {
} }
// Nothing found! // Nothing found!
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
public FinderPatternInfo[] findMulti(Hashtable hints) throws ReaderException { public FinderPatternInfo[] findMulti(Hashtable hints) throws NotFoundException {
boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER); boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER);
BitMatrix image = getImage(); BitMatrix image = getImage();
int maxI = image.getHeight(); int maxI = image.getHeight();

View file

@ -17,7 +17,9 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.ReaderException; import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result; import com.google.zxing.Result;
import com.google.zxing.ResultPoint; import com.google.zxing.ResultPoint;
import com.google.zxing.common.BitArray; import com.google.zxing.common.BitArray;
@ -161,7 +163,7 @@ public final class Code128Reader extends OneDReader {
private static final int CODE_START_C = 105; private static final int CODE_START_C = 105;
private static final int CODE_STOP = 106; private static final int CODE_STOP = 106;
private static int[] findStartPattern(BitArray row) throws ReaderException { private static int[] findStartPattern(BitArray row) throws NotFoundException {
int width = row.getSize(); int width = row.getSize();
int rowOffset = 0; int rowOffset = 0;
while (rowOffset < width) { while (rowOffset < width) {
@ -214,10 +216,10 @@ public final class Code128Reader extends OneDReader {
isWhite = !isWhite; isWhite = !isWhite;
} }
} }
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
private static int decodeCode(BitArray row, int[] counters, int rowOffset) throws ReaderException { private static int decodeCode(BitArray row, int[] counters, int rowOffset) throws NotFoundException {
recordPattern(row, rowOffset, counters); recordPattern(row, rowOffset, counters);
int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
int bestMatch = -1; int bestMatch = -1;
@ -233,11 +235,12 @@ public final class Code128Reader extends OneDReader {
if (bestMatch >= 0) { if (bestMatch >= 0) {
return bestMatch; return bestMatch;
} else { } else {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
} }
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException { public Result decodeRow(int rowNumber, BitArray row, Hashtable hints)
throws NotFoundException, FormatException, ChecksumException {
int[] startPatternInfo = findStartPattern(row); int[] startPatternInfo = findStartPattern(row);
int startCode = startPatternInfo[2]; int startCode = startPatternInfo[2];
@ -253,7 +256,7 @@ public final class Code128Reader extends OneDReader {
codeSet = CODE_CODE_C; codeSet = CODE_CODE_C;
break; break;
default: default:
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
boolean done = false; boolean done = false;
@ -303,7 +306,7 @@ public final class Code128Reader extends OneDReader {
case CODE_START_A: case CODE_START_A:
case CODE_START_B: case CODE_START_B:
case CODE_START_C: case CODE_START_C:
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
switch (codeSet) { switch (codeSet) {
@ -426,14 +429,14 @@ public final class Code128Reader extends OneDReader {
} }
if (!row.isRange(nextStart, Math.min(width, nextStart + (nextStart - lastStart) / 2), if (!row.isRange(nextStart, Math.min(width, nextStart + (nextStart - lastStart) / 2),
false)) { false)) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
// Pull out from sum the value of the penultimate check code // Pull out from sum the value of the penultimate check code
checksumTotal -= multiplier * lastCode; checksumTotal -= multiplier * lastCode;
// lastCode is the checksum then: // lastCode is the checksum then:
if (checksumTotal % 103 != lastCode) { if (checksumTotal % 103 != lastCode) {
throw ReaderException.getInstance(); throw ChecksumException.getChecksumInstance();
} }
// Need to pull out the check digits from string // Need to pull out the check digits from string
@ -452,7 +455,7 @@ public final class Code128Reader extends OneDReader {
if (resultString.length() == 0) { if (resultString.length() == 0) {
// Almost surely a false positive // Almost surely a false positive
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
float left = (float) (startPatternInfo[1] + startPatternInfo[0]) / 2.0f; float left = (float) (startPatternInfo[1] + startPatternInfo[0]) / 2.0f;

View file

@ -17,7 +17,9 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.ReaderException; import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result; import com.google.zxing.Result;
import com.google.zxing.ResultPoint; import com.google.zxing.ResultPoint;
import com.google.zxing.common.BitArray; import com.google.zxing.common.BitArray;
@ -88,7 +90,8 @@ public final class Code39Reader extends OneDReader {
this.extendedMode = extendedMode; this.extendedMode = extendedMode;
} }
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException { public Result decodeRow(int rowNumber, BitArray row, Hashtable hints)
throws NotFoundException, ChecksumException, FormatException {
int[] start = findAsteriskPattern(row); int[] start = findAsteriskPattern(row);
int nextStart = start[1]; int nextStart = start[1];
@ -107,7 +110,7 @@ public final class Code39Reader extends OneDReader {
recordPattern(row, nextStart, counters); recordPattern(row, nextStart, counters);
int pattern = toNarrowWidePattern(counters); int pattern = toNarrowWidePattern(counters);
if (pattern < 0) { if (pattern < 0) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
decodedChar = patternToChar(pattern); decodedChar = patternToChar(pattern);
result.append(decodedChar); result.append(decodedChar);
@ -131,7 +134,7 @@ public final class Code39Reader extends OneDReader {
// If 50% of last pattern size, following last pattern, is not whitespace, fail // If 50% of last pattern size, following last pattern, is not whitespace, fail
// (but if it's whitespace to the very end of the image, that's OK) // (but if it's whitespace to the very end of the image, that's OK)
if (nextStart != end && whiteSpaceAfterEnd / 2 < lastPatternSize) { if (nextStart != end && whiteSpaceAfterEnd / 2 < lastPatternSize) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
if (usingCheckDigit) { if (usingCheckDigit) {
@ -141,7 +144,7 @@ public final class Code39Reader extends OneDReader {
total += ALPHABET_STRING.indexOf(result.charAt(i)); total += ALPHABET_STRING.indexOf(result.charAt(i));
} }
if (total % 43 != ALPHABET_STRING.indexOf(result.charAt(max))) { if (total % 43 != ALPHABET_STRING.indexOf(result.charAt(max))) {
throw ReaderException.getInstance(); throw ChecksumException.getChecksumInstance();
} }
result.deleteCharAt(max); result.deleteCharAt(max);
} }
@ -153,7 +156,7 @@ public final class Code39Reader extends OneDReader {
if (resultString.length() == 0) { if (resultString.length() == 0) {
// Almost surely a false positive // Almost surely a false positive
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
float left = (float) (start[1] + start[0]) / 2.0f; float left = (float) (start[1] + start[0]) / 2.0f;
@ -168,7 +171,7 @@ public final class Code39Reader extends OneDReader {
} }
private static int[] findAsteriskPattern(BitArray row) throws ReaderException { private static int[] findAsteriskPattern(BitArray row) throws NotFoundException {
int width = row.getSize(); int width = row.getSize();
int rowOffset = 0; int rowOffset = 0;
while (rowOffset < width) { while (rowOffset < width) {
@ -210,7 +213,7 @@ public final class Code39Reader extends OneDReader {
isWhite = !isWhite; isWhite = !isWhite;
} }
} }
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
// For efficiency, returns -1 on failure. Not throwing here saved as many as 700 exceptions // For efficiency, returns -1 on failure. Not throwing here saved as many as 700 exceptions
@ -259,16 +262,16 @@ public final class Code39Reader extends OneDReader {
return -1; return -1;
} }
private static char patternToChar(int pattern) throws ReaderException { private static char patternToChar(int pattern) throws NotFoundException {
for (int i = 0; i < CHARACTER_ENCODINGS.length; i++) { for (int i = 0; i < CHARACTER_ENCODINGS.length; i++) {
if (CHARACTER_ENCODINGS[i] == pattern) { if (CHARACTER_ENCODINGS[i] == pattern) {
return ALPHABET[i]; return ALPHABET[i];
} }
} }
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
private static String decodeExtended(String encoded) throws ReaderException { private static String decodeExtended(String encoded) throws FormatException {
int length = encoded.length(); int length = encoded.length();
StringBuffer decoded = new StringBuffer(length); StringBuffer decoded = new StringBuffer(length);
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
@ -282,7 +285,7 @@ public final class Code39Reader extends OneDReader {
if (next >= 'A' && next <= 'Z') { if (next >= 'A' && next <= 'Z') {
decodedChar = (char) (next + 32); decodedChar = (char) (next + 32);
} else { } else {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
break; break;
case '$': case '$':
@ -290,7 +293,7 @@ public final class Code39Reader extends OneDReader {
if (next >= 'A' && next <= 'Z') { if (next >= 'A' && next <= 'Z') {
decodedChar = (char) (next - 64); decodedChar = (char) (next - 64);
} else { } else {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
break; break;
case '%': case '%':
@ -300,7 +303,7 @@ public final class Code39Reader extends OneDReader {
} else if (next >= 'F' && next <= 'W') { } else if (next >= 'F' && next <= 'W') {
decodedChar = (char) (next - 11); decodedChar = (char) (next - 11);
} else { } else {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
break; break;
case '/': case '/':
@ -310,7 +313,7 @@ public final class Code39Reader extends OneDReader {
} else if (next == 'Z') { } else if (next == 'Z') {
decodedChar = ':'; decodedChar = ':';
} else { } else {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
break; break;
} }

View file

@ -17,7 +17,7 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.ReaderException; import com.google.zxing.NotFoundException;
import com.google.zxing.common.BitArray; import com.google.zxing.common.BitArray;
/** /**
@ -69,7 +69,7 @@ public final class EAN13Reader extends UPCEANReader {
} }
protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer resultString) protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer resultString)
throws ReaderException { throws NotFoundException {
int[] counters = decodeMiddleCounters; int[] counters = decodeMiddleCounters;
counters[0] = 0; counters[0] = 0;
counters[1] = 0; counters[1] = 0;
@ -119,17 +119,17 @@ public final class EAN13Reader extends UPCEANReader {
* @param resultString string to insert decoded first digit into * @param resultString string to insert decoded first digit into
* @param lgPatternFound int whose bits indicates the pattern of odd/even L/G patterns used to * @param lgPatternFound int whose bits indicates the pattern of odd/even L/G patterns used to
* encode digits * encode digits
* @throws ReaderException if first digit cannot be determined * @throws NotFoundException if first digit cannot be determined
*/ */
private static void determineFirstDigit(StringBuffer resultString, int lgPatternFound) private static void determineFirstDigit(StringBuffer resultString, int lgPatternFound)
throws ReaderException { throws NotFoundException {
for (int d = 0; d < 10; d++) { for (int d = 0; d < 10; d++) {
if (lgPatternFound == FIRST_DIGIT_ENCODINGS[d]) { if (lgPatternFound == FIRST_DIGIT_ENCODINGS[d]) {
resultString.insert(0, (char) ('0' + d)); resultString.insert(0, (char) ('0' + d));
return; return;
} }
} }
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
} }

View file

@ -17,7 +17,7 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.ReaderException; import com.google.zxing.NotFoundException;
import com.google.zxing.common.BitArray; import com.google.zxing.common.BitArray;
/** /**
@ -34,7 +34,7 @@ public final class EAN8Reader extends UPCEANReader {
} }
protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result) protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result)
throws ReaderException { throws NotFoundException {
int[] counters = decodeMiddleCounters; int[] counters = decodeMiddleCounters;
counters[0] = 0; counters[0] = 0;
counters[1] = 0; counters[1] = 0;

View file

@ -18,7 +18,8 @@ package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.DecodeHintType; import com.google.zxing.DecodeHintType;
import com.google.zxing.ReaderException; import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result; import com.google.zxing.Result;
import com.google.zxing.ResultPoint; import com.google.zxing.ResultPoint;
import com.google.zxing.common.BitArray; import com.google.zxing.common.BitArray;
@ -75,7 +76,7 @@ public final class ITFReader extends OneDReader {
{N, W, N, W, N} // 9 {N, W, N, W, N} // 9
}; };
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException { public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws FormatException, NotFoundException {
// Find out where the Middle section (payload) starts & ends // Find out where the Middle section (payload) starts & ends
int[] startRange = decodeStart(row); int[] startRange = decodeStart(row);
@ -106,7 +107,7 @@ public final class ITFReader extends OneDReader {
} }
if (!lengthOK) { if (!lengthOK) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
return new Result( return new Result(
@ -121,10 +122,10 @@ public final class ITFReader extends OneDReader {
* @param row row of black/white values to search * @param row row of black/white values to search
* @param payloadStart offset of start pattern * @param payloadStart offset of start pattern
* @param resultString {@link StringBuffer} to append decoded chars to * @param resultString {@link StringBuffer} to append decoded chars to
* @throws ReaderException if decoding could not complete successfully * @throws NotFoundException if decoding could not complete successfully
*/ */
private static void decodeMiddle(BitArray row, int payloadStart, int payloadEnd, private static void decodeMiddle(BitArray row, int payloadStart, int payloadEnd,
StringBuffer resultString) throws ReaderException { StringBuffer resultString) throws NotFoundException {
// Digits are interleaved in pairs - 5 black lines for one digit, and the // Digits are interleaved in pairs - 5 black lines for one digit, and the
// 5 // 5
@ -163,9 +164,9 @@ public final class ITFReader extends OneDReader {
* @param row row of black/white values to search * @param row row of black/white values to search
* @return Array, containing index of start of 'start block' and end of * @return Array, containing index of start of 'start block' and end of
* 'start block' * 'start block'
* @throws ReaderException * @throws NotFoundException
*/ */
int[] decodeStart(BitArray row) throws ReaderException { int[] decodeStart(BitArray row) throws NotFoundException {
int endStart = skipWhiteSpace(row); int endStart = skipWhiteSpace(row);
int[] startPattern = findGuardPattern(row, endStart, START_PATTERN); int[] startPattern = findGuardPattern(row, endStart, START_PATTERN);
@ -192,9 +193,9 @@ public final class ITFReader extends OneDReader {
* *
* @param row bit array representing the scanned barcode. * @param row bit array representing the scanned barcode.
* @param startPattern index into row of the start or end pattern. * @param startPattern index into row of the start or end pattern.
* @throws ReaderException if the quiet zone cannot be found, a ReaderException is thrown. * @throws NotFoundException if the quiet zone cannot be found, a ReaderException is thrown.
*/ */
private void validateQuietZone(BitArray row, int startPattern) throws ReaderException { private void validateQuietZone(BitArray row, int startPattern) throws NotFoundException {
int quietCount = this.narrowLineWidth * 10; // expect to find this many pixels of quiet zone int quietCount = this.narrowLineWidth * 10; // expect to find this many pixels of quiet zone
@ -206,7 +207,7 @@ public final class ITFReader extends OneDReader {
} }
if (quietCount != 0) { if (quietCount != 0) {
// Unable to find the necessary number of quiet zone pixels. // Unable to find the necessary number of quiet zone pixels.
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
} }
@ -215,9 +216,9 @@ public final class ITFReader extends OneDReader {
* *
* @param row row of black/white values to search * @param row row of black/white values to search
* @return index of the first black line. * @return index of the first black line.
* @throws ReaderException Throws exception if no black lines are found in the row * @throws NotFoundException Throws exception if no black lines are found in the row
*/ */
private static int skipWhiteSpace(BitArray row) throws ReaderException { private static int skipWhiteSpace(BitArray row) throws NotFoundException {
int width = row.getSize(); int width = row.getSize();
int endStart = 0; int endStart = 0;
while (endStart < width) { while (endStart < width) {
@ -227,7 +228,7 @@ public final class ITFReader extends OneDReader {
endStart++; endStart++;
} }
if (endStart == width) { if (endStart == width) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
return endStart; return endStart;
@ -239,10 +240,10 @@ public final class ITFReader extends OneDReader {
* @param row row of black/white values to search * @param row row of black/white values to search
* @return Array, containing index of start of 'end block' and end of 'end * @return Array, containing index of start of 'end block' and end of 'end
* block' * block'
* @throws ReaderException * @throws NotFoundException
*/ */
int[] decodeEnd(BitArray row) throws ReaderException { int[] decodeEnd(BitArray row) throws NotFoundException {
// For convenience, reverse the row and then // For convenience, reverse the row and then
// search from 'the start' for the end block // search from 'the start' for the end block
@ -277,9 +278,9 @@ public final class ITFReader extends OneDReader {
* being searched for as a pattern * being searched for as a pattern
* @return start/end horizontal offset of guard pattern, as an array of two * @return start/end horizontal offset of guard pattern, as an array of two
* ints * ints
* @throws ReaderException if pattern is not found * @throws NotFoundException if pattern is not found
*/ */
private static int[] findGuardPattern(BitArray row, int rowOffset, int[] pattern) throws ReaderException { private static int[] findGuardPattern(BitArray row, int rowOffset, int[] pattern) throws NotFoundException {
// TODO: This is very similar to implementation in UPCEANReader. Consider if they can be // TODO: This is very similar to implementation in UPCEANReader. Consider if they can be
// merged to a single method. // merged to a single method.
@ -313,7 +314,7 @@ public final class ITFReader extends OneDReader {
isWhite = !isWhite; isWhite = !isWhite;
} }
} }
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
/** /**
@ -322,9 +323,9 @@ public final class ITFReader extends OneDReader {
* *
* @param counters the counts of runs of observed black/white/black/... values * @param counters the counts of runs of observed black/white/black/... values
* @return The decoded digit * @return The decoded digit
* @throws ReaderException if digit cannot be decoded * @throws NotFoundException if digit cannot be decoded
*/ */
private static int decodeDigit(int[] counters) throws ReaderException { private static int decodeDigit(int[] counters) throws NotFoundException {
int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
int bestMatch = -1; int bestMatch = -1;
@ -340,7 +341,7 @@ public final class ITFReader extends OneDReader {
if (bestMatch >= 0) { if (bestMatch >= 0) {
return bestMatch; return bestMatch;
} else { } else {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
} }

View file

@ -18,11 +18,11 @@ package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.DecodeHintType; import com.google.zxing.DecodeHintType;
import com.google.zxing.NotFoundException;
import com.google.zxing.Reader; import com.google.zxing.Reader;
import com.google.zxing.ReaderException; import com.google.zxing.ReaderException;
import com.google.zxing.Result; import com.google.zxing.Result;
import com.google.zxing.common.BitArray; import com.google.zxing.common.BitArray;
import com.google.zxing.oned.rss.RSS14Reader;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Vector; import java.util.Vector;
@ -70,7 +70,7 @@ public final class MultiFormatOneDReader extends OneDReader {
} }
} }
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException { public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws NotFoundException {
int size = readers.size(); int size = readers.size();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
OneDReader reader = (OneDReader) readers.elementAt(i); OneDReader reader = (OneDReader) readers.elementAt(i);
@ -81,7 +81,7 @@ public final class MultiFormatOneDReader extends OneDReader {
} }
} }
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
public void reset() { public void reset() {

View file

@ -18,6 +18,7 @@ package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.DecodeHintType; import com.google.zxing.DecodeHintType;
import com.google.zxing.NotFoundException;
import com.google.zxing.Reader; import com.google.zxing.Reader;
import com.google.zxing.ReaderException; import com.google.zxing.ReaderException;
import com.google.zxing.Result; import com.google.zxing.Result;
@ -62,7 +63,7 @@ public final class MultiFormatUPCEANReader extends OneDReader {
} }
} }
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException { public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws NotFoundException {
// Compute this location once and reuse it on multiple implementations // Compute this location once and reuse it on multiple implementations
int[] startGuardPattern = UPCEANReader.findStartGuardPattern(row); int[] startGuardPattern = UPCEANReader.findStartGuardPattern(row);
int size = readers.size(); int size = readers.size();
@ -92,7 +93,7 @@ public final class MultiFormatUPCEANReader extends OneDReader {
return result; return result;
} }
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
public void reset() { public void reset() {

View file

@ -17,7 +17,10 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.BinaryBitmap; import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.DecodeHintType; import com.google.zxing.DecodeHintType;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.Reader; import com.google.zxing.Reader;
import com.google.zxing.ReaderException; import com.google.zxing.ReaderException;
import com.google.zxing.Result; import com.google.zxing.Result;
@ -40,15 +43,15 @@ public abstract class OneDReader implements Reader {
private static final int INTEGER_MATH_SHIFT = 8; private static final int INTEGER_MATH_SHIFT = 8;
protected static final int PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << INTEGER_MATH_SHIFT; protected static final int PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << INTEGER_MATH_SHIFT;
public Result decode(BinaryBitmap image) throws ReaderException { public Result decode(BinaryBitmap image) throws NotFoundException, FormatException {
return decode(image, null); return decode(image, null);
} }
// Note that we don't try rotation without the try harder flag, even if rotation was supported. // Note that we don't try rotation without the try harder flag, even if rotation was supported.
public Result decode(BinaryBitmap image, Hashtable hints) throws ReaderException { public Result decode(BinaryBitmap image, Hashtable hints) throws NotFoundException, FormatException {
try { try {
return doDecode(image, hints); return doDecode(image, hints);
} catch (ReaderException re) { } catch (NotFoundException nfe) {
boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER); boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER);
if (tryHarder && image.isRotateSupported()) { if (tryHarder && image.isRotateSupported()) {
BinaryBitmap rotatedImage = image.rotateCounterClockwise(); BinaryBitmap rotatedImage = image.rotateCounterClockwise();
@ -70,7 +73,7 @@ public abstract class OneDReader implements Reader {
} }
return result; return result;
} else { } else {
throw re; throw nfe;
} }
} }
} }
@ -91,9 +94,9 @@ public abstract class OneDReader implements Reader {
* @param image The image to decode * @param image The image to decode
* @param hints Any hints that were requested * @param hints Any hints that were requested
* @return The contents of the decoded barcode * @return The contents of the decoded barcode
* @throws ReaderException Any spontaneous errors which occur * @throws NotFoundException Any spontaneous errors which occur
*/ */
private Result doDecode(BinaryBitmap image, Hashtable hints) throws ReaderException { private Result doDecode(BinaryBitmap image, Hashtable hints) throws NotFoundException {
int width = image.getWidth(); int width = image.getWidth();
int height = image.getHeight(); int height = image.getHeight();
BitArray row = new BitArray(width); BitArray row = new BitArray(width);
@ -122,7 +125,7 @@ public abstract class OneDReader implements Reader {
// Estimate black point for this row and load it: // Estimate black point for this row and load it:
try { try {
row = image.getBlackRow(rowNumber, row); row = image.getBlackRow(rowNumber, row);
} catch (ReaderException re) { } catch (NotFoundException nfe) {
continue; continue;
} }
@ -166,7 +169,7 @@ public abstract class OneDReader implements Reader {
} }
} }
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
/** /**
@ -179,17 +182,17 @@ public abstract class OneDReader implements Reader {
* @param row row to count from * @param row row to count from
* @param start offset into row to start at * @param start offset into row to start at
* @param counters array into which to record counts * @param counters array into which to record counts
* @throws ReaderException if counters cannot be filled entirely from row before running out * @throws NotFoundException if counters cannot be filled entirely from row before running out
* of pixels * of pixels
*/ */
protected static void recordPattern(BitArray row, int start, int[] counters) throws ReaderException { protected static void recordPattern(BitArray row, int start, int[] counters) throws NotFoundException {
int numCounters = counters.length; int numCounters = counters.length;
for (int i = 0; i < numCounters; i++) { for (int i = 0; i < numCounters; i++) {
counters[i] = 0; counters[i] = 0;
} }
int end = row.getSize(); int end = row.getSize();
if (start >= end) { if (start >= end) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
boolean isWhite = !row.get(start); boolean isWhite = !row.get(start);
int counterPosition = 0; int counterPosition = 0;
@ -212,12 +215,12 @@ public abstract class OneDReader implements Reader {
// If we read fully the last section of pixels and filled up our counters -- or filled // If we read fully the last section of pixels and filled up our counters -- or filled
// the last counter but ran off the side of the image, OK. Otherwise, a problem. // the last counter but ran off the side of the image, OK. Otherwise, a problem.
if (!(counterPosition == numCounters || (counterPosition == numCounters - 1 && i == end))) { if (!(counterPosition == numCounters || (counterPosition == numCounters - 1 && i == end))) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
} }
protected static void recordPatternInReverse(BitArray row, int start, int[] counters) protected static void recordPatternInReverse(BitArray row, int start, int[] counters)
throws ReaderException { throws NotFoundException {
// This could be more efficient I guess // This could be more efficient I guess
int numTransitionsLeft = counters.length; int numTransitionsLeft = counters.length;
boolean last = row.get(start); boolean last = row.get(start);
@ -228,7 +231,7 @@ public abstract class OneDReader implements Reader {
} }
} }
if (numTransitionsLeft >= 0) { if (numTransitionsLeft >= 0) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
recordPattern(row, start + 1, counters); recordPattern(row, start + 1, counters);
} }
@ -286,9 +289,9 @@ public abstract class OneDReader implements Reader {
* @param row the black/white pixel data of the row * @param row the black/white pixel data of the row
* @param hints decode hints * @param hints decode hints
* @return {@link Result} containing encoded string and start/end of barcode * @return {@link Result} containing encoded string and start/end of barcode
* @throws ReaderException if an error occurs or barcode cannot be found * @throws NotFoundException if an error occurs or barcode cannot be found
*/ */
public abstract Result decodeRow(int rowNumber, BitArray row, Hashtable hints) public abstract Result decodeRow(int rowNumber, BitArray row, Hashtable hints)
throws ReaderException; throws NotFoundException, ChecksumException, FormatException;
} }

View file

@ -17,9 +17,11 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.BinaryBitmap; import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.common.BitArray; import com.google.zxing.common.BitArray;
import java.util.Hashtable; import java.util.Hashtable;
@ -35,19 +37,20 @@ public final class UPCAReader extends UPCEANReader {
private final UPCEANReader ean13Reader = new EAN13Reader(); private final UPCEANReader ean13Reader = new EAN13Reader();
public Result decodeRow(int rowNumber, BitArray row, int[] startGuardRange, Hashtable hints) public Result decodeRow(int rowNumber, BitArray row, int[] startGuardRange, Hashtable hints)
throws ReaderException { throws NotFoundException, FormatException, ChecksumException {
return maybeReturnResult(ean13Reader.decodeRow(rowNumber, row, startGuardRange, hints)); return maybeReturnResult(ean13Reader.decodeRow(rowNumber, row, startGuardRange, hints));
} }
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException { public Result decodeRow(int rowNumber, BitArray row, Hashtable hints)
throws NotFoundException, FormatException, ChecksumException {
return maybeReturnResult(ean13Reader.decodeRow(rowNumber, row, hints)); return maybeReturnResult(ean13Reader.decodeRow(rowNumber, row, hints));
} }
public Result decode(BinaryBitmap image) throws ReaderException { public Result decode(BinaryBitmap image) throws NotFoundException, FormatException {
return maybeReturnResult(ean13Reader.decode(image)); return maybeReturnResult(ean13Reader.decode(image));
} }
public Result decode(BinaryBitmap image, Hashtable hints) throws ReaderException { public Result decode(BinaryBitmap image, Hashtable hints) throws NotFoundException, FormatException {
return maybeReturnResult(ean13Reader.decode(image, hints)); return maybeReturnResult(ean13Reader.decode(image, hints));
} }
@ -56,16 +59,16 @@ public final class UPCAReader extends UPCEANReader {
} }
protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer resultString) protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer resultString)
throws ReaderException { throws NotFoundException {
return ean13Reader.decodeMiddle(row, startRange, resultString); return ean13Reader.decodeMiddle(row, startRange, resultString);
} }
private static Result maybeReturnResult(Result result) throws ReaderException { private static Result maybeReturnResult(Result result) throws FormatException {
String text = result.getText(); String text = result.getText();
if (text.charAt(0) == '0') { if (text.charAt(0) == '0') {
return new Result(text.substring(1), null, result.getResultPoints(), BarcodeFormat.UPC_A); return new Result(text.substring(1), null, result.getResultPoints(), BarcodeFormat.UPC_A);
} else { } else {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
} }

View file

@ -16,12 +16,14 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.ResultPointCallback;
import com.google.zxing.DecodeHintType;
import com.google.zxing.ResultPoint;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.ChecksumException;
import com.google.zxing.DecodeHintType;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.ResultPoint;
import com.google.zxing.ResultPointCallback;
import com.google.zxing.common.BitArray; import com.google.zxing.common.BitArray;
import java.util.Hashtable; import java.util.Hashtable;
@ -94,7 +96,7 @@ public abstract class UPCEANReader extends OneDReader {
decodeRowStringBuffer = new StringBuffer(20); decodeRowStringBuffer = new StringBuffer(20);
} }
static int[] findStartGuardPattern(BitArray row) throws ReaderException { static int[] findStartGuardPattern(BitArray row) throws NotFoundException {
boolean foundStart = false; boolean foundStart = false;
int[] startRange = null; int[] startRange = null;
int nextStart = 0; int nextStart = 0;
@ -113,7 +115,8 @@ public abstract class UPCEANReader extends OneDReader {
return startRange; return startRange;
} }
public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException { public Result decodeRow(int rowNumber, BitArray row, Hashtable hints)
throws NotFoundException, ChecksumException, FormatException {
return decodeRow(rowNumber, row, findStartGuardPattern(row), hints); return decodeRow(rowNumber, row, findStartGuardPattern(row), hints);
} }
@ -123,7 +126,7 @@ public abstract class UPCEANReader extends OneDReader {
* found. This allows this to be computed once and reused across many implementations.</p> * found. This allows this to be computed once and reused across many implementations.</p>
*/ */
public Result decodeRow(int rowNumber, BitArray row, int[] startGuardRange, Hashtable hints) public Result decodeRow(int rowNumber, BitArray row, int[] startGuardRange, Hashtable hints)
throws ReaderException { throws NotFoundException, ChecksumException, FormatException {
ResultPointCallback resultPointCallback = hints == null ? null : ResultPointCallback resultPointCallback = hints == null ? null :
(ResultPointCallback) hints.get(DecodeHintType.NEED_RESULT_POINT_CALLBACK); (ResultPointCallback) hints.get(DecodeHintType.NEED_RESULT_POINT_CALLBACK);
@ -158,12 +161,12 @@ public abstract class UPCEANReader extends OneDReader {
int end = endRange[1]; int end = endRange[1];
int quietEnd = end + (end - endRange[0]); int quietEnd = end + (end - endRange[0]);
if (quietEnd >= row.getSize() || !row.isRange(end, quietEnd, false)) { if (quietEnd >= row.getSize() || !row.isRange(end, quietEnd, false)) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
String resultString = result.toString(); String resultString = result.toString();
if (!checkChecksum(resultString)) { if (!checkChecksum(resultString)) {
throw ReaderException.getInstance(); throw ChecksumException.getChecksumInstance();
} }
float left = (float) (startGuardRange[1] + startGuardRange[0]) / 2.0f; float left = (float) (startGuardRange[1] + startGuardRange[0]) / 2.0f;
@ -179,7 +182,7 @@ public abstract class UPCEANReader extends OneDReader {
/** /**
* @return {@link #checkStandardUPCEANChecksum(String)} * @return {@link #checkStandardUPCEANChecksum(String)}
*/ */
boolean checkChecksum(String s) throws ReaderException { boolean checkChecksum(String s) throws ChecksumException, FormatException {
return checkStandardUPCEANChecksum(s); return checkStandardUPCEANChecksum(s);
} }
@ -189,9 +192,10 @@ public abstract class UPCEANReader extends OneDReader {
* *
* @param s string of digits to check * @param s string of digits to check
* @return true iff string of digits passes the UPC/EAN checksum algorithm * @return true iff string of digits passes the UPC/EAN checksum algorithm
* @throws ReaderException if the string does not contain only digits * @throws FormatException if the string does not contain only digits
* @throws ChecksumException if checksum mismatches
*/ */
private static boolean checkStandardUPCEANChecksum(String s) throws ReaderException { private static boolean checkStandardUPCEANChecksum(String s) throws ChecksumException, FormatException {
int length = s.length(); int length = s.length();
if (length == 0) { if (length == 0) {
return false; return false;
@ -201,7 +205,7 @@ public abstract class UPCEANReader extends OneDReader {
for (int i = length - 2; i >= 0; i -= 2) { for (int i = length - 2; i >= 0; i -= 2) {
int digit = (int) s.charAt(i) - (int) '0'; int digit = (int) s.charAt(i) - (int) '0';
if (digit < 0 || digit > 9) { if (digit < 0 || digit > 9) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
sum += digit; sum += digit;
} }
@ -209,14 +213,14 @@ public abstract class UPCEANReader extends OneDReader {
for (int i = length - 1; i >= 0; i -= 2) { for (int i = length - 1; i >= 0; i -= 2) {
int digit = (int) s.charAt(i) - (int) '0'; int digit = (int) s.charAt(i) - (int) '0';
if (digit < 0 || digit > 9) { if (digit < 0 || digit > 9) {
throw ReaderException.getInstance(); throw ChecksumException.getChecksumInstance();
} }
sum += digit; sum += digit;
} }
return sum % 10 == 0; return sum % 10 == 0;
} }
int[] decodeEnd(BitArray row, int endStart) throws ReaderException { int[] decodeEnd(BitArray row, int endStart) throws NotFoundException {
return findGuardPattern(row, endStart, false, START_END_PATTERN); return findGuardPattern(row, endStart, false, START_END_PATTERN);
} }
@ -228,10 +232,10 @@ public abstract class UPCEANReader extends OneDReader {
* @param pattern pattern of counts of number of black and white pixels that are being * @param pattern pattern of counts of number of black and white pixels that are being
* searched for as a pattern * searched for as a pattern
* @return start/end horizontal offset of guard pattern, as an array of two ints * @return start/end horizontal offset of guard pattern, as an array of two ints
* @throws ReaderException if pattern is not found * @throws NotFoundException if pattern is not found
*/ */
static int[] findGuardPattern(BitArray row, int rowOffset, boolean whiteFirst, int[] pattern) static int[] findGuardPattern(BitArray row, int rowOffset, boolean whiteFirst, int[] pattern)
throws ReaderException { throws NotFoundException {
int patternLength = pattern.length; int patternLength = pattern.length;
int[] counters = new int[patternLength]; int[] counters = new int[patternLength];
int width = row.getSize(); int width = row.getSize();
@ -269,7 +273,7 @@ public abstract class UPCEANReader extends OneDReader {
isWhite = !isWhite; isWhite = !isWhite;
} }
} }
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
/** /**
@ -282,10 +286,10 @@ public abstract class UPCEANReader extends OneDReader {
* for the digits 0-9 are used, and this indicates the encodings for 0 to 9 that should * for the digits 0-9 are used, and this indicates the encodings for 0 to 9 that should
* be used * be used
* @return horizontal offset of first pixel beyond the decoded digit * @return horizontal offset of first pixel beyond the decoded digit
* @throws ReaderException if digit cannot be decoded * @throws NotFoundException if digit cannot be decoded
*/ */
static int decodeDigit(BitArray row, int[] counters, int rowOffset, int[][] patterns) static int decodeDigit(BitArray row, int[] counters, int rowOffset, int[][] patterns)
throws ReaderException { throws NotFoundException {
recordPattern(row, rowOffset, counters); recordPattern(row, rowOffset, counters);
int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
int bestMatch = -1; int bestMatch = -1;
@ -301,7 +305,7 @@ public abstract class UPCEANReader extends OneDReader {
if (bestMatch >= 0) { if (bestMatch >= 0) {
return bestMatch; return bestMatch;
} else { } else {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
} }
@ -320,9 +324,9 @@ public abstract class UPCEANReader extends OneDReader {
* @param startRange start/end offset of start guard pattern * @param startRange start/end offset of start guard pattern
* @param resultString {@link StringBuffer} to append decoded chars to * @param resultString {@link StringBuffer} to append decoded chars to
* @return horizontal offset of first pixel after the "middle" that was decoded * @return horizontal offset of first pixel after the "middle" that was decoded
* @throws ReaderException if decoding could not complete successfully * @throws NotFoundException if decoding could not complete successfully
*/ */
protected abstract int decodeMiddle(BitArray row, int[] startRange, StringBuffer resultString) protected abstract int decodeMiddle(BitArray row, int[] startRange, StringBuffer resultString)
throws ReaderException; throws NotFoundException;
} }

View file

@ -17,7 +17,9 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.ReaderException; import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.common.BitArray; import com.google.zxing.common.BitArray;
/** /**
@ -53,7 +55,7 @@ public final class UPCEReader extends UPCEANReader {
} }
protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result) protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result)
throws ReaderException { throws NotFoundException {
int[] counters = decodeMiddleCounters; int[] counters = decodeMiddleCounters;
counters[0] = 0; counters[0] = 0;
counters[1] = 0; counters[1] = 0;
@ -80,16 +82,16 @@ public final class UPCEReader extends UPCEANReader {
return rowOffset; return rowOffset;
} }
protected int[] decodeEnd(BitArray row, int endStart) throws ReaderException { protected int[] decodeEnd(BitArray row, int endStart) throws NotFoundException {
return findGuardPattern(row, endStart, true, MIDDLE_END_PATTERN); return findGuardPattern(row, endStart, true, MIDDLE_END_PATTERN);
} }
protected boolean checkChecksum(String s) throws ReaderException { protected boolean checkChecksum(String s) throws FormatException, ChecksumException {
return super.checkChecksum(convertUPCEtoUPCA(s)); return super.checkChecksum(convertUPCEtoUPCA(s));
} }
private static void determineNumSysAndCheckDigit(StringBuffer resultString, int lgPatternFound) private static void determineNumSysAndCheckDigit(StringBuffer resultString, int lgPatternFound)
throws ReaderException { throws NotFoundException {
for (int numSys = 0; numSys <= 1; numSys++) { for (int numSys = 0; numSys <= 1; numSys++) {
for (int d = 0; d < 10; d++) { for (int d = 0; d < 10; d++) {
@ -100,7 +102,7 @@ public final class UPCEReader extends UPCEANReader {
} }
} }
} }
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
BarcodeFormat getBarcodeFormat() { BarcodeFormat getBarcodeFormat() {

View file

@ -19,8 +19,9 @@ package com.google.zxing.pdf417;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap; import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType; import com.google.zxing.DecodeHintType;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.Reader; import com.google.zxing.Reader;
import com.google.zxing.ReaderException;
import com.google.zxing.Result; import com.google.zxing.Result;
import com.google.zxing.ResultPoint; import com.google.zxing.ResultPoint;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
@ -46,14 +47,15 @@ public final class PDF417Reader implements Reader {
* Locates and decodes a PDF417 code in an image. * Locates and decodes a PDF417 code in an image.
* *
* @return a String representing the content encoded by the PDF417 code * @return a String representing the content encoded by the PDF417 code
* @throws ReaderException if a PDF417 code cannot be found, or cannot be decoded * @throws NotFoundException if a PDF417 code cannot be found,
* @throws FormatException if a PDF417 cannot be decoded
*/ */
public Result decode(BinaryBitmap image) throws ReaderException { public Result decode(BinaryBitmap image) throws NotFoundException, FormatException {
return decode(image, null); return decode(image, null);
} }
public Result decode(BinaryBitmap image, Hashtable hints) public Result decode(BinaryBitmap image, Hashtable hints)
throws ReaderException { throws NotFoundException, FormatException {
DecoderResult decoderResult; DecoderResult decoderResult;
ResultPoint[] points; ResultPoint[] points;
if (hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE)) { if (hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE)) {
@ -79,7 +81,7 @@ public final class PDF417Reader implements Reader {
* around it. This is a specialized method that works exceptionally fast in this special * around it. This is a specialized method that works exceptionally fast in this special
* case. * case.
*/ */
private static BitMatrix extractPureBits(BinaryBitmap image) throws ReaderException { private static BitMatrix extractPureBits(BinaryBitmap image) throws NotFoundException {
// Now need to determine module size in pixels // Now need to determine module size in pixels
BitMatrix matrix = image.getBlackMatrix(); BitMatrix matrix = image.getBlackMatrix();
int height = matrix.getHeight(); int height = matrix.getHeight();
@ -92,7 +94,7 @@ public final class PDF417Reader implements Reader {
borderWidth++; borderWidth++;
} }
if (borderWidth == minDimension) { if (borderWidth == minDimension) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
// And then keep tracking across the top-left black module to determine module size // And then keep tracking across the top-left black module to determine module size
@ -101,7 +103,7 @@ public final class PDF417Reader implements Reader {
moduleEnd++; moduleEnd++;
} }
if (moduleEnd == minDimension) { if (moduleEnd == minDimension) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
int moduleSize = moduleEnd - borderWidth; int moduleSize = moduleEnd - borderWidth;
@ -112,13 +114,13 @@ public final class PDF417Reader implements Reader {
rowEndOfSymbol--; rowEndOfSymbol--;
} }
if (rowEndOfSymbol < 0) { if (rowEndOfSymbol < 0) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
rowEndOfSymbol++; rowEndOfSymbol++;
// Make sure width of barcode is a multiple of module size // Make sure width of barcode is a multiple of module size
if ((rowEndOfSymbol - borderWidth) % moduleSize != 0) { if ((rowEndOfSymbol - borderWidth) % moduleSize != 0) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
int dimension = (rowEndOfSymbol - borderWidth) / moduleSize; int dimension = (rowEndOfSymbol - borderWidth) / moduleSize;
@ -129,7 +131,7 @@ public final class PDF417Reader implements Reader {
int sampleDimension = borderWidth + (dimension - 1) * moduleSize; int sampleDimension = borderWidth + (dimension - 1) * moduleSize;
if (sampleDimension >= width || sampleDimension >= height) { if (sampleDimension >= width || sampleDimension >= height) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
// Now just read off the bits // Now just read off the bits

View file

@ -16,7 +16,7 @@
package com.google.zxing.pdf417.decoder; package com.google.zxing.pdf417.decoder;
import com.google.zxing.ReaderException; import com.google.zxing.NotFoundException;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
/** /**
@ -379,7 +379,7 @@ final class BitMatrixParser {
* @param next the next available index into the codewords array. * @param next the next available index into the codewords array.
* @return the next available index into the codeword array after processing * @return the next available index into the codeword array after processing
* this row. * this row.
* @throws ReaderException * @throws NotFoundException
*/ */
/* /*
int processRow1(int[] rowCounters, int rowNumber, int rowHeight, int processRow1(int[] rowCounters, int rowNumber, int rowHeight,

View file

@ -16,7 +16,7 @@
package com.google.zxing.pdf417.decoder; package com.google.zxing.pdf417.decoder;
import com.google.zxing.ReaderException; import com.google.zxing.FormatException;
import com.google.zxing.common.DecoderResult; import com.google.zxing.common.DecoderResult;
/** /**
@ -81,7 +81,7 @@ final class DecodedBitStreamParser {
private DecodedBitStreamParser() { private DecodedBitStreamParser() {
} }
static DecoderResult decode(int[] codewords) throws ReaderException { static DecoderResult decode(int[] codewords) throws FormatException {
StringBuffer result = new StringBuffer(100); StringBuffer result = new StringBuffer(100);
// Get compaction mode // Get compaction mode
int codeIndex = 1; int codeIndex = 1;
@ -120,7 +120,7 @@ final class DecodedBitStreamParser {
if (codeIndex < codewords.length) { if (codeIndex < codewords.length) {
code = codewords[codeIndex++]; code = codewords[codeIndex++];
} else { } else {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
} }
return new DecoderResult(null, result.toString(), null, null); return new DecoderResult(null, result.toString(), null, null);

View file

@ -16,7 +16,9 @@
package com.google.zxing.pdf417.decoder; package com.google.zxing.pdf417.decoder;
import com.google.zxing.ReaderException; import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.DecoderResult; import com.google.zxing.common.DecoderResult;
//import com.google.zxing.pdf417.reedsolomon.ReedSolomonDecoder; //import com.google.zxing.pdf417.reedsolomon.ReedSolomonDecoder;
@ -44,9 +46,9 @@ public final class Decoder {
* *
* @param image booleans representing white/black PDF417 modules * @param image booleans representing white/black PDF417 modules
* @return text and bytes encoded within the PDF417 Code * @return text and bytes encoded within the PDF417 Code
* @throws ReaderException if the PDF417 Code cannot be decoded * @throws NotFoundException if the PDF417 Code cannot be decoded
*/ */
public DecoderResult decode(boolean[][] image) throws ReaderException { public DecoderResult decode(boolean[][] image) throws FormatException {
int dimension = image.length; int dimension = image.length;
BitMatrix bits = new BitMatrix(dimension); BitMatrix bits = new BitMatrix(dimension);
for (int i = 0; i < dimension; i++) { for (int i = 0; i < dimension; i++) {
@ -65,14 +67,14 @@ public final class Decoder {
* *
* @param bits booleans representing white/black PDF417 Code modules * @param bits booleans representing white/black PDF417 Code modules
* @return text and bytes encoded within the PDF417 Code * @return text and bytes encoded within the PDF417 Code
* @throws ReaderException if the PDF417 Code cannot be decoded * @throws FormatException if the PDF417 Code cannot be decoded
*/ */
public DecoderResult decode(BitMatrix bits) throws ReaderException { public DecoderResult decode(BitMatrix bits) throws FormatException {
// Construct a parser to read the data codewords and error-correction level // Construct a parser to read the data codewords and error-correction level
BitMatrixParser parser = new BitMatrixParser(bits); BitMatrixParser parser = new BitMatrixParser(bits);
int[] codewords = parser.readCodewords(); int[] codewords = parser.readCodewords();
if (codewords == null || codewords.length == 0) { if (codewords == null || codewords.length == 0) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
int ecLevel = parser.getECLevel(); int ecLevel = parser.getECLevel();
@ -91,27 +93,27 @@ public final class Decoder {
* *
* @param codewords * @param codewords
* @return an index to the first data codeword. * @return an index to the first data codeword.
* @throws ReaderException * @throws FormatException
*/ */
private static void verifyCodewordCount(int[] codewords, int numECCodewords) throws ReaderException { private static void verifyCodewordCount(int[] codewords, int numECCodewords) throws FormatException {
if (codewords.length < 4) { if (codewords.length < 4) {
// Codeword array size should be at least 4 allowing for // Codeword array size should be at least 4 allowing for
// Count CW, At least one Data CW, Error Correction CW, Error Correction CW // Count CW, At least one Data CW, Error Correction CW, Error Correction CW
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
// The first codeword, the Symbol Length Descriptor, shall always encode the total number of data // The first codeword, the Symbol Length Descriptor, shall always encode the total number of data
// codewords in the symbol, including the Symbol Length Descriptor itself, data codewords and pad // codewords in the symbol, including the Symbol Length Descriptor itself, data codewords and pad
// codewords, but excluding the number of error correction codewords. // codewords, but excluding the number of error correction codewords.
int numberOfCodewords = codewords[0]; int numberOfCodewords = codewords[0];
if (numberOfCodewords > codewords.length) { if (numberOfCodewords > codewords.length) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
if (numberOfCodewords == 0) { if (numberOfCodewords == 0) {
// Reset to the length of the array - 8 (Allow for at least level 3 Error Correction (8 Error Codewords) // Reset to the length of the array - 8 (Allow for at least level 3 Error Correction (8 Error Codewords)
if (numECCodewords < codewords.length) { if (numECCodewords < codewords.length) {
codewords[0] = codewords.length - numECCodewords; codewords[0] = codewords.length - numECCodewords;
} else { } else {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
} }
} }
@ -121,15 +123,16 @@ public final class Decoder {
* correct the errors in-place using Reed-Solomon error correction.</p> * correct the errors in-place using Reed-Solomon error correction.</p>
* *
* @param codewords data and error correction codewords * @param codewords data and error correction codewords
* @throws ReaderException if error correction fails * @throws ChecksumException if error correction fails
*/ */
private static int correctErrors(int[] codewords, int[] erasures, int numECCodewords) throws ReaderException { private static int correctErrors(int[] codewords, int[] erasures, int numECCodewords) throws FormatException {
if ((erasures != null && erasures.length > numECCodewords / 2 + MAX_ERRORS) || if ((erasures != null && erasures.length > numECCodewords / 2 + MAX_ERRORS) ||
(numECCodewords < 0 || numECCodewords > MAX_EC_CODEWORDS)) { (numECCodewords < 0 || numECCodewords > MAX_EC_CODEWORDS)) {
// Too many errors or EC Codewords is corrupted // Too many errors or EC Codewords is corrupted
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
// Try to correct the errors // Try to correct the errors
// TODO enable error correction
int result = 0; // rsDecoder.correctErrors(codewords, numECCodewords); int result = 0; // rsDecoder.correctErrors(codewords, numECCodewords);
if (erasures != null) { if (erasures != null) {
int numErasures = erasures.length; int numErasures = erasures.length;
@ -138,7 +141,7 @@ public final class Decoder {
} }
if (numErasures > MAX_ERRORS) { if (numErasures > MAX_ERRORS) {
// Still too many errors // Still too many errors
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
} }
return result; return result;

View file

@ -17,7 +17,7 @@
package com.google.zxing.pdf417.detector; package com.google.zxing.pdf417.detector;
import com.google.zxing.BinaryBitmap; import com.google.zxing.BinaryBitmap;
import com.google.zxing.ReaderException; import com.google.zxing.NotFoundException;
import com.google.zxing.ResultPoint; import com.google.zxing.ResultPoint;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.DetectorResult; import com.google.zxing.common.DetectorResult;
@ -62,9 +62,9 @@ public final class Detector {
* <p>Detects a PDF417 Code in an image, simply.</p> * <p>Detects a PDF417 Code in an image, simply.</p>
* *
* @return {@link DetectorResult} encapsulating results of detecting a PDF417 Code * @return {@link DetectorResult} encapsulating results of detecting a PDF417 Code
* @throws ReaderException if no QR Code can be found * @throws NotFoundException if no QR Code can be found
*/ */
public DetectorResult detect() throws ReaderException { public DetectorResult detect() throws NotFoundException {
return detect(null); return detect(null);
} }
@ -73,9 +73,9 @@ public final class Detector {
* *
* @param hints optional hints to detector * @param hints optional hints to detector
* @return {@link DetectorResult} encapsulating results of detecting a PDF417 Code * @return {@link DetectorResult} encapsulating results of detecting a PDF417 Code
* @throws ReaderException if no PDF417 Code can be found * @throws NotFoundException if no PDF417 Code can be found
*/ */
public DetectorResult detect(Hashtable hints) throws ReaderException { public DetectorResult detect(Hashtable hints) throws NotFoundException {
// Fetch the 1 bit matrix once up front. // Fetch the 1 bit matrix once up front.
BitMatrix matrix = image.getBlackMatrix(); BitMatrix matrix = image.getBlackMatrix();
@ -91,16 +91,19 @@ public final class Detector {
correctCodeWordVertices(vertices, false); correctCodeWordVertices(vertices, false);
} }
if (vertices != null) { if (vertices == null) {
throw NotFoundException.getNotFoundInstance();
}
float moduleWidth = computeModuleWidth(vertices); float moduleWidth = computeModuleWidth(vertices);
if (moduleWidth < 1.0f) { if (moduleWidth < 1.0f) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
int dimension = computeDimension(vertices[4], vertices[6], int dimension = computeDimension(vertices[4], vertices[6],
vertices[5], vertices[7], moduleWidth); vertices[5], vertices[7], moduleWidth);
if (dimension < 1) { if (dimension < 1) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
// Deskew and sample image. // Deskew and sample image.
@ -108,9 +111,6 @@ public final class Detector {
vertices[6], vertices[7], dimension); vertices[6], vertices[7], dimension);
return new DetectorResult(bits, new ResultPoint[]{vertices[4], return new DetectorResult(bits, new ResultPoint[]{vertices[4],
vertices[5], vertices[6], vertices[7]}); vertices[5], vertices[6], vertices[7]});
} else {
throw ReaderException.getInstance();
}
} }
/** /**
@ -374,7 +374,7 @@ public final class Detector {
private static BitMatrix sampleGrid(BitMatrix matrix, ResultPoint topLeft, private static BitMatrix sampleGrid(BitMatrix matrix, ResultPoint topLeft,
ResultPoint bottomLeft, ResultPoint topRight, ResultPoint bottomRight, int dimension) ResultPoint bottomLeft, ResultPoint topRight, ResultPoint bottomRight, int dimension)
throws ReaderException { throws NotFoundException {
// Note that unlike the QR Code sampler, we didn't find the center of modules, but the // Note that unlike the QR Code sampler, we didn't find the center of modules, but the
// very corners. So there is no 0.5f here; 0.0f is right. // very corners. So there is no 0.5f here; 0.0f is right.

View file

@ -17,13 +17,15 @@
package com.google.zxing.qrcode; package com.google.zxing.qrcode;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.DecodeHintType;
import com.google.zxing.Reader;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.ResultPoint;
import com.google.zxing.ResultMetadataType;
import com.google.zxing.BinaryBitmap; import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.DecodeHintType;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.Reader;
import com.google.zxing.Result;
import com.google.zxing.ResultMetadataType;
import com.google.zxing.ResultPoint;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.DecoderResult; import com.google.zxing.common.DecoderResult;
import com.google.zxing.common.DetectorResult; import com.google.zxing.common.DetectorResult;
@ -51,14 +53,16 @@ public class QRCodeReader implements Reader {
* Locates and decodes a QR code in an image. * Locates and decodes a QR code in an image.
* *
* @return a String representing the content encoded by the QR code * @return a String representing the content encoded by the QR code
* @throws ReaderException if a QR code cannot be found, or cannot be decoded * @throws NotFoundException if a QR code cannot be found
* @throws FormatException if a QR code cannot be decoded
* @throws ChecksumException if error correction fails
*/ */
public Result decode(BinaryBitmap image) throws ReaderException { public Result decode(BinaryBitmap image) throws NotFoundException, ChecksumException, FormatException {
return decode(image, null); return decode(image, null);
} }
public Result decode(BinaryBitmap image, Hashtable hints) public Result decode(BinaryBitmap image, Hashtable hints)
throws ReaderException { throws NotFoundException, ChecksumException, FormatException {
DecoderResult decoderResult; DecoderResult decoderResult;
ResultPoint[] points; ResultPoint[] points;
if (hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE)) { if (hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE)) {
@ -91,7 +95,7 @@ public class QRCodeReader implements Reader {
* around it. This is a specialized method that works exceptionally fast in this special * around it. This is a specialized method that works exceptionally fast in this special
* case. * case.
*/ */
private static BitMatrix extractPureBits(BitMatrix image) throws ReaderException { private static BitMatrix extractPureBits(BitMatrix image) throws NotFoundException {
// Now need to determine module size in pixels // Now need to determine module size in pixels
int height = image.getHeight(); int height = image.getHeight();
@ -104,7 +108,7 @@ public class QRCodeReader implements Reader {
borderWidth++; borderWidth++;
} }
if (borderWidth == minDimension) { if (borderWidth == minDimension) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
// And then keep tracking across the top-left black module to determine module size // And then keep tracking across the top-left black module to determine module size
@ -113,7 +117,7 @@ public class QRCodeReader implements Reader {
moduleEnd++; moduleEnd++;
} }
if (moduleEnd == minDimension) { if (moduleEnd == minDimension) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
int moduleSize = moduleEnd - borderWidth; int moduleSize = moduleEnd - borderWidth;
@ -124,13 +128,13 @@ public class QRCodeReader implements Reader {
rowEndOfSymbol--; rowEndOfSymbol--;
} }
if (rowEndOfSymbol < 0) { if (rowEndOfSymbol < 0) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
rowEndOfSymbol++; rowEndOfSymbol++;
// Make sure width of barcode is a multiple of module size // Make sure width of barcode is a multiple of module size
if ((rowEndOfSymbol - borderWidth) % moduleSize != 0) { if ((rowEndOfSymbol - borderWidth) % moduleSize != 0) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
int dimension = (rowEndOfSymbol - borderWidth) / moduleSize; int dimension = (rowEndOfSymbol - borderWidth) / moduleSize;
@ -141,7 +145,7 @@ public class QRCodeReader implements Reader {
int sampleDimension = borderWidth + (dimension - 1) * moduleSize; int sampleDimension = borderWidth + (dimension - 1) * moduleSize;
if (sampleDimension >= width || sampleDimension >= height) { if (sampleDimension >= width || sampleDimension >= height) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
// Now just read off the bits // Now just read off the bits

View file

@ -21,9 +21,9 @@ import com.google.zxing.EncodeHintType;
import com.google.zxing.Writer; import com.google.zxing.Writer;
import com.google.zxing.WriterException; import com.google.zxing.WriterException;
import com.google.zxing.common.ByteMatrix; import com.google.zxing.common.ByteMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.google.zxing.qrcode.encoder.Encoder; import com.google.zxing.qrcode.encoder.Encoder;
import com.google.zxing.qrcode.encoder.QRCode; import com.google.zxing.qrcode.encoder.QRCode;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.util.Hashtable; import java.util.Hashtable;

View file

@ -16,7 +16,7 @@
package com.google.zxing.qrcode.decoder; package com.google.zxing.qrcode.decoder;
import com.google.zxing.ReaderException; import com.google.zxing.FormatException;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
/** /**
@ -30,12 +30,12 @@ final class BitMatrixParser {
/** /**
* @param bitMatrix {@link BitMatrix} to parse * @param bitMatrix {@link BitMatrix} to parse
* @throws ReaderException if dimension is not >= 21 and 1 mod 4 * @throws FormatException if dimension is not >= 21 and 1 mod 4
*/ */
BitMatrixParser(BitMatrix bitMatrix) throws ReaderException { BitMatrixParser(BitMatrix bitMatrix) throws FormatException {
int dimension = bitMatrix.getDimension(); int dimension = bitMatrix.getDimension();
if (dimension < 21 || (dimension & 0x03) != 1) { if (dimension < 21 || (dimension & 0x03) != 1) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
this.bitMatrix = bitMatrix; this.bitMatrix = bitMatrix;
} }
@ -44,10 +44,10 @@ final class BitMatrixParser {
* <p>Reads format information from one of its two locations within the QR Code.</p> * <p>Reads format information from one of its two locations within the QR Code.</p>
* *
* @return {@link FormatInformation} encapsulating the QR Code's format info * @return {@link FormatInformation} encapsulating the QR Code's format info
* @throws ReaderException if both format information locations cannot be parsed as * @throws FormatException if both format information locations cannot be parsed as
* the valid encoding of format information * the valid encoding of format information
*/ */
FormatInformation readFormatInformation() throws ReaderException { FormatInformation readFormatInformation() throws FormatException {
if (parsedFormatInfo != null) { if (parsedFormatInfo != null) {
return parsedFormatInfo; return parsedFormatInfo;
@ -87,17 +87,17 @@ final class BitMatrixParser {
if (parsedFormatInfo != null) { if (parsedFormatInfo != null) {
return parsedFormatInfo; return parsedFormatInfo;
} }
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
/** /**
* <p>Reads version information from one of its two locations within the QR Code.</p> * <p>Reads version information from one of its two locations within the QR Code.</p>
* *
* @return {@link Version} encapsulating the QR Code's version * @return {@link Version} encapsulating the QR Code's version
* @throws ReaderException if both version information locations cannot be parsed as * @throws FormatException if both version information locations cannot be parsed as
* the valid encoding of version information * the valid encoding of version information
*/ */
Version readVersion() throws ReaderException { Version readVersion() throws FormatException {
if (parsedVersion != null) { if (parsedVersion != null) {
return parsedVersion; return parsedVersion;
@ -136,7 +136,7 @@ final class BitMatrixParser {
if (parsedVersion != null && parsedVersion.getDimensionForVersion() == dimension) { if (parsedVersion != null && parsedVersion.getDimensionForVersion() == dimension) {
return parsedVersion; return parsedVersion;
} }
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
private int copyBit(int i, int j, int versionBits) { private int copyBit(int i, int j, int versionBits) {
@ -149,9 +149,9 @@ final class BitMatrixParser {
* QR Code.</p> * QR Code.</p>
* *
* @return bytes encoded within the QR Code * @return bytes encoded within the QR Code
* @throws ReaderException if the exact number of bytes expected is not read * @throws FormatException if the exact number of bytes expected is not read
*/ */
byte[] readCodewords() throws ReaderException { byte[] readCodewords() throws FormatException {
FormatInformation formatInfo = readFormatInformation(); FormatInformation formatInfo = readFormatInformation();
Version version = readVersion(); Version version = readVersion();
@ -200,7 +200,7 @@ final class BitMatrixParser {
readingUp ^= true; // readingUp = !readingUp; // switch directions readingUp ^= true; // readingUp = !readingUp; // switch directions
} }
if (resultOffset != version.getTotalCodewords()) { if (resultOffset != version.getTotalCodewords()) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
return result; return result;
} }

View file

@ -17,7 +17,7 @@
package com.google.zxing.qrcode.decoder; package com.google.zxing.qrcode.decoder;
import com.google.zxing.DecodeHintType; import com.google.zxing.DecodeHintType;
import com.google.zxing.ReaderException; import com.google.zxing.FormatException;
import com.google.zxing.common.BitSource; import com.google.zxing.common.BitSource;
import com.google.zxing.common.CharacterSetECI; import com.google.zxing.common.CharacterSetECI;
import com.google.zxing.common.DecoderResult; import com.google.zxing.common.DecoderResult;
@ -60,7 +60,7 @@ final class DecodedBitStreamParser {
} }
static DecoderResult decode(byte[] bytes, Version version, ErrorCorrectionLevel ecLevel, Hashtable hints) static DecoderResult decode(byte[] bytes, Version version, ErrorCorrectionLevel ecLevel, Hashtable hints)
throws ReaderException { throws FormatException {
BitSource bits = new BitSource(bytes); BitSource bits = new BitSource(bytes);
StringBuffer result = new StringBuffer(50); StringBuffer result = new StringBuffer(50);
CharacterSetECI currentCharacterSetECI = null; CharacterSetECI currentCharacterSetECI = null;
@ -76,7 +76,7 @@ final class DecodedBitStreamParser {
try { try {
mode = Mode.forBits(bits.readBits(4)); // mode is encoded by 4 bits mode = Mode.forBits(bits.readBits(4)); // mode is encoded by 4 bits
} catch (IllegalArgumentException iae) { } catch (IllegalArgumentException iae) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
} }
if (!mode.equals(Mode.TERMINATOR)) { if (!mode.equals(Mode.TERMINATOR)) {
@ -92,7 +92,7 @@ final class DecodedBitStreamParser {
int value = parseECIValue(bits); int value = parseECIValue(bits);
currentCharacterSetECI = CharacterSetECI.getCharacterSetECIByValue(value); currentCharacterSetECI = CharacterSetECI.getCharacterSetECIByValue(value);
if (currentCharacterSetECI == null) { if (currentCharacterSetECI == null) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
} else { } else {
// How many characters will follow, encoded in this mode? // How many characters will follow, encoded in this mode?
@ -106,7 +106,7 @@ final class DecodedBitStreamParser {
} else if (mode.equals(Mode.KANJI)) { } else if (mode.equals(Mode.KANJI)) {
decodeKanjiSegment(bits, result, count); decodeKanjiSegment(bits, result, count);
} else { } else {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
} }
} }
@ -117,7 +117,7 @@ final class DecodedBitStreamParser {
private static void decodeKanjiSegment(BitSource bits, private static void decodeKanjiSegment(BitSource bits,
StringBuffer result, StringBuffer result,
int count) throws ReaderException { int count) throws FormatException {
// Each character will require 2 bytes. Read the characters as 2-byte pairs // Each character will require 2 bytes. Read the characters as 2-byte pairs
// and decode as Shift_JIS afterwards // and decode as Shift_JIS afterwards
byte[] buffer = new byte[2 * count]; byte[] buffer = new byte[2 * count];
@ -142,7 +142,7 @@ final class DecodedBitStreamParser {
try { try {
result.append(new String(buffer, SHIFT_JIS)); result.append(new String(buffer, SHIFT_JIS));
} catch (UnsupportedEncodingException uee) { } catch (UnsupportedEncodingException uee) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
} }
@ -151,10 +151,10 @@ final class DecodedBitStreamParser {
int count, int count,
CharacterSetECI currentCharacterSetECI, CharacterSetECI currentCharacterSetECI,
Vector byteSegments, Vector byteSegments,
Hashtable hints) throws ReaderException { Hashtable hints) throws FormatException {
byte[] readBytes = new byte[count]; byte[] readBytes = new byte[count];
if (count << 3 > bits.available()) { if (count << 3 > bits.available()) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
readBytes[i] = (byte) bits.readBits(8); readBytes[i] = (byte) bits.readBits(8);
@ -173,7 +173,7 @@ final class DecodedBitStreamParser {
try { try {
result.append(new String(readBytes, encoding)); result.append(new String(readBytes, encoding));
} catch (UnsupportedEncodingException uce) { } catch (UnsupportedEncodingException uce) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
byteSegments.addElement(readBytes); byteSegments.addElement(readBytes);
} }
@ -213,13 +213,13 @@ final class DecodedBitStreamParser {
private static void decodeNumericSegment(BitSource bits, private static void decodeNumericSegment(BitSource bits,
StringBuffer result, StringBuffer result,
int count) throws ReaderException { int count) throws FormatException {
// Read three digits at a time // Read three digits at a time
while (count >= 3) { while (count >= 3) {
// Each 10 bits encodes three digits // Each 10 bits encodes three digits
int threeDigitsBits = bits.readBits(10); int threeDigitsBits = bits.readBits(10);
if (threeDigitsBits >= 1000) { if (threeDigitsBits >= 1000) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
result.append(ALPHANUMERIC_CHARS[threeDigitsBits / 100]); result.append(ALPHANUMERIC_CHARS[threeDigitsBits / 100]);
result.append(ALPHANUMERIC_CHARS[(threeDigitsBits / 10) % 10]); result.append(ALPHANUMERIC_CHARS[(threeDigitsBits / 10) % 10]);
@ -230,7 +230,7 @@ final class DecodedBitStreamParser {
// Two digits left over to read, encoded in 7 bits // Two digits left over to read, encoded in 7 bits
int twoDigitsBits = bits.readBits(7); int twoDigitsBits = bits.readBits(7);
if (twoDigitsBits >= 100) { if (twoDigitsBits >= 100) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
result.append(ALPHANUMERIC_CHARS[twoDigitsBits / 10]); result.append(ALPHANUMERIC_CHARS[twoDigitsBits / 10]);
result.append(ALPHANUMERIC_CHARS[twoDigitsBits % 10]); result.append(ALPHANUMERIC_CHARS[twoDigitsBits % 10]);
@ -238,7 +238,7 @@ final class DecodedBitStreamParser {
// One digit left over to read // One digit left over to read
int digitBits = bits.readBits(4); int digitBits = bits.readBits(4);
if (digitBits >= 10) { if (digitBits >= 10) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
result.append(ALPHANUMERIC_CHARS[digitBits]); result.append(ALPHANUMERIC_CHARS[digitBits]);
} }

View file

@ -16,7 +16,9 @@
package com.google.zxing.qrcode.decoder; package com.google.zxing.qrcode.decoder;
import com.google.zxing.ReaderException; import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.DecoderResult; import com.google.zxing.common.DecoderResult;
import com.google.zxing.common.reedsolomon.GF256; import com.google.zxing.common.reedsolomon.GF256;
@ -39,7 +41,8 @@ public final class Decoder {
rsDecoder = new ReedSolomonDecoder(GF256.QR_CODE_FIELD); rsDecoder = new ReedSolomonDecoder(GF256.QR_CODE_FIELD);
} }
public DecoderResult decode(boolean[][] image) throws ReaderException { public DecoderResult decode(boolean[][] image)
throws ChecksumException, FormatException, NotFoundException {
return decode(image, null); return decode(image, null);
} }
@ -49,9 +52,12 @@ public final class Decoder {
* *
* @param image booleans representing white/black QR Code modules * @param image booleans representing white/black QR Code modules
* @return text and bytes encoded within the QR Code * @return text and bytes encoded within the QR Code
* @throws ReaderException if the QR Code cannot be decoded * @throws NotFoundException if the QR Code cannot be found
* @throws FormatException if the QR Code cannot be decoded
* @throws ChecksumException if error correction fails
*/ */
public DecoderResult decode(boolean[][] image, Hashtable hints) throws ReaderException { public DecoderResult decode(boolean[][] image, Hashtable hints)
throws ChecksumException, FormatException, NotFoundException {
int dimension = image.length; int dimension = image.length;
BitMatrix bits = new BitMatrix(dimension); BitMatrix bits = new BitMatrix(dimension);
for (int i = 0; i < dimension; i++) { for (int i = 0; i < dimension; i++) {
@ -64,7 +70,7 @@ public final class Decoder {
return decode(bits, hints); return decode(bits, hints);
} }
public DecoderResult decode(BitMatrix bits) throws ReaderException { public DecoderResult decode(BitMatrix bits) throws ChecksumException, FormatException, NotFoundException {
return decode(bits, null); return decode(bits, null);
} }
@ -73,9 +79,12 @@ public final class Decoder {
* *
* @param bits booleans representing white/black QR Code modules * @param bits booleans representing white/black QR Code modules
* @return text and bytes encoded within the QR Code * @return text and bytes encoded within the QR Code
* @throws ReaderException if the QR Code cannot be decoded * @throws NotFoundException if the QR Code cannot be found
* @throws FormatException if the QR Code cannot be decoded
* @throws ChecksumException if error correction fails
*/ */
public DecoderResult decode(BitMatrix bits, Hashtable hints) throws ReaderException { public DecoderResult decode(BitMatrix bits, Hashtable hints)
throws NotFoundException, FormatException, ChecksumException {
// Construct a parser and read version, error-correction level // Construct a parser and read version, error-correction level
BitMatrixParser parser = new BitMatrixParser(bits); BitMatrixParser parser = new BitMatrixParser(bits);
@ -116,9 +125,9 @@ public final class Decoder {
* *
* @param codewordBytes data and error correction codewords * @param codewordBytes data and error correction codewords
* @param numDataCodewords number of codewords that are data bytes * @param numDataCodewords number of codewords that are data bytes
* @throws ReaderException if error correction fails * @throws ChecksumException if error correction fails
*/ */
private void correctErrors(byte[] codewordBytes, int numDataCodewords) throws ReaderException { private void correctErrors(byte[] codewordBytes, int numDataCodewords) throws ChecksumException {
int numCodewords = codewordBytes.length; int numCodewords = codewordBytes.length;
// First read into an array of ints // First read into an array of ints
int[] codewordsInts = new int[numCodewords]; int[] codewordsInts = new int[numCodewords];
@ -129,7 +138,7 @@ public final class Decoder {
try { try {
rsDecoder.decode(codewordsInts, numECCodewords); rsDecoder.decode(codewordsInts, numECCodewords);
} catch (ReedSolomonException rse) { } catch (ReedSolomonException rse) {
throw ReaderException.getInstance(); throw ChecksumException.getChecksumInstance();
} }
// Copy back into array of bytes -- only need to worry about the bytes that were data // Copy back into array of bytes -- only need to worry about the bytes that were data
// We don't care about errors in the error-correction codewords // We don't care about errors in the error-correction codewords

View file

@ -16,7 +16,7 @@
package com.google.zxing.qrcode.decoder; package com.google.zxing.qrcode.decoder;
import com.google.zxing.ReaderException; import com.google.zxing.FormatException;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
/** /**
@ -91,16 +91,16 @@ public final class Version {
* *
* @param dimension dimension in modules * @param dimension dimension in modules
* @return {@link Version} for a QR Code of that dimension * @return {@link Version} for a QR Code of that dimension
* @throws ReaderException if dimension is not 1 mod 4 * @throws FormatException if dimension is not 1 mod 4
*/ */
public static Version getProvisionalVersionForDimension(int dimension) throws ReaderException { public static Version getProvisionalVersionForDimension(int dimension) throws FormatException {
if (dimension % 4 != 1) { if (dimension % 4 != 1) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
try { try {
return getVersionForNumber((dimension - 17) >> 2); return getVersionForNumber((dimension - 17) >> 2);
} catch (IllegalArgumentException iae) { } catch (IllegalArgumentException iae) {
throw ReaderException.getInstance(); throw FormatException.getFormatInstance();
} }
} }

View file

@ -16,7 +16,7 @@
package com.google.zxing.qrcode.detector; package com.google.zxing.qrcode.detector;
import com.google.zxing.ReaderException; import com.google.zxing.NotFoundException;
import com.google.zxing.ResultPoint; import com.google.zxing.ResultPoint;
import com.google.zxing.ResultPointCallback; import com.google.zxing.ResultPointCallback;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
@ -82,9 +82,9 @@ final class AlignmentPatternFinder {
* it's pretty performance-critical and so is written to be fast foremost.</p> * it's pretty performance-critical and so is written to be fast foremost.</p>
* *
* @return {@link AlignmentPattern} if found * @return {@link AlignmentPattern} if found
* @throws ReaderException if not found * @throws NotFoundException if not found
*/ */
AlignmentPattern find() throws ReaderException { AlignmentPattern find() throws NotFoundException {
int startX = this.startX; int startX = this.startX;
int height = this.height; int height = this.height;
int maxJ = startX + width; int maxJ = startX + width;
@ -150,7 +150,7 @@ final class AlignmentPatternFinder {
return (AlignmentPattern) possibleCenters.elementAt(0); return (AlignmentPattern) possibleCenters.elementAt(0);
} }
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
/** /**

View file

@ -17,7 +17,8 @@
package com.google.zxing.qrcode.detector; package com.google.zxing.qrcode.detector;
import com.google.zxing.DecodeHintType; import com.google.zxing.DecodeHintType;
import com.google.zxing.ReaderException; import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.ResultPoint; import com.google.zxing.ResultPoint;
import com.google.zxing.ResultPointCallback; import com.google.zxing.ResultPointCallback;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
@ -55,9 +56,9 @@ public class Detector {
* <p>Detects a QR Code in an image, simply.</p> * <p>Detects a QR Code in an image, simply.</p>
* *
* @return {@link DetectorResult} encapsulating results of detecting a QR Code * @return {@link DetectorResult} encapsulating results of detecting a QR Code
* @throws ReaderException if no QR Code can be found * @throws NotFoundException if no QR Code can be found
*/ */
public DetectorResult detect() throws ReaderException { public DetectorResult detect() throws NotFoundException, FormatException {
return detect(null); return detect(null);
} }
@ -65,10 +66,11 @@ public class Detector {
* <p>Detects a QR Code in an image, simply.</p> * <p>Detects a QR Code in an image, simply.</p>
* *
* @param hints optional hints to detector * @param hints optional hints to detector
* @return {@link DetectorResult} encapsulating results of detecting a QR Code * @return {@link NotFoundException} encapsulating results of detecting a QR Code
* @throws ReaderException if no QR Code can be found * @throws NotFoundException if QR Code cannot be found
* @throws FormatException if a QR Code cannot be decoded
*/ */
public DetectorResult detect(Hashtable hints) throws ReaderException { public DetectorResult detect(Hashtable hints) throws NotFoundException, FormatException {
resultPointCallback = hints == null ? null : resultPointCallback = hints == null ? null :
(ResultPointCallback) hints.get(DecodeHintType.NEED_RESULT_POINT_CALLBACK); (ResultPointCallback) hints.get(DecodeHintType.NEED_RESULT_POINT_CALLBACK);
@ -79,7 +81,8 @@ public class Detector {
return processFinderPatternInfo(info); return processFinderPatternInfo(info);
} }
protected DetectorResult processFinderPatternInfo(FinderPatternInfo info) throws ReaderException { protected DetectorResult processFinderPatternInfo(FinderPatternInfo info)
throws NotFoundException, FormatException {
FinderPattern topLeft = info.getTopLeft(); FinderPattern topLeft = info.getTopLeft();
FinderPattern topRight = info.getTopRight(); FinderPattern topRight = info.getTopRight();
@ -87,7 +90,7 @@ public class Detector {
float moduleSize = calculateModuleSize(topLeft, topRight, bottomLeft); float moduleSize = calculateModuleSize(topLeft, topRight, bottomLeft);
if (moduleSize < 1.0f) { if (moduleSize < 1.0f) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
int dimension = computeDimension(topLeft, topRight, bottomLeft, moduleSize); int dimension = computeDimension(topLeft, topRight, bottomLeft, moduleSize);
Version provisionalVersion = Version.getProvisionalVersionForDimension(dimension); Version provisionalVersion = Version.getProvisionalVersionForDimension(dimension);
@ -115,7 +118,7 @@ public class Detector {
estAlignmentY, estAlignmentY,
(float) i); (float) i);
break; break;
} catch (ReaderException re) { } catch (NotFoundException re) {
// try next round // try next round
} }
} }
@ -180,7 +183,7 @@ public class Detector {
private static BitMatrix sampleGrid(BitMatrix image, private static BitMatrix sampleGrid(BitMatrix image,
PerspectiveTransform transform, PerspectiveTransform transform,
int dimension) throws ReaderException { int dimension) throws NotFoundException {
GridSampler sampler = GridSampler.getInstance(); GridSampler sampler = GridSampler.getInstance();
return sampler.sampleGrid(image, dimension, transform); return sampler.sampleGrid(image, dimension, transform);
@ -193,7 +196,7 @@ public class Detector {
protected static int computeDimension(ResultPoint topLeft, protected static int computeDimension(ResultPoint topLeft,
ResultPoint topRight, ResultPoint topRight,
ResultPoint bottomLeft, ResultPoint bottomLeft,
float moduleSize) throws ReaderException { float moduleSize) throws NotFoundException {
int tltrCentersDimension = round(ResultPoint.distance(topLeft, topRight) / moduleSize); int tltrCentersDimension = round(ResultPoint.distance(topLeft, topRight) / moduleSize);
int tlblCentersDimension = round(ResultPoint.distance(topLeft, bottomLeft) / moduleSize); int tlblCentersDimension = round(ResultPoint.distance(topLeft, bottomLeft) / moduleSize);
int dimension = ((tltrCentersDimension + tlblCentersDimension) >> 1) + 7; int dimension = ((tltrCentersDimension + tlblCentersDimension) >> 1) + 7;
@ -206,7 +209,7 @@ public class Detector {
dimension--; dimension--;
break; break;
case 3: case 3:
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
return dimension; return dimension;
} }
@ -352,20 +355,20 @@ public class Detector {
* @param estAlignmentY y coordinate of above * @param estAlignmentY y coordinate of above
* @param allowanceFactor number of pixels in all directions to search from the center * @param allowanceFactor number of pixels in all directions to search from the center
* @return {@link AlignmentPattern} if found, or null otherwise * @return {@link AlignmentPattern} if found, or null otherwise
* @throws ReaderException if an unexpected error occurs during detection * @throws NotFoundException if an unexpected error occurs during detection
*/ */
protected AlignmentPattern findAlignmentInRegion(float overallEstModuleSize, protected AlignmentPattern findAlignmentInRegion(float overallEstModuleSize,
int estAlignmentX, int estAlignmentX,
int estAlignmentY, int estAlignmentY,
float allowanceFactor) float allowanceFactor)
throws ReaderException { throws NotFoundException {
// Look for an alignment pattern (3 modules in size) around where it // Look for an alignment pattern (3 modules in size) around where it
// should be // should be
int allowance = (int) (allowanceFactor * overallEstModuleSize); int allowance = (int) (allowanceFactor * overallEstModuleSize);
int alignmentAreaLeftX = Math.max(0, estAlignmentX - allowance); int alignmentAreaLeftX = Math.max(0, estAlignmentX - allowance);
int alignmentAreaRightX = Math.min(image.getWidth() - 1, estAlignmentX + allowance); int alignmentAreaRightX = Math.min(image.getWidth() - 1, estAlignmentX + allowance);
if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) { if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) {
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
int alignmentAreaTopY = Math.max(0, estAlignmentY - allowance); int alignmentAreaTopY = Math.max(0, estAlignmentY - allowance);

View file

@ -17,12 +17,12 @@
package com.google.zxing.qrcode.detector; package com.google.zxing.qrcode.detector;
import com.google.zxing.DecodeHintType; import com.google.zxing.DecodeHintType;
import com.google.zxing.ReaderException; import com.google.zxing.NotFoundException;
import com.google.zxing.ResultPoint; import com.google.zxing.ResultPoint;
import com.google.zxing.ResultPointCallback; import com.google.zxing.ResultPointCallback;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.Collections; import com.google.zxing.common.Collections;
import com.google.zxing.common.Comparator; import com.google.zxing.common.Comparator;
import com.google.zxing.common.BitMatrix;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Vector; import java.util.Vector;
@ -72,7 +72,7 @@ public class FinderPatternFinder {
return possibleCenters; return possibleCenters;
} }
FinderPatternInfo find(Hashtable hints) throws ReaderException { FinderPatternInfo find(Hashtable hints) throws NotFoundException {
boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER); boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER);
int maxI = image.getHeight(); int maxI = image.getHeight();
int maxJ = image.getWidth(); int maxJ = image.getWidth();
@ -488,14 +488,14 @@ public class FinderPatternFinder {
* @return the 3 best {@link FinderPattern}s from our list of candidates. The "best" are * @return the 3 best {@link FinderPattern}s from our list of candidates. The "best" are
* those that have been detected at least {@link #CENTER_QUORUM} times, and whose module * those that have been detected at least {@link #CENTER_QUORUM} times, and whose module
* size differs from the average among those patterns the least * size differs from the average among those patterns the least
* @throws ReaderException if 3 such finder patterns do not exist * @throws NotFoundException if 3 such finder patterns do not exist
*/ */
private FinderPattern[] selectBestPatterns() throws ReaderException { private FinderPattern[] selectBestPatterns() throws NotFoundException {
int startSize = possibleCenters.size(); int startSize = possibleCenters.size();
if (startSize < 3) { if (startSize < 3) {
// Couldn't find enough finder patterns // Couldn't find enough finder patterns
throw ReaderException.getInstance(); throw NotFoundException.getNotFoundInstance();
} }
// Filter outlier possibilities whose module size is too different // Filter outlier possibilities whose module size is too different

View file

@ -16,8 +16,8 @@
package com.google.zxing.qrcode.encoder; package com.google.zxing.qrcode.encoder;
import com.google.zxing.WriterException;
import com.google.zxing.EncodeHintType; import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.ByteArray; import com.google.zxing.common.ByteArray;
import com.google.zxing.common.ByteMatrix; import com.google.zxing.common.ByteMatrix;
import com.google.zxing.common.CharacterSetECI; import com.google.zxing.common.CharacterSetECI;
@ -27,9 +27,9 @@ import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.google.zxing.qrcode.decoder.Mode; import com.google.zxing.qrcode.decoder.Mode;
import com.google.zxing.qrcode.decoder.Version; import com.google.zxing.qrcode.decoder.Version;
import java.util.Vector;
import java.util.Hashtable;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.Hashtable;
import java.util.Vector;
/** /**
* @author satorux@google.com (Satoru Takabayashi) - creator * @author satorux@google.com (Satoru Takabayashi) - creator

View file

@ -16,9 +16,9 @@
package com.google.zxing.client.result; package com.google.zxing.client.result;
import junit.framework.TestCase;
import com.google.zxing.Result;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import junit.framework.TestCase;
import java.util.Arrays; import java.util.Arrays;

View file

@ -16,9 +16,9 @@
package com.google.zxing.client.result; package com.google.zxing.client.result;
import junit.framework.TestCase;
import com.google.zxing.Result;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import junit.framework.TestCase;
/** /**
* Tests {@link CalendarParsedResult}. * Tests {@link CalendarParsedResult}.

View file

@ -16,9 +16,9 @@
package com.google.zxing.client.result; package com.google.zxing.client.result;
import junit.framework.TestCase;
import com.google.zxing.Result;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import junit.framework.TestCase;
/** /**
* Tests {@link EmailAddressParsedResult}. * Tests {@link EmailAddressParsedResult}.

View file

@ -16,9 +16,9 @@
package com.google.zxing.client.result; package com.google.zxing.client.result;
import junit.framework.TestCase;
import com.google.zxing.Result;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import junit.framework.TestCase;
/** /**
* Tests {@link com.google.zxing.client.result.GeoParsedResult}. * Tests {@link com.google.zxing.client.result.GeoParsedResult}.

View file

@ -16,9 +16,9 @@
package com.google.zxing.client.result; package com.google.zxing.client.result;
import junit.framework.TestCase;
import com.google.zxing.Result;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import junit.framework.TestCase;
/** /**
* Tests {@link ISBNParsedResult}. * Tests {@link ISBNParsedResult}.

View file

@ -16,9 +16,9 @@
package com.google.zxing.client.result; package com.google.zxing.client.result;
import junit.framework.TestCase;
import com.google.zxing.Result;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import junit.framework.TestCase;
/** /**
* Tests {@link ProductParsedResult}. * Tests {@link ProductParsedResult}.

View file

@ -16,9 +16,9 @@
package com.google.zxing.client.result; package com.google.zxing.client.result;
import junit.framework.TestCase;
import com.google.zxing.Result;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import junit.framework.TestCase;
/** /**
* Tests {@link SMSParsedResult}. * Tests {@link SMSParsedResult}.

View file

@ -16,9 +16,9 @@
package com.google.zxing.client.result; package com.google.zxing.client.result;
import junit.framework.TestCase;
import com.google.zxing.Result;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import junit.framework.TestCase;
/** /**
* Tests {@link TelParsedResult}. * Tests {@link TelParsedResult}.

View file

@ -16,9 +16,9 @@
package com.google.zxing.client.result; package com.google.zxing.client.result;
import junit.framework.TestCase;
import com.google.zxing.Result;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import junit.framework.TestCase;
/** /**
* Tests {@link URIParsedResult}. * Tests {@link URIParsedResult}.

View file

@ -24,9 +24,9 @@ import com.google.zxing.Reader;
import com.google.zxing.ReaderException; import com.google.zxing.ReaderException;
import com.google.zxing.Result; import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import junit.framework.TestCase; import junit.framework.TestCase;
import javax.imageio.ImageIO;
import java.awt.geom.AffineTransform; import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp; import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
@ -41,8 +41,6 @@ import java.util.ArrayList;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.List; import java.util.List;
import javax.imageio.ImageIO;
/** /**
* @author Sean Owen * @author Sean Owen
* @author dswitkin@google.com (Daniel Switkin) * @author dswitkin@google.com (Daniel Switkin)

View file

@ -23,14 +23,13 @@ import com.google.zxing.ReaderException;
import com.google.zxing.Result; import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.imageio.ImageIO;
/** /**
* This abstract class looks for negative results, i.e. it only allows a certain number of false * This abstract class looks for negative results, i.e. it only allows a certain number of false
* positives in images which should not decode. This helps ensure that we are not too lenient. * positives in images which should not decode. This helps ensure that we are not too lenient.

View file

@ -18,14 +18,12 @@ package com.google.zxing.datamatrix.decoder;
import junit.framework.TestCase; import junit.framework.TestCase;
import com.google.zxing.ReaderException;
/** /**
* @author bbrown@google.com (Brian Brown) * @author bbrown@google.com (Brian Brown)
*/ */
public final class DecodedBitStreamParserTestCase extends TestCase{ public final class DecodedBitStreamParserTestCase extends TestCase{
public void testAsciiStandardDecode() throws ReaderException { public void testAsciiStandardDecode() throws Exception {
// ASCII characters 0-127 are encoded as the value + 1 // ASCII characters 0-127 are encoded as the value + 1
byte[] bytes = {(byte) ('a' + 1), (byte) ('b' + 1), (byte) ('c' + 1), byte[] bytes = {(byte) ('a' + 1), (byte) ('b' + 1), (byte) ('c' + 1),
(byte) ('A' + 1), (byte) ('B' + 1), (byte) ('C' + 1)}; (byte) ('A' + 1), (byte) ('B' + 1), (byte) ('C' + 1)};
@ -33,7 +31,7 @@ public final class DecodedBitStreamParserTestCase extends TestCase{
assertEquals("abcABC", decodedString); assertEquals("abcABC", decodedString);
} }
public void testAsciiDoubleDigitDecode() throws ReaderException{ public void testAsciiDoubleDigitDecode() throws Exception{
// ASCII double digit (00 - 99) Numeric Value + 130 // ASCII double digit (00 - 99) Numeric Value + 130
byte[] bytes = {(byte) 130 , (byte) ( 1 + 130), byte[] bytes = {(byte) 130 , (byte) ( 1 + 130),
(byte) (98 + 130), (byte) (99 + 130)}; (byte) (98 + 130), (byte) (99 + 130)};

View file

@ -16,8 +16,8 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,8 +16,8 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,8 +16,8 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.common.AbstractBlackBoxTestCase;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**
* @author Sean Owen * @author Sean Owen

View file

@ -16,8 +16,8 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,8 +16,8 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,12 +16,10 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
import java.io.File;
/** /**
* @author dswitkin@google.com (Daniel Switkin) * @author dswitkin@google.com (Daniel Switkin)
*/ */

View file

@ -16,8 +16,8 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,8 +16,8 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,8 +16,8 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,8 +16,8 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,8 +16,8 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,8 +16,8 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,8 +16,8 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,8 +16,8 @@
package com.google.zxing.oned; package com.google.zxing.oned;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,8 +16,8 @@
package com.google.zxing.qrcode; package com.google.zxing.qrcode;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,8 +16,8 @@
package com.google.zxing.qrcode; package com.google.zxing.qrcode;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,8 +16,8 @@
package com.google.zxing.qrcode; package com.google.zxing.qrcode;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,8 +16,8 @@
package com.google.zxing.qrcode; package com.google.zxing.qrcode;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,8 +16,8 @@
package com.google.zxing.qrcode; package com.google.zxing.qrcode;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase; import com.google.zxing.common.AbstractBlackBoxTestCase;
/** /**

View file

@ -16,7 +16,6 @@
package com.google.zxing.qrcode.decoder; package com.google.zxing.qrcode.decoder;
import com.google.zxing.ReaderException;
import com.google.zxing.common.BitSourceBuilder; import com.google.zxing.common.BitSourceBuilder;
import junit.framework.TestCase; import junit.framework.TestCase;
@ -27,7 +26,7 @@ import junit.framework.TestCase;
*/ */
public final class DecodedBitStreamParserTestCase extends TestCase { public final class DecodedBitStreamParserTestCase extends TestCase {
public void testSimpleByteMode() throws ReaderException { public void testSimpleByteMode() throws Exception {
BitSourceBuilder builder = new BitSourceBuilder(); BitSourceBuilder builder = new BitSourceBuilder();
builder.write(0x04, 4); // Byte mode builder.write(0x04, 4); // Byte mode
builder.write(0x03, 8); // 3 bytes builder.write(0x03, 8); // 3 bytes
@ -39,7 +38,7 @@ public final class DecodedBitStreamParserTestCase extends TestCase {
assertEquals("\u00f1\u00f2\u00f3", result); assertEquals("\u00f1\u00f2\u00f3", result);
} }
public void testSimpleSJIS() throws ReaderException { public void testSimpleSJIS() throws Exception {
BitSourceBuilder builder = new BitSourceBuilder(); BitSourceBuilder builder = new BitSourceBuilder();
builder.write(0x04, 4); // Byte mode builder.write(0x04, 4); // Byte mode
builder.write(0x03, 8); // 3 bytes builder.write(0x03, 8); // 3 bytes
@ -51,7 +50,7 @@ public final class DecodedBitStreamParserTestCase extends TestCase {
assertEquals("\uff61\uff62\uff63", result); assertEquals("\uff61\uff62\uff63", result);
} }
public void testECI() throws ReaderException { public void testECI() throws Exception {
BitSourceBuilder builder = new BitSourceBuilder(); BitSourceBuilder builder = new BitSourceBuilder();
builder.write(0x07, 4); // ECI mode builder.write(0x07, 4); // ECI mode
builder.write(0x02, 8); // ECI 2 = CP437 encoding builder.write(0x02, 8); // ECI 2 = CP437 encoding

View file

@ -16,7 +16,6 @@
package com.google.zxing.qrcode.decoder; package com.google.zxing.qrcode.decoder;
import com.google.zxing.ReaderException;
import junit.framework.TestCase; import junit.framework.TestCase;
/** /**
@ -51,7 +50,7 @@ public final class VersionTestCase extends TestCase {
assertNotNull(version.buildFunctionPattern()); assertNotNull(version.buildFunctionPattern());
} }
public void testGetProvisionalVersionForDimension() throws ReaderException { public void testGetProvisionalVersionForDimension() throws Exception {
for (int i = 1; i <= 40; i++) { for (int i = 1; i <= 40; i++) {
assertEquals(i, Version.getProvisionalVersionForDimension(4*i + 17).getVersionNumber()); assertEquals(i, Version.getProvisionalVersionForDimension(4*i + 17).getVersionNumber());
} }

View file

@ -18,9 +18,12 @@ package com.google.zxing.client.j2se;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap; import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.DecodeHintType; import com.google.zxing.DecodeHintType;
import com.google.zxing.FormatException;
import com.google.zxing.LuminanceSource; import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader; import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.ReaderException; import com.google.zxing.ReaderException;
import com.google.zxing.Result; import com.google.zxing.Result;
import com.google.zxing.client.result.ParsedResult; import com.google.zxing.client.result.ParsedResult;
@ -210,7 +213,7 @@ public final class CommandLineRunner {
", type: " + parsedResult.getType() + "):\nRaw result:\n" + result.getText() + ", type: " + parsedResult.getType() + "):\nRaw result:\n" + result.getText() +
"\nParsed result:\n" + parsedResult.getDisplayResult()); "\nParsed result:\n" + parsedResult.getDisplayResult());
return result; return result;
} catch (ReaderException e) { } catch (NotFoundException nfe) {
System.out.println(uri.toString() + ": No barcode found"); System.out.println(uri.toString() + ": No barcode found");
return null; return null;
} finally { } finally {
@ -247,7 +250,7 @@ public final class CommandLineRunner {
for (int y = 0; y < height; y++) { for (int y = 0; y < height; y++) {
try { try {
row = bitmap.getBlackRow(y, row); row = bitmap.getBlackRow(y, row);
} catch (ReaderException e) { } catch (NotFoundException nfe) {
// If fetching the row failed, draw a red line and keep going. // If fetching the row failed, draw a red line and keep going.
int offset = y * stride + width; int offset = y * stride + width;
for (int x = 0; x < width; x++) { for (int x = 0; x < width; x++) {
@ -279,7 +282,7 @@ public final class CommandLineRunner {
} }
} }
} }
} catch (ReaderException e) { } catch (NotFoundException nfe) {
} }
// Write the result // Write the result

View file

@ -18,6 +18,7 @@ package com.google.zxing.client.j2se;
import com.google.zxing.BinaryBitmap; import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource; import com.google.zxing.LuminanceSource;
import com.google.zxing.NotFoundException;
import com.google.zxing.ReaderException; import com.google.zxing.ReaderException;
import com.google.zxing.common.BitArray; import com.google.zxing.common.BitArray;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
@ -107,7 +108,7 @@ public final class ImageConverter {
for (int y = 0; y < height; y++) { for (int y = 0; y < height; y++) {
try { try {
array = bitmap.getBlackRow(y, array); array = bitmap.getBlackRow(y, array);
} catch (ReaderException e) { } catch (NotFoundException nfe) {
// Draw rows with insufficient dynamic range in red // Draw rows with insufficient dynamic range in red
for (int x = 0; x < width; x++) { for (int x = 0; x < width; x++) {
result.setRGB(x, y, RED); result.setRGB(x, y, RED);
@ -127,7 +128,7 @@ public final class ImageConverter {
result.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE); result.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
} }
} }
} catch (ReaderException e) { } catch (NotFoundException nfe) {
} }
} }

View file

@ -18,9 +18,12 @@ package com.google.zxing.web;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap; import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.DecodeHintType; import com.google.zxing.DecodeHintType;
import com.google.zxing.FormatException;
import com.google.zxing.LuminanceSource; import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader; import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Reader; import com.google.zxing.Reader;
import com.google.zxing.ReaderException; import com.google.zxing.ReaderException;
import com.google.zxing.Result; import com.google.zxing.Result;
@ -85,7 +88,7 @@ import javax.servlet.http.HttpServletResponse;
*/ */
public final class DecodeServlet extends HttpServlet { public final class DecodeServlet extends HttpServlet {
private static final long MAX_IMAGE_SIZE = 500000L; private static final long MAX_IMAGE_SIZE = 2000000L;
private static final Logger log = Logger.getLogger(DecodeServlet.class.getName()); private static final Logger log = Logger.getLogger(DecodeServlet.class.getName());
@ -260,10 +263,18 @@ public final class DecodeServlet extends HttpServlet {
LuminanceSource source = new BufferedImageLuminanceSource(image); LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
result = reader.decode(bitmap, HINTS); result = reader.decode(bitmap, HINTS);
} catch (ReaderException re2) { } catch (NotFoundException nfe) {
log.info("DECODE FAILED: " + re.toString()); log.info("Not found: " + re.toString());
response.sendRedirect("notfound.jspx"); response.sendRedirect("notfound.jspx");
return; return;
} catch (FormatException fe) {
log.info("Format problem: " + re.toString());
response.sendRedirect("format.jspx");
return;
} catch (ChecksumException ce) {
log.info("Checksum problem: " + re.toString());
response.sendRedirect("format.jspx");
return;
} }
} }

36
zxingorg/web/format.jspx Normal file
View file

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2008 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.
-->
<!-- Author: Sean Owen -->
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="1.2">
<jsp:directive.page contentType="text/html" session="false"/>
<jsp:scriptlet>response.setHeader("Cache-Control", "public");</jsp:scriptlet>
<jsp:text><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">]]></jsp:text>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>No Barcode Found</title>
<link rel="stylesheet" href="style.css" type="text/css"/>
</head>
<body>
<div id="header"><h1><img src="zxing-icon.png" height="32" width="32" alt=""/> Barcode Format Problem</h1></div>
<p>A barcode was possibly found in this image, but a problem occurred while decoding it. The data did not conform
to the barcode format. This could be due to a misdetection of the barcode, or could indicate a problem
with the barcode contents. Go "Back" in your browser and try another image.
</p>
<jsp:include page="analytics.jspx"/>
</body>
</html>
</jsp:root>