diff options
Diffstat (limited to 'source/fitz/stext-device.c')
-rw-r--r-- | source/fitz/stext-device.c | 153 |
1 files changed, 75 insertions, 78 deletions
diff --git a/source/fitz/stext-device.c b/source/fitz/stext-device.c index 20e5e525..3213406e 100644 --- a/source/fitz/stext-device.c +++ b/source/fitz/stext-device.c @@ -25,6 +25,7 @@ typedef struct span_soup_s span_soup; struct fz_text_device_s { + fz_device super; fz_text_sheet *sheet; fz_text_page *page; span_soup *spans; @@ -47,7 +48,7 @@ add_point_to_rect(fz_rect *a, const fz_point *p) } fz_rect * -fz_text_char_bbox(fz_rect *bbox, fz_text_span *span, int i) +fz_text_char_bbox(fz_context *ctx, fz_rect *bbox, fz_text_span *span, int i) { fz_point a, d; const fz_point *max; @@ -112,7 +113,6 @@ add_bbox_to_span(fz_text_span *span) struct span_soup_s { - fz_context *ctx; int len, cap; fz_text_span **spans; }; @@ -121,7 +121,6 @@ static span_soup * new_span_soup(fz_context *ctx) { span_soup *soup = fz_malloc_struct(ctx, span_soup); - soup->ctx = ctx; soup->len = 0; soup->cap = 0; soup->spans = NULL; @@ -129,7 +128,7 @@ new_span_soup(fz_context *ctx) } static void -free_span_soup(span_soup *soup) +free_span_soup(fz_context *ctx, span_soup *soup) { int i; @@ -137,21 +136,21 @@ free_span_soup(span_soup *soup) return; for (i = 0; i < soup->len; i++) { - fz_free(soup->ctx, soup->spans[i]); + fz_free(ctx, soup->spans[i]); } - fz_free(soup->ctx, soup->spans); - fz_free(soup->ctx, soup); + fz_free(ctx, soup->spans); + fz_free(ctx, soup); } static void -add_span_to_soup(span_soup *soup, fz_text_span *span) +add_span_to_soup(fz_context *ctx, span_soup *soup, fz_text_span *span) { if (span == NULL) return; if (soup->len == soup->cap) { int newcap = (soup->cap ? soup->cap * 2 : 16); - soup->spans = fz_resize_array(soup->ctx, soup->spans, newcap, sizeof(*soup->spans)); + soup->spans = fz_resize_array(ctx, soup->spans, newcap, sizeof(*soup->spans)); soup->cap = newcap; } add_bbox_to_span(span); @@ -266,6 +265,9 @@ strain_soup(fz_context *ctx, fz_text_device *tdev) fz_text_span *last_span = NULL; int span_num; + if (soup == NULL) + return; + /* Really dumb implementation to match what we had before */ for (span_num=0; span_num < soup->len; span_num++) { @@ -368,7 +370,7 @@ fz_new_text_sheet(fz_context *ctx) } void -fz_free_text_sheet(fz_context *ctx, fz_text_sheet *sheet) +fz_drop_text_sheet(fz_context *ctx, fz_text_sheet *sheet) { fz_text_style *style; @@ -447,7 +449,7 @@ fz_new_text_page(fz_context *ctx) } static void -fz_free_text_line_contents(fz_context *ctx, fz_text_line *line) +fz_drop_text_line_contents(fz_context *ctx, fz_text_line *line) { fz_text_span *span, *next; for (span = line->first_span; span; span=next) @@ -459,19 +461,19 @@ fz_free_text_line_contents(fz_context *ctx, fz_text_line *line) } static void -fz_free_text_block(fz_context *ctx, fz_text_block *block) +fz_drop_text_block(fz_context *ctx, fz_text_block *block) { fz_text_line *line; if (block == NULL) return; for (line = block->lines; line < block->lines + block->len; line++) - fz_free_text_line_contents(ctx, line); + fz_drop_text_line_contents(ctx, line); fz_free(ctx, block->lines); fz_free(ctx, block); } static void -fz_free_image_block(fz_context *ctx, fz_image_block *block) +fz_drop_image_block(fz_context *ctx, fz_image_block *block) { if (block == NULL) return; @@ -481,7 +483,7 @@ fz_free_image_block(fz_context *ctx, fz_image_block *block) } void -fz_free_text_page(fz_context *ctx, fz_text_page *page) +fz_drop_text_page(fz_context *ctx, fz_text_page *page) { fz_page_block *block; if (page == NULL) @@ -491,10 +493,10 @@ fz_free_text_page(fz_context *ctx, fz_text_page *page) switch (block->type) { case FZ_PAGE_BLOCK_TEXT: - fz_free_text_block(ctx, block->u.text); + fz_drop_text_block(ctx, block->u.text); break; case FZ_PAGE_BLOCK_IMAGE: - fz_free_image_block(ctx, block->u.image); + fz_drop_image_block(ctx, block->u.image); break; } } @@ -638,7 +640,7 @@ fz_add_text_char_imp(fz_context *ctx, fz_text_device *dev, fz_text_style *style, if (can_append == 0) { /* Start a new span */ - add_span_to_soup(dev->spans, dev->cur_span); + add_span_to_soup(ctx, dev->spans, dev->cur_span); dev->cur_span = NULL; dev->cur_span = fz_new_text_span(ctx, &p, wmode, trm); dev->cur_span->spacing = 0; @@ -787,60 +789,59 @@ fz_text_extract(fz_context *ctx, fz_text_device *dev, fz_text *text, const fz_ma } static void -fz_text_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, +fz_text_fill_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha) { - fz_text_device *tdev = dev->user; + fz_text_device *tdev = (fz_text_device*)dev; fz_text_style *style; - style = fz_lookup_text_style(dev->ctx, tdev->sheet, text, ctm, colorspace, color, alpha, NULL); - fz_text_extract(dev->ctx, tdev, text, ctm, style); + style = fz_lookup_text_style(ctx, tdev->sheet, text, ctm, colorspace, color, alpha, NULL); + fz_text_extract(ctx, tdev, text, ctm, style); } static void -fz_text_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm, +fz_text_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha) { - fz_text_device *tdev = dev->user; + fz_text_device *tdev = (fz_text_device*)dev; fz_text_style *style; - style = fz_lookup_text_style(dev->ctx, tdev->sheet, text, ctm, colorspace, color, alpha, stroke); - fz_text_extract(dev->ctx, tdev, text, ctm, style); + style = fz_lookup_text_style(ctx, tdev->sheet, text, ctm, colorspace, color, alpha, stroke); + fz_text_extract(ctx, tdev, text, ctm, style); } static void -fz_text_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate) +fz_text_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate) { - fz_text_device *tdev = dev->user; + fz_text_device *tdev = (fz_text_device*)dev; fz_text_style *style; - style = fz_lookup_text_style(dev->ctx, tdev->sheet, text, ctm, NULL, NULL, 0, NULL); - fz_text_extract(dev->ctx, tdev, text, ctm, style); + style = fz_lookup_text_style(ctx, tdev->sheet, text, ctm, NULL, NULL, 0, NULL); + fz_text_extract(ctx, tdev, text, ctm, style); } static void -fz_text_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm) +fz_text_clip_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm) { - fz_text_device *tdev = dev->user; + fz_text_device *tdev = (fz_text_device*)dev; fz_text_style *style; - style = fz_lookup_text_style(dev->ctx, tdev->sheet, text, ctm, NULL, NULL, 0, stroke); - fz_text_extract(dev->ctx, tdev, text, ctm, style); + style = fz_lookup_text_style(ctx, tdev->sheet, text, ctm, NULL, NULL, 0, stroke); + fz_text_extract(ctx, tdev, text, ctm, style); } static void -fz_text_ignore_text(fz_device *dev, fz_text *text, const fz_matrix *ctm) +fz_text_ignore_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm) { - fz_text_device *tdev = dev->user; + fz_text_device *tdev = (fz_text_device*)dev; fz_text_style *style; - style = fz_lookup_text_style(dev->ctx, tdev->sheet, text, ctm, NULL, NULL, 0, NULL); - fz_text_extract(dev->ctx, tdev, text, ctm, style); + style = fz_lookup_text_style(ctx, tdev->sheet, text, ctm, NULL, NULL, 0, NULL); + fz_text_extract(ctx, tdev, text, ctm, style); } static void -fz_text_fill_image_mask(fz_device *dev, fz_image *img, const fz_matrix *ctm, +fz_text_fill_image_mask(fz_context *ctx, fz_device *dev, fz_image *img, const fz_matrix *ctm, fz_colorspace *cspace, float *color, float alpha) { - fz_text_device *tdev = dev->user; + fz_text_device *tdev = (fz_text_device*)dev; fz_text_page *page = tdev->page; fz_image_block *block; - fz_context *ctx = dev->ctx; /* If the alpha is less than 50% then it's probably a watermark or * effect or something. Skip it */ @@ -865,9 +866,9 @@ fz_text_fill_image_mask(fz_device *dev, fz_image *img, const fz_matrix *ctm, } static void -fz_text_fill_image(fz_device *dev, fz_image *img, const fz_matrix *ctm, float alpha) +fz_text_fill_image(fz_context *ctx, fz_device *dev, fz_image *img, const fz_matrix *ctm, float alpha) { - fz_text_fill_image_mask(dev, img, ctm, NULL, NULL, alpha); + fz_text_fill_image_mask(ctx, dev, img, ctm, NULL, NULL, alpha); } static int @@ -957,10 +958,9 @@ fz_bidi_reorder_text_page(fz_context *ctx, fz_text_page *page) } static void -fz_text_begin_page(fz_device *dev, const fz_rect *mediabox, const fz_matrix *ctm) +fz_text_begin_page(fz_context *ctx, fz_device *dev, const fz_rect *mediabox, const fz_matrix *ctm) { - fz_context *ctx = dev->ctx; - fz_text_device *tdev = dev->user; + fz_text_device *tdev = (fz_text_device*)dev; if (tdev->page->len) { @@ -975,16 +975,15 @@ fz_text_begin_page(fz_device *dev, const fz_rect *mediabox, const fz_matrix *ctm } static void -fz_text_end_page(fz_device *dev) +fz_text_end_page(fz_context *ctx, fz_device *dev) { - fz_context *ctx = dev->ctx; - fz_text_device *tdev = dev->user; + fz_text_device *tdev = (fz_text_device*)dev; - add_span_to_soup(tdev->spans, tdev->cur_span); + add_span_to_soup(ctx, tdev->spans, tdev->cur_span); tdev->cur_span = NULL; strain_soup(ctx, tdev); - free_span_soup(tdev->spans); + free_span_soup(ctx, tdev->spans); tdev->spans = NULL; /* TODO: smart sorting of blocks in reading order */ @@ -994,37 +993,35 @@ fz_text_end_page(fz_device *dev) } static void -fz_text_free_user(fz_device *dev) +fz_text_drop_imp(fz_context *ctx, fz_device *dev) { - fz_text_device *tdev = dev->user; - free_span_soup(tdev->spans); - fz_free(dev->ctx, tdev); + fz_text_device *tdev = (fz_text_device*)dev; + free_span_soup(ctx, tdev->spans); } fz_device * fz_new_text_device(fz_context *ctx, fz_text_sheet *sheet, fz_text_page *page) { - fz_device *dev; - - fz_text_device *tdev = fz_malloc_struct(ctx, fz_text_device); - tdev->sheet = sheet; - tdev->page = page; - tdev->spans = NULL; - tdev->cur_span = NULL; - tdev->lastchar = ' '; - - dev = fz_new_device(ctx, tdev); - dev->hints = FZ_IGNORE_IMAGE | FZ_IGNORE_SHADE; - dev->begin_page = fz_text_begin_page; - dev->end_page = fz_text_end_page; - dev->free_user = fz_text_free_user; - dev->fill_text = fz_text_fill_text; - dev->stroke_text = fz_text_stroke_text; - dev->clip_text = fz_text_clip_text; - dev->clip_stroke_text = fz_text_clip_stroke_text; - dev->ignore_text = fz_text_ignore_text; - dev->fill_image = fz_text_fill_image; - dev->fill_image_mask = fz_text_fill_image_mask; - - return dev; + fz_text_device *dev = fz_new_device(ctx, sizeof *dev); + + dev->super.hints = FZ_IGNORE_IMAGE | FZ_IGNORE_SHADE; + + dev->super.drop_imp = fz_text_drop_imp; + dev->super.begin_page = fz_text_begin_page; + dev->super.end_page = fz_text_end_page; + dev->super.fill_text = fz_text_fill_text; + dev->super.stroke_text = fz_text_stroke_text; + dev->super.clip_text = fz_text_clip_text; + dev->super.clip_stroke_text = fz_text_clip_stroke_text; + dev->super.ignore_text = fz_text_ignore_text; + dev->super.fill_image = fz_text_fill_image; + dev->super.fill_image_mask = fz_text_fill_image_mask; + + dev->sheet = sheet; + dev->page = page; + dev->spans = NULL; + dev->cur_span = NULL; + dev->lastchar = ' '; + + return (fz_device*)dev; } |