Navaron Bracke

use early returns on MacOS; fix MacOS from only returning a single barcode in ea…

…ch result; update MacOS to use the new format for image data
... ... @@ -80,7 +80,7 @@ class MobileScannerController extends ValueNotifier<MobileScannerState> {
///
/// If this is false, [BarcodeCapture.image] will always be null.
///
/// Defaults to false, and is only supported on iOS and Android.
/// Defaults to false, and is only supported on iOS, MacOS and Android.
final bool returnImage;
/// Whether the flashlight should be turned on when the camera is started.
... ...
... ... @@ -126,42 +126,54 @@ public class MobileScannerPlugin: NSObject, FlutterPlugin, FlutterStreamHandler,
do {
let barcodeRequest:VNDetectBarcodesRequest = VNDetectBarcodesRequest(completionHandler: { [weak self] (request, error) in
self?.imagesCurrentlyBeingProcessed = false
if error == nil {
if let results = request.results as? [VNBarcodeObservation] {
for barcode in results {
if self?.scanWindow != nil && cgImage != nil {
let match = self?.isBarCodeInScanWindow(self!.scanWindow!, barcode, cgImage!) ?? false
if (!match) {
continue
if error != nil {
DispatchQueue.main.async {
self?.sink?(FlutterError(code: "MobileScanner", message: error?.localizedDescription, details: nil))
}
return
}
DispatchQueue.main.async {
self?.sink?([
"name": "barcode",
"data": [
[
"payload": barcode.payloadStringValue ?? "",
"symbology": barcode.symbology.toInt ?? -1,
],
],
])
guard let results: [VNBarcodeObservation] = request.results as? [VNBarcodeObservation] else {
return
}
// if barcodeType == "QR" {
// let image = CIImage(image: source)
// image?.cropping(to: barcode.boundingBox)
// self.qrCodeDescriptor(qrCode: barcode, qrCodeImage: image!)
// }
if results.isEmpty {
return
}
let barcodes: [VNBarcodeObservation] = results.compactMap({ barcode in
// If there is a scan window, check if the barcode is within said scan window.
if self?.scanWindow != nil && cgImage != nil && !(self?.isBarCodeInScanWindow(self!.scanWindow!, barcode, cgImage!) ?? false) {
return nil
}
} else {
return barcode
})
DispatchQueue.main.async {
self?.sink?(FlutterError(code: "MobileScanner", message: error?.localizedDescription, details: nil))
if (!MobileScannerPlugin.returnImage) {
self?.sink?([
"name": "barcode",
"data": barcodes.map({ $0.toMap() }),
])
return
}
self?.sink?([
"name": "barcode",
"data": barcodes.map({ $0.toMap() }),
"image": cgImage == nil ? nil : [
"bytes": FlutterStandardTypedData(bytes: cgImage!.jpegData(compressionQuality: 0.8)!),
"width": cgImage!.width,
"height": cgImage!.height,
],
])
}
})
if(self?.symbologies.isEmpty == false){
// add the symbologies the user wishes to support
if self?.symbologies.isEmpty == false {
// Add the symbologies the user wishes to support.
barcodeRequest.symbologies = self!.symbologies
}
... ...