1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ftpfr.c */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* FreeType API for accessing PFR-specific data (body). */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Copyright 2002-2004, 2008, 2010, 2013 by */ 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This file is part of the FreeType project, and may only be used, */ 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* modified, and distributed under the terms of the FreeType project */ 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* this file you indicate that you have read the license and */ 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* understand and accept it fully. */ 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/ft2build.h" 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftdebug.h" 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftobjs.h" 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/services/svpfr.h" 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* check the format */ 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Service_PfrMetrics 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_pfr_check( FT_Face face ) 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_PfrMetrics service = NULL; 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( face ) 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS ); 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return service; 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftpfr.h */ 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_EXPORT_DEF( FT_Error ) 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Get_PFR_Metrics( FT_Face face, 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt *aoutline_resolution, 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt *ametrics_resolution, 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Fixed *ametrics_x_scale, 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Fixed *ametrics_y_scale ) 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_PfrMetrics service; 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !face ) 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Argument ); 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov service = ft_pfr_check( face ); 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( service ) 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = service->get_metrics( face, 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov aoutline_resolution, 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ametrics_resolution, 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ametrics_x_scale, 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ametrics_y_scale ); 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Fixed x_scale, y_scale; 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* this is not a PFR font */ 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( aoutline_resolution ) 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *aoutline_resolution = face->units_per_EM; 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( ametrics_resolution ) 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *ametrics_resolution = face->units_per_EM; 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov x_scale = y_scale = 0x10000L; 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( face->size ) 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov x_scale = face->size->metrics.x_scale; 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov y_scale = face->size->metrics.y_scale; 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( ametrics_x_scale ) 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *ametrics_x_scale = x_scale; 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( ametrics_y_scale ) 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *ametrics_y_scale = y_scale; 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_THROW( Unknown_File_Format ); 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftpfr.h */ 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_EXPORT_DEF( FT_Error ) 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Get_PFR_Kerning( FT_Face face, 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt left, 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt right, 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Vector *avector ) 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_PfrMetrics service; 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !face ) 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Argument ); 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov service = ft_pfr_check( face ); 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( service ) 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = service->get_kerning( face, left, right, avector ); 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Get_Kerning( face, left, right, 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_KERNING_UNSCALED, avector ); 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftpfr.h */ 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_EXPORT_DEF( FT_Error ) 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Get_PFR_Advance( FT_Face face, 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt gindex, 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Pos *aadvance ) 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_PfrMetrics service; 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov service = ft_pfr_check( face ); 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( service ) 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = service->get_advance( face, gindex, aadvance ); 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */ 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_THROW( Invalid_Argument ); 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 147