[cairo-scaled-font-subset] Propagate errors during collection.

Propagate the errors encountered whilst iterating over the scaled font
subsets ie _cairo_scaled_font_subsets_foreach_scaled() and co.
This commit is contained in:
Chris Wilson 2007-10-05 10:23:13 +01:00
parent 3a2dd9d336
commit 6598973661
5 changed files with 51 additions and 22 deletions

View file

@ -3607,7 +3607,7 @@ _cairo_pdf_surface_emit_type3_font_subset (cairo_pdf_surface_t *surface,
return _cairo_array_append (&surface->fonts, &font);
}
static void
static cairo_status_t
_cairo_pdf_surface_emit_unscaled_font_subset (cairo_scaled_font_subset_t *font_subset,
void *closure)
{
@ -3617,29 +3617,31 @@ _cairo_pdf_surface_emit_unscaled_font_subset (cairo_scaled_font_subset_t *font_s
if (font_subset->is_composite) {
status = _cairo_pdf_surface_emit_cff_font_subset (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return;
return status;
status = _cairo_pdf_surface_emit_truetype_font_subset (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return;
return status;
status = _cairo_pdf_surface_emit_cff_fallback_font (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return;
return status;
} else {
#if CAIRO_HAS_FT_FONT
status = _cairo_pdf_surface_emit_type1_font_subset (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return;
return status;
#endif
status = _cairo_pdf_surface_emit_type1_fallback_font (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return;
return status;
}
return CAIRO_STATUS_SUCCESS;
}
static void
static cairo_status_t
_cairo_pdf_surface_emit_scaled_font_subset (cairo_scaled_font_subset_t *font_subset,
void *closure)
{
@ -3648,7 +3650,9 @@ _cairo_pdf_surface_emit_scaled_font_subset (cairo_scaled_font_subset_t *font_sub
status = _cairo_pdf_surface_emit_type3_font_subset (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return;
return status;
return CAIRO_STATUS_SUCCESS;
}
static cairo_status_t

View file

@ -714,7 +714,7 @@ _cairo_ps_surface_emit_type3_font_subset (cairo_ps_surface_t *surface,
}
static void
static cairo_status_t
_cairo_ps_surface_emit_unscaled_font_subset (cairo_scaled_font_subset_t *font_subset,
void *closure)
{
@ -724,19 +724,21 @@ _cairo_ps_surface_emit_unscaled_font_subset (cairo_scaled_font_subset_t *font_su
#if CAIRO_HAS_FT_FONT
status = _cairo_ps_surface_emit_type1_font_subset (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return;
return status;
#endif
status = _cairo_ps_surface_emit_truetype_font_subset (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return;
return status;
status = _cairo_ps_surface_emit_type1_font_fallback (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return;
return status;
return CAIRO_STATUS_SUCCESS;
}
static void
static cairo_status_t
_cairo_ps_surface_emit_scaled_font_subset (cairo_scaled_font_subset_t *font_subset,
void *closure)
{
@ -745,7 +747,9 @@ _cairo_ps_surface_emit_scaled_font_subset (cairo_scaled_font_subset_t *font_subs
status = _cairo_ps_surface_emit_type3_font_subset (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return;
return status;
return CAIRO_STATUS_SUCCESS;
}
static cairo_status_t
@ -761,9 +765,14 @@ _cairo_ps_surface_emit_font_subsets (cairo_ps_surface_t *surface)
status = _cairo_scaled_font_subsets_foreach_unscaled (surface->font_subsets,
_cairo_ps_surface_emit_unscaled_font_subset,
surface);
if (status)
goto BAIL;
status = _cairo_scaled_font_subsets_foreach_scaled (surface->font_subsets,
_cairo_ps_surface_emit_scaled_font_subset,
surface);
BAIL:
_cairo_scaled_font_subsets_destroy (surface->font_subsets);
surface->font_subsets = NULL;
@ -1284,13 +1293,15 @@ _cairo_ps_surface_finish (void *abstract_surface)
_cairo_ps_surface_emit_header (surface);
_cairo_ps_surface_emit_font_subsets (surface);
status = _cairo_ps_surface_emit_font_subsets (surface);
_cairo_ps_surface_emit_body (surface);
_cairo_ps_surface_emit_footer (surface);
status = _cairo_output_stream_destroy (surface->stream);
status2 = _cairo_output_stream_destroy (surface->stream);
if (status == CAIRO_STATUS_SUCCESS)
status = status2;
fclose (surface->tmpfile);

View file

@ -188,7 +188,7 @@ _cairo_scaled_font_subsets_map_glyph (cairo_scaled_font_subsets_t *font_subsets,
unsigned long scaled_font_glyph_index,
cairo_scaled_font_subsets_glyph_t *subset_glyph_ret);
typedef void
typedef cairo_status_t
(*cairo_scaled_font_subset_callback_func_t) (cairo_scaled_font_subset_t *font_subset,
void *closure);

View file

@ -95,6 +95,7 @@ typedef struct _cairo_sub_font_collection {
unsigned int subset_id;
cairo_status_t status;
cairo_scaled_font_subset_callback_func_t font_subset_callback;
void *font_subset_callback_closure;
} cairo_sub_font_collection_t;
@ -367,6 +368,9 @@ _cairo_sub_font_collect (void *entry, void *closure)
int i;
unsigned int j;
if (collection->status)
return;
for (i = 0; i <= sub_font->current_subset; i++) {
collection->subset_id = i;
@ -382,6 +386,10 @@ _cairo_sub_font_collect (void *entry, void *closure)
_cairo_hash_table_foreach (sub_font->sub_font_glyphs,
_cairo_sub_font_glyph_collect, collection);
if (collection->status)
break;
if (collection->num_glyphs == 0)
continue;
/* Ensure the resulting array has no uninitialized holes */
assert (collection->num_glyphs == collection->max_glyph + 1);
@ -401,11 +409,14 @@ _cairo_sub_font_collect (void *entry, void *closure)
subset.to_unicode[j] = 0xfffd;
}
}
(collection->font_subset_callback) (&subset,
collection->status = (collection->font_subset_callback) (&subset,
collection->font_subset_callback_closure);
if (subset.to_unicode != NULL)
free (subset.to_unicode);
if (collection->status)
break;
}
}
@ -634,6 +645,7 @@ _cairo_scaled_font_subsets_foreach_internal (cairo_scaled_font_subsets_t
collection.font_subset_callback = font_subset_callback;
collection.font_subset_callback_closure = closure;
collection.status = CAIRO_STATUS_SUCCESS;
if (is_scaled)
_cairo_hash_table_foreach (font_subsets->scaled_sub_fonts,
@ -644,10 +656,10 @@ _cairo_scaled_font_subsets_foreach_internal (cairo_scaled_font_subsets_t
free (collection.glyphs);
return CAIRO_STATUS_SUCCESS;
return collection.status;
}
cairo_private cairo_status_t
cairo_status_t
_cairo_scaled_font_subsets_foreach_scaled (cairo_scaled_font_subsets_t *font_subsets,
cairo_scaled_font_subset_callback_func_t font_subset_callback,
void *closure)
@ -658,7 +670,7 @@ _cairo_scaled_font_subsets_foreach_scaled (cairo_scaled_font_subsets_t *fon
TRUE);
}
cairo_private cairo_status_t
cairo_status_t
_cairo_scaled_font_subsets_foreach_unscaled (cairo_scaled_font_subsets_t *font_subsets,
cairo_scaled_font_subset_callback_func_t font_subset_callback,
void *closure)

View file

@ -707,7 +707,7 @@ _cairo_svg_document_emit_glyph (cairo_svg_document_t *document,
return CAIRO_STATUS_SUCCESS;
}
static void
static cairo_status_t
_cairo_svg_document_emit_font_subset (cairo_scaled_font_subset_t *font_subset,
void *closure)
{
@ -723,6 +723,8 @@ _cairo_svg_document_emit_font_subset (cairo_scaled_font_subset_t *font_subset,
if (status)
break;
}
return status;
}
static cairo_status_t