@ -16,34 +16,20 @@
/***************************************************************************/
# include <ft2build.h>
# include FT_INTERNAL_PFR_H
# include FT_INTERNAL_OBJECTS_H
# include FT_SERVICE_PFR_H
/* check the format */
static FT_Error
ft_pfr_check ( FT_Face face ,
FT_PFR_Service * aservice )
static FT_Service_PfrMetrics
ft_pfr_check ( FT_Face face )
{
FT_Error error = FT_Err_Bad_Argument ;
FT_Service_PfrMetrics service ;
FT_FACE_LOOKUP_SERVICE ( face , FT_Service_PfrMetrics , service ,
pfr_metrics , FT_SERVICE_ID_PFR_METRICS ) ;
if ( face & & face - > driver )
{
FT_Module module = ( FT_Module ) face - > driver ;
const char * name = module - > clazz - > module_name ;
if ( name [ 0 ] = = ' p ' & &
name [ 1 ] = = ' f ' & &
name [ 2 ] = = ' r ' & &
name [ 3 ] = = 0 )
{
* aservice = ( FT_PFR_Service ) module - > clazz - > module_interface ;
error = 0 ;
}
}
return error ;
return service ;
}
@ -54,12 +40,12 @@
FT_Fixed * ametrics_x_scale ,
FT_Fixed * ametrics_y_scale )
{
FT_Error error ;
FT_PFR_ Service service ;
FT_Error error ;
FT_Service_PfrMetrics service ;
error = ft_pfr_check ( face , & servi ce ) ;
if ( ! error )
service = ft_pfr_check ( face ) ;
if ( service )
{
error = service - > get_metrics ( face ,
aoutline_resolution ,
@ -67,6 +53,26 @@
ametrics_x_scale ,
ametrics_y_scale ) ;
}
else if ( face )
{
FT_Fixed x_scale , y_scale ;
/* this is not a PFR font */
* aoutline_resolution = face - > units_per_EM ;
* ametrics_resolution = face - > units_per_EM ;
x_scale = y_scale = 0x10000L ;
if ( face - > size )
{
x_scale = face - > size - > metrics . x_scale ;
y_scale = face - > size - > metrics . y_scale ;
}
* ametrics_x_scale = x_scale ;
* ametrics_y_scale = y_scale ;
}
else
error = FT_Err_Invalid_Argument ;
return error ;
}
@ -77,15 +83,22 @@
FT_UInt right ,
FT_Vector * avector )
{
FT_Error error ;
FT_PFR_ Service service ;
FT_Error error ;
FT_Service_PfrMetrics service ;
error = ft_pfr_check ( face , & servi ce ) ;
if ( ! error )
service = ft_pfr_check ( face ) ;
if ( service )
{
error = service - > get_kerning ( face , left , right , avector ) ;
}
else if ( face )
{
error = FT_Get_Kerning ( face , left , right , FT_KERNING_UNSCALED , avector ) ;
}
else
error = FT_Err_Invalid_Argument ;
return error ;
}
@ -95,15 +108,19 @@
FT_UInt gindex ,
FT_Pos * aadvance )
{
FT_Error error ;
FT_PFR_ Service service ;
FT_Error error ;
FT_Service_PfrMetrics service ;
error = ft_pfr_check ( face , & servi ce ) ;
if ( ! error )
service = ft_pfr_check ( face ) ;
if ( service )
{
error = service - > get_advance ( face , gindex , aadvance ) ;
}
else
/* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */
error = FT_Err_Invalid_Argument ;
return error ;
}