changeset 40:aa33339d6b8a upstream

ADD: MuPDF v1.26.10: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.5.
author Franz Glasner <fzglas.hg@dom66.de>
date Sat, 11 Oct 2025 11:31:38 +0200
parents a6bc019ac0b2
children 71bcc18e306f
files mupdf-source/Makelists mupdf-source/include/mupdf/fitz/version.h mupdf-source/scripts/jlib.py mupdf-source/scripts/wrap/__main__.py mupdf-source/source/fitz/stext-device.c mupdf-source/source/pdf/pdf-form.c mupdf-source/source/pdf/pdf-shade-recolor.c
diffstat 7 files changed, 65 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/mupdf-source/Makelists	Sat Oct 11 11:19:58 2025 +0200
+++ b/mupdf-source/Makelists	Sat Oct 11 11:31:38 2025 +0200
@@ -792,7 +792,6 @@
 
 ifeq ($(HAVE_NEON),yes)
 TESSERACT_DEFINES += -DHAVE_NEON
-TESSERACT_BUILD_CFLAGS += -mfpu=neon
 endif
 # Always include the neon code - it will compile to nothing if
 # neon isn't enabled. We need to always include it, because it
--- a/mupdf-source/include/mupdf/fitz/version.h	Sat Oct 11 11:19:58 2025 +0200
+++ b/mupdf-source/include/mupdf/fitz/version.h	Sat Oct 11 11:31:38 2025 +0200
@@ -23,9 +23,9 @@
 #ifndef MUPDF_FITZ_VERSION_H
 #define MUPDF_FITZ_VERSION_H
 #ifndef FZ_VERSION
-#define FZ_VERSION "1.26.7"
+#define FZ_VERSION "1.26.10"
 #define FZ_VERSION_MAJOR 1
 #define FZ_VERSION_MINOR 26
-#define FZ_VERSION_PATCH 7
+#define FZ_VERSION_PATCH 10
 #endif
 #endif
--- a/mupdf-source/scripts/jlib.py	Sat Oct 11 11:19:58 2025 +0200
+++ b/mupdf-source/scripts/jlib.py	Sat Oct 11 11:31:38 2025 +0200
@@ -2301,6 +2301,9 @@
             # `install_name_tool -change` to rename internal names to
             # `@rpath/<leafname>`.
             ret += ' -Wl,-rpath,@loader_path/.'
+        elif os.environ.get( 'PYODIDE') == '1':
+            # 2025-09-05: Pyodide now supports rpath.
+            ret += " -Wl,-rpath,'$ORIGIN'"
         else:
             ret += " -Wl,-rpath,'$ORIGIN',-z,origin"
     #log('{sos=} {ld_origin=} {ret=}')
--- a/mupdf-source/scripts/wrap/__main__.py	Sat Oct 11 11:19:58 2025 +0200
+++ b/mupdf-source/scripts/wrap/__main__.py	Sat Oct 11 11:31:38 2025 +0200
@@ -1329,11 +1329,7 @@
 
 
 def link_l_flags(sos):
-    ld_origin = None
-    if state.state_.pyodide:
-        # Don't add '-Wl,-rpath*' etc if building for Pyodide.
-        ld_origin = False
-    ret = jlib.link_l_flags( sos, ld_origin)
+    ret = jlib.link_l_flags( sos)
     r = os.environ.get('LDFLAGS')
     if r:
         ret += f' {r}'
