diff options
-rw-r--r-- | apps/mudraw.c | 2 | ||||
-rw-r--r-- | fitz/dev_list.c | 92 | ||||
-rw-r--r-- | fitz/dev_null.c | 14 | ||||
-rw-r--r-- | fitz/dev_trace.c | 17 | ||||
-rw-r--r-- | fitz/doc_document.c | 6 | ||||
-rw-r--r-- | fitz/fitz-internal.h | 5 | ||||
-rw-r--r-- | winrt/mupdfwinrt/muctx.cpp | 2 |
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 */ |