@ -4,7 +4,7 @@
/* */
/* Type 1 driver interface (body). */
/* */
/* Copyright 1996-2001, 2002, 2003, 200 4, 2006, 2007, 2009 by */
/* Copyright 1996-2004, 2006, 2007, 2009, 2011 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@ -171,12 +171,408 @@
}
static FT_Long
t1_ps_get_font_value ( FT_Face face ,
PS_Dict_Keys key ,
FT_UInt idx ,
void * value ,
FT_Long value_len )
{
FT_Long retval = - 1 ;
T1_Face t1face = ( T1_Face ) face ;
T1_Font type1 = & t1face - > type1 ;
switch ( key )
{
case PS_DICT_FONT_TYPE :
retval = sizeof ( type1 - > font_type ) ;
if ( value & & value_len > = retval )
* ( ( FT_Byte * ) value ) = type1 - > font_type ;
break ;
case PS_DICT_FONT_MATRIX :
if ( idx < sizeof ( type1 - > font_matrix ) /
sizeof ( type1 - > font_matrix . xx ) )
{
FT_Fixed val ;
retval = sizeof ( val ) ;
if ( value & & value_len > = retval )
{
switch ( idx )
{
case 0 :
val = type1 - > font_matrix . xx ;
break ;
case 1 :
val = type1 - > font_matrix . xy ;
break ;
case 2 :
val = type1 - > font_matrix . yx ;
break ;
case 3 :
val = type1 - > font_matrix . yy ;
break ;
}
* ( ( FT_Fixed * ) value ) = val ;
}
}
break ;
case PS_DICT_FONT_BBOX :
if ( idx < sizeof ( type1 - > font_bbox ) /
sizeof ( type1 - > font_bbox . xMin ) )
{
FT_Fixed val ;
retval = sizeof ( val ) ;
if ( value & & value_len > = retval )
{
switch ( idx )
{
case 0 :
val = type1 - > font_bbox . xMin ;
break ;
case 1 :
val = type1 - > font_bbox . yMin ;
break ;
case 2 :
val = type1 - > font_bbox . xMax ;
break ;
case 3 :
val = type1 - > font_bbox . yMax ;
break ;
}
* ( ( FT_Fixed * ) value ) = val ;
}
}
break ;
case PS_DICT_PAINT_TYPE :
retval = sizeof ( type1 - > paint_type ) ;
if ( value & & value_len > = retval )
* ( ( FT_Byte * ) value ) = type1 - > paint_type ;
break ;
case PS_DICT_FONT_NAME :
retval = ft_strlen ( type1 - > font_name ) + 1 ;
if ( value & & value_len > = retval )
ft_memcpy ( value , ( void * ) ( type1 - > font_name ) , retval ) ;
break ;
case PS_DICT_UNIQUE_ID :
retval = sizeof ( type1 - > private_dict . unique_id ) ;
if ( value & & value_len > = retval )
* ( ( FT_Int * ) value ) = type1 - > private_dict . unique_id ;
break ;
case PS_DICT_NUM_CHAR_STRINGS :
retval = sizeof ( type1 - > num_glyphs ) ;
if ( value & & value_len > = retval )
* ( ( FT_Int * ) value ) = type1 - > num_glyphs ;
break ;
case PS_DICT_CHAR_STRING_KEY :
if ( idx < ( FT_UInt ) type1 - > num_glyphs )
{
retval = ft_strlen ( type1 - > glyph_names [ idx ] ) + 1 ;
if ( value & & value_len > = retval )
{
ft_memcpy ( value , ( void * ) ( type1 - > glyph_names [ idx ] ) , retval ) ;
( ( FT_Char * ) value ) [ retval - 1 ] = ( FT_Char ) ' \0 ' ;
}
}
break ;
case PS_DICT_CHAR_STRING :
if ( idx < ( FT_UInt ) type1 - > num_glyphs )
{
retval = type1 - > charstrings_len [ idx ] + 1 ;
if ( value & & value_len > = retval )
{
ft_memcpy ( value , ( void * ) ( type1 - > charstrings [ idx ] ) ,
retval - 1 ) ;
( ( FT_Char * ) value ) [ retval - 1 ] = ( FT_Char ) ' \0 ' ;
}
}
break ;
case PS_DICT_ENCODING_TYPE :
retval = sizeof ( type1 - > encoding_type ) ;
if ( value & & value_len > = retval )
* ( ( T1_EncodingType * ) value ) = type1 - > encoding_type ;
break ;
case PS_DICT_ENCODING_ENTRY :
if ( type1 - > encoding_type = = T1_ENCODING_TYPE_ARRAY & &
idx < ( FT_UInt ) type1 - > encoding . num_chars )
{
retval = ft_strlen ( type1 - > encoding . char_name [ idx ] ) + 1 ;
if ( value & & value_len > = retval )
{
ft_memcpy ( value , ( void * ) ( type1 - > encoding . char_name [ idx ] ) ,
retval - 1 ) ;
( ( FT_Char * ) value ) [ retval - 1 ] = ( FT_Char ) ' \0 ' ;
}
}
break ;
case PS_DICT_NUM_SUBRS :
retval = sizeof ( type1 - > num_subrs ) ;
if ( value & & value_len > = retval )
* ( ( FT_Int * ) value ) = type1 - > num_subrs ;
break ;
case PS_DICT_SUBR :
if ( idx < ( FT_UInt ) type1 - > num_subrs )
{
retval = type1 - > subrs_len [ idx ] + 1 ;
if ( value & & value_len > = retval )
{
ft_memcpy ( value , ( void * ) ( type1 - > subrs [ idx ] ) , retval - 1 ) ;
( ( FT_Char * ) value ) [ retval - 1 ] = ( FT_Char ) ' \0 ' ;
}
}
break ;
case PS_DICT_STD_HW :
retval = sizeof ( type1 - > private_dict . standard_width [ 0 ] ) ;
if ( value & & value_len > = retval )
* ( ( FT_UShort * ) value ) = type1 - > private_dict . standard_width [ 0 ] ;
break ;
case PS_DICT_STD_VW :
retval = sizeof ( type1 - > private_dict . standard_height [ 0 ] ) ;
if ( value & & value_len > = retval )
* ( ( FT_UShort * ) value ) = type1 - > private_dict . standard_height [ 0 ] ;
break ;
case PS_DICT_NUM_BLUE_VALUES :
retval = sizeof ( type1 - > private_dict . num_blue_values ) ;
if ( value & & value_len > = retval )
* ( ( FT_Byte * ) value ) = type1 - > private_dict . num_blue_values ;
break ;
case PS_DICT_BLUE_VALUE :
if ( idx < type1 - > private_dict . num_blue_values )
{
retval = sizeof ( type1 - > private_dict . blue_values [ idx ] ) ;
if ( value & & value_len > = retval )
* ( ( FT_Short * ) value ) = type1 - > private_dict . blue_values [ idx ] ;
}
break ;
case PS_DICT_BLUE_SCALE :
retval = sizeof ( type1 - > private_dict . blue_scale ) ;
if ( value & & value_len > = retval )
* ( ( FT_Fixed * ) value ) = type1 - > private_dict . blue_scale ;
break ;
case PS_DICT_BLUE_FUZZ :
retval = sizeof ( type1 - > private_dict . blue_fuzz ) ;
if ( value & & value_len > = retval )
* ( ( FT_Int * ) value ) = type1 - > private_dict . blue_fuzz ;
break ;
case PS_DICT_BLUE_SHIFT :
retval = sizeof ( type1 - > private_dict . blue_shift ) ;
if ( value & & value_len > = retval )
* ( ( FT_Int * ) value ) = type1 - > private_dict . blue_shift ;
break ;
case PS_DICT_NUM_OTHER_BLUES :
retval = sizeof ( type1 - > private_dict . num_other_blues ) ;
if ( value & & value_len > = retval )
* ( ( FT_Byte * ) value ) = type1 - > private_dict . num_other_blues ;
break ;
case PS_DICT_OTHER_BLUE :
if ( idx < type1 - > private_dict . num_other_blues )
{
retval = sizeof ( type1 - > private_dict . other_blues [ idx ] ) ;
if ( value & & value_len > = retval )
* ( ( FT_Short * ) value ) = type1 - > private_dict . other_blues [ idx ] ;
}
break ;
case PS_DICT_NUM_FAMILY_BLUES :
retval = sizeof ( type1 - > private_dict . num_family_blues ) ;
if ( value & & value_len > = retval )
* ( ( FT_Byte * ) value ) = type1 - > private_dict . num_family_blues ;
break ;
case PS_DICT_FAMILY_BLUE :
if ( idx < type1 - > private_dict . num_family_blues )
{
retval = sizeof ( type1 - > private_dict . family_blues [ idx ] ) ;
if ( value & & value_len > = retval )
* ( ( FT_Short * ) value ) = type1 - > private_dict . family_blues [ idx ] ;
}
break ;
case PS_DICT_NUM_FAMILY_OTHER_BLUES :
retval = sizeof ( type1 - > private_dict . num_family_other_blues ) ;
if ( value & & value_len > = retval )
* ( ( FT_Byte * ) value ) = type1 - > private_dict . num_family_other_blues ;
break ;
case PS_DICT_FAMILY_OTHER_BLUE :
if ( idx < type1 - > private_dict . num_family_other_blues )
{
retval = sizeof ( type1 - > private_dict . family_other_blues [ idx ] ) ;
if ( value & & value_len > = retval )
* ( ( FT_Short * ) value ) = type1 - > private_dict . family_other_blues [ idx ] ;
}
break ;
case PS_DICT_NUM_STEM_SNAP_H :
retval = sizeof ( type1 - > private_dict . num_snap_widths ) ;
if ( value & & value_len > = retval )
* ( ( FT_Byte * ) value ) = type1 - > private_dict . num_snap_widths ;
break ;
case PS_DICT_STEM_SNAP_H :
if ( idx < type1 - > private_dict . num_snap_widths )
{
retval = sizeof ( type1 - > private_dict . snap_widths [ idx ] ) ;
if ( value & & value_len > = retval )
* ( ( FT_Short * ) value ) = type1 - > private_dict . snap_widths [ idx ] ;
}
break ;
case PS_DICT_NUM_STEM_SNAP_V :
retval = sizeof ( type1 - > private_dict . num_snap_heights ) ;
if ( value & & value_len > = retval )
* ( ( FT_Byte * ) value ) = type1 - > private_dict . num_snap_heights ;
break ;
case PS_DICT_STEM_SNAP_V :
if ( idx < type1 - > private_dict . num_snap_heights )
{
retval = sizeof ( type1 - > private_dict . snap_heights [ idx ] ) ;
if ( value & & value_len > = retval )
* ( ( FT_Short * ) value ) = type1 - > private_dict . snap_heights [ idx ] ;
}
break ;
case PS_DICT_RND_STEM_UP :
retval = sizeof ( type1 - > private_dict . round_stem_up ) ;
if ( value & & value_len > = retval )
* ( ( FT_Bool * ) value ) = type1 - > private_dict . round_stem_up ;
break ;
case PS_DICT_FORCE_BOLD :
retval = sizeof ( type1 - > private_dict . force_bold ) ;
if ( value & & value_len > = retval )
* ( ( FT_Bool * ) value ) = type1 - > private_dict . force_bold ;
break ;
case PS_DICT_MIN_FEATURE :
if ( idx < sizeof ( type1 - > private_dict . min_feature ) /
sizeof ( type1 - > private_dict . min_feature [ 0 ] ) )
{
retval = sizeof ( type1 - > private_dict . min_feature [ idx ] ) ;
if ( value & & value_len > = retval )
* ( ( FT_Short * ) value ) = type1 - > private_dict . min_feature [ idx ] ;
}
break ;
case PS_DICT_LEN_IV :
retval = sizeof ( type1 - > private_dict . lenIV ) ;
if ( value & & value_len > = retval )
* ( ( FT_Int * ) value ) = type1 - > private_dict . lenIV ;
break ;
case PS_DICT_PASSWORD :
retval = sizeof ( type1 - > private_dict . password ) ;
if ( value & & value_len > = retval )
* ( ( FT_Long * ) value ) = type1 - > private_dict . password ;
break ;
case PS_DICT_LANGUAGE_GROUP :
retval = sizeof ( type1 - > private_dict . language_group ) ;
if ( value & & value_len > = retval )
* ( ( FT_Long * ) value ) = type1 - > private_dict . language_group ;
break ;
case PS_DICT_IS_FIXED_PITCH :
retval = sizeof ( type1 - > font_info . is_fixed_pitch ) ;
if ( value & & value_len > = retval )
* ( ( FT_Bool * ) value ) = type1 - > font_info . is_fixed_pitch ;
break ;
case PS_DICT_UNDERLINE_POSITION :
retval = sizeof ( type1 - > font_info . underline_position ) ;
if ( value & & value_len > = retval )
* ( ( FT_Short * ) value ) = type1 - > font_info . underline_position ;
break ;
case PS_DICT_UNDERLINE_THICKNESS :
retval = sizeof ( type1 - > font_info . underline_thickness ) ;
if ( value & & value_len > = retval )
* ( ( FT_UShort * ) value ) = type1 - > font_info . underline_thickness ;
break ;
case PS_DICT_FS_TYPE :
retval = sizeof ( type1 - > font_extra . fs_type ) ;
if ( value & & value_len > = retval )
* ( ( FT_UShort * ) value ) = type1 - > font_extra . fs_type ;
break ;
case PS_DICT_VERSION :
retval = ft_strlen ( type1 - > font_info . version ) + 1 ;
if ( value & & value_len > = retval )
ft_memcpy ( value , ( void * ) ( type1 - > font_info . version ) , retval ) ;
break ;
case PS_DICT_NOTICE :
retval = ft_strlen ( type1 - > font_info . notice ) + 1 ;
if ( value & & value_len > = retval )
ft_memcpy ( value , ( void * ) ( type1 - > font_info . notice ) , retval ) ;
break ;
case PS_DICT_FULL_NAME :
retval = ft_strlen ( type1 - > font_info . full_name ) + 1 ;
if ( value & & value_len > = retval )
ft_memcpy ( value , ( void * ) ( type1 - > font_info . full_name ) , retval ) ;
break ;
case PS_DICT_FAMILY_NAME :
retval = ft_strlen ( type1 - > font_info . family_name ) + 1 ;
if ( value & & value_len > = retval )
ft_memcpy ( value , ( void * ) ( type1 - > font_info . family_name ) , retval ) ;
break ;
case PS_DICT_WEIGHT :
retval = ft_strlen ( type1 - > font_info . weight ) + 1 ;
if ( value & & value_len > = retval )
ft_memcpy ( value , ( void * ) ( type1 - > font_info . weight ) , retval ) ;
break ;
case PS_DICT_ITALIC_ANGLE :
retval = sizeof ( type1 - > font_info . italic_angle ) ;
if ( value & & value_len > = retval )
* ( ( FT_Long * ) value ) = type1 - > font_info . italic_angle ;
break ;
default :
break ;
}
return retval ;
}
static const FT_Service_PsInfoRec t1_service_ps_info =
{
( PS_GetFontInfoFunc ) t1_ps_get_font_info ,
( PS_GetFontExtraFunc ) t1_ps_get_font_extra ,
( PS_HasGlyphNamesFunc ) t1_ps_has_glyph_names ,
( PS_GetFontPrivateFunc ) t1_ps_get_font_private ,
( PS_GetFontValueFunc ) t1_ps_get_font_value ,
} ;