--- a/mupdf-source/source/fitz/stext-device.c	Sat Oct 11 11:19:58 2025 +0200
+++ b/mupdf-source/source/fitz/stext-device.c	Sat Oct 11 11:31:38 2025 +0200
@@ -982,6 +982,17 @@
 
 	for (i = start; i < end; i++)
 	{
+		if (dev->flags & (FZ_STEXT_CLIP | FZ_STEXT_CLIP_RECT))
+		{
+			fz_rect r = current_clip(ctx, dev);
+			if (fz_glyph_entirely_outside_box(ctx, &ctm, span, &span->items[i], &r))
+			{
+				dev->last.clipped = 1;
+				continue;
+			}
+		}
+		dev->last.clipped = 0;
+
 		/* Calculate new pen location and delta */
 		tm.e = span->items[i].x;
 		tm.f = span->items[i].y;
@@ -996,17 +1007,6 @@
 		dev->last.valid = 1;
 		dev->last.flags = flags;
 
-		if (dev->flags & (FZ_STEXT_CLIP | FZ_STEXT_CLIP_RECT))
-		{
-			fz_rect r = current_clip(ctx, dev);
-			if (fz_glyph_entirely_outside_box(ctx, &ctm, span, &span->items[i], &r))
-			{
-				dev->last.clipped = 1;
-				continue;
-			}
-		}
-		dev->last.clipped = 0;
-
 		/* Calculate bounding box and new pen position based on font metrics */
 		if (span->items[i].gid >= 0)
 			adv = span->items[i].adv;
@@ -1059,12 +1059,16 @@
 }
 
 static void
-flush_actualtext(fz_context *ctx, fz_stext_device *dev, const char *actualtext, int i)
+flush_actualtext(fz_context *ctx, fz_stext_device *dev, const char *actualtext, int i, int end)
 {
 	if (*actualtext == 0)
 		return;
 
-	while (1)
+	if (dev->flags & (FZ_STEXT_CLIP | FZ_STEXT_CLIP_RECT))
+		if (dev->last.clipped)
+			return;
+
+	while (end < 0 || (end >= 0 && i < end))
 	{
 		int rune;
 		actualtext += fz_chartorune(&rune, actualtext);
@@ -1072,10 +1076,6 @@
 		if (rune == 0)
 			break;
 
-		if (dev->flags & (FZ_STEXT_CLIP | FZ_STEXT_CLIP_RECT))
-			if (dev->last.clipped)
-				continue;
-
 		fz_add_stext_char(ctx, dev, dev->last.font,
 			rune,
 			-1,
@@ -1121,7 +1121,7 @@
 	{
 		int rune;
 		int len = fz_chartorune(&rune, actualtext);
-		if (span->items[start].gid != rune || rune == 0)
+		if (span->items[start].ucs != rune || rune == 0)
 			break;
 		actualtext += len; z--;
 	}
@@ -1146,7 +1146,7 @@
 	{
 		/* Nasty n^2 algo here, cos backtracking through utf8 is not trivial. It'll do. */
 		int rune = rune_index(actualtext, z-1);
-		if (span->items[end-1].gid != rune)
+		if (span->items[end-1].ucs != rune)
 			break;
 		z--;
 	}
@@ -1160,6 +1160,17 @@
 		fz_text_item *item = &span->items[i];
 		int rune = -1;
 
+		if (dev->flags & (FZ_STEXT_CLIP | FZ_STEXT_CLIP_RECT))
+		{
+			fz_rect r = current_clip(ctx, dev);
+			if (fz_glyph_entirely_outside_box(ctx, &ctm, span, &span->items[i], &r))
+			{
+				dev->last.clipped = 1;
+				continue;
+			}
+		}
+		dev->last.clipped = 0;
+
 		if ((size_t)i < z)
 			actualtext += fz_chartorune(&rune, actualtext);
 
@@ -1175,17 +1186,7 @@
 			dev->last.font = fz_keep_font(ctx, font);
 		}
 		dev->last.valid = 1;
-
-		if (dev->flags & (FZ_STEXT_CLIP | FZ_STEXT_CLIP_RECT))
-		{
-			fz_rect r = current_clip(ctx, dev);
-			if (fz_glyph_entirely_outside_box(ctx, &ctm, span, &span->items[i], &r))
-			{
-				dev->last.clipped = 1;
-				continue;
-			}
-		}
-		dev->last.clipped = 0;
+		dev->last.flags = flags;
 
 		/* Calculate bounding box and new pen position based on font metrics */
 		if (item->gid >= 0)
@@ -1217,7 +1218,7 @@
 
 	/* We found a matching postfix. It seems likely that this is going to be the only
 	 * text object we get, so send any remaining actualtext now. */
-	flush_actualtext(ctx, dev, actualtext, i);
+	flush_actualtext(ctx, dev, actualtext, i, i + strlen(actualtext) - (span->len - end));
 
 	/* Send the postfix */
 	if (end != span->len)
@@ -1337,7 +1338,15 @@
 fz_stext_begin_metatext(fz_context *ctx, fz_device *dev, fz_metatext meta, const char *text)
 {
 	fz_stext_device *tdev = (fz_stext_device*)dev;
-	metatext_t *mt = fz_malloc_struct(ctx, metatext_t);
+	metatext_t *mt = find_actualtext(tdev);
+
+	if (mt != NULL && meta == FZ_METATEXT_ACTUALTEXT)
+		flush_actualtext(ctx, tdev, mt->text, 0, -1);
+
+	if (meta == FZ_METATEXT_ACTUALTEXT)
+		tdev->last.valid = 0;
+
+	mt = fz_malloc_struct(ctx, metatext_t);
 
 	mt->prev = tdev->metatext;
 	tdev->metatext = mt;
@@ -1384,8 +1393,9 @@
 	/* If we have a 'last' text position, send the content after that. */
 	if (tdev->last.valid)
 	{
-		flush_actualtext(ctx, tdev, tdev->metatext->text, 0);
+		flush_actualtext(ctx, tdev, tdev->metatext->text, 0, -1);
 		pop_metatext(ctx, tdev);
+		tdev->last.valid = 0;
 		return;
 	}
 
@@ -1401,7 +1411,12 @@
 		tdev->last.trm.f = tdev->metatext->bounds.y0;
 	}
 	else
-		fz_warn(ctx, "Actualtext with no position. Text may be lost or mispositioned.");
+	{
+		if ((dev->flags & (FZ_STEXT_CLIP | FZ_STEXT_CLIP_RECT)) == 0)
+			fz_warn(ctx, "Actualtext with no position. Text may be lost or mispositioned.");
+		pop_metatext(ctx, tdev);
+		return;
+	}
 
 	fz_var(myfont);
 
@@ -1412,7 +1427,7 @@
 			myfont = fz_new_base14_font(ctx, "Helvetica");
 			tdev->last.font = myfont;
 		}
-		flush_actualtext(ctx, tdev, tdev->metatext->text, 0);
+		flush_actualtext(ctx, tdev, tdev->metatext->text, 0, -1);
 		pop_metatext(ctx, tdev);
 	}
 	fz_always(ctx)
