slight change to the smooth renderer to make it compile
stand alone with the _STANDALONE_ macro defined.. See comments inside it "src/base/ftgrays.c"
This commit is contained in:
parent
b3936a1600
commit
6b0bf34665
@ -22,7 +22,11 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef _STANDALONE_
|
||||
#include "ftimage.h"
|
||||
#else
|
||||
#include <freetype/ftimage.h>
|
||||
#endif
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
|
@ -15,6 +15,34 @@
|
||||
/* */
|
||||
/***************************************************************************/
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* 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: */
|
||||
/* */
|
||||
/* - copy "src/base/ftgrays.c" to your current 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: */
|
||||
/* */
|
||||
/* cc -c -D_STANDALONE_ ftgrays.c */
|
||||
/* */
|
||||
/* - the renderer can be initialised with a call to: */
|
||||
/* */
|
||||
/* ft_grays_raster.init */
|
||||
/* */
|
||||
/* - 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.. */
|
||||
/* */
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* This is a new anti-aliasing scan-converter for FreeType 2. The */
|
||||
@ -56,14 +84,22 @@
|
||||
/*************************************************************************/
|
||||
|
||||
|
||||
#include <freetype/ftgrays.h>
|
||||
#include <string.h> /* for memcpy() */
|
||||
|
||||
#define ErrRaster_Invalid_Outline -1
|
||||
|
||||
#ifdef _STANDALONE_
|
||||
#error "implementation of FT_Outline_Decompose missing!"
|
||||
|
||||
#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
|
||||
#include <freetype/ftgrays.h>
|
||||
#include <freetype/internal/ftobjs.h> /* for UNUSED() */
|
||||
#include <freetype/freetype.h> /* to link to FT_Outline_Decompose() */
|
||||
#endif
|
||||
@ -1365,6 +1401,210 @@
|
||||
}
|
||||
|
||||
|
||||
#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 )
|
||||
{
|
||||
#undef SCALED
|
||||
#define SCALED( x ) ( ((x) << shift) - delta )
|
||||
|
||||
FT_Vector v_last;
|
||||
FT_Vector v_control;
|
||||
FT_Vector v_start;
|
||||
|
||||
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 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 */
|
||||
|
||||
last = outline->contours[n];
|
||||
limit = outline->points + last;
|
||||
|
||||
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_control = v_start;
|
||||
|
||||
point = outline->points + first;
|
||||
tags = outline->tags + first;
|
||||
tag = FT_CURVE_TAG( tags[0] );
|
||||
|
||||
/* A contour cannot start with a cubic control point! */
|
||||
if ( tag == FT_Curve_Tag_Cubic )
|
||||
goto Invalid_Outline;
|
||||
|
||||
/* check first point to determine origin */
|
||||
if ( tag == FT_Curve_Tag_Conic )
|
||||
{
|
||||
/* first point is conic control. Yes, this happens. */
|
||||
if ( FT_CURVE_TAG( outline->tags[last] ) == FT_Curve_Tag_On )
|
||||
{
|
||||
/* start at last point if it is on the curve */
|
||||
v_start = v_last;
|
||||
limit--;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* if both first and last points are conic, */
|
||||
/* start at their middle and record its position */
|
||||
/* for closure */
|
||||
v_start.x = ( v_start.x + v_last.x ) / 2;
|
||||
v_start.y = ( v_start.y + v_last.y ) / 2;
|
||||
|
||||
v_last = v_start;
|
||||
}
|
||||
point--;
|
||||
tags--;
|
||||
}
|
||||
|
||||
error = interface->move_to( &v_start, user );
|
||||
if (error) goto Exit;
|
||||
|
||||
while (point < limit)
|
||||
{
|
||||
point++;
|
||||
tags++;
|
||||
|
||||
tag = FT_CURVE_TAG( tags[0] );
|
||||
switch (tag)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
FT_Vector vec;
|
||||
FT_Vector v_middle;
|
||||
|
||||
point++;
|
||||
tags++;
|
||||
tag = FT_CURVE_TAG( tags[0] );
|
||||
|
||||
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_Conic)
|
||||
goto Invalid_Outline;
|
||||
|
||||
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;
|
||||
|
||||
v_control = vec;
|
||||
goto Do_Conic;
|
||||
}
|
||||
|
||||
error = interface->conic_to( &v_control, &v_start, user );
|
||||
goto Close;
|
||||
}
|
||||
|
||||
default: /* FT_Curve_Tag_Cubic */
|
||||
{
|
||||
FT_Vector vec1, vec2;
|
||||
|
||||
if ( point+1 > limit ||
|
||||
FT_CURVE_TAG( tags[1] ) != FT_Curve_Tag_Cubic )
|
||||
goto Invalid_Outline;
|
||||
|
||||
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 <= limit)
|
||||
{
|
||||
FT_Vector vec;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* close the contour with a line segment */
|
||||
error = interface->line_to( &v_start, user );
|
||||
|
||||
Close:
|
||||
if (error) goto Exit;
|
||||
first = last+1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
Exit:
|
||||
return error;
|
||||
|
||||
Invalid_Outline:
|
||||
return -1;
|
||||
}
|
||||
#endif /* _STANDALONE_ */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct TBand_
|
||||
{
|
||||
FT_Pos min, max;
|
||||
@ -1564,12 +1804,13 @@
|
||||
int grays_raster_new( void* memory,
|
||||
FT_Raster* araster )
|
||||
{
|
||||
static FT_RasterRec_ the_raster;
|
||||
static TRaster the_raster;
|
||||
|
||||
|
||||
*araster = &the_raster;
|
||||
memset( &the_raster, sizeof ( the_raster ), 0 );
|
||||
return 0;
|
||||
UNUSED(memory);
|
||||
|
||||
*araster = (FT_Raster)&the_raster;
|
||||
memset( &the_raster, 0, sizeof(the_raster) );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user