summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2017-05-25 12:00:21 +0200
committerTor Andersson <tor.andersson@artifex.com>2017-05-25 12:28:00 +0200
commit32599868df1b3ecd553a0c1bc3e2521dd11b288a (patch)
tree31ea9a6e6c42ed560e19f3d8b655d2f29286d786
parentf01a11057f3352330bacd411160db1c2a032a1dc (diff)
downloadmupdf-32599868df1b3ecd553a0c1bc3e2521dd11b288a.tar.xz
Replace broken FZ_IGNORE_IMAGE hints with other mechanisms.
Add an option to the structured text device to preserve images. If the PDF processor does not have ops to process images, then skip loading them in the interpreter if possible. If the device does not have any image callbacks, then don't set the image processing ops in the run device. This accomplishes the same effect as the device hints were intended to do, but without needing to expose them to the PDF interpreter which may not even have a device since we now have multiple PDF op processors.
-rw-r--r--include/mupdf/fitz/device.h18
-rw-r--r--include/mupdf/fitz/structured-text.h6
-rw-r--r--source/fitz/list-device.c12
-rw-r--r--source/fitz/stext-device.c14
-rw-r--r--source/fitz/test-device.c1
-rw-r--r--source/pdf/pdf-op-run.c16
-rw-r--r--source/tools/mudraw.c6
7 files changed, 32 insertions, 41 deletions
diff --git a/include/mupdf/fitz/device.h b/include/mupdf/fitz/device.h
index d65bfcb8..7e7efb43 100644
--- a/include/mupdf/fitz/device.h
+++ b/include/mupdf/fitz/device.h
@@ -170,11 +170,6 @@ fz_device *fz_keep_device(fz_context *ctx, fz_device *dev);
fz_enable_device_hints : Enable hints in a device.
hints: mask of hints to enable.
-
- For example: By default the draw device renders shadings. For some
- purposes (perhaps rendering fast low quality thumbnails) you may want
- to tell it to ignore shadings. For this you would enable the
- FZ_IGNORE_SHADE hint.
*/
void fz_enable_device_hints(fz_context *ctx, fz_device *dev, int hints);
@@ -182,22 +177,15 @@ void fz_enable_device_hints(fz_context *ctx, fz_device *dev, int hints);
fz_disable_device_hints : Disable hints in a device.
hints: mask of hints to disable.
-
- For example: By default the text extraction device ignores images.
- For some purposes however (such as extracting HTML) you may want to
- enable the capturing of image data too. For this you would disable
- the FZ_IGNORE_IMAGE hint.
*/
void fz_disable_device_hints(fz_context *ctx, fz_device *dev, int hints);
enum
{
/* Hints */
- FZ_IGNORE_IMAGE = 1,
- FZ_IGNORE_SHADE = 2,
- FZ_DONT_INTERPOLATE_IMAGES = 4,
- FZ_MAINTAIN_CONTAINER_STACK = 8,
- FZ_NO_CACHE = 16,
+ FZ_DONT_INTERPOLATE_IMAGES = 1,
+ FZ_MAINTAIN_CONTAINER_STACK = 2,
+ FZ_NO_CACHE = 4,
};
/*
diff --git a/include/mupdf/fitz/structured-text.h b/include/mupdf/fitz/structured-text.h
index 6a861faa..26634fff 100644
--- a/include/mupdf/fitz/structured-text.h
+++ b/include/mupdf/fitz/structured-text.h
@@ -39,11 +39,16 @@ typedef struct fz_stext_page_s fz_stext_page;
option is deactivated any type of horizontal whitespace (including
horizontal tabs) will be replaced with space characters of variable
width.
+
+ FZ_STEXT_PRESERVE_IMAGES: If this option is set, then images will
+ be stored in the structured text structure. The default is to ignore
+ all images.
*/
enum
{
FZ_STEXT_PRESERVE_LIGATURES = 1,
FZ_STEXT_PRESERVE_WHITESPACE = 2,
+ FZ_STEXT_PRESERVE_IMAGES = 4,
};
/*
@@ -296,6 +301,7 @@ struct fz_stext_options_s
{
int flags;
};
+
/*
fz_parse_stext_options: Parse stext device options from a comma separated key-value string.
*/
diff --git a/source/fitz/list-device.c b/source/fitz/list-device.c
index 49a93c20..6580b93c 100644
--- a/source/fitz/list-device.c
+++ b/source/fitz/list-device.c
@@ -1646,20 +1646,16 @@ visible:
fz_ignore_text(ctx, dev, *(fz_text **)node, &trans_ctm);
break;
case FZ_CMD_FILL_SHADE:
- if ((dev->hints & FZ_IGNORE_SHADE) == 0)
- fz_fill_shade(ctx, dev, *(fz_shade **)node, &trans_ctm, alpha);
+ fz_fill_shade(ctx, dev, *(fz_shade **)node, &trans_ctm, alpha);
break;
case FZ_CMD_FILL_IMAGE:
- if ((dev->hints & FZ_IGNORE_IMAGE) == 0)
- fz_fill_image(ctx, dev, *(fz_image **)node, &trans_ctm, alpha);
+ fz_fill_image(ctx, dev, *(fz_image **)node, &trans_ctm, alpha);
break;
case FZ_CMD_FILL_IMAGE_MASK:
- if ((dev->hints & FZ_IGNORE_IMAGE) == 0)
- fz_fill_image_mask(ctx, dev, *(fz_image **)node, &trans_ctm, colorspace, color, alpha);
+ fz_fill_image_mask(ctx, dev, *(fz_image **)node, &trans_ctm, colorspace, color, alpha);
break;
case FZ_CMD_CLIP_IMAGE_MASK:
- if ((dev->hints & FZ_IGNORE_IMAGE) == 0)
- fz_clip_image_mask(ctx, dev, *(fz_image **)node, &trans_ctm, &trans_rect);
+ fz_clip_image_mask(ctx, dev, *(fz_image **)node, &trans_ctm, &trans_rect);
break;
case FZ_CMD_POP_CLIP:
fz_pop_clip(ctx, dev);
diff --git a/source/fitz/stext-device.c b/source/fitz/stext-device.c
index 0890043f..78755595 100644
--- a/source/fitz/stext-device.c
+++ b/source/fitz/stext-device.c
@@ -1095,6 +1095,8 @@ fz_parse_stext_options(fz_context *ctx, fz_stext_options *opts, const char *stri
opts->flags |= FZ_STEXT_PRESERVE_LIGATURES;
if (fz_has_option(ctx, string, "preserve-whitespace", &val) && fz_option_eq(val, "yes"))
opts->flags |= FZ_STEXT_PRESERVE_WHITESPACE;
+ if (fz_has_option(ctx, string, "preserve-images", &val) && fz_option_eq(val, "yes"))
+ opts->flags |= FZ_STEXT_PRESERVE_IMAGES;
return opts;
}
@@ -1104,8 +1106,6 @@ fz_new_stext_device(fz_context *ctx, fz_stext_sheet *sheet, fz_stext_page *page,
{
fz_stext_device *dev = fz_new_derived_device(ctx, fz_stext_device);
- dev->super.hints = FZ_IGNORE_IMAGE | FZ_IGNORE_SHADE;
-
dev->super.close_device = fz_stext_close_device;
dev->super.drop_device = fz_stext_drop_device;
@@ -1114,16 +1114,18 @@ fz_new_stext_device(fz_context *ctx, fz_stext_sheet *sheet, fz_stext_page *page,
dev->super.clip_text = fz_stext_clip_text;
dev->super.clip_stroke_text = fz_stext_clip_stroke_text;
dev->super.ignore_text = fz_stext_ignore_text;
- dev->super.fill_image = fz_stext_fill_image;
- dev->super.fill_image_mask = fz_stext_fill_image_mask;
+
+ if (opts && (opts->flags & FZ_STEXT_PRESERVE_IMAGES))
+ {
+ dev->super.fill_image = fz_stext_fill_image;
+ dev->super.fill_image_mask = fz_stext_fill_image_mask;
+ }
dev->sheet = sheet;
dev->page = page;
dev->spans = NULL;
dev->cur_span = NULL;
dev->lastchar = ' ';
- if (opts)
- dev->flags = opts->flags;
return (fz_device*)dev;
}
diff --git a/source/fitz/test-device.c b/source/fitz/test-device.c
index f12a294b..38dc331b 100644
--- a/source/fitz/test-device.c
+++ b/source/fitz/test-device.c
@@ -53,7 +53,6 @@ fz_test_color(fz_context *ctx, fz_test_device *t, fz_colorspace *colorspace, con
t->resolved = 1;
if (t->passthrough == NULL)
{
- t->super.hints |= FZ_IGNORE_IMAGE;
fz_throw(ctx, FZ_ERROR_ABORT, "Page found as color; stopping interpretation");
}
}
diff --git a/source/pdf/pdf-op-run.c b/source/pdf/pdf-op-run.c
index a71309d8..22721173 100644
--- a/source/pdf/pdf-op-run.c
+++ b/source/pdf/pdf-op-run.c
@@ -1946,22 +1946,19 @@ static void pdf_run_rg(fz_context *ctx, pdf_processor *proc, float r, float g, f
static void pdf_run_BI(fz_context *ctx, pdf_processor *proc, fz_image *image)
{
pdf_run_processor *pr = (pdf_run_processor *)proc;
- if ((pr->dev->hints & FZ_IGNORE_IMAGE) == 0)
- pdf_show_image(ctx, pr, image);
+ pdf_show_image(ctx, pr, image);
}
static void pdf_run_sh(fz_context *ctx, pdf_processor *proc, const char *name, fz_shade *shade)
{
pdf_run_processor *pr = (pdf_run_processor *)proc;
- if ((pr->dev->hints & FZ_IGNORE_SHADE) == 0)
- pdf_show_shade(ctx, pr, shade);
+ pdf_show_shade(ctx, pr, shade);
}
static void pdf_run_Do_image(fz_context *ctx, pdf_processor *proc, const char *name, fz_image *image)
{
pdf_run_processor *pr = (pdf_run_processor *)proc;
- if ((pr->dev->hints & FZ_IGNORE_IMAGE) == 0)
- pdf_show_image(ctx, pr, image);
+ pdf_show_image(ctx, pr, image);
}
static void pdf_run_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_xobject *xobj, pdf_obj *page_resources)
@@ -2133,9 +2130,12 @@ pdf_new_run_processor(fz_context *ctx, fz_device *dev, const fz_matrix *ctm, con
proc->super.op_k = pdf_run_k;
/* shadings, images, xobjects */
- proc->super.op_BI = pdf_run_BI;
proc->super.op_sh = pdf_run_sh;
- proc->super.op_Do_image = pdf_run_Do_image;
+ if (dev->fill_image || dev->fill_image_mask || dev->clip_image_mask)
+ {
+ proc->super.op_BI = pdf_run_BI;
+ proc->super.op_Do_image = pdf_run_Do_image;
+ }
proc->super.op_Do_form = pdf_run_Do_form;
/* marked content */
diff --git a/source/tools/mudraw.c b/source/tools/mudraw.c
index 086220ab..ef95f1d3 100644
--- a/source/tools/mudraw.c
+++ b/source/tools/mudraw.c
@@ -510,16 +510,16 @@ static void dodrawpage(fz_context *ctx, fz_page *page, fz_display_list *list, in
fz_try(ctx)
{
fz_rect mediabox;
+ fz_stext_options stext_options;
if (list)
fz_bound_display_list(ctx, list, &mediabox);
else
fz_bound_page(ctx, page, &mediabox);
+ stext_options.flags = (output_format == OUT_HTML) ? FZ_STEXT_PRESERVE_IMAGES : 0;
text = fz_new_stext_page(ctx, &mediabox);
- dev = fz_new_stext_device(ctx, sheet, text, 0);
+ dev = fz_new_stext_device(ctx, sheet, text, &stext_options);
if (lowmemory)
fz_enable_device_hints(ctx, dev, FZ_NO_CACHE);
- if (output_format == OUT_HTML)
- fz_disable_device_hints(ctx, dev, FZ_IGNORE_IMAGE);
if (list)
fz_run_display_list(ctx, list, dev, &fz_identity, &fz_infinite_rect, cookie);
else