| Index: third_party/freetype/src/smooth/ftsmooth.c
|
| diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.c b/third_party/freetype/src/smooth/ftsmooth.c
|
| similarity index 86%
|
| rename from core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.c
|
| rename to third_party/freetype/src/smooth/ftsmooth.c
|
| index 375b27b3e5b2a6a276a13c2bedaabc57d158e34a..4e2dee562b0a62c75c299d7ad555a249175734d9 100644
|
| --- a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.c
|
| +++ b/third_party/freetype/src/smooth/ftsmooth.c
|
| @@ -16,10 +16,10 @@
|
| /***************************************************************************/
|
|
|
|
|
| -#include "../../include/ft2build.h"
|
| -#include "../../include/freetype/internal/ftdebug.h"
|
| -#include "../../include/freetype/internal/ftobjs.h"
|
| -#include "../../include/freetype/ftoutln.h"
|
| +#include <ft2build.h>
|
| +#include FT_INTERNAL_DEBUG_H
|
| +#include FT_INTERNAL_OBJECTS_H
|
| +#include FT_OUTLINE_H
|
| #include "ftsmooth.h"
|
| #include "ftgrays.h"
|
| #include "ftspic.h"
|
| @@ -103,25 +103,24 @@
|
| FT_Render_Mode required_mode )
|
| {
|
| FT_Error error;
|
| - FT_Outline* outline = NULL;
|
| + FT_Outline* outline = &slot->outline;
|
| + FT_Bitmap* bitmap = &slot->bitmap;
|
| + FT_Memory memory = render->root.memory;
|
| FT_BBox cbox;
|
| + FT_Pos x_shift = 0;
|
| + FT_Pos y_shift = 0;
|
| + FT_Pos x_left, y_top;
|
| FT_Pos width, height, pitch;
|
| #ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
|
| FT_Pos height_org, width_org;
|
| #endif
|
| - 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;
|
| + FT_Bool have_outline_shifted = FALSE;
|
| + FT_Bool have_buffer = FALSE;
|
|
|
|
|
| /* check glyph image format */
|
| @@ -138,73 +137,45 @@
|
| 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;
|
| + x_shift = origin->x;
|
| + y_shift = origin->y;
|
| }
|
|
|
| /* compute the control box, and grid fit it */
|
| + /* taking into account the origin shift */
|
| FT_Outline_Get_CBox( outline, &cbox );
|
|
|
| - cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
|
| - cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
|
| - cbox.xMax = FT_PIX_CEIL( cbox.xMax );
|
| - cbox.yMax = FT_PIX_CEIL( cbox.yMax );
|
| + cbox.xMin = FT_PIX_FLOOR( cbox.xMin + x_shift );
|
| + cbox.yMin = FT_PIX_FLOOR( cbox.yMin + y_shift );
|
| + cbox.xMax = FT_PIX_CEIL( cbox.xMax + x_shift );
|
| + cbox.yMax = FT_PIX_CEIL( cbox.yMax + y_shift );
|
|
|
| - if ( cbox.xMin < 0 && cbox.xMax > FT_INT_MAX + cbox.xMin )
|
| - {
|
| - FT_ERROR(( "ft_smooth_render_generic: glyph too large:"
|
| - " xMin = %d, xMax = %d\n",
|
| - cbox.xMin >> 6, cbox.xMax >> 6 ));
|
| - error = FT_THROW( Raster_Overflow );
|
| - goto Exit;
|
| - }
|
| - else
|
| - width = ( cbox.xMax - cbox.xMin ) >> 6;
|
| + x_shift -= cbox.xMin;
|
| + y_shift -= cbox.yMin;
|
|
|
| - 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 ));
|
| - error = FT_THROW( Raster_Overflow );
|
| - goto Exit;
|
| - }
|
| - else
|
| - height = ( cbox.yMax - cbox.yMin ) >> 6;
|
| + x_left = cbox.xMin >> 6;
|
| + y_top = cbox.yMax >> 6;
|
| +
|
| + width = (FT_ULong)( cbox.xMax - cbox.xMin ) >> 6;
|
| + height = (FT_ULong)( cbox.yMax - cbox.yMin ) >> 6;
|
|
|
| #ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
|
| width_org = width;
|
| height_org = height;
|
| #endif
|
|
|
| - /* release old bitmap buffer */
|
| - if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
|
| - {
|
| - FT_FREE( bitmap->buffer );
|
| - slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
|
| - }
|
| -
|
| - /* allocate new one */
|
| pitch = width;
|
| if ( hmul )
|
| {
|
| - width = width * 3;
|
| - pitch = FT_PAD_CEIL( width, 4 );
|
| + width *= 3;
|
| + pitch = FT_PAD_CEIL( width, 4 );
|
| }
|
|
|
| if ( vmul )
|
| height *= 3;
|
|
|
| - x_shift = (FT_Int) cbox.xMin;
|
| - y_shift = (FT_Int) cbox.yMin;
|
| - x_left = (FT_Int)( cbox.xMin >> 6 );
|
| - y_top = (FT_Int)( cbox.yMax >> 6 );
|
| -
|
| #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
|
|
|
| if ( slot->library->lcd_filter_func )
|
| @@ -214,23 +185,32 @@
|
|
|
| if ( hmul )
|
| {
|
| - x_shift -= 64 * ( extra >> 1 );
|
| + x_shift += 64 * ( extra >> 1 );
|
| + x_left -= extra >> 1;
|
| width += 3 * extra;
|
| pitch = FT_PAD_CEIL( width, 4 );
|
| - x_left -= extra >> 1;
|
| }
|
|
|
| if ( vmul )
|
| {
|
| - y_shift -= 64 * ( extra >> 1 );
|
| - height += 3 * extra;
|
| + y_shift += 64 * ( extra >> 1 );
|
| y_top += extra >> 1;
|
| + height += 3 * extra;
|
| }
|
| }
|
|
|
| #endif
|
|
|
| -#if FT_UINT_MAX > 0xFFFFU
|
| + /*
|
| + * 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 ||
|
| + x_left < FT_INT_MIN || y_top < FT_INT_MIN )
|
| + {
|
| + error = FT_THROW( Invalid_Pixel_Size );
|
| + goto Exit;
|
| + }
|
|
|
| /* Required check is (pitch * height < FT_ULONG_MAX), */
|
| /* but we care realistic cases only. Always pitch <= width. */
|
| @@ -242,7 +222,24 @@
|
| goto Exit;
|
| }
|
|
|
| -#endif
|
| + /* release old bitmap buffer */
|
| + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
|
| + {
|
| + FT_FREE( bitmap->buffer );
|
| + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
|
| + }
|
| +
|
| + /* allocate new one */
|
| + if ( FT_ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) )
|
| + goto Exit;
|
| + else
|
| + have_buffer = TRUE;
|
| +
|
| + slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
|
| +
|
| + slot->format = FT_GLYPH_FORMAT_BITMAP;
|
| + slot->bitmap_left = (FT_Int)x_left;
|
| + slot->bitmap_top = (FT_Int)y_top;
|
|
|
| bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
|
| bitmap->num_grays = 256;
|
| @@ -251,15 +248,11 @@
|
| bitmap->pitch = pitch;
|
|
|
| /* 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;
|
| + if ( x_shift || y_shift )
|
| + {
|
| + FT_Outline_Translate( outline, x_shift, y_shift );
|
| + have_outline_shifted = TRUE;
|
| + }
|
|
|
| /* set up parameters */
|
| params.target = bitmap;
|
| @@ -366,20 +359,6 @@
|
|
|
| #endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
|
|
|
| - /*
|
| - * 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 )
|
| - {
|
| - 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;
|
|
|
| @@ -387,9 +366,7 @@
|
|
|
| Exit:
|
| if ( have_outline_shifted )
|
| - FT_Outline_Translate( outline, x_shift, y_shift );
|
| - if ( have_translated_origin )
|
| - FT_Outline_Translate( outline, -origin->x, -origin->y );
|
| + FT_Outline_Translate( outline, -x_shift, -y_shift );
|
| if ( have_buffer )
|
| {
|
| FT_FREE( bitmap->buffer );
|
|
|