Index: src/smooth/ftsmooth.c |
diff --git a/src/smooth/ftsmooth.c b/src/smooth/ftsmooth.c |
index 00499cc2868de2bb42a2d44b60e3bb7422cbffb5..89088cd09112b6d845cf71c013e6cf0eaa96b7fd 100644 |
--- a/src/smooth/ftsmooth.c |
+++ b/src/smooth/ftsmooth.c |
@@ -4,7 +4,7 @@ |
/* */ |
/* Anti-aliasing renderer interface (body). */ |
/* */ |
-/* Copyright 2000-2006, 2009-2012 by */ |
+/* Copyright 2000-2006, 2009-2013 by */ |
/* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
/* */ |
/* This file is part of the FreeType project, and may only be used, */ |
@@ -61,12 +61,12 @@ |
const FT_Matrix* matrix, |
const FT_Vector* delta ) |
{ |
- FT_Error error = Smooth_Err_Ok; |
+ FT_Error error = FT_Err_Ok; |
if ( slot->format != render->glyph_format ) |
{ |
- error = Smooth_Err_Invalid_Argument; |
+ error = FT_THROW( Invalid_Argument ); |
goto Exit; |
} |
@@ -109,31 +109,43 @@ |
#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING |
FT_Pos height_org, width_org; |
#endif |
- FT_Bitmap* bitmap; |
- FT_Memory memory; |
- FT_Int hmul = mode == FT_RENDER_MODE_LCD; |
- FT_Int vmul = mode == FT_RENDER_MODE_LCD_V; |
- FT_Pos x_shift, y_shift, x_left, y_top; |
+ FT_Bitmap* bitmap = &slot->bitmap; |
+ FT_Memory memory = render->root.memory; |
+ FT_Int hmul = mode == FT_RENDER_MODE_LCD; |
+ FT_Int vmul = mode == FT_RENDER_MODE_LCD_V; |
+ FT_Pos x_shift = 0; |
+ FT_Pos y_shift = 0; |
+ FT_Pos x_left, y_top; |
FT_Raster_Params params; |
+ FT_Bool have_translated_origin = FALSE; |
+ FT_Bool have_outline_shifted = FALSE; |
+ FT_Bool have_buffer = FALSE; |
+ |
/* check glyph image format */ |
if ( slot->format != render->glyph_format ) |
{ |
- error = Smooth_Err_Invalid_Argument; |
+ error = FT_THROW( Invalid_Argument ); |
goto Exit; |
} |
/* check mode */ |
if ( mode != required_mode ) |
- return Smooth_Err_Cannot_Render_Glyph; |
+ { |
+ error = FT_THROW( Cannot_Render_Glyph ); |
+ goto Exit; |
+ } |
outline = &slot->outline; |
/* translate the outline to the new origin if needed */ |
if ( origin ) |
+ { |
FT_Outline_Translate( outline, origin->x, origin->y ); |
+ have_translated_origin = TRUE; |
+ } |
/* compute the control box, and grid fit it */ |
FT_Outline_Get_CBox( outline, &cbox ); |
@@ -148,24 +160,23 @@ |
FT_ERROR(( "ft_smooth_render_generic: glyph too large:" |
" xMin = %d, xMax = %d\n", |
cbox.xMin >> 6, cbox.xMax >> 6 )); |
- return Smooth_Err_Raster_Overflow; |
+ error = FT_THROW( Raster_Overflow ); |
+ goto Exit; |
} |
else |
- width = ( cbox.xMax - cbox.xMin ) >> 6; |
+ width = ( cbox.xMax - cbox.xMin ) >> 6; |
if ( cbox.yMin < 0 && cbox.yMax > FT_INT_MAX + cbox.yMin ) |
{ |
FT_ERROR(( "ft_smooth_render_generic: glyph too large:" |
" yMin = %d, yMax = %d\n", |
cbox.yMin >> 6, cbox.yMax >> 6 )); |
- return Smooth_Err_Raster_Overflow; |
+ error = FT_THROW( Raster_Overflow ); |
+ goto Exit; |
} |
else |
height = ( cbox.yMax - cbox.yMin ) >> 6; |
- bitmap = &slot->bitmap; |
- memory = render->root.memory; |
- |
#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING |
width_org = width; |
height_org = height; |
@@ -221,13 +232,14 @@ |
#if FT_UINT_MAX > 0xFFFFU |
- /* Required check is ( pitch * height < FT_ULONG_MAX ), */ |
- /* but we care realistic cases only. Always pitch <= width. */ |
+ /* Required check is (pitch * height < FT_ULONG_MAX), */ |
+ /* but we care realistic cases only. Always pitch <= width. */ |
if ( width > 0x7FFF || height > 0x7FFF ) |
{ |
FT_ERROR(( "ft_smooth_render_generic: glyph too large: %u x %u\n", |
width, height )); |
- return Smooth_Err_Raster_Overflow; |
+ error = FT_THROW( Raster_Overflow ); |
+ goto Exit; |
} |
#endif |
@@ -240,9 +252,12 @@ |
/* translate outline to render it into the bitmap */ |
FT_Outline_Translate( outline, -x_shift, -y_shift ); |
+ have_outline_shifted = TRUE; |
if ( FT_ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) ) |
goto Exit; |
+ else |
+ have_buffer = TRUE; |
slot->internal->flags |= FT_GLYPH_OWN_BITMAP; |
@@ -288,6 +303,9 @@ |
vec->y /= 3; |
} |
+ if ( error ) |
+ goto Exit; |
+ |
if ( slot->library->lcd_filter_func ) |
slot->library->lcd_filter_func( bitmap, mode, slot->library ); |
@@ -295,6 +313,8 @@ |
/* render outline into bitmap */ |
error = render->raster_render( render->raster, ¶ms ); |
+ if ( error ) |
+ goto Exit; |
/* expand it horizontally */ |
if ( hmul ) |
@@ -346,25 +366,35 @@ |
#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ |
- FT_Outline_Translate( outline, x_shift, y_shift ); |
- |
/* |
* XXX: on 16bit system, we return an error for huge bitmap |
* to prevent an overflow. |
*/ |
if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX ) |
- return Smooth_Err_Invalid_Pixel_Size; |
- |
- if ( error ) |
+ { |
+ error = FT_THROW( Invalid_Pixel_Size ); |
goto Exit; |
+ } |
slot->format = FT_GLYPH_FORMAT_BITMAP; |
slot->bitmap_left = (FT_Int)x_left; |
slot->bitmap_top = (FT_Int)y_top; |
+ /* everything is fine; don't deallocate buffer */ |
+ have_buffer = FALSE; |
+ |
+ error = FT_Err_Ok; |
+ |
Exit: |
- if ( outline && origin ) |
+ if ( have_outline_shifted ) |
+ FT_Outline_Translate( outline, x_shift, y_shift ); |
+ if ( have_translated_origin ) |
FT_Outline_Translate( outline, -origin->x, -origin->y ); |
+ if ( have_buffer ) |
+ { |
+ FT_FREE( bitmap->buffer ); |
+ slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; |
+ } |
return error; |
} |