summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2015-04-21 14:29:41 -0700
committerBehdad Esfahbod <behdad@behdad.org>2015-04-21 14:29:41 -0700
commitbb01fd879448b47074d4d800fe1620a57caf1dbe (patch)
tree2486517da3b5f24cbc7aa088fdb56a41184c3fd8
parent040ae0ce1934ac27c6394dc74405faad34cd5913 (diff)
[ft] Return CAIRO_STATUS_FILE_NOT_FOUND if font file can't be opened
A common source of error when people are setting up pango on a new device is when font files don't have the right permissions and cannot be opened. Cairo was returning out-of-memory before, making the Pango error message useless. With this change, cairo will return file-not-found, and pango prints that out. It's still not ideal; a ENOACCESS equivalent would have been better.
-rw-r--r--src/cairo-ft-font.c50
1 files changed, 35 insertions, 15 deletions
diff --git a/src/cairo-ft-font.c b/src/cairo-ft-font.c
index 87e733bb7..043502f18 100644
--- a/src/cairo-ft-font.c
+++ b/src/cairo-ft-font.c
@@ -216,6 +216,17 @@ _cairo_ft_resolve_pattern (FcPattern *pattern,
#endif
+static cairo_status_t
+_ft_to_cairo_error (FT_Error error)
+{
+ /* Currently we don't get many (any?) useful statuses here.
+ * Populate as needed. */
+ switch (error)
+ {
+ default: return CAIRO_STATUS_NO_MEMORY;
+ }
+}
+
/*
* We maintain a hash table to map file/id => #cairo_ft_unscaled_font_t.
* The hash table itself isn't limited in size. However, we limit the
@@ -645,6 +656,7 @@ _cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled)
{
cairo_ft_unscaled_font_map_t *font_map;
FT_Face face = NULL;
+ FT_Error error;
CAIRO_MUTEX_LOCK (unscaled->mutex);
unscaled->lock_count++;
@@ -674,14 +686,16 @@ _cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled)
}
_cairo_ft_unscaled_font_map_unlock ();
- if (FT_New_Face (font_map->ft_library,
- unscaled->filename,
- unscaled->id,
- &face) != FT_Err_Ok)
+ error = FT_New_Face (font_map->ft_library,
+ unscaled->filename,
+ unscaled->id,
+ &face);
+ printf("HERE %x\n", error);
+ if (error)
{
unscaled->lock_count--;
CAIRO_MUTEX_UNLOCK (unscaled->mutex);
- _cairo_error_throw (CAIRO_STATUS_NO_MEMORY);
+ _cairo_error_throw (_ft_to_cairo_error (error));
return NULL;
}
@@ -835,7 +849,7 @@ _cairo_ft_unscaled_font_set_scale (cairo_ft_unscaled_font_t *unscaled,
sf.y_scale * 64.0 + .5,
0, 0);
if (error)
- return _cairo_error (CAIRO_STATUS_NO_MEMORY);
+ return _cairo_error (_ft_to_cairo_error (error));
return CAIRO_STATUS_SUCCESS;
}
@@ -1240,6 +1254,7 @@ _get_bitmap_surface (FT_Bitmap *bitmap,
FT_Bitmap tmp;
FT_Int align;
+ FT_Error error;
format = CAIRO_FORMAT_A8;
@@ -1247,8 +1262,9 @@ _get_bitmap_surface (FT_Bitmap *bitmap,
FT_Bitmap_New( &tmp );
- if (FT_Bitmap_Convert( library, bitmap, &tmp, align ))
- return _cairo_error (CAIRO_STATUS_NO_MEMORY);
+ error = FT_Bitmap_Convert( library, bitmap, &tmp, align );
+ if (error)
+ return _cairo_error (_ft_to_cairo_error (error));
FT_Bitmap_Done( library, bitmap );
*bitmap = tmp;
@@ -1277,7 +1293,7 @@ _get_bitmap_surface (FT_Bitmap *bitmap,
default:
if (own_buffer)
free (bitmap->buffer);
- return _cairo_error (CAIRO_STATUS_NO_MEMORY);
+ return _cairo_error (CAIRO_STATUS_INVALID_FORMAT);
}
/* XXX */
@@ -1328,7 +1344,7 @@ _render_glyph_outline (FT_Face face,
FT_BBox cbox;
unsigned int width, height;
cairo_status_t status;
- FT_Error fterror;
+ FT_Error error;
FT_Library library = glyphslot->library;
FT_Render_Mode render_mode = FT_RENDER_MODE_NORMAL;
@@ -1441,20 +1457,20 @@ _render_glyph_outline (FT_Face face,
FT_Library_SetLcdFilter (library, lcd_filter);
#endif
- fterror = FT_Render_Glyph (face->glyph, render_mode);
+ error = FT_Render_Glyph (face->glyph, render_mode);
#if HAVE_FT_LIBRARY_SETLCDFILTER
FT_Library_SetLcdFilter (library, FT_LCD_FILTER_NONE);
#endif
- if (fterror != 0)
- return _cairo_error (CAIRO_STATUS_NO_MEMORY);
+ if (error)
+ return _cairo_error (_ft_to_cairo_error (error));
bitmap_size = _compute_xrender_bitmap_size (&bitmap,
face->glyph,
render_mode);
if (bitmap_size < 0)
- return _cairo_error (CAIRO_STATUS_NO_MEMORY);
+ return _cairo_error (CAIRO_STATUS_INVALID_FORMAT);
bitmap.buffer = calloc (1, bitmap_size);
if (bitmap.buffer == NULL)
@@ -3284,8 +3300,12 @@ cairo_ft_font_face_create_for_pattern (FcPattern *pattern)
cairo_status_t status;
status = _cairo_ft_unscaled_font_create_for_pattern (pattern, &unscaled);
- if (unlikely (status))
+ if (unlikely (status)) {
+ if (status == CAIRO_STATUS_FILE_NOT_FOUND)
+ return (cairo_font_face_t *) &_cairo_font_face_nil_file_not_found;
+ else
return (cairo_font_face_t *) &_cairo_font_face_nil;
+ }
if (unlikely (unscaled == NULL)) {
/* Store the pattern. We will resolve it and create unscaled
* font when creating scaled fonts */