/***************************************************************************/ /* */ /* ftpfr.c */ /* */ /* FreeType API for accessing PFR-specific data (body). */ /* */ /* Copyright 2002-2018 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 #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_OBJECTS_H #include FT_SERVICE_PFR_H /* check the format */ static FT_Service_PfrMetrics ft_pfr_check( FT_Face face ) { FT_Service_PfrMetrics service = NULL; if ( face ) FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS ); return service; } /* documentation is in ftpfr.h */ FT_EXPORT_DEF( FT_Error ) FT_Get_PFR_Metrics( FT_Face face, FT_UInt *aoutline_resolution, FT_UInt *ametrics_resolution, FT_Fixed *ametrics_x_scale, FT_Fixed *ametrics_y_scale ) { FT_Error error = FT_Err_Ok; FT_Service_PfrMetrics service; if ( !face ) return FT_THROW( Invalid_Face_Handle ); service = ft_pfr_check( face ); if ( service ) { error = service->get_metrics( face, aoutline_resolution, ametrics_resolution, ametrics_x_scale, ametrics_y_scale ); } else { FT_Fixed x_scale, y_scale; /* this is not a PFR font */ if ( aoutline_resolution ) *aoutline_resolution = face->units_per_EM; if ( ametrics_resolution ) *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; } if ( ametrics_x_scale ) *ametrics_x_scale = x_scale; if ( ametrics_y_scale ) *ametrics_y_scale = y_scale; error = FT_THROW( Unknown_File_Format ); } return error; } /* documentation is in ftpfr.h */ FT_EXPORT_DEF( FT_Error ) FT_Get_PFR_Kerning( FT_Face face, FT_UInt left, FT_UInt right, FT_Vector *avector ) { FT_Error error; FT_Service_PfrMetrics service; if ( !face ) return FT_THROW( Invalid_Face_Handle ); if ( !avector ) return FT_THROW( Invalid_Argument ); service = ft_pfr_check( face ); if ( service ) error = service->get_kerning( face, left, right, avector ); else error = FT_Get_Kerning( face, left, right, FT_KERNING_UNSCALED, avector ); return error; } /* documentation is in ftpfr.h */ FT_EXPORT_DEF( FT_Error ) FT_Get_PFR_Advance( FT_Face face, FT_UInt gindex, FT_Pos *aadvance ) { FT_Error error; FT_Service_PfrMetrics service; if ( !face ) return FT_THROW( Invalid_Face_Handle ); if ( !aadvance ) return FT_THROW( Invalid_Argument ); 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_THROW( Invalid_Argument ); return error; } /* END */