diff options
author | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2016-12-30 23:22:05 +0000 |
---|---|---|
committer | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2016-12-30 23:22:05 +0000 |
commit | c1c7df45902c28d68a07508d11224cef86edcb0d (patch) | |
tree | f00af2d1129c70381279ba7db2c699ede0738f51 /Build/source/libs/freetype2/freetype-src/src/smooth/ftgrays.c | |
parent | 770c1f2b994c43dfec555e1411995aa3700d406d (diff) |
freetype2 2.7.1
git-svn-id: svn://tug.org/texlive/trunk@42811 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/libs/freetype2/freetype-src/src/smooth/ftgrays.c')
-rw-r--r-- | Build/source/libs/freetype2/freetype-src/src/smooth/ftgrays.c | 114 |
1 files changed, 48 insertions, 66 deletions
diff --git a/Build/source/libs/freetype2/freetype-src/src/smooth/ftgrays.c b/Build/source/libs/freetype2/freetype-src/src/smooth/ftgrays.c index 59fafdb4def..ba42c9ca968 100644 --- a/Build/source/libs/freetype2/freetype-src/src/smooth/ftgrays.c +++ b/Build/source/libs/freetype2/freetype-src/src/smooth/ftgrays.c @@ -286,6 +286,10 @@ typedef ptrdiff_t FT_PtrDist; #define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) #endif +#ifndef FT_ZERO +#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) +#endif + /* as usual, for the speed hungry :-) */ #undef RAS_ARG @@ -371,8 +375,9 @@ typedef ptrdiff_t FT_PtrDist; /* These macros speed up repetitive divisions by replacing them */ /* with multiplications and right shifts. */ -#define FT_UDIVPREP( b ) \ - long b ## _r = (long)( FT_ULONG_MAX >> PIXEL_BITS ) / ( b ) +#define FT_UDIVPREP( c, b ) \ + long b ## _r = c ? (long)( FT_ULONG_MAX >> PIXEL_BITS ) / ( b ) \ + : 0 #define FT_UDIV( a, b ) \ ( ( (unsigned long)( a ) * (unsigned long)( b ## _r ) ) >> \ ( sizeof( long ) * FT_CHAR_BIT - PIXEL_BITS ) ) @@ -438,6 +443,7 @@ typedef ptrdiff_t FT_PtrDist; TCoord cover; int invalid; + PCell* ycells; PCell cells; FT_PtrDist max_cells; FT_PtrDist num_cells; @@ -450,8 +456,6 @@ typedef ptrdiff_t FT_PtrDist; FT_Raster_Span_Func render_span; void* render_span_data; - PCell* ycells; - } gray_TWorker, *gray_PWorker; #if defined( _MSC_VER ) @@ -504,25 +508,22 @@ typedef ptrdiff_t FT_PtrDist; /* */ /* Record the current cell in the table. */ /* */ - static PCell - gray_find_cell( RAS_ARG ) + static void + gray_record_cell( RAS_ARG ) { PCell *pcell, cell; TCoord x = ras.ex; - if ( x > ras.max_ex ) - x = ras.max_ex; - pcell = &ras.ycells[ras.ey - ras.min_ey]; for (;;) { cell = *pcell; - if ( cell == NULL || cell->x > x ) + if ( !cell || cell->x > x ) break; if ( cell->x == x ) - goto Exit; + goto Found; pcell = &cell->next; } @@ -530,30 +531,21 @@ typedef ptrdiff_t FT_PtrDist; if ( ras.num_cells >= ras.max_cells ) ft_longjmp( ras.jump_buffer, 1 ); + /* insert new cell */ cell = ras.cells + ras.num_cells++; cell->x = x; - cell->area = 0; - cell->cover = 0; + cell->area = ras.area; + cell->cover = ras.cover; cell->next = *pcell; *pcell = cell; - Exit: - return cell; - } - + return; - static void - gray_record_cell( RAS_ARG ) - { - if ( ras.area | ras.cover ) - { - PCell cell = gray_find_cell( RAS_VAR ); - - - cell->area += ras.area; - cell->cover += ras.cover; - } + Found: + /* update old cell */ + cell->area += ras.area; + cell->cover += ras.cover; } @@ -577,24 +569,18 @@ typedef ptrdiff_t FT_PtrDist; /* All cells that are on the left of the clipping region go to the */ /* min_ex - 1 horizontal position. */ - if ( ex > ras.max_ex ) - ex = ras.max_ex; if ( ex < ras.min_ex ) ex = ras.min_ex - 1; - /* are we moving to a different cell ? */ - if ( ex != ras.ex || ey != ras.ey ) - { - /* record the current one if it is valid */ - if ( !ras.invalid ) - gray_record_cell( RAS_VAR ); + /* record the current one if it is valid */ + if ( !ras.invalid ) + gray_record_cell( RAS_VAR ); - ras.area = 0; - ras.cover = 0; - ras.ex = ex; - ras.ey = ey; - } + ras.area = 0; + ras.cover = 0; + ras.ex = ex; + ras.ey = ey; ras.invalid = ( ey >= ras.max_ey || ey < ras.min_ey || ex >= ras.max_ex ); @@ -908,8 +894,8 @@ typedef ptrdiff_t FT_PtrDist; else /* any other line */ { TPos prod = dx * fy1 - dy * fx1; - FT_UDIVPREP( dx ); - FT_UDIVPREP( dy ); + FT_UDIVPREP( ex1 != ex2, dx ); + FT_UDIVPREP( ey1 != ey2, dy ); /* The fundamental value `prod' determines which side and the */ @@ -1316,9 +1302,6 @@ typedef ptrdiff_t FT_PtrDist; int y; - if ( ras.num_cells == 0 ) - return; - FT_TRACE7(( "gray_sweep: start\n" )); for ( y = ras.min_ey; y < ras.max_ey; y++ ) @@ -1718,12 +1701,14 @@ typedef ptrdiff_t FT_PtrDist; 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_Outline_MoveTo_Func) gray_move_to, /* move_to */ + (FT_Outline_LineTo_Func) gray_line_to, /* line_to */ + (FT_Outline_ConicTo_Func)gray_conic_to, /* conic_to */ + (FT_Outline_CubicTo_Func)gray_cubic_to, /* cubic_to */ + + 0, /* shift */ + 0 /* delta */ + ) static int @@ -1806,21 +1791,18 @@ typedef ptrdiff_t FT_PtrDist; cell_start = ( ycount * sizeof ( PCell ) + sizeof ( TCell ) - 1 ) / sizeof ( TCell ); - if ( FT_MAX_GRAY_POOL - cell_start < 2 ) - goto ReduceBands; - ras.cells = buffer + cell_start; ras.max_cells = (FT_PtrDist)( FT_MAX_GRAY_POOL - cell_start ); + ras.num_cells = 0; ras.ycells = (PCell*)buffer; while ( ycount ) ras.ycells[--ycount] = NULL; } - ras.num_cells = 0; ras.invalid = 1; ras.min_ey = band[1]; - ras.max_ey = ras.ey = band[0]; + ras.max_ey = band[0]; error = gray_convert_glyph_inner( RAS_VAR ); @@ -1833,7 +1815,6 @@ typedef ptrdiff_t FT_PtrDist; else if ( error != ErrRaster_Memory_Overflow ) return 1; - ReduceBands: /* render pool overflow; we will reduce the render band by half */ width >>= 1; @@ -1859,8 +1840,8 @@ typedef ptrdiff_t FT_PtrDist; gray_raster_render( FT_Raster raster, const FT_Raster_Params* params ) { - const FT_Outline* outline = (const FT_Outline*)params->source; - const FT_Bitmap* target_map = params->target; + const FT_Outline* outline = (const FT_Outline*)params->source; + const FT_Bitmap* target_map = params->target; FT_BBox cbox, clip; #ifndef FT_STATIC_RASTER @@ -1984,7 +1965,7 @@ typedef ptrdiff_t FT_PtrDist; *araster = (FT_Raster)&the_raster; - FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) ); + FT_ZERO( &the_raster ); return 0; } @@ -2060,11 +2041,12 @@ typedef ptrdiff_t FT_PtrDist; 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_New_Func) gray_raster_new, /* raster_new */ + (FT_Raster_Reset_Func) gray_raster_reset, /* raster_reset */ + (FT_Raster_Set_Mode_Func)gray_raster_set_mode, /* raster_set_mode */ + (FT_Raster_Render_Func) gray_raster_render, /* raster_render */ + (FT_Raster_Done_Func) gray_raster_done /* raster_done */ + ) /* END */ |