summaryrefslogtreecommitdiff
path: root/source/fitz/stext-device.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/fitz/stext-device.c')
-rw-r--r--source/fitz/stext-device.c153
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;
}