C++ port: Hints infrastructure was added in r1499. This changeset implements reader...
authorflyashi <flyashi@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Wed, 4 Aug 2010 13:35:44 +0000 (13:35 +0000)
committerflyashi <flyashi@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Wed, 4 Aug 2010 13:35:44 +0000 (13:35 +0000)
git-svn-id: http://zxing.googlecode.com/svn/trunk@1505 59b500cc-1b3d-0410-9834-0bbf25fbcc57

12 files changed:
cpp/core/src/zxing/DecodeHints.cpp
cpp/core/src/zxing/DecodeHints.h
cpp/core/src/zxing/MultiFormatReader.cpp
cpp/core/src/zxing/MultiFormatReader.h
cpp/core/src/zxing/Reader.cpp
cpp/core/src/zxing/Reader.h
cpp/core/src/zxing/oned/ITFReader.cpp
cpp/core/src/zxing/oned/MultiFormatOneDReader.cpp
cpp/core/src/zxing/oned/MultiFormatOneDReader.h
cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp
cpp/core/src/zxing/oned/MultiFormatUPCEANReader.h
cpp/magick/src/main.cpp

index 5a9da76..6947de5 100644 (file)
 #include <zxing/common/IllegalArgumentException.h>
 namespace zxing {
 
+const DecodeHints DecodeHints::PRODUCT_HINT(
+    BARCODEFORMAT_UPC_E_HINT |
+    BARCODEFORMAT_UPC_A_HINT |
+    BARCODEFORMAT_EAN_8_HINT |
+    BARCODEFORMAT_EAN_13_HINT);
+
+const DecodeHints DecodeHints::ONED_HINT(
+    BARCODEFORMAT_UPC_E_HINT |
+    BARCODEFORMAT_UPC_A_HINT |
+    BARCODEFORMAT_EAN_8_HINT |
+    BARCODEFORMAT_EAN_13_HINT |
+    BARCODEFORMAT_CODE_128_HINT |
+    BARCODEFORMAT_CODE_39_HINT |
+    BARCODEFORMAT_ITF_HINT);
+
+const DecodeHints DecodeHints::DEFAULT_HINT(
+    BARCODEFORMAT_UPC_E_HINT |
+    BARCODEFORMAT_UPC_A_HINT |
+    BARCODEFORMAT_EAN_8_HINT |
+    BARCODEFORMAT_EAN_13_HINT |
+    BARCODEFORMAT_CODE_128_HINT |
+    BARCODEFORMAT_CODE_39_HINT |
+    BARCODEFORMAT_ITF_HINT |
+    // TODO: uncomment once this passes QA
+    // BARCODEFORMAT_DATA_MATRIX_HINT |
+    BARCODEFORMAT_QR_CODE_HINT);
+
 DecodeHints::DecodeHints() {
   hints = 0;
 }
@@ -29,10 +56,6 @@ DecodeHints::DecodeHints(DecodeHintType init) {
   hints = init;
 }
 
-DecodeHints::~DecodeHints() {
-  // if DecodeHintType requires a destructor in the future, call it here
-}
-
 void DecodeHints::addFormat(BarcodeFormat toadd) {
   switch (toadd) {
     case BarcodeFormat_QR_CODE: hints |= BARCODEFORMAT_QR_CODE_HINT; break;
index cd1fe25..897939d 100644 (file)
@@ -1,3 +1,5 @@
+#ifndef __DECODEHINTS_H_
+#define __DECODEHINTS_H_
 /*
  *  DecodeHintType.h
  *  zxing
@@ -16,8 +18,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#ifndef DECODEHINTS_H_
-#define DECODEHINTS_H_
 
 #include <zxing/BarcodeFormat.h>
 
@@ -44,29 +44,13 @@ class DecodeHints {
 
  public:
 
-  static const DecodeHintType BARCODEFORMAT_PRODUCT_HINT =
-      BARCODEFORMAT_UPC_E_HINT |
-      BARCODEFORMAT_UPC_A_HINT |
-      BARCODEFORMAT_EAN_8_HINT |
-      BARCODEFORMAT_EAN_13_HINT;
-
-  static const DecodeHintType BARCODEFORMAT_ONED_HINT =
-      BARCODEFORMAT_PRODUCT_HINT |
-      BARCODEFORMAT_CODE_128_HINT |
-      BARCODEFORMAT_CODE_39_HINT |
-      BARCODEFORMAT_ITF_HINT;
-
-  static const DecodeHintType BARCODEFORMAT_ANY_HINT =
-      BARCODEFORMAT_ONED_HINT |
-// TODO: uncomment once this passes QA
-//      BARCODEFORMAT_DATA_MATRIX_HINT |
-      BARCODEFORMAT_QR_CODE_HINT;
-
-  static const DecodeHintType DEFAULT_HINTS = BARCODEFORMAT_ANY_HINT;
+  static const DecodeHints PRODUCT_HINT;
+  static const DecodeHints ONED_HINT;
+  static const DecodeHints DEFAULT_HINT;
 
   DecodeHints();
   DecodeHints(DecodeHintType init);
-  ~DecodeHints();
+
   void addFormat(BarcodeFormat toadd);
   bool containsFormat(BarcodeFormat tocheck) const;
   void setTryHarder(bool toset);
index a463188..66b4b13 100644 (file)
 
 namespace zxing {
        MultiFormatReader::MultiFormatReader() {
-               readers.push_back(new zxing::qrcode::QRCodeReader());
-               readers.push_back(new zxing::datamatrix::DataMatrixReader());
-               readers.push_back(new zxing::oned::MultiFormatUPCEANReader());
-               readers.push_back(new zxing::oned::MultiFormatOneDReader());
+
        }
        
-       Ref<Result> MultiFormatReader::decode(Ref<BinaryBitmap> image, DecodeHints hints){
-               for (unsigned int i = 0; i < readers.size(); i++) {
+       Ref<Result> MultiFormatReader::decode(Ref<BinaryBitmap> image) {
+         setHints(DecodeHints::DEFAULT_HINT);
+         return decodeInternal(image);
+       }
+
+       Ref<Result> MultiFormatReader::decode(Ref<BinaryBitmap> image, DecodeHints hints) {
+    setHints(hints);
+    return decodeInternal(image);
+  }
+
+  Ref<Result> MultiFormatReader::decodeWithState(Ref<BinaryBitmap> image) {
+    // Make sure to set up the default state so we don't crash
+    if (readers_.size() == 0) {
+      setHints(DecodeHints::DEFAULT_HINT);
+    }
+    return decodeInternal(image);
+  }
+
+  void MultiFormatReader::setHints(DecodeHints hints) {
+    hints_ = hints;
+    readers_.clear();
+    bool tryHarder = hints.getTryHarder();
+
+    bool addOneDReader = hints.containsFormat(BarcodeFormat_UPC_E) ||
+                         hints.containsFormat(BarcodeFormat_UPC_A) ||
+                         hints.containsFormat(BarcodeFormat_EAN_8) ||
+                         hints.containsFormat(BarcodeFormat_EAN_13) ||
+                         hints.containsFormat(BarcodeFormat_CODE_128) ||
+                         hints.containsFormat(BarcodeFormat_CODE_39) ||
+                         hints.containsFormat(BarcodeFormat_ITF);
+    if (addOneDReader && !tryHarder) {
+      readers_.push_back(new zxing::oned::MultiFormatOneDReader(hints));
+    }
+    if (hints.containsFormat(BarcodeFormat_QR_CODE)) {
+      readers_.push_back(new zxing::qrcode::QRCodeReader());
+    }
+    if (hints.containsFormat(BarcodeFormat_DATA_MATRIX)) {
+      readers_.push_back(new zxing::datamatrix::DataMatrixReader());
+    }
+    //TODO: add PDF417 here once PDF417 reader is implemented
+    if (addOneDReader && tryHarder) {
+      readers_.push_back(new zxing::oned::MultiFormatOneDReader(hints));
+    }
+    if (readers_.size() == 0) {
+      if (!tryHarder) {
+        readers_.push_back(new zxing::oned::MultiFormatOneDReader(hints));
+      }
+      readers_.push_back(new zxing::qrcode::QRCodeReader());
+      if (tryHarder) {
+        readers_.push_back(new zxing::oned::MultiFormatOneDReader(hints));
+      }
+    }
+  }
+
+       Ref<Result> MultiFormatReader::decodeInternal(Ref<BinaryBitmap> image) {
+               for (unsigned int i = 0; i < readers_.size(); i++) {
                        try {
-                               return readers[i]->decode(image, hints);
+                               return readers_[i]->decode(image, hints_);
                        } catch (ReaderException re) {
                                // continue
                        }
@@ -46,8 +97,8 @@ namespace zxing {
        }
        
        MultiFormatReader::~MultiFormatReader(){
-               for (unsigned int i = 0; i < readers.size(); i++) {
-                       delete readers[i];
+               for (unsigned int i = 0; i < readers_.size(); i++) {
+                       delete readers_[i];
                }
        }
 }
index 44d4ce2..53d6b57 100644 (file)
@@ -1,9 +1,10 @@
+#ifndef __MULTI_FORMAT_READER_H__
+#define __MULTI_FORMAT_READER_H__
+
 /*
  *  MultiFormatBarcodeReader.h
  *  ZXing
  *
- *  Created by Lukasz Warchol on 10-01-26.
- *  Modified by Luiz Silva on 09/02/2010.
  *  Copyright 2010 ZXing authors All rights reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,12 +30,20 @@ namespace zxing {
        class MultiFormatReader : public Reader {
                
        private:
-               std::vector<Reader*>readers;
+         Ref<Result> decodeInternal(Ref<BinaryBitmap> image);
+       
+               std::vector<Reader*> readers_;
+               DecodeHints hints_;
+
        public:
                MultiFormatReader();
                
+               Ref<Result> decode(Ref<BinaryBitmap> image);
                Ref<Result> decode(Ref<BinaryBitmap> image, DecodeHints hints);
-  
+    Ref<Result> decodeWithState(Ref<BinaryBitmap> image);
+    void setHints(DecodeHints hints);
                ~MultiFormatReader();
        };
 }
+
+#endif
index 8326051..d64f825 100755 (executable)
@@ -25,8 +25,7 @@ namespace zxing {
 Reader::~Reader() { }
 
 Ref<Result> Reader::decode(Ref<BinaryBitmap> image) {
-  DecodeHints hints(hints.DEFAULT_HINTS);
-  return decode(image, hints);
+  return decode(image, DecodeHints::DEFAULT_HINT);
 }
 
 }
index 8f16c98..05c741b 100755 (executable)
@@ -5,8 +5,7 @@
  *  Reader.h
  *  zxing
  *
- *  Created by Christian Brunschen on 13/05/2008.
- *  Copyright 2008 ZXing authors All rights reserved.
+ *  Copyright 2010 ZXing authors All rights reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -31,7 +30,7 @@ namespace zxing {
   protected:
    Reader() {}
   public:
-   Ref<Result> decode(Ref<BinaryBitmap> image);
+   virtual Ref<Result> decode(Ref<BinaryBitmap> image);
    virtual Ref<Result> decode(Ref<BinaryBitmap> image, DecodeHints hints) = 0;
    virtual ~Reader();
 };
index 7db44f9..3848d6e 100644 (file)
@@ -214,6 +214,7 @@ namespace zxing {
                                endPattern[0] = row->getSize() - endPattern[1];
                                endPattern[1] = row->getSize() - temp;
                                
+                               row->reverse();
                                return endPattern;
                        } catch (ReaderException re) {
                                row->reverse();
index ea44471..904601e 100644 (file)
 
 namespace zxing {
        namespace oned {
-               MultiFormatOneDReader::MultiFormatOneDReader() : readers() {
-                       readers.push_back(Ref<OneDReader>(new MultiFormatUPCEANReader()));
-                       readers.push_back(Ref<OneDReader>(new Code39Reader()));
-                       readers.push_back(Ref<OneDReader>(new Code128Reader()));
-                       readers.push_back(Ref<OneDReader>(new ITFReader()));
+               MultiFormatOneDReader::MultiFormatOneDReader(DecodeHints hints) : readers() {
+      if (hints.containsFormat(BarcodeFormat_EAN_13) ||
+          hints.containsFormat(BarcodeFormat_EAN_8) ||
+          hints.containsFormat(BarcodeFormat_UPC_A) ||
+          hints.containsFormat(BarcodeFormat_UPC_E)) {
+        readers.push_back(Ref<OneDReader>(new MultiFormatUPCEANReader(hints)));
+      }
+      if (hints.containsFormat(BarcodeFormat_CODE_39)) {
+        readers.push_back(Ref<OneDReader>(new Code39Reader()));
+      }
+      if (hints.containsFormat(BarcodeFormat_CODE_128)) {
+        readers.push_back(Ref<OneDReader>(new Code128Reader()));
+      }
+      if (hints.containsFormat(BarcodeFormat_ITF)) {
+        readers.push_back(Ref<OneDReader>(new ITFReader()));
+      }
+      if (readers.size() == 0) {
+        readers.push_back(Ref<OneDReader>(new MultiFormatUPCEANReader(hints)));
+        readers.push_back(Ref<OneDReader>(new Code39Reader()));
+        readers.push_back(Ref<OneDReader>(new Code128Reader()));
+        readers.push_back(Ref<OneDReader>(new ITFReader()));
+      }
                }
                
                Ref<Result> MultiFormatOneDReader::decodeRow(int rowNumber, Ref<BitArray> row){
index 0e5ab53..3342112 100644 (file)
@@ -1,9 +1,10 @@
+#ifndef __MULTI_FORMAT_ONED_READER_H__
+#define __MULTI_FORMAT_ONED_READER_H__
 /*
  *  MultiFormatOneDReader.h
  *  ZXing
  *
- *  Created by Lukasz Warchol on 10-01-25.
- *  Copyright 2010 ZXing authors All rights reserved.
+  *  Copyright 2010 ZXing authors All rights reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,8 +20,6 @@
  */
 
 #include <zxing/oned/OneDReader.h>
-#include <zxing/common/BitArray.h>
-#include <zxing/Result.h>
 
 namespace zxing {
        namespace oned {
@@ -29,9 +28,11 @@ namespace zxing {
                private:
                        std::vector<Ref<OneDReader> > readers;
                public:
-                       MultiFormatOneDReader();
+                       MultiFormatOneDReader(DecodeHints hints);
                        
                        Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row);                        
                };
        }
 }
+
+#endif
index 24aa5e6..a11243c 100644 (file)
@@ -22,6 +22,7 @@
 #include <zxing/oned/EAN13Reader.h>
 #include <zxing/oned/EAN8Reader.h>
 #include <zxing/oned/UPCEReader.h>
+#include <zxing/oned/UPCAReader.h>
 #include <zxing/oned/OneDResultPoint.h>
 #include <zxing/common/Array.h>
 #include <zxing/ReaderException.h>
 namespace zxing {
        namespace oned {
                
-               MultiFormatUPCEANReader::MultiFormatUPCEANReader() : readers() {
-                       readers.push_back(Ref<OneDReader>(new EAN13Reader()));
-                       // UPC-A is covered by EAN-13
-                       readers.push_back(Ref<OneDReader>(new EAN8Reader()));
-                       readers.push_back(Ref<OneDReader>(new UPCEReader()));
+               MultiFormatUPCEANReader::MultiFormatUPCEANReader(DecodeHints hints) : readers() {
+                 if (hints.containsFormat(BarcodeFormat_EAN_13)) {
+                   readers.push_back(Ref<OneDReader>(new EAN13Reader()));
+                 } else if (hints.containsFormat(BarcodeFormat_UPC_A)) {
+                   readers.push_back(Ref<OneDReader>(new UPCAReader()));
+                 }
+                 if (hints.containsFormat(BarcodeFormat_EAN_8)) {
+                   readers.push_back(Ref<OneDReader>(new EAN8Reader()));
+                 }
+                 if (hints.containsFormat(BarcodeFormat_UPC_E)) {
+                   readers.push_back(Ref<OneDReader>(new UPCEReader()));
+                 }
+                 if (readers.size() == 0) {
+             readers.push_back(Ref<OneDReader>(new EAN13Reader()));
+             // UPC-A is covered by EAN-13
+             readers.push_back(Ref<OneDReader>(new EAN8Reader()));
+             readers.push_back(Ref<OneDReader>(new UPCEReader()));
+                 }
                }
-               
+
                Ref<Result> MultiFormatUPCEANReader::decodeRow(int rowNumber, Ref<BitArray> row){                       
                        // Compute this location once and reuse it on multiple implementations
                        int size = readers.size();
index 2c5b196..b0bae4f 100644 (file)
@@ -1,8 +1,9 @@
+#ifndef __MULTI_FORMAT_UPC_EAN_READER_H__
+#define __MULTI_FORMAT_UPC_EAN_READER_H__
 /*
  *  MultiFormatUPCEANReader.h
  *  ZXing
  *
- *  Created by Lukasz Warchol on 10-01-25.
  *  Copyright 2010 ZXing authors All rights reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * limitations under the License.
  */
  
-
 #include <zxing/oned/OneDReader.h>
-#include <zxing/common/BitArray.h>
-#include <zxing/Result.h>
 
 namespace zxing {
        namespace oned {
@@ -31,9 +28,11 @@ namespace zxing {
                private:
                        std::vector<Ref<OneDReader> > readers;
                public:
-                       MultiFormatUPCEANReader();
+                       MultiFormatUPCEANReader(DecodeHints hints);
                        
                        Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row);
     };
        }
 }
+
+#endif
index ceb9cfc..1aba19f 100644 (file)
@@ -76,7 +76,7 @@ int test_image(Image& image, bool hybrid, string expected = "") {
       binarizer = new GlobalHistogramBinarizer(source);
     }
 
-    DecodeHints hints(hints.DEFAULT_HINTS);
+    DecodeHints hints(DecodeHints::DEFAULT_HINT);
     hints.setTryHarder(tryHarder);
     Ref<BinaryBitmap> binary(new BinaryBitmap(binarizer));
     Ref<Result> result(decode(binary, hints));
@@ -134,7 +134,11 @@ string get_expected(string imagefilename) {
   textfilename.replace(dotpos+1, textfilename.length() - dotpos - 1, "txt");
   char data[MAX_EXPECTED];
   FILE *fp = fopen(textfilename.data(), "rb");
-    
+
+  if (!fp) {
+    // could not open file
+    return "";
+  }
   // get file size
   fseek(fp, 0, SEEK_END);
   int toread = ftell(fp);