1bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/***************************************************************************/ 2bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* */ 3bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* pfrload.c */ 4bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* */ 5bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* FreeType PFR loader (body). */ 6bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* */ 7727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* Copyright 2002-2005, 2007, 2009, 2010, 2013 by */ 8bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* */ 10bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* This file is part of the FreeType project, and may only be used, */ 11bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* modified, and distributed under the terms of the FreeType project */ 12bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* this file you indicate that you have read the license and */ 14bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* understand and accept it fully. */ 15bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* */ 16bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/***************************************************************************/ 17bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 18bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 19bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#include "pfrload.h" 20bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#include FT_INTERNAL_DEBUG_H 21bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#include FT_INTERNAL_STREAM_H 22bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 23bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#include "pfrerror.h" 24bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 25bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#undef FT_COMPONENT 26bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#define FT_COMPONENT trace_pfr 27bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 28bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 29bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 30bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 31bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***** *****/ 32bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***** EXTRA ITEMS *****/ 33bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***** *****/ 34bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 35bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 36bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 37bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 38bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_LOCAL_DEF( FT_Error ) 39bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly pfr_extra_items_skip( FT_Byte* *pp, 40bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Byte* limit ) 41bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 42bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly return pfr_extra_items_parse( pp, limit, NULL, NULL ); 43bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 44bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 45bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 46bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_LOCAL_DEF( FT_Error ) 47bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly pfr_extra_items_parse( FT_Byte* *pp, 48bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Byte* limit, 49bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_ExtraItem item_list, 50bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Pointer item_data ) 51bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 52727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 53bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Byte* p = *pp; 54bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt num_items, item_type, item_size; 55bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 56bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 57bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( 1 ); 58bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly num_items = PFR_NEXT_BYTE( p ); 59bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 60bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly for ( ; num_items > 0; num_items-- ) 61bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 62bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( 2 ); 63bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item_size = PFR_NEXT_BYTE( p ); 64bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item_type = PFR_NEXT_BYTE( p ); 65bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 66bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( item_size ); 67bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 68bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( item_list ) 69bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 70bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_ExtraItem extra = item_list; 71bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 72bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 73bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly for ( extra = item_list; extra->parser != NULL; extra++ ) 74bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 75bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( extra->type == item_type ) 76bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 77bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly error = extra->parser( p, p + item_size, item_data ); 78bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( error ) goto Exit; 79bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 80bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly break; 81bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 82bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 83bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 84bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 85bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly p += item_size; 86bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 87bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 88bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Exit: 89bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly *pp = p; 90bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly return error; 91bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 92bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Too_Short: 93bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_ERROR(( "pfr_extra_items_parse: invalid extra items table\n" )); 94727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Table ); 95bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 96bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 97bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 98bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 99bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 100bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 101bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***** *****/ 102bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***** PFR HEADER *****/ 103bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***** *****/ 104bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 105bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 106bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 107bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly static const FT_Frame_Field pfr_header_fields[] = 108bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 109bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#undef FT_STRUCTURE 110bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#define FT_STRUCTURE PFR_HeaderRec 111bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 112bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_START( 58 ), 113bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_ULONG ( signature ), 114bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_USHORT( version ), 115bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_USHORT( signature2 ), 116bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_USHORT( header_size ), 117bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 118bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_USHORT( log_dir_size ), 119bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_USHORT( log_dir_offset ), 120bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 121bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_USHORT( log_font_max_size ), 122bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_UOFF3 ( log_font_section_size ), 123bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_UOFF3 ( log_font_section_offset ), 124bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 125bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_USHORT( phy_font_max_size ), 126bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_UOFF3 ( phy_font_section_size ), 127bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_UOFF3 ( phy_font_section_offset ), 128bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 129bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_USHORT( gps_max_size ), 130bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_UOFF3 ( gps_section_size ), 131bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_UOFF3 ( gps_section_offset ), 132bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 133bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_BYTE ( max_blue_values ), 134bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_BYTE ( max_x_orus ), 135bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_BYTE ( max_y_orus ), 136bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 137bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_BYTE ( phy_font_max_size_high ), 138bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_BYTE ( color_flags ), 139bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 140bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_UOFF3 ( bct_max_size ), 141bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_UOFF3 ( bct_set_max_size ), 142bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_UOFF3 ( phy_bct_set_max_size ), 143bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 144bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_USHORT( num_phy_fonts ), 145bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_BYTE ( max_vert_stem_snap ), 146bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_BYTE ( max_horz_stem_snap ), 147bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_USHORT( max_chars ), 148bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_END 149bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly }; 150bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 151bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 152bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_LOCAL_DEF( FT_Error ) 153bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly pfr_header_load( PFR_Header header, 154bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Stream stream ) 155bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 156bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Error error; 157bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 158bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 159bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* read header directly */ 160bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( !FT_STREAM_SEEK( 0 ) && 161bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly !FT_STREAM_READ_FIELDS( pfr_header_fields, header ) ) 162bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 163bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* make a few adjustments to the header */ 164bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly header->phy_font_max_size += 165bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly (FT_UInt32)header->phy_font_max_size_high << 16; 166bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 167bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 168bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly return error; 169bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 170bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 171bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 172bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_LOCAL_DEF( FT_Bool ) 173bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly pfr_header_check( PFR_Header header ) 174bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 175bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Bool result = 1; 176bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 177bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 178bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* check signature and header size */ 179bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( header->signature != 0x50465230L || /* "PFR0" */ 180bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly header->version > 4 || 181bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly header->header_size < 58 || 182bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly header->signature2 != 0x0d0a ) /* CR/LF */ 183bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 184bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly result = 0; 185bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 186bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly return result; 187bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 188bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 189bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 190bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***********************************************************************/ 191bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***********************************************************************/ 192bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***** *****/ 193bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***** PFR LOGICAL FONTS *****/ 194bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***** *****/ 195bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***********************************************************************/ 196bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***********************************************************************/ 197bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 198bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 199bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_LOCAL_DEF( FT_Error ) 200bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly pfr_log_font_count( FT_Stream stream, 201bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt32 section_offset, 202bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt *acount ) 203bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 204bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Error error; 205bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt count; 206bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt result = 0; 207bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 208bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 209bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( FT_STREAM_SEEK( section_offset ) || FT_READ_USHORT( count ) ) 210bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 211bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 212bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly result = count; 213bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 214bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Exit: 215bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly *acount = result; 216bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly return error; 217bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 218bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 219bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 220bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_LOCAL_DEF( FT_Error ) 221bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly pfr_log_font_load( PFR_LogFont log_font, 222bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Stream stream, 223bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt idx, 224bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt32 section_offset, 225bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Bool size_increment ) 226bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 227bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt num_log_fonts; 228bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt flags; 229bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt32 offset; 230bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt32 size; 231bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Error error; 232bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 233bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 234bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( FT_STREAM_SEEK( section_offset ) || 235bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_READ_USHORT( num_log_fonts ) ) 236bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 237bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 238bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( idx >= num_log_fonts ) 239727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_THROW( Invalid_Argument ); 240bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 241bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( FT_STREAM_SKIP( idx * 5 ) || 242bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_READ_USHORT( size ) || 243bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_READ_UOFF3 ( offset ) ) 244bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 245bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 246bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* save logical font size and offset */ 247bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly log_font->size = size; 248bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly log_font->offset = offset; 249bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 250bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* now, check the rest of the table before loading it */ 251bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 252bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Byte* p; 253bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Byte* limit; 254bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt local; 255bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 256bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 257bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) ) 258bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 259bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 260bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly p = stream->cursor; 261bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly limit = p + size; 262bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 263bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK(13); 264bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 265bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly log_font->matrix[0] = PFR_NEXT_LONG( p ); 266bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly log_font->matrix[1] = PFR_NEXT_LONG( p ); 267bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly log_font->matrix[2] = PFR_NEXT_LONG( p ); 268bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly log_font->matrix[3] = PFR_NEXT_LONG( p ); 269bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 270bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly flags = PFR_NEXT_BYTE( p ); 271bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 272bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly local = 0; 273bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags & PFR_LOG_STROKE ) 274bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 275bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly local++; 276bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags & PFR_LOG_2BYTE_STROKE ) 277bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly local++; 278bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 279bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( (flags & PFR_LINE_JOIN_MASK) == PFR_LINE_JOIN_MITER ) 280bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly local += 3; 281bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 282bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags & PFR_LOG_BOLD ) 283bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 284bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly local++; 285bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags & PFR_LOG_2BYTE_BOLD ) 286bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly local++; 287bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 288bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 289bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( local ); 290bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 291bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags & PFR_LOG_STROKE ) 292bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 293bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly log_font->stroke_thickness = ( flags & PFR_LOG_2BYTE_STROKE ) 294bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ? PFR_NEXT_SHORT( p ) 295bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly : PFR_NEXT_BYTE( p ); 296bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 297bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( ( flags & PFR_LINE_JOIN_MASK ) == PFR_LINE_JOIN_MITER ) 298bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly log_font->miter_limit = PFR_NEXT_LONG( p ); 299bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 300bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 301bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags & PFR_LOG_BOLD ) 302bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 303bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly log_font->bold_thickness = ( flags & PFR_LOG_2BYTE_BOLD ) 304bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ? PFR_NEXT_SHORT( p ) 305bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly : PFR_NEXT_BYTE( p ); 306bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 307bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 308bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags & PFR_LOG_EXTRA_ITEMS ) 309bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 310bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly error = pfr_extra_items_skip( &p, limit ); 311bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if (error) goto Fail; 312bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 313bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 314bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK(5); 315bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly log_font->phys_size = PFR_NEXT_USHORT( p ); 316bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly log_font->phys_offset = PFR_NEXT_ULONG( p ); 317bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( size_increment ) 318bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 319bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( 1 ); 320bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly log_font->phys_size += (FT_UInt32)PFR_NEXT_BYTE( p ) << 16; 321bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 322bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 323bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 324bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Fail: 325bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_EXIT(); 326bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 327bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Exit: 328bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly return error; 329bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 330bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Too_Short: 331bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_ERROR(( "pfr_log_font_load: invalid logical font table\n" )); 332727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Table ); 333bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Fail; 334bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 335bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 336bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 337bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***********************************************************************/ 338bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***********************************************************************/ 339bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***** *****/ 340bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***** PFR PHYSICAL FONTS *****/ 341bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***** *****/ 342bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***********************************************************************/ 343bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /***********************************************************************/ 344bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 345bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 346bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* load bitmap strikes lists */ 347bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_CALLBACK_DEF( FT_Error ) 348bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly pfr_extra_item_load_bitmap_info( FT_Byte* p, 349bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Byte* limit, 350bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_PhyFont phy_font ) 351bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 352bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Memory memory = phy_font->memory; 353bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_Strike strike; 354bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt flags0; 355bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt n, count, size1; 356727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 357bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 358bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 359bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( 5 ); 360bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 361bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly p += 3; /* skip bctSize */ 362bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly flags0 = PFR_NEXT_BYTE( p ); 363bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly count = PFR_NEXT_BYTE( p ); 364bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 365bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* re-allocate when needed */ 366bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( phy_font->num_strikes + count > phy_font->max_strikes ) 367bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 368bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt new_max = FT_PAD_CEIL( phy_font->num_strikes + count, 4 ); 369bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 370bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 371bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( FT_RENEW_ARRAY( phy_font->strikes, 372bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->num_strikes, 373bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly new_max ) ) 374bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 375bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 376bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->max_strikes = new_max; 377bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 378bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 379bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly size1 = 1 + 1 + 1 + 2 + 2 + 1; 380bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags0 & PFR_STRIKE_2BYTE_XPPM ) 381bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly size1++; 382bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 383bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags0 & PFR_STRIKE_2BYTE_YPPM ) 384bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly size1++; 385bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 386bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags0 & PFR_STRIKE_3BYTE_SIZE ) 387bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly size1++; 388bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 389bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags0 & PFR_STRIKE_3BYTE_OFFSET ) 390bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly size1++; 391bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 392bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags0 & PFR_STRIKE_2BYTE_COUNT ) 393bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly size1++; 394bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 395bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly strike = phy_font->strikes + phy_font->num_strikes; 396bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 397bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( count * size1 ); 398bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 399bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly for ( n = 0; n < count; n++, strike++ ) 400bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 401bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly strike->x_ppm = ( flags0 & PFR_STRIKE_2BYTE_XPPM ) 402bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ? PFR_NEXT_USHORT( p ) 403bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly : PFR_NEXT_BYTE( p ); 404bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 405bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly strike->y_ppm = ( flags0 & PFR_STRIKE_2BYTE_YPPM ) 406bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ? PFR_NEXT_USHORT( p ) 407bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly : PFR_NEXT_BYTE( p ); 408bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 409bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly strike->flags = PFR_NEXT_BYTE( p ); 410bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 411bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly strike->bct_size = ( flags0 & PFR_STRIKE_3BYTE_SIZE ) 412bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ? PFR_NEXT_ULONG( p ) 413bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly : PFR_NEXT_USHORT( p ); 414bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 415bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly strike->bct_offset = ( flags0 & PFR_STRIKE_3BYTE_OFFSET ) 416bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ? PFR_NEXT_ULONG( p ) 417bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly : PFR_NEXT_USHORT( p ); 418bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 419bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly strike->num_bitmaps = ( flags0 & PFR_STRIKE_2BYTE_COUNT ) 420bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ? PFR_NEXT_USHORT( p ) 421bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly : PFR_NEXT_BYTE( p ); 422bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 423bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 424bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->num_strikes += count; 425bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 426bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Exit: 427bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly return error; 428bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 429bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Too_Short: 430727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Table ); 431bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_ERROR(( "pfr_extra_item_load_bitmap_info:" 432bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly " invalid bitmap info table\n" )); 433bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 434bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 435bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 436bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 437bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* Load font ID. This is a so-called "unique" name that is rather 438bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly * long and descriptive (like "Tiresias ScreenFont v7.51"). 439bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly * 440bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly * Note that a PFR font's family name is contained in an *undocumented* 441bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly * string of the "auxiliary data" portion of a physical font record. This 442bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly * may also contain the "real" style name! 443bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly * 444bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly * If no family name is present, the font ID is used instead for the 445bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly * family. 446bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly */ 447bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_CALLBACK_DEF( FT_Error ) 448bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly pfr_extra_item_load_font_id( FT_Byte* p, 449bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Byte* limit, 450bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_PhyFont phy_font ) 451bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 452727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 453bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Memory memory = phy_font->memory; 454bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_PtrDist len = limit - p; 455bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 456bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 457bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( phy_font->font_id != NULL ) 458bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 459bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 460bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( FT_ALLOC( phy_font->font_id, len + 1 ) ) 461bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 462bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 463bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* copy font ID name, and terminate it for safety */ 464bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_MEM_COPY( phy_font->font_id, p, len ); 465bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->font_id[len] = 0; 466bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 467bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Exit: 468bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly return error; 469bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 470bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 471bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 472bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* load stem snap tables */ 473bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_CALLBACK_DEF( FT_Error ) 474bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly pfr_extra_item_load_stem_snaps( FT_Byte* p, 475bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Byte* limit, 476bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_PhyFont phy_font ) 477bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 478bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt count, num_vert, num_horz; 479bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Int* snaps = NULL; 480727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 481bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Memory memory = phy_font->memory; 482bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 483bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 484bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( phy_font->vertical.stem_snaps != NULL ) 485bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 486bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 487bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( 1 ); 488bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly count = PFR_NEXT_BYTE( p ); 489bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 490bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly num_vert = count & 15; 491bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly num_horz = count >> 4; 492bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly count = num_vert + num_horz; 493bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 494bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( count * 2 ); 495bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 496bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( FT_NEW_ARRAY( snaps, count ) ) 497bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 498bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 499bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->vertical.stem_snaps = snaps; 500bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->horizontal.stem_snaps = snaps + num_vert; 501bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 502bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly for ( ; count > 0; count--, snaps++ ) 503bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly *snaps = FT_NEXT_SHORT( p ); 504bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 505bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Exit: 506bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly return error; 507bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 508bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Too_Short: 509727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Table ); 510bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_ERROR(( "pfr_exta_item_load_stem_snaps:" 511bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly " invalid stem snaps table\n" )); 512bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 513bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 514bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 515bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 516bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 517bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* load kerning pair data */ 518bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_CALLBACK_DEF( FT_Error ) 519bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly pfr_extra_item_load_kerning_pairs( FT_Byte* p, 520bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Byte* limit, 521bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_PhyFont phy_font ) 522bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 523bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_KernItem item = NULL; 524727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 525bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Memory memory = phy_font->memory; 526bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 527bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 528bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_TRACE2(( "pfr_extra_item_load_kerning_pairs()\n" )); 529bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 530bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( FT_NEW( item ) ) 531bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 532bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 533bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( 4 ); 534bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 535bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item->pair_count = PFR_NEXT_BYTE( p ); 536bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item->base_adj = PFR_NEXT_SHORT( p ); 537bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item->flags = PFR_NEXT_BYTE( p ); 538bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item->offset = phy_font->offset + ( p - phy_font->cursor ); 539bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 540bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#ifndef PFR_CONFIG_NO_CHECKS 541bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item->pair_size = 3; 542bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 543bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( item->flags & PFR_KERN_2BYTE_CHAR ) 544bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item->pair_size += 2; 545bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 546bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( item->flags & PFR_KERN_2BYTE_ADJ ) 547bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item->pair_size += 1; 548bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 549bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( item->pair_count * item->pair_size ); 550bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#endif 551bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 552bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* load first and last pairs into the item to speed up */ 553bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* lookup later... */ 554bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( item->pair_count > 0 ) 555bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 556bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt char1, char2; 557bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Byte* q; 558bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 559bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 560bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( item->flags & PFR_KERN_2BYTE_CHAR ) 561bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 562bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly q = p; 563bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly char1 = PFR_NEXT_USHORT( q ); 564bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly char2 = PFR_NEXT_USHORT( q ); 565bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 566bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item->pair1 = PFR_KERN_INDEX( char1, char2 ); 567bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 568bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly q = p + item->pair_size * ( item->pair_count - 1 ); 569bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly char1 = PFR_NEXT_USHORT( q ); 570bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly char2 = PFR_NEXT_USHORT( q ); 571bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 572bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item->pair2 = PFR_KERN_INDEX( char1, char2 ); 573bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 574bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly else 575bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 576bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly q = p; 577bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly char1 = PFR_NEXT_BYTE( q ); 578bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly char2 = PFR_NEXT_BYTE( q ); 579bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 580bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item->pair1 = PFR_KERN_INDEX( char1, char2 ); 581bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 582bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly q = p + item->pair_size * ( item->pair_count - 1 ); 583bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly char1 = PFR_NEXT_BYTE( q ); 584bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly char2 = PFR_NEXT_BYTE( q ); 585bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 586bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item->pair2 = PFR_KERN_INDEX( char1, char2 ); 587bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 588bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 589bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* add new item to the current list */ 590bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item->next = NULL; 591bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly *phy_font->kern_items_tail = item; 592bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->kern_items_tail = &item->next; 593bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->num_kern_pairs += item->pair_count; 594bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 595bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly else 596bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 597bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* empty item! */ 598bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FREE( item ); 599bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 600bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 601bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Exit: 602bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly return error; 603bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 604bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Too_Short: 605bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FREE( item ); 606bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 607727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Table ); 608bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_ERROR(( "pfr_extra_item_load_kerning_pairs:" 609bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly " invalid kerning pairs table\n" )); 610bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 611bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 612bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 613bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 614bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 615bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly static const PFR_ExtraItemRec pfr_phy_font_extra_items[] = 616bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 617bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 1, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_bitmap_info }, 618bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 2, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_font_id }, 619bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 3, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_stem_snaps }, 620bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 4, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_kerning_pairs }, 621bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 0, NULL } 622bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly }; 623bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 624bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 625bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* Loads a name from the auxiliary data. Since this extracts undocumented 626bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly * strings from the font file, we need to be careful here. 627bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly */ 628bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly static FT_Error 629bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly pfr_aux_name_load( FT_Byte* p, 630bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt len, 631bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Memory memory, 632bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_String* *astring ) 633bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 634727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 635bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_String* result = NULL; 636bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt n, ok; 637bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 638bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 639bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( len > 0 && p[len - 1] == 0 ) 640bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly len--; 641bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 642bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* check that each character is ASCII for making sure not to 643bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly load garbage 644bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly */ 645bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ok = ( len > 0 ); 646bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly for ( n = 0; n < len; n++ ) 647bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( p[n] < 32 || p[n] > 127 ) 648bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 649bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ok = 0; 650bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly break; 651bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 652bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 653bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( ok ) 654bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 655bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( FT_ALLOC( result, len + 1 ) ) 656bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 657bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 658bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_MEM_COPY( result, p, len ); 659bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly result[len] = 0; 660bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 661bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Exit: 662bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly *astring = result; 663bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly return error; 664bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 665bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 666bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 667bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_LOCAL_DEF( void ) 668bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly pfr_phy_font_done( PFR_PhyFont phy_font, 669bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Memory memory ) 670bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 671bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FREE( phy_font->font_id ); 672bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FREE( phy_font->family_name ); 673bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FREE( phy_font->style_name ); 674bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 675bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FREE( phy_font->vertical.stem_snaps ); 676bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->vertical.num_stem_snaps = 0; 677bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 678bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->horizontal.stem_snaps = NULL; 679bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->horizontal.num_stem_snaps = 0; 680bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 681bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FREE( phy_font->strikes ); 682bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->num_strikes = 0; 683bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->max_strikes = 0; 684bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 685bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FREE( phy_font->chars ); 686bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->num_chars = 0; 687bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->chars_offset = 0; 688bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 689bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FREE( phy_font->blue_values ); 690bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->num_blue_values = 0; 691bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 692bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 693bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_KernItem item, next; 694bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 695bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 696bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item = phy_font->kern_items; 697bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly while ( item ) 698bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 699bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly next = item->next; 700bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FREE( item ); 701bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly item = next; 702bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 703bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->kern_items = NULL; 704bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->kern_items_tail = NULL; 705bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 706bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 707bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->num_kern_pairs = 0; 708bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 709bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 710bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 711bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_LOCAL_DEF( FT_Error ) 712bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly pfr_phy_font_load( PFR_PhyFont phy_font, 713bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Stream stream, 714bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt32 offset, 715bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt32 size ) 716bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 717bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Error error; 718bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Memory memory = stream->memory; 719bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt flags; 720bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_ULong num_aux; 721bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Byte* p; 722bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Byte* limit; 723bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 724bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 725bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->memory = memory; 726bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->offset = offset; 727bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 728bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->kern_items = NULL; 729bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->kern_items_tail = &phy_font->kern_items; 730bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 731bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) ) 732bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 733bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 734bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->cursor = stream->cursor; 735bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 736bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly p = stream->cursor; 737bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly limit = p + size; 738bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 739bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( 15 ); 740bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->font_ref_number = PFR_NEXT_USHORT( p ); 741bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->outline_resolution = PFR_NEXT_USHORT( p ); 742bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->metrics_resolution = PFR_NEXT_USHORT( p ); 743bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->bbox.xMin = PFR_NEXT_SHORT( p ); 744bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->bbox.yMin = PFR_NEXT_SHORT( p ); 745bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->bbox.xMax = PFR_NEXT_SHORT( p ); 746bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->bbox.yMax = PFR_NEXT_SHORT( p ); 747bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->flags = flags = PFR_NEXT_BYTE( p ); 748bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 749bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* get the standard advance for non-proportional fonts */ 750bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( !(flags & PFR_PHY_PROPORTIONAL) ) 751bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 752bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( 2 ); 753bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->standard_advance = PFR_NEXT_SHORT( p ); 754bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 755bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 756bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* load the extra items when present */ 757bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags & PFR_PHY_EXTRA_ITEMS ) 758bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 759bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly error = pfr_extra_items_parse( &p, limit, 760bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly pfr_phy_font_extra_items, phy_font ); 761bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 762bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( error ) 763bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Fail; 764bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 765bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 766bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* In certain fonts, the auxiliary bytes contain interesting */ 767bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* information. These are not in the specification but can be */ 768bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* guessed by looking at the content of a few PFR0 fonts. */ 769bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( 3 ); 770bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly num_aux = PFR_NEXT_ULONG( p ); 771bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 772bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( num_aux > 0 ) 773bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 774bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Byte* q = p; 775bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Byte* q2; 776bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 777bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 778bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( num_aux ); 779bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly p += num_aux; 780bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 781bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly while ( num_aux > 0 ) 782bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 783bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt length, type; 784bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 785bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 786bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( q + 4 > p ) 787bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly break; 788bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 789bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly length = PFR_NEXT_USHORT( q ); 790bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( length < 4 || length > num_aux ) 791bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly break; 792bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 793bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly q2 = q + length - 2; 794bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly type = PFR_NEXT_USHORT( q ); 795bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 796bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly switch ( type ) 797bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 798bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly case 1: 799bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* this seems to correspond to the font's family name, 800bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly * padded to 16-bits with one zero when necessary 801bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly */ 802bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly error = pfr_aux_name_load( q, length - 4U, memory, 803bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly &phy_font->family_name ); 804bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( error ) 805bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 806bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly break; 807bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 808bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly case 2: 809bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( q + 32 > q2 ) 810bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly break; 811bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 812bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly q += 10; 813bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->ascent = PFR_NEXT_SHORT( q ); 814bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->descent = PFR_NEXT_SHORT( q ); 815bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->leading = PFR_NEXT_SHORT( q ); 816bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly q += 16; 817bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly break; 818bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 819bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly case 3: 820bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* this seems to correspond to the font's style name, 821bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly * padded to 16-bits with one zero when necessary 822bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly */ 823bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly error = pfr_aux_name_load( q, length - 4U, memory, 824bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly &phy_font->style_name ); 825bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( error ) 826bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Exit; 827bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly break; 828bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 829bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly default: 830bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ; 831bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 832bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 833bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly q = q2; 834bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly num_aux -= length; 835bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 836bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 837bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 838bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* read the blue values */ 839bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 840bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt n, count; 841bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 842bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 843bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( 1 ); 844bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->num_blue_values = count = PFR_NEXT_BYTE( p ); 845bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 846bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( count * 2 ); 847bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 848bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( FT_NEW_ARRAY( phy_font->blue_values, count ) ) 849bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Fail; 850bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 851bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly for ( n = 0; n < count; n++ ) 852bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->blue_values[n] = PFR_NEXT_SHORT( p ); 853bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 854bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 855bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( 8 ); 856bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->blue_fuzz = PFR_NEXT_BYTE( p ); 857bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->blue_scale = PFR_NEXT_BYTE( p ); 858bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 859bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->vertical.standard = PFR_NEXT_USHORT( p ); 860bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->horizontal.standard = PFR_NEXT_USHORT( p ); 861bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 862bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* read the character descriptors */ 863bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 864bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt n, count, Size; 865bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 866bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 867bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->num_chars = count = PFR_NEXT_USHORT( p ); 868bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->chars_offset = offset + ( p - stream->cursor ); 869bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 870bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( FT_NEW_ARRAY( phy_font->chars, count ) ) 871bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Fail; 872bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 873bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Size = 1 + 1 + 2; 874bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags & PFR_PHY_2BYTE_CHARCODE ) 875bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Size += 1; 876bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 877bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags & PFR_PHY_PROPORTIONAL ) 878bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Size += 2; 879bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 880bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags & PFR_PHY_ASCII_CODE ) 881bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Size += 1; 882bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 883bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags & PFR_PHY_2BYTE_GPS_SIZE ) 884bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Size += 1; 885bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 886bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags & PFR_PHY_3BYTE_GPS_OFFSET ) 887bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Size += 1; 888bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 889bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_CHECK( count * Size ); 890bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 891bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly for ( n = 0; n < count; n++ ) 892bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 893bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly PFR_Char cur = &phy_font->chars[n]; 894bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 895bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 896bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly cur->char_code = ( flags & PFR_PHY_2BYTE_CHARCODE ) 897bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ? PFR_NEXT_USHORT( p ) 898bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly : PFR_NEXT_BYTE( p ); 899bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 900bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly cur->advance = ( flags & PFR_PHY_PROPORTIONAL ) 901bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ? PFR_NEXT_SHORT( p ) 902bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly : (FT_Int) phy_font->standard_advance; 903bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 904bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#if 0 905bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly cur->ascii = ( flags & PFR_PHY_ASCII_CODE ) 906bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ? PFR_NEXT_BYTE( p ) 907bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly : 0; 908bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#else 909bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( flags & PFR_PHY_ASCII_CODE ) 910bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly p += 1; 911bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#endif 912bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly cur->gps_size = ( flags & PFR_PHY_2BYTE_GPS_SIZE ) 913bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ? PFR_NEXT_USHORT( p ) 914bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly : PFR_NEXT_BYTE( p ); 915bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 916bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly cur->gps_offset = ( flags & PFR_PHY_3BYTE_GPS_OFFSET ) 917bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ? PFR_NEXT_ULONG( p ) 918bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly : PFR_NEXT_USHORT( p ); 919bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 920bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 921bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 922bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* that's it! */ 923bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 924bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Fail: 925bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_FRAME_EXIT(); 926bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 927bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* save position of bitmap info */ 928bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->bct_offset = FT_STREAM_POS(); 929bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly phy_font->cursor = NULL; 930bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 931bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Exit: 932bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly return error; 933bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 934bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly Too_Short: 935727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Table ); 936bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_ERROR(( "pfr_phy_font_load: invalid physical font table\n" )); 937bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly goto Fail; 938bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 939bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 940bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 941bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* END */ 942