1999-12-17 00:11:37 +01:00
|
|
|
/***************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* ttgload.c */
|
|
|
|
/* */
|
|
|
|
/* TrueType Glyph Loader (body). */
|
|
|
|
/* */
|
2012-02-29 17:29:07 +01:00
|
|
|
/* Copyright 1996-2012 */
|
1999-12-17 00:11:37 +01:00
|
|
|
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
|
|
|
/* */
|
2000-06-12 21:36:41 +02:00
|
|
|
/* This file is part of the FreeType project, and may only be used, */
|
|
|
|
/* modified, and distributed under the terms of the FreeType project */
|
1999-12-17 00:11:37 +01:00
|
|
|
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
|
|
|
|
/* this file you indicate that you have read the license and */
|
|
|
|
/* understand and accept it fully. */
|
|
|
|
/* */
|
|
|
|
/***************************************************************************/
|
|
|
|
|
2000-12-08 17:17:16 +01:00
|
|
|
|
2000-12-08 03:42:29 +01:00
|
|
|
#include <ft2build.h>
|
|
|
|
#include FT_INTERNAL_DEBUG_H
|
|
|
|
#include FT_INTERNAL_CALC_H
|
|
|
|
#include FT_INTERNAL_STREAM_H
|
|
|
|
#include FT_INTERNAL_SFNT_H
|
|
|
|
#include FT_TRUETYPE_TAGS_H
|
|
|
|
#include FT_OUTLINE_H
|
|
|
|
|
2001-03-20 12:14:24 +01:00
|
|
|
#include "ttgload.h"
|
2005-03-03 18:09:08 +01:00
|
|
|
#include "ttpload.h"
|
2000-06-12 21:36:41 +02:00
|
|
|
|
* src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
* src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
* src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
Use FT_BEGIN_HEADER and FT_END_HEADER.
Use FT_LOCAL.
2004-04-24 George Williams <gww@silcom.com>
Add support for Apple's distortable font technology (in GX fonts).
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
* include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
FT_MM_Var): New structures.
(FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New function declarations.
* include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
FT_Set_Var_Design_Func): New typedefs.
Update MultiMasters service.
* include/freetype/internal/tttypes.h
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
(GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
(TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
and `blend'.
* include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
macros.
* include/freetype/internal/fttrace.h: Add `ttgxvar'.
* src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New functions.
* src/sfnt/sfobjs.c (sfnt_load_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
flag for GX var fonts.
* src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
* src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.c.
* src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
(tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
New service.
(tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(TT_Process_Simple_Glyph, load_truetype_glyph)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_done_blend.
* src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_face_vary_cvt.
* src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
* src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
and T1_Set_Var_Design.
* src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
(T1_Get_MM_Var, T1_Set_Var_Design): New functions.
* src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
function declarations.
2004-04-25 22:15:11 +02:00
|
|
|
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
|
|
|
#include "ttgxvar.h"
|
|
|
|
#endif
|
|
|
|
|
Complete redesign of error codes. Please check ftmoderr.h for more
details.
* include/freetype/internal/cfferrs.h,
include/freetype/internal/tterrors.h,
include/freetype/internal/t1errors.h: Removed. Replaced with files
local to the module. All extra error codes have been moved to
`fterrors.h'.
* src/sfnt/ttpost.h: Move error codes to `fterrors.h'.
* src/autohint/aherrors.h, src/cache/ftcerror.h, src/cff/cfferrs.h,
src/cid/ciderrs.h, src/pcf/pcferror.h, src/psaux/psauxerr.h,
src/psnames/psnamerr.h, src/raster/rasterrs.h, src/sfnt/sferrors.h,
src/smooth/ftsmerrs.h, src/truetype/tterrors.h,
src/type1/t1errors.h, src/winfonts/fnterrs.h: New files defining the
error names for the module it belongs to.
* include/freetype/ftmoderr.h: New file, defining the module error
offsets. Its structure is similar to `fterrors.h'.
* include/freetype/fterrors.h (FT_NOERRORDEF): New macro.
(FT_ERRORDEF): Redefined to use module error offsets.
All internal error codes are now public; unused error codes have
been removed, some are new.
* include/freetype/config/ftheader.h (FT_MODULE_ERRORS_H): New
macro.
* include/freetype/config/ftoption.h
(FT_CONFIG_OPTION_USE_MODULE_ERRORS): New macro.
All other source files have been updated to use the new error codes;
some already existing (internal) error codes local to a module have
been renamed to give them the same name as in the base module.
All make files have been updated to include the local error files.
* src/cid/cidtokens.h: Replaced with...
* src/cid/cidtoken.h: This file for 8+3 consistency.
* src/raster/ftraster.c: Use macros for header file names.
2001-06-06 19:30:41 +02:00
|
|
|
#include "tterrors.h"
|
[truetype] Support subpixel hinting.
This is the large, famous `Infinality' patch to support ClearType
bytecode which has been available from
http://www.infinality.net/blog/ for some time, and which has been
refined over the last years. While still experimental, it is now
mature enough to be included directly into FreeType.
Most of the code is based on the ClearType whitepaper written by
Greg Hitchcock
http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
which gives a detailed overview of the necessary changes to the
Microsoft rasterizer so that older fonts are supported. However, a
lot of details are still missing, and this patches provides a
framework to easily handle rendering issues down to the glyph level
of certain fonts.
Note that ClearType support is not completely implemented! In
particular, full support for the options `compatible_widths',
`symmetrical_smoothing, and `bgr' (via the GETINFO bytecode
instruction) is missing.
* src/truetype/ttsubpix.c: New file, providing code to handle
`tweaks', this is, rules for certain glyphs in certain fonts
(including wildcards) which need a special treatment.
* src/truetype/ttsubpix.h: New file, holding the tweaking rules.
* include/freetype/config/ftoption.h, src/devel/ftoption.h
(TT_CONFIG_OPTION_SUBPIXEL_HINTING): New macro.
* include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID,
FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): New macros.
* src/truetype/truetype.c [TT_USE_BYTECODE_INTERPRETER]: Include
`ttsubpix.c'.
* src/truetype/ttgload.c: Include `ttsubpix.h'.
[All changes below are guarded by TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(tt_get_metrics): Set tweak flags.
(TT_Hint_Glyph): Call `FT_Outline_EmboldenXY' if necessary.
(TT_Process_Simple_Glyph): Compensate emboldening if necessary.
(compute_glyph_metrics): Handle `compatible widths' option.
(tt_loader_init): Handle ClearType GETINFO information bits.
* src/truetype/rules.mk (TT_DRC_SRC): Updated.
* src/truetype/ttinterp.c: Include `ttsubpix.h'.
[Where necessary, changes below are guarded by
TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(Direct_Move, Direct_Move_X): Extended.
(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45,
SetSuperRound): Add parameter to handle the number of grid lines per
pixel.
(SET_SuperRound, ROUND_None, CUR_Func_round): Updated.
(DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated.
(DO_ROUND, DO_NROUND): Updated.
(DO_RS): Take care of `Typeman' bytecode patterns.
(Ins_FDEF): Add some debugging code. Commented out.
(Ins_ENDF): Restore state.
(Ins_CALL, Ins_LOOPCALL): Handle inline delta functions.
(Ins_MD): Handle `Vacuform' rounds.
(Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP,
Ins_MDRP, Ins_MIRP): Handle tweaks.
(Ins_ALIGNRP): Add tweak guard.
(Ins_IUP, Ins_DELTAP): Handle tweaks.
(Ins_GETINFO): Handle new ClearType bits.
(TT_RunIns): Handle tweaks.
* src/truetype/ttinterp.h: Updated.
(SPH_TweakRule, SPH_ScaleRule): New structures for tweaks.
(TT_ExecContextRec): Add members for subpixel hinting support.
* src/truetype/ttobjs.h (TT_DefRecord): Add `inline_delta' member.
2012-06-18 10:36:06 +02:00
|
|
|
#include "ttsubpix.h"
|
Complete redesign of error codes. Please check ftmoderr.h for more
details.
* include/freetype/internal/cfferrs.h,
include/freetype/internal/tterrors.h,
include/freetype/internal/t1errors.h: Removed. Replaced with files
local to the module. All extra error codes have been moved to
`fterrors.h'.
* src/sfnt/ttpost.h: Move error codes to `fterrors.h'.
* src/autohint/aherrors.h, src/cache/ftcerror.h, src/cff/cfferrs.h,
src/cid/ciderrs.h, src/pcf/pcferror.h, src/psaux/psauxerr.h,
src/psnames/psnamerr.h, src/raster/rasterrs.h, src/sfnt/sferrors.h,
src/smooth/ftsmerrs.h, src/truetype/tterrors.h,
src/type1/t1errors.h, src/winfonts/fnterrs.h: New files defining the
error names for the module it belongs to.
* include/freetype/ftmoderr.h: New file, defining the module error
offsets. Its structure is similar to `fterrors.h'.
* include/freetype/fterrors.h (FT_NOERRORDEF): New macro.
(FT_ERRORDEF): Redefined to use module error offsets.
All internal error codes are now public; unused error codes have
been removed, some are new.
* include/freetype/config/ftheader.h (FT_MODULE_ERRORS_H): New
macro.
* include/freetype/config/ftoption.h
(FT_CONFIG_OPTION_USE_MODULE_ERRORS): New macro.
All other source files have been updated to use the new error codes;
some already existing (internal) error codes local to a module have
been renamed to give them the same name as in the base module.
All make files have been updated to include the local error files.
* src/cid/cidtokens.h: Replaced with...
* src/cid/cidtoken.h: This file for 8+3 consistency.
* src/raster/ftraster.c: Use macros for header file names.
2001-06-06 19:30:41 +02:00
|
|
|
|
2000-07-08 02:41:13 +02:00
|
|
|
|
2000-06-12 21:36:41 +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. */
|
|
|
|
/* */
|
1999-12-17 00:11:37 +01:00
|
|
|
#undef FT_COMPONENT
|
|
|
|
#define FT_COMPONENT trace_ttgload
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
2011-03-21 09:28:52 +01:00
|
|
|
/* Composite glyph flags. */
|
1999-12-17 00:11:37 +01:00
|
|
|
/* */
|
2002-08-16 14:46:52 +02:00
|
|
|
#define ARGS_ARE_WORDS 0x0001
|
|
|
|
#define ARGS_ARE_XY_VALUES 0x0002
|
|
|
|
#define ROUND_XY_TO_GRID 0x0004
|
|
|
|
#define WE_HAVE_A_SCALE 0x0008
|
|
|
|
/* reserved 0x0010 */
|
|
|
|
#define MORE_COMPONENTS 0x0020
|
|
|
|
#define WE_HAVE_AN_XY_SCALE 0x0040
|
|
|
|
#define WE_HAVE_A_2X2 0x0080
|
|
|
|
#define WE_HAVE_INSTR 0x0100
|
|
|
|
#define USE_MY_METRICS 0x0200
|
|
|
|
#define OVERLAP_COMPOUND 0x0400
|
|
|
|
#define SCALED_COMPONENT_OFFSET 0x0800
|
|
|
|
#define UNSCALED_COMPONENT_OFFSET 0x1000
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-06-16 21:34:52 +02:00
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
/*************************************************************************/
|
2000-06-12 21:36:41 +02:00
|
|
|
/* */
|
2011-04-21 08:21:37 +02:00
|
|
|
/* Return the horizontal metrics in font units for a given glyph. */
|
1999-12-17 00:11:37 +01:00
|
|
|
/* */
|
2009-11-02 08:35:24 +01:00
|
|
|
FT_LOCAL_DEF( void )
|
* include/freetype/ftadvanc.h, src/base/ftadvanc.c,
include/freetype/config/ftheader.h, include/freetype/freetype.h,
src/base/Jamfile, src/base/rules.mk, src/cff/cffdrivr.c,
src/cff/cffgload.c, src/cff/cffgload.h, src/truetype/ttdriver.c,
src/truetype/ttgload.h, src/truetype/ttgload.c, src/type1/t1driver.c,
src/type1/t1gload.h, src/type1/t1gload.c:
Add a new header named FT_ADVANCES_H declaring some new APIs
to extract the advances of one or more glyphs without necessarily
loading their outlines. Also provide 'fast loaders' for the
TrueType, Type1 and CFF font drivers (more to come later)
* autogen.sh: add checks for minimum version of the 'autotools'
stuff.
2008-09-01 23:35:21 +02:00
|
|
|
TT_Get_HMetrics( TT_Face face,
|
|
|
|
FT_UInt idx,
|
|
|
|
FT_Short* lsb,
|
|
|
|
FT_UShort* aw )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
Clean up the SFNT_Interface. Table loading functions are now named
after the tables' tags; `hdmx' is TrueType-specific and thus the code
is moved to the truetype module; `get_metrics' is moved here from the
truetype module so that the code can be shared with the cff module.
This pass involves no real changes. That is, the code is moved
verbatim mostly. The only exception is the return value of
`tt_face_get_metrics'.
* include/freetype/internal/sfnt.h, src/sfnt/rules.mk,
src/sfnt/sfdriver.c, src/sfnt/sfnt.c, src/sfnt/sfobjs.c,
src/sfnt/ttload.c, src/sfnt/ttload.h, src/sfnt/ttsbit.c,
src/sfnt/ttsbit.h, src/sfnt/ttsbit0.c: Clean up the SFNT_Interface.
* src/sfnt/ttmtx.c, src/sfnt/ttmtx.h: Metrics-related tables' loading
and parsing code is moved here.
Move `tt_face_get_metrics' here from the truetype module. The return
value is changed from `void' to `FT_Error'.
* include/freetype/internal/fttrace.h: New trace: ttmtx.
* src/truetype/ttpload.c, src/truetype/ttpload.h: `hdmx' loading and
parsing code is moved here.
New function `tt_face_load_prep' splitted from `tt_face_load_fpgm'.
`tt_face_load_fpgm' returns `FT_Err_Ok' if `fpgm' doesn't exist.
* src/cff/cffgload.c, src/cff/cffobjs.c: Update.
* src/truetype/ttgload.c, src/truetype/ttobjs.c: Update.
2006-02-14 07:40:10 +01:00
|
|
|
( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw );
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2009-11-15 10:10:00 +01:00
|
|
|
FT_TRACE5(( " advance width (font units): %d\n", *aw ));
|
|
|
|
FT_TRACE5(( " left side bearing (font units): %d\n", *lsb ));
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-03-27 09:43:17 +01:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
2011-04-21 08:21:37 +02:00
|
|
|
/* Return the vertical metrics in font units for a given glyph. */
|
2004-03-27 09:43:17 +01:00
|
|
|
/* Greg Hitchcock from Microsoft told us that if there were no `vmtx' */
|
|
|
|
/* table, typoAscender/Descender from the `OS/2' table would be used */
|
|
|
|
/* instead, and if there were no `OS/2' table, use ascender/descender */
|
|
|
|
/* from the `hhea' table. But that is not what Microsoft's rasterizer */
|
|
|
|
/* apparently does: It uses the ppem value as the advance height, and */
|
|
|
|
/* sets the top side bearing to be zero. */
|
|
|
|
/* */
|
2009-11-02 08:35:24 +01:00
|
|
|
FT_LOCAL_DEF( void )
|
* include/freetype/ftadvanc.h, src/base/ftadvanc.c,
include/freetype/config/ftheader.h, include/freetype/freetype.h,
src/base/Jamfile, src/base/rules.mk, src/cff/cffdrivr.c,
src/cff/cffgload.c, src/cff/cffgload.h, src/truetype/ttdriver.c,
src/truetype/ttgload.h, src/truetype/ttgload.c, src/type1/t1driver.c,
src/type1/t1gload.h, src/type1/t1gload.c:
Add a new header named FT_ADVANCES_H declaring some new APIs
to extract the advances of one or more glyphs without necessarily
loading their outlines. Also provide 'fast loaders' for the
TrueType, Type1 and CFF font drivers (more to come later)
* autogen.sh: add checks for minimum version of the 'autotools'
stuff.
2008-09-01 23:35:21 +02:00
|
|
|
TT_Get_VMetrics( TT_Face face,
|
|
|
|
FT_UInt idx,
|
|
|
|
FT_Short* tsb,
|
|
|
|
FT_UShort* ah )
|
2004-03-27 09:43:17 +01:00
|
|
|
{
|
|
|
|
if ( face->vertical_info )
|
Clean up the SFNT_Interface. Table loading functions are now named
after the tables' tags; `hdmx' is TrueType-specific and thus the code
is moved to the truetype module; `get_metrics' is moved here from the
truetype module so that the code can be shared with the cff module.
This pass involves no real changes. That is, the code is moved
verbatim mostly. The only exception is the return value of
`tt_face_get_metrics'.
* include/freetype/internal/sfnt.h, src/sfnt/rules.mk,
src/sfnt/sfdriver.c, src/sfnt/sfnt.c, src/sfnt/sfobjs.c,
src/sfnt/ttload.c, src/sfnt/ttload.h, src/sfnt/ttsbit.c,
src/sfnt/ttsbit.h, src/sfnt/ttsbit0.c: Clean up the SFNT_Interface.
* src/sfnt/ttmtx.c, src/sfnt/ttmtx.h: Metrics-related tables' loading
and parsing code is moved here.
Move `tt_face_get_metrics' here from the truetype module. The return
value is changed from `void' to `FT_Error'.
* include/freetype/internal/fttrace.h: New trace: ttmtx.
* src/truetype/ttpload.c, src/truetype/ttpload.h: `hdmx' loading and
parsing code is moved here.
New function `tt_face_load_prep' splitted from `tt_face_load_fpgm'.
`tt_face_load_fpgm' returns `FT_Err_Ok' if `fpgm' doesn't exist.
* src/cff/cffgload.c, src/cff/cffobjs.c: Update.
* src/truetype/ttgload.c, src/truetype/ttobjs.c: Update.
2006-02-14 07:40:10 +01:00
|
|
|
( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah );
|
2004-03-27 09:43:17 +01:00
|
|
|
|
2007-02-01 08:58:02 +01:00
|
|
|
#if 1 /* Empirically determined, at variance with what MS said */
|
2004-03-27 09:43:17 +01:00
|
|
|
|
|
|
|
else
|
|
|
|
{
|
|
|
|
*tsb = 0;
|
|
|
|
*ah = face->root.units_per_EM;
|
|
|
|
}
|
|
|
|
|
|
|
|
#else /* This is what MS said to do. It isn't what they do, however. */
|
|
|
|
|
|
|
|
else if ( face->os2.version != 0xFFFFU )
|
|
|
|
{
|
|
|
|
*tsb = face->os2.sTypoAscender;
|
|
|
|
*ah = face->os2.sTypoAscender - face->os2.sTypoDescender;
|
|
|
|
}
|
2004-06-21 23:16:56 +02:00
|
|
|
else
|
2004-03-27 09:43:17 +01:00
|
|
|
{
|
|
|
|
*tsb = face->horizontal.Ascender;
|
|
|
|
*ah = face->horizontal.Ascender - face->horizontal.Descender;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2009-11-15 10:10:00 +01:00
|
|
|
FT_TRACE5(( " advance height (font units): %d\n", *ah ));
|
|
|
|
FT_TRACE5(( " top side bearing (font units): %d\n", *tsb ));
|
2004-03-27 09:43:17 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-11-03 08:11:02 +01:00
|
|
|
static void
|
|
|
|
tt_get_metrics( TT_Loader loader,
|
|
|
|
FT_UInt glyph_index )
|
|
|
|
{
|
|
|
|
TT_Face face = (TT_Face)loader->face;
|
|
|
|
|
|
|
|
FT_Short left_bearing = 0, top_bearing = 0;
|
|
|
|
FT_UShort advance_width = 0, advance_height = 0;
|
|
|
|
|
|
|
|
|
|
|
|
TT_Get_HMetrics( face, glyph_index,
|
|
|
|
&left_bearing,
|
|
|
|
&advance_width );
|
|
|
|
TT_Get_VMetrics( face, glyph_index,
|
|
|
|
&top_bearing,
|
|
|
|
&advance_height );
|
|
|
|
|
2010-02-18 17:09:30 +01:00
|
|
|
loader->left_bearing = left_bearing;
|
|
|
|
loader->advance = advance_width;
|
|
|
|
loader->top_bearing = top_bearing;
|
|
|
|
loader->vadvance = advance_height;
|
|
|
|
|
[truetype] Support subpixel hinting.
This is the large, famous `Infinality' patch to support ClearType
bytecode which has been available from
http://www.infinality.net/blog/ for some time, and which has been
refined over the last years. While still experimental, it is now
mature enough to be included directly into FreeType.
Most of the code is based on the ClearType whitepaper written by
Greg Hitchcock
http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
which gives a detailed overview of the necessary changes to the
Microsoft rasterizer so that older fonts are supported. However, a
lot of details are still missing, and this patches provides a
framework to easily handle rendering issues down to the glyph level
of certain fonts.
Note that ClearType support is not completely implemented! In
particular, full support for the options `compatible_widths',
`symmetrical_smoothing, and `bgr' (via the GETINFO bytecode
instruction) is missing.
* src/truetype/ttsubpix.c: New file, providing code to handle
`tweaks', this is, rules for certain glyphs in certain fonts
(including wildcards) which need a special treatment.
* src/truetype/ttsubpix.h: New file, holding the tweaking rules.
* include/freetype/config/ftoption.h, src/devel/ftoption.h
(TT_CONFIG_OPTION_SUBPIXEL_HINTING): New macro.
* include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID,
FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): New macros.
* src/truetype/truetype.c [TT_USE_BYTECODE_INTERPRETER]: Include
`ttsubpix.c'.
* src/truetype/ttgload.c: Include `ttsubpix.h'.
[All changes below are guarded by TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(tt_get_metrics): Set tweak flags.
(TT_Hint_Glyph): Call `FT_Outline_EmboldenXY' if necessary.
(TT_Process_Simple_Glyph): Compensate emboldening if necessary.
(compute_glyph_metrics): Handle `compatible widths' option.
(tt_loader_init): Handle ClearType GETINFO information bits.
* src/truetype/rules.mk (TT_DRC_SRC): Updated.
* src/truetype/ttinterp.c: Include `ttsubpix.h'.
[Where necessary, changes below are guarded by
TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(Direct_Move, Direct_Move_X): Extended.
(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45,
SetSuperRound): Add parameter to handle the number of grid lines per
pixel.
(SET_SuperRound, ROUND_None, CUR_Func_round): Updated.
(DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated.
(DO_ROUND, DO_NROUND): Updated.
(DO_RS): Take care of `Typeman' bytecode patterns.
(Ins_FDEF): Add some debugging code. Commented out.
(Ins_ENDF): Restore state.
(Ins_CALL, Ins_LOOPCALL): Handle inline delta functions.
(Ins_MD): Handle `Vacuform' rounds.
(Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP,
Ins_MDRP, Ins_MIRP): Handle tweaks.
(Ins_ALIGNRP): Add tweak guard.
(Ins_IUP, Ins_DELTAP): Handle tweaks.
(Ins_GETINFO): Handle new ClearType bits.
(TT_RunIns): Handle tweaks.
* src/truetype/ttinterp.h: Updated.
(SPH_TweakRule, SPH_ScaleRule): New structures for tweaks.
(TT_ExecContextRec): Add members for subpixel hinting support.
* src/truetype/ttobjs.h (TT_DefRecord): Add `inline_delta' member.
2012-06-18 10:36:06 +02:00
|
|
|
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
|
|
|
if ( loader->exec )
|
|
|
|
loader->exec->sph_tweak_flags = 0;
|
|
|
|
|
|
|
|
/* this may not be the right place for this, but it works */
|
|
|
|
if ( loader->exec && loader->exec->ignore_x_mode )
|
|
|
|
sph_set_tweaks( loader, glyph_index );
|
|
|
|
#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
|
|
|
|
2010-02-18 17:09:30 +01:00
|
|
|
if ( !loader->linear_def )
|
|
|
|
{
|
|
|
|
loader->linear_def = 1;
|
|
|
|
loader->linear = advance_width;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-11-03 08:11:02 +01:00
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
|
|
|
|
2010-02-18 17:09:30 +01:00
|
|
|
static void
|
|
|
|
tt_get_metrics_incr_overrides( TT_Loader loader,
|
|
|
|
FT_UInt glyph_index )
|
|
|
|
{
|
|
|
|
TT_Face face = (TT_Face)loader->face;
|
|
|
|
|
|
|
|
FT_Short left_bearing = 0, top_bearing = 0;
|
|
|
|
FT_UShort advance_width = 0, advance_height = 0;
|
|
|
|
|
|
|
|
|
2010-02-10 07:02:43 +01:00
|
|
|
/* If this is an incrementally loaded font check whether there are */
|
|
|
|
/* overriding metrics for this glyph. */
|
|
|
|
if ( face->root.internal->incremental_interface &&
|
2009-11-03 08:11:02 +01:00
|
|
|
face->root.internal->incremental_interface->funcs->get_glyph_metrics )
|
|
|
|
{
|
|
|
|
FT_Incremental_MetricsRec metrics;
|
|
|
|
FT_Error error;
|
|
|
|
|
|
|
|
|
2010-02-18 17:09:30 +01:00
|
|
|
metrics.bearing_x = loader->left_bearing;
|
2009-11-03 08:11:02 +01:00
|
|
|
metrics.bearing_y = 0;
|
2010-02-18 17:09:30 +01:00
|
|
|
metrics.advance = loader->advance;
|
2010-02-10 07:02:43 +01:00
|
|
|
metrics.advance_v = 0;
|
2009-11-03 08:11:02 +01:00
|
|
|
|
|
|
|
error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
|
|
|
|
face->root.internal->incremental_interface->object,
|
|
|
|
glyph_index, FALSE, &metrics );
|
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
left_bearing = (FT_Short)metrics.bearing_x;
|
|
|
|
advance_width = (FT_UShort)metrics.advance;
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
|
|
|
/* GWW: Do I do the same for vertical metrics? */
|
|
|
|
metrics.bearing_x = 0;
|
2010-02-18 17:09:30 +01:00
|
|
|
metrics.bearing_y = loader->top_bearing;
|
|
|
|
metrics.advance = loader->vadvance;
|
2009-11-03 08:11:02 +01:00
|
|
|
|
|
|
|
error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
|
|
|
|
face->root.internal->incremental_interface->object,
|
|
|
|
glyph_index, TRUE, &metrics );
|
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
top_bearing = (FT_Short)metrics.bearing_y;
|
|
|
|
advance_height = (FT_UShort)metrics.advance;
|
|
|
|
|
|
|
|
#endif /* 0 */
|
|
|
|
|
2010-02-18 17:09:30 +01:00
|
|
|
loader->left_bearing = left_bearing;
|
|
|
|
loader->advance = advance_width;
|
|
|
|
loader->top_bearing = top_bearing;
|
|
|
|
loader->vadvance = advance_height;
|
|
|
|
|
|
|
|
if ( !loader->linear_def )
|
|
|
|
{
|
|
|
|
loader->linear_def = 1;
|
|
|
|
loader->linear = advance_width;
|
|
|
|
}
|
2009-11-03 08:11:02 +01:00
|
|
|
}
|
|
|
|
|
2009-12-03 05:57:30 +01:00
|
|
|
Exit:
|
2010-02-18 17:09:30 +01:00
|
|
|
return;
|
|
|
|
}
|
2009-12-03 05:57:30 +01:00
|
|
|
|
2009-11-03 08:11:02 +01:00
|
|
|
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
|
|
|
|
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
/*************************************************************************/
|
2000-06-12 21:36:41 +02:00
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* Translates an array of coordinates. */
|
1999-12-17 00:11:37 +01:00
|
|
|
/* */
|
2001-06-28 09:17:51 +02:00
|
|
|
static void
|
|
|
|
translate_array( FT_UInt n,
|
|
|
|
FT_Vector* coords,
|
|
|
|
FT_Pos delta_x,
|
|
|
|
FT_Pos delta_y )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2000-06-16 21:34:52 +02:00
|
|
|
FT_UInt k;
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2000-07-02 15:53:16 +02:00
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
if ( delta_x )
|
|
|
|
for ( k = 0; k < n; k++ )
|
|
|
|
coords[k].x += delta_x;
|
|
|
|
|
|
|
|
if ( delta_y )
|
|
|
|
for ( k = 0; k < n; k++ )
|
|
|
|
coords[k].y += delta_y;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-02-02 13:16:19 +01:00
|
|
|
#undef IS_HINTED
|
2000-06-12 21:36:41 +02:00
|
|
|
#define IS_HINTED( flags ) ( ( flags & FT_LOAD_NO_HINTING ) == 0 )
|
|
|
|
|
2000-02-02 13:16:19 +01:00
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
/* The following functions are used by default with TrueType fonts. */
|
|
|
|
/* However, they can be replaced by alternatives if we need to support */
|
|
|
|
/* TrueType-compressed formats (like MicroType) in the future. */
|
1999-12-17 00:11:37 +01:00
|
|
|
/* */
|
2000-06-25 08:47:11 +02:00
|
|
|
/*************************************************************************/
|
2000-06-23 14:26:14 +02:00
|
|
|
|
2001-06-28 09:17:51 +02:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
2002-04-01 16:25:28 +02:00
|
|
|
TT_Access_Glyph_Frame( TT_Loader loader,
|
|
|
|
FT_UInt glyph_index,
|
|
|
|
FT_ULong offset,
|
|
|
|
FT_UInt byte_count )
|
2000-06-23 14:26:14 +02:00
|
|
|
{
|
2000-07-31 20:59:02 +02:00
|
|
|
FT_Error error;
|
|
|
|
FT_Stream stream = loader->stream;
|
|
|
|
|
2000-08-29 20:58:41 +02:00
|
|
|
/* for non-debug mode */
|
|
|
|
FT_UNUSED( glyph_index );
|
|
|
|
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2010-06-29 12:31:08 +02:00
|
|
|
FT_TRACE4(( "Glyph %ld\n", glyph_index ));
|
2000-06-25 08:47:11 +02:00
|
|
|
|
|
|
|
/* the following line sets the `error' variable through macros! */
|
2002-03-20 11:49:31 +01:00
|
|
|
if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) )
|
2000-07-31 20:59:02 +02:00
|
|
|
return error;
|
2000-07-05 06:32:02 +02: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
|
|
|
loader->cursor = stream->cursor;
|
|
|
|
loader->limit = stream->limit;
|
|
|
|
|
2000-07-31 20:59:02 +02:00
|
|
|
return TT_Err_Ok;
|
2000-07-05 06:32:02 +02:00
|
|
|
}
|
2000-06-23 14:26:14 +02:00
|
|
|
|
|
|
|
|
2001-06-28 09:17:51 +02:00
|
|
|
FT_CALLBACK_DEF( void )
|
2002-04-01 16:25:28 +02:00
|
|
|
TT_Forget_Glyph_Frame( TT_Loader loader )
|
2000-06-23 14:26:14 +02:00
|
|
|
{
|
|
|
|
FT_Stream stream = loader->stream;
|
2000-06-25 08:47:11 +02:00
|
|
|
|
|
|
|
|
2002-03-20 11:49:31 +01:00
|
|
|
FT_FRAME_EXIT();
|
2000-07-05 06:32:02 +02:00
|
|
|
}
|
2000-06-23 14:26:14 +02:00
|
|
|
|
|
|
|
|
2001-06-28 09:17:51 +02:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
2002-04-01 16:25:28 +02:00
|
|
|
TT_Load_Glyph_Header( TT_Loader loader )
|
2000-06-23 14:26:14 +02:00
|
|
|
{
|
2006-05-18 00:55:04 +02:00
|
|
|
FT_Byte* p = loader->cursor;
|
|
|
|
FT_Byte* limit = loader->limit;
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2002-01-06 17:42:44 +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
|
|
|
if ( p + 10 > limit )
|
2002-01-06 11:13:40 +01:00
|
|
|
return TT_Err_Invalid_Outline;
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
loader->n_contours = FT_NEXT_SHORT( p );
|
2000-06-23 14:26:14 +02:00
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
loader->bbox.xMin = FT_NEXT_SHORT( p );
|
|
|
|
loader->bbox.yMin = FT_NEXT_SHORT( p );
|
|
|
|
loader->bbox.xMax = FT_NEXT_SHORT( p );
|
|
|
|
loader->bbox.yMax = FT_NEXT_SHORT( p );
|
2000-06-23 14:26:14 +02:00
|
|
|
|
|
|
|
FT_TRACE5(( " # of contours: %d\n", loader->n_contours ));
|
|
|
|
FT_TRACE5(( " xMin: %4d xMax: %4d\n", loader->bbox.xMin,
|
|
|
|
loader->bbox.xMax ));
|
|
|
|
FT_TRACE5(( " yMin: %4d yMax: %4d\n", loader->bbox.yMin,
|
|
|
|
loader->bbox.yMax ));
|
* 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
|
|
|
loader->cursor = p;
|
2000-07-05 06:32:02 +02:00
|
|
|
|
* README: Formatting.
* Jamfile: Fix typo.
* src/cff/cffparse.c: Move error code #defines to...
* include/freetype/internal/cfferrs.h: This file.
* src/cff/cffdrivr.c, src/cff/cffobjs.c, src/cff/cffload.c: Replaced
`FT_Err_*' with `CFF_Err_*'.
* src/cid/cidparse.c: Replaced `FT_Err_*' with `T1_Err_*'.
* src/psaux/psobjs.c, src/psaux/t1decode.c: Ditto.
* src/sfnt/sfobcs.c, src/sfnt/ttload.c: Replaced `FT_Err_*' with
`TT_Err_*'.
* src/truetype/ttgload.c, src/truetype/ttobjs.c: Ditto.
* src/type1/t1gload.c, src/type1/t1load.c, src/type1/t1objs.c,
src/type1/t1parse.c: Replaced `FT_Err_*' with `T1_Err_*'.
* include/freetype/internal/cfferrs.h: Add
`CFF_Err_Unknown_File_Format'.
* include/freetype/internal/t1errors.h: Add
`T1_Err_Unknown_File_Format'.
* include/freetype/internal/tterrors.h: Add
`TT_Err_Unknown_File_Format'.
* src/cff/cffload.h: Add `cff_*_encoding' and `cff_*_charset'
references.
* src/psaux/psobjs.c: Include `FT_INTERNAL_TYPE1_ERRORS_H'.
* src/cff/cffobjs.c (CFF_Init_Face, CFF_Done_Face): Use
FT_LOCAL_DEF.
* src/cid/cidobjs.c (CID_Done_Driver): Ditto.
* src/trutype/ttobjs.c (TT_Init_Face, TT_Done_Face, TT_Init_Size):
Ditto.
* src/type1/t1objs.c (T1_Done_Driver): Ditto.
* src/pcf/pcfdriver.c (PCF_Done_Face): Ditto.
* src/pcf/pcf.h: Use FT_LOCAL for `PCF_Done_Face'.
2001-04-03 01:54:01 +02:00
|
|
|
return TT_Err_Ok;
|
2000-07-05 06:32:02 +02:00
|
|
|
}
|
2000-06-23 14:26:14 +02:00
|
|
|
|
|
|
|
|
2001-06-28 09:17:51 +02:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
2002-04-01 16:25:28 +02:00
|
|
|
TT_Load_Simple_Glyph( TT_Loader load )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2002-04-01 16:25:28 +02:00
|
|
|
FT_Error error;
|
* 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
|
|
|
FT_Byte* p = load->cursor;
|
|
|
|
FT_Byte* limit = load->limit;
|
2002-04-01 16:25:28 +02:00
|
|
|
FT_GlyphLoader gloader = load->gloader;
|
|
|
|
FT_Int n_contours = load->n_contours;
|
|
|
|
FT_Outline* outline;
|
|
|
|
TT_Face face = (TT_Face)load->face;
|
|
|
|
FT_UShort n_ins;
|
2007-06-11 02:55:23 +02:00
|
|
|
FT_Int n_points;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2003-06-09 17:54:18 +02:00
|
|
|
FT_Byte *flag, *flag_limit;
|
|
|
|
FT_Byte c, count;
|
|
|
|
FT_Vector *vec, *vec_limit;
|
|
|
|
FT_Pos x;
|
2007-06-16 19:07:20 +02:00
|
|
|
FT_Short *cont, *cont_limit, prev_cont;
|
2007-06-11 02:18:00 +02:00
|
|
|
FT_Int xy_size = 0;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* check that we can add the contours to the glyph */
|
2005-10-28 18:14:14 +02:00
|
|
|
error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours );
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( error )
|
|
|
|
goto Fail;
|
|
|
|
|
* src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
* src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
* src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
Use FT_BEGIN_HEADER and FT_END_HEADER.
Use FT_LOCAL.
2004-04-24 George Williams <gww@silcom.com>
Add support for Apple's distortable font technology (in GX fonts).
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
* include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
FT_MM_Var): New structures.
(FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New function declarations.
* include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
FT_Set_Var_Design_Func): New typedefs.
Update MultiMasters service.
* include/freetype/internal/tttypes.h
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
(GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
(TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
and `blend'.
* include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
macros.
* include/freetype/internal/fttrace.h: Add `ttgxvar'.
* src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New functions.
* src/sfnt/sfobjs.c (sfnt_load_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
flag for GX var fonts.
* src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
* src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.c.
* src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
(tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
New service.
(tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(TT_Process_Simple_Glyph, load_truetype_glyph)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_done_blend.
* src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_face_vary_cvt.
* src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
* src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
and T1_Set_Var_Design.
* src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
(T1_Get_MM_Var, T1_Set_Var_Design): New functions.
* src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
function declarations.
2004-04-25 22:15:11 +02:00
|
|
|
/* reading the contours' endpoints & number of points */
|
2003-06-09 17:54:18 +02:00
|
|
|
cont = gloader->current.outline.contours;
|
|
|
|
cont_limit = cont + n_contours;
|
2002-01-06 17:42:44 +01:00
|
|
|
|
2003-06-09 17:54:18 +02:00
|
|
|
/* check space for contours array + instructions count */
|
2007-06-17 07:31:23 +02:00
|
|
|
if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit )
|
2003-06-09 17:54:18 +02:00
|
|
|
goto Invalid_Outline;
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2012-03-02 16:09:51 +01:00
|
|
|
prev_cont = FT_NEXT_SHORT( p );
|
2008-05-17 22:06:13 +02:00
|
|
|
|
|
|
|
if ( n_contours > 0 )
|
|
|
|
cont[0] = prev_cont;
|
|
|
|
|
2012-03-02 16:09:51 +01:00
|
|
|
if ( prev_cont < 0 )
|
|
|
|
goto Invalid_Outline;
|
|
|
|
|
2007-06-16 19:07:20 +02:00
|
|
|
for ( cont++; cont < cont_limit; cont++ )
|
|
|
|
{
|
2012-03-02 16:09:51 +01:00
|
|
|
cont[0] = FT_NEXT_SHORT( p );
|
2007-06-23 00:22:38 +02:00
|
|
|
if ( cont[0] <= prev_cont )
|
2007-06-16 19:07:20 +02:00
|
|
|
{
|
2007-06-17 07:31:23 +02:00
|
|
|
/* unordered contours: this is invalid */
|
2012-02-29 17:29:07 +01:00
|
|
|
goto Invalid_Outline;
|
2007-06-16 19:07:20 +02:00
|
|
|
}
|
|
|
|
prev_cont = cont[0];
|
|
|
|
}
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2003-06-09 17:54:18 +02:00
|
|
|
n_points = 0;
|
|
|
|
if ( n_contours > 0 )
|
2007-05-16 17:48:02 +02:00
|
|
|
{
|
2003-06-09 17:54:18 +02:00
|
|
|
n_points = cont[-1] + 1;
|
2007-05-16 17:48:02 +02:00
|
|
|
if ( n_points < 0 )
|
|
|
|
goto Invalid_Outline;
|
|
|
|
}
|
- 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
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* note that we will add four phantom points later */
|
2005-10-28 18:14:14 +02:00
|
|
|
error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 );
|
2003-06-09 17:54:18 +02:00
|
|
|
if ( error )
|
|
|
|
goto Fail;
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
/* reading the bytecode instructions */
|
2005-08-16 03:54:59 +02:00
|
|
|
load->glyph->control_len = 0;
|
|
|
|
load->glyph->control_data = 0;
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
if ( p + 2 > limit )
|
* 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
|
|
|
goto Invalid_Outline;
|
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
n_ins = FT_NEXT_USHORT( p );
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2003-06-09 17:54:18 +02:00
|
|
|
FT_TRACE5(( " Instructions size: %u\n", n_ins ));
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
if ( n_ins > face->max_profile.maxSizeOfInstructions )
|
|
|
|
{
|
2009-06-26 06:15:41 +02:00
|
|
|
FT_TRACE0(( "TT_Load_Simple_Glyph: too many instructions (%d)\n",
|
2007-06-05 08:58:48 +02:00
|
|
|
n_ins ));
|
Complete redesign of error codes. Please check ftmoderr.h for more
details.
* include/freetype/internal/cfferrs.h,
include/freetype/internal/tterrors.h,
include/freetype/internal/t1errors.h: Removed. Replaced with files
local to the module. All extra error codes have been moved to
`fterrors.h'.
* src/sfnt/ttpost.h: Move error codes to `fterrors.h'.
* src/autohint/aherrors.h, src/cache/ftcerror.h, src/cff/cfferrs.h,
src/cid/ciderrs.h, src/pcf/pcferror.h, src/psaux/psauxerr.h,
src/psnames/psnamerr.h, src/raster/rasterrs.h, src/sfnt/sferrors.h,
src/smooth/ftsmerrs.h, src/truetype/tterrors.h,
src/type1/t1errors.h, src/winfonts/fnterrs.h: New files defining the
error names for the module it belongs to.
* include/freetype/ftmoderr.h: New file, defining the module error
offsets. Its structure is similar to `fterrors.h'.
* include/freetype/fterrors.h (FT_NOERRORDEF): New macro.
(FT_ERRORDEF): Redefined to use module error offsets.
All internal error codes are now public; unused error codes have
been removed, some are new.
* include/freetype/config/ftheader.h (FT_MODULE_ERRORS_H): New
macro.
* include/freetype/config/ftoption.h
(FT_CONFIG_OPTION_USE_MODULE_ERRORS): New macro.
All other source files have been updated to use the new error codes;
some already existing (internal) error codes local to a module have
been renamed to give them the same name as in the base module.
All make files have been updated to include the local error files.
* src/cid/cidtokens.h: Replaced with...
* src/cid/cidtoken.h: This file for 8+3 consistency.
* src/raster/ftraster.c: Use macros for header file names.
2001-06-06 19:30:41 +02:00
|
|
|
error = TT_Err_Too_Many_Hints;
|
1999-12-17 00:11:37 +01:00
|
|
|
goto Fail;
|
|
|
|
}
|
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
if ( ( limit - p ) < n_ins )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2009-06-26 06:15:41 +02:00
|
|
|
FT_TRACE0(( "TT_Load_Simple_Glyph: instruction count mismatch\n" ));
|
Complete redesign of error codes. Please check ftmoderr.h for more
details.
* include/freetype/internal/cfferrs.h,
include/freetype/internal/tterrors.h,
include/freetype/internal/t1errors.h: Removed. Replaced with files
local to the module. All extra error codes have been moved to
`fterrors.h'.
* src/sfnt/ttpost.h: Move error codes to `fterrors.h'.
* src/autohint/aherrors.h, src/cache/ftcerror.h, src/cff/cfferrs.h,
src/cid/ciderrs.h, src/pcf/pcferror.h, src/psaux/psauxerr.h,
src/psnames/psnamerr.h, src/raster/rasterrs.h, src/sfnt/sferrors.h,
src/smooth/ftsmerrs.h, src/truetype/tterrors.h,
src/type1/t1errors.h, src/winfonts/fnterrs.h: New files defining the
error names for the module it belongs to.
* include/freetype/ftmoderr.h: New file, defining the module error
offsets. Its structure is similar to `fterrors.h'.
* include/freetype/fterrors.h (FT_NOERRORDEF): New macro.
(FT_ERRORDEF): Redefined to use module error offsets.
All internal error codes are now public; unused error codes have
been removed, some are new.
* include/freetype/config/ftheader.h (FT_MODULE_ERRORS_H): New
macro.
* include/freetype/config/ftoption.h
(FT_CONFIG_OPTION_USE_MODULE_ERRORS): New macro.
All other source files have been updated to use the new error codes;
some already existing (internal) error codes local to a module have
been renamed to give them the same name as in the base module.
All make files have been updated to include the local error files.
* src/cid/cidtokens.h: Replaced with...
* src/cid/cidtoken.h: This file for 8+3 consistency.
* src/raster/ftraster.c: Use macros for header file names.
2001-06-06 19:30:41 +02:00
|
|
|
error = TT_Err_Too_Many_Hints;
|
1999-12-17 00:11:37 +01:00
|
|
|
goto Fail;
|
|
|
|
}
|
|
|
|
|
2006-08-26 00:45:13 +02:00
|
|
|
#ifdef TT_USE_BYTECODE_INTERPRETER
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( IS_HINTED( load->load_flags ) )
|
2000-02-21 17:01:33 +01:00
|
|
|
{
|
2005-08-16 03:54:59 +02:00
|
|
|
load->glyph->control_len = n_ins;
|
|
|
|
load->glyph->control_data = load->exec->glyphIns;
|
2000-07-05 06:32:02 +02: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
|
|
|
FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins );
|
2000-02-21 17:01:33 +01:00
|
|
|
}
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2006-08-26 00:45:13 +02:00
|
|
|
#endif /* TT_USE_BYTECODE_INTERPRETER */
|
1999-12-17 00:11:37 +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
|
|
|
p += n_ins;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2012-02-29 17:29:07 +01:00
|
|
|
outline = &gloader->current.outline;
|
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
/* reading the point tags */
|
2003-06-09 17:54:18 +02:00
|
|
|
flag = (FT_Byte*)outline->tags;
|
|
|
|
flag_limit = flag + n_points;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2004-10-13 07:15:44 +02:00
|
|
|
FT_ASSERT( flag != NULL );
|
|
|
|
|
2003-12-31 09:48:21 +01:00
|
|
|
while ( flag < flag_limit )
|
2003-06-09 17:54:18 +02:00
|
|
|
{
|
2006-05-18 00:55:04 +02:00
|
|
|
if ( p + 1 > limit )
|
2003-06-09 17:54:18 +02:00
|
|
|
goto Invalid_Outline;
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
*flag++ = c = FT_NEXT_BYTE( p );
|
2003-06-09 17:54:18 +02:00
|
|
|
if ( c & 8 )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2006-05-18 00:55:04 +02:00
|
|
|
if ( p + 1 > limit )
|
2002-01-06 11:13:40 +01:00
|
|
|
goto Invalid_Outline;
|
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
count = FT_NEXT_BYTE( p );
|
2003-06-09 17:54:18 +02:00
|
|
|
if ( flag + (FT_Int)count > flag_limit )
|
|
|
|
goto Invalid_Outline;
|
2002-01-06 11:13:40 +01:00
|
|
|
|
2003-06-09 17:54:18 +02:00
|
|
|
for ( ; count > 0; count-- )
|
|
|
|
*flag++ = c;
|
2002-01-06 11:13:40 +01:00
|
|
|
}
|
2003-06-09 17:54:18 +02:00
|
|
|
}
|
2002-01-06 11:13:40 +01:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
/* reading the X coordinates */
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2003-06-09 17:54:18 +02:00
|
|
|
vec = outline->points;
|
|
|
|
vec_limit = vec + n_points;
|
|
|
|
flag = (FT_Byte*)outline->tags;
|
|
|
|
x = 0;
|
|
|
|
|
2007-06-11 02:18:00 +02:00
|
|
|
if ( p + xy_size > limit )
|
|
|
|
goto Invalid_Outline;
|
|
|
|
|
2003-06-09 17:54:18 +02:00
|
|
|
for ( ; vec < vec_limit; vec++, flag++ )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2008-10-02 12:40:52 +02:00
|
|
|
FT_Pos y = 0;
|
|
|
|
FT_Byte f = *flag;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2007-06-11 02:18:00 +02:00
|
|
|
if ( f & 2 )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2007-06-11 06:55:58 +02:00
|
|
|
if ( p + 1 > limit )
|
* 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
|
|
|
goto Invalid_Outline;
|
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
y = (FT_Pos)FT_NEXT_BYTE( p );
|
2007-06-11 02:18:00 +02:00
|
|
|
if ( ( f & 16 ) == 0 )
|
2003-06-09 17:54:18 +02:00
|
|
|
y = -y;
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
2007-06-11 02:18:00 +02:00
|
|
|
else if ( ( f & 16 ) == 0 )
|
* 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
|
|
|
{
|
2007-06-11 06:55:58 +02:00
|
|
|
if ( p + 2 > limit )
|
* 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
|
|
|
goto Invalid_Outline;
|
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
y = (FT_Pos)FT_NEXT_SHORT( p );
|
* 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
|
|
|
}
|
2003-06-09 17:54:18 +02:00
|
|
|
|
|
|
|
x += y;
|
|
|
|
vec->x = x;
|
2008-10-02 12:40:52 +02:00
|
|
|
/* the cast is for stupid compilers */
|
|
|
|
*flag = (FT_Byte)( f & ~( 2 | 16 ) );
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
/* reading the Y coordinates */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2003-06-09 17:54:18 +02:00
|
|
|
vec = gloader->current.outline.points;
|
|
|
|
vec_limit = vec + n_points;
|
|
|
|
flag = (FT_Byte*)outline->tags;
|
|
|
|
x = 0;
|
|
|
|
|
|
|
|
for ( ; vec < vec_limit; vec++, flag++ )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2008-10-02 12:40:52 +02:00
|
|
|
FT_Pos y = 0;
|
|
|
|
FT_Byte f = *flag;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2007-06-11 02:18:00 +02:00
|
|
|
if ( f & 4 )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2007-06-11 06:55:58 +02:00
|
|
|
if ( p + 1 > limit )
|
* 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
|
|
|
goto Invalid_Outline;
|
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
y = (FT_Pos)FT_NEXT_BYTE( p );
|
2007-06-11 02:18:00 +02:00
|
|
|
if ( ( f & 32 ) == 0 )
|
2003-06-09 17:54:18 +02:00
|
|
|
y = -y;
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
2007-06-11 02:18:00 +02:00
|
|
|
else if ( ( f & 32 ) == 0 )
|
* 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
|
|
|
{
|
2007-06-11 06:55:58 +02:00
|
|
|
if ( p + 2 > limit )
|
* 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
|
|
|
goto Invalid_Outline;
|
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
y = (FT_Pos)FT_NEXT_SHORT( p );
|
* 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
|
|
|
}
|
2003-06-09 17:54:18 +02:00
|
|
|
|
|
|
|
x += y;
|
|
|
|
vec->y = x;
|
2008-10-02 12:40:52 +02:00
|
|
|
/* the cast is for stupid compilers */
|
|
|
|
*flag = (FT_Byte)( f & FT_CURVE_TAG_ON );
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
|
2001-06-19 10:28:24 +02:00
|
|
|
outline->n_points = (FT_UShort)n_points;
|
|
|
|
outline->n_contours = (FT_Short) n_contours;
|
2000-06-23 14:26:14 +02: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
|
|
|
load->cursor = p;
|
2002-01-06 11:13:40 +01:00
|
|
|
|
2000-07-05 06:32:02 +02:00
|
|
|
Fail:
|
2000-06-23 07:02:13 +02:00
|
|
|
return error;
|
2002-01-06 11:13:40 +01:00
|
|
|
|
|
|
|
Invalid_Outline:
|
|
|
|
error = TT_Err_Invalid_Outline;
|
|
|
|
goto Fail;
|
2000-06-23 14:26:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-28 09:17:51 +02:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
2002-04-01 16:25:28 +02:00
|
|
|
TT_Load_Composite_Glyph( TT_Loader loader )
|
2000-06-23 14:26:14 +02:00
|
|
|
{
|
2002-04-01 16:25:28 +02:00
|
|
|
FT_Error error;
|
* 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
|
|
|
FT_Byte* p = loader->cursor;
|
|
|
|
FT_Byte* limit = loader->limit;
|
2002-04-01 16:25:28 +02:00
|
|
|
FT_GlyphLoader gloader = loader->gloader;
|
2002-03-14 13:56:35 +01:00
|
|
|
FT_SubGlyph subglyph;
|
2002-04-01 16:25:28 +02:00
|
|
|
FT_UInt num_subglyphs;
|
2000-06-23 14:26:14 +02:00
|
|
|
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2000-06-23 14:26:14 +02:00
|
|
|
num_subglyphs = 0;
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2000-06-23 14:26:14 +02:00
|
|
|
do
|
|
|
|
{
|
|
|
|
FT_Fixed xx, xy, yy, yx;
|
* 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
|
|
|
FT_UInt count;
|
2000-06-23 14:26:14 +02:00
|
|
|
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2000-06-23 14:26:14 +02:00
|
|
|
/* check that we can load a new subglyph */
|
2002-03-14 13:56:35 +01:00
|
|
|
error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 );
|
2000-06-25 08:47:11 +02:00
|
|
|
if ( error )
|
|
|
|
goto Fail;
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2002-01-06 17:42:44 +01:00
|
|
|
/* check space */
|
2006-05-18 00:55:04 +02:00
|
|
|
if ( p + 4 > limit )
|
2002-01-06 11:13:40 +01:00
|
|
|
goto Invalid_Composite;
|
|
|
|
|
2000-06-23 14:26:14 +02:00
|
|
|
subglyph = gloader->current.subglyphs + num_subglyphs;
|
|
|
|
|
|
|
|
subglyph->arg1 = subglyph->arg2 = 0;
|
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
subglyph->flags = FT_NEXT_USHORT( p );
|
|
|
|
subglyph->index = FT_NEXT_USHORT( p );
|
2000-06-23 14:26:14 +02:00
|
|
|
|
2002-01-06 17:42:44 +01:00
|
|
|
/* check space */
|
* 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
|
|
|
count = 2;
|
2002-01-06 11:13:40 +01:00
|
|
|
if ( subglyph->flags & ARGS_ARE_WORDS )
|
* 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
|
|
|
count += 2;
|
2002-01-06 11:13:40 +01:00
|
|
|
if ( subglyph->flags & WE_HAVE_A_SCALE )
|
* 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
|
|
|
count += 2;
|
2002-01-06 11:13:40 +01:00
|
|
|
else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )
|
* 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
|
|
|
count += 4;
|
2002-01-06 11:13:40 +01:00
|
|
|
else if ( subglyph->flags & WE_HAVE_A_2X2 )
|
* 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
|
|
|
count += 8;
|
2002-01-06 11:13:40 +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
|
|
|
if ( p + count > limit )
|
2002-01-06 11:13:40 +01:00
|
|
|
goto Invalid_Composite;
|
|
|
|
|
2000-06-23 14:26:14 +02:00
|
|
|
/* read arguments */
|
|
|
|
if ( subglyph->flags & ARGS_ARE_WORDS )
|
|
|
|
{
|
2006-05-18 00:55:04 +02:00
|
|
|
subglyph->arg1 = FT_NEXT_SHORT( p );
|
|
|
|
subglyph->arg2 = FT_NEXT_SHORT( p );
|
2000-06-23 14:26:14 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2006-05-18 00:55:04 +02:00
|
|
|
subglyph->arg1 = FT_NEXT_CHAR( p );
|
|
|
|
subglyph->arg2 = FT_NEXT_CHAR( p );
|
2000-06-23 14:26:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* read transform */
|
|
|
|
xx = yy = 0x10000L;
|
|
|
|
xy = yx = 0;
|
|
|
|
|
|
|
|
if ( subglyph->flags & WE_HAVE_A_SCALE )
|
|
|
|
{
|
2006-05-18 00:55:04 +02:00
|
|
|
xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
|
2000-06-23 14:26:14 +02:00
|
|
|
yy = xx;
|
|
|
|
}
|
|
|
|
else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )
|
|
|
|
{
|
2006-05-18 00:55:04 +02:00
|
|
|
xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
|
|
|
|
yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
|
2000-06-23 14:26:14 +02:00
|
|
|
}
|
|
|
|
else if ( subglyph->flags & WE_HAVE_A_2X2 )
|
|
|
|
{
|
2006-05-18 00:55:04 +02:00
|
|
|
xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
|
|
|
|
yx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
|
|
|
|
xy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
|
|
|
|
yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
|
2000-06-23 14:26:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
subglyph->transform.xx = xx;
|
|
|
|
subglyph->transform.xy = xy;
|
|
|
|
subglyph->transform.yx = yx;
|
|
|
|
subglyph->transform.yy = yy;
|
|
|
|
|
|
|
|
num_subglyphs++;
|
2000-07-02 15:53:16 +02:00
|
|
|
|
2000-06-25 09:43:15 +02:00
|
|
|
} while ( subglyph->flags & MORE_COMPONENTS );
|
2000-06-23 14:26:14 +02:00
|
|
|
|
|
|
|
gloader->current.num_subglyphs = num_subglyphs;
|
|
|
|
|
2006-08-26 00:45:13 +02:00
|
|
|
#ifdef TT_USE_BYTECODE_INTERPRETER
|
2005-08-16 03:54:59 +02:00
|
|
|
|
2000-06-23 14:26:14 +02:00
|
|
|
{
|
2006-05-18 00:55:04 +02:00
|
|
|
FT_Stream stream = loader->stream;
|
|
|
|
|
|
|
|
|
2008-06-22 15:40:08 +02:00
|
|
|
/* we must undo the FT_FRAME_ENTER in order to point */
|
|
|
|
/* to the composite instructions, if we find some. */
|
|
|
|
/* We will process them later. */
|
|
|
|
/* */
|
2002-03-20 11:49:31 +01:00
|
|
|
loader->ins_pos = (FT_ULong)( FT_STREAM_POS() +
|
* 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
|
|
|
p - limit );
|
2000-06-23 14:26:14 +02:00
|
|
|
}
|
2005-08-16 03:54:59 +02:00
|
|
|
|
2000-06-23 14:26:14 +02:00
|
|
|
#endif
|
2000-06-23 07:02:13 +02: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
|
|
|
loader->cursor = p;
|
2002-01-06 11:13:40 +01:00
|
|
|
|
2000-06-23 07:02:13 +02:00
|
|
|
Fail:
|
|
|
|
return error;
|
2002-01-06 11:13:40 +01:00
|
|
|
|
|
|
|
Invalid_Composite:
|
|
|
|
error = TT_Err_Invalid_Composite;
|
|
|
|
goto Fail;
|
2000-06-23 07:02:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_LOCAL_DEF( void )
|
2001-06-28 09:17:51 +02:00
|
|
|
TT_Init_Glyph_Loading( TT_Face face )
|
2000-06-25 06:49:19 +02:00
|
|
|
{
|
|
|
|
face->access_glyph_frame = TT_Access_Glyph_Frame;
|
|
|
|
face->read_glyph_header = TT_Load_Glyph_Header;
|
|
|
|
face->read_simple_glyph = TT_Load_Simple_Glyph;
|
|
|
|
face->read_composite_glyph = TT_Load_Composite_Glyph;
|
|
|
|
face->forget_glyph_frame = TT_Forget_Glyph_Frame;
|
|
|
|
}
|
|
|
|
|
2000-06-23 07:02:13 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
static void
|
|
|
|
tt_prepare_zone( TT_GlyphZone zone,
|
|
|
|
FT_GlyphLoad load,
|
|
|
|
FT_UInt start_point,
|
|
|
|
FT_UInt start_contour )
|
|
|
|
{
|
2007-06-17 07:31:23 +02:00
|
|
|
zone->n_points = (FT_UShort)( load->outline.n_points - start_point );
|
|
|
|
zone->n_contours = (FT_Short) ( load->outline.n_contours -
|
|
|
|
start_contour );
|
|
|
|
zone->org = load->extra_points + start_point;
|
|
|
|
zone->cur = load->outline.points + start_point;
|
|
|
|
zone->orus = load->extra_points2 + start_point;
|
|
|
|
zone->tags = (FT_Byte*)load->outline.tags + start_point;
|
|
|
|
zone->contours = (FT_UShort*)load->outline.contours + start_contour;
|
2006-08-16 11:11:31 +02:00
|
|
|
zone->first_point = (FT_UShort)start_point;
|
2005-08-16 03:54:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-06-23 07:02:13 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
2005-08-16 03:54:59 +02:00
|
|
|
/* TT_Hint_Glyph */
|
2000-06-23 07:02:13 +02:00
|
|
|
/* */
|
|
|
|
/* <Description> */
|
2005-08-16 03:54:59 +02:00
|
|
|
/* Hint the glyph using the zone prepared by the caller. Note that */
|
|
|
|
/* the zone is supposed to include four phantom points. */
|
2000-06-23 07:02:13 +02:00
|
|
|
/* */
|
2001-06-28 09:17:51 +02:00
|
|
|
static FT_Error
|
2005-09-28 09:34:45 +02:00
|
|
|
TT_Hint_Glyph( TT_Loader loader,
|
|
|
|
FT_Bool is_composite )
|
2000-06-23 07:02:13 +02:00
|
|
|
{
|
2005-08-16 03:54:59 +02:00
|
|
|
TT_GlyphZone zone = &loader->zone;
|
|
|
|
FT_Pos origin;
|
|
|
|
|
2006-08-26 00:45:13 +02:00
|
|
|
#ifdef TT_USE_BYTECODE_INTERPRETER
|
2005-08-16 03:54:59 +02:00
|
|
|
FT_UInt n_ins;
|
2005-09-28 09:34:45 +02:00
|
|
|
#else
|
|
|
|
FT_UNUSED( is_composite );
|
|
|
|
#endif
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
|
2006-08-26 00:45:13 +02:00
|
|
|
#ifdef TT_USE_BYTECODE_INTERPRETER
|
2009-07-31 17:32:16 +02:00
|
|
|
if ( loader->glyph->control_len > 0xFFFFL )
|
|
|
|
{
|
|
|
|
FT_TRACE1(( "TT_Hint_Glyph: too long instructions " ));
|
|
|
|
FT_TRACE1(( "(0x%lx byte) is truncated\n",
|
|
|
|
loader->glyph->control_len ));
|
|
|
|
}
|
|
|
|
n_ins = (FT_UInt)( loader->glyph->control_len );
|
2005-08-16 03:54:59 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
origin = zone->cur[zone->n_points - 4].x;
|
|
|
|
origin = FT_PIX_ROUND( origin ) - origin;
|
|
|
|
if ( origin )
|
|
|
|
translate_array( zone->n_points, zone->cur, origin, 0 );
|
2000-10-31 21:42:18 +01:00
|
|
|
|
2006-08-26 00:45:13 +02:00
|
|
|
#ifdef TT_USE_BYTECODE_INTERPRETER
|
2007-01-26 23:18:56 +01:00
|
|
|
/* save original point position in org */
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( n_ins > 0 )
|
2006-08-19 13:18:09 +02:00
|
|
|
FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points );
|
2008-05-25 14:43:57 +02:00
|
|
|
|
|
|
|
/* Reset graphics state. */
|
|
|
|
loader->exec->GS = ((TT_Size)loader->size)->GS;
|
|
|
|
|
|
|
|
/* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */
|
|
|
|
/* completely refer to the (already) hinted subglyphs. */
|
|
|
|
if ( is_composite )
|
|
|
|
{
|
|
|
|
loader->exec->metrics.x_scale = 1 << 16;
|
|
|
|
loader->exec->metrics.y_scale = 1 << 16;
|
|
|
|
|
|
|
|
FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2008-05-25 22:04:56 +02:00
|
|
|
loader->exec->metrics.x_scale =
|
|
|
|
((TT_Size)loader->size)->metrics.x_scale;
|
|
|
|
loader->exec->metrics.y_scale =
|
|
|
|
((TT_Size)loader->size)->metrics.y_scale;
|
2008-05-25 14:43:57 +02:00
|
|
|
}
|
2002-02-19 17:30:15 +01:00
|
|
|
#endif
|
2000-06-23 07:02:13 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* round pp2 and pp4 */
|
2005-09-28 09:34:45 +02:00
|
|
|
zone->cur[zone->n_points - 3].x =
|
|
|
|
FT_PIX_ROUND( zone->cur[zone->n_points - 3].x );
|
|
|
|
zone->cur[zone->n_points - 1].y =
|
|
|
|
FT_PIX_ROUND( zone->cur[zone->n_points - 1].y );
|
2005-08-16 03:54:59 +02:00
|
|
|
|
2006-08-26 00:45:13 +02:00
|
|
|
#ifdef TT_USE_BYTECODE_INTERPRETER
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
if ( n_ins > 0 )
|
|
|
|
{
|
|
|
|
FT_Bool debug;
|
|
|
|
FT_Error error;
|
|
|
|
|
Fix B/W rasterization of subglyphs with different drop-out modes.
Normally, the SCANMODE instruction (if present) to set the drop-out
mode in a TrueType font is located in the `prep' table only and thus
valid for all glyphs. However, there are fonts like `pala.ttf'
which additionally contain this instruction in the hinting code of
some glyphs (but not all). As a result it can happen that a
composite glyph needs multiple drop-out modes for its subglyphs
since the rendering state gets reset for each subglyph.
FreeType collects the hinted outlines from all subglyphs, then it
sends the data to the rasterizer. It also sends the drop-out mode
-- after hinting has been applied -- and here is the error: It sends
the drop-out mode of the last subglyph only; drop-out modes of all
other subglyphs are lost.
This patch fixes the problem; it adds a second, alternative
mechanism to pass the drop-out mode: For each contour, the
rasterizer now checks the first `tags' array element. If bit 2 is
set, bits 5-7 contain the contour's drop-out mode, overriding the
global drop-out mode.
* include/freetype/ftimage.h (FT_CURVE_TAG_HAS_SCANMODE): New macro.
* src/truetype/ttgload.c (TT_Hint_Glyph): Store drop-out mode in
`tags[0]'.
* src/raster/ftraster.c (Flow_Up, Overshoot_Top, Overshoot_Bottom):
Use bits 3-5 instead of 0-2.
(New_Profile): Set the drop-out mode in the profile's `flags' field.
(Decompose_Curve): Check `tags[0]' and set `dropOutControl' if
necessary.
(Vertical_Sweep_Drop, Horizontal_Sweep_Drop,
Horizontal_Gray_Sweep_Drop, Draw_Sweep): Use the profile's drop-out
mode.
2009-06-18 15:42:52 +02:00
|
|
|
FT_GlyphLoader gloader = loader->gloader;
|
|
|
|
FT_Outline current_outline = gloader->current.outline;
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
error = TT_Set_CodeRange( loader->exec, tt_coderange_glyph,
|
|
|
|
loader->exec->glyphIns, n_ins );
|
|
|
|
if ( error )
|
|
|
|
return error;
|
|
|
|
|
2005-09-28 09:34:45 +02:00
|
|
|
loader->exec->is_composite = is_composite;
|
|
|
|
loader->exec->pts = *zone;
|
2005-08-16 03:54:59 +02:00
|
|
|
|
2006-12-22 12:37:05 +01:00
|
|
|
debug = FT_BOOL( !( loader->load_flags & FT_LOAD_NO_SCALE ) &&
|
2007-01-02 20:20:08 +01:00
|
|
|
((TT_Size)loader->size)->debug );
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
error = TT_Run_Context( loader->exec, debug );
|
|
|
|
if ( error && loader->exec->pedantic_hinting )
|
|
|
|
return error;
|
Fix B/W rasterization of subglyphs with different drop-out modes.
Normally, the SCANMODE instruction (if present) to set the drop-out
mode in a TrueType font is located in the `prep' table only and thus
valid for all glyphs. However, there are fonts like `pala.ttf'
which additionally contain this instruction in the hinting code of
some glyphs (but not all). As a result it can happen that a
composite glyph needs multiple drop-out modes for its subglyphs
since the rendering state gets reset for each subglyph.
FreeType collects the hinted outlines from all subglyphs, then it
sends the data to the rasterizer. It also sends the drop-out mode
-- after hinting has been applied -- and here is the error: It sends
the drop-out mode of the last subglyph only; drop-out modes of all
other subglyphs are lost.
This patch fixes the problem; it adds a second, alternative
mechanism to pass the drop-out mode: For each contour, the
rasterizer now checks the first `tags' array element. If bit 2 is
set, bits 5-7 contain the contour's drop-out mode, overriding the
global drop-out mode.
* include/freetype/ftimage.h (FT_CURVE_TAG_HAS_SCANMODE): New macro.
* src/truetype/ttgload.c (TT_Hint_Glyph): Store drop-out mode in
`tags[0]'.
* src/raster/ftraster.c (Flow_Up, Overshoot_Top, Overshoot_Bottom):
Use bits 3-5 instead of 0-2.
(New_Profile): Set the drop-out mode in the profile's `flags' field.
(Decompose_Curve): Check `tags[0]' and set `dropOutControl' if
necessary.
(Vertical_Sweep_Drop, Horizontal_Sweep_Drop,
Horizontal_Gray_Sweep_Drop, Draw_Sweep): Use the profile's drop-out
mode.
2009-06-18 15:42:52 +02:00
|
|
|
|
|
|
|
/* store drop-out mode in bits 5-7; set bit 2 also as a marker */
|
|
|
|
current_outline.tags[0] |=
|
|
|
|
( loader->exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE;
|
2005-08-16 03:54:59 +02:00
|
|
|
}
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
#endif
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* save glyph phantom points */
|
|
|
|
if ( !loader->preserve_pps )
|
2000-02-02 13:16:19 +01:00
|
|
|
{
|
2005-08-16 03:54:59 +02:00
|
|
|
loader->pp1 = zone->cur[zone->n_points - 4];
|
|
|
|
loader->pp2 = zone->cur[zone->n_points - 3];
|
|
|
|
loader->pp3 = zone->cur[zone->n_points - 2];
|
|
|
|
loader->pp4 = zone->cur[zone->n_points - 1];
|
2000-02-02 13:16:19 +01:00
|
|
|
}
|
2000-06-12 21:36:41 +02:00
|
|
|
|
[truetype] Support subpixel hinting.
This is the large, famous `Infinality' patch to support ClearType
bytecode which has been available from
http://www.infinality.net/blog/ for some time, and which has been
refined over the last years. While still experimental, it is now
mature enough to be included directly into FreeType.
Most of the code is based on the ClearType whitepaper written by
Greg Hitchcock
http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
which gives a detailed overview of the necessary changes to the
Microsoft rasterizer so that older fonts are supported. However, a
lot of details are still missing, and this patches provides a
framework to easily handle rendering issues down to the glyph level
of certain fonts.
Note that ClearType support is not completely implemented! In
particular, full support for the options `compatible_widths',
`symmetrical_smoothing, and `bgr' (via the GETINFO bytecode
instruction) is missing.
* src/truetype/ttsubpix.c: New file, providing code to handle
`tweaks', this is, rules for certain glyphs in certain fonts
(including wildcards) which need a special treatment.
* src/truetype/ttsubpix.h: New file, holding the tweaking rules.
* include/freetype/config/ftoption.h, src/devel/ftoption.h
(TT_CONFIG_OPTION_SUBPIXEL_HINTING): New macro.
* include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID,
FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): New macros.
* src/truetype/truetype.c [TT_USE_BYTECODE_INTERPRETER]: Include
`ttsubpix.c'.
* src/truetype/ttgload.c: Include `ttsubpix.h'.
[All changes below are guarded by TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(tt_get_metrics): Set tweak flags.
(TT_Hint_Glyph): Call `FT_Outline_EmboldenXY' if necessary.
(TT_Process_Simple_Glyph): Compensate emboldening if necessary.
(compute_glyph_metrics): Handle `compatible widths' option.
(tt_loader_init): Handle ClearType GETINFO information bits.
* src/truetype/rules.mk (TT_DRC_SRC): Updated.
* src/truetype/ttinterp.c: Include `ttsubpix.h'.
[Where necessary, changes below are guarded by
TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(Direct_Move, Direct_Move_X): Extended.
(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45,
SetSuperRound): Add parameter to handle the number of grid lines per
pixel.
(SET_SuperRound, ROUND_None, CUR_Func_round): Updated.
(DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated.
(DO_ROUND, DO_NROUND): Updated.
(DO_RS): Take care of `Typeman' bytecode patterns.
(Ins_FDEF): Add some debugging code. Commented out.
(Ins_ENDF): Restore state.
(Ins_CALL, Ins_LOOPCALL): Handle inline delta functions.
(Ins_MD): Handle `Vacuform' rounds.
(Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP,
Ins_MDRP, Ins_MIRP): Handle tweaks.
(Ins_ALIGNRP): Add tweak guard.
(Ins_IUP, Ins_DELTAP): Handle tweaks.
(Ins_GETINFO): Handle new ClearType bits.
(TT_RunIns): Handle tweaks.
* src/truetype/ttinterp.h: Updated.
(SPH_TweakRule, SPH_ScaleRule): New structures for tweaks.
(TT_ExecContextRec): Add members for subpixel hinting support.
* src/truetype/ttobjs.h (TT_DefRecord): Add `inline_delta' member.
2012-06-18 10:36:06 +02:00
|
|
|
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
|
|
|
if ( loader->exec->sph_tweak_flags & SPH_TWEAK_DEEMBOLDEN )
|
|
|
|
FT_Outline_EmboldenXY( &loader->gloader->current.outline, -24, 0 );
|
|
|
|
|
|
|
|
else if ( loader->exec->sph_tweak_flags & SPH_TWEAK_EMBOLDEN )
|
|
|
|
FT_Outline_EmboldenXY( &loader->gloader->current.outline, 24, 0 );
|
|
|
|
#endif
|
2005-08-16 03:54:59 +02:00
|
|
|
return TT_Err_Ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
|
|
|
/* TT_Process_Simple_Glyph */
|
|
|
|
/* */
|
|
|
|
/* <Description> */
|
|
|
|
/* Once a simple glyph has been loaded, it needs to be processed. */
|
|
|
|
/* Usually, this means scaling and hinting through bytecode */
|
|
|
|
/* interpretation. */
|
|
|
|
/* */
|
|
|
|
static FT_Error
|
|
|
|
TT_Process_Simple_Glyph( TT_Loader loader )
|
|
|
|
{
|
2005-09-28 09:34:45 +02:00
|
|
|
FT_GlyphLoader gloader = loader->gloader;
|
|
|
|
FT_Error error = TT_Err_Ok;
|
2005-08-16 03:54:59 +02:00
|
|
|
FT_Outline* outline;
|
2007-07-11 01:10:39 +02:00
|
|
|
FT_Int n_points;
|
2005-08-16 03:54:59 +02:00
|
|
|
|
[truetype] Support subpixel hinting.
This is the large, famous `Infinality' patch to support ClearType
bytecode which has been available from
http://www.infinality.net/blog/ for some time, and which has been
refined over the last years. While still experimental, it is now
mature enough to be included directly into FreeType.
Most of the code is based on the ClearType whitepaper written by
Greg Hitchcock
http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
which gives a detailed overview of the necessary changes to the
Microsoft rasterizer so that older fonts are supported. However, a
lot of details are still missing, and this patches provides a
framework to easily handle rendering issues down to the glyph level
of certain fonts.
Note that ClearType support is not completely implemented! In
particular, full support for the options `compatible_widths',
`symmetrical_smoothing, and `bgr' (via the GETINFO bytecode
instruction) is missing.
* src/truetype/ttsubpix.c: New file, providing code to handle
`tweaks', this is, rules for certain glyphs in certain fonts
(including wildcards) which need a special treatment.
* src/truetype/ttsubpix.h: New file, holding the tweaking rules.
* include/freetype/config/ftoption.h, src/devel/ftoption.h
(TT_CONFIG_OPTION_SUBPIXEL_HINTING): New macro.
* include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID,
FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): New macros.
* src/truetype/truetype.c [TT_USE_BYTECODE_INTERPRETER]: Include
`ttsubpix.c'.
* src/truetype/ttgload.c: Include `ttsubpix.h'.
[All changes below are guarded by TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(tt_get_metrics): Set tweak flags.
(TT_Hint_Glyph): Call `FT_Outline_EmboldenXY' if necessary.
(TT_Process_Simple_Glyph): Compensate emboldening if necessary.
(compute_glyph_metrics): Handle `compatible widths' option.
(tt_loader_init): Handle ClearType GETINFO information bits.
* src/truetype/rules.mk (TT_DRC_SRC): Updated.
* src/truetype/ttinterp.c: Include `ttsubpix.h'.
[Where necessary, changes below are guarded by
TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(Direct_Move, Direct_Move_X): Extended.
(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45,
SetSuperRound): Add parameter to handle the number of grid lines per
pixel.
(SET_SuperRound, ROUND_None, CUR_Func_round): Updated.
(DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated.
(DO_ROUND, DO_NROUND): Updated.
(DO_RS): Take care of `Typeman' bytecode patterns.
(Ins_FDEF): Add some debugging code. Commented out.
(Ins_ENDF): Restore state.
(Ins_CALL, Ins_LOOPCALL): Handle inline delta functions.
(Ins_MD): Handle `Vacuform' rounds.
(Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP,
Ins_MDRP, Ins_MIRP): Handle tweaks.
(Ins_ALIGNRP): Add tweak guard.
(Ins_IUP, Ins_DELTAP): Handle tweaks.
(Ins_GETINFO): Handle new ClearType bits.
(TT_RunIns): Handle tweaks.
* src/truetype/ttinterp.h: Updated.
(SPH_TweakRule, SPH_ScaleRule): New structures for tweaks.
(TT_ExecContextRec): Add members for subpixel hinting support.
* src/truetype/ttobjs.h (TT_DefRecord): Add `inline_delta' member.
2012-06-18 10:36:06 +02:00
|
|
|
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
|
|
|
TT_Face face = (TT_Face)loader->face;
|
|
|
|
FT_String* family = face->root.family_name;
|
|
|
|
FT_Int ppem = loader->size->metrics.x_ppem;
|
|
|
|
FT_String* style = face->root.style_name;
|
|
|
|
FT_Int x_scale_factor = 1000;
|
|
|
|
#endif
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
|
2005-09-28 09:34:45 +02:00
|
|
|
outline = &gloader->current.outline;
|
2005-08-16 03:54:59 +02:00
|
|
|
n_points = outline->n_points;
|
|
|
|
|
|
|
|
/* set phantom points */
|
|
|
|
|
|
|
|
outline->points[n_points ] = loader->pp1;
|
|
|
|
outline->points[n_points + 1] = loader->pp2;
|
|
|
|
outline->points[n_points + 2] = loader->pp3;
|
|
|
|
outline->points[n_points + 3] = loader->pp4;
|
|
|
|
|
|
|
|
outline->tags[n_points ] = 0;
|
|
|
|
outline->tags[n_points + 1] = 0;
|
|
|
|
outline->tags[n_points + 2] = 0;
|
|
|
|
outline->tags[n_points + 3] = 0;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2004-03-27 09:43:17 +01:00
|
|
|
n_points += 4;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
* src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
* src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
* src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
Use FT_BEGIN_HEADER and FT_END_HEADER.
Use FT_LOCAL.
2004-04-24 George Williams <gww@silcom.com>
Add support for Apple's distortable font technology (in GX fonts).
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
* include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
FT_MM_Var): New structures.
(FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New function declarations.
* include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
FT_Set_Var_Design_Func): New typedefs.
Update MultiMasters service.
* include/freetype/internal/tttypes.h
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
(GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
(TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
and `blend'.
* include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
macros.
* include/freetype/internal/fttrace.h: Add `ttgxvar'.
* src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New functions.
* src/sfnt/sfobjs.c (sfnt_load_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
flag for GX var fonts.
* src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
* src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.c.
* src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
(tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
New service.
(tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(TT_Process_Simple_Glyph, load_truetype_glyph)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_done_blend.
* src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_face_vary_cvt.
* src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
* src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
and T1_Set_Var_Design.
* src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
(T1_Get_MM_Var, T1_Set_Var_Design): New functions.
* src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
function declarations.
2004-04-25 22:15:11 +02:00
|
|
|
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( ((TT_Face)loader->face)->doblend )
|
* src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
* src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
* src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
Use FT_BEGIN_HEADER and FT_END_HEADER.
Use FT_LOCAL.
2004-04-24 George Williams <gww@silcom.com>
Add support for Apple's distortable font technology (in GX fonts).
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
* include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
FT_MM_Var): New structures.
(FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New function declarations.
* include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
FT_Set_Var_Design_Func): New typedefs.
Update MultiMasters service.
* include/freetype/internal/tttypes.h
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
(GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
(TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
and `blend'.
* include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
macros.
* include/freetype/internal/fttrace.h: Add `ttgxvar'.
* src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New functions.
* src/sfnt/sfobjs.c (sfnt_load_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
flag for GX var fonts.
* src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
* src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.c.
* src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
(tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
New service.
(tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(TT_Process_Simple_Glyph, load_truetype_glyph)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_done_blend.
* src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_face_vary_cvt.
* src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
* src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
and T1_Set_Var_Design.
* src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
(T1_Get_MM_Var, T1_Set_Var_Design): New functions.
* src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
function declarations.
2004-04-25 22:15:11 +02:00
|
|
|
{
|
|
|
|
/* Deltas apply to the unscaled data. */
|
2005-09-28 09:34:45 +02:00
|
|
|
FT_Vector* deltas;
|
|
|
|
FT_Memory memory = loader->face->memory;
|
2007-07-11 01:10:39 +02:00
|
|
|
FT_Int i;
|
* src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
* src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
* src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
Use FT_BEGIN_HEADER and FT_END_HEADER.
Use FT_LOCAL.
2004-04-24 George Williams <gww@silcom.com>
Add support for Apple's distortable font technology (in GX fonts).
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
* include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
FT_MM_Var): New structures.
(FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New function declarations.
* include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
FT_Set_Var_Design_Func): New typedefs.
Update MultiMasters service.
* include/freetype/internal/tttypes.h
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
(GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
(TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
and `blend'.
* include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
macros.
* include/freetype/internal/fttrace.h: Add `ttgxvar'.
* src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New functions.
* src/sfnt/sfobjs.c (sfnt_load_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
flag for GX var fonts.
* src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
* src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.c.
* src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
(tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
New service.
(tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(TT_Process_Simple_Glyph, load_truetype_glyph)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_done_blend.
* src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_face_vary_cvt.
* src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
* src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
and T1_Set_Var_Design.
* src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
(T1_Get_MM_Var, T1_Set_Var_Design): New functions.
* src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
function declarations.
2004-04-25 22:15:11 +02:00
|
|
|
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face),
|
|
|
|
loader->glyph_index,
|
* src/cff/cffobjs.c (cff_size_done, cff_size_init, cff_size_reset,
cff_slot_done, cff_slot_init, cff_face_init, cff_face_done): Access
root fields directly.
* src/cff/cffdrivr.c (Load_Glyph): Access root fields directly.
* src/truetype/ttgload.c (TT_Process_Simple_Glyph): Save current
frame before calling TT_Vary_Get_Glyph_Deltas.
* src/pcf/pcfdrivr.c (PCF_CMapRec): Rename `cmap' to `root' for
consistency.
(pcf_cmap_init, pcf_cmap_done, pcf_cmap_char_index,
pcf_cmap_char_next): Don't use PCF_XXX but FT_XXX arguments which
are typecast to the proper PCF_XXX types within the function.
Update code accordingly.
(pcf_cmap_class): Remove casts.
(PCF_Face_Done, PCF_Face_Init, PCF_Set_Pixel_Size): Don't use
PCF_XXX but FT_XXX arguments which are typecast to the proper
PCF_XXX types within the function.
Update code accordingly.
Use FT_CALLBACK_DEF throughout.
(PCF_Set_Point_Size): New wrapper function.
(PCF_Glyph_Load, pcf_driver_requester): Use FT_CALLBACK_DEF.
(pcf_driver_class): Remove casts.
2004-05-07 09:08:14 +02:00
|
|
|
&deltas,
|
|
|
|
n_points );
|
|
|
|
if ( error )
|
2005-08-16 03:54:59 +02:00
|
|
|
return error;
|
* src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
* src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
* src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
Use FT_BEGIN_HEADER and FT_END_HEADER.
Use FT_LOCAL.
2004-04-24 George Williams <gww@silcom.com>
Add support for Apple's distortable font technology (in GX fonts).
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
* include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
FT_MM_Var): New structures.
(FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New function declarations.
* include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
FT_Set_Var_Design_Func): New typedefs.
Update MultiMasters service.
* include/freetype/internal/tttypes.h
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
(GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
(TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
and `blend'.
* include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
macros.
* include/freetype/internal/fttrace.h: Add `ttgxvar'.
* src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New functions.
* src/sfnt/sfobjs.c (sfnt_load_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
flag for GX var fonts.
* src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
* src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.c.
* src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
(tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
New service.
(tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(TT_Process_Simple_Glyph, load_truetype_glyph)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_done_blend.
* src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_face_vary_cvt.
* src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
* src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
and T1_Set_Var_Design.
* src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
(T1_Get_MM_Var, T1_Set_Var_Design): New functions.
* src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
function declarations.
2004-04-25 22:15:11 +02:00
|
|
|
|
|
|
|
for ( i = 0; i < n_points; ++i )
|
|
|
|
{
|
|
|
|
outline->points[i].x += deltas[i].x;
|
|
|
|
outline->points[i].y += deltas[i].y;
|
|
|
|
}
|
|
|
|
|
|
|
|
FT_FREE( deltas );
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
|
|
|
|
|
2006-08-16 18:50:55 +02:00
|
|
|
if ( IS_HINTED( loader->load_flags ) )
|
|
|
|
{
|
|
|
|
tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 );
|
|
|
|
|
|
|
|
FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur,
|
|
|
|
loader->zone.n_points + 4 );
|
|
|
|
}
|
|
|
|
|
[truetype] Support subpixel hinting.
This is the large, famous `Infinality' patch to support ClearType
bytecode which has been available from
http://www.infinality.net/blog/ for some time, and which has been
refined over the last years. While still experimental, it is now
mature enough to be included directly into FreeType.
Most of the code is based on the ClearType whitepaper written by
Greg Hitchcock
http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
which gives a detailed overview of the necessary changes to the
Microsoft rasterizer so that older fonts are supported. However, a
lot of details are still missing, and this patches provides a
framework to easily handle rendering issues down to the glyph level
of certain fonts.
Note that ClearType support is not completely implemented! In
particular, full support for the options `compatible_widths',
`symmetrical_smoothing, and `bgr' (via the GETINFO bytecode
instruction) is missing.
* src/truetype/ttsubpix.c: New file, providing code to handle
`tweaks', this is, rules for certain glyphs in certain fonts
(including wildcards) which need a special treatment.
* src/truetype/ttsubpix.h: New file, holding the tweaking rules.
* include/freetype/config/ftoption.h, src/devel/ftoption.h
(TT_CONFIG_OPTION_SUBPIXEL_HINTING): New macro.
* include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID,
FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): New macros.
* src/truetype/truetype.c [TT_USE_BYTECODE_INTERPRETER]: Include
`ttsubpix.c'.
* src/truetype/ttgload.c: Include `ttsubpix.h'.
[All changes below are guarded by TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(tt_get_metrics): Set tweak flags.
(TT_Hint_Glyph): Call `FT_Outline_EmboldenXY' if necessary.
(TT_Process_Simple_Glyph): Compensate emboldening if necessary.
(compute_glyph_metrics): Handle `compatible widths' option.
(tt_loader_init): Handle ClearType GETINFO information bits.
* src/truetype/rules.mk (TT_DRC_SRC): Updated.
* src/truetype/ttinterp.c: Include `ttsubpix.h'.
[Where necessary, changes below are guarded by
TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(Direct_Move, Direct_Move_X): Extended.
(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45,
SetSuperRound): Add parameter to handle the number of grid lines per
pixel.
(SET_SuperRound, ROUND_None, CUR_Func_round): Updated.
(DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated.
(DO_ROUND, DO_NROUND): Updated.
(DO_RS): Take care of `Typeman' bytecode patterns.
(Ins_FDEF): Add some debugging code. Commented out.
(Ins_ENDF): Restore state.
(Ins_CALL, Ins_LOOPCALL): Handle inline delta functions.
(Ins_MD): Handle `Vacuform' rounds.
(Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP,
Ins_MDRP, Ins_MIRP): Handle tweaks.
(Ins_ALIGNRP): Add tweak guard.
(Ins_IUP, Ins_DELTAP): Handle tweaks.
(Ins_GETINFO): Handle new ClearType bits.
(TT_RunIns): Handle tweaks.
* src/truetype/ttinterp.h: Updated.
(SPH_TweakRule, SPH_ScaleRule): New structures for tweaks.
(TT_ExecContextRec): Add members for subpixel hinting support.
* src/truetype/ttobjs.h (TT_DefRecord): Add `inline_delta' member.
2012-06-18 10:36:06 +02:00
|
|
|
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
|
|
|
/* scale, but only if enabled and only if TT hinting is being used */
|
|
|
|
if ( IS_HINTED( loader->load_flags ) )
|
|
|
|
x_scale_factor = scale_test_tweak( face, family, ppem, style,
|
|
|
|
loader->glyph_index, X_SCALING_Rules,
|
|
|
|
X_SCALING_RULES_SIZE );
|
|
|
|
/* scale the glyph */
|
|
|
|
if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ||
|
|
|
|
x_scale_factor != 1000 )
|
|
|
|
{
|
|
|
|
FT_Vector* vec = outline->points;
|
|
|
|
FT_Vector* limit = outline->points + n_points;
|
|
|
|
FT_Fixed x_scale = FT_MulDiv(
|
|
|
|
((TT_Size)loader->size)->metrics.x_scale,
|
|
|
|
x_scale_factor, 1000 );
|
|
|
|
FT_Fixed y_scale = ((TT_Size)loader->size)->metrics.y_scale;
|
|
|
|
|
|
|
|
|
|
|
|
/* compensate for any scaling by de/emboldening; */
|
|
|
|
/* the amount was determined via experimentation */
|
|
|
|
if ( x_scale_factor != 1000 && ppem > 11 )
|
|
|
|
FT_Outline_EmboldenXY( outline,
|
|
|
|
FT_MulDiv( 16 * ppem,
|
|
|
|
1000 - x_scale_factor,
|
|
|
|
0x1000L ), 0 );
|
|
|
|
#else
|
2005-08-16 03:54:59 +02:00
|
|
|
/* scale the glyph */
|
|
|
|
if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2005-08-16 03:54:59 +02:00
|
|
|
FT_Vector* vec = outline->points;
|
|
|
|
FT_Vector* limit = outline->points + n_points;
|
|
|
|
FT_Fixed x_scale = ((TT_Size)loader->size)->metrics.x_scale;
|
|
|
|
FT_Fixed y_scale = ((TT_Size)loader->size)->metrics.y_scale;
|
[truetype] Support subpixel hinting.
This is the large, famous `Infinality' patch to support ClearType
bytecode which has been available from
http://www.infinality.net/blog/ for some time, and which has been
refined over the last years. While still experimental, it is now
mature enough to be included directly into FreeType.
Most of the code is based on the ClearType whitepaper written by
Greg Hitchcock
http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
which gives a detailed overview of the necessary changes to the
Microsoft rasterizer so that older fonts are supported. However, a
lot of details are still missing, and this patches provides a
framework to easily handle rendering issues down to the glyph level
of certain fonts.
Note that ClearType support is not completely implemented! In
particular, full support for the options `compatible_widths',
`symmetrical_smoothing, and `bgr' (via the GETINFO bytecode
instruction) is missing.
* src/truetype/ttsubpix.c: New file, providing code to handle
`tweaks', this is, rules for certain glyphs in certain fonts
(including wildcards) which need a special treatment.
* src/truetype/ttsubpix.h: New file, holding the tweaking rules.
* include/freetype/config/ftoption.h, src/devel/ftoption.h
(TT_CONFIG_OPTION_SUBPIXEL_HINTING): New macro.
* include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID,
FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): New macros.
* src/truetype/truetype.c [TT_USE_BYTECODE_INTERPRETER]: Include
`ttsubpix.c'.
* src/truetype/ttgload.c: Include `ttsubpix.h'.
[All changes below are guarded by TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(tt_get_metrics): Set tweak flags.
(TT_Hint_Glyph): Call `FT_Outline_EmboldenXY' if necessary.
(TT_Process_Simple_Glyph): Compensate emboldening if necessary.
(compute_glyph_metrics): Handle `compatible widths' option.
(tt_loader_init): Handle ClearType GETINFO information bits.
* src/truetype/rules.mk (TT_DRC_SRC): Updated.
* src/truetype/ttinterp.c: Include `ttsubpix.h'.
[Where necessary, changes below are guarded by
TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(Direct_Move, Direct_Move_X): Extended.
(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45,
SetSuperRound): Add parameter to handle the number of grid lines per
pixel.
(SET_SuperRound, ROUND_None, CUR_Func_round): Updated.
(DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated.
(DO_ROUND, DO_NROUND): Updated.
(DO_RS): Take care of `Typeman' bytecode patterns.
(Ins_FDEF): Add some debugging code. Commented out.
(Ins_ENDF): Restore state.
(Ins_CALL, Ins_LOOPCALL): Handle inline delta functions.
(Ins_MD): Handle `Vacuform' rounds.
(Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP,
Ins_MDRP, Ins_MIRP): Handle tweaks.
(Ins_ALIGNRP): Add tweak guard.
(Ins_IUP, Ins_DELTAP): Handle tweaks.
(Ins_GETINFO): Handle new ClearType bits.
(TT_RunIns): Handle tweaks.
* src/truetype/ttinterp.h: Updated.
(SPH_TweakRule, SPH_ScaleRule): New structures for tweaks.
(TT_ExecContextRec): Add members for subpixel hinting support.
* src/truetype/ttobjs.h (TT_DefRecord): Add `inline_delta' member.
2012-06-18 10:36:06 +02:00
|
|
|
#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
2005-08-16 03:54:59 +02:00
|
|
|
|
2000-07-02 15:53:16 +02:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
for ( ; vec < limit; vec++ )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2000-02-02 13:16:19 +01:00
|
|
|
vec->x = FT_MulFix( vec->x, x_scale );
|
|
|
|
vec->y = FT_MulFix( vec->y, y_scale );
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
loader->pp1 = outline->points[n_points - 4];
|
|
|
|
loader->pp2 = outline->points[n_points - 3];
|
|
|
|
loader->pp3 = outline->points[n_points - 2];
|
|
|
|
loader->pp4 = outline->points[n_points - 1];
|
- MAJOR INTERNAL REDESIGN:
A lot of internal modifications have been performed lately on the
source in order to provide the following enhancements:
- more generic module support:
The FT_Module type is now defined to represent a handle to a given
module. The file <freetype/ftmodule.h> contains the FT_Module_Class
definition, as well as the module-loading public API
The FT_Driver type is still defined, and still represents a pointer
to a font driver. Note that FT_Add_Driver is replaced by FT_Add_Module,
FT_Get_Driver by FT_Get_Module, etc..
- support for generic glyph image types:
The FT_Renderer type is a pointer to a module used to perform various
operations on glyph image.
Each renderer is capable of handling images in a single format
(e.g. ft_glyph_format_outline). Its functions are used to:
- transform an glyph image
- render a glyph image into a bitmap
- return the control box (dimensions) of a given glyph image
The scan converters "ftraster.c" and "ftgrays.c" have been moved
to the new directory "src/renderer", and are used to provide two
default renderer modules.
One corresponds to the "standard" scan-converter, the other to the
"smooth" one.
The current renderer can be set through the new function
FT_Set_Renderer.
The old raster-related function FT_Set_Raster, FT_Get_Raster and
FT_Set_Raster_Mode have now disappeared, in favor of the new:
FT_Get_Renderer
FT_Set_Renderer
see the file <freetype/ftrender.h> for more details..
These changes were necessary to properly support different scalable
formats in the future, like bi-color glyphs, etc..
- glyph loader object:
A new internal object, called a 'glyph loader' has been introduced
in the base layer. It is used by all scalable format font drivers
to load glyphs and composites.
This object has been created to reduce the code size of each driver,
as each one of them basically re-implemented its functionality.
See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for
more information..
- FT_GlyphSlot had new fields:
In order to support extended features (see below), the FT_GlyphSlot
structure has a few new fields:
linearHoriAdvance: this field gives the linearly scaled (i.e.
scaled but unhinted) advance width for the glyph,
expressed as a 16.16 fixed pixel value. This
is useful to perform WYSIWYG text.
linearVertAdvance: this field gives the linearly scaled advance
height for the glyph (relevant in vertical glyph
layouts only). This is useful to perform
WYSIWYG text.
Note that the two above field replace the removed "metrics2" field
in the glyph slot.
advance: this field is a vector that gives the transformed
advance for the glyph. By default, it corresponds
to the advance width, unless FT_LOAD_VERTICAL_LAYOUT
was specified when calling FT_Load_Glyph or FT_Load_Char
bitmap_left: this field gives the distance in integer pixels from
the current pen position to the left-most pixel of
a glyph image WHEN IT IS A BITMAP. It is only valid
when the "format" field is set to
"ft_glyph_format_bitmap", for example, after calling
the new function FT_Render_Glyph.
bitmap_top: this field gives the distance in integer pixels from
the current pen position (located on the baseline) to
the top-most pixel of the glyph image WHEN IT IS A
BITMAP. Positive values correspond to upwards Y.
loader: this is a new private field for the glyph slot. Client
applications should not touch it..
- support for transforms and direct rendering in FT_Load_Glyph:
Most of the functionality found in <freetype/ftglyph.h> has been
moved to the core library. Hence, the following:
- a transform can be specified for a face through FT_Set_Transform.
this transform is applied by FT_Load_Glyph to scalable glyph images
(i.e. NOT TO BITMAPS) before the function returns, unless the
bit flag FT_LOAD_IGNORE_TRANSFORM was set in the load flags..
- once a glyph image has been loaded, it can be directly converted to
a bitmap by using the new FT_Render_Glyph function. Note that this
function takes the glyph image from the glyph slot, and converts
it to a bitmap whose properties are returned in "face.glyph.bitmap",
"face.glyph.bitmap_left" and "face.glyph.bitmap_top". The original
native image might be lost after the conversion.
- when using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph
and FT_Load_Char functions will call FT_Render_Glyph automatically
when needed.
2000-06-22 02:17:42 +02:00
|
|
|
}
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( IS_HINTED( loader->load_flags ) )
|
|
|
|
{
|
|
|
|
loader->zone.n_points += 4;
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
error = TT_Hint_Glyph( loader, 0 );
|
|
|
|
}
|
|
|
|
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
|
|
|
/* TT_Process_Composite_Component */
|
|
|
|
/* */
|
|
|
|
/* <Description> */
|
|
|
|
/* Once a composite component has been loaded, it needs to be */
|
|
|
|
/* processed. Usually, this means transforming and translating. */
|
|
|
|
/* */
|
|
|
|
static FT_Error
|
|
|
|
TT_Process_Composite_Component( TT_Loader loader,
|
|
|
|
FT_SubGlyph subglyph,
|
|
|
|
FT_UInt start_point,
|
|
|
|
FT_UInt num_base_points )
|
|
|
|
{
|
|
|
|
FT_GlyphLoader gloader = loader->gloader;
|
|
|
|
FT_Vector* base_vec = gloader->base.outline.points;
|
|
|
|
FT_UInt num_points = gloader->base.outline.n_points;
|
|
|
|
FT_Bool have_scale;
|
|
|
|
FT_Pos x, y;
|
|
|
|
|
* src/base/Jamfile: adding src/base/ftgxval.c
* src/gxvalid/gxvbsln.c, src/gxvalid/gxvcommn.c, src/gxvalid/gxvfeat.c,
src/gxvalid/gxvjust.c, src/gxvalid/gxvkern.c, src/gxvalid/gxvlcar.c,
src/gxvalid/gxvmort.c, src/gxvalid/gxvmort0.c, src/gxvalid/gxvmort1.c,
src/gxvalid/gxvmort2.c, src/gxvalid/gxvmort4.c, src/gxvalid/gxvmort5.c,
src/gxvalid/gxvmorx.c, src/gxvalid/gxvmorx0.c, src/gxvalid/gxvmorx1.c,
src/gxvalid/gxvmorx2.c, src/gxvalid/gxvmorx5.c, src/gxvalid/gxvopbd.c,
src/gxvalid/gxvprop.c, src/sfnt/sfdriver.c, src/truetype/ttgload.c:
removing _many_ compiler warnings when compiling with Visual C++
at maximum level (/W4)
2005-09-23 15:22:10 +02:00
|
|
|
|
|
|
|
have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE |
|
|
|
|
WE_HAVE_AN_XY_SCALE |
|
|
|
|
WE_HAVE_A_2X2 ) );
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
/* perform the transform required for this subglyph */
|
|
|
|
if ( have_scale )
|
- 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
|
|
|
{
|
2005-08-19 10:56:29 +02:00
|
|
|
FT_UInt i;
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
for ( i = num_base_points; i < num_points; i++ )
|
|
|
|
FT_Vector_Transform( base_vec + i, &subglyph->transform );
|
|
|
|
}
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* get offset */
|
|
|
|
if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) )
|
|
|
|
{
|
|
|
|
FT_UInt k = subglyph->arg1;
|
|
|
|
FT_UInt l = subglyph->arg2;
|
|
|
|
FT_Vector* p1;
|
|
|
|
FT_Vector* p2;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
2005-08-19 10:56:29 +02:00
|
|
|
/* match l-th point of the newly loaded component to the k-th point */
|
|
|
|
/* of the previously loaded components. */
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* change to the point numbers used by our outline */
|
|
|
|
k += start_point;
|
|
|
|
l += num_base_points;
|
2005-08-19 10:56:29 +02:00
|
|
|
if ( k >= num_base_points ||
|
|
|
|
l >= num_points )
|
2005-08-16 03:54:59 +02:00
|
|
|
return TT_Err_Invalid_Composite;
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
p1 = gloader->base.outline.points + k;
|
|
|
|
p2 = gloader->base.outline.points + l;
|
- 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
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
x = p1->x - p2->x;
|
|
|
|
y = p1->y - p2->y;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
x = subglyph->arg1;
|
|
|
|
y = subglyph->arg2;
|
|
|
|
|
|
|
|
if ( !x && !y )
|
|
|
|
return TT_Err_Ok;
|
|
|
|
|
2005-08-19 10:56:29 +02:00
|
|
|
/* Use a default value dependent on */
|
|
|
|
/* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED. This is useful for old TT */
|
|
|
|
/* fonts which don't set the xxx_COMPONENT_OFFSET bit. */
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
if ( have_scale &&
|
|
|
|
#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
|
|
|
|
!( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) )
|
|
|
|
#else
|
|
|
|
( subglyph->flags & SCALED_COMPONENT_OFFSET ) )
|
|
|
|
#endif
|
|
|
|
{
|
2005-09-28 09:34:45 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
#if 0
|
|
|
|
|
2005-08-19 10:56:29 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* This algorithm is what Apple documents. But it doesn't work. */
|
|
|
|
/* */
|
2005-08-16 03:54:59 +02:00
|
|
|
int a = subglyph->transform.xx > 0 ? subglyph->transform.xx
|
|
|
|
: -subglyph->transform.xx;
|
|
|
|
int b = subglyph->transform.yx > 0 ? subglyph->transform.yx
|
|
|
|
: -subglyph->transform.yx;
|
|
|
|
int c = subglyph->transform.xy > 0 ? subglyph->transform.xy
|
|
|
|
: -subglyph->transform.xy;
|
|
|
|
int d = subglyph->transform.yy > 0 ? subglyph->transform.yy
|
|
|
|
: -subglyph->transform.yy;
|
|
|
|
int m = a > b ? a : b;
|
|
|
|
int n = c > d ? c : d;
|
|
|
|
|
|
|
|
|
|
|
|
if ( a - b <= 33 && a - b >= -33 )
|
|
|
|
m *= 2;
|
|
|
|
if ( c - d <= 33 && c - d >= -33 )
|
|
|
|
n *= 2;
|
|
|
|
x = FT_MulFix( x, m );
|
|
|
|
y = FT_MulFix( y, n );
|
|
|
|
|
|
|
|
#else /* 0 */
|
|
|
|
|
2005-08-19 10:56:29 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* This algorithm is a guess and works much better than the above. */
|
|
|
|
/* */
|
2005-08-16 03:54:59 +02:00
|
|
|
FT_Fixed mac_xscale = FT_SqrtFixed(
|
2009-07-31 17:32:14 +02:00
|
|
|
(FT_Int32)FT_MulFix( subglyph->transform.xx,
|
|
|
|
subglyph->transform.xx ) +
|
|
|
|
(FT_Int32)FT_MulFix( subglyph->transform.xy,
|
|
|
|
subglyph->transform.xy ) );
|
2005-08-16 03:54:59 +02:00
|
|
|
FT_Fixed mac_yscale = FT_SqrtFixed(
|
2009-07-31 17:32:14 +02:00
|
|
|
(FT_Int32)FT_MulFix( subglyph->transform.yy,
|
|
|
|
subglyph->transform.yy ) +
|
|
|
|
(FT_Int32)FT_MulFix( subglyph->transform.yx,
|
|
|
|
subglyph->transform.yx ) );
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
|
|
|
|
x = FT_MulFix( x, mac_xscale );
|
|
|
|
y = FT_MulFix( y, mac_yscale );
|
|
|
|
|
|
|
|
#endif /* 0 */
|
2000-07-05 06:32:02 +02:00
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )
|
|
|
|
{
|
2005-08-19 10:56:29 +02:00
|
|
|
FT_Fixed x_scale = ((TT_Size)loader->size)->metrics.x_scale;
|
|
|
|
FT_Fixed y_scale = ((TT_Size)loader->size)->metrics.y_scale;
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
x = FT_MulFix( x, x_scale );
|
|
|
|
y = FT_MulFix( y, y_scale );
|
|
|
|
|
|
|
|
if ( subglyph->flags & ROUND_XY_TO_GRID )
|
|
|
|
{
|
|
|
|
x = FT_PIX_ROUND( x );
|
|
|
|
y = FT_PIX_ROUND( y );
|
|
|
|
}
|
|
|
|
}
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( x || y )
|
|
|
|
translate_array( num_points - num_base_points,
|
|
|
|
base_vec + num_base_points,
|
|
|
|
x, y );
|
|
|
|
|
|
|
|
return TT_Err_Ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
|
|
|
/* TT_Process_Composite_Glyph */
|
|
|
|
/* */
|
|
|
|
/* <Description> */
|
|
|
|
/* This is slightly different from TT_Process_Simple_Glyph, in that */
|
2007-02-01 08:58:02 +01:00
|
|
|
/* its sole purpose is to hint the glyph. Thus this function is */
|
2005-08-16 03:54:59 +02:00
|
|
|
/* only available when bytecode interpreter is enabled. */
|
|
|
|
/* */
|
|
|
|
static FT_Error
|
|
|
|
TT_Process_Composite_Glyph( TT_Loader loader,
|
|
|
|
FT_UInt start_point,
|
|
|
|
FT_UInt start_contour )
|
|
|
|
{
|
|
|
|
FT_Error error;
|
|
|
|
FT_Outline* outline;
|
2006-06-25 08:27:27 +02:00
|
|
|
FT_UInt i;
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
|
|
|
|
outline = &loader->gloader->base.outline;
|
|
|
|
|
|
|
|
/* make room for phantom points */
|
2005-10-28 18:14:14 +02:00
|
|
|
error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader,
|
|
|
|
outline->n_points + 4,
|
|
|
|
0 );
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( error )
|
|
|
|
return error;
|
|
|
|
|
|
|
|
outline->points[outline->n_points ] = loader->pp1;
|
|
|
|
outline->points[outline->n_points + 1] = loader->pp2;
|
|
|
|
outline->points[outline->n_points + 2] = loader->pp3;
|
|
|
|
outline->points[outline->n_points + 3] = loader->pp4;
|
|
|
|
|
|
|
|
outline->tags[outline->n_points ] = 0;
|
|
|
|
outline->tags[outline->n_points + 1] = 0;
|
|
|
|
outline->tags[outline->n_points + 2] = 0;
|
|
|
|
outline->tags[outline->n_points + 3] = 0;
|
|
|
|
|
2006-08-26 00:45:13 +02:00
|
|
|
#ifdef TT_USE_BYTECODE_INTERPRETER
|
2005-08-16 03:54:59 +02:00
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2005-08-16 03:54:59 +02:00
|
|
|
FT_Stream stream = loader->stream;
|
2010-05-20 15:38:00 +02:00
|
|
|
FT_UShort n_ins, max_ins;
|
|
|
|
FT_ULong tmp;
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
|
|
|
|
/* TT_Load_Composite_Glyph only gives us the offset of instructions */
|
2005-09-28 09:34:45 +02:00
|
|
|
/* so we read them here */
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( FT_STREAM_SEEK( loader->ins_pos ) ||
|
2005-08-19 10:56:29 +02:00
|
|
|
FT_READ_USHORT( n_ins ) )
|
2005-08-16 03:54:59 +02:00
|
|
|
return error;
|
|
|
|
|
|
|
|
FT_TRACE5(( " Instructions size = %d\n", n_ins ));
|
|
|
|
|
|
|
|
/* check it */
|
2010-05-20 15:38:00 +02:00
|
|
|
max_ins = ((TT_Face)loader->face)->max_profile.maxSizeOfInstructions;
|
|
|
|
if ( n_ins > max_ins )
|
2005-08-16 03:54:59 +02:00
|
|
|
{
|
2010-05-20 15:38:00 +02:00
|
|
|
/* acroread ignores this field, so we only do a rough safety check */
|
|
|
|
if ( (FT_Int)n_ins > loader->byte_len )
|
|
|
|
{
|
|
|
|
FT_TRACE1(( "TT_Process_Composite_Glyph: "
|
2010-06-29 12:31:08 +02:00
|
|
|
"too many instructions (%d) for glyph with length %d\n",
|
2010-05-20 15:38:00 +02:00
|
|
|
n_ins, loader->byte_len ));
|
|
|
|
return TT_Err_Too_Many_Hints;
|
|
|
|
}
|
2005-08-16 03:54:59 +02:00
|
|
|
|
2010-05-20 15:38:00 +02:00
|
|
|
tmp = loader->exec->glyphSize;
|
|
|
|
error = Update_Max( loader->exec->memory,
|
|
|
|
&tmp,
|
|
|
|
sizeof ( FT_Byte ),
|
|
|
|
(void*)&loader->exec->glyphIns,
|
|
|
|
n_ins );
|
|
|
|
loader->exec->glyphSize = (FT_UShort)tmp;
|
|
|
|
if ( error )
|
|
|
|
return error;
|
2005-08-16 03:54:59 +02:00
|
|
|
}
|
|
|
|
else if ( n_ins == 0 )
|
|
|
|
return TT_Err_Ok;
|
|
|
|
|
|
|
|
if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) )
|
|
|
|
return error;
|
|
|
|
|
|
|
|
loader->glyph->control_data = loader->exec->glyphIns;
|
|
|
|
loader->glyph->control_len = n_ins;
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
|
2000-10-31 21:42:18 +01:00
|
|
|
#endif
|
* src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
* src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
* src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
Use FT_BEGIN_HEADER and FT_END_HEADER.
Use FT_LOCAL.
2004-04-24 George Williams <gww@silcom.com>
Add support for Apple's distortable font technology (in GX fonts).
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
* include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
FT_MM_Var): New structures.
(FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New function declarations.
* include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
FT_Set_Var_Design_Func): New typedefs.
Update MultiMasters service.
* include/freetype/internal/tttypes.h
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
(GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
(TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
and `blend'.
* include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
macros.
* include/freetype/internal/fttrace.h: Add `ttgxvar'.
* src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New functions.
* src/sfnt/sfobjs.c (sfnt_load_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
flag for GX var fonts.
* src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
* src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.c.
* src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
(tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
New service.
(tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(TT_Process_Simple_Glyph, load_truetype_glyph)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_done_blend.
* src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_face_vary_cvt.
* src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
* src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
and T1_Set_Var_Design.
* src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
(T1_Get_MM_Var, T1_Set_Var_Design): New functions.
* src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
function declarations.
2004-04-25 22:15:11 +02:00
|
|
|
|
2005-08-19 10:56:29 +02:00
|
|
|
tt_prepare_zone( &loader->zone, &loader->gloader->base,
|
|
|
|
start_point, start_contour );
|
2006-06-25 08:27:27 +02:00
|
|
|
|
|
|
|
/* Some points are likely touched during execution of */
|
|
|
|
/* instructions on components. So let's untouch them. */
|
|
|
|
for ( i = start_point; i < loader->zone.n_points; i++ )
|
2009-06-17 06:45:20 +02:00
|
|
|
loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH;
|
2006-06-25 08:27:27 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
loader->zone.n_points += 4;
|
|
|
|
|
|
|
|
return TT_Hint_Glyph( loader, 1 );
|
2000-06-23 07:02:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* Calculate the four phantom points. */
|
|
|
|
/* The first two stand for horizontal origin and advance. */
|
|
|
|
/* The last two stand for vertical origin and advance. */
|
|
|
|
#define TT_LOADER_SET_PP( loader ) \
|
|
|
|
do { \
|
|
|
|
(loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \
|
|
|
|
(loader)->pp1.y = 0; \
|
|
|
|
(loader)->pp2.x = (loader)->pp1.x + (loader)->advance; \
|
|
|
|
(loader)->pp2.y = 0; \
|
|
|
|
(loader)->pp3.x = 0; \
|
|
|
|
(loader)->pp3.y = (loader)->top_bearing + (loader)->bbox.yMax; \
|
|
|
|
(loader)->pp4.x = 0; \
|
|
|
|
(loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance; \
|
|
|
|
} while ( 0 )
|
|
|
|
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
2000-02-02 13:16:19 +01:00
|
|
|
/* load_truetype_glyph */
|
1999-12-17 00:11:37 +01:00
|
|
|
/* */
|
|
|
|
/* <Description> */
|
2000-06-12 21:36:41 +02:00
|
|
|
/* Loads a given truetype glyph. Handles composites and uses a */
|
|
|
|
/* TT_Loader object. */
|
1999-12-17 00:11:37 +01:00
|
|
|
/* */
|
2001-06-28 09:17:51 +02:00
|
|
|
static FT_Error
|
2002-04-01 16:25:28 +02:00
|
|
|
load_truetype_glyph( TT_Loader loader,
|
2003-01-08 10:59:17 +01:00
|
|
|
FT_UInt glyph_index,
|
2009-11-03 15:46:35 +01:00
|
|
|
FT_UInt recurse_count,
|
|
|
|
FT_Bool header_only )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2009-11-08 07:58:05 +01:00
|
|
|
FT_Error error = TT_Err_Ok;
|
2002-04-01 16:25:28 +02:00
|
|
|
FT_Fixed x_scale, y_scale;
|
2005-08-16 03:54:59 +02:00
|
|
|
FT_ULong offset;
|
|
|
|
TT_Face face = (TT_Face)loader->face;
|
|
|
|
FT_GlyphLoader gloader = loader->gloader;
|
2002-04-01 16:25:28 +02:00
|
|
|
FT_Bool opened_frame = 0;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
|
|
|
FT_Vector* deltas = NULL;
|
|
|
|
#endif
|
|
|
|
|
2002-07-18 17:59:23 +02:00
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
* src/cff/cffobjs.c (cff_size_done, cff_size_init, cff_size_reset,
cff_slot_done, cff_slot_init, cff_face_init, cff_face_done): Access
root fields directly.
* src/cff/cffdrivr.c (Load_Glyph): Access root fields directly.
* src/truetype/ttgload.c (TT_Process_Simple_Glyph): Save current
frame before calling TT_Vary_Get_Glyph_Deltas.
* src/pcf/pcfdrivr.c (PCF_CMapRec): Rename `cmap' to `root' for
consistency.
(pcf_cmap_init, pcf_cmap_done, pcf_cmap_char_index,
pcf_cmap_char_next): Don't use PCF_XXX but FT_XXX arguments which
are typecast to the proper PCF_XXX types within the function.
Update code accordingly.
(pcf_cmap_class): Remove casts.
(PCF_Face_Done, PCF_Face_Init, PCF_Set_Pixel_Size): Don't use
PCF_XXX but FT_XXX arguments which are typecast to the proper
PCF_XXX types within the function.
Update code accordingly.
Use FT_CALLBACK_DEF throughout.
(PCF_Set_Point_Size): New wrapper function.
(PCF_Glyph_Load, pcf_driver_requester): Use FT_CALLBACK_DEF.
(pcf_driver_class): Remove casts.
2004-05-07 09:08:14 +02:00
|
|
|
FT_StreamRec inc_stream;
|
|
|
|
FT_Data glyph_data;
|
|
|
|
FT_Bool glyph_data_loaded = 0;
|
* src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
* src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
* src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
Use FT_BEGIN_HEADER and FT_END_HEADER.
Use FT_LOCAL.
2004-04-24 George Williams <gww@silcom.com>
Add support for Apple's distortable font technology (in GX fonts).
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
* include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
FT_MM_Var): New structures.
(FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New function declarations.
* include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
FT_Set_Var_Design_Func): New typedefs.
Update MultiMasters service.
* include/freetype/internal/tttypes.h
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
(GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
(TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
and `blend'.
* include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
macros.
* include/freetype/internal/fttrace.h: Add `ttgxvar'.
* src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New functions.
* src/sfnt/sfobjs.c (sfnt_load_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
flag for GX var fonts.
* src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
* src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.c.
* src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
(tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
New service.
(tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(TT_Process_Simple_Glyph, load_truetype_glyph)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_done_blend.
* src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_face_vary_cvt.
* src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
* src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
and T1_Set_Var_Design.
* src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
(T1_Get_MM_Var, T1_Set_Var_Design): New functions.
* src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
function declarations.
2004-04-25 22:15:11 +02:00
|
|
|
#endif
|
|
|
|
|
2003-06-04 09:59:58 +02:00
|
|
|
|
2007-07-04 21:57:45 +02:00
|
|
|
/* some fonts have an incorrect value of `maxComponentDepth', */
|
|
|
|
/* thus we allow depth 1 to catch the majority of them */
|
|
|
|
if ( recurse_count > 1 &&
|
|
|
|
recurse_count > face->max_profile.maxComponentDepth )
|
2003-01-08 10:59:17 +01:00
|
|
|
{
|
|
|
|
error = TT_Err_Invalid_Composite;
|
|
|
|
goto Exit;
|
|
|
|
}
|
2002-07-26 11:09:10 +02:00
|
|
|
|
2000-02-02 13:16:19 +01:00
|
|
|
/* check glyph index */
|
2002-07-18 17:59:23 +02:00
|
|
|
if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
|
2000-02-02 13:16:19 +01:00
|
|
|
{
|
|
|
|
error = TT_Err_Invalid_Glyph_Index;
|
2000-06-23 14:26:14 +02:00
|
|
|
goto Exit;
|
2000-02-02 13:16:19 +01:00
|
|
|
}
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-02-15 13:54:51 +01:00
|
|
|
loader->glyph_index = glyph_index;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2004-06-21 23:16:56 +02:00
|
|
|
x_scale = ((TT_Size)loader->size)->metrics.x_scale;
|
|
|
|
y_scale = ((TT_Size)loader->size)->metrics.y_scale;
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
2005-08-16 03:54:59 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
x_scale = 0x10000L;
|
|
|
|
y_scale = 0x10000L;
|
|
|
|
}
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2009-11-03 08:11:02 +01:00
|
|
|
tt_get_metrics( loader, glyph_index );
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* Set `offset' to the start of the glyph relative to the start of */
|
2005-08-19 10:56:29 +02:00
|
|
|
/* the `glyf' table, and `byte_len' to the length of the glyph in */
|
2005-08-16 03:54:59 +02:00
|
|
|
/* bytes. */
|
|
|
|
|
2002-07-18 17:59:23 +02:00
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
2002-07-26 11:09:10 +02:00
|
|
|
|
|
|
|
/* If we are loading glyph data via the incremental interface, set */
|
|
|
|
/* the loader stream to a memory stream reading the data returned */
|
|
|
|
/* by the interface. */
|
2002-08-01 17:29:17 +02:00
|
|
|
if ( face->root.internal->incremental_interface )
|
2002-07-18 17:59:23 +02:00
|
|
|
{
|
2002-08-01 17:29:17 +02:00
|
|
|
error = face->root.internal->incremental_interface->funcs->get_glyph_data(
|
|
|
|
face->root.internal->incremental_interface->object,
|
|
|
|
glyph_index, &glyph_data );
|
2002-07-26 11:09:10 +02:00
|
|
|
if ( error )
|
2002-07-18 17:59:23 +02:00
|
|
|
goto Exit;
|
2002-07-26 11:09:10 +02:00
|
|
|
|
2002-08-01 17:29:17 +02:00
|
|
|
glyph_data_loaded = 1;
|
2002-08-06 23:47:40 +02:00
|
|
|
offset = 0;
|
2006-02-14 09:37:03 +01:00
|
|
|
loader->byte_len = glyph_data.length;
|
2002-08-06 23:47:40 +02:00
|
|
|
|
2002-07-28 07:05:24 +02:00
|
|
|
FT_MEM_ZERO( &inc_stream, sizeof ( inc_stream ) );
|
2002-08-06 23:47:40 +02:00
|
|
|
FT_Stream_OpenMemory( &inc_stream,
|
|
|
|
glyph_data.pointer, glyph_data.length );
|
|
|
|
|
2002-07-18 17:59:23 +02:00
|
|
|
loader->stream = &inc_stream;
|
|
|
|
}
|
|
|
|
else
|
2002-07-26 11:09:10 +02:00
|
|
|
|
|
|
|
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
|
2002-07-18 17:59:23 +02:00
|
|
|
|
2005-08-19 10:56:29 +02:00
|
|
|
offset = tt_face_get_location( face, glyph_index,
|
|
|
|
(FT_UInt*)&loader->byte_len );
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2008-01-10 09:47:08 +01:00
|
|
|
if ( loader->byte_len > 0 )
|
|
|
|
{
|
2010-01-05 10:10:15 +01:00
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
2010-01-04 15:53:27 +01:00
|
|
|
/* for the incremental interface, `glyf_offset' is always zero */
|
|
|
|
if ( !loader->glyf_offset &&
|
|
|
|
!face->root.internal->incremental_interface )
|
2010-01-05 10:10:15 +01:00
|
|
|
#else
|
|
|
|
if ( !loader->glyf_offset )
|
|
|
|
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
|
2008-12-09 07:51:56 +01:00
|
|
|
{
|
2009-06-26 06:15:41 +02:00
|
|
|
FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" ));
|
2008-12-09 07:51:56 +01:00
|
|
|
error = TT_Err_Invalid_Table;
|
|
|
|
goto Exit;
|
|
|
|
}
|
|
|
|
|
2008-01-10 09:47:08 +01:00
|
|
|
error = face->access_glyph_frame( loader, glyph_index,
|
|
|
|
loader->glyf_offset + offset,
|
|
|
|
loader->byte_len );
|
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
opened_frame = 1;
|
|
|
|
|
2009-11-03 15:46:35 +01:00
|
|
|
/* read glyph header first */
|
2008-01-10 09:47:08 +01:00
|
|
|
error = face->read_glyph_header( loader );
|
2009-11-03 15:46:35 +01:00
|
|
|
if ( error || header_only )
|
2008-01-10 09:47:08 +01:00
|
|
|
goto Exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( loader->byte_len == 0 || loader->n_contours == 0 )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2000-02-02 13:16:19 +01:00
|
|
|
loader->bbox.xMin = 0;
|
|
|
|
loader->bbox.xMax = 0;
|
|
|
|
loader->bbox.yMin = 0;
|
|
|
|
loader->bbox.yMax = 0;
|
|
|
|
|
2009-11-03 15:46:35 +01:00
|
|
|
if ( header_only )
|
|
|
|
goto Exit;
|
|
|
|
|
2010-02-18 17:09:30 +01:00
|
|
|
/* must initialize points before (possibly) overriding */
|
|
|
|
/* glyph metrics from the incremental interface */
|
2005-08-16 03:54:59 +02:00
|
|
|
TT_LOADER_SET_PP( loader );
|
2000-02-02 13:16:19 +01:00
|
|
|
|
2010-02-18 17:09:30 +01:00
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
|
|
|
tt_get_metrics_incr_overrides( loader, glyph_index );
|
|
|
|
#endif
|
|
|
|
|
* src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
* src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
* src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
Use FT_BEGIN_HEADER and FT_END_HEADER.
Use FT_LOCAL.
2004-04-24 George Williams <gww@silcom.com>
Add support for Apple's distortable font technology (in GX fonts).
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
* include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
FT_MM_Var): New structures.
(FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New function declarations.
* include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
FT_Set_Var_Design_Func): New typedefs.
Update MultiMasters service.
* include/freetype/internal/tttypes.h
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
(GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
(TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
and `blend'.
* include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
macros.
* include/freetype/internal/fttrace.h: Add `ttgxvar'.
* src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New functions.
* src/sfnt/sfobjs.c (sfnt_load_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
flag for GX var fonts.
* src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
* src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.c.
* src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
(tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
New service.
(tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(TT_Process_Simple_Glyph, load_truetype_glyph)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_done_blend.
* src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_face_vary_cvt.
* src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
* src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
and T1_Set_Var_Design.
* src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
(T1_Get_MM_Var, T1_Set_Var_Design): New functions.
* src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
function declarations.
2004-04-25 22:15:11 +02:00
|
|
|
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
2005-08-16 03:54:59 +02:00
|
|
|
|
* src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
* src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
* src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
Use FT_BEGIN_HEADER and FT_END_HEADER.
Use FT_LOCAL.
2004-04-24 George Williams <gww@silcom.com>
Add support for Apple's distortable font technology (in GX fonts).
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
* include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
FT_MM_Var): New structures.
(FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New function declarations.
* include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
FT_Set_Var_Design_Func): New typedefs.
Update MultiMasters service.
* include/freetype/internal/tttypes.h
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
(GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
(TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
and `blend'.
* include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
macros.
* include/freetype/internal/fttrace.h: Add `ttgxvar'.
* src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New functions.
* src/sfnt/sfobjs.c (sfnt_load_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
flag for GX var fonts.
* src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
* src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.c.
* src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
(tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
New service.
(tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(TT_Process_Simple_Glyph, load_truetype_glyph)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_done_blend.
* src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_face_vary_cvt.
* src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
* src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
and T1_Set_Var_Design.
* src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
(T1_Get_MM_Var, T1_Set_Var_Design): New functions.
* src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
function declarations.
2004-04-25 22:15:11 +02:00
|
|
|
if ( ((TT_Face)(loader->face))->doblend )
|
|
|
|
{
|
|
|
|
/* this must be done before scaling */
|
|
|
|
FT_Memory memory = loader->face->memory;
|
|
|
|
|
|
|
|
|
2004-06-28 16:19:15 +02:00
|
|
|
error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face),
|
|
|
|
glyph_index, &deltas, 4 );
|
2004-06-24 22:18:24 +02:00
|
|
|
if ( error )
|
* src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
* src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
* src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
Use FT_BEGIN_HEADER and FT_END_HEADER.
Use FT_LOCAL.
2004-04-24 George Williams <gww@silcom.com>
Add support for Apple's distortable font technology (in GX fonts).
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
* include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
FT_MM_Var): New structures.
(FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New function declarations.
* include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
FT_Set_Var_Design_Func): New typedefs.
Update MultiMasters service.
* include/freetype/internal/tttypes.h
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
(GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
(TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
and `blend'.
* include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
macros.
* include/freetype/internal/fttrace.h: Add `ttgxvar'.
* src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New functions.
* src/sfnt/sfobjs.c (sfnt_load_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
flag for GX var fonts.
* src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
* src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.c.
* src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
(tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
New service.
(tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(TT_Process_Simple_Glyph, load_truetype_glyph)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_done_blend.
* src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_face_vary_cvt.
* src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
* src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
and T1_Set_Var_Design.
* src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
(T1_Get_MM_Var, T1_Set_Var_Design): New functions.
* src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
function declarations.
2004-04-25 22:15:11 +02:00
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
loader->pp1.x += deltas[0].x; loader->pp1.y += deltas[0].y;
|
|
|
|
loader->pp2.x += deltas[1].x; loader->pp2.y += deltas[1].y;
|
|
|
|
loader->pp3.x += deltas[2].x; loader->pp3.y += deltas[2].y;
|
|
|
|
loader->pp4.x += deltas[3].x; loader->pp4.y += deltas[3].y;
|
|
|
|
|
|
|
|
FT_FREE( deltas );
|
|
|
|
}
|
2005-08-16 03:54:59 +02:00
|
|
|
|
* src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
* src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
* src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
Use FT_BEGIN_HEADER and FT_END_HEADER.
Use FT_LOCAL.
2004-04-24 George Williams <gww@silcom.com>
Add support for Apple's distortable font technology (in GX fonts).
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
* include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
FT_MM_Var): New structures.
(FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New function declarations.
* include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
FT_Set_Var_Design_Func): New typedefs.
Update MultiMasters service.
* include/freetype/internal/tttypes.h
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
(GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
(TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
and `blend'.
* include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
macros.
* include/freetype/internal/fttrace.h: Add `ttgxvar'.
* src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New functions.
* src/sfnt/sfobjs.c (sfnt_load_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
flag for GX var fonts.
* src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
* src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.c.
* src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
(tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
New service.
(tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(TT_Process_Simple_Glyph, load_truetype_glyph)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_done_blend.
* src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_face_vary_cvt.
* src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
* src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
and T1_Set_Var_Design.
* src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
(T1_Get_MM_Var, T1_Set_Var_Design): New functions.
* src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
function declarations.
2004-04-25 22:15:11 +02:00
|
|
|
#endif
|
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
|
2004-03-27 09:43:17 +01:00
|
|
|
{
|
2005-08-16 03:54:59 +02:00
|
|
|
loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );
|
2000-02-02 13:16:19 +01:00
|
|
|
loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );
|
2005-08-16 03:54:59 +02:00
|
|
|
loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );
|
2004-03-27 09:43:17 +01:00
|
|
|
loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );
|
|
|
|
}
|
2000-02-02 13:16:19 +01:00
|
|
|
|
* README: Formatting.
* Jamfile: Fix typo.
* src/cff/cffparse.c: Move error code #defines to...
* include/freetype/internal/cfferrs.h: This file.
* src/cff/cffdrivr.c, src/cff/cffobjs.c, src/cff/cffload.c: Replaced
`FT_Err_*' with `CFF_Err_*'.
* src/cid/cidparse.c: Replaced `FT_Err_*' with `T1_Err_*'.
* src/psaux/psobjs.c, src/psaux/t1decode.c: Ditto.
* src/sfnt/sfobcs.c, src/sfnt/ttload.c: Replaced `FT_Err_*' with
`TT_Err_*'.
* src/truetype/ttgload.c, src/truetype/ttobjs.c: Ditto.
* src/type1/t1gload.c, src/type1/t1load.c, src/type1/t1objs.c,
src/type1/t1parse.c: Replaced `FT_Err_*' with `T1_Err_*'.
* include/freetype/internal/cfferrs.h: Add
`CFF_Err_Unknown_File_Format'.
* include/freetype/internal/t1errors.h: Add
`T1_Err_Unknown_File_Format'.
* include/freetype/internal/tterrors.h: Add
`TT_Err_Unknown_File_Format'.
* src/cff/cffload.h: Add `cff_*_encoding' and `cff_*_charset'
references.
* src/psaux/psobjs.c: Include `FT_INTERNAL_TYPE1_ERRORS_H'.
* src/cff/cffobjs.c (CFF_Init_Face, CFF_Done_Face): Use
FT_LOCAL_DEF.
* src/cid/cidobjs.c (CID_Done_Driver): Ditto.
* src/trutype/ttobjs.c (TT_Init_Face, TT_Done_Face, TT_Init_Size):
Ditto.
* src/type1/t1objs.c (T1_Done_Driver): Ditto.
* src/pcf/pcfdriver.c (PCF_Done_Face): Ditto.
* src/pcf/pcf.h: Use FT_LOCAL for `PCF_Done_Face'.
2001-04-03 01:54:01 +02:00
|
|
|
error = TT_Err_Ok;
|
2000-06-23 14:26:14 +02:00
|
|
|
goto Exit;
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
|
2010-02-18 17:09:30 +01:00
|
|
|
/* must initialize points before (possibly) overriding */
|
|
|
|
/* glyph metrics from the incremental interface */
|
2005-08-16 03:54:59 +02:00
|
|
|
TT_LOADER_SET_PP( loader );
|
2004-03-27 09:43:17 +01:00
|
|
|
|
2010-02-18 17:09:30 +01:00
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
|
|
|
tt_get_metrics_incr_overrides( loader, glyph_index );
|
|
|
|
#endif
|
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
/***********************************************************************/
|
|
|
|
/***********************************************************************/
|
|
|
|
/***********************************************************************/
|
|
|
|
|
|
|
|
/* if it is a simple glyph, load it */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2008-01-10 09:47:08 +01:00
|
|
|
if ( loader->n_contours > 0 )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2000-06-25 06:49:19 +02:00
|
|
|
error = face->read_simple_glyph( loader );
|
2000-06-25 08:47:11 +02:00
|
|
|
if ( error )
|
2005-08-16 03:54:59 +02:00
|
|
|
goto Exit;
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* all data have been read */
|
|
|
|
face->forget_glyph_frame( loader );
|
|
|
|
opened_frame = 0;
|
2000-07-02 15:53:16 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
error = TT_Process_Simple_Glyph( loader );
|
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
2000-06-25 09:43:15 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
FT_GlyphLoader_Add( gloader );
|
|
|
|
}
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
/***********************************************************************/
|
|
|
|
/***********************************************************************/
|
|
|
|
/***********************************************************************/
|
|
|
|
|
|
|
|
/* otherwise, load a composite! */
|
2005-08-16 03:54:59 +02:00
|
|
|
else if ( loader->n_contours == -1 )
|
2000-02-02 13:16:19 +01:00
|
|
|
{
|
2007-05-19 09:01:49 +02:00
|
|
|
FT_UInt start_point;
|
|
|
|
FT_UInt start_contour;
|
|
|
|
FT_ULong ins_pos; /* position of composite instructions, if any */
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2000-07-05 06:32:02 +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
|
|
|
start_point = gloader->base.outline.n_points;
|
|
|
|
start_contour = gloader->base.outline.n_contours;
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* for each subglyph, read composite header */
|
2000-06-25 06:49:19 +02:00
|
|
|
error = face->read_composite_glyph( loader );
|
2000-06-25 08:47:11 +02:00
|
|
|
if ( error )
|
2005-08-16 03:54:59 +02:00
|
|
|
goto Exit;
|
2000-03-28 13:19:28 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* store the offset of instructions */
|
2000-07-04 20:12:13 +02:00
|
|
|
ins_pos = loader->ins_pos;
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
/* all data we need are read */
|
2000-06-25 06:49:19 +02:00
|
|
|
face->forget_glyph_frame( loader );
|
2000-06-23 14:26:14 +02:00
|
|
|
opened_frame = 0;
|
|
|
|
|
* src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
* src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
* src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
Use FT_BEGIN_HEADER and FT_END_HEADER.
Use FT_LOCAL.
2004-04-24 George Williams <gww@silcom.com>
Add support for Apple's distortable font technology (in GX fonts).
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
* include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
FT_MM_Var): New structures.
(FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New function declarations.
* include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
FT_Set_Var_Design_Func): New typedefs.
Update MultiMasters service.
* include/freetype/internal/tttypes.h
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
(GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
(TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
and `blend'.
* include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
macros.
* include/freetype/internal/fttrace.h: Add `ttgxvar'.
* src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New functions.
* src/sfnt/sfobjs.c (sfnt_load_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
flag for GX var fonts.
* src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
* src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.c.
* src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
(tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
New service.
(tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(TT_Process_Simple_Glyph, load_truetype_glyph)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_done_blend.
* src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_face_vary_cvt.
* src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
* src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
and T1_Set_Var_Design.
* src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
(T1_Get_MM_Var, T1_Set_Var_Design): New functions.
* src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
function declarations.
2004-04-25 22:15:11 +02:00
|
|
|
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
|
|
|
|
|
|
|
if ( face->doblend )
|
|
|
|
{
|
|
|
|
FT_Int i, limit;
|
|
|
|
FT_SubGlyph subglyph;
|
|
|
|
FT_Memory memory = face->root.memory;
|
|
|
|
|
|
|
|
|
|
|
|
/* this provides additional offsets */
|
|
|
|
/* for each component's translation */
|
|
|
|
|
2007-06-17 07:31:23 +02:00
|
|
|
if ( ( error = TT_Vary_Get_Glyph_Deltas(
|
|
|
|
face,
|
|
|
|
glyph_index,
|
|
|
|
&deltas,
|
|
|
|
gloader->current.num_subglyphs + 4 )) != 0 )
|
* src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
* src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
* src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
Use FT_BEGIN_HEADER and FT_END_HEADER.
Use FT_LOCAL.
2004-04-24 George Williams <gww@silcom.com>
Add support for Apple's distortable font technology (in GX fonts).
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
* include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
FT_MM_Var): New structures.
(FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New function declarations.
* include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
FT_Set_Var_Design_Func): New typedefs.
Update MultiMasters service.
* include/freetype/internal/tttypes.h
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
(GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
(TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
and `blend'.
* include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
macros.
* include/freetype/internal/fttrace.h: Add `ttgxvar'.
* src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New functions.
* src/sfnt/sfobjs.c (sfnt_load_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
flag for GX var fonts.
* src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
* src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.c.
* src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
(tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
New service.
(tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(TT_Process_Simple_Glyph, load_truetype_glyph)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_done_blend.
* src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_face_vary_cvt.
* src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
* src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
and T1_Set_Var_Design.
* src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
(T1_Get_MM_Var, T1_Set_Var_Design): New functions.
* src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
function declarations.
2004-04-25 22:15:11 +02:00
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
subglyph = gloader->current.subglyphs + gloader->base.num_subglyphs;
|
|
|
|
limit = gloader->current.num_subglyphs;
|
|
|
|
|
|
|
|
for ( i = 0; i < limit; ++i, ++subglyph )
|
|
|
|
{
|
|
|
|
if ( subglyph->flags & ARGS_ARE_XY_VALUES )
|
|
|
|
{
|
2009-07-31 17:32:17 +02:00
|
|
|
/* XXX: overflow check for subglyph->{arg1,arg2}. */
|
|
|
|
/* deltas[i].{x,y} must be within signed 16-bit, */
|
|
|
|
/* but the restriction of summed delta is not clear */
|
|
|
|
subglyph->arg1 += (FT_Int16)deltas[i].x;
|
|
|
|
subglyph->arg2 += (FT_Int16)deltas[i].y;
|
* src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
* src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
* src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
Use FT_BEGIN_HEADER and FT_END_HEADER.
Use FT_LOCAL.
2004-04-24 George Williams <gww@silcom.com>
Add support for Apple's distortable font technology (in GX fonts).
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
* include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
FT_MM_Var): New structures.
(FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New function declarations.
* include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
FT_Set_Var_Design_Func): New typedefs.
Update MultiMasters service.
* include/freetype/internal/tttypes.h
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
(GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
(TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
and `blend'.
* include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
macros.
* include/freetype/internal/fttrace.h: Add `ttgxvar'.
* src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
FT_Set_Var_Blend_Coordinates): New functions.
* src/sfnt/sfobjs.c (sfnt_load_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
flag for GX var fonts.
* src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
* src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.c.
* src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
(tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
New service.
(tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(TT_Process_Simple_Glyph, load_truetype_glyph)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_done_blend.
* src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
ttgxvar.h.
(tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
tt_face_vary_cvt.
* src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
* src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
and T1_Set_Var_Design.
* src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
(T1_Get_MM_Var, T1_Set_Var_Design): New functions.
* src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
function declarations.
2004-04-25 22:15:11 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
loader->pp1.x += deltas[i + 0].x; loader->pp1.y += deltas[i + 0].y;
|
|
|
|
loader->pp2.x += deltas[i + 1].x; loader->pp2.y += deltas[i + 1].y;
|
|
|
|
loader->pp3.x += deltas[i + 2].x; loader->pp3.y += deltas[i + 2].y;
|
|
|
|
loader->pp4.x += deltas[i + 3].x; loader->pp4.y += deltas[i + 3].y;
|
|
|
|
|
|
|
|
FT_FREE( deltas );
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
|
|
|
|
|
|
|
|
if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
|
|
|
|
{
|
|
|
|
loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );
|
|
|
|
loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );
|
|
|
|
loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );
|
|
|
|
loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );
|
|
|
|
}
|
|
|
|
|
2000-03-28 13:19:28 +02:00
|
|
|
/* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */
|
2000-06-12 21:36:41 +02:00
|
|
|
/* `as is' in the glyph slot (the client application will be */
|
2002-08-16 14:46:52 +02:00
|
|
|
/* responsible for interpreting these data)... */
|
2000-03-28 13:19:28 +02:00
|
|
|
if ( loader->load_flags & FT_LOAD_NO_RECURSE )
|
|
|
|
{
|
- 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_GlyphLoader_Add( gloader );
|
2005-08-16 03:54:59 +02:00
|
|
|
loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE;
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2000-06-23 14:26:14 +02:00
|
|
|
goto Exit;
|
2000-03-28 13:19:28 +02:00
|
|
|
}
|
|
|
|
|
2000-02-02 13:16:19 +01:00
|
|
|
/*********************************************************************/
|
2000-06-25 09:43:15 +02:00
|
|
|
/*********************************************************************/
|
|
|
|
/*********************************************************************/
|
|
|
|
|
2000-02-02 13:16:19 +01:00
|
|
|
{
|
2008-05-25 18:49:29 +02:00
|
|
|
FT_UInt n, num_base_points;
|
|
|
|
FT_SubGlyph subglyph = 0;
|
2007-05-19 09:01:49 +02:00
|
|
|
|
2008-05-25 18:49:29 +02:00
|
|
|
FT_UInt num_points = start_point;
|
|
|
|
FT_UInt num_subglyphs = gloader->current.num_subglyphs;
|
|
|
|
FT_UInt num_base_subgs = gloader->base.num_subglyphs;
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2008-05-25 18:49:29 +02:00
|
|
|
FT_Stream old_stream = loader->stream;
|
2010-05-20 15:38:00 +02:00
|
|
|
FT_Int old_byte_len = loader->byte_len;
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2000-06-23 07:02:13 +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_GlyphLoader_Add( gloader );
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* read each subglyph independently */
|
2005-08-19 10:56:29 +02:00
|
|
|
for ( n = 0; n < num_subglyphs; n++ )
|
2000-02-02 13:16:19 +01:00
|
|
|
{
|
2005-08-16 03:54:59 +02:00
|
|
|
FT_Vector pp[4];
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-25 09:43:15 +02:00
|
|
|
|
2000-06-25 08:47:11 +02:00
|
|
|
/* Each time we call load_truetype_glyph in this loop, the */
|
|
|
|
/* value of `gloader.base.subglyphs' can change due to table */
|
|
|
|
/* reallocations. We thus need to recompute the subglyph */
|
|
|
|
/* pointer on each iteration. */
|
- 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
|
|
|
subglyph = gloader->base.subglyphs + num_base_subgs + n;
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
pp[0] = loader->pp1;
|
|
|
|
pp[1] = loader->pp2;
|
|
|
|
pp[2] = loader->pp3;
|
|
|
|
pp[3] = loader->pp4;
|
1999-12-17 00:11:37 +01: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
|
|
|
num_base_points = gloader->base.outline.n_points;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2003-01-08 10:59:17 +01:00
|
|
|
error = load_truetype_glyph( loader, subglyph->index,
|
2009-11-03 15:46:35 +01:00
|
|
|
recurse_count + 1, FALSE );
|
2000-06-12 21:36:41 +02:00
|
|
|
if ( error )
|
2005-08-16 03:54:59 +02:00
|
|
|
goto Exit;
|
2000-05-17 22:56:01 +02:00
|
|
|
|
2001-05-16 19:49:07 +02:00
|
|
|
/* restore subglyph pointer */
|
- 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
|
|
|
subglyph = gloader->base.subglyphs + num_base_subgs + n;
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( !( subglyph->flags & USE_MY_METRICS ) )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2005-08-16 03:54:59 +02:00
|
|
|
loader->pp1 = pp[0];
|
|
|
|
loader->pp2 = pp[1];
|
|
|
|
loader->pp3 = pp[2];
|
|
|
|
loader->pp4 = pp[3];
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-25 09:43:15 +02:00
|
|
|
num_points = gloader->base.outline.n_points;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( num_points == num_base_points )
|
|
|
|
continue;
|
|
|
|
|
2007-05-19 09:01:49 +02:00
|
|
|
/* gloader->base.outline consists of three parts: */
|
|
|
|
/* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */
|
|
|
|
/* */
|
|
|
|
/* (1): exists from the beginning */
|
|
|
|
/* (2): components that have been loaded so far */
|
|
|
|
/* (3): the newly loaded component */
|
2005-08-16 03:54:59 +02:00
|
|
|
TT_Process_Composite_Component( loader, subglyph, start_point,
|
|
|
|
num_base_points );
|
2000-02-02 13:16:19 +01:00
|
|
|
}
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2010-05-20 15:38:00 +02:00
|
|
|
loader->stream = old_stream;
|
|
|
|
loader->byte_len = old_byte_len;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* process the glyph */
|
|
|
|
loader->ins_pos = ins_pos;
|
|
|
|
if ( IS_HINTED( loader->load_flags ) &&
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2006-08-26 00:45:13 +02:00
|
|
|
#ifdef TT_USE_BYTECODE_INTERPRETER
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
subglyph->flags & WE_HAVE_INSTR &&
|
2000-06-23 07:02:13 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
#endif
|
2000-06-25 09:43:15 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
num_points > start_point )
|
|
|
|
TT_Process_Composite_Glyph( loader, start_point, start_contour );
|
2000-06-25 09:43:15 +02:00
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
}
|
2003-01-08 10:59:17 +01:00
|
|
|
else
|
|
|
|
{
|
2007-05-19 09:01:49 +02:00
|
|
|
/* invalid composite count (negative but not -1) */
|
2003-01-08 10:59:17 +01:00
|
|
|
error = TT_Err_Invalid_Outline;
|
2005-08-16 03:54:59 +02:00
|
|
|
goto Exit;
|
2003-01-08 10:59:17 +01:00
|
|
|
}
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
/***********************************************************************/
|
|
|
|
/***********************************************************************/
|
|
|
|
/***********************************************************************/
|
2000-02-02 13:16:19 +01:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
Exit:
|
|
|
|
|
2000-06-25 08:47:11 +02:00
|
|
|
if ( opened_frame )
|
2000-06-25 06:49:19 +02:00
|
|
|
face->forget_glyph_frame( loader );
|
2000-06-23 14:26:14 +02:00
|
|
|
|
2002-08-01 17:29:17 +02:00
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
2005-08-16 03:54:59 +02:00
|
|
|
|
2002-08-06 23:47:40 +02:00
|
|
|
if ( glyph_data_loaded )
|
|
|
|
face->root.internal->incremental_interface->funcs->free_glyph_data(
|
|
|
|
face->root.internal->incremental_interface->object,
|
|
|
|
&glyph_data );
|
2005-08-16 03:54:59 +02:00
|
|
|
|
2002-08-01 17:29:17 +02:00
|
|
|
#endif
|
|
|
|
|
2000-05-17 01:44:38 +02:00
|
|
|
return error;
|
2000-02-02 13:16:19 +01:00
|
|
|
}
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
2002-07-18 17:59:23 +02:00
|
|
|
static FT_Error
|
2007-05-19 09:01:49 +02:00
|
|
|
compute_glyph_metrics( TT_Loader loader,
|
|
|
|
FT_UInt glyph_index )
|
2000-02-02 13:16:19 +01:00
|
|
|
{
|
2000-06-16 21:34:52 +02:00
|
|
|
FT_BBox bbox;
|
2000-06-23 07:02:13 +02:00
|
|
|
TT_Face face = (TT_Face)loader->face;
|
2001-06-18 16:23:45 +02:00
|
|
|
FT_Fixed y_scale;
|
2000-02-02 13:16:19 +01:00
|
|
|
TT_GlyphSlot glyph = loader->glyph;
|
2000-06-23 07:02:13 +02:00
|
|
|
TT_Size size = (TT_Size)loader->size;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-25 09:43:15 +02:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
y_scale = 0x10000L;
|
|
|
|
if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
|
2000-02-02 13:16:19 +01:00
|
|
|
y_scale = size->root.metrics.y_scale;
|
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 ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE )
|
2000-03-28 13:19:28 +02:00
|
|
|
FT_Outline_Get_CBox( &glyph->outline, &bbox );
|
|
|
|
else
|
|
|
|
bbox = loader->bbox;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2007-05-19 09:01:49 +02:00
|
|
|
/* get the device-independent horizontal advance; it is scaled later */
|
|
|
|
/* by the base layer. */
|
2011-04-21 08:21:37 +02:00
|
|
|
glyph->linearHoriAdvance = loader->linear;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
glyph->metrics.horiBearingX = bbox.xMin;
|
|
|
|
glyph->metrics.horiBearingY = bbox.yMax;
|
2000-02-02 13:16:19 +01:00
|
|
|
glyph->metrics.horiAdvance = loader->pp2.x - loader->pp1.x;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2009-09-02 13:06:33 +02:00
|
|
|
/* adjust advance width to the value contained in the hdmx table */
|
|
|
|
if ( !face->postscript.isFixedPitch &&
|
|
|
|
IS_HINTED( loader->load_flags ) )
|
|
|
|
{
|
|
|
|
FT_Byte* widthp;
|
|
|
|
|
[truetype] Support subpixel hinting.
This is the large, famous `Infinality' patch to support ClearType
bytecode which has been available from
http://www.infinality.net/blog/ for some time, and which has been
refined over the last years. While still experimental, it is now
mature enough to be included directly into FreeType.
Most of the code is based on the ClearType whitepaper written by
Greg Hitchcock
http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
which gives a detailed overview of the necessary changes to the
Microsoft rasterizer so that older fonts are supported. However, a
lot of details are still missing, and this patches provides a
framework to easily handle rendering issues down to the glyph level
of certain fonts.
Note that ClearType support is not completely implemented! In
particular, full support for the options `compatible_widths',
`symmetrical_smoothing, and `bgr' (via the GETINFO bytecode
instruction) is missing.
* src/truetype/ttsubpix.c: New file, providing code to handle
`tweaks', this is, rules for certain glyphs in certain fonts
(including wildcards) which need a special treatment.
* src/truetype/ttsubpix.h: New file, holding the tweaking rules.
* include/freetype/config/ftoption.h, src/devel/ftoption.h
(TT_CONFIG_OPTION_SUBPIXEL_HINTING): New macro.
* include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID,
FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): New macros.
* src/truetype/truetype.c [TT_USE_BYTECODE_INTERPRETER]: Include
`ttsubpix.c'.
* src/truetype/ttgload.c: Include `ttsubpix.h'.
[All changes below are guarded by TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(tt_get_metrics): Set tweak flags.
(TT_Hint_Glyph): Call `FT_Outline_EmboldenXY' if necessary.
(TT_Process_Simple_Glyph): Compensate emboldening if necessary.
(compute_glyph_metrics): Handle `compatible widths' option.
(tt_loader_init): Handle ClearType GETINFO information bits.
* src/truetype/rules.mk (TT_DRC_SRC): Updated.
* src/truetype/ttinterp.c: Include `ttsubpix.h'.
[Where necessary, changes below are guarded by
TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(Direct_Move, Direct_Move_X): Extended.
(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45,
SetSuperRound): Add parameter to handle the number of grid lines per
pixel.
(SET_SuperRound, ROUND_None, CUR_Func_round): Updated.
(DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated.
(DO_ROUND, DO_NROUND): Updated.
(DO_RS): Take care of `Typeman' bytecode patterns.
(Ins_FDEF): Add some debugging code. Commented out.
(Ins_ENDF): Restore state.
(Ins_CALL, Ins_LOOPCALL): Handle inline delta functions.
(Ins_MD): Handle `Vacuform' rounds.
(Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP,
Ins_MDRP, Ins_MIRP): Handle tweaks.
(Ins_ALIGNRP): Add tweak guard.
(Ins_IUP, Ins_DELTAP): Handle tweaks.
(Ins_GETINFO): Handle new ClearType bits.
(TT_RunIns): Handle tweaks.
* src/truetype/ttinterp.h: Updated.
(SPH_TweakRule, SPH_ScaleRule): New structures for tweaks.
(TT_ExecContextRec): Add members for subpixel hinting support.
* src/truetype/ttobjs.h (TT_DefRecord): Add `inline_delta' member.
2012-06-18 10:36:06 +02:00
|
|
|
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
|
|
|
FT_Bool ignore_x_mode;
|
|
|
|
|
|
|
|
|
|
|
|
ignore_x_mode = FT_BOOL( FT_LOAD_TARGET_MODE( loader->load_flags ) !=
|
|
|
|
FT_RENDER_MODE_MONO );
|
|
|
|
#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
2009-09-02 13:06:33 +02:00
|
|
|
|
|
|
|
widthp = tt_face_get_device_metrics( face,
|
|
|
|
size->root.metrics.x_ppem,
|
|
|
|
glyph_index );
|
1999-12-17 00:11:37 +01:00
|
|
|
|
[truetype] Support subpixel hinting.
This is the large, famous `Infinality' patch to support ClearType
bytecode which has been available from
http://www.infinality.net/blog/ for some time, and which has been
refined over the last years. While still experimental, it is now
mature enough to be included directly into FreeType.
Most of the code is based on the ClearType whitepaper written by
Greg Hitchcock
http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
which gives a detailed overview of the necessary changes to the
Microsoft rasterizer so that older fonts are supported. However, a
lot of details are still missing, and this patches provides a
framework to easily handle rendering issues down to the glyph level
of certain fonts.
Note that ClearType support is not completely implemented! In
particular, full support for the options `compatible_widths',
`symmetrical_smoothing, and `bgr' (via the GETINFO bytecode
instruction) is missing.
* src/truetype/ttsubpix.c: New file, providing code to handle
`tweaks', this is, rules for certain glyphs in certain fonts
(including wildcards) which need a special treatment.
* src/truetype/ttsubpix.h: New file, holding the tweaking rules.
* include/freetype/config/ftoption.h, src/devel/ftoption.h
(TT_CONFIG_OPTION_SUBPIXEL_HINTING): New macro.
* include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID,
FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): New macros.
* src/truetype/truetype.c [TT_USE_BYTECODE_INTERPRETER]: Include
`ttsubpix.c'.
* src/truetype/ttgload.c: Include `ttsubpix.h'.
[All changes below are guarded by TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(tt_get_metrics): Set tweak flags.
(TT_Hint_Glyph): Call `FT_Outline_EmboldenXY' if necessary.
(TT_Process_Simple_Glyph): Compensate emboldening if necessary.
(compute_glyph_metrics): Handle `compatible widths' option.
(tt_loader_init): Handle ClearType GETINFO information bits.
* src/truetype/rules.mk (TT_DRC_SRC): Updated.
* src/truetype/ttinterp.c: Include `ttsubpix.h'.
[Where necessary, changes below are guarded by
TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(Direct_Move, Direct_Move_X): Extended.
(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45,
SetSuperRound): Add parameter to handle the number of grid lines per
pixel.
(SET_SuperRound, ROUND_None, CUR_Func_round): Updated.
(DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated.
(DO_ROUND, DO_NROUND): Updated.
(DO_RS): Take care of `Typeman' bytecode patterns.
(Ins_FDEF): Add some debugging code. Commented out.
(Ins_ENDF): Restore state.
(Ins_CALL, Ins_LOOPCALL): Handle inline delta functions.
(Ins_MD): Handle `Vacuform' rounds.
(Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP,
Ins_MDRP, Ins_MIRP): Handle tweaks.
(Ins_ALIGNRP): Add tweak guard.
(Ins_IUP, Ins_DELTAP): Handle tweaks.
(Ins_GETINFO): Handle new ClearType bits.
(TT_RunIns): Handle tweaks.
* src/truetype/ttinterp.h: Updated.
(SPH_TweakRule, SPH_ScaleRule): New structures for tweaks.
(TT_ExecContextRec): Add members for subpixel hinting support.
* src/truetype/ttobjs.h (TT_DefRecord): Add `inline_delta' member.
2012-06-18 10:36:06 +02:00
|
|
|
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
|
|
|
if ( widthp &&
|
|
|
|
( ( ignore_x_mode && loader->exec->compatible_widths ) ||
|
|
|
|
!ignore_x_mode ||
|
|
|
|
SPH_OPTION_BITMAP_WIDTHS ) )
|
|
|
|
#else
|
2009-09-02 13:06:33 +02:00
|
|
|
if ( widthp )
|
[truetype] Support subpixel hinting.
This is the large, famous `Infinality' patch to support ClearType
bytecode which has been available from
http://www.infinality.net/blog/ for some time, and which has been
refined over the last years. While still experimental, it is now
mature enough to be included directly into FreeType.
Most of the code is based on the ClearType whitepaper written by
Greg Hitchcock
http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
which gives a detailed overview of the necessary changes to the
Microsoft rasterizer so that older fonts are supported. However, a
lot of details are still missing, and this patches provides a
framework to easily handle rendering issues down to the glyph level
of certain fonts.
Note that ClearType support is not completely implemented! In
particular, full support for the options `compatible_widths',
`symmetrical_smoothing, and `bgr' (via the GETINFO bytecode
instruction) is missing.
* src/truetype/ttsubpix.c: New file, providing code to handle
`tweaks', this is, rules for certain glyphs in certain fonts
(including wildcards) which need a special treatment.
* src/truetype/ttsubpix.h: New file, holding the tweaking rules.
* include/freetype/config/ftoption.h, src/devel/ftoption.h
(TT_CONFIG_OPTION_SUBPIXEL_HINTING): New macro.
* include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID,
FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): New macros.
* src/truetype/truetype.c [TT_USE_BYTECODE_INTERPRETER]: Include
`ttsubpix.c'.
* src/truetype/ttgload.c: Include `ttsubpix.h'.
[All changes below are guarded by TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(tt_get_metrics): Set tweak flags.
(TT_Hint_Glyph): Call `FT_Outline_EmboldenXY' if necessary.
(TT_Process_Simple_Glyph): Compensate emboldening if necessary.
(compute_glyph_metrics): Handle `compatible widths' option.
(tt_loader_init): Handle ClearType GETINFO information bits.
* src/truetype/rules.mk (TT_DRC_SRC): Updated.
* src/truetype/ttinterp.c: Include `ttsubpix.h'.
[Where necessary, changes below are guarded by
TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(Direct_Move, Direct_Move_X): Extended.
(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45,
SetSuperRound): Add parameter to handle the number of grid lines per
pixel.
(SET_SuperRound, ROUND_None, CUR_Func_round): Updated.
(DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated.
(DO_ROUND, DO_NROUND): Updated.
(DO_RS): Take care of `Typeman' bytecode patterns.
(Ins_FDEF): Add some debugging code. Commented out.
(Ins_ENDF): Restore state.
(Ins_CALL, Ins_LOOPCALL): Handle inline delta functions.
(Ins_MD): Handle `Vacuform' rounds.
(Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP,
Ins_MDRP, Ins_MIRP): Handle tweaks.
(Ins_ALIGNRP): Add tweak guard.
(Ins_IUP, Ins_DELTAP): Handle tweaks.
(Ins_GETINFO): Handle new ClearType bits.
(TT_RunIns): Handle tweaks.
* src/truetype/ttinterp.h: Updated.
(SPH_TweakRule, SPH_ScaleRule): New structures for tweaks.
(TT_ExecContextRec): Add members for subpixel hinting support.
* src/truetype/ttobjs.h (TT_DefRecord): Add `inline_delta' member.
2012-06-18 10:36:06 +02:00
|
|
|
#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
2009-09-02 13:06:33 +02:00
|
|
|
glyph->metrics.horiAdvance = *widthp << 6;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* set glyph dimensions */
|
|
|
|
glyph->metrics.width = bbox.xMax - bbox.xMin;
|
|
|
|
glyph->metrics.height = bbox.yMax - bbox.yMin;
|
|
|
|
|
|
|
|
/* Now take care of vertical metrics. In the case where there is */
|
|
|
|
/* no vertical information within the font (relatively common), */
|
|
|
|
/* create some metrics manually */
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2006-01-15 08:30:32 +01:00
|
|
|
FT_Pos top; /* scaled vertical top side bearing */
|
|
|
|
FT_Pos advance; /* scaled vertical advance height */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2004-06-03 09:56:21 +02:00
|
|
|
|
2002-07-18 17:59:23 +02:00
|
|
|
/* Get the unscaled top bearing and advance height. */
|
2009-09-08 07:06:54 +02:00
|
|
|
if ( face->vertical_info &&
|
1999-12-17 00:11:37 +01:00
|
|
|
face->vertical.number_Of_VMetrics > 0 )
|
|
|
|
{
|
2006-01-15 07:24:53 +01:00
|
|
|
top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax,
|
|
|
|
y_scale );
|
* src/base/ftoutln.c (FT_Outline_Embolden): Strength should be
halved.
* src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default
strength.
Don't increase slot->advance.y.
* include/freetype/freetype.h (FREETYPE_MINOR): Set to 2.
(FREETYPE_PATCH): Set to 0.
* builds/unix/configure.ac (version_info): Set to 9:9:3.
Currently, we are still binary compatible.
* builds/win32/visualc/index.html,
builds/win32/visualc/freetype.dsp,
builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/.
* builds/freetype.mk (refdoc), README, Jamfile (RefDoc):
s/2.1.9/2.1.10/.
* docs/CHANGES, docs/VERSION.DLL: Updated.
* ChangeLog: Split off older entries into...
* ChangeLog.20, ChangeLog.21: These new files.
The next release will be 2.2.0, so don't worry about source code
backwards compatibility.
* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
FT_Outline_LineToFunc, FT_Outline_ConicToFunc,
FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc),
include/freetype/ftrender.h (FT_Glyph_TransformFunc,
FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate
parameters with `const' where appropriate.
* src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY
to make glyphs centered vertically.
* src/truetype/ttgload.c (compute_glyph_metrics): Compute
vertBearingY to make glyphs centered vertically.
Fix some bugs in vertical metrics:
. loader->pp3.y and loader->pp4.y are in 26.6 format, not in font
units.
. As we use the glyph's cbox to calculate the top bearing now
there iss no need to adjust `top'.
* src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be
in sync with OTV_OPTIONAL_OFFSET. Reported by YAMATO Masatake.
* docs/release: Update.
2005-06-16 21:07:08 +02:00
|
|
|
|
|
|
|
if ( loader->pp3.y <= loader->pp4.y )
|
2006-01-15 07:24:53 +01:00
|
|
|
advance = 0;
|
* src/base/ftoutln.c (FT_Outline_Embolden): Strength should be
halved.
* src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default
strength.
Don't increase slot->advance.y.
* include/freetype/freetype.h (FREETYPE_MINOR): Set to 2.
(FREETYPE_PATCH): Set to 0.
* builds/unix/configure.ac (version_info): Set to 9:9:3.
Currently, we are still binary compatible.
* builds/win32/visualc/index.html,
builds/win32/visualc/freetype.dsp,
builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/.
* builds/freetype.mk (refdoc), README, Jamfile (RefDoc):
s/2.1.9/2.1.10/.
* docs/CHANGES, docs/VERSION.DLL: Updated.
* ChangeLog: Split off older entries into...
* ChangeLog.20, ChangeLog.21: These new files.
The next release will be 2.2.0, so don't worry about source code
backwards compatibility.
* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
FT_Outline_LineToFunc, FT_Outline_ConicToFunc,
FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc),
include/freetype/ftrender.h (FT_Glyph_TransformFunc,
FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate
parameters with `const' where appropriate.
* src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY
to make glyphs centered vertically.
* src/truetype/ttgload.c (compute_glyph_metrics): Compute
vertBearingY to make glyphs centered vertically.
Fix some bugs in vertical metrics:
. loader->pp3.y and loader->pp4.y are in 26.6 format, not in font
units.
. As we use the glyph's cbox to calculate the top bearing now
there iss no need to adjust `top'.
* src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be
in sync with OTV_OPTIONAL_OFFSET. Reported by YAMATO Masatake.
* docs/release: Update.
2005-06-16 21:07:08 +02:00
|
|
|
else
|
2006-01-15 07:24:53 +01:00
|
|
|
advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y,
|
|
|
|
y_scale );
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2006-01-15 07:24:53 +01:00
|
|
|
FT_Pos height;
|
* src/base/ftoutln.c (FT_Outline_Embolden): Strength should be
halved.
* src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default
strength.
Don't increase slot->advance.y.
* include/freetype/freetype.h (FREETYPE_MINOR): Set to 2.
(FREETYPE_PATCH): Set to 0.
* builds/unix/configure.ac (version_info): Set to 9:9:3.
Currently, we are still binary compatible.
* builds/win32/visualc/index.html,
builds/win32/visualc/freetype.dsp,
builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/.
* builds/freetype.mk (refdoc), README, Jamfile (RefDoc):
s/2.1.9/2.1.10/.
* docs/CHANGES, docs/VERSION.DLL: Updated.
* ChangeLog: Split off older entries into...
* ChangeLog.20, ChangeLog.21: These new files.
The next release will be 2.2.0, so don't worry about source code
backwards compatibility.
* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
FT_Outline_LineToFunc, FT_Outline_ConicToFunc,
FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc),
include/freetype/ftrender.h (FT_Glyph_TransformFunc,
FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate
parameters with `const' where appropriate.
* src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY
to make glyphs centered vertically.
* src/truetype/ttgload.c (compute_glyph_metrics): Compute
vertBearingY to make glyphs centered vertically.
Fix some bugs in vertical metrics:
. loader->pp3.y and loader->pp4.y are in 26.6 format, not in font
units.
. As we use the glyph's cbox to calculate the top bearing now
there iss no need to adjust `top'.
* src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be
in sync with OTV_OPTIONAL_OFFSET. Reported by YAMATO Masatake.
* docs/release: Update.
2005-06-16 21:07:08 +02:00
|
|
|
|
|
|
|
|
|
|
|
/* XXX Compute top side bearing and advance height in */
|
|
|
|
/* Get_VMetrics instead of here. */
|
2000-06-12 21:36:41 +02:00
|
|
|
|
|
|
|
/* NOTE: The OS/2 values are the only `portable' ones, */
|
|
|
|
/* which is why we use them, if there is an OS/2 */
|
|
|
|
/* table in the font. Otherwise, we use the */
|
|
|
|
/* values defined in the horizontal header. */
|
* src/base/ftoutln.c (FT_Outline_Embolden): Strength should be
halved.
* src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default
strength.
Don't increase slot->advance.y.
* include/freetype/freetype.h (FREETYPE_MINOR): Set to 2.
(FREETYPE_PATCH): Set to 0.
* builds/unix/configure.ac (version_info): Set to 9:9:3.
Currently, we are still binary compatible.
* builds/win32/visualc/index.html,
builds/win32/visualc/freetype.dsp,
builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/.
* builds/freetype.mk (refdoc), README, Jamfile (RefDoc):
s/2.1.9/2.1.10/.
* docs/CHANGES, docs/VERSION.DLL: Updated.
* ChangeLog: Split off older entries into...
* ChangeLog.20, ChangeLog.21: These new files.
The next release will be 2.2.0, so don't worry about source code
backwards compatibility.
* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
FT_Outline_LineToFunc, FT_Outline_ConicToFunc,
FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc),
include/freetype/ftrender.h (FT_Glyph_TransformFunc,
FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate
parameters with `const' where appropriate.
* src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY
to make glyphs centered vertically.
* src/truetype/ttgload.c (compute_glyph_metrics): Compute
vertBearingY to make glyphs centered vertically.
Fix some bugs in vertical metrics:
. loader->pp3.y and loader->pp4.y are in 26.6 format, not in font
units.
. As we use the glyph's cbox to calculate the top bearing now
there iss no need to adjust `top'.
* src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be
in sync with OTV_OPTIONAL_OFFSET. Reported by YAMATO Masatake.
* docs/release: Update.
2005-06-16 21:07:08 +02:00
|
|
|
|
2006-01-15 07:24:53 +01:00
|
|
|
height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin,
|
|
|
|
y_scale );
|
2002-04-01 16:25:28 +02:00
|
|
|
if ( face->os2.version != 0xFFFFU )
|
2006-01-15 07:24:53 +01:00
|
|
|
advance = (FT_Pos)( face->os2.sTypoAscender -
|
|
|
|
face->os2.sTypoDescender );
|
1999-12-17 00:11:37 +01:00
|
|
|
else
|
2006-01-15 07:24:53 +01:00
|
|
|
advance = (FT_Pos)( face->horizontal.Ascender -
|
|
|
|
face->horizontal.Descender );
|
* src/base/ftoutln.c (FT_Outline_Embolden): Strength should be
halved.
* src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default
strength.
Don't increase slot->advance.y.
* include/freetype/freetype.h (FREETYPE_MINOR): Set to 2.
(FREETYPE_PATCH): Set to 0.
* builds/unix/configure.ac (version_info): Set to 9:9:3.
Currently, we are still binary compatible.
* builds/win32/visualc/index.html,
builds/win32/visualc/freetype.dsp,
builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/.
* builds/freetype.mk (refdoc), README, Jamfile (RefDoc):
s/2.1.9/2.1.10/.
* docs/CHANGES, docs/VERSION.DLL: Updated.
* ChangeLog: Split off older entries into...
* ChangeLog.20, ChangeLog.21: These new files.
The next release will be 2.2.0, so don't worry about source code
backwards compatibility.
* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
FT_Outline_LineToFunc, FT_Outline_ConicToFunc,
FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc),
include/freetype/ftrender.h (FT_Glyph_TransformFunc,
FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate
parameters with `const' where appropriate.
* src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY
to make glyphs centered vertically.
* src/truetype/ttgload.c (compute_glyph_metrics): Compute
vertBearingY to make glyphs centered vertically.
Fix some bugs in vertical metrics:
. loader->pp3.y and loader->pp4.y are in 26.6 format, not in font
units.
. As we use the glyph's cbox to calculate the top bearing now
there iss no need to adjust `top'.
* src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be
in sync with OTV_OPTIONAL_OFFSET. Reported by YAMATO Masatake.
* docs/release: Update.
2005-06-16 21:07:08 +02:00
|
|
|
|
2006-01-15 07:24:53 +01:00
|
|
|
top = ( advance - height ) / 2;
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
|
2003-02-13 18:49:27 +01:00
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
|
|
|
{
|
2006-01-15 07:24:53 +01:00
|
|
|
FT_Incremental_InterfaceRec* incr;
|
|
|
|
FT_Incremental_MetricsRec metrics;
|
|
|
|
FT_Error error;
|
2003-02-13 18:49:27 +01:00
|
|
|
|
2003-04-23 17:50:27 +02:00
|
|
|
|
2006-01-15 07:24:53 +01:00
|
|
|
incr = face->root.internal->incremental_interface;
|
2003-02-13 18:49:27 +01:00
|
|
|
|
2006-01-15 07:24:53 +01:00
|
|
|
/* If this is an incrementally loaded font see if there are */
|
|
|
|
/* overriding metrics for this glyph. */
|
|
|
|
if ( incr && incr->funcs->get_glyph_metrics )
|
|
|
|
{
|
|
|
|
metrics.bearing_x = 0;
|
|
|
|
metrics.bearing_y = top;
|
|
|
|
metrics.advance = advance;
|
2006-01-15 08:30:32 +01:00
|
|
|
|
2006-01-15 07:24:53 +01:00
|
|
|
error = incr->funcs->get_glyph_metrics( incr->object,
|
|
|
|
glyph_index,
|
|
|
|
TRUE,
|
|
|
|
&metrics );
|
|
|
|
if ( error )
|
|
|
|
return error;
|
2003-02-13 18:49:27 +01:00
|
|
|
|
2006-01-15 07:24:53 +01:00
|
|
|
top = metrics.bearing_y;
|
|
|
|
advance = metrics.advance;
|
|
|
|
}
|
2003-02-13 18:49:27 +01:00
|
|
|
}
|
|
|
|
|
2004-03-27 09:43:17 +01:00
|
|
|
/* GWW: Do vertical metrics get loaded incrementally too? */
|
|
|
|
|
2003-02-13 18:49:27 +01:00
|
|
|
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
|
|
|
|
|
2006-01-15 07:24:53 +01:00
|
|
|
glyph->linearVertAdvance = advance;
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
/* scale the metrics */
|
2000-06-12 21:36:41 +02:00
|
|
|
if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2009-11-03 15:46:35 +01:00
|
|
|
top = FT_MulFix( top, y_scale );
|
2006-01-15 07:24:53 +01:00
|
|
|
advance = FT_MulFix( advance, y_scale );
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
|
2000-06-25 08:47:11 +02:00
|
|
|
/* XXX: for now, we have no better algorithm for the lsb, but it */
|
|
|
|
/* should work fine. */
|
|
|
|
/* */
|
2009-09-02 13:06:33 +02:00
|
|
|
glyph->metrics.vertBearingX = glyph->metrics.horiBearingX -
|
|
|
|
glyph->metrics.horiAdvance / 2;
|
1999-12-17 00:11:37 +01:00
|
|
|
glyph->metrics.vertBearingY = top;
|
|
|
|
glyph->metrics.vertAdvance = advance;
|
|
|
|
}
|
|
|
|
|
2002-07-18 17:59:23 +02:00
|
|
|
return 0;
|
2000-02-02 13:16:19 +01:00
|
|
|
}
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
|
2005-08-19 10:56:29 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
static FT_Error
|
|
|
|
load_sbit_image( TT_Size size,
|
|
|
|
TT_GlyphSlot glyph,
|
|
|
|
FT_UInt glyph_index,
|
|
|
|
FT_Int32 load_flags )
|
|
|
|
{
|
|
|
|
TT_Face face;
|
|
|
|
SFNT_Service sfnt;
|
|
|
|
FT_Stream stream;
|
|
|
|
FT_Error error;
|
|
|
|
TT_SBit_MetricsRec metrics;
|
|
|
|
|
2005-08-19 10:56:29 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
face = (TT_Face)glyph->face;
|
|
|
|
sfnt = (SFNT_Service)face->sfnt;
|
|
|
|
stream = face->root.stream;
|
|
|
|
|
|
|
|
error = sfnt->load_sbit_image( face,
|
* include/freetype/internal/sfnt.h (SFNT_Interface): New method
`load_strike_metrics' used to load the strike's metrics.
* src/sfnt/sfdriver.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h,
src/sfnt/ttsbit0.c: New function `tt_face_load_strike_metrics'.
* src/pfr/pfrobjs.c (pfr_face_init): Set FT_Bitmap_Size correctly.
* src/winfonts/winfnt.c (FNT_Face_Init): Use `nominal_point_size' for
nominal size unless it is obviously incorrect.
* include/freetype/freetype.h (FT_Bitmap_Size): Update the comments on
FNT driver.
Introduce new size selection interface.
* include/freetype/internal/ftdriver.h (struct FT_Driver_ClassRec_):
Replace `set_char_sizes' and `set_pixel_sizes' by `request_size' and
`select_size'.
* include/freetype/freetype.h (FT_Select_Size, FT_Size_Request_Type,
FT_Size_Request, FT_Request_Size, FT_Select_Size), src/base/ftobjs.c
(FT_Select_Size, FT_Request_Size): API additions to export the new
size selection interface.
* src/base/ftobjs.c (FT_Set_Char_Size, FT_Set_Pixel_Sizes): Use
`FT_Request_Size'.
* include/freetype/internal/ftobjs.h (FT_Match_Size),
src/base/ftobjs.c (FT_Match_Size): New function to match a size
request against `available_sizes'. Drivers supporting bitmap strikes
can use this function to implement `request_size'.
* src/bdf/bdfdrivr.c, src/cid/cidobjs.c, src/cid/cidobjs.h,
src/cid/cidriver.c, src/pcf/pcfdrivr.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type1/t1objs.h, src/type42/t42drivr.c,
src/type42/t42objs.c, src/type42/t42objs.h, src/winfonts/winfnt.c:
Update to new size selection interface.
* src/cff/cffdrivr.c, src/cff/cffgload.c, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/truetype/ttdriver.c, src/truetype/ttgload.c,
src/truetype/ttobjs.c, src/truetype/ttobjs.h: Update to new size
selection interface.
Make `strike_index' FT_ULong and always defined.
Use `load_strike_metrics' provided by SFNT interface.
2006-01-13 13:21:31 +01:00
|
|
|
size->strike_index,
|
2005-08-16 03:54:59 +02:00
|
|
|
glyph_index,
|
|
|
|
(FT_Int)load_flags,
|
|
|
|
stream,
|
|
|
|
&glyph->bitmap,
|
|
|
|
&metrics );
|
|
|
|
if ( !error )
|
|
|
|
{
|
|
|
|
glyph->outline.n_points = 0;
|
|
|
|
glyph->outline.n_contours = 0;
|
|
|
|
|
|
|
|
glyph->metrics.width = (FT_Pos)metrics.width << 6;
|
|
|
|
glyph->metrics.height = (FT_Pos)metrics.height << 6;
|
|
|
|
|
|
|
|
glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;
|
|
|
|
glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;
|
|
|
|
glyph->metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6;
|
|
|
|
|
|
|
|
glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;
|
|
|
|
glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;
|
|
|
|
glyph->metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6;
|
|
|
|
|
|
|
|
glyph->format = FT_GLYPH_FORMAT_BITMAP;
|
2009-11-03 15:46:35 +01:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
|
|
|
|
{
|
|
|
|
glyph->bitmap_left = metrics.vertBearingX;
|
|
|
|
glyph->bitmap_top = metrics.vertBearingY;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
glyph->bitmap_left = metrics.horiBearingX;
|
|
|
|
glyph->bitmap_top = metrics.horiBearingY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return error;
|
|
|
|
}
|
2005-08-19 10:56:29 +02:00
|
|
|
|
|
|
|
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
|
|
|
|
static FT_Error
|
|
|
|
tt_loader_init( TT_Loader loader,
|
|
|
|
TT_Size size,
|
|
|
|
TT_GlyphSlot glyph,
|
2009-11-03 15:46:35 +01:00
|
|
|
FT_Int32 load_flags,
|
|
|
|
FT_Bool glyf_table_only )
|
2005-08-16 03:54:59 +02:00
|
|
|
{
|
2005-08-19 10:56:29 +02:00
|
|
|
TT_Face face;
|
|
|
|
FT_Stream stream;
|
2012-06-27 08:16:06 +02:00
|
|
|
#ifdef TT_USE_BYTECODE_INTERPRETER
|
2011-02-01 07:08:43 +01:00
|
|
|
FT_Bool pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
|
2012-06-27 08:16:06 +02:00
|
|
|
#endif
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
|
2005-08-19 10:56:29 +02:00
|
|
|
face = (TT_Face)glyph->face;
|
2005-08-16 03:54:59 +02:00
|
|
|
stream = face->root.stream;
|
|
|
|
|
|
|
|
FT_MEM_ZERO( loader, sizeof ( TT_LoaderRec ) );
|
|
|
|
|
2006-08-26 00:45:13 +02:00
|
|
|
#ifdef TT_USE_BYTECODE_INTERPRETER
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
/* load execution context */
|
2009-11-03 15:46:35 +01:00
|
|
|
if ( IS_HINTED( load_flags ) && !glyf_table_only )
|
2005-08-16 03:54:59 +02:00
|
|
|
{
|
|
|
|
TT_ExecContext exec;
|
2006-11-22 11:36:55 +01:00
|
|
|
FT_Bool grayscale;
|
[truetype] Support subpixel hinting.
This is the large, famous `Infinality' patch to support ClearType
bytecode which has been available from
http://www.infinality.net/blog/ for some time, and which has been
refined over the last years. While still experimental, it is now
mature enough to be included directly into FreeType.
Most of the code is based on the ClearType whitepaper written by
Greg Hitchcock
http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
which gives a detailed overview of the necessary changes to the
Microsoft rasterizer so that older fonts are supported. However, a
lot of details are still missing, and this patches provides a
framework to easily handle rendering issues down to the glyph level
of certain fonts.
Note that ClearType support is not completely implemented! In
particular, full support for the options `compatible_widths',
`symmetrical_smoothing, and `bgr' (via the GETINFO bytecode
instruction) is missing.
* src/truetype/ttsubpix.c: New file, providing code to handle
`tweaks', this is, rules for certain glyphs in certain fonts
(including wildcards) which need a special treatment.
* src/truetype/ttsubpix.h: New file, holding the tweaking rules.
* include/freetype/config/ftoption.h, src/devel/ftoption.h
(TT_CONFIG_OPTION_SUBPIXEL_HINTING): New macro.
* include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID,
FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): New macros.
* src/truetype/truetype.c [TT_USE_BYTECODE_INTERPRETER]: Include
`ttsubpix.c'.
* src/truetype/ttgload.c: Include `ttsubpix.h'.
[All changes below are guarded by TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(tt_get_metrics): Set tweak flags.
(TT_Hint_Glyph): Call `FT_Outline_EmboldenXY' if necessary.
(TT_Process_Simple_Glyph): Compensate emboldening if necessary.
(compute_glyph_metrics): Handle `compatible widths' option.
(tt_loader_init): Handle ClearType GETINFO information bits.
* src/truetype/rules.mk (TT_DRC_SRC): Updated.
* src/truetype/ttinterp.c: Include `ttsubpix.h'.
[Where necessary, changes below are guarded by
TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(Direct_Move, Direct_Move_X): Extended.
(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45,
SetSuperRound): Add parameter to handle the number of grid lines per
pixel.
(SET_SuperRound, ROUND_None, CUR_Func_round): Updated.
(DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated.
(DO_ROUND, DO_NROUND): Updated.
(DO_RS): Take care of `Typeman' bytecode patterns.
(Ins_FDEF): Add some debugging code. Commented out.
(Ins_ENDF): Restore state.
(Ins_CALL, Ins_LOOPCALL): Handle inline delta functions.
(Ins_MD): Handle `Vacuform' rounds.
(Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP,
Ins_MDRP, Ins_MIRP): Handle tweaks.
(Ins_ALIGNRP): Add tweak guard.
(Ins_IUP, Ins_DELTAP): Handle tweaks.
(Ins_GETINFO): Handle new ClearType bits.
(TT_RunIns): Handle tweaks.
* src/truetype/ttinterp.h: Updated.
(SPH_TweakRule, SPH_ScaleRule): New structures for tweaks.
(TT_ExecContextRec): Add members for subpixel hinting support.
* src/truetype/ttobjs.h (TT_DefRecord): Add `inline_delta' member.
2012-06-18 10:36:06 +02:00
|
|
|
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
|
|
|
FT_Bool subpixel_hinting;
|
|
|
|
FT_Bool grayscale_hinting;
|
|
|
|
#if 0
|
|
|
|
FT_Bool compatible_widths;
|
|
|
|
FT_Bool symmetrical_smoothing;
|
|
|
|
FT_Bool bgr;
|
|
|
|
#endif
|
|
|
|
#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
|
2007-01-05 16:32:01 +01:00
|
|
|
if ( !size->cvt_ready )
|
|
|
|
{
|
2011-02-01 07:08:43 +01:00
|
|
|
FT_Error error = tt_size_ready_bytecode( size, pedantic );
|
2011-01-30 20:12:54 +01:00
|
|
|
|
|
|
|
|
2007-01-05 16:32:01 +01:00
|
|
|
if ( error )
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* query new execution context */
|
|
|
|
exec = size->debug ? size->context
|
|
|
|
: ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;
|
|
|
|
if ( !exec )
|
|
|
|
return TT_Err_Could_Not_Find_Context;
|
|
|
|
|
[truetype] Support subpixel hinting.
This is the large, famous `Infinality' patch to support ClearType
bytecode which has been available from
http://www.infinality.net/blog/ for some time, and which has been
refined over the last years. While still experimental, it is now
mature enough to be included directly into FreeType.
Most of the code is based on the ClearType whitepaper written by
Greg Hitchcock
http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
which gives a detailed overview of the necessary changes to the
Microsoft rasterizer so that older fonts are supported. However, a
lot of details are still missing, and this patches provides a
framework to easily handle rendering issues down to the glyph level
of certain fonts.
Note that ClearType support is not completely implemented! In
particular, full support for the options `compatible_widths',
`symmetrical_smoothing, and `bgr' (via the GETINFO bytecode
instruction) is missing.
* src/truetype/ttsubpix.c: New file, providing code to handle
`tweaks', this is, rules for certain glyphs in certain fonts
(including wildcards) which need a special treatment.
* src/truetype/ttsubpix.h: New file, holding the tweaking rules.
* include/freetype/config/ftoption.h, src/devel/ftoption.h
(TT_CONFIG_OPTION_SUBPIXEL_HINTING): New macro.
* include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID,
FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): New macros.
* src/truetype/truetype.c [TT_USE_BYTECODE_INTERPRETER]: Include
`ttsubpix.c'.
* src/truetype/ttgload.c: Include `ttsubpix.h'.
[All changes below are guarded by TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(tt_get_metrics): Set tweak flags.
(TT_Hint_Glyph): Call `FT_Outline_EmboldenXY' if necessary.
(TT_Process_Simple_Glyph): Compensate emboldening if necessary.
(compute_glyph_metrics): Handle `compatible widths' option.
(tt_loader_init): Handle ClearType GETINFO information bits.
* src/truetype/rules.mk (TT_DRC_SRC): Updated.
* src/truetype/ttinterp.c: Include `ttsubpix.h'.
[Where necessary, changes below are guarded by
TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(Direct_Move, Direct_Move_X): Extended.
(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45,
SetSuperRound): Add parameter to handle the number of grid lines per
pixel.
(SET_SuperRound, ROUND_None, CUR_Func_round): Updated.
(DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated.
(DO_ROUND, DO_NROUND): Updated.
(DO_RS): Take care of `Typeman' bytecode patterns.
(Ins_FDEF): Add some debugging code. Commented out.
(Ins_ENDF): Restore state.
(Ins_CALL, Ins_LOOPCALL): Handle inline delta functions.
(Ins_MD): Handle `Vacuform' rounds.
(Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP,
Ins_MDRP, Ins_MIRP): Handle tweaks.
(Ins_ALIGNRP): Add tweak guard.
(Ins_IUP, Ins_DELTAP): Handle tweaks.
(Ins_GETINFO): Handle new ClearType bits.
(TT_RunIns): Handle tweaks.
* src/truetype/ttinterp.h: Updated.
(SPH_TweakRule, SPH_ScaleRule): New structures for tweaks.
(TT_ExecContextRec): Add members for subpixel hinting support.
* src/truetype/ttobjs.h (TT_DefRecord): Add `inline_delta' member.
2012-06-18 10:36:06 +02:00
|
|
|
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
|
|
|
|
|
|
|
subpixel_hinting = FT_BOOL( ( FT_LOAD_TARGET_MODE( load_flags )
|
|
|
|
!= FT_RENDER_MODE_MONO ) &&
|
|
|
|
SPH_OPTION_SET_SUBPIXEL );
|
|
|
|
|
|
|
|
if ( subpixel_hinting )
|
|
|
|
grayscale = grayscale_hinting = FALSE;
|
|
|
|
|
|
|
|
else if ( SPH_OPTION_SET_GRAYSCALE )
|
|
|
|
{
|
|
|
|
grayscale = grayscale_hinting = TRUE;
|
|
|
|
subpixel_hinting = FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( FT_IS_TRICKY( glyph->face ) )
|
|
|
|
subpixel_hinting = grayscale_hinting = FALSE;
|
|
|
|
|
|
|
|
exec->ignore_x_mode = subpixel_hinting || grayscale_hinting;
|
|
|
|
exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
|
|
|
|
if ( exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )
|
|
|
|
exec->rasterizer_version = 35;
|
|
|
|
|
|
|
|
#if 1
|
|
|
|
exec->compatible_widths = SPH_OPTION_SET_COMPATIBLE_WIDTHS;
|
|
|
|
exec->symmetrical_smoothing = FALSE;
|
|
|
|
exec->bgr = FALSE;
|
|
|
|
#else /* 0 */
|
|
|
|
exec->compatible_widths =
|
|
|
|
FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
|
|
|
|
TT_LOAD_COMPATIBLE_WIDTHS );
|
|
|
|
exec->symmetrical_smoothing =
|
|
|
|
FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
|
|
|
|
TT_LOAD_SYMMETRICAL_SMOOTHING );
|
|
|
|
exec->bgr =
|
|
|
|
FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
|
|
|
|
TT_LOAD_BGR );
|
|
|
|
#endif /* 0 */
|
|
|
|
|
|
|
|
#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
|
|
|
|
2006-11-22 11:36:55 +01:00
|
|
|
grayscale =
|
|
|
|
FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != FT_RENDER_MODE_MONO );
|
|
|
|
|
[truetype] Support subpixel hinting.
This is the large, famous `Infinality' patch to support ClearType
bytecode which has been available from
http://www.infinality.net/blog/ for some time, and which has been
refined over the last years. While still experimental, it is now
mature enough to be included directly into FreeType.
Most of the code is based on the ClearType whitepaper written by
Greg Hitchcock
http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
which gives a detailed overview of the necessary changes to the
Microsoft rasterizer so that older fonts are supported. However, a
lot of details are still missing, and this patches provides a
framework to easily handle rendering issues down to the glyph level
of certain fonts.
Note that ClearType support is not completely implemented! In
particular, full support for the options `compatible_widths',
`symmetrical_smoothing, and `bgr' (via the GETINFO bytecode
instruction) is missing.
* src/truetype/ttsubpix.c: New file, providing code to handle
`tweaks', this is, rules for certain glyphs in certain fonts
(including wildcards) which need a special treatment.
* src/truetype/ttsubpix.h: New file, holding the tweaking rules.
* include/freetype/config/ftoption.h, src/devel/ftoption.h
(TT_CONFIG_OPTION_SUBPIXEL_HINTING): New macro.
* include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID,
FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): New macros.
* src/truetype/truetype.c [TT_USE_BYTECODE_INTERPRETER]: Include
`ttsubpix.c'.
* src/truetype/ttgload.c: Include `ttsubpix.h'.
[All changes below are guarded by TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(tt_get_metrics): Set tweak flags.
(TT_Hint_Glyph): Call `FT_Outline_EmboldenXY' if necessary.
(TT_Process_Simple_Glyph): Compensate emboldening if necessary.
(compute_glyph_metrics): Handle `compatible widths' option.
(tt_loader_init): Handle ClearType GETINFO information bits.
* src/truetype/rules.mk (TT_DRC_SRC): Updated.
* src/truetype/ttinterp.c: Include `ttsubpix.h'.
[Where necessary, changes below are guarded by
TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(Direct_Move, Direct_Move_X): Extended.
(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45,
SetSuperRound): Add parameter to handle the number of grid lines per
pixel.
(SET_SuperRound, ROUND_None, CUR_Func_round): Updated.
(DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated.
(DO_ROUND, DO_NROUND): Updated.
(DO_RS): Take care of `Typeman' bytecode patterns.
(Ins_FDEF): Add some debugging code. Commented out.
(Ins_ENDF): Restore state.
(Ins_CALL, Ins_LOOPCALL): Handle inline delta functions.
(Ins_MD): Handle `Vacuform' rounds.
(Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP,
Ins_MDRP, Ins_MIRP): Handle tweaks.
(Ins_ALIGNRP): Add tweak guard.
(Ins_IUP, Ins_DELTAP): Handle tweaks.
(Ins_GETINFO): Handle new ClearType bits.
(TT_RunIns): Handle tweaks.
* src/truetype/ttinterp.h: Updated.
(SPH_TweakRule, SPH_ScaleRule): New structures for tweaks.
(TT_ExecContextRec): Add members for subpixel hinting support.
* src/truetype/ttobjs.h (TT_DefRecord): Add `inline_delta' member.
2012-06-18 10:36:06 +02:00
|
|
|
#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
TT_Load_Context( exec, face, size );
|
|
|
|
|
[truetype] Support subpixel hinting.
This is the large, famous `Infinality' patch to support ClearType
bytecode which has been available from
http://www.infinality.net/blog/ for some time, and which has been
refined over the last years. While still experimental, it is now
mature enough to be included directly into FreeType.
Most of the code is based on the ClearType whitepaper written by
Greg Hitchcock
http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
which gives a detailed overview of the necessary changes to the
Microsoft rasterizer so that older fonts are supported. However, a
lot of details are still missing, and this patches provides a
framework to easily handle rendering issues down to the glyph level
of certain fonts.
Note that ClearType support is not completely implemented! In
particular, full support for the options `compatible_widths',
`symmetrical_smoothing, and `bgr' (via the GETINFO bytecode
instruction) is missing.
* src/truetype/ttsubpix.c: New file, providing code to handle
`tweaks', this is, rules for certain glyphs in certain fonts
(including wildcards) which need a special treatment.
* src/truetype/ttsubpix.h: New file, holding the tweaking rules.
* include/freetype/config/ftoption.h, src/devel/ftoption.h
(TT_CONFIG_OPTION_SUBPIXEL_HINTING): New macro.
* include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID,
FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): New macros.
* src/truetype/truetype.c [TT_USE_BYTECODE_INTERPRETER]: Include
`ttsubpix.c'.
* src/truetype/ttgload.c: Include `ttsubpix.h'.
[All changes below are guarded by TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(tt_get_metrics): Set tweak flags.
(TT_Hint_Glyph): Call `FT_Outline_EmboldenXY' if necessary.
(TT_Process_Simple_Glyph): Compensate emboldening if necessary.
(compute_glyph_metrics): Handle `compatible widths' option.
(tt_loader_init): Handle ClearType GETINFO information bits.
* src/truetype/rules.mk (TT_DRC_SRC): Updated.
* src/truetype/ttinterp.c: Include `ttsubpix.h'.
[Where necessary, changes below are guarded by
TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(Direct_Move, Direct_Move_X): Extended.
(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45,
SetSuperRound): Add parameter to handle the number of grid lines per
pixel.
(SET_SuperRound, ROUND_None, CUR_Func_round): Updated.
(DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated.
(DO_ROUND, DO_NROUND): Updated.
(DO_RS): Take care of `Typeman' bytecode patterns.
(Ins_FDEF): Add some debugging code. Commented out.
(Ins_ENDF): Restore state.
(Ins_CALL, Ins_LOOPCALL): Handle inline delta functions.
(Ins_MD): Handle `Vacuform' rounds.
(Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP,
Ins_MDRP, Ins_MIRP): Handle tweaks.
(Ins_ALIGNRP): Add tweak guard.
(Ins_IUP, Ins_DELTAP): Handle tweaks.
(Ins_GETINFO): Handle new ClearType bits.
(TT_RunIns): Handle tweaks.
* src/truetype/ttinterp.h: Updated.
(SPH_TweakRule, SPH_ScaleRule): New structures for tweaks.
(TT_ExecContextRec): Add members for subpixel hinting support.
* src/truetype/ttobjs.h (TT_DefRecord): Add `inline_delta' member.
2012-06-18 10:36:06 +02:00
|
|
|
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
|
|
|
|
|
|
|
/* a change from mono to subpixel rendering (and vice versa) */
|
|
|
|
/* requires a re-execution of the CVT program */
|
|
|
|
if ( subpixel_hinting != exec->subpixel_hinting )
|
|
|
|
{
|
|
|
|
FT_UInt i;
|
|
|
|
|
|
|
|
|
|
|
|
exec->subpixel_hinting = subpixel_hinting;
|
|
|
|
|
|
|
|
for ( i = 0; i < size->cvt_size; i++ )
|
|
|
|
size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
|
|
|
|
tt_size_run_prep( size, pedantic );
|
|
|
|
}
|
|
|
|
|
|
|
|
/* a change from mono to grayscale rendering (and vice versa) */
|
|
|
|
/* requires a re-execution of the CVT program */
|
|
|
|
if ( grayscale != exec->grayscale_hinting )
|
|
|
|
{
|
|
|
|
FT_UInt i;
|
|
|
|
|
|
|
|
|
|
|
|
exec->grayscale_hinting = grayscale_hinting;
|
|
|
|
|
|
|
|
for ( i = 0; i < size->cvt_size; i++ )
|
|
|
|
size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
|
|
|
|
tt_size_run_prep( size, pedantic );
|
|
|
|
}
|
|
|
|
|
|
|
|
#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
|
|
|
|
2006-11-22 11:36:55 +01:00
|
|
|
/* a change from mono to grayscale rendering (and vice versa) */
|
|
|
|
/* requires a re-execution of the CVT program */
|
|
|
|
if ( grayscale != exec->grayscale )
|
|
|
|
{
|
|
|
|
FT_UInt i;
|
|
|
|
|
|
|
|
|
2010-09-14 09:02:10 +02:00
|
|
|
FT_TRACE4(( "tt_loader_init: grayscale change,"
|
|
|
|
" re-executing `prep' table\n" ));
|
|
|
|
|
2006-11-22 11:36:55 +01:00
|
|
|
exec->grayscale = grayscale;
|
|
|
|
|
|
|
|
for ( i = 0; i < size->cvt_size; i++ )
|
|
|
|
size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
|
2011-02-01 07:08:43 +01:00
|
|
|
tt_size_run_prep( size, pedantic );
|
2006-11-22 11:36:55 +01:00
|
|
|
}
|
|
|
|
|
[truetype] Support subpixel hinting.
This is the large, famous `Infinality' patch to support ClearType
bytecode which has been available from
http://www.infinality.net/blog/ for some time, and which has been
refined over the last years. While still experimental, it is now
mature enough to be included directly into FreeType.
Most of the code is based on the ClearType whitepaper written by
Greg Hitchcock
http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
which gives a detailed overview of the necessary changes to the
Microsoft rasterizer so that older fonts are supported. However, a
lot of details are still missing, and this patches provides a
framework to easily handle rendering issues down to the glyph level
of certain fonts.
Note that ClearType support is not completely implemented! In
particular, full support for the options `compatible_widths',
`symmetrical_smoothing, and `bgr' (via the GETINFO bytecode
instruction) is missing.
* src/truetype/ttsubpix.c: New file, providing code to handle
`tweaks', this is, rules for certain glyphs in certain fonts
(including wildcards) which need a special treatment.
* src/truetype/ttsubpix.h: New file, holding the tweaking rules.
* include/freetype/config/ftoption.h, src/devel/ftoption.h
(TT_CONFIG_OPTION_SUBPIXEL_HINTING): New macro.
* include/freetype/internal/ftobjs.h (FT_PIX_FLOOR_GRID,
FT_PIX_ROUND_GRID, FT_PIX_CEIL_GRID): New macros.
* src/truetype/truetype.c [TT_USE_BYTECODE_INTERPRETER]: Include
`ttsubpix.c'.
* src/truetype/ttgload.c: Include `ttsubpix.h'.
[All changes below are guarded by TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(tt_get_metrics): Set tweak flags.
(TT_Hint_Glyph): Call `FT_Outline_EmboldenXY' if necessary.
(TT_Process_Simple_Glyph): Compensate emboldening if necessary.
(compute_glyph_metrics): Handle `compatible widths' option.
(tt_loader_init): Handle ClearType GETINFO information bits.
* src/truetype/rules.mk (TT_DRC_SRC): Updated.
* src/truetype/ttinterp.c: Include `ttsubpix.h'.
[Where necessary, changes below are guarded by
TT_CONFIG_OPTION_SUBPIXEL_HINTING.]
(Direct_Move, Direct_Move_X): Extended.
(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, Round_Super_45,
SetSuperRound): Add parameter to handle the number of grid lines per
pixel.
(SET_SuperRound, ROUND_None, CUR_Func_round): Updated.
(DO_SROUND, DOS45ROUND, DO_ODD, DO_EVEN): Updated.
(DO_ROUND, DO_NROUND): Updated.
(DO_RS): Take care of `Typeman' bytecode patterns.
(Ins_FDEF): Add some debugging code. Commented out.
(Ins_ENDF): Restore state.
(Ins_CALL, Ins_LOOPCALL): Handle inline delta functions.
(Ins_MD): Handle `Vacuform' rounds.
(Move_Zp2_Point, Ins_SHPIX, Ins_MSIRP, Ins_MDAP, Ins_MIAP,
Ins_MDRP, Ins_MIRP): Handle tweaks.
(Ins_ALIGNRP): Add tweak guard.
(Ins_IUP, Ins_DELTAP): Handle tweaks.
(Ins_GETINFO): Handle new ClearType bits.
(TT_RunIns): Handle tweaks.
* src/truetype/ttinterp.h: Updated.
(SPH_TweakRule, SPH_ScaleRule): New structures for tweaks.
(TT_ExecContextRec): Add members for subpixel hinting support.
* src/truetype/ttobjs.h (TT_DefRecord): Add `inline_delta' member.
2012-06-18 10:36:06 +02:00
|
|
|
#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
|
|
|
|
2007-05-19 09:01:49 +02:00
|
|
|
/* see whether the cvt program has disabled hinting */
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( exec->GS.instruct_control & 1 )
|
|
|
|
load_flags |= FT_LOAD_NO_HINTING;
|
|
|
|
|
2007-05-19 09:01:49 +02:00
|
|
|
/* load default graphics state -- if needed */
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( exec->GS.instruct_control & 2 )
|
|
|
|
exec->GS = tt_default_graphics_state;
|
|
|
|
|
|
|
|
exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
|
|
|
|
loader->exec = exec;
|
|
|
|
loader->instructions = exec->glyphIns;
|
|
|
|
}
|
|
|
|
|
2006-08-26 00:45:13 +02:00
|
|
|
#endif /* TT_USE_BYTECODE_INTERPRETER */
|
2005-08-16 03:54:59 +02:00
|
|
|
|
2007-05-19 09:01:49 +02:00
|
|
|
/* seek to the beginning of the glyph table -- for Type 42 fonts */
|
2005-08-16 03:54:59 +02:00
|
|
|
/* the table might be accessed from a Postscript stream or something */
|
|
|
|
/* else... */
|
|
|
|
|
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
|
|
|
|
|
|
|
if ( face->root.internal->incremental_interface )
|
|
|
|
loader->glyf_offset = 0;
|
|
|
|
else
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
{
|
|
|
|
FT_Error error = face->goto_table( face, TTAG_glyf, stream, 0 );
|
2005-08-19 10:56:29 +02:00
|
|
|
|
|
|
|
|
2008-12-09 07:51:56 +01:00
|
|
|
if ( error == TT_Err_Table_Missing )
|
|
|
|
loader->glyf_offset = 0;
|
|
|
|
else if ( error )
|
2005-08-16 03:54:59 +02:00
|
|
|
{
|
2009-06-26 06:15:41 +02:00
|
|
|
FT_ERROR(( "tt_loader_init: could not access glyph table\n" ));
|
2005-08-16 03:54:59 +02:00
|
|
|
return error;
|
|
|
|
}
|
2008-12-09 07:51:56 +01:00
|
|
|
else
|
|
|
|
loader->glyf_offset = FT_STREAM_POS();
|
2005-08-16 03:54:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* get face's glyph loader */
|
2009-11-03 15:46:35 +01:00
|
|
|
if ( !glyf_table_only )
|
2005-08-16 03:54:59 +02:00
|
|
|
{
|
|
|
|
FT_GlyphLoader gloader = glyph->internal->loader;
|
|
|
|
|
2005-08-19 10:56:29 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
FT_GlyphLoader_Rewind( gloader );
|
|
|
|
loader->gloader = gloader;
|
|
|
|
}
|
|
|
|
|
2008-12-09 07:51:56 +01:00
|
|
|
loader->load_flags = load_flags;
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
loader->face = (FT_Face)face;
|
|
|
|
loader->size = (FT_Size)size;
|
|
|
|
loader->glyph = (FT_GlyphSlot)glyph;
|
|
|
|
loader->stream = stream;
|
|
|
|
|
|
|
|
return TT_Err_Ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
|
|
|
/* TT_Load_Glyph */
|
|
|
|
/* */
|
|
|
|
/* <Description> */
|
|
|
|
/* A function used to load a single glyph within a given glyph slot, */
|
|
|
|
/* for a given size. */
|
|
|
|
/* */
|
|
|
|
/* <Input> */
|
|
|
|
/* glyph :: A handle to a target slot object where the glyph */
|
|
|
|
/* will be loaded. */
|
|
|
|
/* */
|
|
|
|
/* size :: A handle to the source face size at which the glyph */
|
|
|
|
/* must be scaled/loaded. */
|
|
|
|
/* */
|
|
|
|
/* glyph_index :: The index of the glyph in the font file. */
|
|
|
|
/* */
|
|
|
|
/* load_flags :: A flag indicating what to load for this glyph. The */
|
|
|
|
/* FT_LOAD_XXX constants can be used to control the */
|
|
|
|
/* glyph loading process (e.g., whether the outline */
|
|
|
|
/* should be scaled, whether to load bitmaps or not, */
|
|
|
|
/* whether to hint the outline, etc). */
|
|
|
|
/* */
|
|
|
|
/* <Return> */
|
2000-06-25 08:47:11 +02:00
|
|
|
/* FreeType error code. 0 means success. */
|
2000-06-12 21:36:41 +02:00
|
|
|
/* */
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_LOCAL_DEF( FT_Error )
|
2001-06-28 09:17:51 +02:00
|
|
|
TT_Load_Glyph( TT_Size size,
|
|
|
|
TT_GlyphSlot glyph,
|
2004-04-19 08:13:50 +02:00
|
|
|
FT_UInt glyph_index,
|
2002-09-21 20:43:10 +02:00
|
|
|
FT_Int32 load_flags )
|
2000-02-02 13:16:19 +01:00
|
|
|
{
|
2002-04-01 16:25:28 +02:00
|
|
|
FT_Error error;
|
|
|
|
TT_LoaderRec loader;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2012-04-07 06:39:25 +02:00
|
|
|
error = TT_Err_Ok;
|
2000-03-28 13:19:28 +02:00
|
|
|
|
2000-02-02 13:16:19 +01:00
|
|
|
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
|
2000-11-07 07:30:29 +01:00
|
|
|
|
|
|
|
/* try to load embedded bitmap if any */
|
|
|
|
/* */
|
|
|
|
/* XXX: The convention should be emphasized in */
|
|
|
|
/* the documents because it can be confusing. */
|
2006-01-13 15:53:28 +01:00
|
|
|
if ( size->strike_index != 0xFFFFFFFFUL &&
|
2000-11-07 00:07:51 +01:00
|
|
|
( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
|
2000-02-02 13:16:19 +01:00
|
|
|
{
|
2005-08-16 03:54:59 +02:00
|
|
|
error = load_sbit_image( size, glyph, glyph_index, load_flags );
|
2000-02-02 13:16:19 +01:00
|
|
|
if ( !error )
|
2009-11-03 15:46:35 +01:00
|
|
|
{
|
2012-04-07 06:39:25 +02:00
|
|
|
if ( FT_IS_SCALABLE( glyph->face ) )
|
2009-11-03 15:46:35 +01:00
|
|
|
{
|
|
|
|
/* for the bbox we need the header only */
|
|
|
|
(void)tt_loader_init( &loader, size, glyph, load_flags, TRUE );
|
|
|
|
(void)load_truetype_glyph( &loader, glyph_index, 0, TRUE );
|
|
|
|
glyph->linearHoriAdvance = loader.linear;
|
|
|
|
glyph->linearVertAdvance = loader.top_bearing + loader.bbox.yMax -
|
|
|
|
loader.vadvance;
|
|
|
|
}
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
return TT_Err_Ok;
|
2009-11-03 15:46:35 +01:00
|
|
|
}
|
2000-02-02 13:16:19 +01:00
|
|
|
}
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2000-02-02 13:16:19 +01:00
|
|
|
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
|
|
|
|
|
2005-10-21 11:08:28 +02:00
|
|
|
/* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */
|
2005-10-19 10:07:38 +02:00
|
|
|
if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid )
|
2005-08-20 10:17:44 +02:00
|
|
|
return TT_Err_Invalid_Size_Handle;
|
|
|
|
|
2001-12-19 22:09:16 +01:00
|
|
|
if ( load_flags & FT_LOAD_SBITS_ONLY )
|
* src/winfonts/winfnt.c (FNT_Load_Glyph): Use first_char in
computation of glyph_index.
(FNT_Size_Set_Pixels): To find a strike, first check pixel_height
only, then try to find a better hit by comparing pixel_width also.
Without this fix it isn't possible to access all strikes.
Also compute metrics.max_advance to be in sync with other bitmap
drivers.
* src/base/ftobjs.c (FT_Set_Char_Size): Remove redundant code.
(FT_Set_Pixel_Size): Assign value to `metrics' after validation of
arguments.
Synchronize computation of height and width for bitmap strikes. The
`width' field in the FT_Bitmap_Size structure is now only useful to
enumerate different strikes. The `max_advance' field of the
FT_Size_Metrics structure should be used to get the (maximum) width
of a strike.
* src/bdf/bdfdrivr.c (BDF_Face_Init): Don't use AVERAGE_WIDTH for
computing `available_sizes->width' but make it always equal to
`available_sizes->height'.
* src/pcf/pcfread.c (pcf_load_font): Don't use RESOLUTION_X for
computing `available_sizes->width' but make it always equal to
`available_sizes->height'.
* src/truetype/ttdriver.c (Set_Pixel_Sizes): Pass only single
argument to function.
* src/psnames/psmodule.c (ps_unicode_value): Handle `.' after
`uniXXXX' and `uXXXX[X[X]]'.
* src/bdf/bdfdrivr.c: s/FT_Err_/BDF_Err/.
* src/cache/ftccache.c, src/cache/ftcsbits.c, src/cache/ftlru.c:
s/FT_Err_/FTC_Err_/.
* src/cff/cffcmap.c: s/FT_Err_/CFF_Err_/.
* src/pcf/pcfdrivr.c: s/FT_Err_/PCF_Err_/.
* src/psaux/t1cmap.c: Include psauxerr.h.
s/FT_Err_/PSaux_Err_/.
* src/pshinter/pshnterr.h: New file.
* src/pshinter/rules.mk: Updated.
* src/pshinter/pshalgo.c, src/pshinter/pshrec.c: Include pshnterr.h.
s/FT_Err_/PSH_Err_/.
* src/pfr/pfrdrivr.c, src/pfr/pfrobjs.c, src/pfr/pfrsbit.c:
s/FT_Err_/PFR_Err_/.
* src/sfnt/sfdriver.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap0.c,
src/sfnt/ttload.c: s/FT_Err_/SFNT_Err_/.
* src/truetype/ttgload.c: s/FT_Err_/TT_Err_/.
* src/gzip/ftgzip.c: Load FT_MODULE_ERRORS_H and define
FT_ERR_PREFIX and FT_ERR_BASE.
s/FT_Err_/Gzip_Err_/.
2003-06-22 17:33:53 +02:00
|
|
|
return TT_Err_Invalid_Argument;
|
2001-12-19 22:09:16 +01:00
|
|
|
|
2009-11-03 15:46:35 +01:00
|
|
|
error = tt_loader_init( &loader, size, glyph, load_flags, FALSE );
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( error )
|
|
|
|
return error;
|
2000-02-02 13:16:19 +01: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
|
|
|
glyph->format = FT_GLYPH_FORMAT_OUTLINE;
|
2000-06-12 21:36:41 +02:00
|
|
|
glyph->num_subglyphs = 0;
|
2005-08-16 03:54:59 +02:00
|
|
|
glyph->outline.flags = 0;
|
2002-04-01 16:25:28 +02:00
|
|
|
|
2007-05-19 09:01:49 +02:00
|
|
|
/* main loading loop */
|
2009-11-03 15:46:35 +01:00
|
|
|
error = load_truetype_glyph( &loader, glyph_index, 0, FALSE );
|
2000-06-12 21:36:41 +02:00
|
|
|
if ( !error )
|
2005-08-16 03:54:59 +02:00
|
|
|
{
|
|
|
|
if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE )
|
|
|
|
{
|
|
|
|
glyph->num_subglyphs = loader.gloader->base.num_subglyphs;
|
|
|
|
glyph->subglyphs = loader.gloader->base.subglyphs;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2005-08-19 10:56:29 +02:00
|
|
|
glyph->outline = loader.gloader->base.outline;
|
2005-08-16 03:54:59 +02:00
|
|
|
glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS;
|
2000-06-25 09:43:15 +02:00
|
|
|
|
2010-04-05 08:22:22 +02:00
|
|
|
/* Translate array so that (0,0) is the glyph's origin. Note */
|
|
|
|
/* that this behaviour is independent on the value of bit 1 of */
|
|
|
|
/* the `flags' field in the `head' table -- at least major */
|
|
|
|
/* applications like Acroread indicate that. */
|
|
|
|
if ( loader.pp1.x )
|
2005-08-16 03:54:59 +02:00
|
|
|
FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 );
|
|
|
|
}
|
2000-06-25 09:43:15 +02:00
|
|
|
|
2008-06-22 15:40:08 +02:00
|
|
|
#ifdef TT_USE_BYTECODE_INTERPRETER
|
|
|
|
|
2008-06-23 00:41:24 +02:00
|
|
|
if ( IS_HINTED( load_flags ) )
|
2008-06-22 15:40:08 +02:00
|
|
|
{
|
2008-06-23 00:41:24 +02:00
|
|
|
if ( loader.exec->GS.scan_control )
|
2008-06-22 15:40:08 +02:00
|
|
|
{
|
2008-06-23 00:41:24 +02:00
|
|
|
/* convert scan conversion mode to FT_OUTLINE_XXX flags */
|
|
|
|
switch ( loader.exec->GS.scan_type )
|
|
|
|
{
|
|
|
|
case 0: /* simple drop-outs including stubs */
|
|
|
|
glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS;
|
|
|
|
break;
|
|
|
|
case 1: /* simple drop-outs excluding stubs */
|
|
|
|
/* nothing; it's the default rendering mode */
|
|
|
|
break;
|
|
|
|
case 4: /* smart drop-outs including stubs */
|
|
|
|
glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS |
|
|
|
|
FT_OUTLINE_INCLUDE_STUBS;
|
|
|
|
break;
|
|
|
|
case 5: /* smart drop-outs excluding stubs */
|
|
|
|
glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default: /* no drop-out control */
|
|
|
|
glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;
|
|
|
|
break;
|
|
|
|
}
|
2008-06-22 15:40:08 +02:00
|
|
|
}
|
2009-09-02 13:06:33 +02:00
|
|
|
else
|
2008-06-23 00:41:24 +02:00
|
|
|
glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;
|
2008-06-22 15:40:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* TT_USE_BYTECODE_INTERPRETER */
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
compute_glyph_metrics( &loader, glyph_index );
|
|
|
|
}
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2002-05-05 09:40:16 +02:00
|
|
|
/* Set the `high precision' bit flag. */
|
|
|
|
/* This is _critical_ to get correct output for monochrome */
|
|
|
|
/* TrueType glyphs at all sizes using the bytecode interpreter. */
|
|
|
|
/* */
|
2005-10-21 11:08:28 +02:00
|
|
|
if ( !( load_flags & FT_LOAD_NO_SCALE ) &&
|
|
|
|
size->root.metrics.y_ppem < 24 )
|
* 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
|
|
|
glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
|
* src/truetype/ttgload.c (TT_Load_Glyph): finally fixing the last
bug that prevented FreeType 2.x and FreeType 1.x to produce
bit-by-bit identical monochrome glyph bitmaps with native TrueType
hinting. The culprit was a single-bit flag that wasn't set
correctly by the TrueType glyph loader !!
* src/otlayout/otlayout.h,
src/otlayout/otlbase.c,
src/otlayout/otlbase.h,
src/otlayout/otlconf.h,
src/otlayout/otlgdef.c,
src/otlayout/otlgdef.h,
src/otlayout/otlgpos.c,
src/otlayout/otlgpos.h,
src/otlayout/otlgsub.c,
src/otlayout/otlgsub.h,
src/otlayout/otljstf.c,
src/otlayout/otljstf.h,
src/otlayout/otltable.c,
src/otlayout/otltable.h,
src/otlayout/otltags.h:
adding OpenType Layout source files. Module is still incomplete
2002-05-04 20:02:59 +02:00
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* END */
|