1999-12-17 00:11:37 +01:00
|
|
|
/***************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* ttgload.c */
|
|
|
|
/* */
|
|
|
|
/* TrueType Glyph Loader (body). */
|
|
|
|
/* */
|
2007-01-06 08:47:45 +01:00
|
|
|
/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */
|
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"
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* Composite font flags. */
|
|
|
|
/* */
|
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
|
|
|
/* */
|
2000-06-25 09:43:15 +02:00
|
|
|
/* Returns the horizontal metrics in font units for a given glyph. If */
|
|
|
|
/* `check' is true, take care of monospaced fonts by returning the */
|
|
|
|
/* advance width maximum. */
|
1999-12-17 00:11:37 +01:00
|
|
|
/* */
|
2001-06-28 09:17:51 +02:00
|
|
|
static void
|
|
|
|
Get_HMetrics( TT_Face face,
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
FT_UInt idx,
|
2001-06-28 09:17:51 +02:00
|
|
|
FT_Bool check,
|
|
|
|
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
|
|
|
|
|
|
|
if ( check && face->postscript.isFixedPitch )
|
|
|
|
*aw = face->horizontal.advance_Width_Max;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-03-27 09:43:17 +01:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* Returns the vertical metrics in font units for a given glyph. */
|
|
|
|
/* 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. */
|
|
|
|
/* */
|
|
|
|
/* The monospace `check' is probably not meaningful here, but we leave */
|
|
|
|
/* it in for a consistent interface. */
|
|
|
|
/* */
|
|
|
|
static void
|
|
|
|
Get_VMetrics( TT_Face face,
|
|
|
|
FT_UInt idx,
|
|
|
|
FT_Bool check,
|
|
|
|
FT_Short* tsb,
|
|
|
|
FT_UShort* ah )
|
|
|
|
{
|
|
|
|
FT_UNUSED( check );
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
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
|
|
|
|
2000-07-31 20:59:02 +02:00
|
|
|
FT_TRACE5(( "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;
|
|
|
|
FT_Int n, 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;
|
|
|
|
FT_Short *cont, *cont_limit;
|
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 */
|
2006-05-18 00:55:04 +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
|
|
|
|
2003-06-09 17:54:18 +02:00
|
|
|
for ( ; cont < cont_limit; cont++ )
|
2006-05-18 00:55:04 +02:00
|
|
|
cont[0] = FT_NEXT_USHORT( p );
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2003-06-09 17:54:18 +02:00
|
|
|
n_points = 0;
|
|
|
|
if ( n_contours > 0 )
|
|
|
|
n_points = cont[-1] + 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
|
|
|
|
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
|
|
|
|
2003-06-09 17:54:18 +02:00
|
|
|
/* we'd better check the contours table right now */
|
|
|
|
outline = &gloader->current.outline;
|
2002-01-06 11:13:40 +01:00
|
|
|
|
2003-06-09 17:54:18 +02:00
|
|
|
for ( cont = outline->contours + 1; cont < cont_limit; cont++ )
|
|
|
|
if ( cont[-1] >= cont[0] )
|
|
|
|
goto Invalid_Outline;
|
1999-12-17 00:11:37 +01: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 )
|
|
|
|
{
|
2002-04-01 16:25:28 +02:00
|
|
|
FT_TRACE0(( "TT_Load_Simple_Glyph: Too many instructions!\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-05-18 00:55:04 +02:00
|
|
|
if ( ( limit - p ) < n_ins )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2002-04-01 16:25:28 +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
|
|
|
|
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;
|
|
|
|
|
|
|
|
for ( ; vec < vec_limit; vec++, flag++ )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2003-06-09 17:54:18 +02:00
|
|
|
FT_Pos y = 0;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2003-06-09 17:54:18 +02:00
|
|
|
if ( *flag & 2 )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2006-05-18 00:55:04 +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 );
|
2003-06-09 17:54:18 +02:00
|
|
|
if ( ( *flag & 16 ) == 0 )
|
|
|
|
y = -y;
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
2003-06-09 17:54:18 +02:00
|
|
|
else if ( ( *flag & 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
|
|
|
{
|
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
|
|
|
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;
|
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
|
|
|
{
|
2003-06-09 17:54:18 +02:00
|
|
|
FT_Pos y = 0;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2003-06-09 17:54:18 +02:00
|
|
|
if ( *flag & 4 )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2006-05-18 00:55:04 +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 );
|
2003-06-09 17:54:18 +02:00
|
|
|
if ( ( *flag & 32 ) == 0 )
|
|
|
|
y = -y;
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
2003-06-09 17:54:18 +02:00
|
|
|
else if ( ( *flag & 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
|
|
|
{
|
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
|
|
|
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;
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
|
2000-06-23 07:02:13 +02:00
|
|
|
/* clear the touch tags */
|
|
|
|
for ( n = 0; n < n_points; n++ )
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
outline->tags[n] &= FT_CURVE_TAG_ON;
|
2000-06-23 07:02:13 +02: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;
|
|
|
|
|
|
|
|
|
2002-03-20 11:49:31 +01:00
|
|
|
/* we must undo the FT_FRAME_ENTER in order to point to the */
|
2000-06-23 14:26:14 +02:00
|
|
|
/* 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 )
|
|
|
|
{
|
|
|
|
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;
|
2006-08-16 18:50:55 +02:00
|
|
|
zone->orus = load->extra_points2 + start_point;
|
2005-08-16 03:54:59 +02:00
|
|
|
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
|
2005-08-16 03:54:59 +02:00
|
|
|
n_ins = loader->glyph->control_len;
|
|
|
|
#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 );
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
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
|
|
|
|
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-05-15 08:49:37 +02:00
|
|
|
FT_UInt n_points;
|
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-05-15 08:49:37 +02:00
|
|
|
FT_UInt 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 );
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
|
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(
|
|
|
|
FT_MulFix( subglyph->transform.xx,
|
|
|
|
subglyph->transform.xx ) +
|
|
|
|
FT_MulFix( subglyph->transform.xy,
|
2005-09-28 09:34:45 +02:00
|
|
|
subglyph->transform.xy ) );
|
2005-08-16 03:54:59 +02:00
|
|
|
FT_Fixed mac_yscale = FT_SqrtFixed(
|
|
|
|
FT_MulFix( subglyph->transform.yy,
|
|
|
|
subglyph->transform.yy ) +
|
|
|
|
FT_MulFix( subglyph->transform.yx,
|
|
|
|
subglyph->transform.yx ) );
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
FT_UShort n_ins;
|
|
|
|
|
|
|
|
|
|
|
|
/* 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 */
|
|
|
|
if ( n_ins > ((TT_Face)loader->face)->max_profile.maxSizeOfInstructions )
|
|
|
|
{
|
|
|
|
FT_TRACE0(( "Too many instructions (%d)\n", n_ins ));
|
|
|
|
|
|
|
|
return TT_Err_Too_Many_Hints;
|
|
|
|
}
|
|
|
|
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++ )
|
|
|
|
loader->zone.tags[i] &= ~( FT_CURVE_TAG_TOUCH_X |
|
|
|
|
FT_CURVE_TAG_TOUCH_Y );
|
|
|
|
|
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,
|
|
|
|
FT_UInt recurse_count )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2002-04-01 16:25:28 +02:00
|
|
|
FT_Error error;
|
|
|
|
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
|
|
|
|
2005-08-31 22:40:00 +02:00
|
|
|
if ( 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
|
|
|
|
2004-03-27 09:43:17 +01:00
|
|
|
/* get metrics, horizontal and vertical */
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2004-03-27 09:43:17 +01:00
|
|
|
FT_Short left_bearing = 0, top_bearing = 0;
|
|
|
|
FT_UShort advance_width = 0, advance_height = 0;
|
|
|
|
|
2002-07-18 17:59:23 +02:00
|
|
|
|
2003-02-13 18:49:27 +01:00
|
|
|
Get_HMetrics( face, glyph_index,
|
|
|
|
(FT_Bool)!( loader->load_flags &
|
|
|
|
FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ),
|
|
|
|
&left_bearing,
|
|
|
|
&advance_width );
|
2004-03-27 09:43:17 +01:00
|
|
|
Get_VMetrics( face, glyph_index,
|
|
|
|
(FT_Bool)!( loader->load_flags &
|
|
|
|
FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ),
|
|
|
|
&top_bearing,
|
|
|
|
&advance_height );
|
2002-07-26 11:09:10 +02:00
|
|
|
|
2003-02-13 18:49:27 +01:00
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
2002-07-18 17:59:23 +02:00
|
|
|
|
2002-07-26 11:09:10 +02:00
|
|
|
/* If this is an incrementally loaded font see if there are */
|
|
|
|
/* overriding metrics for this glyph. */
|
2002-08-01 17:29:17 +02:00
|
|
|
if ( face->root.internal->incremental_interface &&
|
|
|
|
face->root.internal->incremental_interface->funcs->get_glyph_metrics )
|
2002-07-18 17:59:23 +02:00
|
|
|
{
|
2003-02-13 18:49:27 +01:00
|
|
|
FT_Incremental_MetricsRec metrics;
|
2002-07-26 11:09:10 +02:00
|
|
|
|
2003-04-23 17:50:27 +02:00
|
|
|
|
|
|
|
metrics.bearing_x = left_bearing;
|
|
|
|
metrics.bearing_y = 0;
|
|
|
|
metrics.advance = advance_width;
|
2002-08-01 17:29:17 +02:00
|
|
|
error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
|
|
|
|
face->root.internal->incremental_interface->object,
|
2003-02-13 18:49:27 +01:00
|
|
|
glyph_index, FALSE, &metrics );
|
2002-07-26 11:09:10 +02:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
2003-02-13 18:49:27 +01:00
|
|
|
left_bearing = (FT_Short)metrics.bearing_x;
|
|
|
|
advance_width = (FT_UShort)metrics.advance;
|
2005-08-19 10:56:29 +02:00
|
|
|
|
2005-09-28 09:34:45 +02:00
|
|
|
#if 0
|
2004-03-27 09:43:17 +01:00
|
|
|
|
2005-09-28 09:34:45 +02:00
|
|
|
/* GWW: Do I do the same for vertical metrics? */
|
2004-03-27 09:43:17 +01:00
|
|
|
metrics.bearing_x = 0;
|
|
|
|
metrics.bearing_y = top_bearing;
|
|
|
|
metrics.advance = advance_height;
|
|
|
|
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;
|
2005-08-16 03:54:59 +02:00
|
|
|
|
2005-09-28 09:34:45 +02:00
|
|
|
#endif /* 0 */
|
2004-03-27 09:43:17 +01:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
}
|
|
|
|
|
2002-07-26 11:09:10 +02:00
|
|
|
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
|
2002-07-18 17:59:23 +02:00
|
|
|
|
2000-02-02 13:16:19 +01:00
|
|
|
loader->left_bearing = left_bearing;
|
|
|
|
loader->advance = advance_width;
|
2004-03-27 09:43:17 +01:00
|
|
|
loader->top_bearing = top_bearing;
|
|
|
|
loader->vadvance = advance_height;
|
2001-06-08 15:29:36 +02:00
|
|
|
|
|
|
|
if ( !loader->linear_def )
|
|
|
|
{
|
|
|
|
loader->linear_def = 1;
|
|
|
|
loader->linear = advance_width;
|
|
|
|
}
|
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
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( loader->byte_len == 0 )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2005-08-16 03:54:59 +02:00
|
|
|
/* as described by Frederic Loyer, these are spaces or */
|
|
|
|
/* the unknown glyph. */
|
2000-02-02 13:16:19 +01:00
|
|
|
loader->bbox.xMin = 0;
|
|
|
|
loader->bbox.xMax = 0;
|
|
|
|
loader->bbox.yMin = 0;
|
|
|
|
loader->bbox.yMax = 0;
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
TT_LOADER_SET_PP( loader );
|
2000-02-02 13:16:19 +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
|
|
|
|
* 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
|
|
|
}
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
error = face->access_glyph_frame( loader, glyph_index,
|
|
|
|
loader->glyf_offset + offset,
|
|
|
|
loader->byte_len );
|
2000-06-25 08:47:11 +02:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-06-23 14:26:14 +02:00
|
|
|
opened_frame = 1;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-06-23 14:26:14 +02:00
|
|
|
/* read first glyph header */
|
2000-06-25 06:49:19 +02:00
|
|
|
error = face->read_glyph_header( loader );
|
2000-06-25 08:47:11 +02:00
|
|
|
if ( error )
|
2005-08-16 03:54:59 +02:00
|
|
|
goto Exit;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
TT_LOADER_SET_PP( loader );
|
2004-03-27 09:43:17 +01:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
/***********************************************************************/
|
|
|
|
/***********************************************************************/
|
|
|
|
/***********************************************************************/
|
|
|
|
|
|
|
|
/* if it is a simple glyph, load it */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2005-08-16 03:54:59 +02: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
|
|
|
{
|
2002-02-19 17:30:15 +01:00
|
|
|
FT_UInt start_point;
|
|
|
|
FT_UInt start_contour;
|
2000-07-04 20:12:13 +02:00
|
|
|
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 */
|
|
|
|
|
|
|
|
if ( (error = TT_Vary_Get_Glyph_Deltas(
|
|
|
|
face,
|
|
|
|
glyph_index,
|
|
|
|
&deltas,
|
2004-06-24 22:18:24 +02:00
|
|
|
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 )
|
|
|
|
{
|
|
|
|
subglyph->arg1 += deltas[i].x;
|
|
|
|
subglyph->arg2 += deltas[i].y;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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-06-12 21:36:41 +02:00
|
|
|
/* */
|
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
|
|
|
{
|
2005-08-19 10:56:29 +02:00
|
|
|
FT_UInt n, num_base_points;
|
2002-04-01 16:25:28 +02:00
|
|
|
FT_SubGlyph subglyph = 0;
|
2000-07-05 06:32:02 +02:00
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
FT_UInt num_points = start_point;
|
2002-04-01 16:25:28 +02:00
|
|
|
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
|
|
|
|
2007-04-09 10:40:11 +02:00
|
|
|
FT_Stream old_stream = loader->stream;
|
|
|
|
|
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,
|
2003-04-23 17:50:27 +02:00
|
|
|
recurse_count + 1 );
|
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;
|
|
|
|
|
|
|
|
/* gloader->base.outline consists of three part: */
|
|
|
|
/* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */
|
|
|
|
/* */
|
|
|
|
/* (1): exist from the beginning */
|
|
|
|
/* (2): components that have been loaded so far */
|
|
|
|
/* (3): the newly loaded component */
|
|
|
|
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
|
|
|
|
2007-04-09 10:40:11 +02:00
|
|
|
loader->stream = old_stream;
|
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
|
|
|
|
{
|
|
|
|
/* invalid composite count ( negative but not -1 ) */
|
|
|
|
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
|
2002-03-14 12:26:29 +01:00
|
|
|
compute_glyph_metrics( TT_Loader loader,
|
2001-06-28 09:17:51 +02:00
|
|
|
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
|
|
|
|
2000-06-25 08:47:11 +02:00
|
|
|
/* get the device-independent horizontal advance. It is scaled later */
|
|
|
|
/* by the base layer. */
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2001-06-08 15:29:36 +02:00
|
|
|
FT_Pos advance = loader->linear;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-06-25 08:47:11 +02:00
|
|
|
|
2000-07-02 15:53:16 +02:00
|
|
|
/* the flag FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH was introduced to */
|
|
|
|
/* correctly support DynaLab fonts, which have an incorrect */
|
|
|
|
/* `advance_Width_Max' field! It is used, to my knowledge, */
|
|
|
|
/* exclusively in the X-TrueType font server. */
|
|
|
|
/* */
|
2002-04-01 16:25:28 +02:00
|
|
|
if ( face->postscript.isFixedPitch &&
|
2000-06-12 21:36:41 +02:00
|
|
|
( loader->load_flags & FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ) == 0 )
|
1999-12-17 00:11:37 +01:00
|
|
|
advance = face->horizontal.advance_Width_Max;
|
|
|
|
|
- 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
|
|
|
/* we need to return the advance in font units in linearHoriAdvance, */
|
2000-06-25 08:47:11 +02:00
|
|
|
/* it will be scaled later by the base layer. */
|
- 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
|
|
|
glyph->linearHoriAdvance = advance;
|
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
|
|
|
|
|
|
|
/* Now take care of vertical metrics. In the case where there is */
|
|
|
|
/* no vertical information within the font (relatively common), make */
|
|
|
|
/* up some metrics by `hand'... */
|
|
|
|
|
|
|
|
{
|
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. */
|
2003-02-13 18:49:27 +01: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
|
|
|
{
|
2006-01-15 07:24:53 +01:00
|
|
|
top = FT_MulFix( top, y_scale );
|
|
|
|
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. */
|
|
|
|
/* */
|
2006-01-15 07:24:53 +01:00
|
|
|
glyph->metrics.vertBearingX = ( bbox.xMin - bbox.xMax ) / 2;
|
1999-12-17 00:11:37 +01:00
|
|
|
glyph->metrics.vertBearingY = top;
|
|
|
|
glyph->metrics.vertAdvance = advance;
|
|
|
|
}
|
|
|
|
|
2000-06-25 09:43:15 +02:00
|
|
|
/* adjust advance width to the value contained in the hdmx table */
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( !face->postscript.isFixedPitch &&
|
2000-06-12 21:36:41 +02:00
|
|
|
IS_HINTED( loader->load_flags ) )
|
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
|
|
|
FT_Byte* widthp;
|
|
|
|
|
2000-06-25 09:43:15 +02: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
|
|
|
widthp = tt_face_get_device_metrics( face,
|
|
|
|
size->root.metrics.x_ppem,
|
|
|
|
glyph_index );
|
2000-06-25 09:43:15 +02:00
|
|
|
|
2005-02-26 01:12:04 +01:00
|
|
|
if ( widthp )
|
|
|
|
glyph->metrics.horiAdvance = *widthp << 6;
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* set glyph dimensions */
|
|
|
|
glyph->metrics.width = bbox.xMax - bbox.xMin;
|
|
|
|
glyph->metrics.height = bbox.yMax - bbox.yMin;
|
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;
|
|
|
|
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,
|
|
|
|
FT_Int32 load_flags )
|
|
|
|
{
|
2005-08-19 10:56:29 +02:00
|
|
|
TT_Face face;
|
|
|
|
FT_Stream stream;
|
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 */
|
2007-01-05 16:32:01 +01:00
|
|
|
if ( IS_HINTED( load_flags ) )
|
2005-08-16 03:54:59 +02:00
|
|
|
{
|
|
|
|
TT_ExecContext exec;
|
2006-11-22 11:36:55 +01:00
|
|
|
FT_Bool grayscale;
|
2005-08-16 03:54:59 +02:00
|
|
|
|
|
|
|
|
2007-01-05 16:32:01 +01:00
|
|
|
if ( !size->cvt_ready )
|
|
|
|
{
|
|
|
|
FT_Error error = tt_size_ready_bytecode( size );
|
|
|
|
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;
|
|
|
|
|
2006-11-22 11:36:55 +01:00
|
|
|
grayscale =
|
|
|
|
FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != FT_RENDER_MODE_MONO );
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
TT_Load_Context( exec, face, size );
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
exec->grayscale = grayscale;
|
|
|
|
|
|
|
|
for ( i = 0; i < size->cvt_size; i++ )
|
|
|
|
size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
|
|
|
|
tt_size_run_prep( size );
|
|
|
|
}
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* see if the cvt program has disabled hinting */
|
|
|
|
if ( exec->GS.instruct_control & 1 )
|
|
|
|
load_flags |= FT_LOAD_NO_HINTING;
|
|
|
|
|
|
|
|
/* load default graphics state - if needed */
|
|
|
|
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
|
|
|
|
|
|
|
/* seek to the beginning of the glyph table. For Type 42 fonts */
|
|
|
|
/* 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
|
|
|
|
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
if ( error )
|
|
|
|
{
|
|
|
|
FT_ERROR(( "TT_Load_Glyph: could not access glyph table\n" ));
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
loader->glyf_offset = FT_STREAM_POS();
|
|
|
|
}
|
|
|
|
|
|
|
|
/* get face's glyph loader */
|
|
|
|
{
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
loader->load_flags = load_flags;
|
|
|
|
|
|
|
|
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
|
|
|
TT_Face face;
|
|
|
|
FT_Error error;
|
|
|
|
TT_LoaderRec loader;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2000-02-02 13:16:19 +01:00
|
|
|
face = (TT_Face)glyph->face;
|
2005-03-08 21:24:56 +01: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 )
|
2005-08-16 03:54:59 +02:00
|
|
|
return TT_Err_Ok;
|
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
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
error = tt_loader_init( &loader, size, glyph, load_flags );
|
|
|
|
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
|
|
|
|
2005-08-16 03:54:59 +02:00
|
|
|
/* Main loading loop */
|
2003-01-08 10:59:17 +01:00
|
|
|
error = load_truetype_glyph( &loader, glyph_index, 0 );
|
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
|
|
|
|
2005-08-22 09:11:31 +02:00
|
|
|
/* In case bit 1 of the `flags' field in the `head' table isn't */
|
|
|
|
/* set, translate array so that (0,0) is the glyph's origin. */
|
|
|
|
if ( ( face->header.Flags & 2 ) == 0 && 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
|
|
|
|
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 */
|