/*
* Skip over PCF fonts that have no encoded characters; they're
* usually just Unicode fonts transcoded to some legacy encoding
- * ftglue.c forces us to approximate whether a font is a PCF font
+ * FT forces us to approximate whether a font is a PCF font
* or not by whether it has any BDF properties. Try PIXEL_SIZE;
* I don't know how to get a list of BDF properties on the font. -PL
*/
#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' )
#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' )
#define TTAG_SILF FT_MAKE_TAG( 'S', 'i', 'l', 'f')
-#define TT_Err_Ok FT_Err_Ok
-#define TT_Err_Invalid_Face_Handle FT_Err_Invalid_Face_Handle
-#define TTO_Err_Empty_Script 0x1005
-#define TTO_Err_Invalid_SubTable 0x1001
#define OTLAYOUT_HEAD "otlayout:"
#define OTLAYOUT_HEAD_LEN 9
}
-static FT_Error
-GetScriptTags(FT_Face face, FT_ULong tabletag, FT_ULong **stags, FT_UShort *script_count)
+static int
+GetScriptTags(FT_Face face, FT_ULong tabletag, FT_ULong **stags)
{
- FT_ULong cur_offset, new_offset, base_offset;
+ FT_ULong cur_offset, new_offset, base_offset;
FT_Stream stream = face->stream;
FT_Error error;
- FT_UShort n, p;
+ FT_UShort n, p;
FT_Memory memory;
+ int script_count;
- if ( !stream )
- return TT_Err_Invalid_Face_Handle;
+ if (!stream)
+ return 0;
memory = stream->memory;
if (( error = ftglue_face_goto_table( face, tabletag, stream ) ))
- return error;
+ return 0;
base_offset = ftglue_stream_pos ( stream );
/* skip version */
if ( ftglue_stream_seek ( stream, base_offset + 4L ) || ftglue_stream_frame_enter( stream, 2L ) )
- return error;
+ return 0;
new_offset = GET_UShort() + base_offset;
cur_offset = ftglue_stream_pos( stream );
- if ( ftglue_stream_seek( stream, new_offset ) != TT_Err_Ok )
- return error;
+ if ( ftglue_stream_seek( stream, new_offset ) != FT_Err_Ok )
+ return 0;
base_offset = ftglue_stream_pos( stream );
if ( ftglue_stream_frame_enter( stream, 2L ) )
- return error;
+ return 0;
- *script_count = GET_UShort ();
+ script_count = GET_UShort ();
ftglue_stream_frame_exit( stream );
- *stags = ftglue_alloc(memory, *script_count * sizeof( FT_ULong ), &error);
-
- if (error)
- return error;
+ *stags = malloc(script_count * sizeof (FT_ULong));
+ if (!stags)
+ return 0;
p = 0;
- for ( n = 0; n < *script_count; n++ )
+ for ( n = 0; n < script_count; n++ )
{
if ( ftglue_stream_frame_enter( stream, 6L ) )
goto Fail;
error = ftglue_stream_seek( stream, new_offset );
- if ( error == TT_Err_Ok )
+ if ( error == FT_Err_Ok )
p++;
(void)ftglue_stream_seek( stream, cur_offset );
}
if (!p)
- {
- error = TTO_Err_Invalid_SubTable;
goto Fail;
- }
/* sort the tag list before returning it */
- qsort(*stags, *script_count, sizeof(FT_ULong), compareulong);
+ qsort(*stags, script_count, sizeof(FT_ULong), compareulong);
- return TT_Err_Ok;
+ return script_count;
Fail:
- *script_count = 0;
- ftglue_free( memory, *stags );
+ free(*stags);
*stags = NULL;
- return error;
+ return 0;
}
static FcChar8 *
err = FT_Load_Sfnt_Table(face, TTAG_SILF, 0, 0, &len);
issilgraphitefont = ( err == FT_Err_Ok);
- if (GetScriptTags(face, TTAG_GPOS, &gpostags, &gpos_count) != FT_Err_Ok)
- gpos_count = 0;
- if (GetScriptTags(face, TTAG_GSUB, &gsubtags, &gsub_count) != FT_Err_Ok)
- gsub_count = 0;
-
+ gpos_count = GetScriptTags(face, TTAG_GPOS, &gpostags);
+ gsub_count = GetScriptTags(face, TTAG_GSUB, &gsubtags);
+
if (!issilgraphitefont && !gsub_count && !gpos_count)
goto bail;
if (FcDebug () & FC_DBG_SCANV)
printf("complex_ features in this font: %s\n", complex_);
bail:
- ftglue_free(memory, gsubtags);
- ftglue_free(memory, gpostags);
+ free(gsubtags);
+ free(gpostags);
return complex_;
}
} while (0)
-FTGLUE_APIDEF( FT_Pointer )
-ftglue_alloc( FT_Memory memory,
- FT_ULong size,
- FT_Error *perror )
-{
- FT_Error error = 0;
- FT_Pointer block = NULL;
-
- if ( size > 0 )
- {
- block = memory->alloc( memory, size );
- if ( !block )
- error = FT_Err_Out_Of_Memory;
- else
- memset( (char*)block, 0, (size_t)size );
- }
-
- *perror = error;
- return block;
-}
-
-
-FTGLUE_APIDEF( FT_Pointer )
-ftglue_realloc( FT_Memory memory,
- FT_Pointer block,
- FT_ULong old_size,
- FT_ULong new_size,
- FT_Error *perror )
-{
- FT_Pointer block2 = NULL;
- FT_Error error = 0;
-
- if ( old_size == 0 || block == NULL )
- {
- block2 = ftglue_alloc( memory, new_size, &error );
- }
- else if ( new_size == 0 )
- {
- ftglue_free( memory, block );
- }
- else
- {
- block2 = memory->realloc( memory, old_size, new_size, block );
- if ( block2 == NULL )
- error = FT_Err_Out_Of_Memory;
- else if ( new_size > old_size )
- memset( (char*)block2 + old_size, 0, (size_t)(new_size - old_size) );
- }
-
- if ( !error )
- block = block2;
-
- *perror = error;
- return block;
-}
-
-
-FTGLUE_APIDEF( void )
+static void
ftglue_free( FT_Memory memory,
FT_Pointer block )
{
memory->free( memory, block );
}
-
FTGLUE_APIDEF( FT_Long )
ftglue_stream_pos( FT_Stream stream )
{
goto FoundIt;
}
}
- error = TT_Err_Table_Missing;
+ error = FT_Err_Table_Missing;
FoundIt:
FORGET_Frame();
FT_BEGIN_HEADER
-/* utility macros */
-#define TT_Err_Ok FT_Err_Ok
-#define TT_Err_Invalid_Argument FT_Err_Invalid_Argument
-#define TT_Err_Invalid_Face_Handle FT_Err_Invalid_Face_Handle
-#define TT_Err_Table_Missing FT_Err_Table_Missing
-
#define SET_ERR(c) ( (error = (c)) != 0 )
#ifndef FTGLUE_API
FTGLUE_API( void )
ftglue_stream_frame_exit( FT_Stream stream );
-FTGLUE_API( FT_Byte )
-ftglue_stream_get_byte( FT_Stream stream );
-
-FTGLUE_API( FT_Short )
-ftglue_stream_get_short( FT_Stream stream );
-
-FTGLUE_API( FT_Long )
-ftglue_stream_get_long( FT_Stream stream );
-
FTGLUE_API( FT_Error )
ftglue_face_goto_table( FT_Face face,
FT_ULong tag,
FT_Stream stream );
-FTGLUE_API( FT_Pointer )
-ftglue_alloc( FT_Memory memory,
- FT_ULong size,
- FT_Error *perror_ );
-
-FTGLUE_API( FT_Pointer )
-ftglue_realloc( FT_Memory memory,
- FT_Pointer block,
- FT_ULong old_size,
- FT_ULong new_size,
- FT_Error *perror_ );
-
-FTGLUE_API( void )
-ftglue_free( FT_Memory memory,
- FT_Pointer block );
-
-/* */
-
FT_END_HEADER
#endif /* __OPENTYPE_FTGLUE_H__ */