2018-06-03 09:01:17 +02:00
|
|
|
/****************************************************************************
|
|
|
|
*
|
|
|
|
* ftoutln.c
|
|
|
|
*
|
|
|
|
* FreeType outline management (body).
|
|
|
|
*
|
2019-02-23 10:07:09 +01:00
|
|
|
* Copyright (C) 1996-2019 by
|
2018-06-03 09:01:17 +02:00
|
|
|
* David Turner, Robert Wilhelm, and Werner Lemberg.
|
|
|
|
*
|
|
|
|
* This file is part of the FreeType project, and may only be used,
|
|
|
|
* modified, and distributed under the terms of the FreeType project
|
|
|
|
* license, LICENSE.TXT. By continuing to use, modify, or distribute
|
|
|
|
* this file you indicate that you have read the license and
|
|
|
|
* understand and accept it fully.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2000-12-08 17:17:16 +01:00
|
|
|
#include <ft2build.h>
|
|
|
|
#include FT_OUTLINE_H
|
|
|
|
#include FT_INTERNAL_OBJECTS_H
|
2013-01-25 00:40:56 +01:00
|
|
|
#include FT_INTERNAL_CALC_H
|
2008-09-20 13:50:47 +02:00
|
|
|
#include FT_INTERNAL_DEBUG_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
|
|
|
|
2018-06-03 09:01:17 +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.
|
|
|
|
*/
|
2000-06-03 08:03:11 +02:00
|
|
|
#undef FT_COMPONENT
|
2018-08-15 18:13:17 +02:00
|
|
|
#define FT_COMPONENT outline
|
2000-06-03 08:03:11 +02:00
|
|
|
|
|
|
|
|
2000-03-28 13:22:31 +02:00
|
|
|
static
|
2016-04-24 08:14:07 +02:00
|
|
|
const FT_Outline null_outline = { 0, 0, NULL, NULL, NULL, 0 };
|
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_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
|
|
|
{
|
2015-08-01 07:53:48 +02:00
|
|
|
#undef SCALED
|
2019-05-04 05:16:42 +02:00
|
|
|
#define SCALED( x ) ( (x) * ( 1L << shift ) - delta )
|
2000-06-01 17:49:28 +02:00
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
2014-11-25 10:22:12 +01:00
|
|
|
if ( !outline )
|
|
|
|
return FT_THROW( Invalid_Outline );
|
|
|
|
|
|
|
|
if ( !func_interface )
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Invalid_Argument );
|
2000-06-02 02:01:14 +02:00
|
|
|
|
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
|
|
|
|
2008-09-20 13:50:47 +02:00
|
|
|
FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n ));
|
|
|
|
|
2007-06-06 06:39:37 +02:00
|
|
|
last = outline->contours[n];
|
|
|
|
if ( last < 0 )
|
|
|
|
goto Invalid_Outline;
|
2000-05-04 19:24:54 +02:00
|
|
|
limit = outline->points + last;
|
|
|
|
|
2008-09-20 13:50:47 +02:00
|
|
|
v_start = outline->points[first];
|
|
|
|
v_start.x = SCALED( v_start.x );
|
|
|
|
v_start.y = SCALED( v_start.y );
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2008-09-20 13:50:47 +02:00
|
|
|
v_last = outline->points[last];
|
|
|
|
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;
|
2008-09-20 13:50:47 +02:00
|
|
|
tags = outline->tags + first;
|
2000-05-04 19:24:54 +02:00
|
|
|
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;
|
|
|
|
|
Fix clang static analyzer and compiler warnings.
* src/autofit/afhints.c (af_glyph_hints_align_weak_points),
src/autofit/afloader (af_loader_load_g) <FT_GLYPH_FORMAT_COMPOSITE>,
src/base/ftcalc.c (FT_MSB), src/base/ftoutln.c
(FT_Outline_Decompose), src/bdf/bdfdrivr.c (bdf_interpret_style),
src/cff/cffparse.c (cff_parse_integer), src/cid/cidparse.c
(cid_parser_new), src/pfr/pfrload.c (pfr_phy_font_load),
src/raster/ftraster.c (Decompose_Curve), src/sfnt/sfdriver.c
(sfnt_get_ps_name), src/sfnt/ttcmap.c (tt_cmap12_next,
tt_cmap13_next), src/smooth/ftgrays.c (gray_hline): Remove dead
code.
* src/autofit/afmodule.c (af_property_get_face_globals,
af_property_set, af_property_get), src/base/ftbitmap.c
(ft_gray_for_premultiplied_srgb_bgra): Make functions static.
* src/base/ftobjs.c (ft_remove_renderer): Protect against
library == NULL.
(ft_property_do): Make function static.
* src/base/ftrfork.c: Include `ftbase.h'.
* src/sfnt/ttsbit.c (tt_face_load_sbix_image)
[!FT_CONFIG_OPTION_USE_PNG], src/type1/t1gload.c
(T1_Compute_Max_Advance): Avoid compiler warning.
* src/truetype/ttinterp.c (TT_New_Context): Reduce scope of
variable.
2014-02-08 13:55:38 +01:00
|
|
|
/* v_last = v_start; */
|
2000-05-04 19:24:54 +02:00
|
|
|
}
|
|
|
|
point--;
|
|
|
|
tags--;
|
|
|
|
}
|
|
|
|
|
2008-09-20 13:50:47 +02:00
|
|
|
FT_TRACE5(( " move to (%.2f, %.2f)\n",
|
|
|
|
v_start.x / 64.0, v_start.y / 64.0 ));
|
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
|
|
|
|
2008-09-20 13:50:47 +02:00
|
|
|
FT_TRACE5(( " line to (%.2f, %.2f)\n",
|
|
|
|
vec.x / 64.0, vec.y / 64.0 ));
|
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
|
|
|
{
|
2008-09-20 13:50:47 +02:00
|
|
|
FT_TRACE5(( " conic to (%.2f, %.2f)"
|
|
|
|
" with control (%.2f, %.2f)\n",
|
|
|
|
vec.x / 64.0, vec.y / 64.0,
|
|
|
|
v_control.x / 64.0, v_control.y / 64.0 ));
|
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;
|
|
|
|
|
2008-09-20 13:50:47 +02:00
|
|
|
FT_TRACE5(( " conic to (%.2f, %.2f)"
|
|
|
|
" with control (%.2f, %.2f)\n",
|
|
|
|
v_middle.x / 64.0, v_middle.y / 64.0,
|
|
|
|
v_control.x / 64.0, v_control.y / 64.0 ));
|
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
|
|
|
|
2008-09-20 13:50:47 +02:00
|
|
|
FT_TRACE5(( " conic to (%.2f, %.2f)"
|
|
|
|
" with control (%.2f, %.2f)\n",
|
|
|
|
v_start.x / 64.0, v_start.y / 64.0,
|
|
|
|
v_control.x / 64.0, v_control.y / 64.0 ));
|
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
|
|
|
|
2008-09-20 13:50:47 +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
|
|
|
|
2008-09-20 13:50:47 +02:00
|
|
|
FT_TRACE5(( " cubic to (%.2f, %.2f)"
|
|
|
|
" with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
|
|
|
|
vec.x / 64.0, vec.y / 64.0,
|
|
|
|
vec1.x / 64.0, vec1.y / 64.0,
|
|
|
|
vec2.x / 64.0, vec2.y / 64.0 ));
|
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
|
|
|
|
2008-09-20 13:50:47 +02:00
|
|
|
FT_TRACE5(( " cubic to (%.2f, %.2f)"
|
|
|
|
" with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
|
|
|
|
v_start.x / 64.0, v_start.y / 64.0,
|
|
|
|
vec1.x / 64.0, vec1.y / 64.0,
|
|
|
|
vec2.x / 64.0, vec2.y / 64.0 ));
|
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 */
|
2008-09-20 13:50:47 +02:00
|
|
|
FT_TRACE5(( " line to (%.2f, %.2f)\n",
|
|
|
|
v_start.x / 64.0, v_start.y / 64.0 ));
|
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;
|
|
|
|
|
2015-02-16 19:35:16 +01:00
|
|
|
first = (FT_UInt)last + 1;
|
2000-05-04 19:24:54 +02:00
|
|
|
}
|
|
|
|
|
2008-09-20 13:50:47 +02:00
|
|
|
FT_TRACE5(( "FT_Outline_Decompose: Done\n", n ));
|
|
|
|
return FT_Err_Ok;
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2018-04-22 21:15:10 +02:00
|
|
|
Invalid_Outline:
|
|
|
|
error = FT_THROW( Invalid_Outline );
|
|
|
|
/* fall through */
|
|
|
|
|
2000-05-04 19:24:54 +02:00
|
|
|
Exit:
|
2017-01-01 08:20:38 +01:00
|
|
|
FT_TRACE5(( "FT_Outline_Decompose: Error 0x%x\n", error ));
|
2000-05-04 19:24:54 +02:00
|
|
|
return error;
|
|
|
|
}
|
2000-03-28 13:22:31 +02:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2018-09-01 11:01:52 +02:00
|
|
|
/* documentation is in ftoutln.h */
|
|
|
|
|
2001-06-27 18:18:10 +02:00
|
|
|
FT_EXPORT_DEF( FT_Error )
|
2018-09-01 11:01:52 +02:00
|
|
|
FT_Outline_New( FT_Library library,
|
|
|
|
FT_UInt numPoints,
|
|
|
|
FT_Int numContours,
|
|
|
|
FT_Outline *anoutline )
|
2000-07-07 21:47:34 +02:00
|
|
|
{
|
2018-09-01 11:01:52 +02:00
|
|
|
FT_Error error;
|
|
|
|
FT_Memory memory;
|
2000-07-07 21:47:34 +02:00
|
|
|
|
|
|
|
|
2018-09-01 11:01:52 +02:00
|
|
|
if ( !library )
|
|
|
|
return FT_THROW( Invalid_Library_Handle );
|
|
|
|
|
|
|
|
memory = library->memory;
|
|
|
|
|
2000-11-07 07:30:29 +01:00
|
|
|
if ( !anoutline || !memory )
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Invalid_Argument );
|
2000-07-07 21:47:34 +02:00
|
|
|
|
2000-11-07 07:30:29 +01:00
|
|
|
*anoutline = null_outline;
|
2000-07-07 21:47:34 +02:00
|
|
|
|
2012-12-21 16:45:27 +01:00
|
|
|
if ( numContours < 0 ||
|
|
|
|
(FT_UInt)numContours > numPoints )
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Invalid_Argument );
|
2012-12-21 16:45:27 +01:00
|
|
|
|
|
|
|
if ( numPoints > FT_OUTLINE_POINTS_MAX )
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Array_Too_Large );
|
2012-12-21 16:45:27 +01:00
|
|
|
|
2010-02-12 17:08:33 +01:00
|
|
|
if ( FT_NEW_ARRAY( anoutline->points, numPoints ) ||
|
|
|
|
FT_NEW_ARRAY( anoutline->tags, numPoints ) ||
|
|
|
|
FT_NEW_ARRAY( anoutline->contours, numContours ) )
|
2000-07-07 21:47:34 +02:00
|
|
|
goto Fail;
|
|
|
|
|
2015-02-16 19:35:16 +01:00
|
|
|
anoutline->n_points = (FT_Short)numPoints;
|
2000-11-07 07:30:29 +01:00
|
|
|
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;
|
2018-09-01 11:01:52 +02:00
|
|
|
FT_Outline_Done( library, anoutline );
|
2000-07-07 21:47:34 +02:00
|
|
|
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
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 )
|
2014-11-26 21:59:21 +01:00
|
|
|
return FT_Err_Ok;
|
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 */
|
2014-11-26 21:59:21 +01:00
|
|
|
return FT_Err_Ok;
|
2002-01-03 17:56:59 +01:00
|
|
|
}
|
2002-01-03 23:06:13 +01:00
|
|
|
|
2002-01-03 17:56:59 +01:00
|
|
|
Bad:
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Invalid_Argument );
|
2002-01-03 17:56:59 +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( 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;
|
|
|
|
|
|
|
|
|
2014-11-26 21:59:21 +01:00
|
|
|
if ( !source || !target )
|
|
|
|
return FT_THROW( Invalid_Outline );
|
|
|
|
|
|
|
|
if ( source->n_points != target->n_points ||
|
2000-07-01 01:12:55 +02:00
|
|
|
source->n_contours != target->n_contours )
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Invalid_Argument );
|
2000-07-01 01:12:55 +02:00
|
|
|
|
2005-05-20 23:52:19 +02:00
|
|
|
if ( source == target )
|
|
|
|
return FT_Err_Ok;
|
|
|
|
|
2016-02-07 19:25:56 +01:00
|
|
|
if ( source->n_points )
|
|
|
|
{
|
|
|
|
FT_ARRAY_COPY( target->points, source->points, source->n_points );
|
|
|
|
FT_ARRAY_COPY( target->tags, source->tags, source->n_points );
|
|
|
|
}
|
2000-07-01 01:12:55 +02:00
|
|
|
|
2016-02-07 19:25:56 +01:00
|
|
|
if ( source->n_contours )
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-09-01 11:01:52 +02:00
|
|
|
/* documentation is in ftoutln.h */
|
|
|
|
|
2001-06-27 18:18:10 +02:00
|
|
|
FT_EXPORT_DEF( FT_Error )
|
2018-09-01 11:01:52 +02:00
|
|
|
FT_Outline_Done( FT_Library library,
|
|
|
|
FT_Outline* outline )
|
2000-07-08 21:51:42 +02:00
|
|
|
{
|
2018-09-01 11:01:52 +02:00
|
|
|
FT_Memory memory;
|
|
|
|
|
|
|
|
|
|
|
|
if ( !library )
|
|
|
|
return FT_THROW( Invalid_Library_Handle );
|
|
|
|
|
2014-11-26 21:59:21 +01:00
|
|
|
if ( !outline )
|
|
|
|
return FT_THROW( Invalid_Outline );
|
2000-07-08 21:51:42 +02:00
|
|
|
|
2018-09-01 11:01:52 +02:00
|
|
|
memory = library->memory;
|
|
|
|
|
2014-11-26 21:59:21 +01:00
|
|
|
if ( !memory )
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Invalid_Argument );
|
2014-11-26 21:59:21 +01:00
|
|
|
|
|
|
|
if ( outline->flags & FT_OUTLINE_OWNER )
|
|
|
|
{
|
|
|
|
FT_FREE( outline->points );
|
|
|
|
FT_FREE( outline->tags );
|
|
|
|
FT_FREE( outline->contours );
|
|
|
|
}
|
|
|
|
*outline = null_outline;
|
|
|
|
|
|
|
|
return FT_Err_Ok;
|
2000-07-08 21:51:42 +02:00
|
|
|
}
|
|
|
|
|
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( 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;
|
2007-07-27 06:44:36 +02:00
|
|
|
FT_Vector* vec;
|
2000-03-28 13:22:31 +02:00
|
|
|
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2005-05-20 23:52:19 +02:00
|
|
|
if ( !outline )
|
|
|
|
return;
|
|
|
|
|
2007-07-27 06:44:36 +02:00
|
|
|
vec = outline->points;
|
|
|
|
|
2000-03-28 13:22:31 +02:00
|
|
|
for ( n = 0; n < outline->n_points; n++ )
|
|
|
|
{
|
2017-10-09 07:45:03 +02:00
|
|
|
vec->x = ADD_LONG( vec->x, xOffset );
|
|
|
|
vec->y = ADD_LONG( vec->y, yOffset );
|
2000-03-28 13:22:31 +02:00
|
|
|
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;
|
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
|
|
|
{
|
2013-08-01 12:20:20 +02:00
|
|
|
char swap;
|
|
|
|
|
|
|
|
|
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_Renderer renderer;
|
|
|
|
FT_ListNode node;
|
2018-08-10 04:18:00 +02:00
|
|
|
FT_BBox cbox;
|
2000-06-29 05:14:25 +02:00
|
|
|
|
|
|
|
|
|
|
|
if ( !library )
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Invalid_Library_Handle );
|
2000-06-29 05:14:25 +02:00
|
|
|
|
2014-11-25 10:22:12 +01:00
|
|
|
if ( !outline )
|
|
|
|
return FT_THROW( Invalid_Outline );
|
|
|
|
|
|
|
|
if ( !params )
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Invalid_Argument );
|
2000-06-29 05:14:25 +02:00
|
|
|
|
2018-08-10 04:18:00 +02:00
|
|
|
FT_Outline_Get_CBox( outline, &cbox );
|
|
|
|
if ( cbox.xMin < -0x1000000L || cbox.yMin < -0x1000000L ||
|
|
|
|
cbox.xMax > 0x1000000L || cbox.yMax > 0x1000000L )
|
|
|
|
return FT_THROW( Invalid_Outline );
|
|
|
|
|
2000-06-29 05:14:25 +02:00
|
|
|
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
|
|
|
|
2019-04-12 05:48:21 +02:00
|
|
|
/* preset clip_box for direct mode */
|
|
|
|
if ( params->flags & FT_RASTER_FLAG_DIRECT &&
|
|
|
|
!( params->flags & FT_RASTER_FLAG_CLIP ) )
|
|
|
|
{
|
|
|
|
params->clip_box.xMin = cbox.xMin >> 6;
|
|
|
|
params->clip_box.yMin = cbox.yMin >> 6;
|
|
|
|
params->clip_box.xMax = ( cbox.xMax + 63 ) >> 6;
|
|
|
|
params->clip_box.yMax = ( cbox.yMax + 63 ) >> 6;
|
|
|
|
}
|
|
|
|
|
2013-03-14 17:50:49 +01: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 );
|
2013-03-14 17:50:49 +01:00
|
|
|
if ( !error || FT_ERR_NEQ( error, 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 );
|
- 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-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 )
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Invalid_Argument );
|
2000-06-01 17:49:28 +02:00
|
|
|
|
2014-11-26 21:59:21 +01: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
|
|
|
|
2008-05-15 01:05:38 +02:00
|
|
|
/* documentation is in freetype.h */
|
2000-11-07 18:21:11 +01:00
|
|
|
|
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
|
|
|
{
|
2008-05-15 01:05:38 +02:00
|
|
|
FT_Pos xz, yz;
|
- 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-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-24 12:53:21 +01:00
|
|
|
#if 0
|
2006-02-25 07:24:28 +01:00
|
|
|
|
2006-02-23 22:01:34 +01:00
|
|
|
#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last ) \
|
2013-12-02 09:52:38 +01:00
|
|
|
do \
|
|
|
|
{ \
|
2006-02-23 22:01:34 +01:00
|
|
|
(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;
|
|
|
|
}
|
|
|
|
|
2012-02-29 13:45:24 +01:00
|
|
|
return n & 1;
|
2006-02-22 21:47:39 +01:00
|
|
|
}
|
|
|
|
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
|
2006-02-22 21:47:39 +01:00
|
|
|
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;
|
|
|
|
}
|
2006-02-25 07:24:28 +01:00
|
|
|
|
|
|
|
#endif /* 0 */
|
2006-02-22 21:47:39 +01:00
|
|
|
|
|
|
|
|
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 )
|
2012-05-28 22:34:58 +02:00
|
|
|
{
|
|
|
|
return FT_Outline_EmboldenXY( outline, strength, strength );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* documentation is in ftoutln.h */
|
|
|
|
|
|
|
|
FT_EXPORT_DEF( FT_Error )
|
|
|
|
FT_Outline_EmboldenXY( FT_Outline* outline,
|
|
|
|
FT_Pos xstrength,
|
|
|
|
FT_Pos ystrength )
|
2005-05-25 07:51:01 +02:00
|
|
|
{
|
2018-08-04 06:39:11 +02:00
|
|
|
FT_Vector* points;
|
|
|
|
FT_Int c, first, last;
|
|
|
|
FT_Orientation orientation;
|
2005-05-25 07:51:01 +02:00
|
|
|
|
|
|
|
|
|
|
|
if ( !outline )
|
2014-11-25 10:22:12 +01:00
|
|
|
return FT_THROW( Invalid_Outline );
|
2005-05-25 07:51:01 +02:00
|
|
|
|
2012-05-28 22:34:58 +02:00
|
|
|
xstrength /= 2;
|
|
|
|
ystrength /= 2;
|
|
|
|
if ( xstrength == 0 && ystrength == 0 )
|
2005-05-25 07:51:01 +02:00
|
|
|
return FT_Err_Ok;
|
|
|
|
|
2006-02-24 12:53:21 +01:00
|
|
|
orientation = FT_Outline_Get_Orientation( outline );
|
2006-02-22 21:47:39 +01:00
|
|
|
if ( orientation == FT_ORIENTATION_NONE )
|
|
|
|
{
|
|
|
|
if ( outline->n_contours )
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Invalid_Argument );
|
2006-02-22 21:47:39 +01:00
|
|
|
else
|
|
|
|
return FT_Err_Ok;
|
|
|
|
}
|
|
|
|
|
2005-05-25 07:51:01 +02:00
|
|
|
points = outline->points;
|
|
|
|
|
|
|
|
first = 0;
|
|
|
|
for ( c = 0; c < outline->n_contours; c++ )
|
|
|
|
{
|
2015-08-18 04:58:59 +02:00
|
|
|
FT_Vector in, out, anchor, shift;
|
2015-09-16 18:05:43 +02:00
|
|
|
FT_Fixed l_in, l_out, l_anchor = 0, l, q, d;
|
2015-08-18 04:58:59 +02:00
|
|
|
FT_Int i, j, k;
|
2005-05-25 07:51:01 +02:00
|
|
|
|
|
|
|
|
2015-08-18 05:56:51 +02:00
|
|
|
l_in = 0;
|
2015-08-18 04:58:59 +02:00
|
|
|
last = outline->contours[c];
|
2012-05-28 22:34:58 +02:00
|
|
|
|
2015-10-21 20:48:27 +02:00
|
|
|
/* pacify compiler */
|
|
|
|
in.x = in.y = anchor.x = anchor.y = 0;
|
|
|
|
|
2015-08-31 04:50:48 +02:00
|
|
|
/* Counter j cycles though the points; counter i advances only */
|
|
|
|
/* when points are moved; anchor k marks the first moved point. */
|
2015-08-18 04:58:59 +02:00
|
|
|
for ( i = last, j = first, k = -1;
|
|
|
|
j != i && i != k;
|
|
|
|
j = j < last ? j + 1 : first )
|
2005-05-25 07:51:01 +02:00
|
|
|
{
|
2015-08-18 04:58:59 +02:00
|
|
|
if ( j != k )
|
|
|
|
{
|
|
|
|
out.x = points[j].x - points[i].x;
|
|
|
|
out.y = points[j].y - points[i].y;
|
2015-09-16 18:05:43 +02:00
|
|
|
l_out = (FT_Fixed)FT_Vector_NormLen( &out );
|
2015-08-31 04:50:48 +02:00
|
|
|
|
|
|
|
if ( l_out == 0 )
|
|
|
|
continue;
|
2015-08-18 04:58:59 +02:00
|
|
|
}
|
2005-05-25 07:51:01 +02:00
|
|
|
else
|
2015-08-18 04:58:59 +02:00
|
|
|
{
|
|
|
|
out = anchor;
|
|
|
|
l_out = l_anchor;
|
|
|
|
}
|
2005-05-25 07:51:01 +02:00
|
|
|
|
2015-08-18 04:58:59 +02:00
|
|
|
if ( l_in != 0 )
|
2005-05-25 07:51:01 +02:00
|
|
|
{
|
2015-08-18 04:58:59 +02:00
|
|
|
if ( k < 0 )
|
|
|
|
{
|
2015-08-18 05:56:51 +02:00
|
|
|
k = i;
|
2015-08-18 04:58:59 +02:00
|
|
|
anchor = in;
|
|
|
|
l_anchor = l_in;
|
|
|
|
}
|
2013-01-24 02:11:40 +01:00
|
|
|
|
2015-08-18 04:58:59 +02:00
|
|
|
d = FT_MulFix( in.x, out.x ) + FT_MulFix( in.y, out.y );
|
2005-05-25 07:51:01 +02:00
|
|
|
|
2015-08-18 04:58:59 +02:00
|
|
|
/* shift only if turn is less than ~160 degrees */
|
|
|
|
if ( d > -0xF000L )
|
|
|
|
{
|
|
|
|
d = d + 0x10000L;
|
2012-05-28 22:34:58 +02:00
|
|
|
|
2015-08-18 04:58:59 +02:00
|
|
|
/* shift components along lateral bisector in proper orientation */
|
|
|
|
shift.x = in.y + out.y;
|
|
|
|
shift.y = in.x + out.x;
|
2012-11-04 05:57:57 +01:00
|
|
|
|
2015-08-18 04:58:59 +02:00
|
|
|
if ( orientation == FT_ORIENTATION_TRUETYPE )
|
|
|
|
shift.x = -shift.x;
|
|
|
|
else
|
|
|
|
shift.y = -shift.y;
|
2013-01-24 02:11:40 +01:00
|
|
|
|
2015-08-18 04:58:59 +02:00
|
|
|
/* restrict shift magnitude to better handle collapsing segments */
|
|
|
|
q = FT_MulFix( out.x, in.y ) - FT_MulFix( out.y, in.x );
|
|
|
|
if ( orientation == FT_ORIENTATION_TRUETYPE )
|
|
|
|
q = -q;
|
|
|
|
|
|
|
|
l = FT_MIN( l_in, l_out );
|
2012-11-04 05:57:57 +01:00
|
|
|
|
2015-08-18 04:58:59 +02:00
|
|
|
/* non-strict inequalities avoid divide-by-zero when q == l == 0 */
|
|
|
|
if ( FT_MulFix( xstrength, q ) <= FT_MulFix( l, d ) )
|
|
|
|
shift.x = FT_MulDiv( shift.x, xstrength, d );
|
|
|
|
else
|
|
|
|
shift.x = FT_MulDiv( shift.x, l, q );
|
2013-01-24 13:33:06 +01:00
|
|
|
|
2015-08-18 04:58:59 +02:00
|
|
|
|
|
|
|
if ( FT_MulFix( ystrength, q ) <= FT_MulFix( l, d ) )
|
|
|
|
shift.y = FT_MulDiv( shift.y, ystrength, d );
|
|
|
|
else
|
|
|
|
shift.y = FT_MulDiv( shift.y, l, q );
|
|
|
|
}
|
2012-11-04 05:57:57 +01:00
|
|
|
else
|
2015-08-18 04:58:59 +02:00
|
|
|
shift.x = shift.y = 0;
|
|
|
|
|
|
|
|
for ( ;
|
|
|
|
i != j;
|
|
|
|
i = i < last ? i + 1 : first )
|
|
|
|
{
|
|
|
|
points[i].x += xstrength + shift.x;
|
|
|
|
points[i].y += ystrength + shift.y;
|
|
|
|
}
|
2005-05-25 07:51:01 +02:00
|
|
|
}
|
2012-05-28 22:34:58 +02:00
|
|
|
else
|
2015-08-18 04:58:59 +02:00
|
|
|
i = j;
|
2005-05-25 07:51:01 +02:00
|
|
|
|
2015-08-18 04:58:59 +02:00
|
|
|
in = out;
|
|
|
|
l_in = l_out;
|
2005-05-25 07:51:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
{
|
2018-07-12 07:31:26 +02:00
|
|
|
FT_BBox cbox = { 0, 0, 0, 0 };
|
2013-01-24 01:51:28 +01:00
|
|
|
FT_Int xshift, yshift;
|
2012-05-28 23:11:03 +02:00
|
|
|
FT_Vector* points;
|
|
|
|
FT_Vector v_prev, v_cur;
|
|
|
|
FT_Int c, n, first;
|
|
|
|
FT_Pos area = 0;
|
2006-10-24 07:28:45 +02: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
|
|
|
|
2006-10-24 07:28:45 +02:00
|
|
|
/* We use the nonzero winding rule to find the orientation. */
|
|
|
|
/* Since glyph outlines behave much more `regular' than arbitrary */
|
|
|
|
/* cubic or quadratic curves, this test deals with the polygon */
|
2015-02-16 19:35:16 +01:00
|
|
|
/* only that is spanned up by the control points. */
|
2006-10-24 07:28:45 +02:00
|
|
|
|
2013-01-24 01:51:28 +01:00
|
|
|
FT_Outline_Get_CBox( outline, &cbox );
|
|
|
|
|
2014-08-12 06:26:16 +02:00
|
|
|
/* Handle collapsed outlines to avoid undefined FT_MSB. */
|
|
|
|
if ( cbox.xMin == cbox.xMax || cbox.yMin == cbox.yMax )
|
|
|
|
return FT_ORIENTATION_NONE;
|
|
|
|
|
2015-02-16 19:35:16 +01:00
|
|
|
xshift = FT_MSB( (FT_UInt32)( FT_ABS( cbox.xMax ) |
|
|
|
|
FT_ABS( cbox.xMin ) ) ) - 14;
|
2013-01-24 01:51:28 +01:00
|
|
|
xshift = FT_MAX( xshift, 0 );
|
|
|
|
|
2015-02-16 19:35:16 +01:00
|
|
|
yshift = FT_MSB( (FT_UInt32)( cbox.yMax - cbox.yMin ) ) - 14;
|
2013-01-24 01:51:28 +01:00
|
|
|
yshift = FT_MAX( yshift, 0 );
|
|
|
|
|
2012-05-28 23:11:03 +02:00
|
|
|
points = outline->points;
|
2004-11-24 08:08:21 +01:00
|
|
|
|
2012-05-28 23:11:03 +02:00
|
|
|
first = 0;
|
|
|
|
for ( c = 0; c < outline->n_contours; c++ )
|
2006-03-21 22:36:33 +01:00
|
|
|
{
|
2012-05-28 23:11:03 +02:00
|
|
|
FT_Int last = outline->contours[c];
|
2006-10-24 07:28:45 +02:00
|
|
|
|
2006-03-21 22:36:33 +01:00
|
|
|
|
2015-10-11 04:28:26 +02:00
|
|
|
v_prev.x = points[last].x >> xshift;
|
|
|
|
v_prev.y = points[last].y >> yshift;
|
2006-05-18 00:55:04 +02:00
|
|
|
|
2012-05-28 23:11:03 +02:00
|
|
|
for ( n = first; n <= last; n++ )
|
2006-10-23 18:00:59 +02:00
|
|
|
{
|
2015-10-11 04:28:26 +02:00
|
|
|
v_cur.x = points[n].x >> xshift;
|
|
|
|
v_cur.y = points[n].y >> yshift;
|
|
|
|
|
2017-06-09 11:21:58 +02:00
|
|
|
area = ADD_LONG( area,
|
2018-10-29 21:25:10 +01:00
|
|
|
MUL_LONG( v_cur.y - v_prev.y,
|
|
|
|
v_cur.x + v_prev.x ) );
|
2015-10-11 04:28:26 +02:00
|
|
|
|
2012-05-28 23:11:03 +02:00
|
|
|
v_prev = v_cur;
|
2006-10-23 18:00:59 +02:00
|
|
|
}
|
|
|
|
|
2012-05-28 23:11:03 +02:00
|
|
|
first = last + 1;
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
}
|
2006-05-18 00:55:04 +02:00
|
|
|
|
2012-05-28 23:11:03 +02:00
|
|
|
if ( area > 0 )
|
|
|
|
return FT_ORIENTATION_POSTSCRIPT;
|
|
|
|
else if ( area < 0 )
|
|
|
|
return FT_ORIENTATION_TRUETYPE;
|
|
|
|
else
|
|
|
|
return FT_ORIENTATION_NONE;
|
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 */
|