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 */ |