| Index: third_party/freetype/src/smooth/ftgrays.c
|
| diff --git a/third_party/freetype/src/smooth/ftgrays.c b/third_party/freetype/src/smooth/ftgrays.c
|
| index 9d37d64517beb14b4b475a0e5edc0a47563f3c9f..ba2944559c3335bfb05ffd4cdcb2054cd45866c9 100644
|
| --- a/third_party/freetype/src/smooth/ftgrays.c
|
| +++ b/third_party/freetype/src/smooth/ftgrays.c
|
| @@ -4,7 +4,7 @@
|
| /* */
|
| /* A new `perfect' anti-aliasing renderer (body). */
|
| /* */
|
| -/* Copyright 2000-2003, 2005-2014 by */
|
| +/* Copyright 2000-2015 by */
|
| /* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
| /* */
|
| /* This file is part of the FreeType project, and may only be used, */
|
| @@ -24,8 +24,8 @@
|
| /* */
|
| /* - copy `src/smooth/ftgrays.c' (this file) to your current directory */
|
| /* */
|
| - /* - copy `include/ftimage.h' and `src/smooth/ftgrays.h' to the same */
|
| - /* directory */
|
| + /* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */
|
| + /* same directory */
|
| /* */
|
| /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in */
|
| /* */
|
| @@ -94,6 +94,11 @@
|
| #ifdef _STANDALONE_
|
|
|
|
|
| + /* The size in bytes of the render pool used by the scan-line converter */
|
| + /* to do all of its work. */
|
| +#define FT_RENDER_POOL_SIZE 16384L
|
| +
|
| +
|
| /* Auxiliary macros for token concatenation. */
|
| #define FT_ERR_XCAT( x, y ) x ## y
|
| #define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y )
|
| @@ -101,6 +106,21 @@
|
| #define FT_BEGIN_STMNT do {
|
| #define FT_END_STMNT } while ( 0 )
|
|
|
| +#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) )
|
| +#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) )
|
| +
|
| +
|
| + /*
|
| + * Approximate sqrt(x*x+y*y) using the `alpha max plus beta min'
|
| + * algorithm. We use alpha = 1, beta = 3/8, giving us results with a
|
| + * largest error less than 7% compared to the exact value.
|
| + */
|
| +#define FT_HYPOT( x, y ) \
|
| + ( x = FT_ABS( x ), \
|
| + y = FT_ABS( y ), \
|
| + x > y ? x + ( 3 * y >> 3 ) \
|
| + : y + ( 3 * x >> 3 ) )
|
| +
|
|
|
| /* define this to dump debugging information */
|
| /* #define FT_DEBUG_LEVEL_TRACE */
|
| @@ -297,7 +317,6 @@ typedef ptrdiff_t FT_PtrDist;
|
| #undef SCALED
|
|
|
| #define ONE_PIXEL ( 1L << PIXEL_BITS )
|
| -#define PIXEL_MASK ( -1L << PIXEL_BITS )
|
| #define TRUNC( x ) ( (TCoord)( (x) >> PIXEL_BITS ) )
|
| #define SUBPIXELS( x ) ( (TPos)(x) << PIXEL_BITS )
|
| #define FLOOR( x ) ( (x) & -ONE_PIXEL )
|
| @@ -405,6 +424,8 @@ typedef ptrdiff_t FT_PtrDist;
|
|
|
| typedef struct gray_TWorker_
|
| {
|
| + ft_jmp_buf jump_buffer;
|
| +
|
| TCoord ex, ey;
|
| TPos min_ex, max_ex;
|
| TPos min_ey, max_ey;
|
| @@ -418,11 +439,8 @@ typedef ptrdiff_t FT_PtrDist;
|
| FT_PtrDist max_cells;
|
| FT_PtrDist num_cells;
|
|
|
| - TCoord cx, cy;
|
| TPos x, y;
|
|
|
| - TPos last_ey;
|
| -
|
| FT_Vector bez_stack[32 * 3 + 1];
|
| int lev_stack[32];
|
|
|
| @@ -440,8 +458,6 @@ typedef ptrdiff_t FT_PtrDist;
|
| int band_size;
|
| int band_shoot;
|
|
|
| - ft_jmp_buf jump_buffer;
|
| -
|
| void* buffer;
|
| long buffer_size;
|
|
|
| @@ -464,11 +480,7 @@ typedef ptrdiff_t FT_PtrDist;
|
|
|
| typedef struct gray_TRaster_
|
| {
|
| - void* buffer;
|
| - long buffer_size;
|
| - int band_size;
|
| void* memory;
|
| - gray_PWorker worker;
|
|
|
| } gray_TRaster, *gray_PRaster;
|
|
|
| @@ -480,7 +492,7 @@ typedef ptrdiff_t FT_PtrDist;
|
| /* */
|
| static void
|
| gray_init_cells( RAS_ARG_ void* buffer,
|
| - long byte_size )
|
| + long byte_size )
|
| {
|
| ras.buffer = buffer;
|
| ras.buffer_size = byte_size;
|
| @@ -638,8 +650,8 @@ typedef ptrdiff_t FT_PtrDist;
|
| ras.ey = ey;
|
| }
|
|
|
| - ras.invalid = ( (unsigned)ey >= (unsigned)ras.count_ey ||
|
| - ex >= ras.count_ex );
|
| + ras.invalid = ( (unsigned int)ey >= (unsigned int)ras.count_ey ||
|
| + ex >= ras.count_ex );
|
| }
|
|
|
|
|
| @@ -661,7 +673,6 @@ typedef ptrdiff_t FT_PtrDist;
|
| ras.cover = 0;
|
| ras.ex = ex - ras.min_ex;
|
| ras.ey = ey - ras.min_ey;
|
| - ras.last_ey = SUBPIXELS( ey );
|
| ras.invalid = 0;
|
|
|
| gray_set_cell( RAS_VAR_ ex, ey );
|
| @@ -742,7 +753,7 @@ typedef ptrdiff_t FT_PtrDist;
|
|
|
| mod -= (int)dx;
|
|
|
| - while ( ex1 != ex2 )
|
| + do
|
| {
|
| delta = lift;
|
| mod += rem;
|
| @@ -757,7 +768,7 @@ typedef ptrdiff_t FT_PtrDist;
|
| y1 += delta;
|
| ex1 += incr;
|
| gray_set_cell( RAS_VAR_ ex1, ey );
|
| - }
|
| + } while ( ex1 != ex2 );
|
| }
|
|
|
| delta = y2 - y1;
|
| @@ -780,29 +791,18 @@ typedef ptrdiff_t FT_PtrDist;
|
| int delta, rem, lift, incr;
|
|
|
|
|
| - ey1 = TRUNC( ras.last_ey );
|
| + ey1 = TRUNC( ras.y );
|
| ey2 = TRUNC( to_y ); /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */
|
| - fy1 = (TCoord)( ras.y - ras.last_ey );
|
| + fy1 = (TCoord)( ras.y - SUBPIXELS( ey1 ) );
|
| fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) );
|
|
|
| dx = to_x - ras.x;
|
| dy = to_y - ras.y;
|
|
|
| /* perform vertical clipping */
|
| - {
|
| - TCoord min, max;
|
| -
|
| -
|
| - min = ey1;
|
| - max = ey2;
|
| - if ( ey1 > ey2 )
|
| - {
|
| - min = ey2;
|
| - max = ey1;
|
| - }
|
| - if ( min >= ras.max_ey || max < ras.min_ey )
|
| - goto End;
|
| - }
|
| + if ( ( ey1 >= ras.max_ey && ey2 >= ras.max_ey ) ||
|
| + ( ey1 < ras.min_ey && ey2 < ras.min_ey ) )
|
| + goto End;
|
|
|
| /* everything is on a single scanline */
|
| if ( ey1 == ey2 )
|
| @@ -880,7 +880,7 @@ typedef ptrdiff_t FT_PtrDist;
|
| FT_DIV_MOD( int, p, dy, lift, rem );
|
| mod -= (int)dy;
|
|
|
| - while ( ey1 != ey2 )
|
| + do
|
| {
|
| delta = lift;
|
| mod += rem;
|
| @@ -898,7 +898,7 @@ typedef ptrdiff_t FT_PtrDist;
|
|
|
| ey1 += incr;
|
| gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
|
| - }
|
| + } while ( ey1 != ey2 );
|
| }
|
|
|
| gray_render_scanline( RAS_VAR_ ey1, x,
|
| @@ -908,7 +908,6 @@ typedef ptrdiff_t FT_PtrDist;
|
| End:
|
| ras.x = to_x;
|
| ras.y = to_y;
|
| - ras.last_ey = SUBPIXELS( ey2 );
|
| }
|
|
|
|
|
| @@ -1212,7 +1211,7 @@ typedef ptrdiff_t FT_PtrDist;
|
| /* first of all, compute the scanline offset */
|
| p = (unsigned char*)map->buffer - y * map->pitch;
|
| if ( map->pitch >= 0 )
|
| - p += (unsigned)( ( map->rows - 1 ) * map->pitch );
|
| + p += ( map->rows - 1 ) * (unsigned int)map->pitch;
|
|
|
| for ( ; count > 0; count--, spans++ )
|
| {
|
| @@ -1744,14 +1743,17 @@ typedef ptrdiff_t FT_PtrDist;
|
|
|
| } gray_TBand;
|
|
|
| - FT_DEFINE_OUTLINE_FUNCS(func_interface,
|
| - (FT_Outline_MoveTo_Func) gray_move_to,
|
| - (FT_Outline_LineTo_Func) gray_line_to,
|
| - (FT_Outline_ConicTo_Func)gray_conic_to,
|
| - (FT_Outline_CubicTo_Func)gray_cubic_to,
|
| - 0,
|
| - 0
|
| - )
|
| +
|
| + FT_DEFINE_OUTLINE_FUNCS(
|
| + func_interface,
|
| +
|
| + (FT_Outline_MoveTo_Func) gray_move_to,
|
| + (FT_Outline_LineTo_Func) gray_line_to,
|
| + (FT_Outline_ConicTo_Func)gray_conic_to,
|
| + (FT_Outline_CubicTo_Func)gray_cubic_to,
|
| + 0,
|
| + 0 )
|
| +
|
|
|
| static int
|
| gray_convert_glyph_inner( RAS_ARG )
|
| @@ -1828,7 +1830,7 @@ typedef ptrdiff_t FT_PtrDist;
|
| bands[0].max = max;
|
| band = bands;
|
|
|
| - while ( band >= bands )
|
| + do
|
| {
|
| TPos bottom, top, middle;
|
| int error;
|
| @@ -1842,13 +1844,13 @@ typedef ptrdiff_t FT_PtrDist;
|
| ras.ycells = (PCell*)ras.buffer;
|
| ras.ycount = band->max - band->min;
|
|
|
| - cell_start = sizeof ( PCell ) * ras.ycount;
|
| - cell_mod = cell_start % sizeof ( TCell );
|
| + cell_start = (long)sizeof ( PCell ) * ras.ycount;
|
| + cell_mod = cell_start % (long)sizeof ( TCell );
|
| if ( cell_mod > 0 )
|
| - cell_start += sizeof ( TCell ) - cell_mod;
|
| + cell_start += (long)sizeof ( TCell ) - cell_mod;
|
|
|
| cell_end = ras.buffer_size;
|
| - cell_end -= cell_end % sizeof ( TCell );
|
| + cell_end -= cell_end % (long)sizeof ( TCell );
|
|
|
| cells_max = (PCell)( (char*)ras.buffer + cell_end );
|
| ras.cells = (PCell)( (char*)ras.buffer + cell_start );
|
| @@ -1904,7 +1906,7 @@ typedef ptrdiff_t FT_PtrDist;
|
| band[0].min = middle;
|
| band[0].max = top;
|
| band++;
|
| - }
|
| + } while ( band >= bands );
|
| }
|
|
|
| if ( ras.band_shoot > 8 && ras.band_size > 16 )
|
| @@ -1918,12 +1920,18 @@ typedef ptrdiff_t FT_PtrDist;
|
| gray_raster_render( gray_PRaster raster,
|
| const FT_Raster_Params* params )
|
| {
|
| - const FT_Outline* outline = (const FT_Outline*)params->source;
|
| - const FT_Bitmap* target_map = params->target;
|
| - gray_PWorker worker;
|
| + const FT_Outline* outline = (const FT_Outline*)params->source;
|
| + const FT_Bitmap* target_map = params->target;
|
|
|
| + gray_TWorker worker[1];
|
|
|
| - if ( !raster || !raster->buffer || !raster->buffer_size )
|
| + TCell buffer[FT_MAX( FT_RENDER_POOL_SIZE, 2048 ) / sizeof ( TCell )];
|
| + long buffer_size = sizeof ( buffer );
|
| + int band_size = (int)( buffer_size /
|
| + (long)( sizeof ( TCell ) * 8 ) );
|
| +
|
| +
|
| + if ( !raster )
|
| return FT_THROW( Invalid_Argument );
|
|
|
| if ( !outline )
|
| @@ -1940,8 +1948,6 @@ typedef ptrdiff_t FT_PtrDist;
|
| outline->contours[outline->n_contours - 1] + 1 )
|
| return FT_THROW( Invalid_Outline );
|
|
|
| - worker = raster->worker;
|
| -
|
| /* if direct mode is not set, we must have a target bitmap */
|
| if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )
|
| {
|
| @@ -1966,8 +1972,8 @@ typedef ptrdiff_t FT_PtrDist;
|
| /* compute clip box from target pixmap */
|
| ras.clip_box.xMin = 0;
|
| ras.clip_box.yMin = 0;
|
| - ras.clip_box.xMax = target_map->width;
|
| - ras.clip_box.yMax = target_map->rows;
|
| + ras.clip_box.xMax = (FT_Pos)target_map->width;
|
| + ras.clip_box.yMax = (FT_Pos)target_map->rows;
|
| }
|
| else if ( params->flags & FT_RASTER_FLAG_CLIP )
|
| ras.clip_box = params->clip_box;
|
| @@ -1979,13 +1985,14 @@ typedef ptrdiff_t FT_PtrDist;
|
| ras.clip_box.yMax = 32767L;
|
| }
|
|
|
| - gray_init_cells( RAS_VAR_ raster->buffer, raster->buffer_size );
|
| + gray_init_cells( RAS_VAR_ buffer, buffer_size );
|
|
|
| ras.outline = *outline;
|
| ras.num_cells = 0;
|
| ras.invalid = 1;
|
| - ras.band_size = raster->band_size;
|
| + ras.band_size = band_size;
|
| ras.num_gray_spans = 0;
|
| + ras.span_y = 0;
|
|
|
| if ( params->flags & FT_RASTER_FLAG_DIRECT )
|
| {
|
| @@ -2069,34 +2076,9 @@ typedef ptrdiff_t FT_PtrDist;
|
| char* pool_base,
|
| long pool_size )
|
| {
|
| - gray_PRaster rast = (gray_PRaster)raster;
|
| -
|
| -
|
| - if ( raster )
|
| - {
|
| - if ( pool_base && pool_size >= (long)sizeof ( gray_TWorker ) + 2048 )
|
| - {
|
| - gray_PWorker worker = (gray_PWorker)pool_base;
|
| -
|
| -
|
| - rast->worker = worker;
|
| - rast->buffer = pool_base +
|
| - ( ( sizeof ( gray_TWorker ) +
|
| - sizeof ( TCell ) - 1 ) &
|
| - ~( sizeof ( TCell ) - 1 ) );
|
| - rast->buffer_size = (long)( ( pool_base + pool_size ) -
|
| - (char*)rast->buffer ) &
|
| - ~( sizeof ( TCell ) - 1 );
|
| - rast->band_size = (int)( rast->buffer_size /
|
| - ( sizeof ( TCell ) * 8 ) );
|
| - }
|
| - else
|
| - {
|
| - rast->buffer = NULL;
|
| - rast->buffer_size = 0;
|
| - rast->worker = NULL;
|
| - }
|
| - }
|
| + FT_UNUSED( raster );
|
| + FT_UNUSED( pool_base );
|
| + FT_UNUSED( pool_size );
|
| }
|
|
|
|
|
| @@ -2114,15 +2096,16 @@ typedef ptrdiff_t FT_PtrDist;
|
| }
|
|
|
|
|
| - FT_DEFINE_RASTER_FUNCS(ft_grays_raster,
|
| + FT_DEFINE_RASTER_FUNCS(
|
| + ft_grays_raster,
|
| +
|
| FT_GLYPH_FORMAT_OUTLINE,
|
|
|
| (FT_Raster_New_Func) gray_raster_new,
|
| (FT_Raster_Reset_Func) gray_raster_reset,
|
| (FT_Raster_Set_Mode_Func)gray_raster_set_mode,
|
| (FT_Raster_Render_Func) gray_raster_render,
|
| - (FT_Raster_Done_Func) gray_raster_done
|
| - )
|
| + (FT_Raster_Done_Func) gray_raster_done )
|
|
|
|
|
| /* END */
|
|
|