summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2013-06-12 16:26:23 +0200
committerTor Andersson <tor.andersson@artifex.com>2013-06-12 16:26:23 +0200
commitb975f1b82a061db61124d1cf0cd55ab60c22dc8e (patch)
tree7694c8c6879ba594464f28a93d9d725eb78f2df7
parent6cf0e12ecdaa54bfc024d056445919da0f4198bb (diff)
downloadmupdf-b975f1b82a061db61124d1cf0cd55ab60c22dc8e.tar.xz
Add begin_page and end_page calls to device interface.
-rw-r--r--apps/mudraw.c2
-rw-r--r--fitz/dev_list.c92
-rw-r--r--fitz/dev_null.c14
-rw-r--r--fitz/dev_trace.c17
-rw-r--r--fitz/doc_document.c6
-rw-r--r--fitz/fitz-internal.h5
-rw-r--r--winrt/mupdfwinrt/muctx.cpp2
7 files changed, 96 insertions, 42 deletions
diff --git a/apps/mudraw.c b/apps/mudraw.c
index 04db84e9..e94b692d 100644
--- a/apps/mudraw.c
+++ b/apps/mudraw.c
@@ -400,12 +400,10 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
fz_try(ctx)
{
dev = fz_new_trace_device(ctx);
- fz_printf(out, "<page number=\"%d\">\n", pagenum);
if (list)
fz_run_display_list(list, dev, &fz_identity, &fz_infinite_rect, &cookie);
else
fz_run_page(doc, page, dev, &fz_identity, &cookie);
- fz_printf(out, "</page>\n");
}
fz_always(ctx)
{
diff --git a/fitz/dev_list.c b/fitz/dev_list.c
index 826d0c46..44a9161f 100644
--- a/fitz/dev_list.c
+++ b/fitz/dev_list.c
@@ -6,6 +6,8 @@ typedef struct fz_display_node_s fz_display_node;
typedef enum fz_display_command_e
{
+ FZ_CMD_BEGIN_PAGE,
+ FZ_CMD_END_PAGE,
FZ_CMD_FILL_PATH,
FZ_CMD_STROKE_PATH,
FZ_CMD_CLIP_PATH,
@@ -210,6 +212,8 @@ fz_free_display_node(fz_context *ctx, fz_display_node *node)
case FZ_CMD_END_GROUP:
case FZ_CMD_BEGIN_TILE:
case FZ_CMD_END_TILE:
+ case FZ_CMD_BEGIN_PAGE:
+ case FZ_CMD_END_PAGE:
break;
}
if (node->stroke)
@@ -220,6 +224,24 @@ fz_free_display_node(fz_context *ctx, fz_display_node *node)
}
static void
+fz_list_begin_page(fz_device *dev, const fz_rect *mediabox, const fz_matrix *ctm)
+{
+ fz_context *ctx = dev->ctx;
+ fz_display_node *node = fz_new_display_node(ctx, FZ_CMD_BEGIN_PAGE, ctm, NULL, NULL, 0);
+ node->rect = *mediabox;
+ fz_transform_rect(&node->rect, ctm);
+ fz_append_display_node(dev->user, node);
+}
+
+static void
+fz_list_end_page(fz_device *dev)
+{
+ fz_context *ctx = dev->ctx;
+ fz_display_node *node = fz_new_display_node(ctx, FZ_CMD_END_PAGE, &fz_identity, NULL, NULL, 0);
+ fz_append_display_node(dev->user, node);
+}
+
+static void
fz_list_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
@@ -532,6 +554,9 @@ fz_new_list_device(fz_context *ctx, fz_display_list *list)
{
fz_device *dev = fz_new_device(ctx, list);
+ dev->begin_page = fz_list_begin_page;
+ dev->end_page = fz_list_end_page;
+
dev->fill_path = fz_list_fill_path;
dev->stroke_path = fz_list_stroke_path;
dev->clip_path = fz_list_clip_path;
@@ -627,7 +652,6 @@ fz_run_display_list(fz_display_list *list, fz_device *dev, const fz_matrix *top_
fz_matrix ctm;
int clipped = 0;
int tiled = 0;
- int empty;
int progress = 0;
fz_context *ctx = dev->ctx;
@@ -642,6 +666,11 @@ fz_run_display_list(fz_display_list *list, fz_device *dev, const fz_matrix *top_
for (node = list->first; node; node = node->next)
{
+ int empty;
+
+ fz_rect node_rect = node->rect;
+ fz_transform_rect(&node_rect, top_ctm);
+
/* Check the cookie for aborting */
if (cookie)
{
@@ -652,14 +681,16 @@ fz_run_display_list(fz_display_list *list, fz_device *dev, const fz_matrix *top_
/* cull objects to draw using a quick visibility test */
- if (tiled || node->cmd == FZ_CMD_BEGIN_TILE || node->cmd == FZ_CMD_END_TILE)
+ if (tiled ||
+ node->cmd == FZ_CMD_BEGIN_TILE || node->cmd == FZ_CMD_END_TILE ||
+ node->cmd == FZ_CMD_BEGIN_PAGE || node->cmd == FZ_CMD_END_PAGE)
{
empty = 0;
}
else
{
- fz_rect rect = node->rect;
- fz_intersect_rect(fz_transform_rect(&rect, top_ctm), scissor);
+ fz_rect rect = node_rect;
+ fz_intersect_rect(&rect, scissor);
empty = fz_is_empty_rect(&rect);
}
@@ -698,10 +729,17 @@ fz_run_display_list(fz_display_list *list, fz_device *dev, const fz_matrix *top_
visible:
fz_concat(&ctm, &node->ctm, top_ctm);
+
fz_try(ctx)
{
switch (node->cmd)
{
+ case FZ_CMD_BEGIN_PAGE:
+ fz_begin_page(dev, &node_rect, &ctm);
+ break;
+ case FZ_CMD_END_PAGE:
+ fz_end_page(dev);
+ break;
case FZ_CMD_FILL_PATH:
fz_fill_path(dev, node->item.path, node->flag, &ctm,
node->colorspace, node->color, node->alpha);
@@ -711,19 +749,11 @@ visible:
node->colorspace, node->color, node->alpha);
break;
case FZ_CMD_CLIP_PATH:
- {
- fz_rect rect = node->rect;
- fz_transform_rect(&rect, top_ctm);
- fz_clip_path(dev, node->item.path, &rect, node->flag, &ctm);
+ fz_clip_path(dev, node->item.path, &node_rect, node->flag, &ctm);
break;
- }
case FZ_CMD_CLIP_STROKE_PATH:
- {
- fz_rect rect = node->rect;
- fz_transform_rect(&rect, top_ctm);
- fz_clip_stroke_path(dev, node->item.path, &rect, node->stroke, &ctm);
+ fz_clip_stroke_path(dev, node->item.path, &node_rect, node->stroke, &ctm);
break;
- }
case FZ_CMD_FILL_TEXT:
fz_fill_text(dev, node->item.text, &ctm,
node->colorspace, node->color, node->alpha);
@@ -755,54 +785,38 @@ visible:
node->colorspace, node->color, node->alpha);
break;
case FZ_CMD_CLIP_IMAGE_MASK:
- {
if ((dev->hints & FZ_IGNORE_IMAGE) == 0)
- {
- fz_rect rect = node->rect;
- fz_transform_rect(&rect, top_ctm);
- fz_clip_image_mask(dev, node->item.image, &rect, &ctm);
- }
+ fz_clip_image_mask(dev, node->item.image, &node_rect, &ctm);
break;
- }
case FZ_CMD_POP_CLIP:
fz_pop_clip(dev);
break;
case FZ_CMD_BEGIN_MASK:
- {
- fz_rect rect = node->rect;
- fz_transform_rect(&rect, top_ctm);
- fz_begin_mask(dev, &rect, node->flag, node->colorspace, node->color);
+ fz_begin_mask(dev, &node_rect, node->flag, node->colorspace, node->color);
break;
- }
case FZ_CMD_END_MASK:
fz_end_mask(dev);
break;
case FZ_CMD_BEGIN_GROUP:
- {
- fz_rect rect = node->rect;
- fz_transform_rect(&rect, top_ctm);
- fz_begin_group(dev, &rect,
+ fz_begin_group(dev, &node_rect,
(node->flag & ISOLATED) != 0, (node->flag & KNOCKOUT) != 0,
node->item.blendmode, node->alpha);
break;
- }
case FZ_CMD_END_GROUP:
fz_end_group(dev);
break;
case FZ_CMD_BEGIN_TILE:
{
int cached;
- fz_rect rect;
+ fz_rect tile_rect;
tiled++;
- rect.x0 = node->color[2];
- rect.y0 = node->color[3];
- rect.x1 = node->color[4];
- rect.y1 = node->color[5];
- cached = fz_begin_tile_id(dev, &node->rect, &rect, node->color[0], node->color[1], &ctm, node->flag);
+ tile_rect.x0 = node->color[2];
+ tile_rect.y0 = node->color[3];
+ tile_rect.x1 = node->color[4];
+ tile_rect.y1 = node->color[5];
+ cached = fz_begin_tile_id(dev, &node_rect, &tile_rect, node->color[0], node->color[1], &ctm, node->flag);
if (cached)
- {
node = skip_to_end_tile(node, &progress);
- }
break;
}
case FZ_CMD_END_TILE:
diff --git a/fitz/dev_null.c b/fitz/dev_null.c
index d21daad3..5cd1605a 100644
--- a/fitz/dev_null.c
+++ b/fitz/dev_null.c
@@ -35,6 +35,20 @@ fz_disable_device_hints(fz_device *dev, int hints)
}
void
+fz_begin_page(fz_device *dev, const fz_rect *rect, const fz_matrix *ctm)
+{
+ if (dev->begin_page)
+ dev->begin_page(dev, rect, ctm);
+}
+
+void
+fz_end_page(fz_device *dev)
+{
+ if (dev->end_page)
+ dev->end_page(dev);
+}
+
+void
fz_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
diff --git a/fitz/dev_trace.c b/fitz/dev_trace.c
index 37059bc6..9b6cd1b5 100644
--- a/fitz/dev_trace.c
+++ b/fitz/dev_trace.c
@@ -67,6 +67,20 @@ fz_trace_path(fz_path *path, int indent)
}
static void
+fz_trace_begin_page(fz_device *dev, const fz_rect *rect, const fz_matrix *ctm)
+{
+ printf("<page mediabox=\"%g %g %g %g\"", rect->x0, rect->y0, rect->x1, rect->y1);
+ fz_trace_matrix(ctm);
+ printf(">\n");
+}
+
+static void
+fz_trace_end_page(fz_device *dev)
+{
+ printf("</page>\n");
+}
+
+static void
fz_trace_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
@@ -292,6 +306,9 @@ fz_device *fz_new_trace_device(fz_context *ctx)
{
fz_device *dev = fz_new_device(ctx, NULL);
+ dev->begin_page = fz_trace_begin_page;
+ dev->end_page = fz_trace_end_page;
+
dev->fill_path = fz_trace_fill_path;
dev->stroke_path = fz_trace_stroke_path;
dev->clip_path = fz_trace_clip_path;
diff --git a/fitz/doc_document.c b/fitz/doc_document.c
index 5eda08c7..9b494903 100644
--- a/fitz/doc_document.c
+++ b/fitz/doc_document.c
@@ -202,6 +202,10 @@ void
fz_run_page(fz_document *doc, fz_page *page, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie)
{
fz_annot *annot;
+ fz_rect mediabox;
+
+ fz_bound_page(doc, page, &mediabox);
+ fz_begin_page(dev, &mediabox, transform);
fz_run_page_contents(doc, page, dev, transform, cookie);
@@ -225,6 +229,8 @@ fz_run_page(fz_document *doc, fz_page *page, fz_device *dev, const fz_matrix *tr
fz_run_annot(doc, page, annot, dev, transform, cookie);
}
+
+ fz_end_page(dev);
}
void
diff --git a/fitz/fitz-internal.h b/fitz/fitz-internal.h
index 5b415f4a..37e83df8 100644
--- a/fitz/fitz-internal.h
+++ b/fitz/fitz-internal.h
@@ -1485,6 +1485,9 @@ struct fz_device_s
void (*free_user)(fz_device *);
fz_context *ctx;
+ void (*begin_page)(fz_device *, const fz_rect *rect, const fz_matrix *ctm);
+ void (*end_page)(fz_device *);
+
void (*fill_path)(fz_device *, fz_path *, int even_odd, const fz_matrix *, fz_colorspace *, float *color, float alpha);
void (*stroke_path)(fz_device *, fz_path *, fz_stroke_state *, const fz_matrix *, fz_colorspace *, float *color, float alpha);
void (*clip_path)(fz_device *, fz_path *, const fz_rect *rect, int even_odd, const fz_matrix *);
@@ -1515,6 +1518,8 @@ struct fz_device_s
char errmess[256];
};
+void fz_begin_page(fz_device *dev, const fz_rect *rect, const fz_matrix *ctm);
+void fz_end_page(fz_device *dev);
void fz_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha);
void fz_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha);
void fz_clip_path(fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm);
diff --git a/winrt/mupdfwinrt/muctx.cpp b/winrt/mupdfwinrt/muctx.cpp
index 2643de24..9821039d 100644
--- a/winrt/mupdfwinrt/muctx.cpp
+++ b/winrt/mupdfwinrt/muctx.cpp
@@ -297,7 +297,7 @@ int muctx::GetTextSearch(int page_num, char* needle, sh_vector_text texts_vec)
{
page = fz_load_page(mu_doc, page_num);
sheet = fz_new_text_sheet(ctx_clone);
- text = fz_new_text_page(ctx_clone, &fz_empty_rect);
+ text = fz_new_text_page(ctx_clone, &fz_empty_rect);
dev = fz_new_text_device(ctx_clone, sheet, text);
fz_run_page(mu_doc, page, dev, &fz_identity, NULL);
fz_free_device(dev); /* Why does this need to be done here? Seems odd */