ref: d66ea312f65ccbbffe1cfe6e4c9b35a7e80f831b
parent: a7b53c47fca0520636b633e3b812ef6313ea1891
author: Werner Lemberg <[email protected]>
date: Thu Jun 1 11:49:28 EDT 2000
FT_Outline_Decompose() now returns FT_Error. Minor bug fixes. More formatting, adding/fixing documentation.
--- a/include/freetype/freetype.h
+++ b/include/freetype/freetype.h
@@ -1911,11 +1911,11 @@
/* the state during the decomposition. */
/* */
/* <Return> */
- /* Error code. 0 means sucess. */
+ /* FreeType error code. 0 means sucess. */
/* */
- FT_EXPORT_DEF(int) FT_Outline_Decompose( FT_Outline* outline,
- FT_Outline_Funcs* funcs,
- void* user );
+ FT_EXPORT_DEF(FT_Error) FT_Outline_Decompose( FT_Outline* outline,
+ FT_Outline_Funcs* funcs,
+ void* user );
/*************************************************************************/
--- a/src/base/ftgrays.c
+++ b/src/base/ftgrays.c
@@ -18,30 +18,27 @@
/*************************************************************************/
/* */
/* This file can be compiled without the rest of the FreeType engine, */
- /* by defining the _STANDALONE_ macro when compiling it. You also need */
- /* to put the files "ftgrays.h" and "ftimage.h" in the current */
- /* compilation directory. Typically, you could do something like: */
+ /* by defining the _STANDALONE_ macro when compiling it. You also need */
+ /* to put the files `ftgrays.h' and `ftimage.h' into the current */
+ /* compilation directory. Typically, you could do something like */
/* */
- /* - copy "src/base/ftgrays.c" to your current directory */
+ /* - copy `src/base/ftgrays.c' to your current directory */
/* */
- /* - copy "include/freetype/ftimage.h" and */
- /* "include/freetype/ftgrays.h" to the same directory */
+ /* - copy `include/freetype/ftimage.h' and */
+ /* `include/freetype/ftgrays.h' to the same directory */
/* */
- /* - compile the "ftgrays" with the _STANDALONE_ macro defined, as in: */
+ /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in */
/* */
- /* cc -c -D_STANDALONE_ ftgrays.c */
+ /* cc -c -D_STANDALONE_ ftgrays.c */
/* */
- /* - the renderer can be initialised with a call to: */
+ /* The renderer can be initialised with a call to */
+ /* `ft_grays_raster.grays_raster_new'; an anti-aliased bitmap can be */
+ /* generated with a call to `ft_grays_raster.grays_raster_render'. */
/* */
- /* ft_grays_raster.init */
+ /* See the comments and documentation in the file `ftimage.h' for */
+ /* more details on how the raster works. */
/* */
- /* - an anti-aliased bitmap can be generated with a call to: */
- /* */
- /* ft_grays_raster.render */
- /* */
- /* See the comments and documentation in the file "ftimage.h" for */
- /* more details on how the raster works.. */
- /* */
+ /*************************************************************************/
/*************************************************************************/
/* */
@@ -92,18 +89,21 @@
#include "ftimage.h"
#include "ftgrays.h"
-/* this macro is used to indicate that a function parameter is unused */
-/* its purpose is simply to reduce compiler warnings. Note also that */
-/* simply defining it as "(void)x" doesn't avoid warnings with certain */
-/* ANSI compilers, like LCC */
-#define UNUSED(x) (x)=(x)
-#else
+ /* This macro is used to indicate that a function parameter is unused. */
+ /* Its purpose is simply to reduce compiler warnings. Note also that */
+ /* simply defining it as `(void)x' doesn't avoid warnings with certain */
+ /* ANSI compilers (e.g. LCC). */
+#define UNUSED( x ) (x) = (x)
+
+#else /* _STANDALONE_ */
+
#include <freetype/ftgrays.h>
-#include <freetype/internal/ftobjs.h> /* for UNUSED() */
+#include <freetype/internal/ftobjs.h> /* for UNUSED() */
#include <freetype/freetype.h> /* to link to FT_Outline_Decompose() */
-#endif
+#endif /* _STANDALONE_ */
+
/* define this to dump debugging information */
#define xxxDEBUG_GRAYS
@@ -325,8 +325,8 @@
/* Set the current cell to a new position. */
/* */
static
- int set_cell( RAS_ARG_ TScan ex,
- TScan ey )
+ int set_cell( RAS_ARG_ TScan ex,
+ TScan ey )
{
int invalid, record, clean;
@@ -1234,7 +1234,7 @@
coverage = -coverage;
while ( coverage >= 512 )
- coverage = 512-coverage;
+ coverage = 512 - coverage;
if ( coverage > 256 )
coverage = 0;
@@ -1369,7 +1369,8 @@
/* draw a gray span until the end of the clipping region */
if ( cover && x < ras.max_ex - ras.min_ex )
grays_hline( RAS_VAR_ x, y,
- cover * ( ONE_PIXEL * 2 ), ras.max_ex - x - ras.min_ex );
+ cover * ( ONE_PIXEL * 2 ),
+ ras.max_ex - x - ras.min_ex );
cover = 0;
}
@@ -1402,39 +1403,63 @@
#ifdef _STANDALONE_
- /************************************************************************
- *
- * The Following function should only compile in stand_alone mode,
- * i.e. when building this component without the rest of FreeType.
- *
- *
- *
- *
- *
- */
- static int FT_Outline_Decompose( FT_Outline* outline,
- FT_Outline_Funcs* interface,
- void* user )
+
+ /*************************************************************************/
+ /* */
+ /* The following function should only compile in stand_alone mode, */
+ /* i.e., when building this component without the rest of FreeType. */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Decompose */
+ /* */
+ /* <Description> */
+ /* Walks over an outline's structure to decompose it into individual */
+ /* segments and Bezier arcs. This function is also able to emit */
+ /* `move to' and `close to' operations to indicate the start and end */
+ /* of new contours in the outline. */
+ /* */
+ /* <Input> */
+ /* outline :: A pointer to the source target. */
+ /* */
+ /* interface :: A table of `emitters', i.e,. function pointers called */
+ /* during decomposition to indicate path operations. */
+ /* */
+ /* user :: A typeless pointer which is passed to each emitter */
+ /* during the decomposition. It can be used to store */
+ /* the state during the decomposition. */
+ /* */
+ /* <Return> */
+ /* Error code. 0 means sucess. */
+ /* */
+ static
+ int FT_Outline_Decompose( FT_Outline* outline,
+ FT_Outline_Funcs* interface,
+ void* user )
{
#undef SCALED
-#define SCALED( x ) ( ((x) << shift) - delta )
+#define SCALED( x ) ( ( (x) << shift ) - delta )
- FT_Vector v_last;
- FT_Vector v_control;
- FT_Vector v_start;
+ FT_Vector v_last;
+ FT_Vector v_control;
+ FT_Vector v_start;
- FT_Vector* point;
- FT_Vector* limit;
- char* tags;
+ FT_Vector* point;
+ FT_Vector* limit;
+ char* tags;
- int n; /* index of contour in outline */
- int first; /* index of first point in contour */
- int error;
- char tag; /* current point's state */
+ int n; /* index of contour in outline */
+ int first; /* index of first point in contour */
+ int error;
+ char tag; /* current point's state */
- int shift = interface->shift;
- FT_Pos delta = interface->delta;
+ int shift = interface->shift;
+ FT_Pos delta = interface->delta;
+
first = 0;
for ( n = 0; n < outline->n_contours; n++ )
@@ -1441,6 +1466,7 @@
{
int last; /* index of last point in contour */
+
last = outline->contours[n];
limit = outline->points + last;
@@ -1447,8 +1473,8 @@
v_start = outline->points[first];
v_last = outline->points[last];
- v_start.x = SCALED(v_start.x); v_start.y = SCALED(v_start.y);
- v_last.x = SCALED(v_last.x); v_last.y = SCALED(v_last.y);
+ v_start.x = SCALED( v_start.x ); v_start.y = SCALED( v_start.y );
+ v_last.x = SCALED( v_last.x ); v_last.y = SCALED( v_last.y );
v_control = v_start;
@@ -1485,100 +1511,108 @@
}
error = interface->move_to( &v_start, user );
- if (error) goto Exit;
+ if ( error )
+ goto Exit;
- while (point < limit)
+ while ( point < limit )
{
point++;
tags++;
tag = FT_CURVE_TAG( tags[0] );
- switch (tag)
+ switch ( tag )
{
- case FT_Curve_Tag_On: /* emit a single line_to */
- {
- FT_Vector vec;
+ case FT_Curve_Tag_On: /* emit a single line_to */
+ {
+ FT_Vector vec;
- vec.x = SCALED(point->x);
- vec.y = SCALED(point->y);
- error = interface->line_to( &vec, user );
- if (error) goto Exit;
- continue;
- }
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+ error = interface->line_to( &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
- case FT_Curve_Tag_Conic: /* consume conic arcs */
+ case FT_Curve_Tag_Conic: /* consume conic arcs */
+ {
+ v_control.x = SCALED( point->x );
+ v_control.y = SCALED( point->y );
+
+ Do_Conic:
+ if ( point < limit )
{
- v_control.x = SCALED(point->x);
- v_control.y = SCALED(point->y);
+ FT_Vector vec;
+ FT_Vector v_middle;
- Do_Conic:
- if (point < limit)
- {
- FT_Vector vec;
- FT_Vector v_middle;
- point++;
- tags++;
- tag = FT_CURVE_TAG( tags[0] );
+ point++;
+ tags++;
+ tag = FT_CURVE_TAG( tags[0] );
- vec.x = SCALED(point->x);
- vec.y = SCALED(point->y);
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
- if (tag == FT_Curve_Tag_On)
- {
- error = interface->conic_to( &v_control, &vec, user );
- if (error) goto Exit;
- continue;
- }
+ if ( tag == FT_Curve_Tag_On )
+ {
+ error = interface->conic_to( &v_control, &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
- if (tag != FT_Curve_Tag_Conic)
- goto Invalid_Outline;
+ if ( tag != FT_Curve_Tag_Conic )
+ goto Invalid_Outline;
- v_middle.x = (v_control.x + vec.x)/2;
- v_middle.y = (v_control.y + vec.y)/2;
+ v_middle.x = ( v_control.x + vec.x ) / 2;
+ v_middle.y = ( v_control.y + vec.y ) / 2;
- error = interface->conic_to( &v_control, &v_middle, user );
- if (error) goto Exit;
+ error = interface->conic_to( &v_control, &v_middle, user );
+ if ( error )
+ goto Exit;
- v_control = vec;
- goto Do_Conic;
- }
-
- error = interface->conic_to( &v_control, &v_start, user );
- goto Close;
+ v_control = vec;
+ goto Do_Conic;
}
- default: /* FT_Curve_Tag_Cubic */
- {
- FT_Vector vec1, vec2;
+ error = interface->conic_to( &v_control, &v_start, user );
+ goto Close;
+ }
- if ( point+1 > limit ||
- FT_CURVE_TAG( tags[1] ) != FT_Curve_Tag_Cubic )
- goto Invalid_Outline;
+ default: /* FT_Curve_Tag_Cubic */
+ {
+ FT_Vector vec1, vec2;
- point += 2;
- tags += 2;
- vec1.x = SCALED(point[-2].x); vec1.y = SCALED(point[-2].y);
- vec2.x = SCALED(point[-1].x); vec2.y = SCALED(point[-1].y);
+ if ( point + 1 > limit ||
+ FT_CURVE_TAG( tags[1] ) != FT_Curve_Tag_Cubic )
+ goto Invalid_Outline;
- if (point <= limit)
- {
- FT_Vector vec;
+ point += 2;
+ tags += 2;
- vec.x = SCALED(point->x);
- vec.y = SCALED(point->y);
+ vec1.x = SCALED( point[-2].x ); vec1.y = SCALED( point[-2].y );
+ vec2.x = SCALED( point[-1].x ); vec2.y = SCALED( point[-1].y );
- error = interface->cubic_to( &vec1, &vec2, &vec, user );
- if (error) goto Exit;
- continue;
- }
+ if ( point <= limit )
+ {
+ FT_Vector vec;
- error = interface->cubic_to( &vec1, &vec2, &v_start, user );
- goto Close;
+
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+
+ error = interface->cubic_to( &vec1, &vec2, &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
}
+
+ error = interface->cubic_to( &vec1, &vec2, &v_start, user );
+ goto Close;
+ }
}
}
@@ -1586,11 +1620,14 @@
error = interface->line_to( &v_start, user );
Close:
- if (error) goto Exit;
- first = last+1;
+ if ( error )
+ goto Exit;
+
+ first = last + 1;
}
return 0;
+
Exit:
return error;
@@ -1597,14 +1634,10 @@
Invalid_Outline:
return -1;
}
+
#endif /* _STANDALONE_ */
-
-
-
-
-
typedef struct TBand_
{
FT_Pos min, max;
@@ -1795,8 +1828,8 @@
}
- /**** RASTER OBJECT CREATION : in standalone mode, we simply use *****/
- /**** a static object .. *****/
+ /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/
+ /**** a static object. *****/
#ifdef _STANDALONE_
@@ -1806,10 +1839,12 @@
{
static TRaster the_raster;
- UNUSED(memory);
+ UNUSED( memory );
+
*araster = (FT_Raster)&the_raster;
- memset( &the_raster, 0, sizeof(the_raster) );
+ memset( &the_raster, 0, sizeof ( the_raster ) );
+
return 0;
}
@@ -1818,7 +1853,7 @@
void grays_raster_done( FT_Raster raster )
{
/* nothing */
- (void)raster;
+ UNUSED( raster );
}
#else /* _STANDALONE_ */
--- a/src/base/ftoutln.c
+++ b/src/base/ftoutln.c
@@ -4,7 +4,7 @@
/* */
/* FreeType outline management (body). */
/* */
-/* Copyright 1996-1999 by */
+/* Copyright 1996-2000 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used */
@@ -30,6 +30,7 @@
static
const FT_Outline null_outline = { 0, 0, 0, 0, 0, 0 };
+
/*************************************************************************/
/* */
/* <Function> */
@@ -52,37 +53,41 @@
/* the state during the decomposition. */
/* */
/* <Return> */
- /* Error code. 0 means sucess. */
+ /* FreeType error code. 0 means sucess. */
/* */
- FT_EXPORT_FUNC(int) FT_Outline_Decompose( FT_Outline* outline,
- FT_Outline_Funcs* interface,
- void* user )
+ FT_EXPORT_FUNC( FT_Error ) FT_Outline_Decompose(
+ FT_Outline* outline,
+ FT_Outline_Funcs* interface,
+ void* user )
{
#undef SCALED
-#define SCALED( x ) ( ((x) << shift) - delta )
+#define SCALED( x ) ( ( (x) << shift ) - delta )
- FT_Vector v_last;
- FT_Vector v_control;
- FT_Vector v_start;
+ FT_Vector v_last;
+ FT_Vector v_control;
+ FT_Vector v_start;
- FT_Vector* point;
- FT_Vector* limit;
- char* tags;
+ FT_Vector* point;
+ FT_Vector* limit;
+ char* tags;
- int n; /* index of contour in outline */
- int first; /* index of first point in contour */
- int error;
- char tag; /* current point's state */
+ FT_Error error;
- int shift = interface->shift;
- FT_Pos delta = interface->delta;
+ FT_Int n; /* index of contour in outline */
+ FT_UInt first; /* index of first point in contour */
+ char tag; /* current point's state */
+ FT_Int shift = interface->shift;
+ FT_Pos delta = interface->delta;
+
+
first = 0;
for ( n = 0; n < outline->n_contours; n++ )
{
- int last; /* index of last point in contour */
+ FT_Int last; /* index of last point in contour */
+
last = outline->contours[n];
limit = outline->points + last;
@@ -89,8 +94,8 @@
v_start = outline->points[first];
v_last = outline->points[last];
- v_start.x = SCALED(v_start.x); v_start.y = SCALED(v_start.y);
- v_last.x = SCALED(v_last.x); v_last.y = SCALED(v_last.y);
+ v_start.x = SCALED( v_start.x ); v_start.y = SCALED( v_start.y );
+ v_last.x = SCALED( v_last.x ); v_last.y = SCALED( v_last.y );
v_control = v_start;
@@ -127,100 +132,108 @@
}
error = interface->move_to( &v_start, user );
- if (error) goto Exit;
+ if ( error )
+ goto Exit;
- while (point < limit)
+ while ( point < limit )
{
point++;
tags++;
tag = FT_CURVE_TAG( tags[0] );
- switch (tag)
+ switch ( tag )
{
- case FT_Curve_Tag_On: /* emit a single line_to */
- {
- FT_Vector vec;
+ case FT_Curve_Tag_On: /* emit a single line_to */
+ {
+ FT_Vector vec;
- vec.x = SCALED(point->x);
- vec.y = SCALED(point->y);
- error = interface->line_to( &vec, user );
- if (error) goto Exit;
- continue;
- }
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+ error = interface->line_to( &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
- case FT_Curve_Tag_Conic: /* consume conic arcs */
+ case FT_Curve_Tag_Conic: /* consume conic arcs */
+ {
+ v_control.x = SCALED( point->x );
+ v_control.y = SCALED( point->y );
+
+ Do_Conic:
+ if ( point < limit )
{
- v_control.x = SCALED(point->x);
- v_control.y = SCALED(point->y);
+ FT_Vector vec;
+ FT_Vector v_middle;
- Do_Conic:
- if (point < limit)
- {
- FT_Vector vec;
- FT_Vector v_middle;
- point++;
- tags++;
- tag = FT_CURVE_TAG( tags[0] );
+ point++;
+ tags++;
+ tag = FT_CURVE_TAG( tags[0] );
- vec.x = SCALED(point->x);
- vec.y = SCALED(point->y);
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
- if (tag == FT_Curve_Tag_On)
- {
- error = interface->conic_to( &v_control, &vec, user );
- if (error) goto Exit;
- continue;
- }
+ if ( tag == FT_Curve_Tag_On )
+ {
+ error = interface->conic_to( &v_control, &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
- if (tag != FT_Curve_Tag_Conic)
- goto Invalid_Outline;
+ if ( tag != FT_Curve_Tag_Conic )
+ goto Invalid_Outline;
- v_middle.x = (v_control.x + vec.x)/2;
- v_middle.y = (v_control.y + vec.y)/2;
+ v_middle.x = ( v_control.x + vec.x ) / 2;
+ v_middle.y = ( v_control.y + vec.y ) / 2;
- error = interface->conic_to( &v_control, &v_middle, user );
- if (error) goto Exit;
+ error = interface->conic_to( &v_control, &v_middle, user );
+ if ( error )
+ goto Exit;
- v_control = vec;
- goto Do_Conic;
- }
-
- error = interface->conic_to( &v_control, &v_start, user );
- goto Close;
+ v_control = vec;
+ goto Do_Conic;
}
- default: /* FT_Curve_Tag_Cubic */
- {
- FT_Vector vec1, vec2;
+ error = interface->conic_to( &v_control, &v_start, user );
+ goto Close;
+ }
- if ( point+1 > limit ||
- FT_CURVE_TAG( tags[1] ) != FT_Curve_Tag_Cubic )
- goto Invalid_Outline;
+ default: /* FT_Curve_Tag_Cubic */
+ {
+ FT_Vector vec1, vec2;
- point += 2;
- tags += 2;
- vec1.x = SCALED(point[-2].x); vec1.y = SCALED(point[-2].y);
- vec2.x = SCALED(point[-1].x); vec2.y = SCALED(point[-1].y);
+ if ( point + 1 > limit ||
+ FT_CURVE_TAG( tags[1] ) != FT_Curve_Tag_Cubic )
+ goto Invalid_Outline;
- if (point <= limit)
- {
- FT_Vector vec;
+ point += 2;
+ tags += 2;
- vec.x = SCALED(point->x);
- vec.y = SCALED(point->y);
+ vec1.x = SCALED( point[-2].x ); vec1.y = SCALED( point[-2].y );
+ vec2.x = SCALED( point[-1].x ); vec2.y = SCALED( point[-1].y );
- error = interface->cubic_to( &vec1, &vec2, &vec, user );
- if (error) goto Exit;
- continue;
- }
+ if ( point <= limit )
+ {
+ FT_Vector vec;
- error = interface->cubic_to( &vec1, &vec2, &v_start, user );
- goto Close;
+
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+
+ error = interface->cubic_to( &vec1, &vec2, &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
}
+
+ error = interface->cubic_to( &vec1, &vec2, &v_start, user );
+ goto Close;
+ }
}
}
@@ -228,18 +241,22 @@
error = interface->line_to( &v_start, user );
Close:
- if (error) goto Exit;
- first = last+1;
+ if ( error )
+ goto Exit;
+
+ first = last + 1;
}
return 0;
+
Exit:
return error;
Invalid_Outline:
- return -1;
+ return FT_Err_Invalid_Outline;
}
+
/*************************************************************************/
/* */
/* <Function> */
@@ -251,12 +268,12 @@
/* <Input> */
/* library :: A handle to the library object from where the */
/* outline is allocated. Note however that the new */
- /* outline will NOT necessarily be FREED when */
+ /* outline will NOT necessarily be FREED, when */
/* destroying the library, by FT_Done_FreeType(). */
/* */
- /* numPoints :: The maximum number of points within the outline. */
+ /* numPoints :: The maximal number of points within the outline. */
/* */
- /* numContours :: The maximum number of contours within the outline. */
+ /* numContours :: The maximal number of contours within the outline. */
/* */
/* <Output> */
/* outline :: A handle to the new outline. NULL in case of */
@@ -270,14 +287,12 @@
/* */
/* <Note> */
/* The reason why this function takes a `library' parameter is simply */
- /* to use the library's memory allocator. You can copy the source */
- /* code of this function, replacing allocations with `malloc()' if */
- /* you want to control where the objects go. */
+ /* to use the library's memory allocator. */
/* */
- BASE_FUNC(FT_Error) FT_Outline_New( FT_Library library,
- FT_UInt numPoints,
- FT_Int numContours,
- FT_Outline* outline )
+ BASE_FUNC( FT_Error ) FT_Outline_New( FT_Library library,
+ FT_UInt numPoints,
+ FT_Int numContours,
+ FT_Outline* outline )
{
FT_Error error;
FT_Memory memory;
@@ -290,13 +305,13 @@
memory = library->memory;
if ( ALLOC_ARRAY( outline->points, numPoints * 2L, FT_Pos ) ||
- ALLOC_ARRAY( outline->tags, numPoints, FT_Byte ) ||
+ ALLOC_ARRAY( outline->tags, numPoints, FT_Byte ) ||
ALLOC_ARRAY( outline->contours, numContours, FT_UShort ) )
goto Fail;
- outline->n_points = (FT_UShort)numPoints;
- outline->n_contours = (FT_Short)numContours;
- outline->flags |= ft_outline_owner;
+ outline->n_points = (FT_UShort)numPoints;
+ outline->n_contours = (FT_Short)numContours;
+ outline->flags |= ft_outline_owner;
return FT_Err_Ok;
@@ -333,15 +348,14 @@
/* descriptor will be released. */
/* */
/* The reason why this function takes an `outline' parameter is */
- /* simply to use FT_Alloc()/FT_Free(). You can copy the source code */
- /* of this function, replacing allocations with `malloc()' in your */
- /* application if you want something simpler. */
+ /* simply to use FT_Free(). */
/* */
- BASE_FUNC(FT_Error) FT_Outline_Done( FT_Library library,
- FT_Outline* outline )
+ BASE_FUNC( FT_Error ) FT_Outline_Done( FT_Library library,
+ FT_Outline* outline )
{
FT_Memory memory = library->memory;
+
if ( outline )
{
if ( outline->flags & ft_outline_owner )
@@ -385,11 +399,12 @@
/* <MT-Note> */
/* Yes. */
/* */
- BASE_FUNC(void) FT_Outline_Get_CBox( FT_Outline* outline,
- FT_BBox* cbox )
+ BASE_FUNC( void ) FT_Outline_Get_CBox( FT_Outline* outline,
+ FT_BBox* cbox )
{
FT_Pos xMin, yMin, xMax, yMax;
+
if ( outline && cbox )
{
if ( outline->n_points == 0 )
@@ -404,6 +419,7 @@
FT_Vector* vec = outline->points;
FT_Vector* limit = vec + outline->n_points;
+
xMin = xMax = vec->x;
yMin = yMax = vec->y;
vec++;
@@ -412,6 +428,7 @@
{
FT_Pos x, y;
+
x = vec->x;
if ( x < xMin ) xMin = x;
if ( x > xMax ) xMax = x;
@@ -440,19 +457,22 @@
/* */
/* <Input> */
/* outline :: A pointer to the target outline descriptor. */
+ /* */
/* xOffset :: The horizontal offset. */
+ /* */
/* yOffset :: The vertical offset. */
/* */
/* <MT-Note> */
/* Yes. */
/* */
- BASE_FUNC(void) FT_Outline_Translate( FT_Outline* outline,
- FT_Pos xOffset,
- FT_Pos yOffset )
+ BASE_FUNC( void ) FT_Outline_Translate( FT_Outline* outline,
+ FT_Pos xOffset,
+ FT_Pos yOffset )
{
FT_UShort n;
FT_Vector* vec = outline->points;
+
for ( n = 0; n < outline->n_points; n++ )
{
vec->x += xOffset;
@@ -461,6 +481,7 @@
}
}
+
/*************************************************************************/
/* */
/* <Function> */
@@ -467,22 +488,24 @@
/* FT_Outline_Reverse */
/* */
/* <Description> */
- /* Reverse the drawing direction of an outline. This is used to */
- /* ensure consistent fill conventions for mirrored glyphs.. */
+ /* Reverses the drawing direction of an outline. This is used to */
+ /* ensure consistent fill conventions for mirrored glyphs. */
/* */
/* <Input> */
/* outline :: A pointer to the target outline descriptor. */
/* */
/* <Note> */
- /* This functions toggles the bit flag ft_outline_reverse_fill in */
- /* the outline's "flags" field.. */
+ /* This functions toggles the bit flag `ft_outline_reverse_fill' in */
+ /* the outline's `flags' field. */
/* */
- BASE_FUNC(void) FT_Outline_Reverse( FT_Outline* outline )
+ BASE_FUNC( void ) FT_Outline_Reverse( FT_Outline* outline )
{
FT_UShort n;
FT_Int first, last;
+
first = 0;
+
for ( n = 0; n < outline->n_contours; n++ )
{
last = outline->contours[n];
@@ -493,7 +516,8 @@
FT_Vector* q = outline->points + last;
FT_Vector swap;
- while (p < q)
+
+ while ( p < q )
{
swap = *p;
*p = *q;
@@ -509,7 +533,7 @@
char* q = outline->tags + last;
char swap;
- while (p < q)
+ while ( p < q )
{
swap = *p;
*p = *q;
@@ -519,11 +543,13 @@
}
}
- first = last+1;
+ first = last + 1;
}
+
outline->flags ^= ft_outline_reverse_fill;
}
+
/*************************************************************************/
/* */
/* <Function> */
@@ -533,12 +559,13 @@
/* Deallocates a glyph zone. */
/* */
/* <Input> */
- /* zone :: pointer to the target glyph zone. */
+ /* zone :: A pointer to the target glyph zone. */
/* */
- BASE_FUNC(void) FT_Done_GlyphZone( FT_GlyphZone* zone )
+ BASE_FUNC( void ) FT_Done_GlyphZone( FT_GlyphZone* zone )
{
FT_Memory memory = zone->memory;
+
FREE( zone->contours );
FREE( zone->tags );
FREE( zone->cur );
@@ -548,6 +575,7 @@
zone->max_contours = zone->n_contours = 0;
}
+
/*************************************************************************/
/* */
/* <Function> */
@@ -569,29 +597,32 @@
/* <Return> */
/* FreeType error code. 0 means success. */
/* */
- BASE_FUNC(FT_Error) FT_New_GlyphZone( FT_Memory memory,
- FT_UShort maxPoints,
- FT_Short maxContours,
- FT_GlyphZone* zone )
+ BASE_FUNC( FT_Error ) FT_New_GlyphZone( FT_Memory memory,
+ FT_UShort maxPoints,
+ FT_Short maxContours,
+ FT_GlyphZone* zone )
{
FT_Error error;
- if (maxPoints > 0)
+
+ if ( maxPoints > 0 )
maxPoints += 2;
- MEM_Set( zone, 0, sizeof(*zone) );
+ MEM_Set( zone, 0, sizeof ( *zone ) );
zone->memory = memory;
- if ( ALLOC_ARRAY( zone->org, maxPoints*2, FT_F26Dot6 ) ||
- ALLOC_ARRAY( zone->cur, maxPoints*2, FT_F26Dot6 ) ||
- ALLOC_ARRAY( zone->tags, maxPoints, FT_Byte ) ||
- ALLOC_ARRAY( zone->contours, maxContours, FT_UShort ) )
+ if ( ALLOC_ARRAY( zone->org, maxPoints * 2, FT_F26Dot6 ) ||
+ ALLOC_ARRAY( zone->cur, maxPoints * 2, FT_F26Dot6 ) ||
+ ALLOC_ARRAY( zone->tags, maxPoints, FT_Byte ) ||
+ ALLOC_ARRAY( zone->contours, maxContours, FT_UShort ) )
{
- FT_Done_GlyphZone(zone);
+ FT_Done_GlyphZone( zone );
}
+
return error;
}
+
/*************************************************************************/
/* */
/* <Function> */
@@ -609,26 +640,25 @@
/* <InOut> */
/* zone :: The address of the target zone. */
/* */
- /* maxPoints :: The address of the zone's current capacity for */
- /* points. */
- /* */
- /* maxContours :: The address of the zone's current capacity for */
- /* contours. */
- /* */
- BASE_FUNC(FT_Error) FT_Update_GlyphZone( FT_GlyphZone* zone,
- FT_UShort newPoints,
- FT_Short newContours )
+ BASE_FUNC( FT_Error ) FT_Update_GlyphZone( FT_GlyphZone* zone,
+ FT_UShort newPoints,
+ FT_Short newContours )
{
FT_Error error = FT_Err_Ok;
FT_Memory memory = zone->memory;
+
newPoints += 2;
+
if ( zone->max_points < newPoints )
{
/* reallocate the points arrays */
- if ( REALLOC_ARRAY( zone->org, zone->max_points*2, newPoints*2, FT_F26Dot6 ) ||
- REALLOC_ARRAY( zone->cur, zone->max_points*2, newPoints*2, FT_F26Dot6 ) ||
- REALLOC_ARRAY( zone->tags, zone->max_points*2, newPoints, FT_Byte ) )
+ if ( REALLOC_ARRAY( zone->org, zone->max_points * 2,
+ newPoints * 2, FT_F26Dot6 ) ||
+ REALLOC_ARRAY( zone->cur, zone->max_points * 2,
+ newPoints * 2, FT_F26Dot6 ) ||
+ REALLOC_ARRAY( zone->tags, zone->max_points * 2,
+ newPoints, FT_Byte ) )
goto Exit;
zone->max_points = newPoints;
@@ -637,15 +667,18 @@
if ( zone->max_contours < newContours )
{
/* reallocate the contours array */
- if ( REALLOC_ARRAY( zone->contours, zone->max_contours, newContours, FT_UShort ) )
+ if ( REALLOC_ARRAY( zone->contours, zone->max_contours,
+ newContours, FT_UShort ) )
goto Exit;
zone->max_contours = newContours;
}
+
Exit:
return error;
}
+
/*************************************************************************/
/* */
/* <Function> */
@@ -653,12 +686,13 @@
/* */
/* <Description> */
/* Renders an outline within a bitmap. The outline's image is simply */
- /* or-ed to the target bitmap. */
+ /* OR-ed to the target bitmap. */
/* */
- /* */
/* <Input> */
/* library :: A handle to a FreeType library object. */
+ /* */
/* outline :: A pointer to the source outline descriptor. */
+ /* */
/* map :: A pointer to the target bitmap descriptor. */
/* */
/* <Return> */
@@ -674,9 +708,9 @@
/* */
/* It will use the raster correponding to the default glyph format. */
/* */
- FT_EXPORT_FUNC(FT_Error) FT_Outline_Get_Bitmap( FT_Library library,
- FT_Outline* outline,
- FT_Bitmap* bitmap )
+ FT_EXPORT_FUNC( FT_Error ) FT_Outline_Get_Bitmap( FT_Library library,
+ FT_Outline* outline,
+ FT_Bitmap* bitmap )
{
FT_Error error;
FT_Raster raster;
@@ -683,21 +717,26 @@
FT_Raster_Funcs funcs;
FT_Raster_Params params;
+
error = FT_Err_Invalid_Glyph_Format;
raster = FT_Get_Raster( library, ft_glyph_format_outline, &funcs );
- if (!raster) goto Exit;
+ if ( !raster )
+ goto Exit;
params.target = bitmap;
params.source = outline;
params.flags = 0;
- if (bitmap->pixel_mode == ft_pixel_mode_grays)
+
+ if ( bitmap->pixel_mode == ft_pixel_mode_grays )
params.flags |= ft_raster_flag_aa;
error = funcs.raster_render( raster, ¶ms );
+
Exit:
return error;
}
+
/*************************************************************************/
/* */
/* <Function> */
@@ -704,15 +743,17 @@
/* FT_Outline_Render */
/* */
/* <Description> */
- /* Renders an outline within a bitmap using the current scan-convert */
+ /* Renders an outline within a bitmap using the current scan-convert. */
/* This functions uses a FT_Raster_Params as argument, allowing */
- /* advanced features like direct composition/translucency, etc.. */
+ /* advanced features like direct composition/translucency, etc. */
/* */
/* <Input> */
/* library :: A handle to a FreeType library object. */
+ /* */
/* outline :: A pointer to the source outline descriptor. */
+ /* */
/* params :: A pointer to a FT_Raster_Params used to describe */
- /* the rendering operation */
+ /* the rendering operation. */
/* */
/* <Return> */
/* FreeType error code. 0 means success. */
@@ -725,24 +766,27 @@
/* You should know what you're doing and the role of FT_Raster_Params */
/* to use this function. */
/* */
- /* the field "params.source" will be set to "outline" before the */
- /* scan converter is called, which means that the value you give it */
- /* is actually ignored.. */
+ /* The field `params.source' will be set to `outline' before the scan */
+ /* converter is called, which means that the value you give to it is */
+ /* actually ignored. */
/* */
- FT_EXPORT_FUNC(FT_Error) FT_Outline_Render( FT_Library library,
- FT_Outline* outline,
- FT_Raster_Params* params )
+ FT_EXPORT_FUNC( FT_Error ) FT_Outline_Render( FT_Library library,
+ FT_Outline* outline,
+ FT_Raster_Params* params )
{
FT_Error error;
FT_Raster raster;
FT_Raster_Funcs funcs;
+
error = FT_Err_Invalid_Glyph_Format;
raster = FT_Get_Raster( library, ft_glyph_format_outline, &funcs );
- if (!raster) goto Exit;
+ if ( !raster )
+ goto Exit;
params->source = (void*)outline;
error = funcs.raster_render( raster, params );
+
Exit:
return error;
}
@@ -759,6 +803,7 @@
/* */
/* <Input> */
/* outline :: A pointer to the target outline descriptor. */
+ /* */
/* matrix :: A pointer to the transformation matrix. */
/* */
/* <MT-Note> */
@@ -768,17 +813,19 @@
/* You can use FT_Outline_Translate() if you need to translate the */
/* outline's points. */
/* */
- BASE_FUNC(void) FT_Outline_Transform( FT_Outline* outline,
- FT_Matrix* matrix )
+ BASE_FUNC( void ) FT_Outline_Transform( FT_Outline* outline,
+ FT_Matrix* matrix )
{
FT_UShort n;
FT_Vector* vec;
+
vec = outline->points;
for ( n = 0; n < outline->n_points; n++ )
{
FT_Pos x, y;
+
x = FT_MulFix( vec->x, matrix->xx ) +
FT_MulFix( vec->y, matrix->xy );
@@ -792,25 +839,25 @@
}
-
-
-
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
/**** ****/
/**** The following functions are not used by the font drivers ****/
- /**** but they are provided as a convenience for client apps. ****/
+ /**** but they are provided as a convenience for client ****/
+ /**** applications. ****/
/**** ****/
/**** Note that they will not be compiled if the configuration ****/
- /**** macro FT_CONFIG_OPTION_NO_CONVENIENCE_FUNCS is defined ****/
+ /**** macro FT_CONFIG_OPTION_NO_CONVENIENCE_FUNCS is defined. ****/
/**** ****/
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
+
#ifndef FT_CONFIG_OPTION_NO_CONVENIENCE_FUNCS
+
/*************************************************************************/
/* */
/* <Function> */
@@ -823,16 +870,19 @@
/* */
/* <Input> */
/* source :: A handle to the source outline. */
+ /* */
+ /* <Output> */
/* target :: A handle to the target outline. */
/* */
/* <Return> */
/* FreeType error code. 0 means success. */
/* */
- BASE_FUNC(FT_Error) FT_Outline_Copy( FT_Outline* source,
- FT_Outline* target )
+ BASE_FUNC( FT_Error ) FT_Outline_Copy( FT_Outline* source,
+ FT_Outline* target )
{
FT_Int is_owner;
+
if ( !source || !target ||
source->n_points != target->n_points ||
source->n_contours != target->n_contours )
@@ -847,12 +897,13 @@
MEM_Copy( target->contours, source->contours,
source->n_contours * sizeof ( FT_Short ) );
- /* copy all flags, except the "ft_outline_owner" one */
- is_owner = target->flags & ft_outline_owner;
+ /* copy all flags, except the `ft_outline_owner' one */
+ is_owner = target->flags & ft_outline_owner;
target->flags = source->flags;
target->flags &= ~ft_outline_owner;
target->flags |= is_owner;
+
return FT_Err_Ok;
}
@@ -866,7 +917,7 @@
/* Transforms a single vector through a 2x2 matrix. */
/* */
/* <InOut> */
- /* vector :: The target vector to transform */
+ /* vector :: The target vector to transform. */
/* */
/* <Input> */
/* matrix :: A pointer to the source 2x2 matrix. */
@@ -874,11 +925,12 @@
/* <MT-Note> */
/* Yes. */
/* */
- FT_EXPORT_FUNC(void) FT_Vector_Transform( FT_Vector* vector,
- FT_Matrix* matrix )
+ FT_EXPORT_FUNC( void ) FT_Vector_Transform( FT_Vector* vector,
+ FT_Matrix* matrix )
{
FT_Pos xz, yz;
+
xz = FT_MulFix( vector->x, matrix->xx ) +
FT_MulFix( vector->y, matrix->xy );
@@ -907,8 +959,8 @@
/* <MT-Note> */
/* Yes. */
/* */
- BASE_FUNC(void) FT_Matrix_Multiply( FT_Matrix* a,
- FT_Matrix* b )
+ BASE_FUNC( void ) FT_Matrix_Multiply( FT_Matrix* a,
+ FT_Matrix* b )
{
FT_Fixed xx, xy, yx, yy;
@@ -941,7 +993,7 @@
/* <MT-Note> */
/* Yes. */
/* */
- BASE_FUNC(FT_Error) FT_Matrix_Invert( FT_Matrix* matrix )
+ BASE_FUNC( FT_Error ) FT_Matrix_Invert( FT_Matrix* matrix )
{
FT_Pos delta, xx, yy;
@@ -965,6 +1017,7 @@
return FT_Err_Ok;
}
-#endif
+#endif /* FT_CONFIG_OPTION_NO_CONVENIENCE_FUNCS */
+
/* END */
--- a/src/base/ftraster.c
+++ b/src/base/ftraster.c
@@ -1,34 +1,36 @@
-/*******************************************************************
- *
- * ftraster.c 1.5
- *
- * The FreeType glyph rasterizer (body).
- *
- * Copyright 1996-2000 by
- * David Turner, Robert Wilhelm, and Werner Lemberg.
- *
- * This file is part of the FreeType project, and may only be used
- * modified and distributed under the terms of the FreeType project
- * license, LICENSE.TXT. By continuing to use, modify, or distribute
- * this file you indicate that you have read the license and
- * understand and accept it fully.
- *
- *
- * This is a rewrite of the FreeType 1.x scan-line converter
- *
- *
- *
- ******************************************************************/
+/***************************************************************************/
+/* */
+/* ftraster.c */
+/* */
+/* The FreeType glyph rasterizer (body). */
+/* */
+/* Copyright 1996-2000 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used */
+/* modified and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* This is a rewrite of the FreeType 1.x scan-line converter */
+ /* */
+ /*************************************************************************/
+
+
#include <freetype/ftraster.h>
-#include <freetype/internal/ftcalc.h> /* for FT_MulDiv only */
+#include <freetype/internal/ftcalc.h> /* for FT_MulDiv() only */
+
/*************************************************************************/
/* */
/* A simple technical note on how the raster works: */
/* */
- /* Converting an outline into a bitmap is achieved in several steps */
- /* which are: */
+ /* Converting an outline into a bitmap is achieved in several steps: */
/* */
/* 1 - Decomposing the outline into successive `profiles'. Each */
/* profile is simply an array of scanline intersections on a given */
@@ -39,12 +41,12 @@
/* o an array of intersection coordinates for each scanline */
/* between `Ymin' and `Ymax'. */
/* */
- /* o a direction, indicating wether is was built going `up' or */
+ /* o a direction, indicating whether it was built going `up' or */
/* `down', as this is very important for filling rules. */
/* */
/* 2 - Sweeping the target map's scanlines in order to compute segment */
- /* `spans' which are then filled. Additionaly, this pass performs */
- /* drop-out control. */
+ /* `spans' which are then filled. Additionally, this pass */
+ /* performs drop-out control. */
/* */
/* The outline data is parsed during step 1 only. The profiles are */
/* built from the bottom of the render pool, used as a stack. The */
@@ -92,42 +94,43 @@
/* */
/*************************************************************************/
- /****************************************************************/
- /****************************************************************/
- /** **/
- /** CONFIGURATION MACROS **/
- /** **/
- /****************************************************************/
- /****************************************************************/
-/* define DEBUG_RASTER if you want to compile a debugging version */
+ /*************************************************************************/
+ /*************************************************************************/
+ /** **/
+ /** CONFIGURATION MACROS **/
+ /** **/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* define DEBUG_RASTER if you want to compile a debugging version */
#define xxxDEBUG_RASTER
-/* The default render pool size in bytes */
-#define RASTER_RENDER_POOL 8192
+ /* The default render pool size in bytes */
+#define RASTER_RENDER_POOL 8192
-/* undefine FT_RASTER_OPTION_ANTI_ALIASING if you do not want to support */
-/* 5-levels anti-aliasing */
+ /* undefine FT_RASTER_OPTION_ANTI_ALIASING if you do not want to support */
+ /* 5-levels anti-aliasing */
#ifdef FT_CONFIG_OPTION_5_GRAY_LEVELS
#define FT_RASTER_OPTION_ANTI_ALIASING
#endif
-/* The size of the two-lines intermediate bitmap used */
-/* for anti-aliasing, in bytes.. */
-#define RASTER_GRAY_LINES 2048
+ /* The size of the two-lines intermediate bitmap used */
+ /* for anti-aliasing, in bytes. */
+#define RASTER_GRAY_LINES 2048
- /****************************************************************/
- /****************************************************************/
- /** **/
- /** OTHER MACROS (do not change) **/
- /** **/
- /****************************************************************/
- /****************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /** **/
+ /** OTHER MACROS (do not change) **/
+ /** **/
+ /*************************************************************************/
+ /*************************************************************************/
/* required by the tracing mode */
#undef FT_COMPONENT
-#define FT_COMPONENT trace_raster
+#define FT_COMPONENT trace_raster
#include <freetype/internal/ftdebug.h>
@@ -139,22 +142,20 @@
#define Raster_Err_Gray_Unsupported -5
#define Raster_Err_Unsupported -6
-/* FMulDiv means "Fast MulDiv", it is used in case where 'b' is typically */
-/* a small value and the result of (a*b) is known to fit in 32 bits. */
+ /* FMulDiv means `Fast MulDiv', it is used in case where `b' is */
+ /* typically a small value and the result of a*b is known to fit into */
+ /* 32 bits. */
#define FMulDiv( a, b, c ) ( (a) * (b) / (c) )
-/* On the other hand, SMulDiv is for "Slow MulDiv", and is used typically */
-/* for clipping computations. It simply uses the FT_MulDiv() function */
-/* defined in "ftcalc.h" */
-/* */
-#define SMulDiv FT_MulDiv
+ /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */
+ /* for clipping computations. It simply uses the FT_MulDiv() function */
+ /* defined in `ftcalc.h'. */
+#define SMulDiv FT_MulDiv
+ /* The rasterizer is a very general purpose component; please leave */
+ /* the following redefinitions there (you never know your target */
+ /* environment). */
-
-/* The rasterizer is a very general purpose component, please leave */
-/* the following redefinitions there (you never know your target */
-/* environment). */
-
#ifndef TRUE
#define TRUE 1
#endif
@@ -168,11 +169,11 @@
#endif
#ifndef SUCCESS
-#define SUCCESS 0
+#define SUCCESS 0
#endif
#ifndef FAILURE
-#define FAILURE 1
+#define FAILURE 1
#endif
@@ -182,25 +183,26 @@
#define Pixel_Bits 6 /* fractional bits of *input* coordinates */
- /****************************************************************/
- /****************************************************************/
- /** **/
- /** SIMPLE TYPE DECLARATIONS **/
- /** **/
- /****************************************************************/
- /****************************************************************/
- typedef int Int;
- typedef unsigned int UInt;
- typedef short Short;
- typedef unsigned short UShort, *PUShort;
- typedef long Long, *PLong;
- typedef unsigned long ULong;
+ /*************************************************************************/
+ /*************************************************************************/
+ /** **/
+ /** SIMPLE TYPE DECLARATIONS **/
+ /** **/
+ /*************************************************************************/
+ /*************************************************************************/
- typedef unsigned char Byte, *PByte;
- typedef char Bool;
+ typedef int Int;
+ typedef unsigned int UInt;
+ typedef short Short;
+ typedef unsigned short UShort, *PUShort;
+ typedef long Long, *PLong;
+ typedef unsigned long ULong;
- typedef struct TPoint_
+ typedef unsigned char Byte, *PByte;
+ typedef char Bool;
+
+ typedef struct TPoint_
{
Long x;
Long y;
@@ -208,7 +210,7 @@
} TPoint;
- typedef enum TFlow_
+ typedef enum TFlow_
{
Flow_None = 0,
Flow_Up = 1,
@@ -217,7 +219,7 @@
} TFlow;
- /* States of each line, arc and profile */
+ /* States of each line, arc, and profile */
typedef enum TStates_
{
Unknown,
@@ -233,18 +235,18 @@
struct TProfile_
{
- FT_F26Dot6 X; /* current coordinate during sweep */
- PProfile link; /* link to next profile - various purpose */
- PLong offset; /* start of profile's data in render pool */
- Int flow; /* Profile orientation: Asc/Descending */
- Long height; /* profile's height in scanlines */
- Long start; /* profile's starting scanline */
+ FT_F26Dot6 X; /* current coordinate during sweep */
+ PProfile link; /* link to next profile - various purpose */
+ PLong offset; /* start of profile's data in render pool */
+ Int flow; /* Profile orientation: Asc/Descending */
+ Long height; /* profile's height in scanlines */
+ Long start; /* profile's starting scanline */
- UShort countL; /* number of lines to step before this */
- /* profile becomes drawable */
+ UShort countL; /* number of lines to step before this */
+ /* profile becomes drawable */
- PProfile next; /* next profile in same contour, used */
- /* during drop-out control */
+ PProfile next; /* next profile in same contour, used */
+ /* during drop-out control */
};
typedef PProfile TProfileList;
@@ -261,31 +263,33 @@
} TBand;
-
#define AlignProfileSize \
- (( sizeof(TProfile)+sizeof(long)-1 ) / sizeof(long))
+ ( ( sizeof ( TProfile ) + sizeof ( long ) - 1 ) / sizeof ( long ) )
-
#ifdef TT_STATIC_RASTER
-#define RAS_ARGS /* void */
-#define RAS_ARG /* void */
+#define RAS_ARGS /* void */
+#define RAS_ARG /* void */
-#define RAS_VARS /* void */
-#define RAS_VAR /* void */
+#define RAS_VARS /* void */
+#define RAS_VAR /* void */
-#else
+#define UNUSED_RASTER do ; while ( 0 )
-#define RAS_ARGS TRaster_Instance* raster,
-#define RAS_ARG TRaster_Instance* raster
+#else /* TT_STATIC_RASTER */
-#define RAS_VARS raster,
-#define RAS_VAR raster
+#define RAS_ARGS TRaster_Instance* raster,
+#define RAS_ARG TRaster_Instance* raster
-#endif
+#define RAS_VARS raster,
+#define RAS_VAR raster
+#define UNUSED_RASTER UNUSED( raster )
+#endif /* TT_STATIC_RASTER */
+
+
typedef struct TRaster_Instance_ TRaster_Instance;
@@ -302,13 +306,13 @@
typedef void Function_Sweep_Step( RAS_ARG );
-/* NOTE: These operations are only valid on 2's complement processors */
+ /* NOTE: These operations are only valid on 2's complement processors */
#define FLOOR( x ) ( (x) & -ras.precision )
-#define CEILING( x ) ( ((x) + ras.precision - 1) & -ras.precision )
+#define CEILING( x ) ( ( (x) + ras.precision - 1 ) & -ras.precision )
#define TRUNC( x ) ( (signed long)(x) >> ras.precision_bits )
-#define FRAC( x ) ( (x) & (ras.precision - 1) )
-#define SCALED( x ) ( ((x) << ras.scale_shift) - ras.precision_half )
+#define FRAC( x ) ( (x) & ( ras.precision - 1 ) )
+#define SCALED( x ) ( ( (x) << ras.scale_shift ) - ras.precision_half )
/* Note that I have moved the location of some fields in the */
/* structure to ensure that the most used variables are used */
@@ -317,7 +321,7 @@
struct TRaster_Instance_
{
- Int precision_bits; /* precision related variables */
+ Int precision_bits; /* precision related variables */
Int precision;
Int precision_half;
Long precision_mask;
@@ -325,46 +329,46 @@
Int precision_step;
Int precision_jitter;
- Int scale_shift; /* == precision_shift for bitmaps */
- /* == precision_shift+1 for pixmaps */
+ Int scale_shift; /* == precision_shift for bitmaps */
+ /* == precision_shift+1 for pixmaps */
- PLong buff; /* The profiles buffer */
- PLong sizeBuff; /* Render pool size */
- PLong maxBuff; /* Profiles buffer size */
- PLong top; /* Current cursor in buffer */
+ PLong buff; /* The profiles buffer */
+ PLong sizeBuff; /* Render pool size */
+ PLong maxBuff; /* Profiles buffer size */
+ PLong top; /* Current cursor in buffer */
FT_Error error;
Int numTurns; /* number of Y-turns in outline */
- TPoint* arc; /* current Bezier arc pointer */
+ TPoint* arc; /* current Bezier arc pointer */
- UShort bWidth; /* target bitmap width */
- PByte bTarget; /* target bitmap buffer */
- PByte gTarget; /* target pixmap buffer */
+ UShort bWidth; /* target bitmap width */
+ PByte bTarget; /* target bitmap buffer */
+ PByte gTarget; /* target pixmap buffer */
Long lastX, lastY, minY, maxY;
- UShort num_Profs; /* current number of profiles */
+ UShort num_Profs; /* current number of profiles */
- Bool fresh; /* signals a fresh new profile which */
- /* 'start' field must be completed */
- Bool joint; /* signals that the last arc ended */
- /* exactly on a scanline. Allows */
- /* removal of doublets */
- PProfile cProfile; /* current profile */
- PProfile fProfile; /* head of linked list of profiles */
- PProfile gProfile; /* contour's first profile in case */
- /* of impact */
- TStates state; /* rendering state */
+ Bool fresh; /* signals a fresh new profile which */
+ /* 'start' field must be completed */
+ Bool joint; /* signals that the last arc ended */
+ /* exactly on a scanline. Allows */
+ /* removal of doublets */
+ PProfile cProfile; /* current profile */
+ PProfile fProfile; /* head of linked list of profiles */
+ PProfile gProfile; /* contour's first profile in case */
+ /* of impact */
+ TStates state; /* rendering state */
- FT_Bitmap target; /* description of target bit/pixmap */
- FT_Outline outline;
+ FT_Bitmap target; /* description of target bit/pixmap */
+ FT_Outline outline;
- Long traceOfs; /* current offset in target bitmap */
- Long traceG; /* current offset in target pixmap */
+ Long traceOfs; /* current offset in target bitmap */
+ Long traceG; /* current offset in target pixmap */
- Short traceIncr; /* sweep's increment in target bitmap */
+ Short traceIncr; /* sweep's increment in target bitmap */
Short gray_min_x; /* current min x during gray rendering */
Short gray_max_x; /* current max x during gray rendering */
@@ -376,17 +380,18 @@
Function_Sweep_Span* Proc_Sweep_Drop;
Function_Sweep_Step* Proc_Sweep_Step;
- Byte dropOutControl; /* current drop_out control method */
+ Byte dropOutControl; /* current drop_out control method */
- Bool second_pass; /* indicates wether a horizontal pass */
- /* should be performed to control drop-out */
- /* accurately when calling Render_Glyph. */
- /* Note that there is no horizontal pass */
- /* during gray rendering. */
- TPoint arcs[2 * MaxBezier + 1]; /* The Bezier stack */
+ Bool second_pass; /* indicates wether a horizontal pass */
+ /* should be performed to control */
+ /* drop-out accurately when calling */
+ /* Render_Glyph. Note that there is */
+ /* no horizontal pass during gray */
+ /* rendering. */
+ TPoint arcs[2 * MaxBezier + 1]; /* The Bezier stack */
- TBand band_stack[16]; /* band stack used for sub-banding */
- Int band_top; /* band stack top */
+ TBand band_stack[16]; /* band stack used for sub-banding */
+ Int band_top; /* band stack top */
Int count_table[256]; /* Look-up table used to quickly count */
/* set bits in a gray 2x2 cell */
@@ -395,7 +400,8 @@
#ifdef FT_RASTER_OPTION_ANTI_ALIASING
- Byte grays[5]; /* Palette of gray levels used for render */
+ Byte grays[5]; /* Palette of gray levels used for */
+ /* render. */
Byte gray_lines[RASTER_GRAY_LINES];
/* Intermediate table used to render the */
@@ -406,21 +412,20 @@
/* intermediate scanline of gray_lines. */
/* Each gray pixel takes 2 bits long there */
- /* The gray_lines must hold 2 lines, thus with size */
- /* in bytes of at least 'gray_width*2' */
+ /* The gray_lines must hold 2 lines, thus with size */
+ /* in bytes of at least `gray_width*2'. */
#endif /* FT_RASTER_ANTI_ALIASING */
#if 0
- PByte flags; /* current flags table */
- PUShort outs; /* current outlines table */
+ PByte flags; /* current flags table */
+ PUShort outs; /* current outlines table */
FT_Vector* coords;
- UShort nPoints; /* number of points in current glyph */
- Short nContours; /* number of contours in current glyph */
+ UShort nPoints; /* number of points in current glyph */
+ Short nContours; /* number of contours in current glyph */
#endif
-
};
@@ -427,35 +432,38 @@
#ifdef FT_CONFIG_OPTION_STATIC_RASTER
static TRaster_Instance cur_ras;
- #define ras cur_ras
+#define ras cur_ras
#else
- #define ras (*raster)
+#define ras (*raster)
-#endif /* FT_STATIC_RASTER */
+#endif /* FT_CONFIG_OPTION_STATIC_RASTER */
- /****************************************************************/
- /****************************************************************/
- /** **/
- /** PROFILES COMPUTATION **/
- /** **/
- /****************************************************************/
- /****************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /** **/
+ /** PROFILES COMPUTATION **/
+ /** **/
+ /*************************************************************************/
+ /*************************************************************************/
-/************************************************************************/
-/* */
-/* Function: Set_High_Precision */
-/* */
-/* Description: Sets precision variables according to param flag. */
-/* */
-/* Input: High set to True for high precision (typically for */
-/* ppem < 18), false otherwise. */
-/* */
-/************************************************************************/
- static void Set_High_Precision( RAS_ARGS Int High )
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Set_High_Precision */
+ /* */
+ /* <Description> */
+ /* Sets precision variables according to param flag. */
+ /* */
+ /* <Input> */
+ /* High :: Set to True for high precision (typically for ppem < 18), */
+ /* false otherwise. */
+ /* */
+ static
+ void Set_High_Precision( RAS_ARGS Int High )
{
if ( High )
{
@@ -479,20 +487,23 @@
}
-/****************************************************************************/
-/* */
-/* Function: New_Profile */
-/* */
-/* Description: Creates a new Profile in the render pool. */
-/* */
-/* Input: aState state/orientation of the new Profile */
-/* */
-/* Returns: SUCCESS on success. */
-/* FAILURE in case of overflow or of incoherent Profile. */
-/* */
-/****************************************************************************/
-
- static Bool New_Profile( RAS_ARGS TStates aState )
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* New_Profile */
+ /* */
+ /* <Description> */
+ /* Creates a new profile in the render pool. */
+ /* */
+ /* <Input> */
+ /* aState :: The state/orientation of the new profile. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success. FAILURE in case of overflow or of incoherent */
+ /* profile. */
+ /* */
+ static
+ Bool New_Profile( RAS_ARGS TStates aState )
{
if ( !ras.fProfile )
{
@@ -542,20 +553,19 @@
}
-/****************************************************************************/
-/* */
-/* Function: End_Profile */
-/* */
-/* Description: Finalizes the current Profile. */
-/* */
-/* Input: None */
-/* */
-/* Returns: SUCCESS on success. */
-/* FAILURE in case of overflow or incoherency. */
-/* */
-/****************************************************************************/
-
- static Bool End_Profile( RAS_ARG )
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* End_Profile */
+ /* */
+ /* <Description> */
+ /* Finalizes the current profile. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success. FAILURE in case of overflow or incoherency. */
+ /* */
+ static
+ Bool End_Profile( RAS_ARG )
{
Long h;
PProfile oldProfile;
@@ -600,24 +610,29 @@
}
-/****************************************************************************/
-/* */
-/* Function: Insert_Y_Turn */
-/* */
-/* Description: Insert a salient into the sorted list placed on top */
-/* of the render pool */
-/* */
-/* Input: New y scanline position */
-/* */
-/****************************************************************************/
-
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Insert_Y_Turn */
+ /* */
+ /* <Description> */
+ /* Inserts a salient into the sorted list placed on top of the render */
+ /* pool. */
+ /* */
+ /* <Input> */
+ /* New y scanline position. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success. FAILURE in case of overflow. */
+ /* */
static
- Bool Insert_Y_Turn( RAS_ARGS Int y )
+ Bool Insert_Y_Turn( RAS_ARGS Int y )
{
PLong y_turns;
Int y2, n;
- n = ras.numTurns-1;
+
+ n = ras.numTurns - 1;
y_turns = ras.sizeBuff - ras.numTurns;
/* look for first y value that is <= */
@@ -636,7 +651,7 @@
if ( n < 0 )
{
- if (ras.maxBuff <= ras.top)
+ if ( ras.maxBuff <= ras.top )
{
ras.error = Raster_Err_Overflow;
return FAILURE;
@@ -650,20 +665,19 @@
}
-/****************************************************************************/
-/* */
-/* Function: Finalize_Profile_Table */
-/* */
-/* Description: Adjusts all links in the Profiles list. */
-/* */
-/* Input: None */
-/* */
-/* Returns: None. */
-/* */
-/****************************************************************************/
-
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Finalize_Profile_Table */
+ /* */
+ /* <Description> */
+ /* Adjusts all links in the profiles list. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success. FAILURE in case of overflow. */
+ /* */
static
- Bool Finalize_Profile_Table( RAS_ARG )
+ Bool Finalize_Profile_Table( RAS_ARG )
{
Int bottom, top;
UShort n;
@@ -688,17 +702,17 @@
bottom = p->start - p->height+1;
top = p->start;
p->start = bottom;
- p->offset += p->height-1;
+ p->offset += p->height - 1;
break;
case Flow_Up:
default:
bottom = p->start;
- top = p->start + p->height-1;
+ top = p->start + p->height - 1;
}
- if ( Insert_Y_Turn( RAS_VARS bottom ) ||
- Insert_Y_Turn( RAS_VARS top+1 ) )
+ if ( Insert_Y_Turn( RAS_VARS bottom ) ||
+ Insert_Y_Turn( RAS_VARS top + 1 ) )
return FAILURE;
p = p->link;
@@ -712,26 +726,24 @@
}
-/****************************************************************************/
-/* */
-/* Function: Split_Conic */
-/* */
-/* Description: Subdivides one conic bezier into two joint */
-/* sub-arcs in the Bezier stack. */
-/* */
-/* Input: None (subdivided bezier is taken from the top of the */
-/* stack). */
-/* */
-/* Returns: None. */
-/* */
-/* */
-/* Note: This routine is the 'beef' of this component. It is _the_ */
-/* inner loop that should be optimized to hell to get the */
-/* best performance. */
-/* */
-/****************************************************************************/
-
- static void Split_Conic( TPoint* base )
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Split_Conic */
+ /* */
+ /* <Description> */
+ /* Subdivides one conic Bezier into two joint sub-arcs in the Bezier */
+ /* stack. */
+ /* */
+ /* <Input> */
+ /* None (subdivided Bezier is taken from the top of the stack). */
+ /* */
+ /* <Note> */
+ /* This routine is the `beef' of this component. It is _the_ inner */
+ /* loop that should be optimized to hell to get the best performance. */
+ /* */
+ static
+ void Split_Conic( TPoint* base )
{
Long a, b;
@@ -755,11 +767,12 @@
/*************************************************************************/
/* */
- /* <Function> Split_Cubic */
+ /* <Function> */
+ /* Split_Cubic */
/* */
/* <Description> */
- /* Subdivides a third-order Bezier arc into two joint sub-arcs in */
- /* the Bezier stack. */
+ /* Subdivides a third-order Bezier arc into two joint sub-arcs in the */
+ /* Bezier stack. */
/* */
/* <Note> */
/* This routine is the `beef' of the component. It is one of _the_ */
@@ -771,6 +784,7 @@
{
Long a, b, c, d;
+
base[6].x = base[3].x;
c = base[1].x;
d = base[2].x;
@@ -793,28 +807,39 @@
}
-
-/****************************************************************************/
-/* */
-/* Function: Line_Up */
-/* */
-/* Description: Computes the x-coordinates of an ascending line segment */
-/* and stores them in the render pool. */
-/* */
-/* Input: x1,y1,x2,y2 Segment start (x1,y1) and end (x2,y2) points */
-/* */
-/* Returns: SUCCESS on success. */
-/* FAILURE on Render Pool overflow. */
-/* */
-/****************************************************************************/
-
- static Bool Line_Up( RAS_ARGS Long x1, Long y1,
- Long x2, Long y2,
- Long miny, Long maxy )
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Line_Up */
+ /* */
+ /* <Description> */
+ /* Computes the x-coordinates of an ascending line segment and stores */
+ /* them in the render pool. */
+ /* */
+ /* <Input> */
+ /* x1 :: The x-coordinate of the segment's start point. */
+ /* */
+ /* y1 :: The y-coordinate of the segment's start point. */
+ /* */
+ /* x2 :: The x-coordinate of the segment's end point. */
+ /* */
+ /* y2 :: The y-coordinate of the segment's end point. */
+ /* */
+ /* miny :: A lower vertical clipping bound value. */
+ /* */
+ /* maxy :: An upper vertical clipping bound value. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow. */
+ /* */
+ static
+ Bool Line_Up( RAS_ARGS Long x1, Long y1,
+ Long x2, Long y2,
+ Long miny, Long maxy )
{
- Long Dx, Dy;
- Int e1, e2, f1, f2, size; /* XXX: is `Short' sufficient? */
- Long Ix, Rx, Ax;
+ Long Dx, Dy;
+ Int e1, e2, f1, f2, size; /* XXX: is `Short' sufficient? */
+ Long Ix, Rx, Ax;
PLong top;
@@ -827,8 +852,8 @@
if ( y1 < miny )
{
- /* Take care : miny-y1 can be a very large value, we use */
- /* a slow MulDiv function to avoid clipping bugs */
+ /* Take care: miny-y1 can be a very large value; we use */
+ /* a slow MulDiv function to avoid clipping bugs */
x1 += SMulDiv( Dx, miny - y1, Dy );
e1 = TRUNC( miny );
f1 = 0;
@@ -853,7 +878,8 @@
if ( f1 > 0 )
{
- if ( e1 == e2 ) return SUCCESS;
+ if ( e1 == e2 )
+ return SUCCESS;
else
{
x1 += FMulDiv( Dx, ras.precision - f1, Dy );
@@ -884,14 +910,14 @@
if ( Dx > 0 )
{
- Ix = (ras.precision*Dx) / Dy;
- Rx = (ras.precision*Dx) % Dy;
+ Ix = ( ras.precision * Dx ) / Dy;
+ Rx = ( ras.precision * Dx ) % Dy;
Dx = 1;
}
else
{
- Ix = -( (ras.precision*-Dx) / Dy );
- Rx = (ras.precision*-Dx) % Dy;
+ Ix = -( ( ras.precision * -Dx ) / Dy );
+ Rx = ( ras.precision * -Dx ) % Dy;
Dx = -1;
}
@@ -917,11 +943,37 @@
}
- static Bool Line_Down( RAS_ARGS Long x1, Long y1,
- Long x2, Long y2,
- Long miny, Long maxy )
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Line_Down */
+ /* */
+ /* <Description> */
+ /* Computes the x-coordinates of an descending line segment and */
+ /* stores them in the render pool. */
+ /* */
+ /* <Input> */
+ /* x1 :: The x-coordinate of the segment's start point. */
+ /* */
+ /* y1 :: The y-coordinate of the segment's start point. */
+ /* */
+ /* x2 :: The x-coordinate of the segment's end point. */
+ /* */
+ /* y2 :: The y-coordinate of the segment's end point. */
+ /* */
+ /* miny :: A lower vertical clipping bound value. */
+ /* */
+ /* maxy :: An upper vertical clipping bound value. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow. */
+ /* */
+ static
+ Bool Line_Down( RAS_ARGS Long x1, Long y1,
+ Long x2, Long y2,
+ Long miny, Long maxy )
{
- Bool result, fresh;
+ Bool result, fresh;
fresh = ras.fresh;
@@ -935,21 +987,36 @@
}
-/****************************************************************************/
-/* */
-/* Function: Bezier_Up */
-/* */
-/* Description: Computes thes x-coordinates of an ascending bezier arc */
-/* and stores them in the render pool. */
-/* */
+ /* A function type describing the functions used to split Bezier arcs */
+ typedef void (*TSplitter)( TPoint* base );
- /* A function type describing the functions used to split bezier arcs */
- typedef void (*TSplitter)( TPoint* base );
- static Bool Bezier_Up( RAS_ARGS Int degree,
- TSplitter splitter,
- Long miny,
- Long maxy )
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Bezier_Up */
+ /* */
+ /* <Description> */
+ /* Computes the x-coordinates of an ascending Bezier arc and stores */
+ /* them in the render pool. */
+ /* */
+ /* <Input> */
+ /* degree :: The degree of the Bezier arc (either 2 or 3). */
+ /* */
+ /* splitter :: The function to split Bezier arcs. */
+ /* */
+ /* miny :: A lower vertical clipping bound value. */
+ /* */
+ /* maxy :: An upper vertical clipping bound value. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow. */
+ /* */
+ static
+ Bool Bezier_Up( RAS_ARGS Int degree,
+ TSplitter splitter,
+ Long miny,
+ Long maxy )
{
Long y1, y2, e, e2, e0;
Short f1;
@@ -1057,18 +1124,32 @@
}
-/****************************************************************************/
-/* */
-/* Function: Bezier_Down */
-/* */
-/* Description: Computes the x-coordinates of a descending bezier arc */
-/* and stores them in the render pool. */
-/* */
-
- static Bool Bezier_Down( RAS_ARGS Int degree,
- TSplitter splitter,
- Long miny,
- Long maxy )
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Bezier_Down */
+ /* */
+ /* <Description> */
+ /* Computes the x-coordinates of an descending Bezier arc and stores */
+ /* them in the render pool. */
+ /* */
+ /* <Input> */
+ /* degree :: The degree of the Bezier arc (either 2 or 3). */
+ /* */
+ /* splitter :: The function to split Bezier arcs. */
+ /* */
+ /* miny :: A lower vertical clipping bound value. */
+ /* */
+ /* maxy :: An upper vertical clipping bound value. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow. */
+ /* */
+ static
+ Bool Bezier_Down( RAS_ARGS Int degree,
+ TSplitter splitter,
+ Long miny,
+ Long maxy )
{
TPoint* arc = ras.arc;
Bool result, fresh;
@@ -1077,7 +1158,7 @@
arc[0].y = -arc[0].y;
arc[1].y = -arc[1].y;
arc[2].y = -arc[2].y;
- if (degree > 2)
+ if ( degree > 2 )
arc[3].y = -arc[3].y;
fresh = ras.fresh;
@@ -1092,20 +1173,28 @@
}
-/****************************************************************************/
-/* */
-/* Function: Line_To */
-/* */
-/* Description: Injects a new line segment and adjusts Profiles list. */
-/* */
-/* Input: x, y : segment endpoint (start point in LastX,LastY) */
-/* */
-/* Returns: SUCCESS on success. */
-/* FAILURE on Render Pool overflow or Incorrect Profile. */
-/* */
-/****************************************************************************/
-
- static Bool Line_To( RAS_ARGS Long x, Long y )
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Line_To */
+ /* */
+ /* <Description> */
+ /* Injects a new line segment and adjusts Profiles list. */
+ /* */
+ /* <Input> */
+ /* x :: The x-coordinate of the segment's end point (its start point */
+ /* is stored in `LastX'). */
+ /* */
+ /* y :: The y-coordinate of the segment's end point (its start point */
+ /* is stored in `LastY'). */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow or incorrect */
+ /* profile. */
+ /* */
+ static
+ Bool Line_To( RAS_ARGS Long x,
+ Long y )
{
/* First, detect a change of direction */
@@ -1114,12 +1203,14 @@
case Unknown:
if ( y > ras.lastY )
{
- if ( New_Profile( RAS_VARS Ascending ) ) return FAILURE;
+ if ( New_Profile( RAS_VARS Ascending ) )
+ return FAILURE;
}
else
{
if ( y < ras.lastY )
- if ( New_Profile( RAS_VARS Descending ) ) return FAILURE;
+ if ( New_Profile( RAS_VARS Descending ) )
+ return FAILURE;
}
break;
@@ -1126,8 +1217,9 @@
case Ascending:
if ( y < ras.lastY )
{
- if ( End_Profile( RAS_VAR ) ||
- New_Profile( RAS_VARS Descending ) ) return FAILURE;
+ if ( End_Profile( RAS_VAR ) ||
+ New_Profile( RAS_VARS Descending ) )
+ return FAILURE;
}
break;
@@ -1134,8 +1226,9 @@
case Descending:
if ( y > ras.lastY )
{
- if ( End_Profile( RAS_VAR ) ||
- New_Profile( RAS_VARS Ascending ) ) return FAILURE;
+ if ( End_Profile( RAS_VAR ) ||
+ New_Profile( RAS_VARS Ascending ) )
+ return FAILURE;
}
break;
@@ -1148,7 +1241,7 @@
switch ( ras.state )
{
case Ascending:
- if ( Line_Up ( RAS_VARS ras.lastX, ras.lastY,
+ if ( Line_Up ( RAS_VARS ras.lastX, ras.lastY,
x, y, ras.minY, ras.maxY ) )
return FAILURE;
break;
@@ -1170,17 +1263,34 @@
}
-/****************************************************************************/
-/* */
-/* Function: Conic_To */
-/* */
-/* Description: Injects a new conic arc and adjusts the profile list. */
-/* */
-
- static Bool Conic_To( RAS_ARGS Long cx,
- Long cy,
- Long x,
- Long y )
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Conic_To */
+ /* */
+ /* <Description> */
+ /* Injects a new conic arc and adjusts the profile list. */
+ /* */
+ /* <Input> */
+ /* cx :: The x-coordinate of the arc's new control point. */
+ /* */
+ /* cy :: The y-coordinate of the arc's new control point. */
+ /* */
+ /* x :: The x-coordinate of the arc's end point (its start point is */
+ /* stored in `LastX'). */
+ /* */
+ /* y :: The y-coordinate of the arc's end point (its start point is */
+ /* stored in `LastY'). */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow or incorrect */
+ /* profile. */
+ /* */
+ static
+ Bool Conic_To( RAS_ARGS Long cx,
+ Long cy,
+ Long x,
+ Long y )
{
Long y1, y2, y3, x3, ymin, ymax;
TStates state_bez;
@@ -1214,13 +1324,13 @@
if ( y2 < ymin || y2 > ymax )
{
- /* this arc has no given direction, split it !! */
+ /* this arc has no given direction, split it! */
Split_Conic( ras.arc );
ras.arc += 2;
}
else if ( y1 == y3 )
{
- /* this arc is flat, ignore it and pop it from the bezier stack */
+ /* this arc is flat, ignore it and pop it from the Bezier stack */
ras.arc -= 2;
}
else
@@ -1243,11 +1353,11 @@
/* now call the appropriate routine */
if ( state_bez == Ascending )
{
- if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
+ if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
goto Fail;
}
else
- if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
+ if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
goto Fail;
}
@@ -1257,23 +1367,46 @@
ras.lastY = y3;
return SUCCESS;
+
Fail:
return FAILURE;
}
-/****************************************************************************/
-/* */
-/* Function: Cubic_To */
-/* */
-/* Description: Injects a new cubic arc and adjusts the profile list. */
-/* */
- static Bool Cubic_To( RAS_ARGS Long cx1,
- Long cy1,
- Long cx2,
- Long cy2,
- Long x,
- Long y )
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Cubic_To */
+ /* */
+ /* <Description> */
+ /* Injects a new cubic arc and adjusts the profile list. */
+ /* */
+ /* <Input> */
+ /* cx1 :: The x-coordinate of the arc's first new control point. */
+ /* */
+ /* cy1 :: The y-coordinate of the arc's first new control point. */
+ /* */
+ /* cx2 :: The x-coordinate of the arc's second new control point. */
+ /* */
+ /* cy2 :: The y-coordinate of the arc's second new control point. */
+ /* */
+ /* x :: The x-coordinate of the arc's end point (its start point is */
+ /* stored in `LastX'). */
+ /* */
+ /* y :: The y-coordinate of the arc's end point (its start point is */
+ /* stored in `LastY'). */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow or incorrect */
+ /* profile. */
+ /* */
+ static
+ Bool Cubic_To( RAS_ARGS Long cx1,
+ Long cy1,
+ Long cx2,
+ Long cy2,
+ Long x,
+ Long y )
{
Long y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2;
TStates state_bez;
@@ -1326,7 +1459,7 @@
}
else if ( y1 == y4 )
{
- /* this arc is flat, ignore it and pop it from the bezier stack */
+ /* this arc is flat, ignore it and pop it from the Bezier stack */
ras.arc -= 3;
}
else
@@ -1347,11 +1480,11 @@
/* compute intersections */
if ( state_bez == Ascending )
{
- if ( Bezier_Up ( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
+ if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
goto Fail;
}
else
- if ( Bezier_Down ( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
+ if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
goto Fail;
}
@@ -1361,59 +1494,73 @@
ras.lastY = y4;
return SUCCESS;
+
Fail:
return FAILURE;
}
-/****************************************************************************/
-/* */
-/* Function: Decompose_Curve */
-/* */
-/* Description: Scans the outline arays in order to emit individual */
-/* segments and beziers by calling Line_To() and Bezier_To(). */
-/* It handles all weird cases, like when the first point */
-/* is off the curve, or when there are simply no 'on' */
-/* points in the contour! */
-/* */
-/* Input: first, last : indexes of first and last point in */
-/* contour. */
-/* */
-/* Returns: SUCCESS on success. */
-/* FAILURE on error. */
-/* */
-/****************************************************************************/
-
#undef SWAP_
-#define SWAP_(x,y) { Long swap = x; x = y; y = swap; }
+#define SWAP_( x, y ) do \
+ { \
+ Long swap = x; \
+ \
+ \
+ x = y; \
+ y = swap; \
+ } while ( 0 )
- static Bool Decompose_Curve( RAS_ARGS UShort first,
- UShort last,
- int flipped )
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Decompose_Curve */
+ /* */
+ /* <Description> */
+ /* Scans the outline arays in order to emit individual segments and */
+ /* Beziers by calling Line_To() and Bezier_To(). It handles all */
+ /* weird cases, like when the first point is off the curve, or when */
+ /* there are simply no `on' points in the contour! */
+ /* */
+ /* <Input> */
+ /* first :: The index of the first point in the contour. */
+ /* */
+ /* last :: The index of the last point in the contour. */
+ /* */
+ /* flipped :: If set, flip the direction of the curve. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on error. */
+ /* */
+ static
+ Bool Decompose_Curve( RAS_ARGS UShort first,
+ UShort last,
+ int flipped )
{
- FT_Vector v_last;
- FT_Vector v_control;
- FT_Vector v_start;
+ FT_Vector v_last;
+ FT_Vector v_control;
+ FT_Vector v_start;
- FT_Vector* points;
- FT_Vector* point;
- FT_Vector* limit;
- char* tags;
+ FT_Vector* points;
+ FT_Vector* point;
+ FT_Vector* limit;
+ char* tags;
- char tag; /* current point's state */
+ char tag; /* current point's state */
+
points = ras.outline.points;
limit = points + last;
- v_start.x = SCALED(points[first].x);
- v_start.y = SCALED(points[first].y);
- v_last.x = SCALED(points[last].x);
- v_last.y = SCALED(points[last].y);
- if (flipped)
+ v_start.x = SCALED( points[first].x );
+ v_start.y = SCALED( points[first].y );
+ v_last.x = SCALED( points[last].x );
+ v_last.y = SCALED( points[last].y );
+
+ if ( flipped )
{
- SWAP_(v_start.x,v_start.y);
- SWAP_(v_last.x,v_last.y);
+ SWAP_( v_start.x, v_start.y );
+ SWAP_( v_last.x, v_last.y );
}
v_control = v_start;
@@ -1453,112 +1600,127 @@
ras.lastX = v_start.x;
ras.lastY = v_start.y;
- while (point < limit)
+ while ( point < limit )
{
point++;
tags++;
tag = FT_CURVE_TAG( tags[0] );
- switch (tag)
+
+ switch ( tag )
{
- case FT_Curve_Tag_On: /* emit a single line_to */
- {
- Long x, y;
+ case FT_Curve_Tag_On: /* emit a single line_to */
+ {
+ Long x, y;
- x = SCALED(point->x);
- y = SCALED(point->y);
- if (flipped) SWAP_(x,y);
- if (Line_To( RAS_VARS x, y )) goto Fail;
- continue;
- }
+ x = SCALED( point->x );
+ y = SCALED( point->y );
+ if ( flipped )
+ SWAP_( x, y );
+ if ( Line_To( RAS_VARS x, y ) )
+ goto Fail;
+ continue;
+ }
- case FT_Curve_Tag_Conic: /* consume conic arcs */
+ case FT_Curve_Tag_Conic: /* consume conic arcs */
+ {
+ v_control.x = SCALED( point[0].x );
+ v_control.y = SCALED( point[0].y );
+
+ if ( flipped )
+ SWAP_( v_control.x, v_control.y );
+
+ Do_Conic:
+ if ( point < limit )
{
- v_control.x = SCALED(point[0].x);
- v_control.y = SCALED(point[0].y);
- if (flipped) SWAP_(v_control.x,v_control.y);
+ FT_Vector v_middle;
+ Long x, y;
- Do_Conic:
- if (point < limit)
- {
- FT_Vector v_middle;
- Long x, y;
- point++;
- tags++;
- tag = FT_CURVE_TAG( tags[0] );
+ point++;
+ tags++;
+ tag = FT_CURVE_TAG( tags[0] );
- x = SCALED(point[0].x);
- y = SCALED(point[0].y);
- if (flipped) SWAP_(x,y);
+ x = SCALED( point[0].x );
+ y = SCALED( point[0].y );
- if (tag == FT_Curve_Tag_On)
- {
- if (Conic_To( RAS_VARS v_control.x, v_control.y, x, y ))
- goto Fail;
- continue;
- }
+ if ( flipped )
+ SWAP_( x, y );
- if (tag != FT_Curve_Tag_Conic)
- goto Invalid_Outline;
+ if ( tag == FT_Curve_Tag_On )
+ {
+ if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) )
+ goto Fail;
+ continue;
+ }
- v_middle.x = (v_control.x + x)/2;
- v_middle.y = (v_control.y + y)/2;
+ if ( tag != FT_Curve_Tag_Conic )
+ goto Invalid_Outline;
- if (Conic_To( RAS_VARS v_control.x, v_control.y,
- v_middle.x, v_middle.y )) goto Fail;
+ v_middle.x = ( v_control.x + x ) / 2;
+ v_middle.y = ( v_control.y + y ) / 2;
- v_control.x = x;
- v_control.y = y;
- goto Do_Conic;
- }
+ if ( Conic_To( RAS_VARS v_control.x, v_control.y,
+ v_middle.x, v_middle.y ) )
+ goto Fail;
- if (Conic_To( RAS_VARS v_control.x, v_control.y,
- v_start.x, v_start.y )) goto Fail;
- goto Close;
+ v_control.x = x;
+ v_control.y = y;
+
+ goto Do_Conic;
}
- default: /* FT_Curve_Tag_Cubic */
- {
- Long x1, y1, x2, y2, x3, y3;
+ if ( Conic_To( RAS_VARS v_control.x, v_control.y,
+ v_start.x, v_start.y ) )
+ goto Fail;
- if ( point+1 > limit ||
- FT_CURVE_TAG( tags[1] ) != FT_Curve_Tag_Cubic )
- goto Invalid_Outline;
+ goto Close;
+ }
- point += 2;
- tags += 2;
+ default: /* FT_Curve_Tag_Cubic */
+ {
+ Long x1, y1, x2, y2, x3, y3;
- x1 = SCALED(point[-2].x);
- y1 = SCALED(point[-2].y);
- x2 = SCALED(point[-1].x);
- y2 = SCALED(point[-1].y);
- x3 = SCALED(point[ 0].x);
- y3 = SCALED(point[ 0].y);
- if (flipped)
- {
- SWAP_(x1,y1);
- SWAP_(x2,y2);
- SWAP_(x3,y3);
- }
- if (point <= limit)
- {
- if (Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ))
- goto Fail;
- continue;
- }
- if (Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ))
+ if ( point + 1 > limit ||
+ FT_CURVE_TAG( tags[1] ) != FT_Curve_Tag_Cubic )
+ goto Invalid_Outline;
+
+ point += 2;
+ tags += 2;
+
+ x1 = SCALED( point[-2].x );
+ y1 = SCALED( point[-2].y );
+ x2 = SCALED( point[-1].x );
+ y2 = SCALED( point[-1].y );
+ x3 = SCALED( point[ 0].x );
+ y3 = SCALED( point[ 0].y );
+
+ if ( flipped )
+ {
+ SWAP_( x1, y1 );
+ SWAP_( x2, y2 );
+ SWAP_( x3, y3 );
+ }
+
+ if ( point <= limit )
+ {
+ if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) )
goto Fail;
- goto Close;
+ continue;
}
+
+ if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) )
+ goto Fail;
+ goto Close;
+ }
}
}
/* close the contour with a line segment */
- if (Line_To( RAS_VARS v_start.x, v_start.y ))
+ if ( Line_To( RAS_VARS v_start.x, v_start.y ) )
goto Fail;
Close:
@@ -1571,23 +1733,25 @@
return FAILURE;
}
-/****************************************************************************/
-/* */
-/* Function: Convert_Glyph */
-/* */
-/* Description: Converts a glyph into a series of segments and arcs */
-/* and makes a Profiles list with them. */
-/* */
-/* Input: _xCoord, _yCoord : coordinates tables. */
-/* */
-/* Uses the 'Flag' table too. */
-/* */
-/* Returns: SUCCESS on success. */
-/* FAILURE if any error was encountered during rendering. */
-/* */
-/****************************************************************************/
- static Bool Convert_Glyph( RAS_ARGS int flipped )
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Convert_Glyph */
+ /* */
+ /* <Description> */
+ /* Converts a glyph into a series of segments and arcs and makes a */
+ /* profiles list with them. */
+ /* */
+ /* <Input> */
+ /* flipped :: If set, flip the direction of curve. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE if any error was encountered during */
+ /* rendering. */
+ /* */
+ static
+ Bool Convert_Glyph( RAS_ARGS int flipped )
{
Short i;
UShort start;
@@ -1614,15 +1778,15 @@
ras.state = Unknown;
ras.gProfile = NULL;
- if ( Decompose_Curve( RAS_VARS start, ras.outline.contours[i], flipped ) )
+ if ( Decompose_Curve( RAS_VARS start, ras.outline.contours[i], flipped ) )
return FAILURE;
start = ras.outline.contours[i] + 1;
- /* We must now see if the extreme arcs join or not */
- if ( ( FRAC( ras.lastY ) == 0 &&
- ras.lastY >= ras.minY &&
- ras.lastY <= ras.maxY ) )
+ /* We must now see whether the extreme arcs join or not */
+ if ( FRAC( ras.lastY ) == 0 &&
+ ras.lastY >= ras.minY &&
+ ras.lastY <= ras.maxY )
if ( ras.gProfile && ras.gProfile->flow == ras.cProfile->flow )
ras.top--;
/* Note that ras.gProfile can be nil if the contour was too small */
@@ -1629,53 +1793,52 @@
/* to be drawn. */
lastProfile = ras.cProfile;
- if ( End_Profile( RAS_VAR ) ) return FAILURE;
+ if ( End_Profile( RAS_VAR ) )
+ return FAILURE;
- /* close the 'next profile in contour' linked list */
+ /* close the `next profile in contour' linked list */
if ( ras.gProfile )
lastProfile->next = ras.gProfile;
}
- if (Finalize_Profile_Table( RAS_VAR ))
+ if ( Finalize_Profile_Table( RAS_VAR ) )
return FAILURE;
- return (ras.top < ras.maxBuff ? SUCCESS : FAILURE );
+ return ( ras.top < ras.maxBuff ? SUCCESS : FAILURE );
}
- /****************************************************************/
- /****************************************************************/
- /** **/
- /** SCAN-LINE SWEEPS AND DRAWING **/
- /** **/
- /****************************************************************/
- /****************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /** **/
+ /** SCAN-LINE SWEEPS AND DRAWING **/
+ /** **/
+ /*************************************************************************/
+ /*************************************************************************/
-/************************************************/
-/* */
-/* Init_Linked */
-/* */
-/* Inits an empty linked list. */
-/* */
-/************************************************/
-
- static void Init_Linked( TProfileList* l )
+ /*************************************************************************/
+ /* */
+ /* Init_Linked */
+ /* */
+ /* Initializes an empty linked list. */
+ /* */
+ static
+ void Init_Linked( TProfileList* l )
{
*l = NULL;
}
-/************************************************/
-/* */
-/* InsNew : */
-/* */
-/* Inserts a new Profile in a linked list. */
-/* */
-/************************************************/
-
- static void InsNew( PProfileList list,
- PProfile profile )
+ /*************************************************************************/
+ /* */
+ /* InsNew */
+ /* */
+ /* Inserts a new profile in a linked list. */
+ /* */
+ static
+ void InsNew( PProfileList list,
+ PProfile profile )
{
PProfile *old, current;
Long x;
@@ -1698,16 +1861,15 @@
}
-/*************************************************/
-/* */
-/* DelOld : */
-/* */
-/* Removes an old Profile from a linked list. */
-/* */
-/*************************************************/
-
- static void DelOld( PProfileList list,
- PProfile profile )
+ /*************************************************************************/
+ /* */
+ /* DelOld */
+ /* */
+ /* Removes an old profile from a linked list. */
+ /* */
+ static
+ void DelOld( PProfileList list,
+ PProfile profile )
{
PProfile *old, current;
@@ -1727,20 +1889,19 @@
current = *old;
}
- /* we should never get there, unless the Profile was not part of */
+ /* we should never get there, unless the profile was not part of */
/* the list. */
}
-/************************************************/
-/* */
-/* Update : */
-/* */
-/* Update all X offsets of a drawing list */
-/* */
-/************************************************/
-
- static void Update( PProfile first )
+ /*************************************************************************/
+ /* */
+ /* Update */
+ /* */
+ /* Update all X offsets of a drawing list. */
+ /* */
+ static
+ void Update( PProfile first )
{
PProfile current = first;
@@ -1755,18 +1916,16 @@
}
-/************************************************/
-/* */
-/* Sort : */
-/* */
-/* Sorts a trace list. In 95%, the list */
-/* is already sorted. We need an algorithm */
-/* which is fast in this case. Bubble sort */
-/* is enough and simple. */
-/* */
-/************************************************/
-
- static void Sort( PProfileList list )
+ /*************************************************************************/
+ /* */
+ /* Sort */
+ /* */
+ /* Sorts a trace list. In 95%, the list is already sorted. We need */
+ /* an algorithm which is fast in this case. Bubble sort is enough */
+ /* and simple. */
+ /* */
+ static
+ void Sort( PProfileList list )
{
PProfile *old, current, next;
@@ -1808,36 +1967,40 @@
}
-/***********************************************************************/
-/* */
-/* Vertical Sweep Procedure Set : */
-/* */
-/* These three routines are used during the vertical black/white */
-/* sweep phase by the generic Draw_Sweep() function. */
-/* */
-/***********************************************************************/
+ /*************************************************************************/
+ /* */
+ /* Vertical Sweep Procedure Set */
+ /* */
+ /* These four routines are used during the vertical black/white */
+ /* sweep phase by the generic Draw_Sweep() function. */
+ /* */
+ /*************************************************************************/
- static void Vertical_Sweep_Init( RAS_ARGS Short* min, Short* max )
+ static
+ void Vertical_Sweep_Init( RAS_ARGS Short* min,
+ Short* max )
{
Long pitch = ras.target.pitch;
- UNUSED(max);
+ UNUSED( max );
- ras.traceIncr = (Short)- pitch;
- ras.traceOfs = - *min * pitch;
- if (pitch > 0)
- ras.traceOfs += (ras.target.rows-1)*pitch;
+ ras.traceIncr = (Short)-pitch;
+ ras.traceOfs = -*min * pitch;
+ if ( pitch > 0 )
+ ras.traceOfs += ( ras.target.rows - 1 ) * pitch;
+
ras.gray_min_x = 0;
ras.gray_max_x = 0;
}
- static void Vertical_Sweep_Span( RAS_ARGS Short y,
- FT_F26Dot6 x1,
- FT_F26Dot6 x2,
- PProfile left,
- PProfile right )
+ static
+ void Vertical_Sweep_Span( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
{
Long e1, e2;
Short c1, c2;
@@ -1844,15 +2007,16 @@
Byte f1, f2;
Byte* target;
- UNUSED(y);
- UNUSED(left);
- UNUSED(right);
+ UNUSED( y );
+ UNUSED( left );
+ UNUSED( right );
+
/* Drop-out control */
e1 = TRUNC( CEILING( x1 ) );
- if ( x2-x1-ras.precision <= ras.precision_jitter )
+ if ( x2 - x1 - ras.precision <= ras.precision_jitter )
e2 = e1;
else
e2 = TRUNC( FLOOR( x2 ) );
@@ -1860,13 +2024,13 @@
if ( e2 >= 0 && e1 < ras.bWidth )
{
if ( e1 < 0 ) e1 = 0;
- if ( e2 >= ras.bWidth ) e2 = ras.bWidth-1;
+ if ( e2 >= ras.bWidth ) e2 = ras.bWidth - 1;
- c1 = (Short)(e1 >> 3);
- c2 = (Short)(e2 >> 3);
+ c1 = (Short)( e1 >> 3 );
+ c2 = (Short)( e2 >> 3 );
- f1 = ((unsigned char)0xFF >> (e1 & 7));
- f2 = ~((unsigned char)0x7F >> (e2 & 7));
+ f1 = (unsigned char)0xFF >> ( e1 & 7 );
+ f2 = ~((unsigned char)0x7F >> ( e2 & 7 ));
if ( ras.gray_min_x > c1 ) ras.gray_min_x = c1;
if ( ras.gray_max_x < c2 ) ras.gray_max_x = c2;
@@ -1895,11 +2059,12 @@
}
- static void Vertical_Sweep_Drop( RAS_ARGS Short y,
- FT_F26Dot6 x1,
- FT_F26Dot6 x2,
- PProfile left,
- PProfile right )
+ static void
+ Vertical_Sweep_Drop( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
{
Long e1, e2;
Short c1, f1;
@@ -1930,9 +2095,9 @@
/* The spec is not very clear regarding rule #4. It */
/* presents a method that is way too costly to implement */
- /* while the general idea seems to get rid of 'stubs'. */
+ /* while the general idea seems to get rid of `stubs'. */
/* */
- /* Here, we only get rid of stubs recognized when: */
+ /* Here, we only get rid of stubs recognized if: */
/* */
/* upper stub: */
/* */
@@ -1947,19 +2112,21 @@
/* - y is the bottom of P_Left */
/* */
- /* FIXXXME : uncommenting this line solves the disappearing */
- /* bit problem in the '7' of verdana 10pts, but */
- /* makes a new one in the 'C' of arial 14pts */
+ /* FIXXXME: uncommenting this line solves the disappearing */
+ /* bit problem in the `7' of verdana 10pts, but */
+ /* makes a new one in the `C' of arial 14pts */
- /* if ( x2-x1 < ras.precision_half ) */
+#if 0
+ if ( x2 - x1 < ras.precision_half )
+#endif
{
/* upper stub test */
+ if ( left->next == right && left->height <= 0 )
+ return;
- if ( left->next == right && left->height <= 0 ) return;
-
/* lower stub test */
-
- if ( right->next == left && left->start == y ) return;
+ if ( right->next == left && left->start == y )
+ return;
}
/* check that the rightmost pixel isn't set */
@@ -1966,17 +2133,17 @@
e1 = TRUNC( e1 );
- c1 = (Short)(e1 >> 3);
+ c1 = (Short)( e1 >> 3 );
f1 = e1 & 7;
- if ( e1 >= 0 && e1 < ras.bWidth &&
- ras.bTarget[ras.traceOfs + c1] & (0x80 >> f1) )
+ if ( e1 >= 0 && e1 < ras.bWidth &&
+ ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) )
return;
if ( ras.dropOutControl == 2 )
e1 = e2;
else
- e1 = CEILING( (x1 + x2 + 1) / 2 );
+ e1 = CEILING( ( x1 + x2 + 1 ) / 2 );
break;
@@ -1992,55 +2159,60 @@
if ( e1 >= 0 && e1 < ras.bWidth )
{
- c1 = (Short)(e1 >> 3);
+ c1 = (Short)( e1 >> 3 );
f1 = e1 & 7;
if ( ras.gray_min_x > c1 ) ras.gray_min_x = c1;
if ( ras.gray_max_x < c1 ) ras.gray_max_x = c1;
- ras.bTarget[ras.traceOfs + c1] |= (char)(0x80 >> f1);
+ ras.bTarget[ras.traceOfs + c1] |= (char)( 0x80 >> f1 );
}
}
- static void Vertical_Sweep_Step( RAS_ARG )
+ static
+ void Vertical_Sweep_Step( RAS_ARG )
{
ras.traceOfs += ras.traceIncr;
}
-/***********************************************************************/
-/* */
-/* Horizontal Sweep Procedure Set : */
-/* */
-/* These three routines are used during the horizontal black/white */
-/* sweep phase by the generic Draw_Sweep() function. */
-/* */
-/***********************************************************************/
+ /***********************************************************************/
+ /* */
+ /* Horizontal Sweep Procedure Set */
+ /* */
+ /* These four routines are used during the horizontal black/white */
+ /* sweep phase by the generic Draw_Sweep() function. */
+ /* */
+ /***********************************************************************/
- static void Horizontal_Sweep_Init( RAS_ARGS Short* min, Short* max )
+ static
+ void Horizontal_Sweep_Init( RAS_ARGS Short* min,
+ Short* max )
{
/* nothing, really */
- UNUSED(raster);
- UNUSED(min);
- UNUSED(max);
+ UNUSED( raster );
+ UNUSED( min );
+ UNUSED( max );
}
- static void Horizontal_Sweep_Span( RAS_ARGS Short y,
- FT_F26Dot6 x1,
- FT_F26Dot6 x2,
- PProfile left,
- PProfile right )
+ static
+ void Horizontal_Sweep_Span( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
{
- Long e1, e2;
- PByte bits;
- Byte f1;
+ Long e1, e2;
+ PByte bits;
+ Byte f1;
- UNUSED(left);
- UNUSED(right);
+ UNUSED( left );
+ UNUSED( right );
- if ( x2-x1 < ras.precision )
+
+ if ( x2 - x1 < ras.precision )
{
e1 = CEILING( x1 );
e2 = FLOOR ( x2 );
@@ -2047,8 +2219,8 @@
if ( e1 == e2 )
{
- bits = ras.bTarget + (y >> 3);
- f1 = (Byte)(0x80 >> (y & 7));
+ bits = ras.bTarget + ( y >> 3 );
+ f1 = (Byte)( 0x80 >> ( y & 7 ) );
e1 = TRUNC( e1 );
@@ -2056,9 +2228,10 @@
{
PByte p;
+
p = bits - e1*ras.target.pitch;
- if (ras.target.pitch > 0)
- p += (ras.target.rows-1)*ras.target.pitch;
+ if ( ras.target.pitch > 0 )
+ p += ( ras.target.rows - 1 ) * ras.target.pitch;
p[0] |= f1;
}
@@ -2067,15 +2240,16 @@
}
- static void Horizontal_Sweep_Drop( RAS_ARGS Short y,
- FT_F26Dot6 x1,
- FT_F26Dot6 x2,
- PProfile left,
- PProfile right )
+ static
+ void Horizontal_Sweep_Drop( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
{
- Long e1, e2;
- PByte bits;
- Byte f1;
+ Long e1, e2;
+ PByte bits;
+ Byte f1;
/* During the horizontal sweep, we only take care of drop-outs */
@@ -2094,7 +2268,7 @@
break;
case 4:
- e1 = CEILING( (x1 + x2 + 1) / 2 );
+ e1 = CEILING( ( x1 + x2 + 1 ) / 2 );
break;
case 2:
@@ -2104,27 +2278,27 @@
/* The spec is not very clear regarding rule #4. It */
/* presents a method that is way too costly to implement */
- /* while the general idea seems to get rid of 'stubs'. */
+ /* while the general idea seems to get rid of `stubs'. */
/* */
/* rightmost stub test */
+ if ( left->next == right && left->height <= 0 )
+ return;
- if ( left->next == right && left->height <= 0 ) return;
-
/* leftmost stub test */
+ if ( right->next == left && left->start == y )
+ return;
- if ( right->next == left && left->start == y ) return;
-
/* check that the rightmost pixel isn't set */
e1 = TRUNC( e1 );
- bits = ras.bTarget + (y >> 3);
- f1 = (Byte)(0x80 >> (y & 7));
+ bits = ras.bTarget + ( y >> 3 );
+ f1 = (Byte)( 0x80 >> ( y & 7 ) );
- bits -= e1*ras.target.pitch;
- if (ras.target.pitch > 0)
- bits += (ras.target.rows-1)*ras.target.pitch;
+ bits -= e1 * ras.target.pitch;
+ if ( ras.target.pitch > 0 )
+ bits += ( ras.target.rows - 1 ) * ras.target.pitch;
if ( e1 >= 0 &&
e1 < ras.target.rows &&
@@ -2134,7 +2308,7 @@
if ( ras.dropOutControl == 2 )
e1 = e2;
else
- e1 = CEILING( (x1 + x2 + 1) / 2 );
+ e1 = CEILING( ( x1 + x2 + 1 ) / 2 );
break;
@@ -2146,16 +2320,16 @@
return;
}
- bits = ras.bTarget + (y >> 3);
- f1 = (Byte)(0x80 >> (y & 7));
+ bits = ras.bTarget + ( y >> 3 );
+ f1 = (Byte)( 0x80 >> ( y & 7 ) );
e1 = TRUNC( e1 );
if ( e1 >= 0 && e1 < ras.target.rows )
{
- bits -= e1*ras.target.pitch;
- if (ras.target.pitch > 0)
- bits += (ras.target.rows-1)*ras.target.pitch;
+ bits -= e1 * ras.target.pitch;
+ if ( ras.target.pitch > 0 )
+ bits += ( ras.target.rows - 1 ) * ras.target.pitch;
bits[0] |= f1;
}
@@ -2162,36 +2336,40 @@
}
- static void Horizontal_Sweep_Step( RAS_ARG )
+ static
+ void Horizontal_Sweep_Step( RAS_ARG )
{
/* Nothing, really */
- UNUSED(raster);
+ UNUSED( raster );
}
#ifdef FT_RASTER_OPTION_ANTI_ALIASING
-/***********************************************************************/
-/* */
-/* Vertical Gray Sweep Procedure Set: */
-/* */
-/* These two routines are used during the vertical gray-levels */
-/* sweep phase by the generic Draw_Sweep() function. */
-/* */
-/* */
-/* NOTES: */
-/* */
-/* - The target pixmap's width *must* be a multiple of 4. */
-/* */
-/* - you have to use the function Vertical_Sweep_Span() for */
-/* the gray span call. */
-/* */
-/***********************************************************************/
- static void Vertical_Gray_Sweep_Init( RAS_ARGS Short* min, Short* max )
+ /*************************************************************************/
+ /* */
+ /* Vertical Gray Sweep Procedure Set */
+ /* */
+ /* These two routines are used during the vertical gray-levels sweep */
+ /* phase by the generic Draw_Sweep() function. */
+ /* */
+ /* NOTES */
+ /* */
+ /* - The target pixmap's width *must* be a multiple of 4. */
+ /* */
+ /* - You have to use the function Vertical_Sweep_Span() for the gray */
+ /* span call. */
+ /* */
+ /*************************************************************************/
+
+ static
+ void Vertical_Gray_Sweep_Init( RAS_ARGS Short* min,
+ Short* max )
{
Long pitch, byte_len;
+
*min = *min & -2;
*max = ( *max + 3 ) & -2;
@@ -2199,10 +2377,11 @@
pitch = ras.target.pitch;
byte_len = -pitch;
ras.traceIncr = (Short)byte_len;
- ras.traceG = (*min/2)*byte_len;
- if (pitch > 0)
+ ras.traceG = ( *min / 2 ) * byte_len;
+
+ if ( pitch > 0 )
{
- ras.traceG += (ras.target.rows-1)*pitch;
+ ras.traceG += ( ras.target.rows - 1 ) * pitch;
byte_len = -byte_len;
}
@@ -2211,7 +2390,8 @@
}
- static void Vertical_Gray_Sweep_Step( RAS_ARG )
+ static
+ void Vertical_Gray_Sweep_Step( RAS_ARG )
{
Int c1, c2;
PByte pix, bit, bit2;
@@ -2228,14 +2408,14 @@
if ( ras.gray_max_x >= 0 )
{
- Long last_pixel = ras.target.width-1;
+ Long last_pixel = ras.target.width - 1;
Int last_cell = last_pixel >> 2;
Int last_bit = last_pixel & 3;
Bool over = 0;
- if (ras.gray_max_x >= last_cell && last_bit != 3)
+ if ( ras.gray_max_x >= last_cell && last_bit != 3 )
{
- ras.gray_max_x = last_cell-1;
+ ras.gray_max_x = last_cell - 1;
over = 1;
}
@@ -2262,22 +2442,25 @@
*bit2 = 0;
}
- bit ++;
+ bit++;
bit2++;
pix += 4;
- c1 --;
+ c1--;
}
- if (over)
+ if ( over )
{
c2 = count[*bit] + count[*bit2];
- if (c2)
+ if ( c2 )
{
- switch (last_bit)
+ switch ( last_bit )
{
- case 2: pix[2] = grays[(c2 >> 4 ) & 0x000F];
- case 1: pix[1] = grays[(c2 >> 8 ) & 0x000F];
- default: pix[0] = grays[(c2 >> 12) & 0x000F];
+ case 2:
+ pix[2] = grays[(c2 >> 4 ) & 0x000F];
+ case 1:
+ pix[1] = grays[(c2 >> 8 ) & 0x000F];
+ default:
+ pix[0] = grays[(c2 >> 12) & 0x000F];
}
*bit = 0;
@@ -2295,30 +2478,33 @@
}
- static void Horizontal_Gray_Sweep_Span( RAS_ARGS Short y,
- FT_F26Dot6 x1,
- FT_F26Dot6 x2,
- PProfile left,
- PProfile right )
+ static
+ void Horizontal_Gray_Sweep_Span( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
{
/* nothing, really */
- UNUSED(raster);
- UNUSED(y);
- UNUSED(x1);
- UNUSED(x2);
- UNUSED(left);
- UNUSED(right);
+ UNUSED( raster );
+ UNUSED( y );
+ UNUSED( x1 );
+ UNUSED( x2 );
+ UNUSED( left );
+ UNUSED( right );
}
- static void Horizontal_Gray_Sweep_Drop( RAS_ARGS Short y,
- FT_F26Dot6 x1,
- FT_F26Dot6 x2,
- PProfile left,
- PProfile right )
+
+ static
+ void Horizontal_Gray_Sweep_Drop( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
{
- Long e1, e2;
- PByte pixel;
- Byte color;
+ Long e1, e2;
+ PByte pixel;
+ Byte color;
/* During the horizontal sweep, we only take care of drop-outs */
@@ -2336,7 +2522,7 @@
break;
case 4:
- e1 = CEILING( (x1 + x2 + 1) / 2 );
+ e1 = CEILING( ( x1 + x2 + 1 ) / 2 );
break;
case 2:
@@ -2346,19 +2532,21 @@
/* The spec is not very clear regarding rule #4. It */
/* presents a method that is way too costly to implement */
- /* while the general idea seems to get rid of 'stubs'. */
+ /* while the general idea seems to get rid of `stubs'. */
/* */
/* rightmost stub test */
- if ( left->next == right && left->height <= 0 ) return;
+ if ( left->next == right && left->height <= 0 )
+ return;
/* leftmost stub test */
- if ( right->next == left && left->start == y ) return;
+ if ( right->next == left && left->start == y )
+ return;
if ( ras.dropOutControl == 2 )
e1 = e2;
else
- e1 = CEILING( (x1 + x2 + 1) / 2 );
+ e1 = CEILING( ( x1 + x2 + 1 ) / 2 );
break;
@@ -2380,26 +2568,28 @@
e1 = TRUNC( e1 ) / 2;
if ( e1 < ras.target.rows )
{
- pixel = ras.gTarget - e1*ras.target.pitch + y/2;
- if (ras.target.pitch > 0)
- pixel += (ras.target.rows-1)*ras.target.pitch;
+ pixel = ras.gTarget - e1 * ras.target.pitch + y / 2;
+ if ( ras.target.pitch > 0 )
+ pixel += ( ras.target.rows - 1 ) * ras.target.pitch;
- if (pixel[0] == ras.grays[0])
+ if ( pixel[0] == ras.grays[0] )
pixel[0] = color;
}
}
}
+
#endif /* FT_RASTER_OPTION_ANTI_ALIASING */
-/********************************************************************/
-/* */
-/* Generic Sweep Drawing routine */
-/* */
-/********************************************************************/
+ /*************************************************************************/
+ /* */
+ /* Generic Sweep Drawing routine */
+ /* */
+ /*************************************************************************/
- static Bool Draw_Sweep( RAS_ARG )
+ static
+ Bool Draw_Sweep( RAS_ARG )
{
Short y, y_change, y_height;
@@ -2431,7 +2621,7 @@
Q = P->link;
bottom = (Short)P->start;
- top = (Short)P->start + P->height-1;
+ top = (Short)P->start + P->height - 1;
if ( min_Y > bottom ) min_Y = bottom;
if ( max_Y < top ) max_Y = top;
@@ -2451,7 +2641,7 @@
/* Now inits the sweep */
- ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y );
+ ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y );
/* Then compute the distance of each profile from min_Y */
@@ -2488,8 +2678,13 @@
switch ( P->flow )
{
- case Flow_Up: InsNew( &draw_left, P ); break;
- case Flow_Down: InsNew( &draw_right, P ); break;
+ case Flow_Up:
+ InsNew( &draw_left, P );
+ break;
+
+ case Flow_Down:
+ InsNew( &draw_right, P );
+ break;
}
}
@@ -2506,7 +2701,6 @@
while ( y < y_change )
{
-
/* Let's trace */
dropouts = 0;
@@ -2526,13 +2720,13 @@
x2 = xs;
}
- if ( x2-x1 <= ras.precision )
+ if ( x2 - x1 <= ras.precision )
{
e1 = FLOOR( x1 );
e2 = CEILING( x2 );
- if ( ras.dropOutControl != 0 &&
- (e1 > e2 || e2 == e1 + ras.precision) )
+ if ( ras.dropOutControl != 0 &&
+ ( e1 > e2 || e2 == e1 + ras.precision ) )
{
/* a drop out was detected */
@@ -2547,9 +2741,9 @@
}
}
- ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right );
+ ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right );
- Skip_To_Next:
+ Skip_To_Next:
P_Left = P_Left->link;
P_Right = P_Right->link;
@@ -2558,10 +2752,10 @@
/* now perform the dropouts _after_ the span drawing */
/* drop-outs processing has been moved out of the loop */
/* for performance tuning */
- if (dropouts > 0)
+ if ( dropouts > 0 )
goto Scan_DropOuts;
- Next_Line:
+ Next_Line:
ras.Proc_Sweep_Step( RAS_VAR );
@@ -2572,7 +2766,6 @@
Sort( &draw_left );
Sort( &draw_right );
}
-
}
/* Now finalize the profiles that needs it */
@@ -2579,6 +2772,8 @@
{
PProfile Q, P;
+
+
P = draw_left;
while ( P )
{
@@ -2591,6 +2786,8 @@
{
PProfile Q, P = draw_right;
+
+
while ( P )
{
Q = P->link;
@@ -2610,7 +2807,7 @@
return SUCCESS;
-Scan_DropOuts :
+ Scan_DropOuts:
P_Left = draw_left;
P_Right = draw_right;
@@ -2620,12 +2817,14 @@
if ( P_Left->countL )
{
P_Left->countL = 0;
- /* dropouts--; -- this is useful when debugging only */
- ras.Proc_Sweep_Drop( RAS_VARS y,
- P_Left->X,
- P_Right->X,
- P_Left,
- P_Right );
+#if 0
+ dropouts--; /* -- this is useful when debugging only */
+#endif
+ ras.Proc_Sweep_Drop( RAS_VARS y,
+ P_Left->X,
+ P_Right->X,
+ P_Left,
+ P_Right );
}
P_Left = P_Left->link;
@@ -2636,20 +2835,22 @@
}
-/****************************************************************************/
-/* */
-/* Function: Render_Single_Pass */
-/* */
-/* Description: Performs one sweep with sub-banding. */
-/* */
-/* Input: _XCoord, _YCoord : x and y coordinates arrays */
-/* */
-/* Returns: SUCCESS on success */
-/* FAILURE if any error was encountered during render. */
-/* */
-/****************************************************************************/
-
- static FT_Error Render_Single_Pass( RAS_ARGS Bool flipped )
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Render_Single_Pass */
+ /* */
+ /* <Description> */
+ /* Performs one sweep with sub-banding. */
+ /* */
+ /* <Input> */
+ /* flipped :: If set, flip the direction of the outline. */
+ /* */
+ /* <Return> */
+ /* Renderer error code. */
+ /* */
+ static
+ int Render_Single_Pass( RAS_ARGS Bool flipped )
{
Short i, j, k;
@@ -2663,17 +2864,18 @@
ras.error = Raster_Err_None;
- if ( Convert_Glyph( RAS_VARS flipped ) )
+ if ( Convert_Glyph( RAS_VARS flipped ) )
{
- if ( ras.error != Raster_Err_Overflow ) return FAILURE;
+ if ( ras.error != Raster_Err_Overflow )
+ return FAILURE;
ras.error = Raster_Err_None;
/* sub-banding */
- #ifdef DEBUG_RASTER
- ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) );
- #endif
+#ifdef DEBUG_RASTER
+ ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) );
+#endif
i = ras.band_stack[ras.band_top].y_min;
j = ras.band_stack[ras.band_top].y_max;
@@ -2682,13 +2884,14 @@
if ( ras.band_top >= 7 || k < i )
{
- ras.band_top = 0;
- ras.error = Raster_Err_Invalid;
+ ras.band_top = 0;
+ ras.error = Raster_Err_Invalid;
+
return ras.error;
}
- ras.band_stack[ras.band_top+1].y_min = k;
- ras.band_stack[ras.band_top+1].y_max = j;
+ ras.band_stack[ras.band_top + 1].y_min = k;
+ ras.band_stack[ras.band_top + 1].y_max = j;
ras.band_stack[ras.band_top].y_max = k - 1;
@@ -2697,39 +2900,41 @@
else
{
if ( ras.fProfile )
- if ( Draw_Sweep( RAS_VAR ) ) return ras.error;
+ if ( Draw_Sweep( RAS_VAR ) )
+ return ras.error;
ras.band_top--;
}
}
- return FT_Err_Ok;
+ return SUCCESS;
}
-/****************************************************************************/
-/* */
-/* Function: Render_Glyph */
-/* */
-/* Description: Renders a glyph in a bitmap. Sub-banding if needed. */
-/* */
-/* Input: AGlyph Glyph record */
-/* */
-/* Returns: SUCCESS on success. */
-/* FAILURE if any error was encountered during rendering. */
-/* */
-/****************************************************************************/
-
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Render_Glyph */
+ /* */
+ /* <Description> */
+ /* Renders a glyph in a bitmap. Sub-banding if needed. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* XXX Fixme: ftraster's error codes don't harmonize with FT2's ones! */
+ /* */
LOCAL_FUNC
FT_Error Render_Glyph( RAS_ARG )
{
FT_Error error;
- Set_High_Precision( RAS_VARS ras.outline.flags & ft_outline_high_precision );
+
+ Set_High_Precision( RAS_VARS ras.outline.flags &
+ ft_outline_high_precision );
ras.scale_shift = ras.precision_shift;
ras.dropOutControl = 2;
- ras.second_pass = !(ras.outline.flags & ft_outline_single_pass);
+ ras.second_pass = !( ras.outline.flags & ft_outline_single_pass );
-
/* Vertical Sweep */
ras.Proc_Sweep_Init = Vertical_Sweep_Init;
ras.Proc_Sweep_Span = Vertical_Sweep_Span;
@@ -2743,7 +2948,7 @@
ras.bWidth = ras.target.width;
ras.bTarget = (Byte*)ras.target.buffer;
- if ( (error = Render_Single_Pass( RAS_VARS 0 )) != 0 )
+ if ( ( error = Render_Single_Pass( RAS_VARS 0 ) ) != 0 )
return error;
/* Horizontal Sweep */
@@ -2758,7 +2963,7 @@
ras.band_stack[0].y_min = 0;
ras.band_stack[0].y_max = ras.target.width - 1;
- if ( (error = Render_Single_Pass( RAS_VARS 1 )) != 0 )
+ if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 )
return error;
}
@@ -2766,20 +2971,20 @@
}
-/****************************************************************************/
-/* */
-/* Function: Render_Gray_Glyph */
-/* */
-/* Description: Renders a glyph with grayscaling. Sub-banding if needed. */
-/* */
-/* Input: AGlyph Glyph record */
-/* */
-/* Returns: SUCCESS on success */
-/* FAILURE if any error was encountered during rendering. */
-/* */
-/****************************************************************************/
-
#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Render_Gray_Glyph */
+ /* */
+ /* <Description> */
+ /* Renders a glyph with grayscaling. Sub-banding if needed. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
LOCAL_FUNC
FT_Error Render_Gray_Glyph( RAS_ARG )
{
@@ -2786,10 +2991,12 @@
Long pixel_width;
FT_Error error;
- Set_High_Precision( RAS_VARS ras.outline.flags & ft_outline_high_precision );
- ras.scale_shift = ras.precision_shift+1;
+
+ Set_High_Precision( RAS_VARS ras.outline.flags &
+ ft_outline_high_precision );
+ ras.scale_shift = ras.precision_shift + 1;
ras.dropOutControl = 2;
- ras.second_pass = !(ras.outline.flags & ft_outline_single_pass);
+ ras.second_pass = !( ras.outline.flags & ft_outline_single_pass );
/* Vertical Sweep */
@@ -2799,7 +3006,7 @@
ras.band_stack[0].y_max = 2 * ras.target.rows - 1;
ras.bWidth = ras.gray_width;
- pixel_width = 2*((ras.target.width + 3) >> 2);
+ pixel_width = 2 * ( ( ras.target.width + 3 ) >> 2 );
if ( ras.bWidth > pixel_width )
ras.bWidth = pixel_width;
@@ -2813,7 +3020,7 @@
ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;
ras.Proc_Sweep_Step = Vertical_Gray_Sweep_Step;
- error = Render_Single_Pass( RAS_VARS 0 );
+ error = Render_Single_Pass( RAS_VARS 0 );
if (error)
return error;
@@ -2829,7 +3036,7 @@
ras.band_stack[0].y_min = 0;
ras.band_stack[0].y_max = ras.target.width * 2 - 1;
- error = Render_Single_Pass( RAS_VARS 1 );
+ error = Render_Single_Pass( RAS_VARS 1 );
if (error)
return error;
}
@@ -2836,17 +3043,21 @@
return FT_Err_Ok;
}
-#else
+
+#else /* FT_RASTER_OPTION_ANTI_ALIASING */
+
LOCAL_FUNC
FT_Error Render_Gray_Glyph( RAS_ARG )
{
- UNUSED_RASTER
+ UNUSED_RASTER;
return Raster_Err_Unsupported;
}
+
#endif
- static void ft_black_init( TRaster_Instance* raster )
+ static
+ void ft_black_init( TRaster_Instance* raster )
{
FT_UInt n;
FT_ULong c;
@@ -2854,12 +3065,12 @@
/* setup count table */
for ( n = 0; n < 256; n++ )
{
- c = (n & 0x55) + ((n & 0xAA) >> 1);
+ c = ( n & 0x55 ) + ( ( n & 0xAA ) >> 1 );
- c = ((c << 6) & 0x3000) |
- ((c << 4) & 0x0300) |
- ((c << 2) & 0x0030) |
- (c & 0x0003);
+ c = ( ( c << 6 ) & 0x3000 ) |
+ ( ( c << 4 ) & 0x0300 ) |
+ ( ( c << 2 ) & 0x0030 ) |
+ (c & 0x0003 );
raster->count_table[n] = c;
}
@@ -2866,25 +3077,31 @@
/* set default 5-levels gray palette */
for ( n = 0; n < 5; n++ )
- raster->grays[n] = (n*255/4);
+ raster->grays[n] = n * 255 / 4;
- raster->gray_width = RASTER_GRAY_LINES/2;
+ raster->gray_width = RASTER_GRAY_LINES / 2;
}
- /**** RASTER OBJECT CREATION : in standalone mode, we simply use *****/
- /**** a static object .. *****/
+ /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/
+ /**** a static object. *****/
+
#ifdef _STANDALONE_
static
- int ft_black_new( void* memory, FT_Raster *araster )
+ int ft_black_new( void* memory,
+ FT_Raster *araster )
{
static FT_RasterRec_ the_raster;
+
+
*araster = &the_raster;
- memset( &the_raster, sizeof(the_raster), 0 );
+ memset( &the_raster, sizeof ( the_raster ), 0 );
ft_black_init( &the_raster );
+
return 0;
}
+
static
void ft_black_done( FT_Raster raster )
{
@@ -2892,18 +3109,20 @@
raster->init = 0;
}
-#else
+#else /* _STANDALONE_ */
#include <freetype/internal/ftobjs.h>
static
- int ft_black_new( FT_Memory memory, TRaster_Instance* *araster )
+ int ft_black_new( FT_Memory memory,
+ TRaster_Instance** araster )
{
FT_Error error;
TRaster_Instance* raster;
+
*araster = 0;
- if ( !ALLOC( raster, sizeof(*raster) ))
+ if ( !ALLOC( raster, sizeof ( *raster ) ) )
{
raster->memory = memory;
ft_black_init( raster );
@@ -2914,6 +3133,7 @@
return error;
}
+
static
void ft_black_done( TRaster_Instance* raster )
{
@@ -2921,26 +3141,29 @@
FREE( raster );
}
-#endif
+#endif /* _STANDALONE_ */
- static void ft_black_reset( TRaster_Instance* raster,
- const char* pool_base,
- long pool_size )
+ static
+ void ft_black_reset( TRaster_Instance* raster,
+ const char* pool_base,
+ long pool_size )
{
if ( raster && pool_base && pool_size >= 4096 )
{
/* save the pool */
raster->buff = (PLong)pool_base;
- raster->sizeBuff = raster->buff + pool_size / sizeof (Long);
+ raster->sizeBuff = raster->buff + pool_size / sizeof ( Long );
}
}
- static void ft_black_set_mode( TRaster_Instance* raster,
- unsigned long mode,
- const char* palette )
+
+ static
+ void ft_black_set_mode( TRaster_Instance* raster,
+ unsigned long mode,
+ const char* palette )
{
- if (mode==FT_MAKE_TAG('p','a','l','5'))
+ if ( mode == FT_MAKE_TAG( 'p', 'a', 'l', '5' ) )
{
/* set 5-levels gray palette */
raster->grays[0] = palette[0];
@@ -2959,6 +3182,7 @@
FT_Outline* outline = (FT_Outline*)params->source;
FT_Bitmap* target_map = params->target;
+
if ( !raster || !raster->buff || !raster->sizeBuff )
return Raster_Err_Not_Ini;
@@ -2983,19 +3207,19 @@
ras.target = *target_map;
return ( params->flags & ft_raster_flag_aa
- ? Render_Gray_Glyph( raster )
- : Render_Glyph( raster ) );
+ ? Render_Gray_Glyph( raster )
+ : Render_Glyph( raster ) );
}
- FT_Raster_Funcs ft_default_raster =
+ FT_Raster_Funcs ft_default_raster =
{
ft_glyph_format_outline,
- (FT_Raster_New_Func) ft_black_new,
- (FT_Raster_Reset_Func) ft_black_reset,
- (FT_Raster_Set_Mode_Func) ft_black_set_mode,
- (FT_Raster_Render_Func) ft_black_render,
- (FT_Raster_Done_Func) ft_black_done
+ (FT_Raster_New_Func) ft_black_new,
+ (FT_Raster_Reset_Func) ft_black_reset,
+ (FT_Raster_Set_Mode_Func)ft_black_set_mode,
+ (FT_Raster_Render_Func) ft_black_render,
+ (FT_Raster_Done_Func) ft_black_done
};