123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- /***************************************************************************/
- /* */
- /* ttpload.c */
- /* */
- /* TrueType glyph data/program tables loader (body). */
- /* */
- /* Copyright 1996-2001, 2002 by */
- /* David Turner, Robert Wilhelm, and Werner Lemberg. */
- /* */
- /* This file is part of the FreeType project, and may only be used, */
- /* modified, and distributed under the terms of the FreeType project */
- /* license, LICENSE.TXT. By continuing to use, modify, or distribute */
- /* this file you indicate that you have read the license and */
- /* understand and accept it fully. */
- /* */
- /***************************************************************************/
- #include <ft2build.h>
- #include FT_INTERNAL_DEBUG_H
- #include FT_INTERNAL_OBJECTS_H
- #include FT_INTERNAL_STREAM_H
- #include FT_TRUETYPE_TAGS_H
- #include "ttpload.h"
- #include "tterrors.h"
- /*************************************************************************/
- /* */
- /* 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_ttpload
- /*************************************************************************/
- /* */
- /* <Function> */
- /* tt_face_load_loca */
- /* */
- /* <Description> */
- /* Loads the locations table. */
- /* */
- /* <InOut> */
- /* face :: A handle to the target face object. */
- /* */
- /* <Input> */
- /* stream :: The input stream. */
- /* */
- /* <Return> */
- /* FreeType error code. 0 means success. */
- /* */
- FT_LOCAL_DEF( FT_Error )
- tt_face_load_loca( TT_Face face,
- FT_Stream stream )
- {
- FT_Error error;
- FT_Memory memory = stream->memory;
- FT_Short LongOffsets;
- FT_ULong table_len;
- FT_TRACE2(( "Locations " ));
- LongOffsets = face->header.Index_To_Loc_Format;
- error = face->goto_table( face, TTAG_loca, stream, &table_len );
- if ( error )
- {
- error = TT_Err_Locations_Missing;
- goto Exit;
- }
- if ( LongOffsets != 0 )
- {
- face->num_locations = (FT_UShort)( table_len >> 2 );
- FT_TRACE2(( "(32bit offsets): %12d ", face->num_locations ));
- if ( FT_NEW_ARRAY( face->glyph_locations, face->num_locations ) )
- goto Exit;
- if ( FT_FRAME_ENTER( face->num_locations * 4L ) )
- goto Exit;
- {
- FT_Long* loc = face->glyph_locations;
- FT_Long* limit = loc + face->num_locations;
- for ( ; loc < limit; loc++ )
- *loc = FT_GET_LONG();
- }
- FT_FRAME_EXIT();
- }
- else
- {
- face->num_locations = (FT_UShort)( table_len >> 1 );
- FT_TRACE2(( "(16bit offsets): %12d ", face->num_locations ));
- if ( FT_NEW_ARRAY( face->glyph_locations, face->num_locations ) )
- goto Exit;
- if ( FT_FRAME_ENTER( face->num_locations * 2L ) )
- goto Exit;
- {
- FT_Long* loc = face->glyph_locations;
- FT_Long* limit = loc + face->num_locations;
- for ( ; loc < limit; loc++ )
- *loc = (FT_Long)( (FT_ULong)FT_GET_USHORT() * 2 );
- }
- FT_FRAME_EXIT();
- }
- FT_TRACE2(( "loaded\n" ));
- Exit:
- return error;
- }
- /*************************************************************************/
- /* */
- /* <Function> */
- /* tt_face_load_cvt */
- /* */
- /* <Description> */
- /* Loads the control value table into a face object. */
- /* */
- /* <InOut> */
- /* face :: A handle to the target face object. */
- /* */
- /* <Input> */
- /* stream :: A handle to the input stream. */
- /* */
- /* <Return> */
- /* FreeType error code. 0 means success. */
- /* */
- FT_LOCAL_DEF( FT_Error )
- tt_face_load_cvt( TT_Face face,
- FT_Stream stream )
- {
- FT_Error error;
- FT_Memory memory = stream->memory;
- FT_ULong table_len;
- FT_TRACE2(( "CVT " ));
- error = face->goto_table( face, TTAG_cvt, stream, &table_len );
- if ( error )
- {
- FT_TRACE2(( "is missing!\n" ));
- face->cvt_size = 0;
- face->cvt = NULL;
- error = TT_Err_Ok;
- goto Exit;
- }
- face->cvt_size = table_len / 2;
- if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) )
- goto Exit;
- if ( FT_FRAME_ENTER( face->cvt_size * 2L ) )
- goto Exit;
- {
- FT_Short* cur = face->cvt;
- FT_Short* limit = cur + face->cvt_size;
- for ( ; cur < limit; cur++ )
- *cur = FT_GET_SHORT();
- }
- FT_FRAME_EXIT();
- FT_TRACE2(( "loaded\n" ));
- Exit:
- return error;
- }
- /*************************************************************************/
- /* */
- /* <Function> */
- /* tt_face_load_fpgm */
- /* */
- /* <Description> */
- /* Loads the font program and the cvt program. */
- /* */
- /* <InOut> */
- /* face :: A handle to the target face object. */
- /* */
- /* <Input> */
- /* stream :: A handle to the input stream. */
- /* */
- /* <Return> */
- /* FreeType error code. 0 means success. */
- /* */
- FT_LOCAL_DEF( FT_Error )
- tt_face_load_fpgm( TT_Face face,
- FT_Stream stream )
- {
- FT_Error error;
- FT_ULong table_len;
- FT_TRACE2(( "Font program " ));
- /* The font program is optional */
- error = face->goto_table( face, TTAG_fpgm, stream, &table_len );
- if ( error )
- {
- face->font_program = NULL;
- face->font_program_size = 0;
- FT_TRACE2(( "is missing!\n" ));
- }
- else
- {
- face->font_program_size = table_len;
- if ( FT_FRAME_EXTRACT( table_len, face->font_program ) )
- goto Exit;
- FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size ));
- }
- FT_TRACE2(( "Prep program " ));
- error = face->goto_table( face, TTAG_prep, stream, &table_len );
- if ( error )
- {
- face->cvt_program = NULL;
- face->cvt_program_size = 0;
- error = TT_Err_Ok;
- FT_TRACE2(( "is missing!\n" ));
- }
- else
- {
- face->cvt_program_size = table_len;
- if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) )
- goto Exit;
- FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size ));
- }
- Exit:
- return error;
- }
- /* END */
|