1999-12-17 00:11:37 +01:00
|
|
|
|
/***************************************************************************/
|
|
|
|
|
/* */
|
|
|
|
|
/* ttload.c */
|
|
|
|
|
/* */
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* Load the basic TrueType tables, i.e., tables that can be either in */
|
|
|
|
|
/* TTF or OTF fonts (body). */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
2015-01-17 20:41:43 +01:00
|
|
|
|
/* Copyright 1996-2015 by */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
|
|
|
|
/* */
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* This file is part of the FreeType project, and may only be used, */
|
|
|
|
|
/* modified, and distributed under the terms of the FreeType project */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
|
|
|
|
|
/* this file you indicate that you have read the license and */
|
|
|
|
|
/* understand and accept it fully. */
|
|
|
|
|
/* */
|
|
|
|
|
/***************************************************************************/
|
|
|
|
|
|
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_STREAM_H
|
|
|
|
|
#include FT_TRUETYPE_TAGS_H
|
2001-03-20 12:14:24 +01:00
|
|
|
|
#include "ttload.h"
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
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 "sferrors.h"
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/*************************************************************************/
|
|
|
|
|
/* */
|
|
|
|
|
/* The macro FT_COMPONENT is used in trace mode. It is an implicit */
|
|
|
|
|
/* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
|
|
|
|
|
/* messages during execution. */
|
|
|
|
|
/* */
|
|
|
|
|
#undef FT_COMPONENT
|
|
|
|
|
#define FT_COMPONENT trace_ttload
|
2000-02-13 14:41:56 +01:00
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
|
/* */
|
|
|
|
|
/* <Function> */
|
* 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_lookup_table */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Description> */
|
|
|
|
|
/* Looks for a TrueType table by name. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Input> */
|
|
|
|
|
/* face :: A face object handle. */
|
2002-03-31 20:48:24 +02:00
|
|
|
|
/* */
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* tag :: The searched tag. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Return> */
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* A pointer to the table directory entry. 0 if not found. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
2002-03-14 12:26:29 +01:00
|
|
|
|
FT_LOCAL_DEF( TT_Table )
|
* 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_lookup_table( TT_Face face,
|
|
|
|
|
FT_ULong tag )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
|
TT_Table entry;
|
|
|
|
|
TT_Table limit;
|
2008-12-05 19:37:44 +01:00
|
|
|
|
#ifdef FT_DEBUG_LEVEL_TRACE
|
|
|
|
|
FT_Bool zero_length = FALSE;
|
|
|
|
|
#endif
|
2000-05-17 01:44:38 +02:00
|
|
|
|
|
2000-06-05 07:26:15 +02:00
|
|
|
|
|
* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove
unused `max_points' and `max_contours'.
* src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c
(T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update.
* include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
`max_components'.
* src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused
`loadSize' and `loadStack'.
* src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context),
src/sfnt/ttload.c (tt_face_load_maxp): Update.
* src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c
(sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix
compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not
defined.
* src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix
possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions.
(finally!)
For most OpenType tables, `tt_face_load_xxxx' simply loads the table
and `face->root' is set later in `sfnt_load_face'. Here, we try to
make this work for _all_ tables.
* src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c,
src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and
then exit. Error handling or setting face->root is done later in
`sfnt_load_face'.
Pretty trace messages.
* src/sfnt/sfobjs.c (sfnt_load_face): Work harder.
Mac bitmap-only fonts are not scalable.
Check that `face->header.Units_Per_EM' is not zero.
(LOAD_, LOADM_): Pretty trace messages.
* src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics from
`eblc'.
* src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c
(load_format_20, load_format_25, tt_face_get_ps_name): Use
face->max_profile.numGlyphs, instead of face->root.num_glyphs.
2006-02-15 08:44:31 +01:00
|
|
|
|
FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ",
|
2000-11-13 17:58:01 +01:00
|
|
|
|
face,
|
|
|
|
|
(FT_Char)( tag >> 24 ),
|
|
|
|
|
(FT_Char)( tag >> 16 ),
|
|
|
|
|
(FT_Char)( tag >> 8 ),
|
|
|
|
|
(FT_Char)( tag ) ));
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
|
entry = face->dir_tables;
|
|
|
|
|
limit = entry + face->num_tables;
|
2000-06-05 07:26:15 +02:00
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
for ( ; entry < limit; entry++ )
|
|
|
|
|
{
|
2008-12-05 19:37:44 +01:00
|
|
|
|
/* For compatibility with Windows, we consider */
|
|
|
|
|
/* zero-length tables the same as missing tables. */
|
2010-06-08 08:37:11 +02:00
|
|
|
|
if ( entry->Tag == tag )
|
|
|
|
|
{
|
2008-12-05 19:37:44 +01:00
|
|
|
|
if ( entry->Length != 0 )
|
|
|
|
|
{
|
|
|
|
|
FT_TRACE4(( "found table.\n" ));
|
|
|
|
|
return entry;
|
|
|
|
|
}
|
|
|
|
|
#ifdef FT_DEBUG_LEVEL_TRACE
|
|
|
|
|
zero_length = TRUE;
|
|
|
|
|
#endif
|
2000-11-13 08:31:21 +01:00
|
|
|
|
}
|
2000-05-17 01:44:38 +02:00
|
|
|
|
}
|
2000-06-05 07:26:15 +02:00
|
|
|
|
|
2008-12-05 19:37:44 +01:00
|
|
|
|
#ifdef FT_DEBUG_LEVEL_TRACE
|
|
|
|
|
if ( zero_length )
|
2009-06-26 06:15:41 +02:00
|
|
|
|
FT_TRACE4(( "ignoring empty table\n" ));
|
2008-12-05 19:37:44 +01:00
|
|
|
|
else
|
2009-06-26 06:15:41 +02:00
|
|
|
|
FT_TRACE4(( "could not find table\n" ));
|
2008-12-05 19:37:44 +01:00
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
return NULL;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
}
|
|
|
|
|
|
2000-06-05 07:26:15 +02:00
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/*************************************************************************/
|
|
|
|
|
/* */
|
|
|
|
|
/* <Function> */
|
* 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_goto_table */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Description> */
|
|
|
|
|
/* Looks for a TrueType table by name, then seek a stream to it. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Input> */
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* face :: A face object handle. */
|
2002-03-31 20:48:24 +02:00
|
|
|
|
/* */
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* tag :: The searched tag. */
|
2002-03-31 20:48:24 +02:00
|
|
|
|
/* */
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* stream :: The stream to seek when the table is found. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Output> */
|
|
|
|
|
/* length :: The length of the table if found, undefined otherwise. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Return> */
|
2000-06-25 08:47:11 +02:00
|
|
|
|
/* FreeType error code. 0 means success. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
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_goto_table( TT_Face face,
|
|
|
|
|
FT_ULong tag,
|
|
|
|
|
FT_Stream stream,
|
|
|
|
|
FT_ULong* length )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
|
TT_Table table;
|
|
|
|
|
FT_Error error;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
|
2000-06-05 07:26:15 +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
|
|
|
|
table = tt_face_lookup_table( face, tag );
|
2000-06-05 07:26:15 +02:00
|
|
|
|
if ( table )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
{
|
2000-06-05 07:26:15 +02:00
|
|
|
|
if ( length )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
*length = table->Length;
|
2000-05-17 01:44:38 +02:00
|
|
|
|
|
2002-03-20 11:49:31 +01:00
|
|
|
|
if ( FT_STREAM_SEEK( table->Offset ) )
|
2008-08-04 07:45:41 +02:00
|
|
|
|
goto Exit;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
}
|
|
|
|
|
else
|
2013-03-14 10:27:35 +01:00
|
|
|
|
error = FT_THROW( Table_Missing );
|
2000-05-17 01:44:38 +02:00
|
|
|
|
|
2000-07-31 20:59:02 +02:00
|
|
|
|
Exit:
|
1999-12-17 00:11:37 +01:00
|
|
|
|
return error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-08-04 07:45:41 +02:00
|
|
|
|
/* Here, we */
|
|
|
|
|
/* */
|
2015-09-19 12:41:12 +02:00
|
|
|
|
/* - check that `num_tables' is valid (and adjust it if necessary); */
|
|
|
|
|
/* also return the number of valid table entries */
|
2008-08-04 07:45:41 +02:00
|
|
|
|
/* */
|
|
|
|
|
/* - look for a `head' table, check its size, and parse it to check */
|
|
|
|
|
/* whether its `magic' field is correctly set */
|
|
|
|
|
/* */
|
2008-10-05 08:08:40 +02:00
|
|
|
|
/* - errors (except errors returned by stream handling) */
|
2008-10-05 04:38:57 +02:00
|
|
|
|
/* */
|
2008-10-05 08:08:40 +02:00
|
|
|
|
/* SFNT_Err_Unknown_File_Format: */
|
|
|
|
|
/* no table is defined in directory, it is not sfnt-wrapped */
|
|
|
|
|
/* data */
|
|
|
|
|
/* SFNT_Err_Table_Missing: */
|
|
|
|
|
/* table directory is valid, but essential tables */
|
|
|
|
|
/* (head/bhed/SING) are missing */
|
2008-10-05 04:38:57 +02:00
|
|
|
|
/* */
|
2002-07-26 11:09:10 +02:00
|
|
|
|
static FT_Error
|
2006-02-14 08:01:29 +01:00
|
|
|
|
check_table_dir( SFNT_Header sfnt,
|
2015-09-19 12:41:12 +02:00
|
|
|
|
FT_Stream stream,
|
|
|
|
|
FT_UShort* valid )
|
2005-11-20 09:24:24 +01:00
|
|
|
|
{
|
2009-11-16 23:10:53 +01:00
|
|
|
|
FT_Error error;
|
|
|
|
|
FT_UShort nn, valid_entries = 0;
|
|
|
|
|
FT_UInt has_head = 0, has_sing = 0, has_meta = 0;
|
|
|
|
|
FT_ULong offset = sfnt->offset + 12;
|
2002-07-12 01:41:14 +02:00
|
|
|
|
|
2006-02-14 08:01:29 +01:00
|
|
|
|
static const FT_Frame_Field table_dir_entry_fields[] =
|
2002-07-12 01:41:14 +02:00
|
|
|
|
{
|
|
|
|
|
#undef FT_STRUCTURE
|
|
|
|
|
#define FT_STRUCTURE TT_TableRec
|
|
|
|
|
|
|
|
|
|
FT_FRAME_START( 16 ),
|
|
|
|
|
FT_FRAME_ULONG( Tag ),
|
|
|
|
|
FT_FRAME_ULONG( CheckSum ),
|
|
|
|
|
FT_FRAME_ULONG( Offset ),
|
|
|
|
|
FT_FRAME_ULONG( Length ),
|
|
|
|
|
FT_FRAME_END
|
|
|
|
|
};
|
|
|
|
|
|
2002-07-26 11:09:10 +02:00
|
|
|
|
|
2005-11-20 09:24:24 +01:00
|
|
|
|
if ( FT_STREAM_SEEK( offset ) )
|
2008-08-04 07:45:41 +02:00
|
|
|
|
goto Exit;
|
2002-07-12 01:41:14 +02:00
|
|
|
|
|
2005-11-20 09:24:24 +01:00
|
|
|
|
for ( nn = 0; nn < sfnt->num_tables; nn++ )
|
2002-07-12 01:41:14 +02:00
|
|
|
|
{
|
|
|
|
|
TT_TableRec table;
|
|
|
|
|
|
2002-07-26 11:09:10 +02:00
|
|
|
|
|
2006-02-14 08:01:29 +01:00
|
|
|
|
if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) )
|
2008-08-04 07:45:41 +02:00
|
|
|
|
{
|
|
|
|
|
nn--;
|
|
|
|
|
FT_TRACE2(( "check_table_dir:"
|
|
|
|
|
" can read only %d table%s in font (instead of %d)\n",
|
|
|
|
|
nn, nn == 1 ? "" : "s", sfnt->num_tables ));
|
|
|
|
|
sfnt->num_tables = nn;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2002-07-12 01:41:14 +02:00
|
|
|
|
|
2008-08-04 07:45:41 +02:00
|
|
|
|
/* we ignore invalid tables */
|
2014-11-12 21:26:44 +01:00
|
|
|
|
|
2015-02-07 09:47:23 +01:00
|
|
|
|
if ( table.Offset > stream->size )
|
2015-09-19 12:41:12 +02:00
|
|
|
|
{
|
|
|
|
|
FT_TRACE2(( "check_table_dir: table entry %d invalid\n", nn ));
|
2008-08-04 07:45:41 +02:00
|
|
|
|
continue;
|
2015-09-19 12:41:12 +02:00
|
|
|
|
}
|
2015-02-07 09:47:23 +01:00
|
|
|
|
else if ( table.Length > stream->size - table.Offset )
|
|
|
|
|
{
|
|
|
|
|
/* Some tables have such a simple structure that clipping its */
|
|
|
|
|
/* contents is harmless. This also makes FreeType less sensitive */
|
|
|
|
|
/* to invalid table lengths (which programs like Acroread seem to */
|
|
|
|
|
/* ignore in general). */
|
|
|
|
|
|
|
|
|
|
if ( table.Tag == TTAG_hmtx ||
|
|
|
|
|
table.Tag == TTAG_vmtx )
|
|
|
|
|
valid_entries++;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
FT_TRACE2(( "check_table_dir: table entry %d invalid\n", nn ));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2008-08-04 07:45:41 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
valid_entries++;
|
2002-07-12 01:41:14 +02:00
|
|
|
|
|
2005-11-20 09:24:24 +01:00
|
|
|
|
if ( table.Tag == TTAG_head || table.Tag == TTAG_bhed )
|
2002-07-12 01:41:14 +02:00
|
|
|
|
{
|
|
|
|
|
FT_UInt32 magic;
|
|
|
|
|
|
2006-02-14 08:01:29 +01:00
|
|
|
|
|
2005-11-20 09:24:24 +01:00
|
|
|
|
#ifndef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
|
|
|
|
|
if ( table.Tag == TTAG_head )
|
|
|
|
|
#endif
|
|
|
|
|
has_head = 1;
|
2002-07-12 01:55:18 +02:00
|
|
|
|
|
2005-11-21 13:36:42 +01:00
|
|
|
|
/*
|
|
|
|
|
* The table length should be 0x36, but certain font tools make it
|
|
|
|
|
* 0x38, so we will just check that it is greater.
|
|
|
|
|
*
|
|
|
|
|
* Note that according to the specification, the table must be
|
|
|
|
|
* padded to 32-bit lengths, but this doesn't apply to the value of
|
|
|
|
|
* its `Length' field!
|
2003-04-23 17:50:27 +02:00
|
|
|
|
*
|
|
|
|
|
*/
|
2005-11-20 09:24:24 +01:00
|
|
|
|
if ( table.Length < 0x36 )
|
2008-08-04 07:45:41 +02:00
|
|
|
|
{
|
2013-07-18 12:38:57 +02:00
|
|
|
|
FT_TRACE2(( "check_table_dir:"
|
|
|
|
|
" `head' or `bhed' table too small\n" ));
|
2013-03-14 10:27:35 +01:00
|
|
|
|
error = FT_THROW( Table_Missing );
|
2008-08-04 07:45:41 +02:00
|
|
|
|
goto Exit;
|
|
|
|
|
}
|
* freetype2/src/sfnt/ttload.c (sfnt_dir_check): Modified to allow a
font to have no `head' table if tables `SING' and `META' are
present; this is to support `SING Glyphlet'.
`SING Glyphlet' is an extension to OpenType developed by Adobe
primarily to facilitate adding supplemental glyphs to an OpenType
font (with emphasis on, but not necessariy limited to, gaiji to a
CJK font). A SING Glyphlet Font is an OpenType font that contains
the outline(s), either in a `glyf' or `CFF' table, for a glyph;
`cmap', `BASE', and `GSUB' tables are present with the same format
and functionaliy as a regular OpenType font; there are no `name',
`head', `OS/2', and `post' tables; there are two new tables, `SING'
which contains details about the glyphlet, and `META' which contains
metadata.
Further information on the SING Glyphlet format can be found at:
http://www.adobe.com/products/indesign/sing_gaiji.html
* freetype2/include/freetype/ttags.h (TTAG_SING, TTAG_META): New
macros for the OpenType tables `SING' and `META'. These two tables
are used in SING Glyphlet Format fonts.
2005-09-19 09:07:11 +02:00
|
|
|
|
|
2005-11-20 09:24:24 +01:00
|
|
|
|
if ( FT_STREAM_SEEK( table.Offset + 12 ) ||
|
2005-11-21 13:36:42 +01:00
|
|
|
|
FT_READ_ULONG( magic ) )
|
2008-08-04 07:45:41 +02:00
|
|
|
|
goto Exit;
|
* freetype2/src/sfnt/ttload.c (sfnt_dir_check): Modified to allow a
font to have no `head' table if tables `SING' and `META' are
present; this is to support `SING Glyphlet'.
`SING Glyphlet' is an extension to OpenType developed by Adobe
primarily to facilitate adding supplemental glyphs to an OpenType
font (with emphasis on, but not necessariy limited to, gaiji to a
CJK font). A SING Glyphlet Font is an OpenType font that contains
the outline(s), either in a `glyf' or `CFF' table, for a glyph;
`cmap', `BASE', and `GSUB' tables are present with the same format
and functionaliy as a regular OpenType font; there are no `name',
`head', `OS/2', and `post' tables; there are two new tables, `SING'
which contains details about the glyphlet, and `META' which contains
metadata.
Further information on the SING Glyphlet format can be found at:
http://www.adobe.com/products/indesign/sing_gaiji.html
* freetype2/include/freetype/ttags.h (TTAG_SING, TTAG_META): New
macros for the OpenType tables `SING' and `META'. These two tables
are used in SING Glyphlet Format fonts.
2005-09-19 09:07:11 +02:00
|
|
|
|
|
2005-11-20 09:24:24 +01:00
|
|
|
|
if ( magic != 0x5F0F3CF5UL )
|
2008-08-04 07:45:41 +02:00
|
|
|
|
FT_TRACE2(( "check_table_dir:"
|
2013-07-18 12:38:57 +02:00
|
|
|
|
" invalid magic number in `head' or `bhed' table\n"));
|
2005-11-20 09:24:24 +01:00
|
|
|
|
|
|
|
|
|
if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) )
|
2008-08-04 07:45:41 +02:00
|
|
|
|
goto Exit;
|
2005-11-20 09:24:24 +01:00
|
|
|
|
}
|
* freetype2/src/sfnt/ttload.c (sfnt_dir_check): Modified to allow a
font to have no `head' table if tables `SING' and `META' are
present; this is to support `SING Glyphlet'.
`SING Glyphlet' is an extension to OpenType developed by Adobe
primarily to facilitate adding supplemental glyphs to an OpenType
font (with emphasis on, but not necessariy limited to, gaiji to a
CJK font). A SING Glyphlet Font is an OpenType font that contains
the outline(s), either in a `glyf' or `CFF' table, for a glyph;
`cmap', `BASE', and `GSUB' tables are present with the same format
and functionaliy as a regular OpenType font; there are no `name',
`head', `OS/2', and `post' tables; there are two new tables, `SING'
which contains details about the glyphlet, and `META' which contains
metadata.
Further information on the SING Glyphlet format can be found at:
http://www.adobe.com/products/indesign/sing_gaiji.html
* freetype2/include/freetype/ttags.h (TTAG_SING, TTAG_META): New
macros for the OpenType tables `SING' and `META'. These two tables
are used in SING Glyphlet Format fonts.
2005-09-19 09:07:11 +02:00
|
|
|
|
else if ( table.Tag == TTAG_SING )
|
|
|
|
|
has_sing = 1;
|
|
|
|
|
else if ( table.Tag == TTAG_META )
|
|
|
|
|
has_meta = 1;
|
2002-07-12 01:41:14 +02:00
|
|
|
|
}
|
|
|
|
|
|
2015-09-19 12:41:12 +02:00
|
|
|
|
*valid = valid_entries;
|
2008-08-04 07:45:41 +02:00
|
|
|
|
|
2015-09-19 12:41:12 +02:00
|
|
|
|
if ( !valid_entries )
|
2008-08-04 07:45:41 +02:00
|
|
|
|
{
|
2015-09-19 12:41:12 +02:00
|
|
|
|
FT_TRACE2(( "check_table_dir: no valid tables found\n" ));
|
2013-03-14 10:27:35 +01:00
|
|
|
|
error = FT_THROW( Unknown_File_Format );
|
2008-08-04 07:45:41 +02:00
|
|
|
|
goto Exit;
|
|
|
|
|
}
|
|
|
|
|
|
2005-11-21 13:36:42 +01:00
|
|
|
|
/* if `sing' and `meta' tables are present, there is no `head' table */
|
2005-11-20 09:24:24 +01:00
|
|
|
|
if ( has_head || ( has_sing && has_meta ) )
|
2008-08-04 07:45:41 +02:00
|
|
|
|
{
|
2013-03-14 11:21:17 +01:00
|
|
|
|
error = FT_Err_Ok;
|
2008-08-04 07:45:41 +02:00
|
|
|
|
goto Exit;
|
|
|
|
|
}
|
2005-11-20 09:24:24 +01:00
|
|
|
|
else
|
2008-08-04 07:45:41 +02:00
|
|
|
|
{
|
|
|
|
|
FT_TRACE2(( "check_table_dir:" ));
|
|
|
|
|
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
|
|
|
|
|
FT_TRACE2(( " neither `head', `bhed', nor `sing' table found\n" ));
|
|
|
|
|
#else
|
|
|
|
|
FT_TRACE2(( " neither `head' nor `sing' table found\n" ));
|
|
|
|
|
#endif
|
2013-03-14 10:27:35 +01:00
|
|
|
|
error = FT_THROW( Table_Missing );
|
2008-08-04 07:45:41 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Exit:
|
|
|
|
|
return error;
|
2005-11-20 09:24:24 +01:00
|
|
|
|
}
|
* freetype2/src/sfnt/ttload.c (sfnt_dir_check): Modified to allow a
font to have no `head' table if tables `SING' and `META' are
present; this is to support `SING Glyphlet'.
`SING Glyphlet' is an extension to OpenType developed by Adobe
primarily to facilitate adding supplemental glyphs to an OpenType
font (with emphasis on, but not necessariy limited to, gaiji to a
CJK font). A SING Glyphlet Font is an OpenType font that contains
the outline(s), either in a `glyf' or `CFF' table, for a glyph;
`cmap', `BASE', and `GSUB' tables are present with the same format
and functionaliy as a regular OpenType font; there are no `name',
`head', `OS/2', and `post' tables; there are two new tables, `SING'
which contains details about the glyphlet, and `META' which contains
metadata.
Further information on the SING Glyphlet format can be found at:
http://www.adobe.com/products/indesign/sing_gaiji.html
* freetype2/include/freetype/ttags.h (TTAG_SING, TTAG_META): New
macros for the OpenType tables `SING' and `META'. These two tables
are used in SING Glyphlet Format fonts.
2005-09-19 09:07:11 +02:00
|
|
|
|
|
2002-07-12 01:55:18 +02:00
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/*************************************************************************/
|
|
|
|
|
/* */
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* <Function> */
|
2006-02-14 08:01:29 +01:00
|
|
|
|
/* tt_face_load_font_dir */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Description> */
|
2006-02-14 08:01:29 +01:00
|
|
|
|
/* Loads the header of a SFNT font file. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Input> */
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* face :: A handle to the target face object. */
|
2002-03-31 20:48:24 +02:00
|
|
|
|
/* */
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* stream :: The input stream. */
|
2002-03-31 20:48:24 +02:00
|
|
|
|
/* */
|
2000-01-27 14:56:02 +01:00
|
|
|
|
/* <Output> */
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* sfnt :: The SFNT header. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Return> */
|
2000-06-25 08:47:11 +02:00
|
|
|
|
/* FreeType error code. 0 means success. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Note> */
|
2006-02-14 08:01:29 +01:00
|
|
|
|
/* The stream cursor must be at the beginning of the font directory. */
|
2000-05-29 22:37:41 +02:00
|
|
|
|
/* */
|
2002-03-01 03:26:22 +01:00
|
|
|
|
FT_LOCAL_DEF( FT_Error )
|
2006-02-15 07:05:52 +01:00
|
|
|
|
tt_face_load_font_dir( TT_Face face,
|
|
|
|
|
FT_Stream stream )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
{
|
2006-02-14 08:01:29 +01:00
|
|
|
|
SFNT_HeaderRec sfnt;
|
|
|
|
|
FT_Error error;
|
|
|
|
|
FT_Memory memory = stream->memory;
|
2015-09-19 12:41:12 +02:00
|
|
|
|
FT_UShort nn, valid_entries;
|
2000-06-05 16:32:32 +02:00
|
|
|
|
|
2006-02-14 08:01:29 +01:00
|
|
|
|
static const FT_Frame_Field offset_table_fields[] =
|
2000-06-05 07:26:15 +02:00
|
|
|
|
{
|
2000-07-31 20:59:02 +02:00
|
|
|
|
#undef FT_STRUCTURE
|
2002-03-14 12:26:29 +01:00
|
|
|
|
#define FT_STRUCTURE SFNT_HeaderRec
|
2000-07-31 20:59:02 +02:00
|
|
|
|
|
2000-06-05 07:26:15 +02:00
|
|
|
|
FT_FRAME_START( 8 ),
|
2000-07-31 20:59:02 +02:00
|
|
|
|
FT_FRAME_USHORT( num_tables ),
|
|
|
|
|
FT_FRAME_USHORT( search_range ),
|
|
|
|
|
FT_FRAME_USHORT( entry_selector ),
|
|
|
|
|
FT_FRAME_USHORT( range_shift ),
|
2000-06-05 07:26:15 +02:00
|
|
|
|
FT_FRAME_END
|
|
|
|
|
};
|
2000-06-05 16:32:32 +02:00
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2006-02-14 08:01:29 +01:00
|
|
|
|
FT_TRACE2(( "tt_face_load_font_dir: %08p\n", face ));
|
2000-05-17 01:44:38 +02:00
|
|
|
|
|
2006-02-14 08:01:29 +01:00
|
|
|
|
/* read the offset table */
|
2002-07-12 01:41:14 +02:00
|
|
|
|
|
2006-02-14 08:01:29 +01:00
|
|
|
|
sfnt.offset = FT_STREAM_POS();
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2006-02-14 08:01:29 +01:00
|
|
|
|
if ( FT_READ_ULONG( sfnt.format_tag ) ||
|
|
|
|
|
FT_STREAM_READ_FIELDS( offset_table_fields, &sfnt ) )
|
2008-08-04 07:45:41 +02:00
|
|
|
|
goto Exit;
|
2000-06-05 16:32:32 +02:00
|
|
|
|
|
2005-11-21 04:04:03 +01:00
|
|
|
|
/* many fonts don't have these fields set correctly */
|
|
|
|
|
#if 0
|
2006-02-15 07:05:52 +01:00
|
|
|
|
if ( sfnt.search_range != 1 << ( sfnt.entry_selector + 4 ) ||
|
2006-02-14 08:01:29 +01:00
|
|
|
|
sfnt.search_range + sfnt.range_shift != sfnt.num_tables << 4 )
|
2013-03-14 10:27:35 +01:00
|
|
|
|
return FT_THROW( Unknown_File_Format );
|
2005-11-21 04:04:03 +01:00
|
|
|
|
#endif
|
2004-04-01 22:35:57 +02:00
|
|
|
|
|
2006-02-14 08:01:29 +01:00
|
|
|
|
/* load the table directory */
|
2000-05-29 22:37:41 +02:00
|
|
|
|
|
2008-08-04 07:45:41 +02:00
|
|
|
|
FT_TRACE2(( "-- Number of tables: %10u\n", sfnt.num_tables ));
|
|
|
|
|
FT_TRACE2(( "-- Format version: 0x%08lx\n", sfnt.format_tag ));
|
2000-01-27 14:56:02 +01:00
|
|
|
|
|
2012-10-20 11:42:22 +02:00
|
|
|
|
if ( sfnt.format_tag != TTAG_OTTO )
|
2005-11-21 13:36:42 +01:00
|
|
|
|
{
|
2012-10-20 11:42:22 +02:00
|
|
|
|
/* check first */
|
2015-09-19 12:41:12 +02:00
|
|
|
|
error = check_table_dir( &sfnt, stream, &valid_entries );
|
2012-10-20 11:42:22 +02:00
|
|
|
|
if ( error )
|
|
|
|
|
{
|
|
|
|
|
FT_TRACE2(( "tt_face_load_font_dir:"
|
|
|
|
|
" invalid table directory for TrueType\n" ));
|
|
|
|
|
goto Exit;
|
|
|
|
|
}
|
2005-11-21 04:04:03 +01:00
|
|
|
|
}
|
2015-09-19 12:41:12 +02:00
|
|
|
|
else
|
|
|
|
|
valid_entries = sfnt.num_tables;
|
2005-11-21 04:04:03 +01:00
|
|
|
|
|
2015-09-19 12:41:12 +02:00
|
|
|
|
face->num_tables = valid_entries;
|
2006-02-14 08:01:29 +01:00
|
|
|
|
face->format_tag = sfnt.format_tag;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2004-06-23 17:44:03 +02:00
|
|
|
|
if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) )
|
2008-08-04 07:45:41 +02:00
|
|
|
|
goto Exit;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2015-09-19 12:41:12 +02:00
|
|
|
|
if ( FT_STREAM_SEEK( sfnt.offset + 12 ) ||
|
|
|
|
|
FT_FRAME_ENTER( sfnt.num_tables * 16L ) )
|
2008-08-04 07:45:41 +02:00
|
|
|
|
goto Exit;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2010-11-17 11:47:53 +01:00
|
|
|
|
FT_TRACE2(( "\n"
|
|
|
|
|
" tag offset length checksum\n"
|
|
|
|
|
" ----------------------------------\n" ));
|
|
|
|
|
|
2015-09-19 12:41:12 +02:00
|
|
|
|
valid_entries = 0;
|
2008-08-04 07:45:41 +02:00
|
|
|
|
for ( nn = 0; nn < sfnt.num_tables; nn++ )
|
2006-02-14 08:01:29 +01:00
|
|
|
|
{
|
2015-09-19 12:41:12 +02:00
|
|
|
|
TT_TableRec entry;
|
|
|
|
|
FT_UShort i;
|
|
|
|
|
FT_Bool duplicate;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
entry.Tag = FT_GET_TAG4();
|
|
|
|
|
entry.CheckSum = FT_GET_ULONG();
|
|
|
|
|
entry.Offset = FT_GET_ULONG();
|
|
|
|
|
entry.Length = FT_GET_ULONG();
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2015-02-07 09:47:23 +01:00
|
|
|
|
/* ignore invalid tables that can't be sanitized */
|
2014-11-12 21:26:44 +01:00
|
|
|
|
|
2015-09-19 12:41:12 +02:00
|
|
|
|
if ( entry.Offset > stream->size )
|
2008-08-04 07:45:41 +02:00
|
|
|
|
continue;
|
2015-09-19 12:41:12 +02:00
|
|
|
|
else if ( entry.Length > stream->size - entry.Offset )
|
2015-02-07 09:47:23 +01:00
|
|
|
|
{
|
2015-09-19 12:41:12 +02:00
|
|
|
|
if ( entry.Tag == TTAG_hmtx ||
|
|
|
|
|
entry.Tag == TTAG_vmtx )
|
2015-02-07 09:47:23 +01:00
|
|
|
|
{
|
2015-03-06 05:38:31 +01:00
|
|
|
|
#ifdef FT_DEBUG_LEVEL_TRACE
|
2015-09-19 12:41:12 +02:00
|
|
|
|
FT_ULong old_length = entry.Length;
|
2015-03-06 05:38:31 +01:00
|
|
|
|
#endif
|
2015-02-07 09:47:23 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* make metrics table length a multiple of 4 */
|
2015-09-19 12:41:12 +02:00
|
|
|
|
entry.Length = ( stream->size - entry.Offset ) & ~3U;
|
2015-02-07 09:47:23 +01:00
|
|
|
|
|
|
|
|
|
FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx"
|
2015-09-19 12:41:12 +02:00
|
|
|
|
" (sanitized; original length %08lx)",
|
|
|
|
|
(FT_Char)( entry.Tag >> 24 ),
|
|
|
|
|
(FT_Char)( entry.Tag >> 16 ),
|
|
|
|
|
(FT_Char)( entry.Tag >> 8 ),
|
|
|
|
|
(FT_Char)( entry.Tag ),
|
|
|
|
|
entry.Offset,
|
|
|
|
|
entry.Length,
|
|
|
|
|
entry.CheckSum,
|
2015-02-07 09:47:23 +01:00
|
|
|
|
old_length ));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2015-09-19 12:41:12 +02:00
|
|
|
|
#ifdef FT_DEBUG_LEVEL_TRACE
|
2008-08-04 07:45:41 +02:00
|
|
|
|
else
|
2015-09-19 12:41:12 +02:00
|
|
|
|
FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx",
|
|
|
|
|
(FT_Char)( entry.Tag >> 24 ),
|
|
|
|
|
(FT_Char)( entry.Tag >> 16 ),
|
|
|
|
|
(FT_Char)( entry.Tag >> 8 ),
|
|
|
|
|
(FT_Char)( entry.Tag ),
|
|
|
|
|
entry.Offset,
|
|
|
|
|
entry.Length,
|
|
|
|
|
entry.CheckSum ));
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ignore duplicate tables – the first one wins */
|
|
|
|
|
duplicate = 0;
|
|
|
|
|
for ( i = 0; i < valid_entries; i++ )
|
2008-08-04 07:45:41 +02:00
|
|
|
|
{
|
2015-09-19 12:41:12 +02:00
|
|
|
|
if ( face->dir_tables[i].Tag == entry.Tag )
|
|
|
|
|
{
|
|
|
|
|
duplicate = 1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if ( duplicate )
|
|
|
|
|
{
|
|
|
|
|
FT_TRACE2(( " (duplicate, ignored)\n" ));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
FT_TRACE2(( "\n" ));
|
|
|
|
|
|
|
|
|
|
/* we finally have a valid entry */
|
|
|
|
|
face->dir_tables[valid_entries++] = entry;
|
2008-08-04 07:45:41 +02:00
|
|
|
|
}
|
1999-12-17 00:11:37 +01:00
|
|
|
|
}
|
|
|
|
|
|
2015-09-19 12:41:12 +02:00
|
|
|
|
/* final adjustment to number of tables */
|
|
|
|
|
face->num_tables = valid_entries;
|
|
|
|
|
|
2002-03-20 11:49:31 +01:00
|
|
|
|
FT_FRAME_EXIT();
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2006-02-14 08:01:29 +01:00
|
|
|
|
FT_TRACE2(( "table directory loaded\n\n" ));
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2008-08-04 07:45:41 +02:00
|
|
|
|
Exit:
|
1999-12-17 00:11:37 +01:00
|
|
|
|
return error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
|
/* */
|
|
|
|
|
/* <Function> */
|
* 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_any */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Description> */
|
2000-07-19 04:59:31 +02:00
|
|
|
|
/* Loads any font table into client memory. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Input> */
|
|
|
|
|
/* face :: The face object to look for. */
|
|
|
|
|
/* */
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* tag :: The tag of table to load. Use the value 0 if you want */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* to access the whole font file, else set this parameter */
|
|
|
|
|
/* to a valid TrueType table tag that you can forge with */
|
|
|
|
|
/* the MAKE_TT_TAG macro. */
|
|
|
|
|
/* */
|
|
|
|
|
/* offset :: The starting offset in the table (or the file if */
|
|
|
|
|
/* tag == 0). */
|
|
|
|
|
/* */
|
|
|
|
|
/* length :: The address of the decision variable: */
|
|
|
|
|
/* */
|
|
|
|
|
/* If length == NULL: */
|
|
|
|
|
/* Loads the whole table. Returns an error if */
|
|
|
|
|
/* `offset' == 0! */
|
|
|
|
|
/* */
|
|
|
|
|
/* If *length == 0: */
|
|
|
|
|
/* Exits immediately; returning the length of the given */
|
|
|
|
|
/* table or of the font file, depending on the value of */
|
|
|
|
|
/* `tag'. */
|
|
|
|
|
/* */
|
|
|
|
|
/* If *length != 0: */
|
|
|
|
|
/* Loads the next `length' bytes of table or font, */
|
|
|
|
|
/* starting at offset `offset' (in table or font too). */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Output> */
|
|
|
|
|
/* buffer :: The address of target buffer. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Return> */
|
2000-06-25 08:47:11 +02:00
|
|
|
|
/* FreeType error code. 0 means success. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
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_any( TT_Face face,
|
|
|
|
|
FT_ULong tag,
|
|
|
|
|
FT_Long offset,
|
|
|
|
|
FT_Byte* buffer,
|
|
|
|
|
FT_ULong* length )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
{
|
2000-06-16 21:34:52 +02:00
|
|
|
|
FT_Error error;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
FT_Stream stream;
|
2002-03-14 12:26:29 +01:00
|
|
|
|
TT_Table table;
|
2000-06-16 21:34:52 +02:00
|
|
|
|
FT_ULong size;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2000-06-05 07:26:15 +02:00
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
if ( tag != 0 )
|
|
|
|
|
{
|
|
|
|
|
/* look for tag in font directory */
|
* 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
|
|
|
|
table = tt_face_lookup_table( face, tag );
|
1999-12-17 00:11:37 +01:00
|
|
|
|
if ( !table )
|
|
|
|
|
{
|
2013-03-14 10:27:35 +01:00
|
|
|
|
error = FT_THROW( Table_Missing );
|
1999-12-17 00:11:37 +01:00
|
|
|
|
goto Exit;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
offset += table->Offset;
|
|
|
|
|
size = table->Length;
|
|
|
|
|
}
|
|
|
|
|
else
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* tag == 0 -- the user wants to access the font file directly */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
size = face->root.stream->size;
|
|
|
|
|
|
|
|
|
|
if ( length && *length == 0 )
|
|
|
|
|
{
|
|
|
|
|
*length = size;
|
2000-06-05 07:26:15 +02:00
|
|
|
|
|
2013-03-14 11:21:17 +01:00
|
|
|
|
return FT_Err_Ok;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( length )
|
|
|
|
|
size = *length;
|
|
|
|
|
|
|
|
|
|
stream = face->root.stream;
|
2000-08-01 00:51:00 +02:00
|
|
|
|
/* the `if' is syntactic sugar for picky compilers */
|
2002-03-20 11:49:31 +01:00
|
|
|
|
if ( FT_STREAM_READ_AT( offset, buffer, size ) )
|
2000-08-17 03:09:06 +02:00
|
|
|
|
goto Exit;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
|
Exit:
|
|
|
|
|
return error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
|
/* */
|
|
|
|
|
/* <Function> */
|
* 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_generic_header */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Description> */
|
2000-11-13 08:31:21 +01:00
|
|
|
|
/* Loads the TrueType table `head' or `bhed'. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Input> */
|
|
|
|
|
/* face :: A handle to the target face object. */
|
2002-03-31 20:48:24 +02:00
|
|
|
|
/* */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* stream :: The input stream. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Return> */
|
2000-06-25 08:47:11 +02:00
|
|
|
|
/* FreeType error code. 0 means success. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
2001-06-28 01:25:46 +02:00
|
|
|
|
static 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_generic_header( TT_Face face,
|
2002-09-05 17:10:54 +02:00
|
|
|
|
FT_Stream stream,
|
|
|
|
|
FT_ULong tag )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
{
|
2000-06-16 21:34:52 +02:00
|
|
|
|
FT_Error error;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
TT_Header* header;
|
2000-05-29 22:37:41 +02:00
|
|
|
|
|
2000-06-05 07:26:15 +02:00
|
|
|
|
static const FT_Frame_Field header_fields[] =
|
|
|
|
|
{
|
2000-07-31 20:59:02 +02:00
|
|
|
|
#undef FT_STRUCTURE
|
|
|
|
|
#define FT_STRUCTURE TT_Header
|
|
|
|
|
|
2000-06-05 07:26:15 +02:00
|
|
|
|
FT_FRAME_START( 54 ),
|
2000-07-31 20:59:02 +02:00
|
|
|
|
FT_FRAME_ULONG ( Table_Version ),
|
|
|
|
|
FT_FRAME_ULONG ( Font_Revision ),
|
|
|
|
|
FT_FRAME_LONG ( CheckSum_Adjust ),
|
|
|
|
|
FT_FRAME_LONG ( Magic_Number ),
|
|
|
|
|
FT_FRAME_USHORT( Flags ),
|
|
|
|
|
FT_FRAME_USHORT( Units_Per_EM ),
|
|
|
|
|
FT_FRAME_LONG ( Created[0] ),
|
|
|
|
|
FT_FRAME_LONG ( Created[1] ),
|
|
|
|
|
FT_FRAME_LONG ( Modified[0] ),
|
|
|
|
|
FT_FRAME_LONG ( Modified[1] ),
|
|
|
|
|
FT_FRAME_SHORT ( xMin ),
|
|
|
|
|
FT_FRAME_SHORT ( yMin ),
|
|
|
|
|
FT_FRAME_SHORT ( xMax ),
|
|
|
|
|
FT_FRAME_SHORT ( yMax ),
|
|
|
|
|
FT_FRAME_USHORT( Mac_Style ),
|
|
|
|
|
FT_FRAME_USHORT( Lowest_Rec_PPEM ),
|
|
|
|
|
FT_FRAME_SHORT ( Font_Direction ),
|
|
|
|
|
FT_FRAME_SHORT ( Index_To_Loc_Format ),
|
|
|
|
|
FT_FRAME_SHORT ( Glyph_Data_Format ),
|
2000-06-05 07:26:15 +02:00
|
|
|
|
FT_FRAME_END
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2000-11-07 00:07:51 +01:00
|
|
|
|
error = face->goto_table( face, tag, stream, 0 );
|
1999-12-17 00:11:37 +01:00
|
|
|
|
if ( error )
|
|
|
|
|
goto Exit;
|
|
|
|
|
|
2000-02-13 14:41:56 +01:00
|
|
|
|
header = &face->header;
|
|
|
|
|
|
2002-03-20 11:49:31 +01:00
|
|
|
|
if ( FT_STREAM_READ_FIELDS( header_fields, header ) )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
goto Exit;
|
|
|
|
|
|
* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove
unused `max_points' and `max_contours'.
* src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c
(T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update.
* include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
`max_components'.
* src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused
`loadSize' and `loadStack'.
* src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context),
src/sfnt/ttload.c (tt_face_load_maxp): Update.
* src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c
(sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix
compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not
defined.
* src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix
possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions.
(finally!)
For most OpenType tables, `tt_face_load_xxxx' simply loads the table
and `face->root' is set later in `sfnt_load_face'. Here, we try to
make this work for _all_ tables.
* src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c,
src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and
then exit. Error handling or setting face->root is done later in
`sfnt_load_face'.
Pretty trace messages.
* src/sfnt/sfobjs.c (sfnt_load_face): Work harder.
Mac bitmap-only fonts are not scalable.
Check that `face->header.Units_Per_EM' is not zero.
(LOAD_, LOADM_): Pretty trace messages.
* src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics from
`eblc'.
* src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c
(load_format_20, load_format_25, tt_face_get_ps_name): Use
face->max_profile.numGlyphs, instead of face->root.num_glyphs.
2006-02-15 08:44:31 +01:00
|
|
|
|
FT_TRACE3(( "Units per EM: %4u\n", header->Units_Per_EM ));
|
|
|
|
|
FT_TRACE3(( "IndexToLoc: %4d\n", header->Index_To_Loc_Format ));
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
|
Exit:
|
|
|
|
|
return error;
|
|
|
|
|
}
|
|
|
|
|
|
2000-11-07 07:30:29 +01:00
|
|
|
|
|
2002-03-01 03:26:22 +01:00
|
|
|
|
FT_LOCAL_DEF( FT_Error )
|
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
|
|
|
|
tt_face_load_head( TT_Face face,
|
|
|
|
|
FT_Stream stream )
|
2000-11-07 00:07:51 +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
|
|
|
|
return tt_face_load_generic_header( face, stream, TTAG_head );
|
2000-11-07 00:07:51 +01:00
|
|
|
|
}
|
|
|
|
|
|
2000-11-07 07:30:29 +01:00
|
|
|
|
|
2000-11-07 00:07:51 +01:00
|
|
|
|
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
|
2000-11-07 07:30:29 +01:00
|
|
|
|
|
2002-03-01 03:26:22 +01:00
|
|
|
|
FT_LOCAL_DEF( FT_Error )
|
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
|
|
|
|
tt_face_load_bhed( TT_Face face,
|
|
|
|
|
FT_Stream stream )
|
2000-11-07 00:07:51 +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
|
|
|
|
return tt_face_load_generic_header( face, stream, TTAG_bhed );
|
2000-11-07 00:07:51 +01:00
|
|
|
|
}
|
2000-11-07 07:30:29 +01:00
|
|
|
|
|
|
|
|
|
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
|
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
|
/* */
|
|
|
|
|
/* <Function> */
|
* 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_max_profile */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Description> */
|
|
|
|
|
/* Loads the maximum profile into a face object. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Input> */
|
|
|
|
|
/* face :: A handle to the target face object. */
|
2002-03-31 20:48:24 +02:00
|
|
|
|
/* */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* stream :: The input stream. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Return> */
|
2000-06-25 08:47:11 +02:00
|
|
|
|
/* FreeType error code. 0 means success. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
2002-03-01 03:26:22 +01:00
|
|
|
|
FT_LOCAL_DEF( FT_Error )
|
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
|
|
|
|
tt_face_load_maxp( TT_Face face,
|
|
|
|
|
FT_Stream stream )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
{
|
2000-06-16 21:34:52 +02:00
|
|
|
|
FT_Error error;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
TT_MaxProfile* maxProfile = &face->max_profile;
|
2000-05-29 22:37:41 +02:00
|
|
|
|
|
2012-03-14 18:34:36 +01:00
|
|
|
|
static const FT_Frame_Field maxp_fields[] =
|
2000-06-05 07:26:15 +02:00
|
|
|
|
{
|
2000-07-31 20:59:02 +02:00
|
|
|
|
#undef FT_STRUCTURE
|
|
|
|
|
#define FT_STRUCTURE TT_MaxProfile
|
|
|
|
|
|
2001-07-17 14:37:54 +02:00
|
|
|
|
FT_FRAME_START( 6 ),
|
|
|
|
|
FT_FRAME_LONG ( version ),
|
2000-07-31 20:59:02 +02:00
|
|
|
|
FT_FRAME_USHORT( numGlyphs ),
|
2001-07-17 14:37:54 +02:00
|
|
|
|
FT_FRAME_END
|
|
|
|
|
};
|
|
|
|
|
|
2012-03-14 18:34:36 +01:00
|
|
|
|
static const FT_Frame_Field maxp_fields_extra[] =
|
2001-07-17 14:37:54 +02:00
|
|
|
|
{
|
|
|
|
|
FT_FRAME_START( 26 ),
|
2000-07-31 20:59:02 +02:00
|
|
|
|
FT_FRAME_USHORT( maxPoints ),
|
|
|
|
|
FT_FRAME_USHORT( maxContours ),
|
|
|
|
|
FT_FRAME_USHORT( maxCompositePoints ),
|
|
|
|
|
FT_FRAME_USHORT( maxCompositeContours ),
|
|
|
|
|
FT_FRAME_USHORT( maxZones ),
|
|
|
|
|
FT_FRAME_USHORT( maxTwilightPoints ),
|
|
|
|
|
FT_FRAME_USHORT( maxStorage ),
|
|
|
|
|
FT_FRAME_USHORT( maxFunctionDefs ),
|
|
|
|
|
FT_FRAME_USHORT( maxInstructionDefs ),
|
|
|
|
|
FT_FRAME_USHORT( maxStackElements ),
|
|
|
|
|
FT_FRAME_USHORT( maxSizeOfInstructions ),
|
|
|
|
|
FT_FRAME_USHORT( maxComponentElements ),
|
|
|
|
|
FT_FRAME_USHORT( maxComponentDepth ),
|
2001-07-17 14:37:54 +02:00
|
|
|
|
FT_FRAME_END
|
|
|
|
|
};
|
2000-06-05 07:26:15 +02:00
|
|
|
|
|
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
error = face->goto_table( face, TTAG_maxp, stream, 0 );
|
2000-06-05 07:26:15 +02:00
|
|
|
|
if ( error )
|
|
|
|
|
goto Exit;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2002-03-20 11:49:31 +01:00
|
|
|
|
if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) )
|
2000-06-05 07:26:15 +02:00
|
|
|
|
goto Exit;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2001-07-17 14:37:54 +02:00
|
|
|
|
maxProfile->maxPoints = 0;
|
|
|
|
|
maxProfile->maxContours = 0;
|
|
|
|
|
maxProfile->maxCompositePoints = 0;
|
|
|
|
|
maxProfile->maxCompositeContours = 0;
|
|
|
|
|
maxProfile->maxZones = 0;
|
|
|
|
|
maxProfile->maxTwilightPoints = 0;
|
|
|
|
|
maxProfile->maxStorage = 0;
|
|
|
|
|
maxProfile->maxFunctionDefs = 0;
|
|
|
|
|
maxProfile->maxInstructionDefs = 0;
|
|
|
|
|
maxProfile->maxStackElements = 0;
|
|
|
|
|
maxProfile->maxSizeOfInstructions = 0;
|
|
|
|
|
maxProfile->maxComponentElements = 0;
|
|
|
|
|
maxProfile->maxComponentDepth = 0;
|
|
|
|
|
|
|
|
|
|
if ( maxProfile->version >= 0x10000L )
|
|
|
|
|
{
|
2002-03-20 11:49:31 +01:00
|
|
|
|
if ( FT_STREAM_READ_FIELDS( maxp_fields_extra, maxProfile ) )
|
2001-07-17 14:37:54 +02:00
|
|
|
|
goto Exit;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2001-07-17 14:37:54 +02:00
|
|
|
|
/* XXX: an adjustment that is necessary to load certain */
|
|
|
|
|
/* broken fonts like `Keystrokes MT' :-( */
|
|
|
|
|
/* */
|
|
|
|
|
/* We allocate 64 function entries by default when */
|
2010-10-02 11:46:19 +02:00
|
|
|
|
/* the maxFunctionDefs value is smaller. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2010-10-02 11:46:19 +02:00
|
|
|
|
if ( maxProfile->maxFunctionDefs < 64 )
|
2001-07-17 14:37:54 +02:00
|
|
|
|
maxProfile->maxFunctionDefs = 64;
|
2008-06-09 22:49:29 +02:00
|
|
|
|
|
|
|
|
|
/* we add 4 phantom points later */
|
|
|
|
|
if ( maxProfile->maxTwilightPoints > ( 0xFFFFU - 4 ) )
|
|
|
|
|
{
|
2009-06-26 06:15:41 +02:00
|
|
|
|
FT_TRACE0(( "tt_face_load_maxp:"
|
|
|
|
|
" too much twilight points in `maxp' table;\n"
|
|
|
|
|
" "
|
|
|
|
|
" some glyphs might be rendered incorrectly\n" ));
|
2008-06-09 22:49:29 +02:00
|
|
|
|
|
|
|
|
|
maxProfile->maxTwilightPoints = 0xFFFFU - 4;
|
|
|
|
|
}
|
2010-06-26 09:29:51 +02:00
|
|
|
|
|
|
|
|
|
/* we arbitrarily limit recursion to avoid stack exhaustion */
|
|
|
|
|
if ( maxProfile->maxComponentDepth > 100 )
|
|
|
|
|
{
|
|
|
|
|
FT_TRACE0(( "tt_face_load_maxp:"
|
|
|
|
|
" abnormally large component depth (%d) set to 100\n",
|
|
|
|
|
maxProfile->maxComponentDepth ));
|
|
|
|
|
maxProfile->maxComponentDepth = 100;
|
|
|
|
|
}
|
2001-07-17 14:37:54 +02:00
|
|
|
|
}
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove
unused `max_points' and `max_contours'.
* src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c
(T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update.
* include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
`max_components'.
* src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused
`loadSize' and `loadStack'.
* src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context),
src/sfnt/ttload.c (tt_face_load_maxp): Update.
* src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c
(sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix
compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not
defined.
* src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix
possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions.
(finally!)
For most OpenType tables, `tt_face_load_xxxx' simply loads the table
and `face->root' is set later in `sfnt_load_face'. Here, we try to
make this work for _all_ tables.
* src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c,
src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and
then exit. Error handling or setting face->root is done later in
`sfnt_load_face'.
Pretty trace messages.
* src/sfnt/sfobjs.c (sfnt_load_face): Work harder.
Mac bitmap-only fonts are not scalable.
Check that `face->header.Units_Per_EM' is not zero.
(LOAD_, LOADM_): Pretty trace messages.
* src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics from
`eblc'.
* src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c
(load_format_20, load_format_25, tt_face_get_ps_name): Use
face->max_profile.numGlyphs, instead of face->root.num_glyphs.
2006-02-15 08:44:31 +01:00
|
|
|
|
FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs ));
|
2000-06-05 07:26:15 +02:00
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
Exit:
|
|
|
|
|
return error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
|
/* */
|
|
|
|
|
/* <Function> */
|
2012-03-13 08:52:31 +01:00
|
|
|
|
/* tt_face_load_name */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Description> */
|
|
|
|
|
/* Loads the name records. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Input> */
|
|
|
|
|
/* face :: A handle to the target face object. */
|
2002-03-31 20:48:24 +02:00
|
|
|
|
/* */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* stream :: The input stream. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Return> */
|
2000-06-25 08:47:11 +02:00
|
|
|
|
/* FreeType error code. 0 means success. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
2002-03-01 03:26:22 +01:00
|
|
|
|
FT_LOCAL_DEF( FT_Error )
|
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
|
|
|
|
tt_face_load_name( TT_Face face,
|
|
|
|
|
FT_Stream stream )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
|
FT_Error error;
|
|
|
|
|
FT_Memory memory = stream->memory;
|
|
|
|
|
FT_ULong table_pos, table_len;
|
2002-05-28 01:52:01 +02:00
|
|
|
|
FT_ULong storage_start, storage_limit;
|
|
|
|
|
FT_UInt count;
|
|
|
|
|
TT_NameTable table;
|
2000-05-29 22:37:41 +02:00
|
|
|
|
|
2002-05-28 01:52:01 +02:00
|
|
|
|
static const FT_Frame_Field name_table_fields[] =
|
2000-06-05 07:26:15 +02:00
|
|
|
|
{
|
2000-07-31 20:59:02 +02:00
|
|
|
|
#undef FT_STRUCTURE
|
2002-03-14 12:26:29 +01:00
|
|
|
|
#define FT_STRUCTURE TT_NameTableRec
|
2000-07-31 20:59:02 +02:00
|
|
|
|
|
2000-06-05 07:26:15 +02:00
|
|
|
|
FT_FRAME_START( 6 ),
|
2000-07-31 20:59:02 +02:00
|
|
|
|
FT_FRAME_USHORT( format ),
|
|
|
|
|
FT_FRAME_USHORT( numNameRecords ),
|
|
|
|
|
FT_FRAME_USHORT( storageOffset ),
|
2000-06-05 07:26:15 +02:00
|
|
|
|
FT_FRAME_END
|
|
|
|
|
};
|
|
|
|
|
|
2002-05-28 01:52:01 +02:00
|
|
|
|
static const FT_Frame_Field name_record_fields[] =
|
2000-06-05 07:26:15 +02:00
|
|
|
|
{
|
2000-07-31 20:59:02 +02:00
|
|
|
|
#undef FT_STRUCTURE
|
2002-03-14 12:26:29 +01:00
|
|
|
|
#define FT_STRUCTURE TT_NameEntryRec
|
2000-07-31 20:59:02 +02:00
|
|
|
|
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* no FT_FRAME_START */
|
2000-07-31 20:59:02 +02:00
|
|
|
|
FT_FRAME_USHORT( platformID ),
|
|
|
|
|
FT_FRAME_USHORT( encodingID ),
|
|
|
|
|
FT_FRAME_USHORT( languageID ),
|
|
|
|
|
FT_FRAME_USHORT( nameID ),
|
|
|
|
|
FT_FRAME_USHORT( stringLength ),
|
|
|
|
|
FT_FRAME_USHORT( stringOffset ),
|
2000-06-05 07:26:15 +02:00
|
|
|
|
FT_FRAME_END
|
|
|
|
|
};
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
|
|
2002-05-28 08:03:10 +02:00
|
|
|
|
table = &face->name_table;
|
2002-05-28 01:52:01 +02:00
|
|
|
|
table->stream = stream;
|
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
error = face->goto_table( face, TTAG_name, stream, &table_len );
|
2000-06-05 07:26:15 +02:00
|
|
|
|
if ( error )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
goto Exit;
|
|
|
|
|
|
2002-03-20 11:49:31 +01:00
|
|
|
|
table_pos = FT_STREAM_POS();
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2000-02-13 14:41:56 +01:00
|
|
|
|
|
2002-05-28 01:52:01 +02:00
|
|
|
|
if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) )
|
2000-06-05 07:26:15 +02:00
|
|
|
|
goto Exit;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2003-02-25 21:37:50 +01:00
|
|
|
|
/* Some popular Asian fonts have an invalid `storageOffset' value */
|
2002-05-28 08:03:10 +02:00
|
|
|
|
/* (it should be at least "6 + 12*num_names"). However, the string */
|
|
|
|
|
/* offsets, computed as "storageOffset + entry->stringOffset", are */
|
|
|
|
|
/* valid pointers within the name table... */
|
|
|
|
|
/* */
|
|
|
|
|
/* We thus can't check `storageOffset' right now. */
|
|
|
|
|
/* */
|
2002-05-28 01:52:01 +02:00
|
|
|
|
storage_start = table_pos + 6 + 12*table->numNameRecords;
|
|
|
|
|
storage_limit = table_pos + table_len;
|
|
|
|
|
|
|
|
|
|
if ( storage_start > storage_limit )
|
2002-02-28 00:10:19 +01:00
|
|
|
|
{
|
2009-06-26 06:15:41 +02:00
|
|
|
|
FT_ERROR(( "tt_face_load_name: invalid `name' table\n" ));
|
2013-03-14 10:27:35 +01:00
|
|
|
|
error = FT_THROW( Name_Table_Missing );
|
2002-02-28 00:10:19 +01:00
|
|
|
|
goto Exit;
|
|
|
|
|
}
|
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* Allocate the array of name records. */
|
2002-05-28 01:52:01 +02:00
|
|
|
|
count = table->numNameRecords;
|
|
|
|
|
table->numNameRecords = 0;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2002-05-28 01:52:01 +02:00
|
|
|
|
if ( FT_NEW_ARRAY( table->names, count ) ||
|
|
|
|
|
FT_FRAME_ENTER( count * 12 ) )
|
|
|
|
|
goto Exit;
|
2002-02-28 00:10:19 +01:00
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* Load the name records and determine how much storage is needed */
|
|
|
|
|
/* to hold the strings themselves. */
|
|
|
|
|
{
|
2002-05-28 01:52:01 +02:00
|
|
|
|
TT_NameEntryRec* entry = table->names;
|
2000-06-05 07:26:15 +02:00
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2002-05-28 01:52:01 +02:00
|
|
|
|
for ( ; count > 0; count-- )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
{
|
2002-05-28 01:52:01 +02:00
|
|
|
|
if ( FT_STREAM_READ_FIELDS( name_record_fields, entry ) )
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/* check that the name is not empty */
|
|
|
|
|
if ( entry->stringLength == 0 )
|
|
|
|
|
continue;
|
2000-05-29 22:37:41 +02:00
|
|
|
|
|
2002-05-28 01:52:01 +02:00
|
|
|
|
/* check that the name string is within the table */
|
|
|
|
|
entry->stringOffset += table_pos + table->storageOffset;
|
|
|
|
|
if ( entry->stringOffset < storage_start ||
|
|
|
|
|
entry->stringOffset + entry->stringLength > storage_limit )
|
2002-03-05 17:12:57 +01:00
|
|
|
|
{
|
2002-05-28 01:52:01 +02:00
|
|
|
|
/* invalid entry - ignore it */
|
|
|
|
|
entry->stringOffset = 0;
|
|
|
|
|
entry->stringLength = 0;
|
|
|
|
|
continue;
|
2002-03-05 17:12:57 +01:00
|
|
|
|
}
|
2002-05-28 01:52:01 +02:00
|
|
|
|
|
|
|
|
|
entry++;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
}
|
2002-05-28 01:52:01 +02:00
|
|
|
|
|
2002-09-28 18:40:57 +02:00
|
|
|
|
table->numNameRecords = (FT_UInt)( entry - table->names );
|
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
|
|
|
|
|
2000-07-12 18:57:37 +02:00
|
|
|
|
/* everything went well, update face->num_names */
|
2002-06-11 22:35:58 +02:00
|
|
|
|
face->num_names = (FT_UShort) table->numNameRecords;
|
2000-07-12 18:57:37 +02:00
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
Exit:
|
|
|
|
|
return error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
|
/* */
|
|
|
|
|
/* <Function> */
|
* 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_free_names */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Description> */
|
|
|
|
|
/* Frees the name records. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Input> */
|
|
|
|
|
/* face :: A handle to the target face object. */
|
|
|
|
|
/* */
|
2002-03-01 03:26:22 +01:00
|
|
|
|
FT_LOCAL_DEF( void )
|
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
|
|
|
|
tt_face_free_name( TT_Face face )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
|
FT_Memory memory = face->root.driver->root.memory;
|
2002-05-28 01:52:01 +02:00
|
|
|
|
TT_NameTable table = &face->name_table;
|
|
|
|
|
TT_NameEntry entry = table->names;
|
|
|
|
|
FT_UInt count = table->numNameRecords;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
|
|
2004-05-03 23:31:43 +02:00
|
|
|
|
if ( table->names )
|
2002-05-28 01:52:01 +02:00
|
|
|
|
{
|
2004-05-03 23:31:43 +02:00
|
|
|
|
for ( ; count > 0; count--, entry++ )
|
|
|
|
|
{
|
|
|
|
|
FT_FREE( entry->string );
|
|
|
|
|
entry->stringLength = 0;
|
|
|
|
|
}
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2004-05-03 23:31:43 +02:00
|
|
|
|
/* free strings table */
|
|
|
|
|
FT_FREE( table->names );
|
|
|
|
|
}
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2002-05-28 01:52:01 +02:00
|
|
|
|
table->numNameRecords = 0;
|
|
|
|
|
table->format = 0;
|
|
|
|
|
table->storageOffset = 0;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
|
/* */
|
|
|
|
|
/* <Function> */
|
* 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_cmap */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Description> */
|
2007-01-26 23:18:56 +01:00
|
|
|
|
/* Loads the cmap directory in a face object. The cmaps themselves */
|
|
|
|
|
/* are loaded on demand in the `ttcmap.c' module. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Input> */
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* face :: A handle to the target face object. */
|
2002-03-31 20:48:24 +02:00
|
|
|
|
/* */
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* stream :: A handle to the input stream. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Return> */
|
2000-06-25 08:47:11 +02:00
|
|
|
|
/* FreeType error code. 0 means success. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
2002-03-22 16:02:38 +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_cmap( TT_Face face,
|
|
|
|
|
FT_Stream stream )
|
2002-03-22 16:02:38 +01:00
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
|
FT_Error error;
|
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
|
|
|
|
|
|
error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size );
|
|
|
|
|
if ( error )
|
|
|
|
|
goto Exit;
|
2002-05-28 01:52:01 +02:00
|
|
|
|
|
* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove
unused `max_points' and `max_contours'.
* src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c
(T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update.
* include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
`max_components'.
* src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused
`loadSize' and `loadStack'.
* src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context),
src/sfnt/ttload.c (tt_face_load_maxp): Update.
* src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c
(sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix
compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not
defined.
* src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix
possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions.
(finally!)
For most OpenType tables, `tt_face_load_xxxx' simply loads the table
and `face->root' is set later in `sfnt_load_face'. Here, we try to
make this work for _all_ tables.
* src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c,
src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and
then exit. Error handling or setting face->root is done later in
`sfnt_load_face'.
Pretty trace messages.
* src/sfnt/sfobjs.c (sfnt_load_face): Work harder.
Mac bitmap-only fonts are not scalable.
Check that `face->header.Units_Per_EM' is not zero.
(LOAD_, LOADM_): Pretty trace messages.
* src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics from
`eblc'.
* src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c
(load_format_20, load_format_25, tt_face_get_ps_name): Use
face->max_profile.numGlyphs, instead of face->root.num_glyphs.
2006-02-15 08:44:31 +01:00
|
|
|
|
if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) )
|
2002-03-22 16:02:38 +01:00
|
|
|
|
face->cmap_size = 0;
|
2002-05-28 01:52:01 +02:00
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
|
Exit:
|
|
|
|
|
return error;
|
|
|
|
|
}
|
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/*************************************************************************/
|
|
|
|
|
/* */
|
|
|
|
|
/* <Function> */
|
* 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_os2 */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Description> */
|
|
|
|
|
/* Loads the OS2 table. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Input> */
|
|
|
|
|
/* face :: A handle to the target face object. */
|
2002-03-31 20:48:24 +02:00
|
|
|
|
/* */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* stream :: A handle to the input stream. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Return> */
|
2000-06-25 08:47:11 +02:00
|
|
|
|
/* FreeType error code. 0 means success. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
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_os2( TT_Face face,
|
|
|
|
|
FT_Stream stream )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
{
|
2000-06-16 21:34:52 +02:00
|
|
|
|
FT_Error error;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
TT_OS2* os2;
|
2000-05-29 22:37:41 +02:00
|
|
|
|
|
2012-03-14 18:34:36 +01:00
|
|
|
|
static const FT_Frame_Field os2_fields[] =
|
2001-07-17 14:37:54 +02:00
|
|
|
|
{
|
2000-07-31 20:59:02 +02:00
|
|
|
|
#undef FT_STRUCTURE
|
|
|
|
|
#define FT_STRUCTURE TT_OS2
|
|
|
|
|
|
2000-06-05 07:26:15 +02:00
|
|
|
|
FT_FRAME_START( 78 ),
|
2000-07-31 20:59:02 +02:00
|
|
|
|
FT_FRAME_USHORT( version ),
|
|
|
|
|
FT_FRAME_SHORT ( xAvgCharWidth ),
|
|
|
|
|
FT_FRAME_USHORT( usWeightClass ),
|
|
|
|
|
FT_FRAME_USHORT( usWidthClass ),
|
|
|
|
|
FT_FRAME_SHORT ( fsType ),
|
|
|
|
|
FT_FRAME_SHORT ( ySubscriptXSize ),
|
|
|
|
|
FT_FRAME_SHORT ( ySubscriptYSize ),
|
|
|
|
|
FT_FRAME_SHORT ( ySubscriptXOffset ),
|
|
|
|
|
FT_FRAME_SHORT ( ySubscriptYOffset ),
|
|
|
|
|
FT_FRAME_SHORT ( ySuperscriptXSize ),
|
|
|
|
|
FT_FRAME_SHORT ( ySuperscriptYSize ),
|
|
|
|
|
FT_FRAME_SHORT ( ySuperscriptXOffset ),
|
|
|
|
|
FT_FRAME_SHORT ( ySuperscriptYOffset ),
|
|
|
|
|
FT_FRAME_SHORT ( yStrikeoutSize ),
|
|
|
|
|
FT_FRAME_SHORT ( yStrikeoutPosition ),
|
|
|
|
|
FT_FRAME_SHORT ( sFamilyClass ),
|
|
|
|
|
FT_FRAME_BYTE ( panose[0] ),
|
|
|
|
|
FT_FRAME_BYTE ( panose[1] ),
|
|
|
|
|
FT_FRAME_BYTE ( panose[2] ),
|
|
|
|
|
FT_FRAME_BYTE ( panose[3] ),
|
|
|
|
|
FT_FRAME_BYTE ( panose[4] ),
|
|
|
|
|
FT_FRAME_BYTE ( panose[5] ),
|
|
|
|
|
FT_FRAME_BYTE ( panose[6] ),
|
|
|
|
|
FT_FRAME_BYTE ( panose[7] ),
|
|
|
|
|
FT_FRAME_BYTE ( panose[8] ),
|
|
|
|
|
FT_FRAME_BYTE ( panose[9] ),
|
|
|
|
|
FT_FRAME_ULONG ( ulUnicodeRange1 ),
|
|
|
|
|
FT_FRAME_ULONG ( ulUnicodeRange2 ),
|
|
|
|
|
FT_FRAME_ULONG ( ulUnicodeRange3 ),
|
|
|
|
|
FT_FRAME_ULONG ( ulUnicodeRange4 ),
|
|
|
|
|
FT_FRAME_BYTE ( achVendID[0] ),
|
|
|
|
|
FT_FRAME_BYTE ( achVendID[1] ),
|
|
|
|
|
FT_FRAME_BYTE ( achVendID[2] ),
|
|
|
|
|
FT_FRAME_BYTE ( achVendID[3] ),
|
|
|
|
|
|
|
|
|
|
FT_FRAME_USHORT( fsSelection ),
|
|
|
|
|
FT_FRAME_USHORT( usFirstCharIndex ),
|
|
|
|
|
FT_FRAME_USHORT( usLastCharIndex ),
|
|
|
|
|
FT_FRAME_SHORT ( sTypoAscender ),
|
|
|
|
|
FT_FRAME_SHORT ( sTypoDescender ),
|
|
|
|
|
FT_FRAME_SHORT ( sTypoLineGap ),
|
|
|
|
|
FT_FRAME_USHORT( usWinAscent ),
|
|
|
|
|
FT_FRAME_USHORT( usWinDescent ),
|
2000-06-05 07:26:15 +02:00
|
|
|
|
FT_FRAME_END
|
|
|
|
|
};
|
|
|
|
|
|
2013-10-27 07:25:35 +01:00
|
|
|
|
/* `OS/2' version 1 and newer */
|
|
|
|
|
static const FT_Frame_Field os2_fields_extra1[] =
|
2000-06-05 07:26:15 +02:00
|
|
|
|
{
|
|
|
|
|
FT_FRAME_START( 8 ),
|
2000-07-31 20:59:02 +02:00
|
|
|
|
FT_FRAME_ULONG( ulCodePageRange1 ),
|
|
|
|
|
FT_FRAME_ULONG( ulCodePageRange2 ),
|
2000-06-05 07:26:15 +02:00
|
|
|
|
FT_FRAME_END
|
|
|
|
|
};
|
|
|
|
|
|
2013-10-27 07:25:35 +01:00
|
|
|
|
/* `OS/2' version 2 and newer */
|
2012-03-14 18:34:36 +01:00
|
|
|
|
static const FT_Frame_Field os2_fields_extra2[] =
|
2000-06-05 07:26:15 +02:00
|
|
|
|
{
|
|
|
|
|
FT_FRAME_START( 10 ),
|
2000-07-31 20:59:02 +02:00
|
|
|
|
FT_FRAME_SHORT ( sxHeight ),
|
|
|
|
|
FT_FRAME_SHORT ( sCapHeight ),
|
|
|
|
|
FT_FRAME_USHORT( usDefaultChar ),
|
|
|
|
|
FT_FRAME_USHORT( usBreakChar ),
|
|
|
|
|
FT_FRAME_USHORT( usMaxContext ),
|
2000-06-05 07:26:15 +02:00
|
|
|
|
FT_FRAME_END
|
|
|
|
|
};
|
|
|
|
|
|
2013-10-27 07:25:35 +01:00
|
|
|
|
/* `OS/2' version 5 and newer */
|
|
|
|
|
static const FT_Frame_Field os2_fields_extra5[] =
|
|
|
|
|
{
|
|
|
|
|
FT_FRAME_START( 4 ),
|
2013-11-16 07:52:20 +01:00
|
|
|
|
FT_FRAME_USHORT( usLowerOpticalPointSize ),
|
|
|
|
|
FT_FRAME_USHORT( usUpperOpticalPointSize ),
|
2013-10-27 07:25:35 +01:00
|
|
|
|
FT_FRAME_END
|
|
|
|
|
};
|
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
|
/* We now support old Mac fonts where the OS/2 table doesn't */
|
|
|
|
|
/* exist. Simply put, we set the `version' field to 0xFFFF */
|
|
|
|
|
/* and test this value each time we need to access the table. */
|
|
|
|
|
error = face->goto_table( face, TTAG_OS2, stream, 0 );
|
2000-06-05 07:26:15 +02:00
|
|
|
|
if ( error )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
goto Exit;
|
|
|
|
|
|
2000-02-13 14:41:56 +01:00
|
|
|
|
os2 = &face->os2;
|
|
|
|
|
|
2002-03-20 11:49:31 +01:00
|
|
|
|
if ( FT_STREAM_READ_FIELDS( os2_fields, os2 ) )
|
2000-06-05 07:26:15 +02:00
|
|
|
|
goto Exit;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2013-11-16 07:52:20 +01:00
|
|
|
|
os2->ulCodePageRange1 = 0;
|
|
|
|
|
os2->ulCodePageRange2 = 0;
|
|
|
|
|
os2->sxHeight = 0;
|
|
|
|
|
os2->sCapHeight = 0;
|
|
|
|
|
os2->usDefaultChar = 0;
|
|
|
|
|
os2->usBreakChar = 0;
|
|
|
|
|
os2->usMaxContext = 0;
|
|
|
|
|
os2->usLowerOpticalPointSize = 0;
|
|
|
|
|
os2->usUpperOpticalPointSize = 0xFFFF;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
|
if ( os2->version >= 0x0001 )
|
|
|
|
|
{
|
|
|
|
|
/* only version 1 tables */
|
2013-10-27 07:25:35 +01:00
|
|
|
|
if ( FT_STREAM_READ_FIELDS( os2_fields_extra1, os2 ) )
|
2000-06-05 07:26:15 +02:00
|
|
|
|
goto Exit;
|
2000-05-02 13:01:49 +02:00
|
|
|
|
|
|
|
|
|
if ( os2->version >= 0x0002 )
|
|
|
|
|
{
|
|
|
|
|
/* only version 2 tables */
|
2002-03-20 11:49:31 +01:00
|
|
|
|
if ( FT_STREAM_READ_FIELDS( os2_fields_extra2, os2 ) )
|
2000-06-05 07:26:15 +02:00
|
|
|
|
goto Exit;
|
2013-10-27 07:25:35 +01:00
|
|
|
|
|
|
|
|
|
if ( os2->version >= 0x0005 )
|
|
|
|
|
{
|
|
|
|
|
/* only version 5 tables */
|
|
|
|
|
if ( FT_STREAM_READ_FIELDS( os2_fields_extra5, os2 ) )
|
|
|
|
|
goto Exit;
|
|
|
|
|
}
|
2000-05-02 13:01:49 +02:00
|
|
|
|
}
|
1999-12-17 00:11:37 +01:00
|
|
|
|
}
|
|
|
|
|
|
* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove
unused `max_points' and `max_contours'.
* src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c
(T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update.
* include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
`max_components'.
* src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused
`loadSize' and `loadStack'.
* src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context),
src/sfnt/ttload.c (tt_face_load_maxp): Update.
* src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c
(sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix
compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not
defined.
* src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix
possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions.
(finally!)
For most OpenType tables, `tt_face_load_xxxx' simply loads the table
and `face->root' is set later in `sfnt_load_face'. Here, we try to
make this work for _all_ tables.
* src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c,
src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and
then exit. Error handling or setting face->root is done later in
`sfnt_load_face'.
Pretty trace messages.
* src/sfnt/sfobjs.c (sfnt_load_face): Work harder.
Mac bitmap-only fonts are not scalable.
Check that `face->header.Units_Per_EM' is not zero.
(LOAD_, LOADM_): Pretty trace messages.
* src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics from
`eblc'.
* src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c
(load_format_20, load_format_25, tt_face_get_ps_name): Use
face->max_profile.numGlyphs, instead of face->root.num_glyphs.
2006-02-15 08:44:31 +01:00
|
|
|
|
FT_TRACE3(( "sTypoAscender: %4d\n", os2->sTypoAscender ));
|
|
|
|
|
FT_TRACE3(( "sTypoDescender: %4d\n", os2->sTypoDescender ));
|
|
|
|
|
FT_TRACE3(( "usWinAscent: %4u\n", os2->usWinAscent ));
|
|
|
|
|
FT_TRACE3(( "usWinDescent: %4u\n", os2->usWinDescent ));
|
|
|
|
|
FT_TRACE3(( "fsSelection: 0x%2x\n", os2->fsSelection ));
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
|
Exit:
|
|
|
|
|
return error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
|
/* */
|
|
|
|
|
/* <Function> */
|
* 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_postscript */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Description> */
|
|
|
|
|
/* Loads the Postscript table. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Input> */
|
|
|
|
|
/* face :: A handle to the target face object. */
|
2002-03-31 20:48:24 +02:00
|
|
|
|
/* */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* stream :: A handle to the input stream. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Return> */
|
2000-06-25 08:47:11 +02:00
|
|
|
|
/* FreeType error code. 0 means success. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
2002-03-01 03:26:22 +01:00
|
|
|
|
FT_LOCAL_DEF( FT_Error )
|
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
|
|
|
|
tt_face_load_post( TT_Face face,
|
|
|
|
|
FT_Stream stream )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
{
|
2000-06-16 21:34:52 +02:00
|
|
|
|
FT_Error error;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
TT_Postscript* post = &face->postscript;
|
2000-05-29 22:37:41 +02:00
|
|
|
|
|
2000-06-05 07:26:15 +02:00
|
|
|
|
static const FT_Frame_Field post_fields[] =
|
|
|
|
|
{
|
2000-07-31 20:59:02 +02:00
|
|
|
|
#undef FT_STRUCTURE
|
|
|
|
|
#define FT_STRUCTURE TT_Postscript
|
|
|
|
|
|
2000-06-05 07:26:15 +02:00
|
|
|
|
FT_FRAME_START( 32 ),
|
2000-07-31 20:59:02 +02:00
|
|
|
|
FT_FRAME_ULONG( FormatType ),
|
|
|
|
|
FT_FRAME_ULONG( italicAngle ),
|
|
|
|
|
FT_FRAME_SHORT( underlinePosition ),
|
|
|
|
|
FT_FRAME_SHORT( underlineThickness ),
|
|
|
|
|
FT_FRAME_ULONG( isFixedPitch ),
|
|
|
|
|
FT_FRAME_ULONG( minMemType42 ),
|
|
|
|
|
FT_FRAME_ULONG( maxMemType42 ),
|
|
|
|
|
FT_FRAME_ULONG( minMemType1 ),
|
|
|
|
|
FT_FRAME_ULONG( maxMemType1 ),
|
2000-06-05 07:26:15 +02:00
|
|
|
|
FT_FRAME_END
|
|
|
|
|
};
|
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
|
error = face->goto_table( face, TTAG_post, stream, 0 );
|
2000-06-05 07:26:15 +02:00
|
|
|
|
if ( error )
|
* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove
unused `max_points' and `max_contours'.
* src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c
(T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update.
* include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
`max_components'.
* src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused
`loadSize' and `loadStack'.
* src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context),
src/sfnt/ttload.c (tt_face_load_maxp): Update.
* src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c
(sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix
compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not
defined.
* src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix
possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions.
(finally!)
For most OpenType tables, `tt_face_load_xxxx' simply loads the table
and `face->root' is set later in `sfnt_load_face'. Here, we try to
make this work for _all_ tables.
* src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c,
src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and
then exit. Error handling or setting face->root is done later in
`sfnt_load_face'.
Pretty trace messages.
* src/sfnt/sfobjs.c (sfnt_load_face): Work harder.
Mac bitmap-only fonts are not scalable.
Check that `face->header.Units_Per_EM' is not zero.
(LOAD_, LOADM_): Pretty trace messages.
* src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics from
`eblc'.
* src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c
(load_format_20, load_format_25, tt_face_get_ps_name): Use
face->max_profile.numGlyphs, instead of face->root.num_glyphs.
2006-02-15 08:44:31 +01:00
|
|
|
|
return error;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2002-03-20 11:49:31 +01:00
|
|
|
|
if ( FT_STREAM_READ_FIELDS( post_fields, post ) )
|
2000-06-05 07:26:15 +02:00
|
|
|
|
return error;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
|
/* we don't load the glyph names, we do that in another */
|
|
|
|
|
/* module (ttpost). */
|
* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove
unused `max_points' and `max_contours'.
* src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c
(T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update.
* include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
`max_components'.
* src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused
`loadSize' and `loadStack'.
* src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context),
src/sfnt/ttload.c (tt_face_load_maxp): Update.
* src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c
(sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix
compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not
defined.
* src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix
possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions.
(finally!)
For most OpenType tables, `tt_face_load_xxxx' simply loads the table
and `face->root' is set later in `sfnt_load_face'. Here, we try to
make this work for _all_ tables.
* src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c,
src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and
then exit. Error handling or setting face->root is done later in
`sfnt_load_face'.
Pretty trace messages.
* src/sfnt/sfobjs.c (sfnt_load_face): Work harder.
Mac bitmap-only fonts are not scalable.
Check that `face->header.Units_Per_EM' is not zero.
(LOAD_, LOADM_): Pretty trace messages.
* src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics from
`eblc'.
* src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c
(load_format_20, load_format_25, tt_face_get_ps_name): Use
face->max_profile.numGlyphs, instead of face->root.num_glyphs.
2006-02-15 08:44:31 +01:00
|
|
|
|
|
|
|
|
|
FT_TRACE3(( "FormatType: 0x%x\n", post->FormatType ));
|
|
|
|
|
FT_TRACE3(( "isFixedPitch: %s\n", post->isFixedPitch
|
|
|
|
|
? " yes" : " no" ));
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2013-03-14 11:21:17 +01:00
|
|
|
|
return FT_Err_Ok;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2000-05-18 18:18:05 +02:00
|
|
|
|
/*************************************************************************/
|
|
|
|
|
/* */
|
|
|
|
|
/* <Function> */
|
* 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_pclt */
|
2000-05-18 18:18:05 +02:00
|
|
|
|
/* */
|
|
|
|
|
/* <Description> */
|
|
|
|
|
/* Loads the PCL 5 Table. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Input> */
|
|
|
|
|
/* face :: A handle to the target face object. */
|
2002-03-31 20:48:24 +02:00
|
|
|
|
/* */
|
2000-05-18 18:18:05 +02:00
|
|
|
|
/* stream :: A handle to the input stream. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Return> */
|
2000-06-25 08:47:11 +02:00
|
|
|
|
/* FreeType error code. 0 means success. */
|
2000-05-18 18:18:05 +02:00
|
|
|
|
/* */
|
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_pclt( TT_Face face,
|
|
|
|
|
FT_Stream stream )
|
2000-05-18 18:18:05 +02:00
|
|
|
|
{
|
2000-06-05 07:26:15 +02:00
|
|
|
|
static const FT_Frame_Field pclt_fields[] =
|
|
|
|
|
{
|
2000-07-31 20:59:02 +02:00
|
|
|
|
#undef FT_STRUCTURE
|
|
|
|
|
#define FT_STRUCTURE TT_PCLT
|
|
|
|
|
|
2000-07-03 17:00:49 +02:00
|
|
|
|
FT_FRAME_START( 54 ),
|
2000-07-31 20:59:02 +02:00
|
|
|
|
FT_FRAME_ULONG ( Version ),
|
|
|
|
|
FT_FRAME_ULONG ( FontNumber ),
|
|
|
|
|
FT_FRAME_USHORT( Pitch ),
|
|
|
|
|
FT_FRAME_USHORT( xHeight ),
|
|
|
|
|
FT_FRAME_USHORT( Style ),
|
|
|
|
|
FT_FRAME_USHORT( TypeFamily ),
|
|
|
|
|
FT_FRAME_USHORT( CapHeight ),
|
2013-10-02 22:04:07 +02:00
|
|
|
|
FT_FRAME_USHORT( SymbolSet ),
|
2000-07-31 20:59:02 +02:00
|
|
|
|
FT_FRAME_BYTES ( TypeFace, 16 ),
|
|
|
|
|
FT_FRAME_BYTES ( CharacterComplement, 8 ),
|
|
|
|
|
FT_FRAME_BYTES ( FileName, 6 ),
|
|
|
|
|
FT_FRAME_CHAR ( StrokeWeight ),
|
|
|
|
|
FT_FRAME_CHAR ( WidthType ),
|
|
|
|
|
FT_FRAME_BYTE ( SerifStyle ),
|
|
|
|
|
FT_FRAME_BYTE ( Reserved ),
|
2000-06-05 07:26:15 +02:00
|
|
|
|
FT_FRAME_END
|
|
|
|
|
};
|
2000-06-05 16:32:32 +02:00
|
|
|
|
|
2000-06-16 21:34:52 +02:00
|
|
|
|
FT_Error error;
|
2000-06-05 07:26:15 +02:00
|
|
|
|
TT_PCLT* pclt = &face->pclt;
|
|
|
|
|
|
2000-06-05 16:32:32 +02:00
|
|
|
|
|
2000-06-05 07:26:15 +02:00
|
|
|
|
/* optional table */
|
|
|
|
|
error = face->goto_table( face, TTAG_PCLT, stream, 0 );
|
|
|
|
|
if ( error )
|
* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove
unused `max_points' and `max_contours'.
* src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c
(T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update.
* include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
`max_components'.
* src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused
`loadSize' and `loadStack'.
* src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context),
src/sfnt/ttload.c (tt_face_load_maxp): Update.
* src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c
(sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix
compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not
defined.
* src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix
possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions.
(finally!)
For most OpenType tables, `tt_face_load_xxxx' simply loads the table
and `face->root' is set later in `sfnt_load_face'. Here, we try to
make this work for _all_ tables.
* src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c,
src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and
then exit. Error handling or setting face->root is done later in
`sfnt_load_face'.
Pretty trace messages.
* src/sfnt/sfobjs.c (sfnt_load_face): Work harder.
Mac bitmap-only fonts are not scalable.
Check that `face->header.Units_Per_EM' is not zero.
(LOAD_, LOADM_): Pretty trace messages.
* src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics from
`eblc'.
* src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c
(load_format_20, load_format_25, tt_face_get_ps_name): Use
face->max_profile.numGlyphs, instead of face->root.num_glyphs.
2006-02-15 08:44:31 +01:00
|
|
|
|
goto Exit;
|
2000-06-05 16:32:32 +02:00
|
|
|
|
|
2002-03-20 11:49:31 +01:00
|
|
|
|
if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) )
|
2000-05-18 18:18:05 +02:00
|
|
|
|
goto Exit;
|
2000-06-05 16:32:32 +02:00
|
|
|
|
|
|
|
|
|
Exit:
|
2000-06-05 07:26:15 +02:00
|
|
|
|
return error;
|
|
|
|
|
}
|
|
|
|
|
|
2000-05-18 18:18:05 +02:00
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/*************************************************************************/
|
|
|
|
|
/* */
|
|
|
|
|
/* <Function> */
|
* 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_gasp */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Description> */
|
2000-07-02 02:27:53 +02:00
|
|
|
|
/* Loads the `gasp' table into a face object. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
|
|
|
|
/* <Input> */
|
|
|
|
|
/* face :: A handle to the target face object. */
|
2002-03-31 20:48:24 +02:00
|
|
|
|
/* */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* stream :: The input stream. */
|
|
|
|
|
/* */
|
|
|
|
|
/* <Return> */
|
2000-06-25 08:47:11 +02:00
|
|
|
|
/* FreeType error code. 0 means success. */
|
1999-12-17 00:11:37 +01:00
|
|
|
|
/* */
|
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_gasp( TT_Face face,
|
|
|
|
|
FT_Stream stream )
|
1999-12-17 00:11:37 +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_UInt j,num_ranges;
|
2011-06-14 19:48:33 +02:00
|
|
|
|
TT_GaspRange gaspranges = NULL;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* the gasp table is optional */
|
|
|
|
|
error = face->goto_table( face, TTAG_gasp, stream, 0 );
|
2000-06-05 07:26:15 +02:00
|
|
|
|
if ( error )
|
* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove
unused `max_points' and `max_contours'.
* src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c
(T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update.
* include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
`max_components'.
* src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused
`loadSize' and `loadStack'.
* src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context),
src/sfnt/ttload.c (tt_face_load_maxp): Update.
* src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c
(sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix
compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not
defined.
* src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix
possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions.
(finally!)
For most OpenType tables, `tt_face_load_xxxx' simply loads the table
and `face->root' is set later in `sfnt_load_face'. Here, we try to
make this work for _all_ tables.
* src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c,
src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and
then exit. Error handling or setting face->root is done later in
`sfnt_load_face'.
Pretty trace messages.
* src/sfnt/sfobjs.c (sfnt_load_face): Work harder.
Mac bitmap-only fonts are not scalable.
Check that `face->header.Units_Per_EM' is not zero.
(LOAD_, LOADM_): Pretty trace messages.
* src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics from
`eblc'.
* src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c
(load_format_20, load_format_25, tt_face_get_ps_name): Use
face->max_profile.numGlyphs, instead of face->root.num_glyphs.
2006-02-15 08:44:31 +01:00
|
|
|
|
goto Exit;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2002-03-20 11:49:31 +01:00
|
|
|
|
if ( FT_FRAME_ENTER( 4L ) )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
goto Exit;
|
|
|
|
|
|
* include/freetype/internal/ftstream.h,
src/base/ftstream.c, src/cff/cffload.c, src/pcf/pcfread.c,
src/sfnt/ttcmap.c, src/sfnt/ttcmap0.c, src/sfnt/ttload.c,
src/sfnt/ttpost.c, src/sfnt/ttsbit.c,
src/truetype/ttgload.c, src/truetype/ttpload.c,
src/winfonts/winfnt.c:
changed the definitions of stream macros. Examples:
NEXT_Byte => FT_NEXT_BYTE
NEXT_Short => FT_NEXT_SHORT
NEXT_UShortLE => FT_NEXT_USHORT_LE
READ_Short => FT_READ_SHORT
GET_Long => FT_GET_LONG
etc..
also introduced the FT_PEEK_XXXX functions..
2002-03-22 13:55:23 +01:00
|
|
|
|
face->gasp.version = FT_GET_USHORT();
|
|
|
|
|
face->gasp.numRanges = FT_GET_USHORT();
|
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
|
|
|
|
|
2007-01-08 16:15:32 +01:00
|
|
|
|
/* only support versions 0 and 1 of the table */
|
|
|
|
|
if ( face->gasp.version >= 2 )
|
|
|
|
|
{
|
|
|
|
|
face->gasp.numRanges = 0;
|
2013-03-14 10:27:35 +01:00
|
|
|
|
error = FT_THROW( Invalid_Table );
|
2007-01-08 16:15:32 +01:00
|
|
|
|
goto Exit;
|
|
|
|
|
}
|
|
|
|
|
|
1999-12-17 00:11:37 +01:00
|
|
|
|
num_ranges = face->gasp.numRanges;
|
* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove
unused `max_points' and `max_contours'.
* src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c
(T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update.
* include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
`max_components'.
* src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused
`loadSize' and `loadStack'.
* src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context),
src/sfnt/ttload.c (tt_face_load_maxp): Update.
* src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c
(sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix
compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not
defined.
* src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix
possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions.
(finally!)
For most OpenType tables, `tt_face_load_xxxx' simply loads the table
and `face->root' is set later in `sfnt_load_face'. Here, we try to
make this work for _all_ tables.
* src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c,
src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and
then exit. Error handling or setting face->root is done later in
`sfnt_load_face'.
Pretty trace messages.
* src/sfnt/sfobjs.c (sfnt_load_face): Work harder.
Mac bitmap-only fonts are not scalable.
Check that `face->header.Units_Per_EM' is not zero.
(LOAD_, LOADM_): Pretty trace messages.
* src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics from
`eblc'.
* src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c
(load_format_20, load_format_25, tt_face_get_ps_name): Use
face->max_profile.numGlyphs, instead of face->root.num_glyphs.
2006-02-15 08:44:31 +01:00
|
|
|
|
FT_TRACE3(( "numRanges: %u\n", num_ranges ));
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
2012-12-16 19:08:36 +01:00
|
|
|
|
if ( FT_QNEW_ARRAY( face->gasp.gaspRanges, num_ranges ) ||
|
|
|
|
|
FT_FRAME_ENTER( num_ranges * 4L ) )
|
1999-12-17 00:11:37 +01:00
|
|
|
|
goto Exit;
|
|
|
|
|
|
2012-12-16 19:08:36 +01:00
|
|
|
|
gaspranges = face->gasp.gaspRanges;
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
|
|
|
|
for ( j = 0; j < num_ranges; j++ )
|
|
|
|
|
{
|
* include/freetype/internal/ftstream.h,
src/base/ftstream.c, src/cff/cffload.c, src/pcf/pcfread.c,
src/sfnt/ttcmap.c, src/sfnt/ttcmap0.c, src/sfnt/ttload.c,
src/sfnt/ttpost.c, src/sfnt/ttsbit.c,
src/truetype/ttgload.c, src/truetype/ttpload.c,
src/winfonts/winfnt.c:
changed the definitions of stream macros. Examples:
NEXT_Byte => FT_NEXT_BYTE
NEXT_Short => FT_NEXT_SHORT
NEXT_UShortLE => FT_NEXT_USHORT_LE
READ_Short => FT_READ_SHORT
GET_Long => FT_GET_LONG
etc..
also introduced the FT_PEEK_XXXX functions..
2002-03-22 13:55:23 +01:00
|
|
|
|
gaspranges[j].maxPPEM = FT_GET_USHORT();
|
|
|
|
|
gaspranges[j].gaspFlag = FT_GET_USHORT();
|
1999-12-17 00:11:37 +01:00
|
|
|
|
|
* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove
unused `max_points' and `max_contours'.
* src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c
(T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update.
* include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
`max_components'.
* src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused
`loadSize' and `loadStack'.
* src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context),
src/sfnt/ttload.c (tt_face_load_maxp): Update.
* src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c
(sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix
compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not
defined.
* src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix
possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions.
(finally!)
For most OpenType tables, `tt_face_load_xxxx' simply loads the table
and `face->root' is set later in `sfnt_load_face'. Here, we try to
make this work for _all_ tables.
* src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c,
src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and
then exit. Error handling or setting face->root is done later in
`sfnt_load_face'.
Pretty trace messages.
* src/sfnt/sfobjs.c (sfnt_load_face): Work harder.
Mac bitmap-only fonts are not scalable.
Check that `face->header.Units_Per_EM' is not zero.
(LOAD_, LOADM_): Pretty trace messages.
* src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics from
`eblc'.
* src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c
(load_format_20, load_format_25, tt_face_get_ps_name): Use
face->max_profile.numGlyphs, instead of face->root.num_glyphs.
2006-02-15 08:44:31 +01:00
|
|
|
|
FT_TRACE3(( "gaspRange %d: rangeMaxPPEM %5d, rangeGaspBehavior 0x%x\n",
|
|
|
|
|
j,
|
|
|
|
|
gaspranges[j].maxPPEM,
|
|
|
|
|
gaspranges[j].gaspFlag ));
|
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
|
|
|
|
|
|
|
|
|
Exit:
|
|
|
|
|
return error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* END */
|