diff mupdf-source/thirdparty/zxing-cpp/core/src/LogMatrix.h @ 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/core/src/LogMatrix.h	Mon Sep 15 11:43:07 2025 +0200
@@ -0,0 +1,104 @@
+/*
+* Copyright 2020 Axel Waggershauser
+*/
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "BitMatrix.h"
+#include "Matrix.h"
+#include "Point.h"
+
+#include <cassert>
+#include <cstdint>
+#include <cstdio>
+#include <string>
+
+namespace ZXing {
+
+#ifdef PRINT_DEBUG
+
+class LogMatrix
+{
+	using LogBuffer = Matrix<uint8_t>;
+	LogBuffer _log;
+	const BitMatrix* _image = nullptr;
+	int _scale = 1;
+
+public:
+	void init(const BitMatrix* image, int scale = 1)
+	{
+		_image = image;
+		_scale = scale;
+		_log = LogBuffer(_image->width() * _scale, _image->height() * _scale);
+	}
+
+	void write(const char* fn)
+	{
+		assert(_image);
+		FILE* f = fopen(fn, "wb");
+
+		// Write PPM header, P5 == grey, P6 == rgb
+		fprintf(f, "P6\n%d %d\n255\n", _log.width(), _log.height());
+
+		// Write pixels
+		for (int y = 0; y < _log.height(); ++y)
+			for (int x = 0; x < _log.width(); ++x) {
+				unsigned char pix[3];
+				unsigned char &r = pix[0], &g = pix[1], &b = pix[2];
+				r = g = b = _image->get(x / _scale, y / _scale) ? 0 : 255;
+				if (_scale > 1 && x % _scale == _scale / 2 && y % _scale == _scale / 2)
+					r = g = b = r ? 230 : 50;
+				switch (_log.get(x, y)) {
+				case 1: r = g = b = _scale > 1 ? 128 : (r ? 230 : 50); break;
+				case 2: r = b = 50, g = 220; break;
+				case 3: g = r = 100, b = 250; break;
+				case 4: g = b = 100, r = 250; break;
+				}
+				fwrite(&pix, 3, 1, f);
+			}
+		fclose(f);
+	}
+
+	template <typename T>
+	void operator()(const PointT<T>& p, int color = 1)
+	{
+		if (_image && _image->isIn(p))
+			_log.set(static_cast<int>(p.x * _scale), static_cast<int>(p.y * _scale), color);
+	}
+
+	void operator()(const PointT<int>& p, int color)
+	{
+		operator()(centered(p), color);
+	}
+
+	template <typename T>
+	void operator()(const std::vector<PointT<T>>& points, int color = 2)
+	{
+		for (auto p : points)
+			operator()(p, color);
+	}
+};
+
+extern LogMatrix log;
+
+class LogMatrixWriter
+{
+	LogMatrix &log;
+	std::string fn;
+
+public:
+	LogMatrixWriter(LogMatrix& log, const BitMatrix& image, int scale, std::string fn) : log(log), fn(fn)
+	{
+		log.init(&image, scale);
+	}
+	~LogMatrixWriter() { log.write(fn.c_str()); }
+};
+
+#else
+
+template<typename T> void log(PointT<T>, int = 0) {}
+
+#endif
+
+} // namespace ZXing