Mercurial > hgrepos > Python2 > PyMuPDF
diff mupdf-source/source/fitz/stext-device.c @ 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 | b50eed0cc0ef |
| children |
line wrap: on
line diff
--- 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)
