| 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;
|
| }
|
|
|