2018-06-03 09:01:17 +02:00
|
|
|
/****************************************************************************
|
|
|
|
*
|
|
|
|
* ttpload.c
|
|
|
|
*
|
|
|
|
* TrueType-specific tables loader (body).
|
|
|
|
*
|
2022-01-11 10:54:10 +01:00
|
|
|
* Copyright (C) 1996-2022 by
|
2018-06-03 09:01:17 +02:00
|
|
|
* David Turner, Robert Wilhelm, and Werner Lemberg.
|
|
|
|
*
|
|
|
|
* This file is part of the FreeType project, and may only be used,
|
|
|
|
* modified, and distributed under the terms of the FreeType project
|
|
|
|
* license, LICENSE.TXT. By continuing to use, modify, or distribute
|
|
|
|
* this file you indicate that you have read the license and
|
|
|
|
* understand and accept it fully.
|
|
|
|
*
|
|
|
|
*/
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-12-08 17:17:16 +01:00
|
|
|
|
2020-06-08 13:31:55 +02:00
|
|
|
#include <freetype/internal/ftdebug.h>
|
|
|
|
#include <freetype/internal/ftobjs.h>
|
|
|
|
#include <freetype/internal/ftstream.h>
|
|
|
|
#include <freetype/tttags.h>
|
Complete redesign of error codes. Please check ftmoderr.h for more
details.
* include/freetype/internal/cfferrs.h,
include/freetype/internal/tterrors.h,
include/freetype/internal/t1errors.h: Removed. Replaced with files
local to the module. All extra error codes have been moved to
`fterrors.h'.
* src/sfnt/ttpost.h: Move error codes to `fterrors.h'.
* src/autohint/aherrors.h, src/cache/ftcerror.h, src/cff/cfferrs.h,
src/cid/ciderrs.h, src/pcf/pcferror.h, src/psaux/psauxerr.h,
src/psnames/psnamerr.h, src/raster/rasterrs.h, src/sfnt/sferrors.h,
src/smooth/ftsmerrs.h, src/truetype/tterrors.h,
src/type1/t1errors.h, src/winfonts/fnterrs.h: New files defining the
error names for the module it belongs to.
* include/freetype/ftmoderr.h: New file, defining the module error
offsets. Its structure is similar to `fterrors.h'.
* include/freetype/fterrors.h (FT_NOERRORDEF): New macro.
(FT_ERRORDEF): Redefined to use module error offsets.
All internal error codes are now public; unused error codes have
been removed, some are new.
* include/freetype/config/ftheader.h (FT_MODULE_ERRORS_H): New
macro.
* include/freetype/config/ftoption.h
(FT_CONFIG_OPTION_USE_MODULE_ERRORS): New macro.
All other source files have been updated to use the new error codes;
some already existing (internal) error codes local to a module have
been renamed to give them the same name as in the base module.
All make files have been updated to include the local error files.
* src/cid/cidtokens.h: Replaced with...
* src/cid/cidtoken.h: This file for 8+3 consistency.
* src/raster/ftraster.c: Use macros for header file names.
2001-06-06 19:30:41 +02:00
|
|
|
|
2001-03-20 12:14:24 +01:00
|
|
|
#include "ttpload.h"
|
Complete redesign of error codes. Please check ftmoderr.h for more
details.
* include/freetype/internal/cfferrs.h,
include/freetype/internal/tterrors.h,
include/freetype/internal/t1errors.h: Removed. Replaced with files
local to the module. All extra error codes have been moved to
`fterrors.h'.
* src/sfnt/ttpost.h: Move error codes to `fterrors.h'.
* src/autohint/aherrors.h, src/cache/ftcerror.h, src/cff/cfferrs.h,
src/cid/ciderrs.h, src/pcf/pcferror.h, src/psaux/psauxerr.h,
src/psnames/psnamerr.h, src/raster/rasterrs.h, src/sfnt/sferrors.h,
src/smooth/ftsmerrs.h, src/truetype/tterrors.h,
src/type1/t1errors.h, src/winfonts/fnterrs.h: New files defining the
error names for the module it belongs to.
* include/freetype/ftmoderr.h: New file, defining the module error
offsets. Its structure is similar to `fterrors.h'.
* include/freetype/fterrors.h (FT_NOERRORDEF): New macro.
(FT_ERRORDEF): Redefined to use module error offsets.
All internal error codes are now public; unused error codes have
been removed, some are new.
* include/freetype/config/ftheader.h (FT_MODULE_ERRORS_H): New
macro.
* include/freetype/config/ftoption.h
(FT_CONFIG_OPTION_USE_MODULE_ERRORS): New macro.
All other source files have been updated to use the new error codes;
some already existing (internal) error codes local to a module have
been renamed to give them the same name as in the base module.
All make files have been updated to include the local error files.
* src/cid/cidtokens.h: Replaced with...
* src/cid/cidtoken.h: This file for 8+3 consistency.
* src/raster/ftraster.c: Use macros for header file names.
2001-06-06 19:30:41 +02:00
|
|
|
|
* 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"
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2018-06-03 09:01:17 +02:00
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* The macro FT_COMPONENT is used in trace mode. It is an implicit
|
|
|
|
* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log
|
|
|
|
* messages during execution.
|
|
|
|
*/
|
1999-12-17 00:11:37 +01:00
|
|
|
#undef FT_COMPONENT
|
2018-08-15 18:13:17 +02:00
|
|
|
#define FT_COMPONENT ttpload
|
2000-06-12 21:36:41 +02:00
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2018-06-03 09:01:17 +02:00
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* @Function:
|
|
|
|
* tt_face_load_loca
|
|
|
|
*
|
|
|
|
* @Description:
|
|
|
|
* Load the locations table.
|
|
|
|
*
|
|
|
|
* @InOut:
|
|
|
|
* face ::
|
|
|
|
* A handle to the target face object.
|
|
|
|
*
|
|
|
|
* @Input:
|
|
|
|
* stream ::
|
|
|
|
* The input stream.
|
|
|
|
*
|
|
|
|
* @Return:
|
|
|
|
* FreeType error code. 0 means success.
|
|
|
|
*/
|
2005-02-22 17:53:06 +01:00
|
|
|
FT_LOCAL_DEF( FT_Error )
|
|
|
|
tt_face_load_loca( TT_Face face,
|
|
|
|
FT_Stream stream )
|
|
|
|
{
|
2005-03-03 18:09:08 +01:00
|
|
|
FT_Error error;
|
|
|
|
FT_ULong table_len;
|
2008-07-09 08:20:12 +02:00
|
|
|
FT_Int shift;
|
2005-02-22 17:53:06 +01:00
|
|
|
|
|
|
|
|
2005-05-05 09:44:20 +02:00
|
|
|
/* we need the size of the `glyf' table for malformed `loca' tables */
|
|
|
|
error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len );
|
2008-12-09 07:51:56 +01:00
|
|
|
|
|
|
|
/* it is possible that a font doesn't have a glyf table at all */
|
|
|
|
/* or its size is zero */
|
2013-03-14 17:50:49 +01:00
|
|
|
if ( FT_ERR_EQ( error, Table_Missing ) )
|
2016-09-27 21:21:01 +02:00
|
|
|
{
|
|
|
|
face->glyf_len = 0;
|
|
|
|
face->glyf_offset = 0;
|
|
|
|
}
|
2008-12-09 07:51:56 +01:00
|
|
|
else if ( error )
|
2005-05-05 09:44:20 +02:00
|
|
|
goto Exit;
|
2016-09-27 21:21:01 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
|
|
|
if ( face->root.internal->incremental_interface )
|
|
|
|
face->glyf_offset = 0;
|
|
|
|
else
|
|
|
|
#endif
|
|
|
|
face->glyf_offset = FT_STREAM_POS();
|
|
|
|
}
|
|
|
|
|
2005-02-22 17:53:06 +01:00
|
|
|
FT_TRACE2(( "Locations " ));
|
|
|
|
error = face->goto_table( face, TTAG_loca, stream, &table_len );
|
|
|
|
if ( error )
|
|
|
|
{
|
2013-03-14 10:27:35 +01:00
|
|
|
error = FT_THROW( Locations_Missing );
|
2005-02-22 17:53:06 +01:00
|
|
|
goto Exit;
|
|
|
|
}
|
|
|
|
|
2021-09-10 04:17:46 +02:00
|
|
|
shift = face->header.Index_To_Loc_Format != 0 ? 2 : 1;
|
2008-07-09 08:20:12 +02:00
|
|
|
|
2021-09-10 04:17:46 +02:00
|
|
|
if ( table_len > 0x10000UL << shift )
|
2005-02-22 17:53:06 +01:00
|
|
|
{
|
2021-09-10 04:17:46 +02:00
|
|
|
FT_TRACE2(( "table too large\n" ));
|
|
|
|
table_len = 0x10000UL << shift;
|
2008-07-09 08:20:12 +02:00
|
|
|
}
|
|
|
|
|
2021-09-10 04:17:46 +02:00
|
|
|
face->num_locations = table_len >> shift;
|
|
|
|
|
2011-03-23 05:19:59 +01:00
|
|
|
if ( face->num_locations != (FT_ULong)face->root.num_glyphs + 1 )
|
2008-07-09 08:20:12 +02:00
|
|
|
{
|
2020-07-28 07:33:40 +02:00
|
|
|
FT_TRACE2(( "glyph count mismatch! loca: %ld, maxp: %ld\n",
|
2011-03-23 05:19:59 +01:00
|
|
|
face->num_locations - 1, face->root.num_glyphs ));
|
2008-07-09 08:20:12 +02:00
|
|
|
|
|
|
|
/* we only handle the case where `maxp' gives a larger value */
|
2021-09-10 04:17:46 +02:00
|
|
|
if ( face->num_locations < (FT_ULong)face->root.num_glyphs + 1 )
|
2008-07-09 08:20:12 +02:00
|
|
|
{
|
2015-02-17 08:03:05 +01:00
|
|
|
FT_ULong new_loca_len =
|
|
|
|
( (FT_ULong)face->root.num_glyphs + 1 ) << shift;
|
2008-07-09 08:20:12 +02:00
|
|
|
|
|
|
|
TT_Table entry = face->dir_tables;
|
|
|
|
TT_Table limit = entry + face->num_tables;
|
|
|
|
|
2015-10-26 15:40:22 +01:00
|
|
|
FT_Long pos = (FT_Long)FT_STREAM_POS();
|
|
|
|
FT_Long dist = 0x7FFFFFFFL;
|
|
|
|
FT_Bool found = 0;
|
2008-07-09 08:20:12 +02:00
|
|
|
|
|
|
|
|
|
|
|
/* compute the distance to next table in font file */
|
|
|
|
for ( ; entry < limit; entry++ )
|
|
|
|
{
|
2015-02-17 08:03:05 +01:00
|
|
|
FT_Long diff = (FT_Long)entry->Offset - pos;
|
2008-07-09 08:20:12 +02:00
|
|
|
|
|
|
|
|
|
|
|
if ( diff > 0 && diff < dist )
|
2015-10-26 15:40:22 +01:00
|
|
|
{
|
|
|
|
dist = diff;
|
|
|
|
found = 1;
|
|
|
|
}
|
2008-07-09 08:20:12 +02:00
|
|
|
}
|
|
|
|
|
2015-10-26 15:40:22 +01:00
|
|
|
if ( !found )
|
2010-11-18 20:34:22 +01:00
|
|
|
{
|
|
|
|
/* `loca' is the last table */
|
2015-02-17 08:03:05 +01:00
|
|
|
dist = (FT_Long)stream->size - pos;
|
2010-11-18 20:34:22 +01:00
|
|
|
}
|
|
|
|
|
2015-02-17 08:03:05 +01:00
|
|
|
if ( new_loca_len <= (FT_ULong)dist )
|
2008-07-09 08:20:12 +02:00
|
|
|
{
|
2015-02-17 08:03:05 +01:00
|
|
|
face->num_locations = (FT_ULong)face->root.num_glyphs + 1;
|
2008-07-09 08:20:12 +02:00
|
|
|
table_len = new_loca_len;
|
|
|
|
|
2020-07-28 07:33:40 +02:00
|
|
|
FT_TRACE2(( "adjusting num_locations to %ld\n",
|
2008-07-09 08:20:12 +02:00
|
|
|
face->num_locations ));
|
|
|
|
}
|
2015-09-30 10:26:10 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
face->root.num_glyphs = face->num_locations
|
|
|
|
? (FT_Long)face->num_locations - 1 : 0;
|
|
|
|
|
2020-07-28 07:33:40 +02:00
|
|
|
FT_TRACE2(( "adjusting num_glyphs to %ld\n",
|
2015-09-30 10:26:10 +02:00
|
|
|
face->root.num_glyphs ));
|
|
|
|
}
|
2008-07-09 08:20:12 +02:00
|
|
|
}
|
2005-02-22 17:53:06 +01:00
|
|
|
}
|
|
|
|
|
2005-03-01 03:13:50 +01:00
|
|
|
/*
|
|
|
|
* Extract the frame. We don't need to decompress it since
|
|
|
|
* we are able to parse it directly.
|
|
|
|
*/
|
2005-02-22 17:53:06 +01:00
|
|
|
if ( FT_FRAME_EXTRACT( table_len, face->glyph_locations ) )
|
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
FT_TRACE2(( "loaded\n" ));
|
|
|
|
|
|
|
|
Exit:
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_LOCAL_DEF( FT_ULong )
|
2005-03-01 03:13:50 +01:00
|
|
|
tt_face_get_location( TT_Face face,
|
|
|
|
FT_UInt gindex,
|
|
|
|
FT_UInt *asize )
|
2005-02-22 17:53:06 +01:00
|
|
|
{
|
|
|
|
FT_ULong pos1, pos2;
|
|
|
|
FT_Byte* p;
|
|
|
|
FT_Byte* p_limit;
|
|
|
|
|
2005-03-01 03:13:50 +01:00
|
|
|
|
2005-02-22 17:53:06 +01:00
|
|
|
pos1 = pos2 = 0;
|
2005-03-01 03:13:50 +01:00
|
|
|
|
2005-02-22 17:53:06 +01:00
|
|
|
if ( gindex < face->num_locations )
|
|
|
|
{
|
|
|
|
if ( face->header.Index_To_Loc_Format != 0 )
|
|
|
|
{
|
2005-03-01 03:13:50 +01:00
|
|
|
p = face->glyph_locations + gindex * 4;
|
|
|
|
p_limit = face->glyph_locations + face->num_locations * 4;
|
2005-02-22 17:53:06 +01:00
|
|
|
|
2005-03-01 03:13:50 +01:00
|
|
|
pos1 = FT_NEXT_ULONG( p );
|
2005-02-22 17:53:06 +01:00
|
|
|
pos2 = pos1;
|
|
|
|
|
2005-03-01 03:13:50 +01:00
|
|
|
if ( p + 4 <= p_limit )
|
|
|
|
pos2 = FT_NEXT_ULONG( p );
|
2005-02-22 17:53:06 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2005-03-01 03:13:50 +01:00
|
|
|
p = face->glyph_locations + gindex * 2;
|
|
|
|
p_limit = face->glyph_locations + face->num_locations * 2;
|
2005-02-22 17:53:06 +01:00
|
|
|
|
2005-03-01 03:13:50 +01:00
|
|
|
pos1 = FT_NEXT_USHORT( p );
|
2005-02-22 17:53:06 +01:00
|
|
|
pos2 = pos1;
|
|
|
|
|
2005-03-01 03:13:50 +01:00
|
|
|
if ( p + 2 <= p_limit )
|
|
|
|
pos2 = FT_NEXT_USHORT( p );
|
2005-02-22 17:53:06 +01:00
|
|
|
|
|
|
|
pos1 <<= 1;
|
|
|
|
pos2 <<= 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-09-25 16:29:05 +02:00
|
|
|
/* Check broken location data. */
|
2012-01-02 22:33:42 +01:00
|
|
|
if ( pos1 > face->glyf_len )
|
2010-09-19 18:07:57 +02:00
|
|
|
{
|
|
|
|
FT_TRACE1(( "tt_face_get_location:"
|
2021-02-04 07:44:06 +01:00
|
|
|
" too large offset (0x%08lx) found for glyph index %d,\n",
|
|
|
|
pos1, gindex ));
|
|
|
|
FT_TRACE1(( " "
|
2016-09-25 16:29:05 +02:00
|
|
|
" exceeding the end of `glyf' table (0x%08lx)\n",
|
2021-02-04 07:44:06 +01:00
|
|
|
face->glyf_len ));
|
2010-09-19 18:07:57 +02:00
|
|
|
*asize = 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-01-02 22:33:42 +01:00
|
|
|
if ( pos2 > face->glyf_len )
|
2010-09-19 18:07:57 +02:00
|
|
|
{
|
2016-09-25 16:29:05 +02:00
|
|
|
/* We try to sanitize the last `loca' entry. */
|
2017-07-12 00:24:48 +02:00
|
|
|
if ( gindex == face->num_locations - 2 )
|
2016-09-25 16:29:05 +02:00
|
|
|
{
|
|
|
|
FT_TRACE1(( "tt_face_get_location:"
|
2021-02-04 07:44:06 +01:00
|
|
|
" too large size (%ld bytes) found for glyph index %d,\n",
|
|
|
|
pos2 - pos1, gindex ));
|
|
|
|
FT_TRACE1(( " "
|
2017-07-12 00:24:48 +02:00
|
|
|
" truncating at the end of `glyf' table to %ld bytes\n",
|
2021-02-04 07:44:06 +01:00
|
|
|
face->glyf_len - pos1 ));
|
2016-09-25 16:29:05 +02:00
|
|
|
pos2 = face->glyf_len;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
FT_TRACE1(( "tt_face_get_location:"
|
2021-02-04 07:44:06 +01:00
|
|
|
" too large offset (0x%08lx) found for glyph index %d,\n",
|
|
|
|
pos2, gindex + 1 ));
|
|
|
|
FT_TRACE1(( " "
|
2016-09-25 16:29:05 +02:00
|
|
|
" exceeding the end of `glyf' table (0x%08lx)\n",
|
2021-02-04 07:44:06 +01:00
|
|
|
face->glyf_len ));
|
2016-09-25 16:29:05 +02:00
|
|
|
*asize = 0;
|
|
|
|
return 0;
|
|
|
|
}
|
2010-09-19 18:07:57 +02:00
|
|
|
}
|
|
|
|
|
2009-04-04 07:51:45 +02:00
|
|
|
/* The `loca' table must be ordered; it refers to the length of */
|
|
|
|
/* an entry as the difference between the current and the next */
|
|
|
|
/* position. However, there do exist (malformed) fonts which */
|
|
|
|
/* don't obey this rule, so we are only able to provide an */
|
|
|
|
/* upper bound for the size. */
|
2008-12-09 07:51:56 +01:00
|
|
|
/* */
|
|
|
|
/* We get (intentionally) a wrong, non-zero result in case the */
|
|
|
|
/* `glyf' table is missing. */
|
2005-05-07 08:10:19 +02:00
|
|
|
if ( pos2 >= pos1 )
|
2005-05-05 09:44:20 +02:00
|
|
|
*asize = (FT_UInt)( pos2 - pos1 );
|
|
|
|
else
|
|
|
|
*asize = (FT_UInt)( face->glyf_len - pos1 );
|
2005-02-22 17:53:06 +01:00
|
|
|
|
|
|
|
return pos1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_LOCAL_DEF( void )
|
|
|
|
tt_face_done_loca( TT_Face face )
|
|
|
|
{
|
2005-03-01 03:13:50 +01:00
|
|
|
FT_Stream stream = face->root.stream;
|
|
|
|
|
2005-02-22 17:53:06 +01:00
|
|
|
|
|
|
|
FT_FRAME_RELEASE( face->glyph_locations );
|
|
|
|
face->num_locations = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-06-03 09:01:17 +02:00
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* @Function:
|
|
|
|
* tt_face_load_cvt
|
|
|
|
*
|
|
|
|
* @Description:
|
|
|
|
* Load the control value table into a face object.
|
|
|
|
*
|
|
|
|
* @InOut:
|
|
|
|
* face ::
|
|
|
|
* A handle to the target face object.
|
|
|
|
*
|
|
|
|
* @Input:
|
|
|
|
* stream ::
|
|
|
|
* A handle to the input stream.
|
|
|
|
*
|
|
|
|
* @Return:
|
|
|
|
* FreeType error code. 0 means success.
|
|
|
|
*/
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_LOCAL_DEF( FT_Error )
|
* 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
|
|
|
tt_face_load_cvt( TT_Face face,
|
|
|
|
FT_Stream stream )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2006-08-26 00:45:13 +02:00
|
|
|
#ifdef TT_USE_BYTECODE_INTERPRETER
|
2005-02-22 17:53:06 +01:00
|
|
|
|
2000-06-16 21:34:52 +02:00
|
|
|
FT_Error error;
|
1999-12-17 00:11:37 +01:00
|
|
|
FT_Memory memory = stream->memory;
|
2000-06-16 21:34:52 +02:00
|
|
|
FT_ULong table_len;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
FT_TRACE2(( "CVT " ));
|
|
|
|
|
|
|
|
error = face->goto_table( face, TTAG_cvt, stream, &table_len );
|
2000-06-12 21:36:41 +02:00
|
|
|
if ( error )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2009-06-26 06:15:41 +02:00
|
|
|
FT_TRACE2(( "is missing\n" ));
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
face->cvt_size = 0;
|
|
|
|
face->cvt = NULL;
|
2013-03-14 11:21:17 +01:00
|
|
|
error = FT_Err_Ok;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
goto Exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
face->cvt_size = table_len / 2;
|
|
|
|
|
2021-05-01 15:14:04 +02:00
|
|
|
if ( FT_QNEW_ARRAY( face->cvt, face->cvt_size ) )
|
1999-12-17 00:11:37 +01:00
|
|
|
goto Exit;
|
|
|
|
|
2002-03-20 11:49:31 +01:00
|
|
|
if ( FT_FRAME_ENTER( face->cvt_size * 2L ) )
|
1999-12-17 00:11:37 +01:00
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
{
|
2019-05-16 12:15:54 +02:00
|
|
|
FT_Int32* cur = face->cvt;
|
|
|
|
FT_Int32* limit = cur + face->cvt_size;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2010-11-18 20:34:22 +01:00
|
|
|
for ( ; cur < limit; cur++ )
|
2019-05-16 12:15:54 +02:00
|
|
|
*cur = FT_GET_SHORT() * 64;
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
|
2002-03-20 11:49:31 +01:00
|
|
|
FT_FRAME_EXIT();
|
1999-12-17 00:11:37 +01:00
|
|
|
FT_TRACE2(( "loaded\n" ));
|
|
|
|
|
* 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 )
|
|
|
|
error = tt_face_vary_cvt( face, stream );
|
|
|
|
#endif
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
Exit:
|
|
|
|
return error;
|
2005-02-22 17:53:06 +01:00
|
|
|
|
2006-08-26 00:45:13 +02:00
|
|
|
#else /* !TT_USE_BYTECODE_INTERPRETER */
|
2005-03-01 03:13:50 +01:00
|
|
|
|
|
|
|
FT_UNUSED( face );
|
|
|
|
FT_UNUSED( stream );
|
|
|
|
|
2013-03-14 11:21:17 +01:00
|
|
|
return FT_Err_Ok;
|
2005-03-01 03:13:50 +01:00
|
|
|
|
2005-02-22 17:53:06 +01:00
|
|
|
#endif
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-06-03 09:01:17 +02:00
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* @Function:
|
|
|
|
* tt_face_load_fpgm
|
|
|
|
*
|
|
|
|
* @Description:
|
|
|
|
* Load the font program.
|
|
|
|
*
|
|
|
|
* @InOut:
|
|
|
|
* face ::
|
|
|
|
* A handle to the target face object.
|
|
|
|
*
|
|
|
|
* @Input:
|
|
|
|
* stream ::
|
|
|
|
* A handle to the input stream.
|
|
|
|
*
|
|
|
|
* @Return:
|
|
|
|
* FreeType error code. 0 means success.
|
|
|
|
*/
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_LOCAL_DEF( FT_Error )
|
* 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
|
|
|
tt_face_load_fpgm( TT_Face face,
|
|
|
|
FT_Stream stream )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
2006-08-26 00:45:13 +02:00
|
|
|
#ifdef TT_USE_BYTECODE_INTERPRETER
|
2005-02-22 17:53:06 +01:00
|
|
|
|
2006-02-15 07:05:52 +01:00
|
|
|
FT_Error error;
|
|
|
|
FT_ULong table_len;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2000-01-08 21:00:54 +01:00
|
|
|
FT_TRACE2(( "Font program " ));
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
/* The font program is optional */
|
|
|
|
error = face->goto_table( face, TTAG_fpgm, stream, &table_len );
|
2000-01-08 21:00:54 +01:00
|
|
|
if ( error )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
|
|
|
face->font_program = NULL;
|
|
|
|
face->font_program_size = 0;
|
2013-03-14 11:21:17 +01:00
|
|
|
error = FT_Err_Ok;
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2009-06-26 06:15:41 +02:00
|
|
|
FT_TRACE2(( "is missing\n" ));
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
face->font_program_size = table_len;
|
2002-03-20 11:49:31 +01:00
|
|
|
if ( FT_FRAME_EXTRACT( table_len, face->font_program ) )
|
1999-12-17 00:11:37 +01:00
|
|
|
goto Exit;
|
|
|
|
|
2020-07-28 07:33:40 +02:00
|
|
|
FT_TRACE2(( "loaded, %12ld bytes\n", face->font_program_size ));
|
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
|
|
|
Exit:
|
|
|
|
return error;
|
|
|
|
|
2006-08-26 00:45:13 +02:00
|
|
|
#else /* !TT_USE_BYTECODE_INTERPRETER */
|
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_UNUSED( face );
|
|
|
|
FT_UNUSED( stream );
|
|
|
|
|
2013-03-14 11:21:17 +01:00
|
|
|
return FT_Err_Ok;
|
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
|
|
|
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-06-03 09:01:17 +02:00
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* @Function:
|
|
|
|
* tt_face_load_prep
|
|
|
|
*
|
|
|
|
* @Description:
|
|
|
|
* Load the cvt program.
|
|
|
|
*
|
|
|
|
* @InOut:
|
|
|
|
* face ::
|
|
|
|
* A handle to the target face object.
|
|
|
|
*
|
|
|
|
* @Input:
|
|
|
|
* stream ::
|
|
|
|
* A handle to the input stream.
|
|
|
|
*
|
|
|
|
* @Return:
|
|
|
|
* FreeType error code. 0 means success.
|
|
|
|
*/
|
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_LOCAL_DEF( FT_Error )
|
|
|
|
tt_face_load_prep( TT_Face face,
|
|
|
|
FT_Stream stream )
|
|
|
|
{
|
2006-08-26 00:45:13 +02:00
|
|
|
#ifdef TT_USE_BYTECODE_INTERPRETER
|
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
|
|
|
|
2006-02-15 07:05:52 +01:00
|
|
|
FT_Error error;
|
|
|
|
FT_ULong table_len;
|
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
|
|
|
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
FT_TRACE2(( "Prep program " ));
|
|
|
|
|
|
|
|
error = face->goto_table( face, TTAG_prep, stream, &table_len );
|
2000-01-08 21:00:54 +01:00
|
|
|
if ( error )
|
1999-12-17 00:11:37 +01:00
|
|
|
{
|
|
|
|
face->cvt_program = NULL;
|
|
|
|
face->cvt_program_size = 0;
|
2013-03-14 11:21:17 +01:00
|
|
|
error = FT_Err_Ok;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
2009-06-26 06:15:41 +02:00
|
|
|
FT_TRACE2(( "is missing\n" ));
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
face->cvt_program_size = table_len;
|
2002-03-20 11:49:31 +01:00
|
|
|
if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) )
|
2000-05-27 00:13:17 +02:00
|
|
|
goto Exit;
|
2000-06-12 21:36:41 +02:00
|
|
|
|
2020-07-28 07:33:40 +02:00
|
|
|
FT_TRACE2(( "loaded, %12ld bytes\n", face->cvt_program_size ));
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Exit:
|
|
|
|
return error;
|
2005-02-22 17:53:06 +01:00
|
|
|
|
2006-08-26 00:45:13 +02:00
|
|
|
#else /* !TT_USE_BYTECODE_INTERPRETER */
|
2005-03-01 03:13:50 +01:00
|
|
|
|
|
|
|
FT_UNUSED( face );
|
|
|
|
FT_UNUSED( stream );
|
|
|
|
|
2013-03-14 11:21:17 +01:00
|
|
|
return FT_Err_Ok;
|
2005-03-01 03:13:50 +01:00
|
|
|
|
2005-02-22 17:53:06 +01:00
|
|
|
#endif
|
1999-12-17 00:11:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-12-12 04:54:06 +01:00
|
|
|
FT_COMPARE_DEF( int )
|
|
|
|
compare_ppem( const void* a,
|
|
|
|
const void* b )
|
|
|
|
{
|
|
|
|
return **(FT_Byte**)a - **(FT_Byte**)b;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-06-03 09:01:17 +02:00
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* @Function:
|
|
|
|
* tt_face_load_hdmx
|
|
|
|
*
|
|
|
|
* @Description:
|
|
|
|
* Load the `hdmx' table into the face object.
|
|
|
|
*
|
|
|
|
* @Input:
|
|
|
|
* face ::
|
|
|
|
* A handle to the target face object.
|
|
|
|
*
|
|
|
|
* stream ::
|
|
|
|
* A handle to the input stream.
|
|
|
|
*
|
|
|
|
* @Return:
|
|
|
|
* FreeType error code. 0 means success.
|
|
|
|
*/
|
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_LOCAL_DEF( FT_Error )
|
|
|
|
tt_face_load_hdmx( TT_Face face,
|
|
|
|
FT_Stream stream )
|
|
|
|
{
|
|
|
|
FT_Error error;
|
|
|
|
FT_Memory memory = stream->memory;
|
2016-12-24 09:27:15 +01:00
|
|
|
FT_UInt nn, num_records;
|
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_ULong table_size, record_size;
|
|
|
|
FT_Byte* p;
|
|
|
|
FT_Byte* limit;
|
|
|
|
|
|
|
|
|
|
|
|
/* this table is optional */
|
|
|
|
error = face->goto_table( face, TTAG_hdmx, stream, &table_size );
|
|
|
|
if ( error || table_size < 8 )
|
2013-03-14 11:21:17 +01:00
|
|
|
return FT_Err_Ok;
|
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
|
|
|
|
|
|
|
if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) )
|
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
p = face->hdmx_table;
|
|
|
|
limit = p + table_size;
|
|
|
|
|
2016-12-24 09:27:15 +01:00
|
|
|
/* Given that `hdmx' tables are losing its importance (for example, */
|
|
|
|
/* variation fonts introduced in OpenType 1.8 must not have this */
|
|
|
|
/* table) we no longer test for a correct `version' field. */
|
|
|
|
p += 2;
|
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
|
|
|
num_records = FT_NEXT_USHORT( p );
|
|
|
|
record_size = FT_NEXT_ULONG( p );
|
|
|
|
|
2006-09-05 21:24:34 +02:00
|
|
|
/* There are at least two fonts, HANNOM-A and HANNOM-B version */
|
|
|
|
/* 2.0 (2005), which get this wrong: The upper two bytes of */
|
|
|
|
/* the size value are set to 0xFF instead of 0x00. We catch */
|
|
|
|
/* and fix this. */
|
|
|
|
|
|
|
|
if ( record_size >= 0xFFFF0000UL )
|
|
|
|
record_size &= 0xFFFFU;
|
|
|
|
|
2021-11-26 15:15:46 +01:00
|
|
|
FT_TRACE2(( "Hdmx " ));
|
2021-11-26 04:38:40 +01:00
|
|
|
|
2006-09-05 21:24:34 +02:00
|
|
|
/* The limit for `num_records' is a heuristic value. */
|
2021-11-26 04:38:40 +01:00
|
|
|
if ( num_records > 255 || num_records == 0 )
|
|
|
|
{
|
|
|
|
FT_TRACE2(( "with unreasonable %u records rejected\n", num_records ));
|
|
|
|
goto Fail;
|
|
|
|
}
|
|
|
|
|
2021-11-26 15:15:46 +01:00
|
|
|
/* Out-of-spec tables are rejected. The record size must be */
|
|
|
|
/* equal to the number of glyphs + 2 + 32-bit padding. */
|
|
|
|
if ( (FT_Long)record_size != ( ( face->root.num_glyphs + 2 + 3 ) & ~3 ) )
|
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
|
|
|
{
|
2021-11-26 04:38:40 +01:00
|
|
|
FT_TRACE2(( "with record size off by %ld bytes rejected\n",
|
2021-11-26 15:15:46 +01:00
|
|
|
(FT_Long)record_size -
|
|
|
|
( ( face->root.num_glyphs + 2 + 3 ) & ~3 ) ));
|
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
|
|
|
goto Fail;
|
|
|
|
}
|
|
|
|
|
2021-12-12 04:54:06 +01:00
|
|
|
if ( FT_QNEW_ARRAY( face->hdmx_records, num_records ) )
|
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
|
|
|
goto Fail;
|
|
|
|
|
|
|
|
for ( nn = 0; nn < num_records; nn++ )
|
|
|
|
{
|
|
|
|
if ( p + record_size > limit )
|
|
|
|
break;
|
2021-12-12 04:54:06 +01:00
|
|
|
face->hdmx_records[nn] = p;
|
|
|
|
p += record_size;
|
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
|
|
|
}
|
* builds/win32/visualc/freetype.dsp: updating the project file, adding
missing base source files (e.g. ftstroke.c, ftxf86.c, etc...)
* src/autofit/afcjk.c, src/autofit/aflatin.c, src/base/ftobjs.c,
src/cff/cffobjs.c, src/cid/cidobjs.c, src/pfr/pfrobjs.c,
src/sfnt/sfobjs.c, src/sfnt/ttmtx.c, src/truetype/ttpload.c,
src/truetype/ttpload.h, src/type1/t1afm.c, src/type1/t1objs.c:
removing compiler warnings when building with Visual C++ 6 and /W4
2006-03-20 14:32:33 +01:00
|
|
|
|
2021-12-12 04:54:06 +01:00
|
|
|
/* The records must be already sorted by ppem but it does not */
|
|
|
|
/* hurt to make sure so that the binary search works later. */
|
|
|
|
ft_qsort( face->hdmx_records, nn, sizeof ( FT_Byte* ), compare_ppem );
|
|
|
|
|
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
|
|
|
face->hdmx_record_count = nn;
|
|
|
|
face->hdmx_table_size = table_size;
|
2006-02-22 08:59:35 +01:00
|
|
|
face->hdmx_record_size = record_size;
|
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
|
|
|
|
2021-11-26 04:38:40 +01:00
|
|
|
FT_TRACE2(( "%ux%lu loaded\n", num_records, record_size ));
|
|
|
|
|
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
|
|
|
Exit:
|
|
|
|
return error;
|
* builds/win32/visualc/freetype.dsp: updating the project file, adding
missing base source files (e.g. ftstroke.c, ftxf86.c, etc...)
* src/autofit/afcjk.c, src/autofit/aflatin.c, src/base/ftobjs.c,
src/cff/cffobjs.c, src/cid/cidobjs.c, src/pfr/pfrobjs.c,
src/sfnt/sfobjs.c, src/sfnt/ttmtx.c, src/truetype/ttpload.c,
src/truetype/ttpload.h, src/type1/t1afm.c, src/type1/t1objs.c:
removing compiler warnings when building with Visual C++ 6 and /W4
2006-03-20 14:32:33 +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
|
|
|
Fail:
|
|
|
|
FT_FRAME_RELEASE( face->hdmx_table );
|
|
|
|
face->hdmx_table_size = 0;
|
|
|
|
goto Exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_LOCAL_DEF( void )
|
|
|
|
tt_face_free_hdmx( TT_Face face )
|
|
|
|
{
|
|
|
|
FT_Stream stream = face->root.stream;
|
|
|
|
FT_Memory memory = stream->memory;
|
* builds/win32/visualc/freetype.dsp: updating the project file, adding
missing base source files (e.g. ftstroke.c, ftxf86.c, etc...)
* src/autofit/afcjk.c, src/autofit/aflatin.c, src/base/ftobjs.c,
src/cff/cffobjs.c, src/cid/cidobjs.c, src/pfr/pfrobjs.c,
src/sfnt/sfobjs.c, src/sfnt/ttmtx.c, src/truetype/ttpload.c,
src/truetype/ttpload.h, src/type1/t1afm.c, src/type1/t1objs.c:
removing compiler warnings when building with Visual C++ 6 and /W4
2006-03-20 14:32:33 +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
|
|
|
|
2021-12-12 04:54:06 +01:00
|
|
|
FT_FREE( face->hdmx_records );
|
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_FRAME_RELEASE( face->hdmx_table );
|
|
|
|
}
|
|
|
|
|
2006-02-15 07:05:52 +01:00
|
|
|
|
2018-06-03 09:01:17 +02:00
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* Return the advance width table for a given pixel size if it is found
|
2021-12-12 04:54:06 +01:00
|
|
|
* in the font's `hdmx' table (if any). The records must be sorted for
|
|
|
|
* the binary search to work properly.
|
2018-06-03 09:01:17 +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
|
|
|
FT_LOCAL_DEF( FT_Byte* )
|
|
|
|
tt_face_get_device_metrics( TT_Face face,
|
* builds/win32/visualc/freetype.dsp: updating the project file, adding
missing base source files (e.g. ftstroke.c, ftxf86.c, etc...)
* src/autofit/afcjk.c, src/autofit/aflatin.c, src/base/ftobjs.c,
src/cff/cffobjs.c, src/cid/cidobjs.c, src/pfr/pfrobjs.c,
src/sfnt/sfobjs.c, src/sfnt/ttmtx.c, src/truetype/ttpload.c,
src/truetype/ttpload.h, src/type1/t1afm.c, src/type1/t1objs.c:
removing compiler warnings when building with Visual C++ 6 and /W4
2006-03-20 14:32:33 +01:00
|
|
|
FT_UInt ppem,
|
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_UInt gindex )
|
|
|
|
{
|
2021-12-12 04:54:06 +01:00
|
|
|
FT_UInt min = 0;
|
|
|
|
FT_UInt max = face->hdmx_record_count;
|
|
|
|
FT_UInt mid;
|
|
|
|
FT_Byte* result = NULL;
|
|
|
|
|
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
|
|
|
|
2021-12-12 04:54:06 +01:00
|
|
|
while ( min < max )
|
|
|
|
{
|
|
|
|
mid = ( min + max ) >> 1;
|
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
|
|
|
|
2021-12-12 04:54:06 +01:00
|
|
|
if ( face->hdmx_records[mid][0] > ppem )
|
|
|
|
max = mid;
|
|
|
|
else if ( face->hdmx_records[mid][0] < ppem )
|
|
|
|
min = mid + 1;
|
|
|
|
else
|
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
|
|
|
{
|
2021-12-12 04:54:06 +01:00
|
|
|
result = face->hdmx_records[mid] + 2 + gindex;
|
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
|
|
|
break;
|
|
|
|
}
|
2021-12-12 04:54:06 +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
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
/* END */
|