summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2018-11-13 18:37:08 +0100
committerTor Andersson <tor.andersson@artifex.com>2018-11-13 22:29:33 +0100
commit225ba4f5fc19dc6783c2063525f8b309aa6a9413 (patch)
tree3b34399243428cb7aa292cff5e012a215150897e
parent1627e0f36b0891815d53b4f27e3289ec0065d8df (diff)
downloadmupdf-225ba4f5fc19dc6783c2063525f8b309aa6a9413.tar.xz
Bug 700143: Ignore duplicate text objects in text extraction.
Rendering modes like fill+stroke or fill+stroke+clip send the same text object multiple times. Only extract the text from the first instance.
-rw-r--r--source/fitz/stext-device.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/source/fitz/stext-device.c b/source/fitz/stext-device.c
index e8f04e1f..0040e976 100644
--- a/source/fitz/stext-device.c
+++ b/source/fitz/stext-device.c
@@ -24,6 +24,7 @@ struct fz_stext_device_s
int curdir;
int lastchar;
int flags;
+ const fz_text *lasttext;
};
const char *fz_stext_options_usage =
@@ -504,9 +505,13 @@ fz_stext_fill_text(fz_context *ctx, fz_device *dev, const fz_text *text, fz_matr
{
fz_stext_device *tdev = (fz_stext_device*)dev;
fz_text_span *span;
+ if (text == tdev->lasttext)
+ return;
tdev->new_obj = 1;
for (span = text->head; span; span = span->next)
fz_stext_extract(ctx, tdev, span, ctm);
+ fz_drop_text(ctx, tdev->lasttext);
+ tdev->lasttext = fz_keep_text(ctx, text);
}
static void
@@ -515,9 +520,13 @@ fz_stext_stroke_text(fz_context *ctx, fz_device *dev, const fz_text *text, const
{
fz_stext_device *tdev = (fz_stext_device*)dev;
fz_text_span *span;
+ if (text == tdev->lasttext)
+ return;
tdev->new_obj = 1;
for (span = text->head; span; span = span->next)
fz_stext_extract(ctx, tdev, span, ctm);
+ fz_drop_text(ctx, tdev->lasttext);
+ tdev->lasttext = fz_keep_text(ctx, text);
}
static void
@@ -525,9 +534,13 @@ fz_stext_clip_text(fz_context *ctx, fz_device *dev, const fz_text *text, fz_matr
{
fz_stext_device *tdev = (fz_stext_device*)dev;
fz_text_span *span;
+ if (text == tdev->lasttext)
+ return;
tdev->new_obj = 1;
for (span = text->head; span; span = span->next)
fz_stext_extract(ctx, tdev, span, ctm);
+ fz_drop_text(ctx, tdev->lasttext);
+ tdev->lasttext = fz_keep_text(ctx, text);
}
static void
@@ -535,9 +548,13 @@ fz_stext_clip_stroke_text(fz_context *ctx, fz_device *dev, const fz_text *text,
{
fz_stext_device *tdev = (fz_stext_device*)dev;
fz_text_span *span;
+ if (text == tdev->lasttext)
+ return;
tdev->new_obj = 1;
for (span = text->head; span; span = span->next)
fz_stext_extract(ctx, tdev, span, ctm);
+ fz_drop_text(ctx, tdev->lasttext);
+ tdev->lasttext = fz_keep_text(ctx, text);
}
static void
@@ -545,9 +562,13 @@ fz_stext_ignore_text(fz_context *ctx, fz_device *dev, const fz_text *text, fz_ma
{
fz_stext_device *tdev = (fz_stext_device*)dev;
fz_text_span *span;
+ if (text == tdev->lasttext)
+ return;
tdev->new_obj = 1;
for (span = text->head; span; span = span->next)
fz_stext_extract(ctx, tdev, span, ctm);
+ fz_drop_text(ctx, tdev->lasttext);
+ tdev->lasttext = fz_keep_text(ctx, text);
}
/* Images and shadings */
@@ -650,6 +671,8 @@ fz_stext_close_device(fz_context *ctx, fz_device *dev)
static void
fz_stext_drop_device(fz_context *ctx, fz_device *dev)
{
+ fz_stext_device *tdev = (fz_stext_device*)dev;
+ fz_drop_text(ctx, tdev->lasttext);
}
fz_stext_options *
@@ -697,6 +720,7 @@ fz_new_stext_device(fz_context *ctx, fz_stext_page *page, const fz_stext_options
dev->trm = fz_identity;
dev->lastchar = ' ';
dev->curdir = 1;
+ dev->lasttext = NULL;
return (fz_device*)dev;
}