--- a/mupdf-source/source/pdf/pdf-form.c	Sat Oct 11 11:19:58 2025 +0200
+++ b/mupdf-source/source/pdf/pdf-form.c	Sat Oct 11 11:31:38 2025 +0200
@@ -2407,7 +2407,13 @@
 
 	res = pdf_dict_get(ctx, page, PDF_NAME(Resources));
 	if (!res)
-		res = pdf_dict_put_dict(ctx, page, PDF_NAME(Resources), 4);
+	{
+		res = pdf_dict_get_inheritable(ctx, page, PDF_NAME(Resources));
+		if (res)
+			pdf_dict_put(ctx, page, PDF_NAME(Resources), res);
+		else
+			res = pdf_dict_put_dict(ctx, page, PDF_NAME(Resources), 4);
+	}
 
 	res_xobj = pdf_dict_get(ctx, res, PDF_NAME(XObject));
 	if (!res_xobj)
--- a/mupdf-source/source/pdf/pdf-shade-recolor.c	Sat Oct 11 11:19:58 2025 +0200
+++ b/mupdf-source/source/pdf/pdf-shade-recolor.c	Sat Oct 11 11:31:38 2025 +0200
@@ -621,10 +621,8 @@
 
 			for (i = startpt; i < 12; i++)
 			{
-				unsigned int x_bits = fz_read_bits(ctx, stream, bpcoord);
-				unsigned int y_bits = fz_read_bits(ctx, stream, bpcoord);
-				fz_write_bits(ctx, out, x_bits, bpcoord);
-				fz_write_bits(ctx, out, y_bits, bpcoord);
+				(void) fz_read_bits(ctx, stream, bpcoord);
+				(void) fz_read_bits(ctx, stream, bpcoord);
 			}
 
 			for (i = startcolor; i < 4; i++)