diff mupdf-source/thirdparty/zxing-cpp/wrappers/c/ZXingCTest.c @ 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/wrappers/c/ZXingCTest.c	Mon Sep 15 11:43:07 2025 +0200
@@ -0,0 +1,134 @@
+/*
+* Copyright 2023 siiky
+* Copyright 2023 Axel Waggershauser
+*/
+// SPDX-License-Identifier: Apache-2.0
+
+#include "ZXingC.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define STB_IMAGE_IMPLEMENTATION
+#define STBI_NO_LINEAR // prevent dependency on -lm
+#define STBI_NO_HDR
+#include <stb_image.h>
+
+int usage(char* pname)
+{
+	fprintf(stderr, "ZXingCTest %s, usage: %s FILE [FORMATS]\n", ZXing_Version(), pname);
+	return 1;
+}
+
+bool parse_args(int argc, char** argv, char** filename, ZXing_BarcodeFormats* formats)
+{
+	if (argc < 2)
+		return false;
+	*filename = argv[1];
+	if (argc >= 3) {
+		*formats = ZXing_BarcodeFormatsFromString(argv[2]);
+		if (*formats == ZXing_BarcodeFormat_Invalid) {
+			fprintf(stderr, "%s\n", ZXing_LastErrorMsg());
+			return false;
+		}
+	}
+	return true;
+}
+
+void printF(const char* fmt, char* text)
+{
+	if (!text)
+		return;
+	if (*text)
+		printf(fmt, text);
+	ZXing_free(text);
+}
+
+#define CHECK(GOOD) \
+	if (!(GOOD)) { \
+		char* error = ZXing_LastErrorMsg(); \
+		fprintf(stderr, "CHECK(%s) failed: %s\n", #GOOD, error); \
+		ZXing_free(error); \
+		return 2; \
+	}
+
+int main(int argc, char** argv)
+{
+	int ret = 0;
+	char* filename = NULL;
+	ZXing_BarcodeFormats formats = ZXing_BarcodeFormat_None;
+
+	if (!parse_args(argc, argv, &filename, &formats))
+		return usage(argv[0]);
+
+	int width = 0;
+	int height = 0;
+	int channels = 0;
+	stbi_uc* data = stbi_load(filename, &width, &height, &channels, STBI_grey);
+
+	ZXing_ImageView* iv = NULL;
+	ZXing_Image* img = NULL;
+
+	if (data) {
+		iv = ZXing_ImageView_new(data, width, height, ZXing_ImageFormat_Lum, 0, 0);
+		CHECK(iv)
+	} else {
+		fprintf(stderr, "Could not read image '%s'\n", filename);
+#if defined(ZXING_EXPERIMENTAL_API) && defined(ZXING_WRITERS)
+		if (formats == ZXing_BarcodeFormat_Invalid)
+			return 2;
+		fprintf(stderr, "Using '%s' as text input to create barcode\n", filename);
+		ZXing_CreatorOptions* cOpts = ZXing_CreatorOptions_new(formats);
+		CHECK(cOpts)
+		ZXing_Barcode* barcode = ZXing_CreateBarcodeFromText(filename, 0, cOpts);
+		CHECK(barcode)
+		img = ZXing_WriteBarcodeToImage(barcode, NULL);
+		CHECK(img)
+		ZXing_CreatorOptions_delete(cOpts);
+		ZXing_Barcode_delete(barcode);
+#else
+		return 2;
+#endif
+	}
+
+	ZXing_ReaderOptions* opts = ZXing_ReaderOptions_new();
+	ZXing_ReaderOptions_setTextMode(opts, ZXing_TextMode_HRI);
+	ZXing_ReaderOptions_setEanAddOnSymbol(opts, ZXing_EanAddOnSymbol_Ignore);
+	ZXing_ReaderOptions_setFormats(opts, formats);
+	ZXing_ReaderOptions_setReturnErrors(opts, true);
+
+	ZXing_Barcodes* barcodes = ZXing_ReadBarcodes(iv ? iv : (ZXing_ImageView*)img, opts);
+	CHECK(barcodes)
+
+	ZXing_ImageView_delete(iv);
+	ZXing_Image_delete(img);
+	ZXing_ReaderOptions_delete(opts);
+	stbi_image_free(data);
+
+	for (int i = 0, n = ZXing_Barcodes_size(barcodes); i < n; ++i) {
+		const ZXing_Barcode* barcode = ZXing_Barcodes_at(barcodes, i);
+
+		printF("Text       : %s\n", ZXing_Barcode_text(barcode));
+		printF("BytesECI   : %s\n", (char*)ZXing_Barcode_bytesECI(barcode, NULL));
+		printF("Format     : %s\n", ZXing_BarcodeFormatToString(ZXing_Barcode_format(barcode)));
+		printF("Content    : %s\n", ZXing_ContentTypeToString(ZXing_Barcode_contentType(barcode)));
+		printF("Identifier : %s\n", ZXing_Barcode_symbologyIdentifier(barcode));
+		printf("HasECI     : %d\n", ZXing_Barcode_hasECI(barcode));
+		printF("EC Level   : %s\n", ZXing_Barcode_ecLevel(barcode));
+		printF("Error      : %s\n", ZXing_Barcode_errorMsg(barcode));
+		printF("Position   : %s\n", ZXing_PositionToString(ZXing_Barcode_position(barcode)));
+		printf("Rotation   : %d\n", ZXing_Barcode_orientation(barcode));
+		printf("IsMirrored : %d\n", ZXing_Barcode_isMirrored(barcode));
+		printf("IsInverted : %d\n", ZXing_Barcode_isInverted(barcode));
+
+		if (i < n-1)
+			printf("\n");
+	}
+
+	if (ZXing_Barcodes_size(barcodes) == 0)
+		printf("No barcode found\n");
+
+	ZXing_Barcodes_delete(barcodes);
+
+	return ret;
+}