1999-12-17 00:11:37 +01:00
|
|
|
/***************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* ftoutln.c */
|
|
|
|
/* */
|
|
|
|
/* FreeType outline management (body). */
|
|
|
|
/* */
|
2006-02-23 22:01:34 +01:00
|
|
|
/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */
|
1999-12-17 00:11:37 +01:00
|
|
|
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
|
|
|
/* */
|
2000-06-05 07:26:15 +02:00
|
|
|
/* This file is part of the FreeType project, and may only be used, */
|
|
|
|
/* modified, and distributed under the terms of the FreeType project */
|
1999-12-17 00:11:37 +01:00
|
|
|
/* 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. */
|
|
|
|
/* */
|
|
|
|
/***************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* All functions are declared in freetype.h. */
|
|
|
|
/* */
|
|
|
|
/*************************************************************************/
|
|
|
|
|
2000-12-08 17:17:16 +01:00
|
|
|
|
|
|
|
#include <ft2build.h>
|
|
|
|
#include FT_OUTLINE_H
|
|
|
|
#include FT_INTERNAL_OBJECTS_H
|
2003-10-02 23:07:10 +02:00
|
|
|
#include FT_TRIGONOMETRY_H
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-06-03 08:03:11 +02:00
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* The macro FT_COMPONENT is used in trace mode. It is an implicit */
|
|
|
|
/* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
|
|
|
|
/* messages during execution. */
|
|
|
|
/* */
|
|
|
|
#undef FT_COMPONENT
|
|
|
|
#define FT_COMPONENT trace_outline
|
|
|
|
|
|
|
|
|
2000-03-28 13:22:31 +02:00
|
|
|
static
|
|
|
|
const FT_Outline null_outline = { 0, 0, 0, 0, 0, 0 };
|
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2000-11-07 18:21:11 +01:00
|
|
|
/* documentation is in ftoutln.h */
|
|
|
|
|
2001-06-27 18:18:10 +02:00
|
|
|
FT_EXPORT_DEF( FT_Error )
|
|
|
|
FT_Outline_Decompose( FT_Outline* outline,
|
2002-04-30 08:37:52 +02:00
|
|
|
const FT_Outline_Funcs* func_interface,
|
2001-06-27 18:18:10 +02:00
|
|
|
void* user )
|
2000-05-04 19:24:54 +02:00
|
|
|
{
|
|
|
|
#undef SCALED
|
2000-06-01 17:49:28 +02:00
|
|
|
#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;
|
2000-05-04 19:24:54 +02:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
FT_Error error;
|
2000-05-04 19:24:54 +02:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
FT_Int n; /* index of contour in outline */
|
|
|
|
FT_UInt first; /* index of first point in contour */
|
2001-06-19 10:28:24 +02:00
|
|
|
FT_Int tag; /* current point's state */
|
2000-05-04 19:24:54 +02:00
|
|
|
|
2000-06-02 02:01:14 +02:00
|
|
|
FT_Int shift;
|
|
|
|
FT_Pos delta;
|
2000-05-04 19:24:54 +02:00
|
|
|
|
|
|
|
|
2002-04-30 08:37:52 +02:00
|
|
|
if ( !outline || !func_interface )
|
2000-06-02 02:01:14 +02:00
|
|
|
return FT_Err_Invalid_Argument;
|
|
|
|
|
2002-04-30 08:37:52 +02:00
|
|
|
shift = func_interface->shift;
|
|
|
|
delta = func_interface->delta;
|
2000-05-04 19:24:54 +02:00
|
|
|
first = 0;
|
|
|
|
|
|
|
|
for ( n = 0; n < outline->n_contours; n++ )
|
|
|
|
{
|
2000-06-01 17:49:28 +02:00
|
|
|
FT_Int last; /* index of last point in contour */
|
|
|
|
|
2000-05-04 19:24:54 +02:00
|
|
|
|
|
|
|
last = outline->contours[n];
|
|
|
|
limit = outline->points + last;
|
|
|
|
|
|
|
|
v_start = outline->points[first];
|
|
|
|
v_last = outline->points[last];
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
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 );
|
2000-05-04 19:24:54 +02:00
|
|
|
|
|
|
|
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! */
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( tag == FT_CURVE_TAG_CUBIC )
|
2000-05-04 19:24:54 +02:00
|
|
|
goto Invalid_Outline;
|
|
|
|
|
|
|
|
/* check first point to determine origin */
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( tag == FT_CURVE_TAG_CONIC )
|
2000-05-04 19:24:54 +02:00
|
|
|
{
|
|
|
|
/* first point is conic control. Yes, this happens. */
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
|
2000-05-04 19:24:54 +02:00
|
|
|
{
|
|
|
|
/* 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--;
|
|
|
|
}
|
|
|
|
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->move_to( &v_start, user );
|
2000-06-01 17:49:28 +02:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
2000-05-04 19:24:54 +02:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
while ( point < limit )
|
2000-05-04 19:24:54 +02:00
|
|
|
{
|
|
|
|
point++;
|
|
|
|
tags++;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-05-04 19:24:54 +02:00
|
|
|
tag = FT_CURVE_TAG( tags[0] );
|
2000-06-01 17:49:28 +02:00
|
|
|
switch ( tag )
|
2000-05-04 19:24:54 +02:00
|
|
|
{
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
case FT_CURVE_TAG_ON: /* emit a single line_to */
|
2000-06-01 17:49:28 +02:00
|
|
|
{
|
|
|
|
FT_Vector vec;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
vec.x = SCALED( point->x );
|
|
|
|
vec.y = SCALED( point->y );
|
2000-05-04 19:24:54 +02:00
|
|
|
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->line_to( &vec, user );
|
2000-06-01 17:49:28 +02:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
continue;
|
|
|
|
}
|
2000-05-17 01:44:38 +02:00
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
case FT_CURVE_TAG_CONIC: /* consume conic arcs */
|
2000-06-29 05:14:25 +02:00
|
|
|
v_control.x = SCALED( point->x );
|
|
|
|
v_control.y = SCALED( point->y );
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-29 05:14:25 +02:00
|
|
|
Do_Conic:
|
|
|
|
if ( point < limit )
|
|
|
|
{
|
|
|
|
FT_Vector vec;
|
|
|
|
FT_Vector v_middle;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
|
|
|
|
2000-06-29 05:14:25 +02:00
|
|
|
point++;
|
|
|
|
tags++;
|
|
|
|
tag = FT_CURVE_TAG( tags[0] );
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-29 05:14:25 +02:00
|
|
|
vec.x = SCALED( point->x );
|
|
|
|
vec.y = SCALED( point->y );
|
2000-05-17 01:44:38 +02:00
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( tag == FT_CURVE_TAG_ON )
|
2000-06-29 05:14:25 +02:00
|
|
|
{
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->conic_to( &v_control, &vec, user );
|
2000-06-01 17:49:28 +02:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
2000-06-29 05:14:25 +02:00
|
|
|
continue;
|
2000-05-04 19:24:54 +02:00
|
|
|
}
|
2000-05-17 01:44:38 +02:00
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( tag != FT_CURVE_TAG_CONIC )
|
2000-06-29 05:14:25 +02:00
|
|
|
goto Invalid_Outline;
|
|
|
|
|
|
|
|
v_middle.x = ( v_control.x + vec.x ) / 2;
|
|
|
|
v_middle.y = ( v_control.y + vec.y ) / 2;
|
|
|
|
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->conic_to( &v_control, &v_middle, user );
|
2000-06-29 05:14:25 +02:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
v_control = vec;
|
|
|
|
goto Do_Conic;
|
2000-06-01 17:49:28 +02:00
|
|
|
}
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->conic_to( &v_control, &v_start, user );
|
2000-06-29 05:14:25 +02:00
|
|
|
goto Close;
|
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
default: /* FT_CURVE_TAG_CUBIC */
|
2000-06-01 17:49:28 +02:00
|
|
|
{
|
|
|
|
FT_Vector vec1, vec2;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
if ( point + 1 > limit ||
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
|
2000-06-01 17:49:28 +02:00
|
|
|
goto Invalid_Outline;
|
2000-05-04 19:24:54 +02:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
point += 2;
|
|
|
|
tags += 2;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
vec1.x = SCALED( point[-2].x ); vec1.y = SCALED( point[-2].y );
|
|
|
|
vec2.x = SCALED( point[-1].x ); vec2.y = SCALED( point[-1].y );
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
if ( point <= limit )
|
|
|
|
{
|
|
|
|
FT_Vector vec;
|
|
|
|
|
|
|
|
|
|
|
|
vec.x = SCALED( point->x );
|
|
|
|
vec.y = SCALED( point->y );
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->cubic_to( &vec1, &vec2, &vec, user );
|
2000-06-01 17:49:28 +02:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
continue;
|
2000-05-04 19:24:54 +02:00
|
|
|
}
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );
|
2000-06-01 17:49:28 +02:00
|
|
|
goto Close;
|
|
|
|
}
|
2000-05-04 19:24:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* close the contour with a line segment */
|
2002-04-30 08:37:52 +02:00
|
|
|
error = func_interface->line_to( &v_start, user );
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-29 05:14:25 +02:00
|
|
|
Close:
|
2000-06-01 17:49:28 +02:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
first = last + 1;
|
2000-05-04 19:24:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2000-05-04 19:24:54 +02:00
|
|
|
Exit:
|
|
|
|
return error;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-05-04 19:24:54 +02:00
|
|
|
Invalid_Outline:
|
2000-06-01 17:49:28 +02:00
|
|
|
return FT_Err_Invalid_Outline;
|
2000-05-04 19:24:54 +02:00
|
|
|
}
|
2000-03-28 13:22:31 +02:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2001-06-27 18:18:10 +02:00
|
|
|
FT_EXPORT_DEF( FT_Error )
|
|
|
|
FT_Outline_New_Internal( FT_Memory memory,
|
|
|
|
FT_UInt numPoints,
|
|
|
|
FT_Int numContours,
|
|
|
|
FT_Outline *anoutline )
|
2000-07-07 21:47:34 +02:00
|
|
|
{
|
2000-07-08 21:51:42 +02:00
|
|
|
FT_Error error;
|
2000-07-07 21:47:34 +02:00
|
|
|
|
|
|
|
|
2000-11-07 07:30:29 +01:00
|
|
|
if ( !anoutline || !memory )
|
2000-07-07 21:47:34 +02:00
|
|
|
return FT_Err_Invalid_Argument;
|
|
|
|
|
2000-11-07 07:30:29 +01:00
|
|
|
*anoutline = null_outline;
|
2000-07-07 21:47:34 +02:00
|
|
|
|
2002-03-22 14:52:37 +01:00
|
|
|
if ( FT_NEW_ARRAY( anoutline->points, numPoints * 2L ) ||
|
|
|
|
FT_NEW_ARRAY( anoutline->tags, numPoints ) ||
|
|
|
|
FT_NEW_ARRAY( anoutline->contours, numContours ) )
|
2000-07-07 21:47:34 +02:00
|
|
|
goto Fail;
|
|
|
|
|
2000-11-07 07:30:29 +01:00
|
|
|
anoutline->n_points = (FT_UShort)numPoints;
|
|
|
|
anoutline->n_contours = (FT_Short)numContours;
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
anoutline->flags |= FT_OUTLINE_OWNER;
|
2000-07-07 21:47:34 +02:00
|
|
|
|
|
|
|
return FT_Err_Ok;
|
|
|
|
|
|
|
|
Fail:
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
anoutline->flags |= FT_OUTLINE_OWNER;
|
2000-11-07 07:30:29 +01:00
|
|
|
FT_Outline_Done_Internal( memory, anoutline );
|
2000-07-07 21:47:34 +02:00
|
|
|
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-11-07 18:21:11 +01:00
|
|
|
/* documentation is in ftoutln.h */
|
|
|
|
|
2001-06-27 18:18:10 +02:00
|
|
|
FT_EXPORT_DEF( FT_Error )
|
|
|
|
FT_Outline_New( FT_Library library,
|
|
|
|
FT_UInt numPoints,
|
|
|
|
FT_Int numContours,
|
|
|
|
FT_Outline *anoutline )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2000-07-08 21:51:42 +02:00
|
|
|
if ( !library )
|
|
|
|
return FT_Err_Invalid_Library_Handle;
|
|
|
|
|
2000-07-07 21:47:34 +02:00
|
|
|
return FT_Outline_New_Internal( library->memory, numPoints,
|
2000-11-07 07:30:29 +01:00
|
|
|
numContours, anoutline );
|
2000-03-28 13:22:31 +02:00
|
|
|
}
|
2000-07-08 21:51:42 +02:00
|
|
|
|
2000-03-28 13:22:31 +02:00
|
|
|
|
2002-01-03 17:56:59 +01:00
|
|
|
/* documentation is in ftoutln.h */
|
2002-01-03 23:06:13 +01:00
|
|
|
|
2002-01-03 17:56:59 +01:00
|
|
|
FT_EXPORT_DEF( FT_Error )
|
|
|
|
FT_Outline_Check( FT_Outline* outline )
|
|
|
|
{
|
|
|
|
if ( outline )
|
|
|
|
{
|
|
|
|
FT_Int n_points = outline->n_points;
|
|
|
|
FT_Int n_contours = outline->n_contours;
|
|
|
|
FT_Int end0, end;
|
|
|
|
FT_Int n;
|
|
|
|
|
2002-01-03 23:06:13 +01:00
|
|
|
|
|
|
|
/* empty glyph? */
|
2002-01-03 17:56:59 +01:00
|
|
|
if ( n_points == 0 && n_contours == 0 )
|
|
|
|
return 0;
|
2002-01-03 23:06:13 +01:00
|
|
|
|
2002-01-03 17:56:59 +01:00
|
|
|
/* check point and contour counts */
|
|
|
|
if ( n_points <= 0 || n_contours <= 0 )
|
|
|
|
goto Bad;
|
2002-01-03 23:06:13 +01:00
|
|
|
|
2002-01-07 11:04:09 +01:00
|
|
|
end0 = end = -1;
|
2002-01-03 17:56:59 +01:00
|
|
|
for ( n = 0; n < n_contours; n++ )
|
|
|
|
{
|
2002-01-03 23:06:13 +01:00
|
|
|
end = outline->contours[n];
|
2002-01-03 17:56:59 +01:00
|
|
|
|
|
|
|
/* note that we don't accept empty contours */
|
|
|
|
if ( end <= end0 || end >= n_points )
|
|
|
|
goto Bad;
|
|
|
|
|
|
|
|
end0 = end;
|
|
|
|
}
|
2002-01-03 23:06:13 +01:00
|
|
|
|
|
|
|
if ( end != n_points - 1 )
|
2002-01-03 17:56:59 +01:00
|
|
|
goto Bad;
|
|
|
|
|
2002-07-01 23:52:49 +02:00
|
|
|
/* XXX: check the tags array */
|
2002-01-03 17:56:59 +01:00
|
|
|
return 0;
|
|
|
|
}
|
2002-01-03 23:06:13 +01:00
|
|
|
|
2002-01-03 17:56:59 +01:00
|
|
|
Bad:
|
|
|
|
return FT_Err_Invalid_Argument;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-11-07 18:21:11 +01:00
|
|
|
/* documentation is in ftoutln.h */
|
|
|
|
|
2001-06-27 18:18:10 +02:00
|
|
|
FT_EXPORT_DEF( FT_Error )
|
2005-04-14 18:03:15 +02:00
|
|
|
FT_Outline_Copy( const FT_Outline* source,
|
|
|
|
FT_Outline *target )
|
2000-07-01 01:12:55 +02:00
|
|
|
{
|
|
|
|
FT_Int is_owner;
|
|
|
|
|
|
|
|
|
|
|
|
if ( !source || !target ||
|
|
|
|
source->n_points != target->n_points ||
|
|
|
|
source->n_contours != target->n_contours )
|
|
|
|
return FT_Err_Invalid_Argument;
|
|
|
|
|
2005-05-20 23:52:19 +02:00
|
|
|
if ( source == target )
|
|
|
|
return FT_Err_Ok;
|
|
|
|
|
2004-01-16 09:46:11 +01:00
|
|
|
FT_ARRAY_COPY( target->points, source->points, source->n_points );
|
2000-07-01 01:12:55 +02:00
|
|
|
|
2004-01-16 09:46:11 +01:00
|
|
|
FT_ARRAY_COPY( target->tags, source->tags, source->n_points );
|
2000-07-01 01:12:55 +02:00
|
|
|
|
2004-01-16 09:46:11 +01:00
|
|
|
FT_ARRAY_COPY( target->contours, source->contours, source->n_contours );
|
2000-07-01 01:12:55 +02:00
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
/* copy all flags, except the `FT_OUTLINE_OWNER' one */
|
|
|
|
is_owner = target->flags & FT_OUTLINE_OWNER;
|
2000-07-01 01:12:55 +02:00
|
|
|
target->flags = source->flags;
|
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
target->flags &= ~FT_OUTLINE_OWNER;
|
2000-07-01 01:12:55 +02:00
|
|
|
target->flags |= is_owner;
|
|
|
|
|
|
|
|
return FT_Err_Ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-27 18:18:10 +02:00
|
|
|
FT_EXPORT_DEF( FT_Error )
|
|
|
|
FT_Outline_Done_Internal( FT_Memory memory,
|
|
|
|
FT_Outline* outline )
|
2000-07-08 21:51:42 +02:00
|
|
|
{
|
2005-05-20 23:52:19 +02:00
|
|
|
if ( memory && outline )
|
2000-07-08 21:51:42 +02:00
|
|
|
{
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( outline->flags & FT_OUTLINE_OWNER )
|
2000-07-08 21:51:42 +02:00
|
|
|
{
|
2002-03-22 14:52:37 +01:00
|
|
|
FT_FREE( outline->points );
|
|
|
|
FT_FREE( outline->tags );
|
|
|
|
FT_FREE( outline->contours );
|
2000-07-08 21:51:42 +02:00
|
|
|
}
|
|
|
|
*outline = null_outline;
|
|
|
|
|
|
|
|
return FT_Err_Ok;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return FT_Err_Invalid_Argument;
|
|
|
|
}
|
|
|
|
|
2000-07-01 01:12:55 +02:00
|
|
|
|
2000-11-07 18:21:11 +01:00
|
|
|
/* documentation is in ftoutln.h */
|
|
|
|
|
2001-06-27 18:18:10 +02:00
|
|
|
FT_EXPORT_DEF( FT_Error )
|
|
|
|
FT_Outline_Done( FT_Library library,
|
|
|
|
FT_Outline* outline )
|
2000-07-07 21:47:34 +02:00
|
|
|
{
|
2000-07-08 21:51:42 +02:00
|
|
|
/* check for valid `outline' in FT_Outline_Done_Internal() */
|
|
|
|
|
|
|
|
if ( !library )
|
|
|
|
return FT_Err_Invalid_Library_Handle;
|
|
|
|
|
2000-07-07 21:47:34 +02:00
|
|
|
return FT_Outline_Done_Internal( library->memory, outline );
|
|
|
|
}
|
2000-03-28 13:22:31 +02:00
|
|
|
|
2000-07-08 21:51:42 +02:00
|
|
|
|
2000-11-07 18:21:11 +01:00
|
|
|
/* documentation is in ftoutln.h */
|
|
|
|
|
2001-06-27 18:18:10 +02:00
|
|
|
FT_EXPORT_DEF( void )
|
2005-04-14 18:03:15 +02:00
|
|
|
FT_Outline_Get_CBox( const FT_Outline* outline,
|
|
|
|
FT_BBox *acbox )
|
2000-03-28 13:22:31 +02:00
|
|
|
{
|
|
|
|
FT_Pos xMin, yMin, xMax, yMax;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2000-11-07 07:30:29 +01:00
|
|
|
if ( outline && acbox )
|
2000-03-28 13:22:31 +02:00
|
|
|
{
|
|
|
|
if ( outline->n_points == 0 )
|
|
|
|
{
|
|
|
|
xMin = 0;
|
|
|
|
yMin = 0;
|
|
|
|
xMax = 0;
|
|
|
|
yMax = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
FT_Vector* vec = outline->points;
|
|
|
|
FT_Vector* limit = vec + outline->n_points;
|
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2000-03-28 13:22:31 +02:00
|
|
|
xMin = xMax = vec->x;
|
|
|
|
yMin = yMax = vec->y;
|
|
|
|
vec++;
|
|
|
|
|
|
|
|
for ( ; vec < limit; vec++ )
|
|
|
|
{
|
|
|
|
FT_Pos x, y;
|
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2000-03-28 13:22:31 +02:00
|
|
|
x = vec->x;
|
|
|
|
if ( x < xMin ) xMin = x;
|
|
|
|
if ( x > xMax ) xMax = x;
|
|
|
|
|
|
|
|
y = vec->y;
|
|
|
|
if ( y < yMin ) yMin = y;
|
|
|
|
if ( y > yMax ) yMax = y;
|
|
|
|
}
|
|
|
|
}
|
2000-11-07 07:30:29 +01:00
|
|
|
acbox->xMin = xMin;
|
|
|
|
acbox->xMax = xMax;
|
|
|
|
acbox->yMin = yMin;
|
|
|
|
acbox->yMax = yMax;
|
2000-03-28 13:22:31 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-11-07 18:21:11 +01:00
|
|
|
/* documentation is in ftoutln.h */
|
|
|
|
|
2001-06-27 18:18:10 +02:00
|
|
|
FT_EXPORT_DEF( void )
|
2005-05-20 08:22:20 +02:00
|
|
|
FT_Outline_Translate( const FT_Outline* outline,
|
|
|
|
FT_Pos xOffset,
|
|
|
|
FT_Pos yOffset )
|
2000-03-28 13:22:31 +02:00
|
|
|
{
|
|
|
|
FT_UShort n;
|
|
|
|
FT_Vector* vec = outline->points;
|
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2005-05-20 23:52:19 +02:00
|
|
|
if ( !outline )
|
|
|
|
return;
|
|
|
|
|
2000-03-28 13:22:31 +02:00
|
|
|
for ( n = 0; n < outline->n_points; n++ )
|
|
|
|
{
|
|
|
|
vec->x += xOffset;
|
|
|
|
vec->y += yOffset;
|
|
|
|
vec++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2000-11-07 18:21:11 +01:00
|
|
|
/* documentation is in ftoutln.h */
|
|
|
|
|
2001-06-27 18:18:10 +02:00
|
|
|
FT_EXPORT_DEF( void )
|
|
|
|
FT_Outline_Reverse( FT_Outline* outline )
|
2000-03-28 13:22:31 +02:00
|
|
|
{
|
|
|
|
FT_UShort n;
|
|
|
|
FT_Int first, last;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2005-05-20 23:52:19 +02:00
|
|
|
if ( !outline )
|
|
|
|
return;
|
|
|
|
|
2000-03-28 13:22:31 +02:00
|
|
|
first = 0;
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2000-03-28 13:22:31 +02:00
|
|
|
for ( n = 0; n < outline->n_contours; n++ )
|
|
|
|
{
|
|
|
|
last = outline->contours[n];
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-03-28 13:22:31 +02:00
|
|
|
/* reverse point table */
|
|
|
|
{
|
|
|
|
FT_Vector* p = outline->points + first;
|
|
|
|
FT_Vector* q = outline->points + last;
|
|
|
|
FT_Vector swap;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
|
|
|
|
while ( p < q )
|
2000-03-28 13:22:31 +02:00
|
|
|
{
|
|
|
|
swap = *p;
|
|
|
|
*p = *q;
|
|
|
|
*q = swap;
|
|
|
|
p++;
|
|
|
|
q--;
|
|
|
|
}
|
|
|
|
}
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-03-28 13:22:31 +02:00
|
|
|
/* reverse tags table */
|
|
|
|
{
|
|
|
|
char* p = outline->tags + first;
|
|
|
|
char* q = outline->tags + last;
|
|
|
|
char swap;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-29 05:14:25 +02:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
while ( p < q )
|
2000-03-28 13:22:31 +02:00
|
|
|
{
|
|
|
|
swap = *p;
|
|
|
|
*p = *q;
|
|
|
|
*q = swap;
|
|
|
|
p++;
|
|
|
|
q--;
|
|
|
|
}
|
|
|
|
}
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
first = last + 1;
|
2000-03-28 13:22:31 +02:00
|
|
|
}
|
2000-06-01 17:49:28 +02:00
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
outline->flags ^= FT_OUTLINE_REVERSE_FILL;
|
2000-03-28 13:22:31 +02:00
|
|
|
}
|
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2000-11-07 18:21:11 +01:00
|
|
|
/* documentation is in ftoutln.h */
|
|
|
|
|
2001-06-27 18:18:10 +02:00
|
|
|
FT_EXPORT_DEF( FT_Error )
|
|
|
|
FT_Outline_Render( FT_Library library,
|
|
|
|
FT_Outline* outline,
|
|
|
|
FT_Raster_Params* params )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2000-06-29 05:14:25 +02:00
|
|
|
FT_Error error;
|
|
|
|
FT_Bool update = 0;
|
|
|
|
FT_Renderer renderer;
|
|
|
|
FT_ListNode node;
|
|
|
|
|
|
|
|
|
|
|
|
if ( !library )
|
|
|
|
return FT_Err_Invalid_Library_Handle;
|
|
|
|
|
2005-05-20 23:52:19 +02:00
|
|
|
if ( !outline || !params )
|
2000-06-29 05:14:25 +02:00
|
|
|
return FT_Err_Invalid_Argument;
|
|
|
|
|
|
|
|
renderer = library->cur_renderer;
|
|
|
|
node = library->renderers.head;
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2000-06-28 01:31:53 +02:00
|
|
|
params->source = (void*)outline;
|
2000-06-29 05:14:25 +02:00
|
|
|
|
2000-06-28 01:31:53 +02:00
|
|
|
error = FT_Err_Cannot_Render_Glyph;
|
2000-06-29 05:14:25 +02:00
|
|
|
while ( renderer )
|
- MAJOR INTERNAL REDESIGN:
A lot of internal modifications have been performed lately on the
source in order to provide the following enhancements:
- more generic module support:
The FT_Module type is now defined to represent a handle to a given
module. The file <freetype/ftmodule.h> contains the FT_Module_Class
definition, as well as the module-loading public API
The FT_Driver type is still defined, and still represents a pointer
to a font driver. Note that FT_Add_Driver is replaced by FT_Add_Module,
FT_Get_Driver by FT_Get_Module, etc..
- support for generic glyph image types:
The FT_Renderer type is a pointer to a module used to perform various
operations on glyph image.
Each renderer is capable of handling images in a single format
(e.g. ft_glyph_format_outline). Its functions are used to:
- transform an glyph image
- render a glyph image into a bitmap
- return the control box (dimensions) of a given glyph image
The scan converters "ftraster.c" and "ftgrays.c" have been moved
to the new directory "src/renderer", and are used to provide two
default renderer modules.
One corresponds to the "standard" scan-converter, the other to the
"smooth" one.
The current renderer can be set through the new function
FT_Set_Renderer.
The old raster-related function FT_Set_Raster, FT_Get_Raster and
FT_Set_Raster_Mode have now disappeared, in favor of the new:
FT_Get_Renderer
FT_Set_Renderer
see the file <freetype/ftrender.h> for more details..
These changes were necessary to properly support different scalable
formats in the future, like bi-color glyphs, etc..
- glyph loader object:
A new internal object, called a 'glyph loader' has been introduced
in the base layer. It is used by all scalable format font drivers
to load glyphs and composites.
This object has been created to reduce the code size of each driver,
as each one of them basically re-implemented its functionality.
See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for
more information..
- FT_GlyphSlot had new fields:
In order to support extended features (see below), the FT_GlyphSlot
structure has a few new fields:
linearHoriAdvance: this field gives the linearly scaled (i.e.
scaled but unhinted) advance width for the glyph,
expressed as a 16.16 fixed pixel value. This
is useful to perform WYSIWYG text.
linearVertAdvance: this field gives the linearly scaled advance
height for the glyph (relevant in vertical glyph
layouts only). This is useful to perform
WYSIWYG text.
Note that the two above field replace the removed "metrics2" field
in the glyph slot.
advance: this field is a vector that gives the transformed
advance for the glyph. By default, it corresponds
to the advance width, unless FT_LOAD_VERTICAL_LAYOUT
was specified when calling FT_Load_Glyph or FT_Load_Char
bitmap_left: this field gives the distance in integer pixels from
the current pen position to the left-most pixel of
a glyph image WHEN IT IS A BITMAP. It is only valid
when the "format" field is set to
"ft_glyph_format_bitmap", for example, after calling
the new function FT_Render_Glyph.
bitmap_top: this field gives the distance in integer pixels from
the current pen position (located on the baseline) to
the top-most pixel of the glyph image WHEN IT IS A
BITMAP. Positive values correspond to upwards Y.
loader: this is a new private field for the glyph slot. Client
applications should not touch it..
- support for transforms and direct rendering in FT_Load_Glyph:
Most of the functionality found in <freetype/ftglyph.h> has been
moved to the core library. Hence, the following:
- a transform can be specified for a face through FT_Set_Transform.
this transform is applied by FT_Load_Glyph to scalable glyph images
(i.e. NOT TO BITMAPS) before the function returns, unless the
bit flag FT_LOAD_IGNORE_TRANSFORM was set in the load flags..
- once a glyph image has been loaded, it can be directly converted to
a bitmap by using the new FT_Render_Glyph function. Note that this
function takes the glyph image from the glyph slot, and converts
it to a bitmap whose properties are returned in "face.glyph.bitmap",
"face.glyph.bitmap_left" and "face.glyph.bitmap_top". The original
native image might be lost after the conversion.
- when using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph
and FT_Load_Char functions will call FT_Render_Glyph automatically
when needed.
2000-06-22 02:17:42 +02:00
|
|
|
{
|
2000-06-28 01:31:53 +02:00
|
|
|
error = renderer->raster_render( renderer->raster, params );
|
2001-06-08 23:17:29 +02:00
|
|
|
if ( !error || FT_ERROR_BASE( error ) != FT_Err_Cannot_Render_Glyph )
|
2000-06-29 05:14:25 +02:00
|
|
|
break;
|
2000-06-28 01:31:53 +02:00
|
|
|
|
2000-07-09 21:15:30 +02:00
|
|
|
/* FT_Err_Cannot_Render_Glyph is returned if the render mode */
|
2000-06-28 01:31:53 +02:00
|
|
|
/* is unsupported by the current renderer for this glyph image */
|
2000-06-29 05:14:25 +02:00
|
|
|
/* format */
|
|
|
|
|
|
|
|
/* now, look for another renderer that supports the same */
|
|
|
|
/* format */
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE,
|
2000-06-29 05:14:25 +02:00
|
|
|
&node );
|
2000-06-28 01:31:53 +02:00
|
|
|
update = 1;
|
- MAJOR INTERNAL REDESIGN:
A lot of internal modifications have been performed lately on the
source in order to provide the following enhancements:
- more generic module support:
The FT_Module type is now defined to represent a handle to a given
module. The file <freetype/ftmodule.h> contains the FT_Module_Class
definition, as well as the module-loading public API
The FT_Driver type is still defined, and still represents a pointer
to a font driver. Note that FT_Add_Driver is replaced by FT_Add_Module,
FT_Get_Driver by FT_Get_Module, etc..
- support for generic glyph image types:
The FT_Renderer type is a pointer to a module used to perform various
operations on glyph image.
Each renderer is capable of handling images in a single format
(e.g. ft_glyph_format_outline). Its functions are used to:
- transform an glyph image
- render a glyph image into a bitmap
- return the control box (dimensions) of a given glyph image
The scan converters "ftraster.c" and "ftgrays.c" have been moved
to the new directory "src/renderer", and are used to provide two
default renderer modules.
One corresponds to the "standard" scan-converter, the other to the
"smooth" one.
The current renderer can be set through the new function
FT_Set_Renderer.
The old raster-related function FT_Set_Raster, FT_Get_Raster and
FT_Set_Raster_Mode have now disappeared, in favor of the new:
FT_Get_Renderer
FT_Set_Renderer
see the file <freetype/ftrender.h> for more details..
These changes were necessary to properly support different scalable
formats in the future, like bi-color glyphs, etc..
- glyph loader object:
A new internal object, called a 'glyph loader' has been introduced
in the base layer. It is used by all scalable format font drivers
to load glyphs and composites.
This object has been created to reduce the code size of each driver,
as each one of them basically re-implemented its functionality.
See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for
more information..
- FT_GlyphSlot had new fields:
In order to support extended features (see below), the FT_GlyphSlot
structure has a few new fields:
linearHoriAdvance: this field gives the linearly scaled (i.e.
scaled but unhinted) advance width for the glyph,
expressed as a 16.16 fixed pixel value. This
is useful to perform WYSIWYG text.
linearVertAdvance: this field gives the linearly scaled advance
height for the glyph (relevant in vertical glyph
layouts only). This is useful to perform
WYSIWYG text.
Note that the two above field replace the removed "metrics2" field
in the glyph slot.
advance: this field is a vector that gives the transformed
advance for the glyph. By default, it corresponds
to the advance width, unless FT_LOAD_VERTICAL_LAYOUT
was specified when calling FT_Load_Glyph or FT_Load_Char
bitmap_left: this field gives the distance in integer pixels from
the current pen position to the left-most pixel of
a glyph image WHEN IT IS A BITMAP. It is only valid
when the "format" field is set to
"ft_glyph_format_bitmap", for example, after calling
the new function FT_Render_Glyph.
bitmap_top: this field gives the distance in integer pixels from
the current pen position (located on the baseline) to
the top-most pixel of the glyph image WHEN IT IS A
BITMAP. Positive values correspond to upwards Y.
loader: this is a new private field for the glyph slot. Client
applications should not touch it..
- support for transforms and direct rendering in FT_Load_Glyph:
Most of the functionality found in <freetype/ftglyph.h> has been
moved to the core library. Hence, the following:
- a transform can be specified for a face through FT_Set_Transform.
this transform is applied by FT_Load_Glyph to scalable glyph images
(i.e. NOT TO BITMAPS) before the function returns, unless the
bit flag FT_LOAD_IGNORE_TRANSFORM was set in the load flags..
- once a glyph image has been loaded, it can be directly converted to
a bitmap by using the new FT_Render_Glyph function. Note that this
function takes the glyph image from the glyph slot, and converts
it to a bitmap whose properties are returned in "face.glyph.bitmap",
"face.glyph.bitmap_left" and "face.glyph.bitmap_top". The original
native image might be lost after the conversion.
- when using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph
and FT_Load_Char functions will call FT_Render_Glyph automatically
when needed.
2000-06-22 02:17:42 +02:00
|
|
|
}
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-28 01:31:53 +02:00
|
|
|
/* if we changed the current renderer for the glyph image format */
|
2000-06-29 05:14:25 +02:00
|
|
|
/* we need to select it as the next current one */
|
|
|
|
if ( !error && update && renderer )
|
2000-06-28 01:31:53 +02:00
|
|
|
FT_Set_Renderer( library, renderer, 0, 0 );
|
2000-06-29 05:14:25 +02:00
|
|
|
|
2000-03-28 13:22:31 +02:00
|
|
|
return error;
|
|
|
|
}
|
2000-01-10 18:19:45 +01:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2000-11-07 18:21:11 +01:00
|
|
|
/* documentation is in ftoutln.h */
|
|
|
|
|
2001-06-27 18:18:10 +02:00
|
|
|
FT_EXPORT_DEF( FT_Error )
|
2005-04-14 18:03:15 +02:00
|
|
|
FT_Outline_Get_Bitmap( FT_Library library,
|
|
|
|
FT_Outline* outline,
|
|
|
|
const FT_Bitmap *abitmap )
|
2000-05-17 01:44:38 +02:00
|
|
|
{
|
- MAJOR INTERNAL REDESIGN:
A lot of internal modifications have been performed lately on the
source in order to provide the following enhancements:
- more generic module support:
The FT_Module type is now defined to represent a handle to a given
module. The file <freetype/ftmodule.h> contains the FT_Module_Class
definition, as well as the module-loading public API
The FT_Driver type is still defined, and still represents a pointer
to a font driver. Note that FT_Add_Driver is replaced by FT_Add_Module,
FT_Get_Driver by FT_Get_Module, etc..
- support for generic glyph image types:
The FT_Renderer type is a pointer to a module used to perform various
operations on glyph image.
Each renderer is capable of handling images in a single format
(e.g. ft_glyph_format_outline). Its functions are used to:
- transform an glyph image
- render a glyph image into a bitmap
- return the control box (dimensions) of a given glyph image
The scan converters "ftraster.c" and "ftgrays.c" have been moved
to the new directory "src/renderer", and are used to provide two
default renderer modules.
One corresponds to the "standard" scan-converter, the other to the
"smooth" one.
The current renderer can be set through the new function
FT_Set_Renderer.
The old raster-related function FT_Set_Raster, FT_Get_Raster and
FT_Set_Raster_Mode have now disappeared, in favor of the new:
FT_Get_Renderer
FT_Set_Renderer
see the file <freetype/ftrender.h> for more details..
These changes were necessary to properly support different scalable
formats in the future, like bi-color glyphs, etc..
- glyph loader object:
A new internal object, called a 'glyph loader' has been introduced
in the base layer. It is used by all scalable format font drivers
to load glyphs and composites.
This object has been created to reduce the code size of each driver,
as each one of them basically re-implemented its functionality.
See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for
more information..
- FT_GlyphSlot had new fields:
In order to support extended features (see below), the FT_GlyphSlot
structure has a few new fields:
linearHoriAdvance: this field gives the linearly scaled (i.e.
scaled but unhinted) advance width for the glyph,
expressed as a 16.16 fixed pixel value. This
is useful to perform WYSIWYG text.
linearVertAdvance: this field gives the linearly scaled advance
height for the glyph (relevant in vertical glyph
layouts only). This is useful to perform
WYSIWYG text.
Note that the two above field replace the removed "metrics2" field
in the glyph slot.
advance: this field is a vector that gives the transformed
advance for the glyph. By default, it corresponds
to the advance width, unless FT_LOAD_VERTICAL_LAYOUT
was specified when calling FT_Load_Glyph or FT_Load_Char
bitmap_left: this field gives the distance in integer pixels from
the current pen position to the left-most pixel of
a glyph image WHEN IT IS A BITMAP. It is only valid
when the "format" field is set to
"ft_glyph_format_bitmap", for example, after calling
the new function FT_Render_Glyph.
bitmap_top: this field gives the distance in integer pixels from
the current pen position (located on the baseline) to
the top-most pixel of the glyph image WHEN IT IS A
BITMAP. Positive values correspond to upwards Y.
loader: this is a new private field for the glyph slot. Client
applications should not touch it..
- support for transforms and direct rendering in FT_Load_Glyph:
Most of the functionality found in <freetype/ftglyph.h> has been
moved to the core library. Hence, the following:
- a transform can be specified for a face through FT_Set_Transform.
this transform is applied by FT_Load_Glyph to scalable glyph images
(i.e. NOT TO BITMAPS) before the function returns, unless the
bit flag FT_LOAD_IGNORE_TRANSFORM was set in the load flags..
- once a glyph image has been loaded, it can be directly converted to
a bitmap by using the new FT_Render_Glyph function. Note that this
function takes the glyph image from the glyph slot, and converts
it to a bitmap whose properties are returned in "face.glyph.bitmap",
"face.glyph.bitmap_left" and "face.glyph.bitmap_top". The original
native image might be lost after the conversion.
- when using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph
and FT_Load_Char functions will call FT_Render_Glyph automatically
when needed.
2000-06-22 02:17:42 +02:00
|
|
|
FT_Raster_Params params;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2000-11-07 07:30:29 +01:00
|
|
|
if ( !abitmap )
|
- MAJOR INTERNAL REDESIGN:
A lot of internal modifications have been performed lately on the
source in order to provide the following enhancements:
- more generic module support:
The FT_Module type is now defined to represent a handle to a given
module. The file <freetype/ftmodule.h> contains the FT_Module_Class
definition, as well as the module-loading public API
The FT_Driver type is still defined, and still represents a pointer
to a font driver. Note that FT_Add_Driver is replaced by FT_Add_Module,
FT_Get_Driver by FT_Get_Module, etc..
- support for generic glyph image types:
The FT_Renderer type is a pointer to a module used to perform various
operations on glyph image.
Each renderer is capable of handling images in a single format
(e.g. ft_glyph_format_outline). Its functions are used to:
- transform an glyph image
- render a glyph image into a bitmap
- return the control box (dimensions) of a given glyph image
The scan converters "ftraster.c" and "ftgrays.c" have been moved
to the new directory "src/renderer", and are used to provide two
default renderer modules.
One corresponds to the "standard" scan-converter, the other to the
"smooth" one.
The current renderer can be set through the new function
FT_Set_Renderer.
The old raster-related function FT_Set_Raster, FT_Get_Raster and
FT_Set_Raster_Mode have now disappeared, in favor of the new:
FT_Get_Renderer
FT_Set_Renderer
see the file <freetype/ftrender.h> for more details..
These changes were necessary to properly support different scalable
formats in the future, like bi-color glyphs, etc..
- glyph loader object:
A new internal object, called a 'glyph loader' has been introduced
in the base layer. It is used by all scalable format font drivers
to load glyphs and composites.
This object has been created to reduce the code size of each driver,
as each one of them basically re-implemented its functionality.
See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for
more information..
- FT_GlyphSlot had new fields:
In order to support extended features (see below), the FT_GlyphSlot
structure has a few new fields:
linearHoriAdvance: this field gives the linearly scaled (i.e.
scaled but unhinted) advance width for the glyph,
expressed as a 16.16 fixed pixel value. This
is useful to perform WYSIWYG text.
linearVertAdvance: this field gives the linearly scaled advance
height for the glyph (relevant in vertical glyph
layouts only). This is useful to perform
WYSIWYG text.
Note that the two above field replace the removed "metrics2" field
in the glyph slot.
advance: this field is a vector that gives the transformed
advance for the glyph. By default, it corresponds
to the advance width, unless FT_LOAD_VERTICAL_LAYOUT
was specified when calling FT_Load_Glyph or FT_Load_Char
bitmap_left: this field gives the distance in integer pixels from
the current pen position to the left-most pixel of
a glyph image WHEN IT IS A BITMAP. It is only valid
when the "format" field is set to
"ft_glyph_format_bitmap", for example, after calling
the new function FT_Render_Glyph.
bitmap_top: this field gives the distance in integer pixels from
the current pen position (located on the baseline) to
the top-most pixel of the glyph image WHEN IT IS A
BITMAP. Positive values correspond to upwards Y.
loader: this is a new private field for the glyph slot. Client
applications should not touch it..
- support for transforms and direct rendering in FT_Load_Glyph:
Most of the functionality found in <freetype/ftglyph.h> has been
moved to the core library. Hence, the following:
- a transform can be specified for a face through FT_Set_Transform.
this transform is applied by FT_Load_Glyph to scalable glyph images
(i.e. NOT TO BITMAPS) before the function returns, unless the
bit flag FT_LOAD_IGNORE_TRANSFORM was set in the load flags..
- once a glyph image has been loaded, it can be directly converted to
a bitmap by using the new FT_Render_Glyph function. Note that this
function takes the glyph image from the glyph slot, and converts
it to a bitmap whose properties are returned in "face.glyph.bitmap",
"face.glyph.bitmap_left" and "face.glyph.bitmap_top". The original
native image might be lost after the conversion.
- when using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph
and FT_Load_Char functions will call FT_Render_Glyph automatically
when needed.
2000-06-22 02:17:42 +02:00
|
|
|
return FT_Err_Invalid_Argument;
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2000-06-29 05:14:25 +02:00
|
|
|
/* other checks are delayed to FT_Outline_Render() */
|
2000-06-02 02:01:14 +02:00
|
|
|
|
2000-11-07 07:30:29 +01:00
|
|
|
params.target = abitmap;
|
- MAJOR INTERNAL REDESIGN:
A lot of internal modifications have been performed lately on the
source in order to provide the following enhancements:
- more generic module support:
The FT_Module type is now defined to represent a handle to a given
module. The file <freetype/ftmodule.h> contains the FT_Module_Class
definition, as well as the module-loading public API
The FT_Driver type is still defined, and still represents a pointer
to a font driver. Note that FT_Add_Driver is replaced by FT_Add_Module,
FT_Get_Driver by FT_Get_Module, etc..
- support for generic glyph image types:
The FT_Renderer type is a pointer to a module used to perform various
operations on glyph image.
Each renderer is capable of handling images in a single format
(e.g. ft_glyph_format_outline). Its functions are used to:
- transform an glyph image
- render a glyph image into a bitmap
- return the control box (dimensions) of a given glyph image
The scan converters "ftraster.c" and "ftgrays.c" have been moved
to the new directory "src/renderer", and are used to provide two
default renderer modules.
One corresponds to the "standard" scan-converter, the other to the
"smooth" one.
The current renderer can be set through the new function
FT_Set_Renderer.
The old raster-related function FT_Set_Raster, FT_Get_Raster and
FT_Set_Raster_Mode have now disappeared, in favor of the new:
FT_Get_Renderer
FT_Set_Renderer
see the file <freetype/ftrender.h> for more details..
These changes were necessary to properly support different scalable
formats in the future, like bi-color glyphs, etc..
- glyph loader object:
A new internal object, called a 'glyph loader' has been introduced
in the base layer. It is used by all scalable format font drivers
to load glyphs and composites.
This object has been created to reduce the code size of each driver,
as each one of them basically re-implemented its functionality.
See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for
more information..
- FT_GlyphSlot had new fields:
In order to support extended features (see below), the FT_GlyphSlot
structure has a few new fields:
linearHoriAdvance: this field gives the linearly scaled (i.e.
scaled but unhinted) advance width for the glyph,
expressed as a 16.16 fixed pixel value. This
is useful to perform WYSIWYG text.
linearVertAdvance: this field gives the linearly scaled advance
height for the glyph (relevant in vertical glyph
layouts only). This is useful to perform
WYSIWYG text.
Note that the two above field replace the removed "metrics2" field
in the glyph slot.
advance: this field is a vector that gives the transformed
advance for the glyph. By default, it corresponds
to the advance width, unless FT_LOAD_VERTICAL_LAYOUT
was specified when calling FT_Load_Glyph or FT_Load_Char
bitmap_left: this field gives the distance in integer pixels from
the current pen position to the left-most pixel of
a glyph image WHEN IT IS A BITMAP. It is only valid
when the "format" field is set to
"ft_glyph_format_bitmap", for example, after calling
the new function FT_Render_Glyph.
bitmap_top: this field gives the distance in integer pixels from
the current pen position (located on the baseline) to
the top-most pixel of the glyph image WHEN IT IS A
BITMAP. Positive values correspond to upwards Y.
loader: this is a new private field for the glyph slot. Client
applications should not touch it..
- support for transforms and direct rendering in FT_Load_Glyph:
Most of the functionality found in <freetype/ftglyph.h> has been
moved to the core library. Hence, the following:
- a transform can be specified for a face through FT_Set_Transform.
this transform is applied by FT_Load_Glyph to scalable glyph images
(i.e. NOT TO BITMAPS) before the function returns, unless the
bit flag FT_LOAD_IGNORE_TRANSFORM was set in the load flags..
- once a glyph image has been loaded, it can be directly converted to
a bitmap by using the new FT_Render_Glyph function. Note that this
function takes the glyph image from the glyph slot, and converts
it to a bitmap whose properties are returned in "face.glyph.bitmap",
"face.glyph.bitmap_left" and "face.glyph.bitmap_top". The original
native image might be lost after the conversion.
- when using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph
and FT_Load_Char functions will call FT_Render_Glyph automatically
when needed.
2000-06-22 02:17:42 +02:00
|
|
|
params.flags = 0;
|
2000-06-02 02:01:14 +02:00
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY ||
|
|
|
|
abitmap->pixel_mode == FT_PIXEL_MODE_LCD ||
|
|
|
|
abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V )
|
|
|
|
params.flags |= FT_RASTER_FLAG_AA;
|
2000-03-28 13:22:31 +02:00
|
|
|
|
- MAJOR INTERNAL REDESIGN:
A lot of internal modifications have been performed lately on the
source in order to provide the following enhancements:
- more generic module support:
The FT_Module type is now defined to represent a handle to a given
module. The file <freetype/ftmodule.h> contains the FT_Module_Class
definition, as well as the module-loading public API
The FT_Driver type is still defined, and still represents a pointer
to a font driver. Note that FT_Add_Driver is replaced by FT_Add_Module,
FT_Get_Driver by FT_Get_Module, etc..
- support for generic glyph image types:
The FT_Renderer type is a pointer to a module used to perform various
operations on glyph image.
Each renderer is capable of handling images in a single format
(e.g. ft_glyph_format_outline). Its functions are used to:
- transform an glyph image
- render a glyph image into a bitmap
- return the control box (dimensions) of a given glyph image
The scan converters "ftraster.c" and "ftgrays.c" have been moved
to the new directory "src/renderer", and are used to provide two
default renderer modules.
One corresponds to the "standard" scan-converter, the other to the
"smooth" one.
The current renderer can be set through the new function
FT_Set_Renderer.
The old raster-related function FT_Set_Raster, FT_Get_Raster and
FT_Set_Raster_Mode have now disappeared, in favor of the new:
FT_Get_Renderer
FT_Set_Renderer
see the file <freetype/ftrender.h> for more details..
These changes were necessary to properly support different scalable
formats in the future, like bi-color glyphs, etc..
- glyph loader object:
A new internal object, called a 'glyph loader' has been introduced
in the base layer. It is used by all scalable format font drivers
to load glyphs and composites.
This object has been created to reduce the code size of each driver,
as each one of them basically re-implemented its functionality.
See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for
more information..
- FT_GlyphSlot had new fields:
In order to support extended features (see below), the FT_GlyphSlot
structure has a few new fields:
linearHoriAdvance: this field gives the linearly scaled (i.e.
scaled but unhinted) advance width for the glyph,
expressed as a 16.16 fixed pixel value. This
is useful to perform WYSIWYG text.
linearVertAdvance: this field gives the linearly scaled advance
height for the glyph (relevant in vertical glyph
layouts only). This is useful to perform
WYSIWYG text.
Note that the two above field replace the removed "metrics2" field
in the glyph slot.
advance: this field is a vector that gives the transformed
advance for the glyph. By default, it corresponds
to the advance width, unless FT_LOAD_VERTICAL_LAYOUT
was specified when calling FT_Load_Glyph or FT_Load_Char
bitmap_left: this field gives the distance in integer pixels from
the current pen position to the left-most pixel of
a glyph image WHEN IT IS A BITMAP. It is only valid
when the "format" field is set to
"ft_glyph_format_bitmap", for example, after calling
the new function FT_Render_Glyph.
bitmap_top: this field gives the distance in integer pixels from
the current pen position (located on the baseline) to
the top-most pixel of the glyph image WHEN IT IS A
BITMAP. Positive values correspond to upwards Y.
loader: this is a new private field for the glyph slot. Client
applications should not touch it..
- support for transforms and direct rendering in FT_Load_Glyph:
Most of the functionality found in <freetype/ftglyph.h> has been
moved to the core library. Hence, the following:
- a transform can be specified for a face through FT_Set_Transform.
this transform is applied by FT_Load_Glyph to scalable glyph images
(i.e. NOT TO BITMAPS) before the function returns, unless the
bit flag FT_LOAD_IGNORE_TRANSFORM was set in the load flags..
- once a glyph image has been loaded, it can be directly converted to
a bitmap by using the new FT_Render_Glyph function. Note that this
function takes the glyph image from the glyph slot, and converts
it to a bitmap whose properties are returned in "face.glyph.bitmap",
"face.glyph.bitmap_left" and "face.glyph.bitmap_top". The original
native image might be lost after the conversion.
- when using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph
and FT_Load_Char functions will call FT_Render_Glyph automatically
when needed.
2000-06-22 02:17:42 +02:00
|
|
|
return FT_Outline_Render( library, outline, ¶ms );
|
|
|
|
}
|
2000-06-01 17:49:28 +02:00
|
|
|
|
- MAJOR INTERNAL REDESIGN:
A lot of internal modifications have been performed lately on the
source in order to provide the following enhancements:
- more generic module support:
The FT_Module type is now defined to represent a handle to a given
module. The file <freetype/ftmodule.h> contains the FT_Module_Class
definition, as well as the module-loading public API
The FT_Driver type is still defined, and still represents a pointer
to a font driver. Note that FT_Add_Driver is replaced by FT_Add_Module,
FT_Get_Driver by FT_Get_Module, etc..
- support for generic glyph image types:
The FT_Renderer type is a pointer to a module used to perform various
operations on glyph image.
Each renderer is capable of handling images in a single format
(e.g. ft_glyph_format_outline). Its functions are used to:
- transform an glyph image
- render a glyph image into a bitmap
- return the control box (dimensions) of a given glyph image
The scan converters "ftraster.c" and "ftgrays.c" have been moved
to the new directory "src/renderer", and are used to provide two
default renderer modules.
One corresponds to the "standard" scan-converter, the other to the
"smooth" one.
The current renderer can be set through the new function
FT_Set_Renderer.
The old raster-related function FT_Set_Raster, FT_Get_Raster and
FT_Set_Raster_Mode have now disappeared, in favor of the new:
FT_Get_Renderer
FT_Set_Renderer
see the file <freetype/ftrender.h> for more details..
These changes were necessary to properly support different scalable
formats in the future, like bi-color glyphs, etc..
- glyph loader object:
A new internal object, called a 'glyph loader' has been introduced
in the base layer. It is used by all scalable format font drivers
to load glyphs and composites.
This object has been created to reduce the code size of each driver,
as each one of them basically re-implemented its functionality.
See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for
more information..
- FT_GlyphSlot had new fields:
In order to support extended features (see below), the FT_GlyphSlot
structure has a few new fields:
linearHoriAdvance: this field gives the linearly scaled (i.e.
scaled but unhinted) advance width for the glyph,
expressed as a 16.16 fixed pixel value. This
is useful to perform WYSIWYG text.
linearVertAdvance: this field gives the linearly scaled advance
height for the glyph (relevant in vertical glyph
layouts only). This is useful to perform
WYSIWYG text.
Note that the two above field replace the removed "metrics2" field
in the glyph slot.
advance: this field is a vector that gives the transformed
advance for the glyph. By default, it corresponds
to the advance width, unless FT_LOAD_VERTICAL_LAYOUT
was specified when calling FT_Load_Glyph or FT_Load_Char
bitmap_left: this field gives the distance in integer pixels from
the current pen position to the left-most pixel of
a glyph image WHEN IT IS A BITMAP. It is only valid
when the "format" field is set to
"ft_glyph_format_bitmap", for example, after calling
the new function FT_Render_Glyph.
bitmap_top: this field gives the distance in integer pixels from
the current pen position (located on the baseline) to
the top-most pixel of the glyph image WHEN IT IS A
BITMAP. Positive values correspond to upwards Y.
loader: this is a new private field for the glyph slot. Client
applications should not touch it..
- support for transforms and direct rendering in FT_Load_Glyph:
Most of the functionality found in <freetype/ftglyph.h> has been
moved to the core library. Hence, the following:
- a transform can be specified for a face through FT_Set_Transform.
this transform is applied by FT_Load_Glyph to scalable glyph images
(i.e. NOT TO BITMAPS) before the function returns, unless the
bit flag FT_LOAD_IGNORE_TRANSFORM was set in the load flags..
- once a glyph image has been loaded, it can be directly converted to
a bitmap by using the new FT_Render_Glyph function. Note that this
function takes the glyph image from the glyph slot, and converts
it to a bitmap whose properties are returned in "face.glyph.bitmap",
"face.glyph.bitmap_left" and "face.glyph.bitmap_top". The original
native image might be lost after the conversion.
- when using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph
and FT_Load_Char functions will call FT_Render_Glyph automatically
when needed.
2000-06-22 02:17:42 +02:00
|
|
|
|
2000-11-07 18:21:11 +01:00
|
|
|
/* documentation is in ftoutln.h */
|
|
|
|
|
2001-06-27 18:18:10 +02:00
|
|
|
FT_EXPORT_DEF( void )
|
2005-04-14 18:03:15 +02:00
|
|
|
FT_Vector_Transform( FT_Vector* vector,
|
|
|
|
const FT_Matrix* matrix )
|
- MAJOR INTERNAL REDESIGN:
A lot of internal modifications have been performed lately on the
source in order to provide the following enhancements:
- more generic module support:
The FT_Module type is now defined to represent a handle to a given
module. The file <freetype/ftmodule.h> contains the FT_Module_Class
definition, as well as the module-loading public API
The FT_Driver type is still defined, and still represents a pointer
to a font driver. Note that FT_Add_Driver is replaced by FT_Add_Module,
FT_Get_Driver by FT_Get_Module, etc..
- support for generic glyph image types:
The FT_Renderer type is a pointer to a module used to perform various
operations on glyph image.
Each renderer is capable of handling images in a single format
(e.g. ft_glyph_format_outline). Its functions are used to:
- transform an glyph image
- render a glyph image into a bitmap
- return the control box (dimensions) of a given glyph image
The scan converters "ftraster.c" and "ftgrays.c" have been moved
to the new directory "src/renderer", and are used to provide two
default renderer modules.
One corresponds to the "standard" scan-converter, the other to the
"smooth" one.
The current renderer can be set through the new function
FT_Set_Renderer.
The old raster-related function FT_Set_Raster, FT_Get_Raster and
FT_Set_Raster_Mode have now disappeared, in favor of the new:
FT_Get_Renderer
FT_Set_Renderer
see the file <freetype/ftrender.h> for more details..
These changes were necessary to properly support different scalable
formats in the future, like bi-color glyphs, etc..
- glyph loader object:
A new internal object, called a 'glyph loader' has been introduced
in the base layer. It is used by all scalable format font drivers
to load glyphs and composites.
This object has been created to reduce the code size of each driver,
as each one of them basically re-implemented its functionality.
See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for
more information..
- FT_GlyphSlot had new fields:
In order to support extended features (see below), the FT_GlyphSlot
structure has a few new fields:
linearHoriAdvance: this field gives the linearly scaled (i.e.
scaled but unhinted) advance width for the glyph,
expressed as a 16.16 fixed pixel value. This
is useful to perform WYSIWYG text.
linearVertAdvance: this field gives the linearly scaled advance
height for the glyph (relevant in vertical glyph
layouts only). This is useful to perform
WYSIWYG text.
Note that the two above field replace the removed "metrics2" field
in the glyph slot.
advance: this field is a vector that gives the transformed
advance for the glyph. By default, it corresponds
to the advance width, unless FT_LOAD_VERTICAL_LAYOUT
was specified when calling FT_Load_Glyph or FT_Load_Char
bitmap_left: this field gives the distance in integer pixels from
the current pen position to the left-most pixel of
a glyph image WHEN IT IS A BITMAP. It is only valid
when the "format" field is set to
"ft_glyph_format_bitmap", for example, after calling
the new function FT_Render_Glyph.
bitmap_top: this field gives the distance in integer pixels from
the current pen position (located on the baseline) to
the top-most pixel of the glyph image WHEN IT IS A
BITMAP. Positive values correspond to upwards Y.
loader: this is a new private field for the glyph slot. Client
applications should not touch it..
- support for transforms and direct rendering in FT_Load_Glyph:
Most of the functionality found in <freetype/ftglyph.h> has been
moved to the core library. Hence, the following:
- a transform can be specified for a face through FT_Set_Transform.
this transform is applied by FT_Load_Glyph to scalable glyph images
(i.e. NOT TO BITMAPS) before the function returns, unless the
bit flag FT_LOAD_IGNORE_TRANSFORM was set in the load flags..
- once a glyph image has been loaded, it can be directly converted to
a bitmap by using the new FT_Render_Glyph function. Note that this
function takes the glyph image from the glyph slot, and converts
it to a bitmap whose properties are returned in "face.glyph.bitmap",
"face.glyph.bitmap_left" and "face.glyph.bitmap_top". The original
native image might be lost after the conversion.
- when using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph
and FT_Load_Char functions will call FT_Render_Glyph automatically
when needed.
2000-06-22 02:17:42 +02:00
|
|
|
{
|
|
|
|
FT_Pos xz, yz;
|
|
|
|
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2000-06-29 05:14:25 +02:00
|
|
|
if ( !vector || !matrix )
|
|
|
|
return;
|
|
|
|
|
- MAJOR INTERNAL REDESIGN:
A lot of internal modifications have been performed lately on the
source in order to provide the following enhancements:
- more generic module support:
The FT_Module type is now defined to represent a handle to a given
module. The file <freetype/ftmodule.h> contains the FT_Module_Class
definition, as well as the module-loading public API
The FT_Driver type is still defined, and still represents a pointer
to a font driver. Note that FT_Add_Driver is replaced by FT_Add_Module,
FT_Get_Driver by FT_Get_Module, etc..
- support for generic glyph image types:
The FT_Renderer type is a pointer to a module used to perform various
operations on glyph image.
Each renderer is capable of handling images in a single format
(e.g. ft_glyph_format_outline). Its functions are used to:
- transform an glyph image
- render a glyph image into a bitmap
- return the control box (dimensions) of a given glyph image
The scan converters "ftraster.c" and "ftgrays.c" have been moved
to the new directory "src/renderer", and are used to provide two
default renderer modules.
One corresponds to the "standard" scan-converter, the other to the
"smooth" one.
The current renderer can be set through the new function
FT_Set_Renderer.
The old raster-related function FT_Set_Raster, FT_Get_Raster and
FT_Set_Raster_Mode have now disappeared, in favor of the new:
FT_Get_Renderer
FT_Set_Renderer
see the file <freetype/ftrender.h> for more details..
These changes were necessary to properly support different scalable
formats in the future, like bi-color glyphs, etc..
- glyph loader object:
A new internal object, called a 'glyph loader' has been introduced
in the base layer. It is used by all scalable format font drivers
to load glyphs and composites.
This object has been created to reduce the code size of each driver,
as each one of them basically re-implemented its functionality.
See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for
more information..
- FT_GlyphSlot had new fields:
In order to support extended features (see below), the FT_GlyphSlot
structure has a few new fields:
linearHoriAdvance: this field gives the linearly scaled (i.e.
scaled but unhinted) advance width for the glyph,
expressed as a 16.16 fixed pixel value. This
is useful to perform WYSIWYG text.
linearVertAdvance: this field gives the linearly scaled advance
height for the glyph (relevant in vertical glyph
layouts only). This is useful to perform
WYSIWYG text.
Note that the two above field replace the removed "metrics2" field
in the glyph slot.
advance: this field is a vector that gives the transformed
advance for the glyph. By default, it corresponds
to the advance width, unless FT_LOAD_VERTICAL_LAYOUT
was specified when calling FT_Load_Glyph or FT_Load_Char
bitmap_left: this field gives the distance in integer pixels from
the current pen position to the left-most pixel of
a glyph image WHEN IT IS A BITMAP. It is only valid
when the "format" field is set to
"ft_glyph_format_bitmap", for example, after calling
the new function FT_Render_Glyph.
bitmap_top: this field gives the distance in integer pixels from
the current pen position (located on the baseline) to
the top-most pixel of the glyph image WHEN IT IS A
BITMAP. Positive values correspond to upwards Y.
loader: this is a new private field for the glyph slot. Client
applications should not touch it..
- support for transforms and direct rendering in FT_Load_Glyph:
Most of the functionality found in <freetype/ftglyph.h> has been
moved to the core library. Hence, the following:
- a transform can be specified for a face through FT_Set_Transform.
this transform is applied by FT_Load_Glyph to scalable glyph images
(i.e. NOT TO BITMAPS) before the function returns, unless the
bit flag FT_LOAD_IGNORE_TRANSFORM was set in the load flags..
- once a glyph image has been loaded, it can be directly converted to
a bitmap by using the new FT_Render_Glyph function. Note that this
function takes the glyph image from the glyph slot, and converts
it to a bitmap whose properties are returned in "face.glyph.bitmap",
"face.glyph.bitmap_left" and "face.glyph.bitmap_top". The original
native image might be lost after the conversion.
- when using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph
and FT_Load_Char functions will call FT_Render_Glyph automatically
when needed.
2000-06-22 02:17:42 +02:00
|
|
|
xz = FT_MulFix( vector->x, matrix->xx ) +
|
2002-06-26 22:30:37 +02:00
|
|
|
FT_MulFix( vector->y, matrix->xy );
|
- MAJOR INTERNAL REDESIGN:
A lot of internal modifications have been performed lately on the
source in order to provide the following enhancements:
- more generic module support:
The FT_Module type is now defined to represent a handle to a given
module. The file <freetype/ftmodule.h> contains the FT_Module_Class
definition, as well as the module-loading public API
The FT_Driver type is still defined, and still represents a pointer
to a font driver. Note that FT_Add_Driver is replaced by FT_Add_Module,
FT_Get_Driver by FT_Get_Module, etc..
- support for generic glyph image types:
The FT_Renderer type is a pointer to a module used to perform various
operations on glyph image.
Each renderer is capable of handling images in a single format
(e.g. ft_glyph_format_outline). Its functions are used to:
- transform an glyph image
- render a glyph image into a bitmap
- return the control box (dimensions) of a given glyph image
The scan converters "ftraster.c" and "ftgrays.c" have been moved
to the new directory "src/renderer", and are used to provide two
default renderer modules.
One corresponds to the "standard" scan-converter, the other to the
"smooth" one.
The current renderer can be set through the new function
FT_Set_Renderer.
The old raster-related function FT_Set_Raster, FT_Get_Raster and
FT_Set_Raster_Mode have now disappeared, in favor of the new:
FT_Get_Renderer
FT_Set_Renderer
see the file <freetype/ftrender.h> for more details..
These changes were necessary to properly support different scalable
formats in the future, like bi-color glyphs, etc..
- glyph loader object:
A new internal object, called a 'glyph loader' has been introduced
in the base layer. It is used by all scalable format font drivers
to load glyphs and composites.
This object has been created to reduce the code size of each driver,
as each one of them basically re-implemented its functionality.
See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for
more information..
- FT_GlyphSlot had new fields:
In order to support extended features (see below), the FT_GlyphSlot
structure has a few new fields:
linearHoriAdvance: this field gives the linearly scaled (i.e.
scaled but unhinted) advance width for the glyph,
expressed as a 16.16 fixed pixel value. This
is useful to perform WYSIWYG text.
linearVertAdvance: this field gives the linearly scaled advance
height for the glyph (relevant in vertical glyph
layouts only). This is useful to perform
WYSIWYG text.
Note that the two above field replace the removed "metrics2" field
in the glyph slot.
advance: this field is a vector that gives the transformed
advance for the glyph. By default, it corresponds
to the advance width, unless FT_LOAD_VERTICAL_LAYOUT
was specified when calling FT_Load_Glyph or FT_Load_Char
bitmap_left: this field gives the distance in integer pixels from
the current pen position to the left-most pixel of
a glyph image WHEN IT IS A BITMAP. It is only valid
when the "format" field is set to
"ft_glyph_format_bitmap", for example, after calling
the new function FT_Render_Glyph.
bitmap_top: this field gives the distance in integer pixels from
the current pen position (located on the baseline) to
the top-most pixel of the glyph image WHEN IT IS A
BITMAP. Positive values correspond to upwards Y.
loader: this is a new private field for the glyph slot. Client
applications should not touch it..
- support for transforms and direct rendering in FT_Load_Glyph:
Most of the functionality found in <freetype/ftglyph.h> has been
moved to the core library. Hence, the following:
- a transform can be specified for a face through FT_Set_Transform.
this transform is applied by FT_Load_Glyph to scalable glyph images
(i.e. NOT TO BITMAPS) before the function returns, unless the
bit flag FT_LOAD_IGNORE_TRANSFORM was set in the load flags..
- once a glyph image has been loaded, it can be directly converted to
a bitmap by using the new FT_Render_Glyph function. Note that this
function takes the glyph image from the glyph slot, and converts
it to a bitmap whose properties are returned in "face.glyph.bitmap",
"face.glyph.bitmap_left" and "face.glyph.bitmap_top". The original
native image might be lost after the conversion.
- when using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph
and FT_Load_Char functions will call FT_Render_Glyph automatically
when needed.
2000-06-22 02:17:42 +02:00
|
|
|
|
2002-06-26 22:30:37 +02:00
|
|
|
yz = FT_MulFix( vector->x, matrix->yx ) +
|
- MAJOR INTERNAL REDESIGN:
A lot of internal modifications have been performed lately on the
source in order to provide the following enhancements:
- more generic module support:
The FT_Module type is now defined to represent a handle to a given
module. The file <freetype/ftmodule.h> contains the FT_Module_Class
definition, as well as the module-loading public API
The FT_Driver type is still defined, and still represents a pointer
to a font driver. Note that FT_Add_Driver is replaced by FT_Add_Module,
FT_Get_Driver by FT_Get_Module, etc..
- support for generic glyph image types:
The FT_Renderer type is a pointer to a module used to perform various
operations on glyph image.
Each renderer is capable of handling images in a single format
(e.g. ft_glyph_format_outline). Its functions are used to:
- transform an glyph image
- render a glyph image into a bitmap
- return the control box (dimensions) of a given glyph image
The scan converters "ftraster.c" and "ftgrays.c" have been moved
to the new directory "src/renderer", and are used to provide two
default renderer modules.
One corresponds to the "standard" scan-converter, the other to the
"smooth" one.
The current renderer can be set through the new function
FT_Set_Renderer.
The old raster-related function FT_Set_Raster, FT_Get_Raster and
FT_Set_Raster_Mode have now disappeared, in favor of the new:
FT_Get_Renderer
FT_Set_Renderer
see the file <freetype/ftrender.h> for more details..
These changes were necessary to properly support different scalable
formats in the future, like bi-color glyphs, etc..
- glyph loader object:
A new internal object, called a 'glyph loader' has been introduced
in the base layer. It is used by all scalable format font drivers
to load glyphs and composites.
This object has been created to reduce the code size of each driver,
as each one of them basically re-implemented its functionality.
See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for
more information..
- FT_GlyphSlot had new fields:
In order to support extended features (see below), the FT_GlyphSlot
structure has a few new fields:
linearHoriAdvance: this field gives the linearly scaled (i.e.
scaled but unhinted) advance width for the glyph,
expressed as a 16.16 fixed pixel value. This
is useful to perform WYSIWYG text.
linearVertAdvance: this field gives the linearly scaled advance
height for the glyph (relevant in vertical glyph
layouts only). This is useful to perform
WYSIWYG text.
Note that the two above field replace the removed "metrics2" field
in the glyph slot.
advance: this field is a vector that gives the transformed
advance for the glyph. By default, it corresponds
to the advance width, unless FT_LOAD_VERTICAL_LAYOUT
was specified when calling FT_Load_Glyph or FT_Load_Char
bitmap_left: this field gives the distance in integer pixels from
the current pen position to the left-most pixel of
a glyph image WHEN IT IS A BITMAP. It is only valid
when the "format" field is set to
"ft_glyph_format_bitmap", for example, after calling
the new function FT_Render_Glyph.
bitmap_top: this field gives the distance in integer pixels from
the current pen position (located on the baseline) to
the top-most pixel of the glyph image WHEN IT IS A
BITMAP. Positive values correspond to upwards Y.
loader: this is a new private field for the glyph slot. Client
applications should not touch it..
- support for transforms and direct rendering in FT_Load_Glyph:
Most of the functionality found in <freetype/ftglyph.h> has been
moved to the core library. Hence, the following:
- a transform can be specified for a face through FT_Set_Transform.
this transform is applied by FT_Load_Glyph to scalable glyph images
(i.e. NOT TO BITMAPS) before the function returns, unless the
bit flag FT_LOAD_IGNORE_TRANSFORM was set in the load flags..
- once a glyph image has been loaded, it can be directly converted to
a bitmap by using the new FT_Render_Glyph function. Note that this
function takes the glyph image from the glyph slot, and converts
it to a bitmap whose properties are returned in "face.glyph.bitmap",
"face.glyph.bitmap_left" and "face.glyph.bitmap_top". The original
native image might be lost after the conversion.
- when using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph
and FT_Load_Char functions will call FT_Render_Glyph automatically
when needed.
2000-06-22 02:17:42 +02:00
|
|
|
FT_MulFix( vector->y, matrix->yy );
|
|
|
|
|
|
|
|
vector->x = xz;
|
|
|
|
vector->y = yz;
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-11-07 18:21:11 +01:00
|
|
|
/* documentation is in ftoutln.h */
|
|
|
|
|
2001-06-27 18:18:10 +02:00
|
|
|
FT_EXPORT_DEF( void )
|
2005-05-20 08:22:20 +02:00
|
|
|
FT_Outline_Transform( const FT_Outline* outline,
|
|
|
|
const FT_Matrix* matrix )
|
2000-05-24 02:31:14 +02:00
|
|
|
{
|
2005-05-20 23:52:19 +02:00
|
|
|
FT_Vector* vec;
|
|
|
|
FT_Vector* limit;
|
|
|
|
|
|
|
|
|
|
|
|
if ( !outline || !matrix )
|
|
|
|
return;
|
2000-06-29 05:14:25 +02:00
|
|
|
|
2005-05-20 23:52:19 +02:00
|
|
|
vec = outline->points;
|
|
|
|
limit = vec + outline->n_points;
|
2000-07-01 16:06:46 +02:00
|
|
|
|
- MAJOR INTERNAL REDESIGN:
A lot of internal modifications have been performed lately on the
source in order to provide the following enhancements:
- more generic module support:
The FT_Module type is now defined to represent a handle to a given
module. The file <freetype/ftmodule.h> contains the FT_Module_Class
definition, as well as the module-loading public API
The FT_Driver type is still defined, and still represents a pointer
to a font driver. Note that FT_Add_Driver is replaced by FT_Add_Module,
FT_Get_Driver by FT_Get_Module, etc..
- support for generic glyph image types:
The FT_Renderer type is a pointer to a module used to perform various
operations on glyph image.
Each renderer is capable of handling images in a single format
(e.g. ft_glyph_format_outline). Its functions are used to:
- transform an glyph image
- render a glyph image into a bitmap
- return the control box (dimensions) of a given glyph image
The scan converters "ftraster.c" and "ftgrays.c" have been moved
to the new directory "src/renderer", and are used to provide two
default renderer modules.
One corresponds to the "standard" scan-converter, the other to the
"smooth" one.
The current renderer can be set through the new function
FT_Set_Renderer.
The old raster-related function FT_Set_Raster, FT_Get_Raster and
FT_Set_Raster_Mode have now disappeared, in favor of the new:
FT_Get_Renderer
FT_Set_Renderer
see the file <freetype/ftrender.h> for more details..
These changes were necessary to properly support different scalable
formats in the future, like bi-color glyphs, etc..
- glyph loader object:
A new internal object, called a 'glyph loader' has been introduced
in the base layer. It is used by all scalable format font drivers
to load glyphs and composites.
This object has been created to reduce the code size of each driver,
as each one of them basically re-implemented its functionality.
See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for
more information..
- FT_GlyphSlot had new fields:
In order to support extended features (see below), the FT_GlyphSlot
structure has a few new fields:
linearHoriAdvance: this field gives the linearly scaled (i.e.
scaled but unhinted) advance width for the glyph,
expressed as a 16.16 fixed pixel value. This
is useful to perform WYSIWYG text.
linearVertAdvance: this field gives the linearly scaled advance
height for the glyph (relevant in vertical glyph
layouts only). This is useful to perform
WYSIWYG text.
Note that the two above field replace the removed "metrics2" field
in the glyph slot.
advance: this field is a vector that gives the transformed
advance for the glyph. By default, it corresponds
to the advance width, unless FT_LOAD_VERTICAL_LAYOUT
was specified when calling FT_Load_Glyph or FT_Load_Char
bitmap_left: this field gives the distance in integer pixels from
the current pen position to the left-most pixel of
a glyph image WHEN IT IS A BITMAP. It is only valid
when the "format" field is set to
"ft_glyph_format_bitmap", for example, after calling
the new function FT_Render_Glyph.
bitmap_top: this field gives the distance in integer pixels from
the current pen position (located on the baseline) to
the top-most pixel of the glyph image WHEN IT IS A
BITMAP. Positive values correspond to upwards Y.
loader: this is a new private field for the glyph slot. Client
applications should not touch it..
- support for transforms and direct rendering in FT_Load_Glyph:
Most of the functionality found in <freetype/ftglyph.h> has been
moved to the core library. Hence, the following:
- a transform can be specified for a face through FT_Set_Transform.
this transform is applied by FT_Load_Glyph to scalable glyph images
(i.e. NOT TO BITMAPS) before the function returns, unless the
bit flag FT_LOAD_IGNORE_TRANSFORM was set in the load flags..
- once a glyph image has been loaded, it can be directly converted to
a bitmap by using the new FT_Render_Glyph function. Note that this
function takes the glyph image from the glyph slot, and converts
it to a bitmap whose properties are returned in "face.glyph.bitmap",
"face.glyph.bitmap_left" and "face.glyph.bitmap_top". The original
native image might be lost after the conversion.
- when using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph
and FT_Load_Char functions will call FT_Render_Glyph automatically
when needed.
2000-06-22 02:17:42 +02:00
|
|
|
for ( ; vec < limit; vec++ )
|
|
|
|
FT_Vector_Transform( vec, matrix );
|
2000-05-24 02:31:14 +02:00
|
|
|
}
|
|
|
|
|
2000-11-07 18:21:11 +01:00
|
|
|
|
2006-02-23 22:01:34 +01:00
|
|
|
#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last ) \
|
|
|
|
do { \
|
|
|
|
(first) = ( c > 0 ) ? (outline)->points + \
|
|
|
|
(outline)->contours[c - 1] + 1 \
|
|
|
|
: (outline)->points; \
|
|
|
|
(last) = (outline)->points + (outline)->contours[c]; \
|
2006-02-22 21:47:39 +01:00
|
|
|
} while ( 0 )
|
|
|
|
|
|
|
|
|
2006-02-23 22:01:34 +01:00
|
|
|
/* Is a point in some contour? */
|
|
|
|
/* */
|
|
|
|
/* We treat every point of the contour as if it */
|
|
|
|
/* it were ON. That is, we allow false positives, */
|
|
|
|
/* but disallow false negatives. (XXX really?) */
|
2006-02-22 21:47:39 +01:00
|
|
|
static FT_Bool
|
|
|
|
ft_contour_has( FT_Outline* outline,
|
|
|
|
FT_Short c,
|
|
|
|
FT_Vector* point )
|
|
|
|
{
|
|
|
|
FT_Vector* first;
|
|
|
|
FT_Vector* last;
|
|
|
|
FT_Vector* a;
|
|
|
|
FT_Vector* b;
|
|
|
|
FT_UInt n = 0;
|
|
|
|
|
|
|
|
|
|
|
|
FT_OUTLINE_GET_CONTOUR( outline, c, first, last );
|
|
|
|
|
|
|
|
for ( a = first; a <= last; a++ )
|
|
|
|
{
|
|
|
|
FT_Pos x;
|
|
|
|
FT_Int intersect;
|
|
|
|
|
|
|
|
|
|
|
|
b = ( a == last ) ? first : a + 1;
|
|
|
|
|
|
|
|
intersect = ( a->y - point->y ) ^ ( b->y - point->y );
|
|
|
|
|
|
|
|
/* a and b are on the same side */
|
|
|
|
if ( intersect >= 0 )
|
|
|
|
{
|
|
|
|
if ( intersect == 0 && a->y == point->y )
|
|
|
|
{
|
|
|
|
if ( ( a->x <= point->x && b->x >= point->x ) ||
|
|
|
|
( a->x >= point->x && b->x <= point->x ) )
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y );
|
|
|
|
|
|
|
|
if ( x < point->x )
|
|
|
|
n++;
|
|
|
|
else if ( x == point->x )
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ( n % 2 );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static FT_Bool
|
|
|
|
ft_contour_enclosed( FT_Outline* outline,
|
|
|
|
FT_UShort c )
|
|
|
|
{
|
|
|
|
FT_Vector* first;
|
|
|
|
FT_Vector* last;
|
|
|
|
FT_Short i;
|
|
|
|
|
|
|
|
|
|
|
|
FT_OUTLINE_GET_CONTOUR( outline, c, first, last );
|
|
|
|
|
|
|
|
for ( i = 0; i < outline->n_contours; i++ )
|
|
|
|
{
|
|
|
|
if ( i != c && ft_contour_has( outline, i, first ) )
|
|
|
|
{
|
|
|
|
FT_Vector* pt;
|
|
|
|
|
|
|
|
|
|
|
|
for ( pt = first + 1; pt <= last; pt++ )
|
|
|
|
if ( !ft_contour_has( outline, i, pt ) )
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* This version differs from the public one in that each */
|
|
|
|
/* part (contour not enclosed in another contour) of the */
|
|
|
|
/* outline is checked for orientation. This is */
|
|
|
|
/* necessary for some buggy CJK fonts. */
|
|
|
|
static FT_Orientation
|
|
|
|
ft_outline_get_orientation( FT_Outline* outline )
|
|
|
|
{
|
|
|
|
FT_Short i;
|
|
|
|
FT_Vector* first;
|
|
|
|
FT_Vector* last;
|
|
|
|
FT_Orientation orient = FT_ORIENTATION_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
first = outline->points;
|
|
|
|
for ( i = 0; i < outline->n_contours; i++, first = last + 1 )
|
|
|
|
{
|
|
|
|
FT_Vector* point;
|
|
|
|
FT_Vector* xmin_point;
|
|
|
|
FT_Pos xmin;
|
|
|
|
|
|
|
|
|
|
|
|
last = outline->points + outline->contours[i];
|
|
|
|
|
|
|
|
/* skip degenerate contours */
|
|
|
|
if ( last < first + 2 )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if ( ft_contour_enclosed( outline, i ) )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
xmin = first->x;
|
|
|
|
xmin_point = first;
|
|
|
|
|
|
|
|
for ( point = first + 1; point <= last; point++ )
|
|
|
|
{
|
|
|
|
if ( point->x < xmin )
|
|
|
|
{
|
|
|
|
xmin = point->x;
|
|
|
|
xmin_point = point;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* check the orientation of the contour */
|
|
|
|
{
|
|
|
|
FT_Vector* prev;
|
|
|
|
FT_Vector* next;
|
|
|
|
FT_Orientation o;
|
|
|
|
|
|
|
|
|
|
|
|
prev = ( xmin_point == first ) ? last : xmin_point - 1;
|
|
|
|
next = ( xmin_point == last ) ? first : xmin_point + 1;
|
|
|
|
|
|
|
|
if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) >
|
|
|
|
FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) )
|
|
|
|
o = FT_ORIENTATION_POSTSCRIPT;
|
|
|
|
else
|
|
|
|
o = FT_ORIENTATION_TRUETYPE;
|
|
|
|
|
|
|
|
if ( orient == FT_ORIENTATION_NONE )
|
|
|
|
orient = o;
|
|
|
|
else if ( orient != o )
|
|
|
|
return FT_ORIENTATION_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return orient;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-05-25 07:51:01 +02:00
|
|
|
/* documentation is in ftoutln.h */
|
|
|
|
|
|
|
|
FT_EXPORT_DEF( FT_Error )
|
|
|
|
FT_Outline_Embolden( FT_Outline* outline,
|
|
|
|
FT_Pos strength )
|
|
|
|
{
|
|
|
|
FT_Vector* points;
|
|
|
|
FT_Vector v_prev, v_first, v_next, v_cur;
|
|
|
|
FT_Angle rotate, angle_in, angle_out;
|
|
|
|
FT_Int c, n, first;
|
2006-02-22 21:47:39 +01:00
|
|
|
FT_Int orientation;
|
2005-05-25 07:51:01 +02:00
|
|
|
|
|
|
|
|
|
|
|
if ( !outline )
|
|
|
|
return FT_Err_Invalid_Argument;
|
|
|
|
|
* src/base/ftoutln.c (FT_Outline_Embolden): Strength should be
halved.
* src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default
strength.
Don't increase slot->advance.y.
* include/freetype/freetype.h (FREETYPE_MINOR): Set to 2.
(FREETYPE_PATCH): Set to 0.
* builds/unix/configure.ac (version_info): Set to 9:9:3.
Currently, we are still binary compatible.
* builds/win32/visualc/index.html,
builds/win32/visualc/freetype.dsp,
builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/.
* builds/freetype.mk (refdoc), README, Jamfile (RefDoc):
s/2.1.9/2.1.10/.
* docs/CHANGES, docs/VERSION.DLL: Updated.
* ChangeLog: Split off older entries into...
* ChangeLog.20, ChangeLog.21: These new files.
The next release will be 2.2.0, so don't worry about source code
backwards compatibility.
* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
FT_Outline_LineToFunc, FT_Outline_ConicToFunc,
FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc),
include/freetype/ftrender.h (FT_Glyph_TransformFunc,
FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate
parameters with `const' where appropriate.
* src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY
to make glyphs centered vertically.
* src/truetype/ttgload.c (compute_glyph_metrics): Compute
vertBearingY to make glyphs centered vertically.
Fix some bugs in vertical metrics:
. loader->pp3.y and loader->pp4.y are in 26.6 format, not in font
units.
. As we use the glyph's cbox to calculate the top bearing now
there iss no need to adjust `top'.
* src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be
in sync with OTV_OPTIONAL_OFFSET. Reported by YAMATO Masatake.
* docs/release: Update.
2005-06-16 21:07:08 +02:00
|
|
|
strength /= 2;
|
2005-05-25 07:51:01 +02:00
|
|
|
if ( strength == 0 )
|
|
|
|
return FT_Err_Ok;
|
|
|
|
|
2006-02-22 21:47:39 +01:00
|
|
|
orientation = ft_outline_get_orientation( outline );
|
|
|
|
if ( orientation == FT_ORIENTATION_NONE )
|
|
|
|
{
|
|
|
|
if ( outline->n_contours )
|
|
|
|
return FT_Err_Invalid_Argument;
|
|
|
|
else
|
|
|
|
return FT_Err_Ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( orientation == FT_ORIENTATION_TRUETYPE )
|
2005-05-25 07:51:01 +02:00
|
|
|
rotate = -FT_ANGLE_PI2;
|
|
|
|
else
|
|
|
|
rotate = FT_ANGLE_PI2;
|
|
|
|
|
|
|
|
points = outline->points;
|
|
|
|
|
|
|
|
first = 0;
|
|
|
|
for ( c = 0; c < outline->n_contours; c++ )
|
|
|
|
{
|
|
|
|
int last = outline->contours[c];
|
|
|
|
|
|
|
|
|
|
|
|
v_first = points[first];
|
|
|
|
v_prev = points[last];
|
|
|
|
v_cur = v_first;
|
|
|
|
|
|
|
|
for ( n = first; n <= last; n++ )
|
|
|
|
{
|
|
|
|
FT_Vector in, out;
|
|
|
|
FT_Angle angle_diff;
|
|
|
|
FT_Pos d;
|
|
|
|
FT_Fixed scale;
|
|
|
|
|
|
|
|
|
|
|
|
if ( n < last )
|
|
|
|
v_next = points[n + 1];
|
|
|
|
else
|
|
|
|
v_next = v_first;
|
|
|
|
|
|
|
|
/* compute the in and out vectors */
|
|
|
|
in.x = v_cur.x - v_prev.x;
|
|
|
|
in.y = v_cur.y - v_prev.y;
|
|
|
|
|
|
|
|
out.x = v_next.x - v_cur.x;
|
|
|
|
out.y = v_next.y - v_cur.y;
|
|
|
|
|
|
|
|
angle_in = FT_Atan2( in.x, in.y );
|
|
|
|
angle_out = FT_Atan2( out.x, out.y );
|
|
|
|
angle_diff = FT_Angle_Diff( angle_in, angle_out );
|
|
|
|
scale = FT_Cos( angle_diff / 2 );
|
|
|
|
|
|
|
|
if ( scale < 0x4000L && scale > -0x4000L )
|
|
|
|
in.x = in.y = 0;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
d = FT_DivFix( strength, scale );
|
|
|
|
|
|
|
|
FT_Vector_From_Polar( &in, d, angle_in + angle_diff / 2 - rotate );
|
|
|
|
}
|
|
|
|
|
|
|
|
outline->points[n].x = v_cur.x + strength + in.x;
|
|
|
|
outline->points[n].y = v_cur.y + strength + in.y;
|
|
|
|
|
|
|
|
v_prev = v_cur;
|
|
|
|
v_cur = v_next;
|
|
|
|
}
|
|
|
|
|
|
|
|
first = last + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FT_Err_Ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-11-24 08:08:21 +01:00
|
|
|
/* documentation is in ftoutln.h */
|
2004-01-15 20:07:44 +01:00
|
|
|
|
2004-11-24 08:08:21 +01:00
|
|
|
FT_EXPORT_DEF( FT_Orientation )
|
|
|
|
FT_Outline_Get_Orientation( FT_Outline* outline )
|
2003-10-02 23:07:10 +02:00
|
|
|
{
|
2004-11-24 08:08:21 +01:00
|
|
|
FT_Pos xmin = 32768L;
|
|
|
|
FT_Vector* xmin_point = NULL;
|
|
|
|
FT_Vector* xmin_first = NULL;
|
|
|
|
FT_Vector* xmin_last = NULL;
|
2004-01-15 20:07:44 +01:00
|
|
|
|
2004-11-24 08:08:21 +01:00
|
|
|
short* contour;
|
2003-10-05 09:54:00 +02:00
|
|
|
|
2004-11-24 08:08:21 +01:00
|
|
|
FT_Vector* first;
|
|
|
|
FT_Vector* last;
|
|
|
|
FT_Vector* prev;
|
|
|
|
FT_Vector* next;
|
2004-01-15 20:07:44 +01:00
|
|
|
|
2004-01-16 09:46:11 +01:00
|
|
|
|
2004-11-24 08:08:21 +01:00
|
|
|
if ( !outline || outline->n_points <= 0 )
|
|
|
|
return FT_ORIENTATION_TRUETYPE;
|
2004-01-15 20:07:44 +01:00
|
|
|
|
2004-11-24 08:08:21 +01:00
|
|
|
first = outline->points;
|
|
|
|
for ( contour = outline->contours;
|
|
|
|
contour < outline->contours + outline->n_contours;
|
|
|
|
contour++, first = last + 1 )
|
2003-10-02 23:07:10 +02:00
|
|
|
{
|
2004-11-24 08:08:21 +01:00
|
|
|
FT_Vector* point;
|
2004-01-15 20:07:44 +01:00
|
|
|
|
|
|
|
|
2004-11-24 08:08:21 +01:00
|
|
|
last = outline->points + *contour;
|
2004-01-15 20:07:44 +01:00
|
|
|
|
2004-11-24 08:08:21 +01:00
|
|
|
/* skip degenerate contours */
|
|
|
|
if ( last < first + 2 )
|
|
|
|
continue;
|
2003-10-02 23:07:10 +02:00
|
|
|
|
2004-11-24 08:08:21 +01:00
|
|
|
for ( point = first; point <= last; point++ )
|
2003-10-02 23:07:10 +02:00
|
|
|
{
|
2004-11-24 08:08:21 +01:00
|
|
|
if ( point->x < xmin )
|
2003-10-02 23:07:10 +02:00
|
|
|
{
|
2004-11-24 08:08:21 +01:00
|
|
|
xmin = point->x;
|
|
|
|
xmin_point = point;
|
|
|
|
xmin_first = first;
|
|
|
|
xmin_last = last;
|
2003-10-02 23:07:10 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2004-01-15 20:07:44 +01:00
|
|
|
|
2004-11-24 08:08:21 +01:00
|
|
|
if ( !xmin_point )
|
|
|
|
return FT_ORIENTATION_TRUETYPE;
|
|
|
|
|
|
|
|
prev = ( xmin_point == xmin_first ) ? xmin_last : xmin_point - 1;
|
|
|
|
next = ( xmin_point == xmin_last ) ? xmin_first : xmin_point + 1;
|
|
|
|
|
|
|
|
if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) >
|
|
|
|
FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) )
|
|
|
|
return FT_ORIENTATION_POSTSCRIPT;
|
|
|
|
else
|
|
|
|
return FT_ORIENTATION_TRUETYPE;
|
2003-10-02 23:07:10 +02:00
|
|
|
}
|
|
|
|
|
2003-10-05 09:54:00 +02:00
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
/* END */
|