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