diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2015-04-21 14:29:41 -0700 |
---|---|---|
committer | Behdad Esfahbod <behdad@behdad.org> | 2015-04-21 14:29:41 -0700 |
commit | bb01fd879448b47074d4d800fe1620a57caf1dbe (patch) | |
tree | 2486517da3b5f24cbc7aa088fdb56a41184c3fd8 | |
parent | 040ae0ce1934ac27c6394dc74405faad34cd5913 (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.c | 50 |
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 */ |