diff options
author | Robin Watts <robin.watts@artifex.com> | 2011-09-14 17:36:57 +0100 |
---|---|---|
committer | Robin Watts <Robin.Watts@artifex.com> | 2011-09-15 14:50:17 +0100 |
commit | b51ef0eea028c73b6379e832eaa34fff3fbbb927 (patch) | |
tree | 1ab685ccd356e7fdc832b2e3322c0486b2670cfb /fitz/dev_text.c | |
parent | 89ae81f651bfa112b8e07317eb6983beaf7cb212 (diff) | |
download | mupdf-b51ef0eea028c73b6379e832eaa34fff3fbbb927.tar.xz |
Add context to mupdf.
Huge pervasive change to lots of files, adding a context for exception
handling and allocation.
In time we'll move more statics into there.
Also fix some for(i = 0; i < function(...); i++) calls.
Diffstat (limited to 'fitz/dev_text.c')
-rw-r--r-- | fitz/dev_text.c | 118 |
1 files changed, 62 insertions, 56 deletions
diff --git a/fitz/dev_text.c b/fitz/dev_text.c index 139c3eed..cebfbceb 100644 --- a/fitz/dev_text.c +++ b/fitz/dev_text.c @@ -17,10 +17,10 @@ struct fz_text_device_s }; fz_text_span * -fz_new_text_span(void) +fz_new_text_span(fz_context *ctx) { fz_text_span *span; - span = fz_malloc(sizeof(fz_text_span)); + span = fz_malloc(ctx, sizeof(fz_text_span)); span->font = NULL; span->wmode = 0; span->size = 0; @@ -33,23 +33,29 @@ fz_new_text_span(void) } void -fz_free_text_span(fz_text_span *span) +fz_free_text_span(fz_context *ctx, fz_text_span *span) { - if (span->font) - fz_drop_font(span->font); - if (span->next) - fz_free_text_span(span->next); - fz_free(span->text); - fz_free(span); + fz_text_span *next; + + do + { + next = span->next; + if (span->font) + fz_drop_font(ctx, span->font); + fz_free(ctx, span->text); + fz_free(ctx, span); + span = next; + } + while (span != NULL); } static void -fz_add_text_char_imp(fz_text_span *span, int c, fz_bbox bbox) +fz_add_text_char_imp(fz_context *ctx, fz_text_span *span, int c, fz_bbox bbox) { if (span->len + 1 >= span->cap) { span->cap = span->cap > 1 ? (span->cap * 3) / 2 : 80; - span->text = fz_realloc(span->text, span->cap, sizeof(fz_text_char)); + span->text = fz_realloc(ctx, span->text, span->cap * sizeof(fz_text_char)); } span->text[span->len].c = c; span->text[span->len].bbox = bbox; @@ -67,7 +73,7 @@ fz_split_bbox(fz_bbox bbox, int i, int n) } static void -fz_add_text_char(fz_text_span **last, fz_font *font, float size, int wmode, int c, fz_bbox bbox) +fz_add_text_char(fz_context *ctx, fz_text_span **last, fz_font *font, float size, int wmode, int c, fz_bbox bbox) { fz_text_span *span = *last; @@ -79,7 +85,7 @@ fz_add_text_char(fz_text_span **last, fz_font *font, float size, int wmode, int if ((span->font != font || span->size != size || span->wmode != wmode) && c != 32) { - span = fz_new_text_span(); + span = fz_new_text_span(ctx); span->font = fz_keep_font(font); span->size = size; span->wmode = wmode; @@ -92,34 +98,34 @@ fz_add_text_char(fz_text_span **last, fz_font *font, float size, int wmode, int case -1: /* ignore when one unicode character maps to multiple glyphs */ break; case 0xFB00: /* ff */ - fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 0, 2)); - fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 1, 2)); + fz_add_text_char_imp(ctx, span, 'f', fz_split_bbox(bbox, 0, 2)); + fz_add_text_char_imp(ctx, span, 'f', fz_split_bbox(bbox, 1, 2)); break; case 0xFB01: /* fi */ - fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 0, 2)); - fz_add_text_char_imp(span, 'i', fz_split_bbox(bbox, 1, 2)); + fz_add_text_char_imp(ctx, span, 'f', fz_split_bbox(bbox, 0, 2)); + fz_add_text_char_imp(ctx, span, 'i', fz_split_bbox(bbox, 1, 2)); break; case 0xFB02: /* fl */ - fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 0, 2)); - fz_add_text_char_imp(span, 'l', fz_split_bbox(bbox, 1, 2)); + fz_add_text_char_imp(ctx, span, 'f', fz_split_bbox(bbox, 0, 2)); + fz_add_text_char_imp(ctx, span, 'l', fz_split_bbox(bbox, 1, 2)); break; case 0xFB03: /* ffi */ - fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 0, 3)); - fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 1, 3)); - fz_add_text_char_imp(span, 'i', fz_split_bbox(bbox, 2, 3)); + fz_add_text_char_imp(ctx, span, 'f', fz_split_bbox(bbox, 0, 3)); + fz_add_text_char_imp(ctx, span, 'f', fz_split_bbox(bbox, 1, 3)); + fz_add_text_char_imp(ctx, span, 'i', fz_split_bbox(bbox, 2, 3)); break; case 0xFB04: /* ffl */ - fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 0, 3)); - fz_add_text_char_imp(span, 'f', fz_split_bbox(bbox, 1, 3)); - fz_add_text_char_imp(span, 'l', fz_split_bbox(bbox, 2, 3)); + fz_add_text_char_imp(ctx, span, 'f', fz_split_bbox(bbox, 0, 3)); + fz_add_text_char_imp(ctx, span, 'f', fz_split_bbox(bbox, 1, 3)); + fz_add_text_char_imp(ctx, span, 'l', fz_split_bbox(bbox, 2, 3)); break; case 0xFB05: /* long st */ case 0xFB06: /* st */ - fz_add_text_char_imp(span, 's', fz_split_bbox(bbox, 0, 2)); - fz_add_text_char_imp(span, 't', fz_split_bbox(bbox, 1, 2)); + fz_add_text_char_imp(ctx, span, 's', fz_split_bbox(bbox, 0, 2)); + fz_add_text_char_imp(ctx, span, 't', fz_split_bbox(bbox, 1, 2)); break; default: - fz_add_text_char_imp(span, c, bbox); + fz_add_text_char_imp(ctx, span, c, bbox); break; } } @@ -136,10 +142,10 @@ fz_divide_text_chars(fz_text_span **last, int n, fz_bbox bbox) } static void -fz_add_text_newline(fz_text_span **last, fz_font *font, float size, int wmode) +fz_add_text_newline(fz_context *ctx, fz_text_span **last, fz_font *font, float size, int wmode) { fz_text_span *span; - span = fz_new_text_span(); + span = fz_new_text_span(ctx); span->font = fz_keep_font(font); span->size = size; span->wmode = wmode; @@ -209,7 +215,7 @@ fz_debug_text_span(fz_text_span *span) } static void -fz_text_extract_span(fz_text_span **last, fz_text *text, fz_matrix ctm, fz_point *pen) +fz_text_extract_span(fz_context *ctx, fz_text_span **last, fz_text *text, fz_matrix ctm, fz_point *pen) { fz_font *font = text->font; FT_Face face = font->ft_face; @@ -267,7 +273,7 @@ fz_text_extract_span(fz_text_span **last, fz_text *text, fz_matrix ctm, fz_point { if (text->items[i].gid < 0) { - fz_add_text_char(last, font, size, text->wmode, text->items[i].ucs, fz_round_rect(rect)); + fz_add_text_char(ctx, last, font, size, text->wmode, text->items[i].ucs, fz_round_rect(rect)); multi ++; fz_divide_text_chars(last, multi, fz_round_rect(rect)); continue; @@ -295,7 +301,7 @@ fz_text_extract_span(fz_text_span **last, fz_text *text, fz_matrix ctm, fz_point if (dist > size * LINE_DIST) { - fz_add_text_newline(last, font, size, text->wmode); + fz_add_text_newline(ctx, last, font, size, text->wmode); } else if (fabsf(dot) > 0.95f && dist > size * SPACE_DIST) { @@ -307,7 +313,7 @@ fz_text_extract_span(fz_text_span **last, fz_text *text, fz_matrix ctm, fz_point spacerect.x1 = 0; spacerect.y1 = 1; spacerect = fz_transform_rect(trm, spacerect); - fz_add_text_char(last, font, size, text->wmode, ' ', fz_round_rect(spacerect)); + fz_add_text_char(ctx, last, font, size, text->wmode, ' ', fz_round_rect(spacerect)); } } } @@ -342,71 +348,71 @@ fz_text_extract_span(fz_text_span **last, fz_text *text, fz_matrix ctm, fz_point pen->x = trm.e + dir.x * adv; pen->y = trm.f + dir.y * adv; - fz_add_text_char(last, font, size, text->wmode, text->items[i].ucs, fz_round_rect(rect)); + fz_add_text_char(ctx, last, font, size, text->wmode, text->items[i].ucs, fz_round_rect(rect)); } } static void -fz_text_fill_text(void *user, fz_text *text, fz_matrix ctm, +fz_text_fill_text(fz_device *dev, fz_text *text, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha) { - fz_text_device *tdev = user; - fz_text_extract_span(&tdev->span, text, ctm, &tdev->point); + fz_text_device *tdev = dev->user; + fz_text_extract_span(dev->ctx, &tdev->span, text, ctm, &tdev->point); } static void -fz_text_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm, +fz_text_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha) { - fz_text_device *tdev = user; - fz_text_extract_span(&tdev->span, text, ctm, &tdev->point); + fz_text_device *tdev = dev->user; + fz_text_extract_span(dev->ctx, &tdev->span, text, ctm, &tdev->point); } static void -fz_text_clip_text(void *user, fz_text *text, fz_matrix ctm, int accumulate) +fz_text_clip_text(fz_device *dev, fz_text *text, fz_matrix ctm, int accumulate) { - fz_text_device *tdev = user; - fz_text_extract_span(&tdev->span, text, ctm, &tdev->point); + fz_text_device *tdev = dev->user; + fz_text_extract_span(dev->ctx, &tdev->span, text, ctm, &tdev->point); } static void -fz_text_clip_stroke_text(void *user, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm) +fz_text_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm) { - fz_text_device *tdev = user; - fz_text_extract_span(&tdev->span, text, ctm, &tdev->point); + fz_text_device *tdev = dev->user; + fz_text_extract_span(dev->ctx, &tdev->span, text, ctm, &tdev->point); } static void -fz_text_ignore_text(void *user, fz_text *text, fz_matrix ctm) +fz_text_ignore_text(fz_device *dev, fz_text *text, fz_matrix ctm) { - fz_text_device *tdev = user; - fz_text_extract_span(&tdev->span, text, ctm, &tdev->point); + fz_text_device *tdev = dev->user; + fz_text_extract_span(dev->ctx, &tdev->span, text, ctm, &tdev->point); } static void -fz_text_free_user(void *user) +fz_text_free_user(fz_device *dev) { - fz_text_device *tdev = user; + fz_text_device *tdev = dev->user; tdev->span->eol = 1; /* TODO: unicode NFC normalization */ /* TODO: bidi logical reordering */ - fz_free(tdev); + fz_free(dev->ctx, tdev); } fz_device * -fz_new_text_device(fz_text_span *root) +fz_new_text_device(fz_context *ctx, fz_text_span *root) { fz_device *dev; - fz_text_device *tdev = fz_malloc(sizeof(fz_text_device)); + fz_text_device *tdev = fz_malloc(ctx, sizeof(fz_text_device)); tdev->head = root; tdev->span = root; tdev->point.x = -1; tdev->point.y = -1; - dev = fz_new_device(tdev); + dev = fz_new_device(ctx, tdev); dev->hints = FZ_IGNORE_IMAGE | FZ_IGNORE_SHADE; dev->free_user = fz_text_free_user; dev->fill_text = fz_text_fill_text; |