[type1] Allocate the temporary subsetter on the stack.

Avoid a reasonably small, short-lived malloc by allocating the
cairo_type1_font_subset_t on the stack.
This commit is contained in:
Chris Wilson 2008-09-04 13:47:05 +01:00
parent 0cadd4ab02
commit e583fb061d

View file

@ -61,7 +61,6 @@
#include <ctype.h>
typedef struct _cairo_type1_font_subset {
cairo_scaled_font_subset_t *scaled_font_subset;
struct {
@ -76,7 +75,6 @@ typedef struct _cairo_type1_font_subset {
unsigned long header_size;
unsigned long data_size;
unsigned long trailer_size;
} base;
FT_Face face;
@ -115,15 +113,14 @@ typedef struct _cairo_type1_font_subset {
static cairo_status_t
_cairo_type1_font_subset_create (cairo_unscaled_font_t *unscaled_font,
cairo_type1_font_subset_t **subset_return,
cairo_bool_t hex_encode)
_cairo_type1_font_subset_init (cairo_type1_font_subset_t *font,
cairo_unscaled_font_t *unscaled_font,
cairo_bool_t hex_encode)
{
cairo_ft_unscaled_font_t *ft_unscaled_font;
cairo_status_t status;
FT_Face face;
PS_FontInfoRec font_info;
cairo_type1_font_subset_t *font;
int i, j;
ft_unscaled_font = (cairo_ft_unscaled_font_t *) unscaled_font;
@ -145,12 +142,7 @@ _cairo_type1_font_subset_create (cairo_unscaled_font_t *unscaled_font,
}
#endif
font = calloc (sizeof (cairo_type1_font_subset_t), 1);
if (font == NULL) {
status = _cairo_error (CAIRO_STATUS_NO_MEMORY);
goto fail1;
}
memset (font, 0, sizeof (font));
font->base.unscaled_font = _cairo_unscaled_font_reference (unscaled_font);
font->base.num_glyphs = face->num_glyphs;
font->base.x_min = face->bbox.xMin;
@ -189,8 +181,6 @@ _cairo_type1_font_subset_create (cairo_unscaled_font_t *unscaled_font,
_cairo_ft_unscaled_font_unlock_face (ft_unscaled_font);
*subset_return = font;
return CAIRO_STATUS_SUCCESS;
fail3:
@ -198,7 +188,6 @@ _cairo_type1_font_subset_create (cairo_unscaled_font_t *unscaled_font,
free (font->base.base_font);
fail2:
_cairo_unscaled_font_destroy (unscaled_font);
free (font);
fail1:
_cairo_ft_unscaled_font_unlock_face (ft_unscaled_font);
@ -1261,9 +1250,8 @@ cairo_type1_font_subset_generate (void *abstract_font,
}
static void
cairo_type1_font_subset_destroy (void *abstract_font)
_cairo_type1_font_subset_fini (cairo_type1_font_subset_t *font)
{
cairo_type1_font_subset_t *font = abstract_font;
unsigned int i;
/* If the subset generation failed, some of the pointers below may
@ -1282,17 +1270,15 @@ cairo_type1_font_subset_destroy (void *abstract_font)
if (font->base.base_font)
free (font->base.base_font);
free (font->glyphs);
free (font);
}
cairo_status_t
_cairo_type1_subset_init (cairo_type1_subset_t *type1_subset,
const char *name,
cairo_scaled_font_subset_t *scaled_font_subset,
cairo_bool_t hex_encode)
{
cairo_type1_font_subset_t *font = NULL; /* hide compiler warning */
cairo_type1_font_subset_t font;
cairo_status_t status;
unsigned long parent_glyph, length;
unsigned int i;
@ -1308,21 +1294,21 @@ _cairo_type1_subset_init (cairo_type1_subset_t *type1_subset,
unscaled_font = _cairo_ft_scaled_font_get_unscaled_font (scaled_font_subset->scaled_font);
status = _cairo_type1_font_subset_create (unscaled_font, &font, hex_encode);
status = _cairo_type1_font_subset_init (&font, unscaled_font, hex_encode);
if (status)
return status;
for (i = 0; i < scaled_font_subset->num_glyphs; i++) {
parent_glyph = scaled_font_subset->glyphs[i];
cairo_type1_font_subset_use_glyph (font, parent_glyph);
cairo_type1_font_subset_use_glyph (&font, parent_glyph);
}
status = cairo_type1_font_subset_generate (font, name);
status = cairo_type1_font_subset_generate (&font, name);
if (status)
goto fail1;
if (font->base.base_font) {
type1_subset->base_font = strdup (font->base.base_font);
if (font.base.base_font) {
type1_subset->base_font = strdup (font.base.base_font);
} else {
snprintf(buf, sizeof (buf), "CairoFont-%u-%u",
scaled_font_subset->font_id, scaled_font_subset->subset_id);
@ -1331,37 +1317,38 @@ _cairo_type1_subset_init (cairo_type1_subset_t *type1_subset,
if (type1_subset->base_font == NULL)
goto fail1;
type1_subset->widths = calloc (sizeof (int), font->num_glyphs);
type1_subset->widths = calloc (sizeof (int), font.num_glyphs);
if (type1_subset->widths == NULL)
goto fail2;
for (i = 0; i < font->base.num_glyphs; i++) {
if (font->glyphs[i].subset_index < 0)
for (i = 0; i < font.base.num_glyphs; i++) {
if (font.glyphs[i].subset_index < 0)
continue;
type1_subset->widths[font->glyphs[i].subset_index] =
font->glyphs[i].width;
type1_subset->widths[font.glyphs[i].subset_index] =
font.glyphs[i].width;
}
type1_subset->x_min = font->base.x_min;
type1_subset->y_min = font->base.y_min;
type1_subset->x_max = font->base.x_max;
type1_subset->y_max = font->base.y_max;
type1_subset->ascent = font->base.ascent;
type1_subset->descent = font->base.descent;
type1_subset->x_min = font.base.x_min;
type1_subset->y_min = font.base.y_min;
type1_subset->x_max = font.base.x_max;
type1_subset->y_max = font.base.y_max;
type1_subset->ascent = font.base.ascent;
type1_subset->descent = font.base.descent;
length = font->base.header_size + font->base.data_size +
font->base.trailer_size;
length = font.base.header_size +
font.base.data_size +
font.base.trailer_size;
type1_subset->data = malloc (length);
if (type1_subset->data == NULL)
goto fail3;
memcpy (type1_subset->data,
_cairo_array_index (&font->contents, 0), length);
_cairo_array_index (&font.contents, 0), length);
type1_subset->header_length = font->base.header_size;
type1_subset->data_length = font->base.data_size;
type1_subset->trailer_length = font->base.trailer_size;
type1_subset->header_length = font.base.header_size;
type1_subset->data_length = font.base.data_size;
type1_subset->trailer_length = font.base.trailer_size;
cairo_type1_font_subset_destroy (font);
_cairo_type1_font_subset_fini (&font);
return CAIRO_STATUS_SUCCESS;
@ -1370,7 +1357,7 @@ _cairo_type1_subset_init (cairo_type1_subset_t *type1_subset,
fail2:
free (type1_subset->base_font);
fail1:
cairo_type1_font_subset_destroy (font);
_cairo_type1_font_subset_fini (&font);
return status;
}