diff mupdf-source/thirdparty/zxing-cpp/example/ZXingQt5CamReader.qml @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mupdf-source/thirdparty/zxing-cpp/example/ZXingQt5CamReader.qml	Mon Sep 15 11:43:07 2025 +0200
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2020 Axel Waggershauser
+ */
+// SPDX-License-Identifier: Apache-2.0
+
+import QtQuick 2.12
+import QtQuick.Window 2.12
+import QtQuick.Controls 2.5
+import QtQuick.Layouts 1.12
+import QtQuick.Shapes 1.12
+import QtMultimedia 5.12
+import ZXing 1.0
+
+Window {
+	visible: true
+	width: 640
+	height: 480
+	title: Qt.application.name
+
+	property var nullPoints: [Qt.point(0,0), Qt.point(0,0), Qt.point(0,0), Qt.point(0,0)]
+	property var points: nullPoints
+
+	Timer {
+		id: resetInfo
+		interval: 1000
+	}
+
+	BarcodeReader {
+		id: barcodeReader
+
+		formats: (linearSwitch.checked ? (ZXing.LinearCodes) : ZXing.None) | (matrixSwitch.checked ? (ZXing.MatrixCodes) : ZXing.None)
+		tryRotate: tryRotateSwitch.checked
+		tryHarder: tryHarderSwitch.checked
+		tryInvert: tryInvertSwitch.checked
+		tryDownscale: tryDownscaleSwitch.checked
+		textMode: ZXing.HRI
+
+		// callback with parameter 'barcode', called for every successfully processed frame
+		onFoundBarcode: (barcode)=> {
+			points = [barcode.position.topLeft, barcode.position.topRight, barcode.position.bottomRight, barcode.position.bottomLeft]
+			info.text = qsTr("Format: \t %1 \nText: \t %2 \nType: \t %3 \nTime: \t %4 ms").arg(barcode.formatName).arg(barcode.text).arg(barcode.contentTypeName).arg(runTime)
+
+			resetInfo.restart()
+//			console.log(barcode)
+		}
+
+		// called for every processed frame where no barcode was detected
+		onFailedRead: ()=> {
+			points = nullPoints
+
+			if (!resetInfo.running)
+				info.text = "No barcode found (in %1 ms)".arg(runTime)
+		}
+	}
+
+	Camera {
+		id: camera
+
+		captureMode: Camera.CaptureViewfinder
+		deviceId: QtMultimedia.availableCameras[camerasComboBox.currentIndex] ? QtMultimedia.availableCameras[camerasComboBox.currentIndex].deviceId : ""
+
+		onDeviceIdChanged: {
+			focus.focusMode = CameraFocus.FocusContinuous
+			focus.focusPointMode = CameraFocus.FocusPointAuto
+		}
+
+		onError: console.log("camera error:" + errorString)
+	}
+
+	ColumnLayout {
+		anchors.fill: parent
+
+		RowLayout {
+			Layout.fillWidth: true
+			Layout.fillHeight: false
+			visible: QtMultimedia.availableCameras.length > 1
+			Label {
+				text: qsTr("Camera: ")
+				Layout.fillWidth: false
+			}
+			ComboBox {
+				id: camerasComboBox
+				Layout.fillWidth: true
+				model: QtMultimedia.availableCameras
+				textRole: "displayName"
+				currentIndex: 0
+			}
+		}
+
+		VideoOutput {
+			id: videoOutput
+			Layout.fillHeight: true
+			Layout.fillWidth: true
+			filters: [barcodeReader]
+			source: camera
+			autoOrientation: true
+
+			Shape {
+				id: polygon
+				anchors.fill: parent
+				visible: points.length == 4
+				ShapePath {
+					strokeWidth: 3
+					strokeColor: "red"
+					strokeStyle: ShapePath.SolidLine
+					fillColor: "transparent"
+					//TODO: really? I don't know qml...
+					startX: videoOutput.mapPointToItem(points[3]).x
+					startY: videoOutput.mapPointToItem(points[3]).y
+					PathLine {
+						x: videoOutput.mapPointToItem(points[0]).x
+						y: videoOutput.mapPointToItem(points[0]).y
+					}
+					PathLine {
+						x: videoOutput.mapPointToItem(points[1]).x
+						y: videoOutput.mapPointToItem(points[1]).y
+					}
+					PathLine {
+						x: videoOutput.mapPointToItem(points[2]).x
+						y: videoOutput.mapPointToItem(points[2]).y
+					}
+					PathLine {
+						x: videoOutput.mapPointToItem(points[3]).x
+						y: videoOutput.mapPointToItem(points[3]).y
+					}
+				}
+			}
+
+			Label {
+				id: info
+				color: "white"
+				padding: 10
+				background: Rectangle { color: "#80808080" }
+			}
+
+			ColumnLayout {
+				anchors.right: parent.right
+				anchors.bottom: parent.bottom
+
+				Switch {id: tryRotateSwitch; text: qsTr("Try Rotate"); checked: true }
+				Switch {id: tryHarderSwitch; text: qsTr("Try Harder"); checked: true }
+				Switch {id: tryInvertSwitch; text: qsTr("Try Invert"); checked: true }
+				Switch {id: tryDownscaleSwitch; text: qsTr("Try Downscale"); checked: true }
+				Switch {id: linearSwitch; text: qsTr("Linear Codes"); checked: true }
+				Switch {id: matrixSwitch; text: qsTr("Matrix Codes"); checked: true }
+			}
+		}
+	}
+}