diff mupdf-source/source/fitz/leptonica-wrap.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/source/fitz/leptonica-wrap.c	Mon Sep 15 11:43:07 2025 +0200
@@ -0,0 +1,107 @@
+// Copyright (C) 2020-2023 Artifex Software, Inc.
+//
+// This file is part of MuPDF.
+//
+// MuPDF is free software: you can redistribute it and/or modify it under the
+// terms of the GNU Affero General Public License as published by the Free
+// Software Foundation, either version 3 of the License, or (at your option)
+// any later version.
+//
+// MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
+// details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html>
+//
+// Alternative licensing terms are available from the licensor.
+// For commercial licensing, see <https://www.artifex.com/> or contact
+// Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
+// CA 94129, USA, for further information.
+
+#include "leptonica-wrap.h"
+
+#ifdef HAVE_LEPTONICA
+
+#include "allheaders.h"
+
+/* When we build with our own leptonica, we want to intercept malloc/free etc.
+ * Unfortunately we have to use a nasty global here. */
+static fz_context *leptonica_mem = NULL;
+
+void *leptonica_malloc(size_t size)
+{
+	void *ret = Memento_label(fz_malloc_no_throw(leptonica_mem, size), "leptonica_malloc");
+#ifdef DEBUG_ALLOCS
+	printf("%d LEPTONICA_MALLOC(%p) %d -> %p\n", event++, leptonica_mem, (int)size, ret);
+	fflush(stdout);
+#endif
+	return ret;
+}
+
+void leptonica_free(void *ptr)
+{
+#ifdef DEBUG_ALLOCS
+	printf("%d LEPTONICA_FREE(%p) %p\n", event++, leptonica_mem, ptr);
+	fflush(stdout);
+#endif
+	fz_free(leptonica_mem, ptr);
+}
+
+void *leptonica_calloc(size_t numelm, size_t elemsize)
+{
+	void *ret = leptonica_malloc(numelm * elemsize);
+
+	if (ret)
+		memset(ret, 0, numelm * elemsize);
+#ifdef DEBUG_ALLOCS
+	printf("%d LEPTONICA_CALLOC %d,%d -> %p\n", event++, (int)numelm, (int)elemsize, ret);
+	fflush(stdout);
+#endif
+	return ret;
+}
+
+/* Not currently actually used */
+void *leptonica_realloc(void *ptr, size_t blocksize)
+{
+	void *ret = fz_realloc_no_throw(leptonica_mem, ptr, blocksize);
+
+#ifdef DEBUG_ALLOCS
+	printf("%d LEPTONICA_REALLOC %p,%d -> %p\n", event++, ptr, (int)blocksize, ret);
+	fflush(stdout);
+#endif
+	return ret;
+}
+
+void
+fz_set_leptonica_mem(fz_context *ctx)
+{
+	int die = 0;
+
+	fz_lock(ctx, FZ_LOCK_ALLOC);
+	die = (leptonica_mem != NULL);
+	if (!die)
+		leptonica_mem = ctx;
+	fz_unlock(ctx, FZ_LOCK_ALLOC);
+	if (die)
+		fz_throw(ctx, FZ_ERROR_ARGUMENT, "Attempt to use Leptonica from 2 threads at once!");
+	setPixMemoryManager(leptonica_malloc, leptonica_free);
+}
+
+void
+fz_clear_leptonica_mem(fz_context *ctx)
+{
+	int die = 0;
+
+	fz_lock(ctx, FZ_LOCK_ALLOC);
+	die = (leptonica_mem == NULL);
+	if (!die)
+		leptonica_mem = NULL;
+	fz_unlock(ctx, FZ_LOCK_ALLOC);
+	if (die)
+		fz_throw(ctx, FZ_ERROR_ARGUMENT, "Attempt to use Leptonica from 2 threads at once!");
+	setPixMemoryManager(malloc, free);
+}
+
+#endif /* HAVE_LEPTONICA */