Converted tabs to spaces.
[zxing.git] / cpp / core / src / zxing / MultiFormatReader.cpp
index e65d0a9..2132fcb 100644 (file)
@@ -19,7 +19,7 @@
  * limitations under the License.
  */
 
-#include "MultiFormatReader.h"
+#include <zxing/MultiFormatReader.h>
 #include <zxing/qrcode/QRCodeReader.h>
 #include <zxing/datamatrix/DataMatrixReader.h>
 #include <zxing/oned/MultiFormatUPCEANReader.h>
 #include <zxing/ReaderException.h>
 
 namespace zxing {
-       MultiFormatReader::MultiFormatReader(){
-               readers = new std::vector<Reader*>();
-               
-               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){
-               int size = readers->size();
-               for (int i = 0; i < size; i++) {
-                       Reader* reader = (*readers)[i];
-                       try {
-                               return reader->decode(image);
-                       } catch (ReaderException re) {
-                               // continue
-                       }
-               }
-               throw ReaderException("No code detected");
-       }
-       MultiFormatReader::~MultiFormatReader(){
-               int size = readers->size();
-               for (int i = 0; i < size; i++) {
-                       delete (*readers)[i];
-               }
-               delete readers;
-       }
-}
\ No newline at end of file
+  MultiFormatReader::MultiFormatReader() {
+
+  }
+  
+  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(Ref<Reader>(new zxing::oned::MultiFormatOneDReader(hints)));
+    }
+    if (hints.containsFormat(BarcodeFormat_QR_CODE)) {
+      readers_.push_back(Ref<Reader>(new zxing::qrcode::QRCodeReader()));
+    }
+    if (hints.containsFormat(BarcodeFormat_DATA_MATRIX)) {
+      readers_.push_back(Ref<Reader>(new zxing::datamatrix::DataMatrixReader()));
+    }
+    //TODO: add PDF417 here once PDF417 reader is implemented
+    if (addOneDReader && tryHarder) {
+      readers_.push_back(Ref<Reader>(new zxing::oned::MultiFormatOneDReader(hints)));
+    }
+    if (readers_.size() == 0) {
+      if (!tryHarder) {
+        readers_.push_back(Ref<Reader>(new zxing::oned::MultiFormatOneDReader(hints)));
+      }
+      readers_.push_back(Ref<Reader>(new zxing::qrcode::QRCodeReader()));
+      if (tryHarder) {
+        readers_.push_back(Ref<Reader>(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_);
+      } catch (ReaderException re) {
+        // continue
+      }
+    }
+    throw ReaderException("No code detected");
+  }
+  
+  MultiFormatReader::~MultiFormatReader() {
+
+  }
+}