summaryrefslogtreecommitdiff
path: root/fitz/dev_text.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2011-09-14 17:36:57 +0100
committerRobin Watts <Robin.Watts@artifex.com>2011-09-15 14:50:17 +0100
commitb51ef0eea028c73b6379e832eaa34fff3fbbb927 (patch)
tree1ab685ccd356e7fdc832b2e3322c0486b2670cfb /fitz/dev_text.c
parent89ae81f651bfa112b8e07317eb6983beaf7cb212 (diff)
downloadmupdf-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.c118
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;