123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- /***************************************************************************/
- /* */
- /* pfrdrivr.c */
- /* */
- /* FreeType PFR driver interface (body). */
- /* */
- /* Copyright 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_STREAM_H
- #include FT_INTERNAL_PFR_H
- #include "pfrdrivr.h"
- #include "pfrobjs.h"
- static FT_Error
- pfr_get_kerning( PFR_Face face,
- FT_UInt left,
- FT_UInt right,
- FT_Vector *avector )
- {
- FT_Error error;
- error = pfr_face_get_kerning( face, left, right, avector );
- if ( !error )
- {
- PFR_PhyFont phys = &face->phy_font;
- /* convert from metrics to outline units when necessary */
- if ( phys->outline_resolution != phys->metrics_resolution )
- {
- if ( avector->x != 0 )
- avector->x = FT_MulDiv( avector->x, phys->outline_resolution,
- phys->metrics_resolution );
- if ( avector->y != 0 )
- avector->y = FT_MulDiv( avector->x, phys->outline_resolution,
- phys->metrics_resolution );
- }
- }
- return error;
- }
- static FT_Error
- pfr_get_advance( PFR_Face face,
- FT_UInt gindex,
- FT_Pos *aadvance )
- {
- FT_Error error = FT_Err_Bad_Argument;
- *aadvance = 0;
- if ( face )
- {
- PFR_PhyFont phys = &face->phy_font;
- if ( gindex < phys->num_chars )
- {
- *aadvance = phys->chars[ gindex ].advance;
- error = 0;
- }
- }
- return error;
- }
- static FT_Error
- pfr_get_metrics( PFR_Face face,
- FT_UInt *aoutline_resolution,
- FT_UInt *ametrics_resolution,
- FT_Fixed *ametrics_x_scale,
- FT_Fixed *ametrics_y_scale )
- {
- PFR_PhyFont phys = &face->phy_font;
- FT_Fixed x_scale, y_scale;
- FT_Size size = face->root.size;
- if ( aoutline_resolution )
- *aoutline_resolution = phys->outline_resolution;
- if ( ametrics_resolution )
- *ametrics_resolution = phys->metrics_resolution;
- x_scale = 0x10000L;
- y_scale = 0x10000L;
- if ( size )
- {
- x_scale = FT_DivFix( size->metrics.x_ppem << 6,
- phys->metrics_resolution );
- y_scale = FT_DivFix( size->metrics.y_ppem << 6,
- phys->metrics_resolution );
- }
- if ( ametrics_x_scale )
- *ametrics_x_scale = x_scale;
- if ( ametrics_y_scale )
- *ametrics_y_scale = y_scale;
- return 0;
- }
- FT_CALLBACK_TABLE_DEF
- const FT_PFR_ServiceRec pfr_service_rec =
- {
- (FT_PFR_GetMetricsFunc) pfr_get_metrics,
- (FT_PFR_GetKerningFunc) pfr_get_kerning,
- (FT_PFR_GetAdvanceFunc) pfr_get_advance
- };
- FT_CALLBACK_TABLE_DEF
- const FT_Driver_ClassRec pfr_driver_class =
- {
- {
- ft_module_font_driver |
- ft_module_driver_scalable,
- sizeof( FT_DriverRec ),
- "pfr",
- 0x10000L,
- 0x20000L,
- (FT_PFR_Service) &pfr_service_rec, /* format interface */
- (FT_Module_Constructor)NULL,
- (FT_Module_Destructor) NULL,
- (FT_Module_Requester) NULL
- },
- sizeof( PFR_FaceRec ),
- sizeof( PFR_SizeRec ),
- sizeof( PFR_SlotRec ),
- (FT_Face_InitFunc) pfr_face_init,
- (FT_Face_DoneFunc) pfr_face_done,
- (FT_Size_InitFunc) NULL,
- (FT_Size_DoneFunc) NULL,
- (FT_Slot_InitFunc) pfr_slot_init,
- (FT_Slot_DoneFunc) pfr_slot_done,
- (FT_Size_ResetPointsFunc) NULL,
- (FT_Size_ResetPixelsFunc) NULL,
- (FT_Slot_LoadFunc) pfr_slot_load,
- (FT_Face_GetKerningFunc) pfr_get_kerning,
- (FT_Face_AttachFunc) 0,
- (FT_Face_GetAdvancesFunc) 0
- };
- /* END */
|