1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* cffobjs.c */ 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* OpenType objects manager (body). */ 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier/* Copyright 1996-2012 by */ 8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* This file is part of the FreeType project, and may only be used, */ 11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* modified, and distributed under the terms of the FreeType project */ 12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* this file you indicate that you have read the license and */ 14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* understand and accept it fully. */ 15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h> 20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_CALC_H 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_STREAM_H 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_ERRORS_H 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRUETYPE_IDS_H 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRUETYPE_TAGS_H 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_SFNT_H 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffobjs.h" 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffload.h" 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffcmap.h" 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cfferrs.h" 31295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "cffpic.h" 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* messages during execution. */ 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_COMPONENT 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT trace_cffobjs 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SIZE FUNCTIONS */ 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Note that we store the global hints in the size's `internal' root */ 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* field. */ 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static PSH_Globals_Funcs 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_size_get_globals_funcs( CFF_Size size ) 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Face face = (CFF_Face)size->root.face; 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font font = (CFF_Font)face->extra.data; 59aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich PSHinter_Service pshinter = font->pshinter; 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Module module; 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project module = FT_Get_Module( size->root.face->driver->root.library, 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project "pshinter" ); 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( module && pshinter && pshinter->get_globals_funcs ) 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ? pshinter->get_globals_funcs( module ) 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : 0; 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_size_done( FT_Size cffsize ) /* CFF_Size */ 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Size size = (CFF_Size)cffsize; 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Face face = (CFF_Face)size->root.face; 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font font = (CFF_Font)face->extra.data; 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Internal internal = (CFF_Internal)cffsize->internal; 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( internal ) 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PSH_Globals_Funcs funcs; 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs = cff_size_get_globals_funcs( size ); 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( funcs ) 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt i; 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->destroy( internal->topfont ); 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = font->num_subfonts; i > 0; i-- ) 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->destroy( internal->subfonts[i - 1] ); 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* `internal' is freed by destroy_size (in ftobjs.c) */ 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CFF and Type 1 private dictionaries have slightly different */ 1030a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* structures; we need to synthesize a Type 1 dictionary on the fly */ 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_make_private_dict( CFF_SubFont subfont, 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Private priv ) 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Private cpriv = &subfont->private_dict; 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt n, count; 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ZERO( priv, sizeof ( *priv ) ); 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = priv->num_blue_values = cpriv->num_blue_values; 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < count; n++ ) 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->blue_values[n] = (FT_Short)cpriv->blue_values[n]; 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = priv->num_other_blues = cpriv->num_other_blues; 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < count; n++ ) 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->other_blues[n] = (FT_Short)cpriv->other_blues[n]; 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = priv->num_family_blues = cpriv->num_family_blues; 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < count; n++ ) 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->family_blues[n] = (FT_Short)cpriv->family_blues[n]; 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = priv->num_family_other_blues = cpriv->num_family_other_blues; 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < count; n++ ) 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n]; 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->blue_scale = cpriv->blue_scale; 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->blue_shift = (FT_Int)cpriv->blue_shift; 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->blue_fuzz = (FT_Int)cpriv->blue_fuzz; 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->standard_width[0] = (FT_UShort)cpriv->standard_width; 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->standard_height[0] = (FT_UShort)cpriv->standard_height; 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = priv->num_snap_widths = cpriv->num_snap_widths; 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < count; n++ ) 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n]; 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = priv->num_snap_heights = cpriv->num_snap_heights; 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < count; n++ ) 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n]; 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->force_bold = cpriv->force_bold; 147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->language_group = cpriv->language_group; 148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->lenIV = cpriv->lenIV; 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_size_init( FT_Size cffsize ) /* CFF_Size */ 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Size size = (CFF_Size)cffsize; 156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = CFF_Err_Ok; 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PSH_Globals_Funcs funcs = cff_size_get_globals_funcs( size ); 158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( funcs ) 161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Face face = (CFF_Face)cffsize->face; 163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font font = (CFF_Font)face->extra.data; 164aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner CFF_Internal internal = NULL; 165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_PrivateRec priv; 167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = cffsize->face->memory; 168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt i; 170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_NEW( internal ) ) 173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_make_private_dict( &font->top_font, &priv ); 176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = funcs->create( cffsize->face->memory, &priv, 177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &internal->topfont ); 178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = font->num_subfonts; i > 0; i-- ) 182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_SubFont sub = font->subfonts[i - 1]; 184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_make_private_dict( sub, &priv ); 187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = funcs->create( cffsize->face->memory, &priv, 188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &internal->subfonts[i - 1] ); 189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffsize->internal = (FT_Size_Internal)(void*)internal; 194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->strike_index = 0xFFFFFFFFUL; 197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS 204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_size_select( FT_Size size, 207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong strike_index ) 208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Size cffsize = (CFF_Size)size; 210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PSH_Globals_Funcs funcs; 211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffsize->strike_index = strike_index; 214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Select_Metrics( size->face, strike_index ); 216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs = cff_size_get_globals_funcs( cffsize ); 218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( funcs ) 220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Face face = (CFF_Face)size->face; 222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font font = (CFF_Font)face->extra.data; 223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Internal internal = (CFF_Internal)size->internal; 224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 225295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_ULong top_upm = font->top_font.font_dict.units_per_em; 226295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_UInt i; 227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->set_scale( internal->topfont, 230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->metrics.x_scale, size->metrics.y_scale, 231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0, 0 ); 232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = font->num_subfonts; i > 0; i-- ) 234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_SubFont sub = font->subfonts[i - 1]; 236295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_ULong sub_upm = sub->font_dict.units_per_em; 237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos x_scale, y_scale; 238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( top_upm != sub_upm ) 241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); 243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); 244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x_scale = size->metrics.x_scale; 248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y_scale = size->metrics.y_scale; 249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->set_scale( internal->subfonts[i - 1], 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x_scale, y_scale, 0, 0 ); 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CFF_Err_Ok; 257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ 260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_size_request( FT_Size size, 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Size_Request req ) 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Size cffsize = (CFF_Size)size; 267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PSH_Globals_Funcs funcs; 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS 271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_HAS_FIXED_SIZES( size->face ) ) 273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Face cffface = (CFF_Face)size->face; 275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SFNT_Service sfnt = (SFNT_Service)cffface->sfnt; 276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong strike_index; 277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) ) 280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffsize->strike_index = 0xFFFFFFFFUL; 281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cff_size_select( size, strike_index ); 283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ 286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Request_Metrics( size->face, req ); 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs = cff_size_get_globals_funcs( cffsize ); 290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( funcs ) 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Face cffface = (CFF_Face)size->face; 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font font = (CFF_Font)cffface->extra.data; 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Internal internal = (CFF_Internal)size->internal; 296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 297295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_ULong top_upm = font->top_font.font_dict.units_per_em; 298295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_UInt i; 299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->set_scale( internal->topfont, 302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->metrics.x_scale, size->metrics.y_scale, 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0, 0 ); 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = font->num_subfonts; i > 0; i-- ) 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_SubFont sub = font->subfonts[i - 1]; 308295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_ULong sub_upm = sub->font_dict.units_per_em; 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos x_scale, y_scale; 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( top_upm != sub_upm ) 313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x_scale = size->metrics.x_scale; 320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y_scale = size->metrics.y_scale; 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->set_scale( internal->subfonts[i - 1], 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x_scale, y_scale, 0, 0 ); 325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CFF_Err_Ok; 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SLOT FUNCTIONS */ 335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_slot_done( FT_GlyphSlot slot ) 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project slot->internal->glyph_hints = 0; 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_slot_init( FT_GlyphSlot slot ) 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Face face = (CFF_Face)slot->face; 349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font font = (CFF_Font)face->extra.data; 350aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich PSHinter_Service pshinter = font->pshinter; 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( pshinter ) 354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Module module; 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project module = FT_Get_Module( slot->face->driver->root.library, 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project "pshinter" ); 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( module ) 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project T2_Hints_Funcs funcs; 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs = pshinter->get_t2_funcs( module ); 366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project slot->internal->glyph_hints = (void*)funcs; 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CFF_Err_Ok; 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FACE FUNCTIONS */ 377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_String* 381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_strcpy( FT_Memory memory, 382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_String* source ) 383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_String* result; 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (void)FT_STRDUP( result, source ); 389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( error ); 391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return result; 393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 396aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* Strip all subset prefixes of the form `ABCDEF+'. Usually, there */ 397aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold' */ 398aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* have been seen in the wild. */ 399aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 400aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich static void 401aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich remove_subset_prefix( FT_String* name ) 402aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 403aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_Int32 idx = 0; 404aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_Int32 length = strlen( name ) + 1; 405aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_Bool continue_search = 1; 40641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 407aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 408aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich while ( continue_search ) 409aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 410aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( length >= 7 && name[6] == '+' ) 411aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 412aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich for ( idx = 0; idx < 6; idx++ ) 413aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 414aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* ASCII uppercase letters */ 415aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) ) 416aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich continue_search = 0; 417aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 418aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 419aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( continue_search ) 420aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 421aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich for ( idx = 7; idx < length; idx++ ) 422aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich name[idx - 7] = name[idx]; 423aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner length -= 7; 424aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 425aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 426aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich else 427aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich continue_search = 0; 428aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 429aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 430aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 431aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 432aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* Remove the style part from the family name (if present). */ 433aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 434aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner static void 435aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner remove_style( FT_String* family_name, 436aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner const FT_String* style_name ) 437aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 438aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Int32 family_name_length, style_name_length; 439aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 440aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 441aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner family_name_length = strlen( family_name ); 442aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner style_name_length = strlen( style_name ); 443aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 444aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( family_name_length > style_name_length ) 445aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 446aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Int idx; 447aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 448aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 449aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner for ( idx = 1; idx <= style_name_length; ++idx ) 450aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 451aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( family_name[family_name_length - idx] != 452aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner style_name[style_name_length - idx] ) 453aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner break; 454aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 455aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 456aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( idx > style_name_length ) 457aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 458aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* family_name ends with style_name; remove it */ 459aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner idx = family_name_length - style_name_length - 1; 460aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 461aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* also remove special characters */ 462aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* between real family name and style */ 463aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner while ( idx > 0 && 464aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner ( family_name[idx] == '-' || 465aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner family_name[idx] == ' ' || 466aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner family_name[idx] == '_' || 467aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner family_name[idx] == '+' ) ) 468aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner --idx; 469aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 470aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( idx > 0 ) 471aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner family_name[idx + 1] = '\0'; 472aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 473aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 474aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 475aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 476aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_face_init( FT_Stream stream, 479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Face cffface, /* CFF_Face */ 480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int face_index, 481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int num_params, 482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Parameter* params ) 483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 484aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner CFF_Face face = (CFF_Face)cffface; 485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SFNT_Service sfnt; 487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Service_PsCMaps psnames; 488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PSHinter_Service pshinter; 489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool pure_cff = 1; 490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool sfnt_format = 0; 491aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Library library = cffface->driver->root.library; 492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sfnt = (SFNT_Service)FT_Get_Module_Interface( 495295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner library, "sfnt" ); 496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !sfnt ) 49741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier { 49841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_ERROR(( "cff_face_init: cannot access `sfnt' module\n" )); 49941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier error = CFF_Err_Missing_Module; 50041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier goto Exit; 50141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier } 502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); 504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pshinter = (PSHinter_Service)FT_Get_Module_Interface( 506295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner library, "pshinter" ); 507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 50841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_TRACE2(( "CFF driver\n" )); 50941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* create input stream from resource */ 511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_STREAM_SEEK( 0 ) ) 512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check whether we have a valid OpenType file */ 515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = sfnt->init_face( stream, face, face_index, num_params, params ); 516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5180a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( face->format_tag != TTAG_OTTO ) /* `OTTO'; OpenType/CFF font */ 519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 52041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_TRACE2(( " not an OpenType/CFF font\n" )); 52141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier error = CFF_Err_Unknown_File_Format; 52241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier goto Exit; 523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if we are performing a simple font format check, exit immediately */ 526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face_index < 0 ) 527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CFF_Err_Ok; 528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* UNDOCUMENTED! A CFF in an SFNT can have only a single font. */ 530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face_index > 0 ) 531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ERROR(( "cff_face_init: invalid face index\n" )); 533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = CFF_Err_Invalid_Argument; 534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sfnt_format = 1; 538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* now, the font can be either an OpenType/CFF font, or an SVG CEF */ 540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* font; in the latter case it doesn't have a `head' table */ 541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = face->goto_table( face, TTAG_head, stream, 0 ); 542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pure_cff = 0; 545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* load font directory */ 5470a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project error = sfnt->load_face( stream, face, 0, num_params, params ); 548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* load the `cmap' table explicitly */ 554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = sfnt->load_cmap( face, stream ); 555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: we don't load the GPOS table, as OpenType Layout */ 559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* support will be added later to a layout library on top of */ 560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType 2 */ 561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* now load the CFF part of the file */ 564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = face->goto_table( face, TTAG_CFF, stream, 0 ); 565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* rewind to start of file; we are going to load a pure-CFF font */ 571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_STREAM_SEEK( 0 ) ) 572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = CFF_Err_Ok; 574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* now load and parse the CFF table in the file */ 577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 578aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner CFF_Font cff = NULL; 579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_FontRecDict dict; 580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = cffface->memory; 581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 flags; 582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt i; 583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_NEW( cff ) ) 586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->extra.data = cff; 589295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner error = cff_font_load( library, stream, face_index, cff, pure_cff ); 590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff->pshinter = pshinter; 594aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cff->psnames = psnames; 595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5960a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project cffface->face_index = face_index; 5970a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Complement the root flags with some interesting information. */ 599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Note that this is only necessary for pure CFF and CEF fonts; */ 600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFNT based fonts use the `name' table instead. */ 601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->num_glyphs = cff->num_glyphs; 603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dict = &cff->top_font.font_dict; 605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* we need the `PSNames' module for CFF and CEF formats */ 607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* which aren't CID-keyed */ 608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( dict->cid_registry == 0xFFFFU && !psnames ) 609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 610295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_ERROR(( "cff_face_init:" 611295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner " cannot open CFF & CEF fonts\n" 612295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner " " 613295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner " without the `PSNames' module\n" )); 61441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier error = CFF_Err_Missing_Module; 61541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier goto Exit; 616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 618bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#ifdef FT_DEBUG_LEVEL_TRACE 619bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 620bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt idx; 621bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_String* s; 622bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 623bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 624bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_TRACE4(( "SIDs\n" )); 625bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 626bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* dump string index, including default strings for convenience */ 627bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly for ( idx = 0; idx < cff->num_strings + 390; idx++ ) 628bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 629bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly s = cff_index_get_sid_string( cff, idx ); 630bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( s ) 631bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_TRACE4((" %5d %s\n", idx, s )); 632bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 633bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 634bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#endif /* FT_DEBUG_LEVEL_TRACE */ 635bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 636bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( !dict->has_font_matrix ) 6370a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM; 6380a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6390a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* Normalize the font matrix so that `matrix->xx' is 1; the */ 6400a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* scaling is done with `units_per_em' then (at this point, */ 6410a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* it already contains the scaling factor, but without */ 6420a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* normalization of the matrix). */ 6430a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* */ 6440a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* Note that the offsets must be expressed in integer font */ 6450a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* units. */ 6460a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6470a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 6480a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Matrix* matrix = &dict->font_matrix; 6490a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Vector* offset = &dict->font_offset; 6500a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_ULong* upm = &dict->units_per_em; 6510a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Fixed temp = FT_ABS( matrix->yy ); 6520a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6530a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6540a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( temp != 0x10000L ) 6550a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 6560a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project *upm = FT_DivFix( *upm, temp ); 6570a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6580a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->xx = FT_DivFix( matrix->xx, temp ); 6590a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->yx = FT_DivFix( matrix->yx, temp ); 6600a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->xy = FT_DivFix( matrix->xy, temp ); 6610a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->yy = FT_DivFix( matrix->yy, temp ); 6620a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->x = FT_DivFix( offset->x, temp ); 6630a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->y = FT_DivFix( offset->y, temp ); 6640a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 6650a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6660a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->x >>= 16; 6670a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->y >>= 16; 6680a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 6690a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6700a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project for ( i = cff->num_subfonts; i > 0; i-- ) 6710a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 6720a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project CFF_FontRecDict sub = &cff->subfonts[i - 1]->font_dict; 6730a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project CFF_FontRecDict top = &cff->top_font.font_dict; 6740a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6750a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Matrix* matrix; 6760a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Vector* offset; 6770a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_ULong* upm; 6780a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Fixed temp; 6790a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6800a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 681bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( sub->has_font_matrix ) 6820a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 683295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Long scaling; 6840a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6850a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 686bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* if we have a top-level matrix, */ 687bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* concatenate the subfont matrix */ 688bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 689bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( top->has_font_matrix ) 690bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 691bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( top->units_per_em > 1 && sub->units_per_em > 1 ) 692bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly scaling = FT_MIN( top->units_per_em, sub->units_per_em ); 693bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly else 694bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly scaling = 1; 6950a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 696bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Matrix_Multiply_Scaled( &top->font_matrix, 697bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly &sub->font_matrix, 698bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly scaling ); 699bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Vector_Transform_Scaled( &sub->font_offset, 700bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly &top->font_matrix, 701bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly scaling ); 7020a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 703bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly sub->units_per_em = FT_MulDiv( sub->units_per_em, 704bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly top->units_per_em, 705bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly scaling ); 706bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 7070a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 7080a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project else 7090a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 7100a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project sub->font_matrix = top->font_matrix; 7110a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project sub->font_offset = top->font_offset; 7120a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 7130a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project sub->units_per_em = top->units_per_em; 7140a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 7150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 7160a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix = &sub->font_matrix; 7170a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset = &sub->font_offset; 7180a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project upm = &sub->units_per_em; 7190a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project temp = FT_ABS( matrix->yy ); 7200a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 7210a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( temp != 0x10000L ) 7220a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 7230a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project *upm = FT_DivFix( *upm, temp ); 7240a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 7250a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->xx = FT_DivFix( matrix->xx, temp ); 7260a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->yx = FT_DivFix( matrix->yx, temp ); 7270a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->xy = FT_DivFix( matrix->xy, temp ); 7280a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->yy = FT_DivFix( matrix->yy, temp ); 7290a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->x = FT_DivFix( offset->x, temp ); 7300a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->y = FT_DivFix( offset->y, temp ); 7310a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 7320a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 7330a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->x >>= 16; 7340a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->y >>= 16; 7350a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 7360a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( pure_cff ) 738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char* style_name = NULL; 740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set up num_faces */ 743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->num_faces = cff->num_faces; 744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compute number of glyphs */ 746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( dict->cid_registry != 0xFFFFU ) 7477f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner cffface->num_glyphs = cff->charset.max_cid + 1; 748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->num_glyphs = cff->charstrings_index.count; 750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set global bbox, as well as EM size */ 752295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner cffface->bbox.xMin = dict->font_bbox.xMin >> 16; 753295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner cffface->bbox.yMin = dict->font_bbox.yMin >> 16; 754295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* no `U' suffix here to 0xFFFF! */ 755295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16; 756295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16; 757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7580a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project cffface->units_per_EM = (FT_UShort)( dict->units_per_em ); 759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->ascender = (FT_Short)( cffface->bbox.yMax ); 761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->descender = (FT_Short)( cffface->bbox.yMin ); 762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 ); 764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cffface->height < cffface->ascender - cffface->descender ) 765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->height = (FT_Short)( cffface->ascender - cffface->descender ); 766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->underline_position = 768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_Short)( dict->underline_position >> 16 ); 769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->underline_thickness = 770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_Short)( dict->underline_thickness >> 16 ); 771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* retrieve font family & style name */ 773aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cffface->family_name = cff_index_get_name( cff, face_index ); 774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cffface->family_name ) 775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 776aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich char* full = cff_index_get_sid_string( cff, 777aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich dict->full_name ); 778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char* fullp = full; 779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char* family = cffface->family_name; 780aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich char* family_name = NULL; 781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 78341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier remove_subset_prefix( cffface->family_name ); 784aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( dict->family_name ) 786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 787aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich family_name = cff_index_get_sid_string( cff, 788aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich dict->family_name ); 789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( family_name ) 790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project family = family_name; 791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* We try to extract the style name from the full name. */ 794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* We need to ignore spaces and dashes during the search. */ 795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( full && family ) 796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( *fullp ) 798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* skip common characters at the start of both strings */ 800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( *fullp == *family ) 801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project family++; 803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fullp++; 804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ignore spaces and dashes in full name during comparison */ 808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( *fullp == ' ' || *fullp == '-' ) 809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fullp++; 811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ignore spaces and dashes in family name during comparison */ 815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( *family == ' ' || *family == '-' ) 816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project family++; 818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !*family && *fullp ) 822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The full name begins with the same characters as the */ 824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* family name, with spaces and dashes removed. In this */ 825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* case, the remaining string in `fullp' will be used as */ 826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* the style name. */ 827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project style_name = cff_strcpy( memory, fullp ); 828aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 829aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* remove the style part from the family name (if present) */ 83041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier remove_style( cffface->family_name, style_name ); 831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *cid_font_name = 839aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cff_index_get_sid_string( cff, 840aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich dict->cid_font_name ); 841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* do we have a `/FontName' for a CID-keyed font? */ 844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cid_font_name ) 845aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cffface->family_name = cff_strcpy( memory, cid_font_name ); 846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( style_name ) 849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->style_name = style_name; 850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* assume "Regular" style if we don't know better */ 852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->style_name = cff_strcpy( memory, (char *)"Regular" ); 853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*******************************************************************/ 855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Compute face flags. */ 857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 85841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */ 85941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ 86041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_FACE_FLAG_HINTER; /* has native hinter */ 861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( sfnt_format ) 86341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier flags |= FT_FACE_FLAG_SFNT; 864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* fixed width font? */ 866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( dict->is_fixed_pitch ) 86741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier flags |= FT_FACE_FLAG_FIXED_WIDTH; 868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */ 870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0 871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* kerning available? */ 872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->kern_pairs ) 87341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier flags |= FT_FACE_FLAG_KERNING; 874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->face_flags = flags; 877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*******************************************************************/ 879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Compute style flags. */ 881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project flags = 0; 883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( dict->italic_angle ) 885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project flags |= FT_STYLE_FLAG_ITALIC; 886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 888aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich char *weight = cff_index_get_sid_string( cff, 889aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich dict->weight ); 890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( weight ) 893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !ft_strcmp( weight, "Bold" ) || 894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project !ft_strcmp( weight, "Black" ) ) 895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project flags |= FT_STYLE_FLAG_BOLD; 896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* double check */ 899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name ) 900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !ft_strncmp( cffface->style_name, "Bold", 4 ) || 901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project !ft_strncmp( cffface->style_name, "Black", 5 ) ) 902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project flags |= FT_STYLE_FLAG_BOLD; 903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->style_flags = flags; 905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES 909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */ 910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* has unset this flag because of the 3.0 `post' table. */ 911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( dict->cid_registry == 0xFFFFU ) 912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES; 913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 9150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( dict->cid_registry != 0xFFFFU && pure_cff ) 916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->face_flags |= FT_FACE_FLAG_CID_KEYED; 917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*******************************************************************/ 920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Compute char maps. */ 922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 9240a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* Try to synthesize a Unicode charmap if there is none available */ 925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* already. If an OpenType font contains a Unicode "cmap", we */ 926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* will use it, whatever be in the CFF part of the file. */ 927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CharMapRec cmaprec; 929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CharMap cmap; 930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt nn; 931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Encoding encoding = &cff->encoding; 932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ ) 935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmap = cffface->charmaps[nn]; 937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 938aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* Windows Unicode? */ 939aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( cmap->platform_id == TT_PLATFORM_MICROSOFT && 940aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cmap->encoding_id == TT_MS_ID_UNICODE_CS ) 941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Skip_Unicode; 942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 943aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* Apple Unicode platform id? */ 944aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE ) 945aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich goto Skip_Unicode; /* Apple Unicode */ 946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* since CID-keyed fonts don't contain glyph names, we can't */ 949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* construct a cmap */ 950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU ) 951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 953aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#ifdef FT_MAX_CHARMAP_CACHEABLE 954aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( nn + 1 > FT_MAX_CHARMAP_CACHEABLE ) 955aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 956aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_ERROR(( "cff_face_init: no Unicode cmap is found, " 957aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "and too many subtables (%d) to add synthesized cmap\n", 958aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich nn )); 959aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich goto Exit; 960aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 961aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#endif 962aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* we didn't find a Unicode charmap -- synthesize one */ 964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.face = cffface; 965aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cmaprec.platform_id = TT_PLATFORM_MICROSOFT; 966aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cmaprec.encoding_id = TT_MS_ID_UNICODE_CS; 967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.encoding = FT_ENCODING_UNICODE; 968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project nn = (FT_UInt)cffface->num_charmaps; 970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 971aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich error = FT_CMap_New( &FT_CFF_CMAP_UNICODE_CLASS_REC_GET, NULL, 972aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich &cmaprec, NULL ); 973aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( error && FT_Err_No_Unicode_Glyph_Name != error ) 974aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich goto Exit; 975aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich error = FT_Err_Ok; 976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if no Unicode charmap was previously selected, select this one */ 978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps ) 979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->charmap = cffface->charmaps[nn]; 980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Skip_Unicode: 982aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#ifdef FT_MAX_CHARMAP_CACHEABLE 983aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( nn > FT_MAX_CHARMAP_CACHEABLE ) 984aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 985aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_ERROR(( "cff_face_init: Unicode cmap is found, " 986aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "but too many preceding subtables (%d) to access\n", 987aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich nn - 1 )); 988aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich goto Exit; 989aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 990aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#endif 991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( encoding->count > 0 ) 992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CMap_Class clazz; 994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.face = cffface; 997aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cmaprec.platform_id = TT_PLATFORM_ADOBE; /* Adobe platform id */ 998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( encoding->offset == 0 ) 1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.encoding_id = TT_ADOBE_ID_STANDARD; 1002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.encoding = FT_ENCODING_ADOBE_STANDARD; 1003295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner clazz = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET; 1004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( encoding->offset == 1 ) 1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.encoding_id = TT_ADOBE_ID_EXPERT; 1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.encoding = FT_ENCODING_ADOBE_EXPERT; 1009295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner clazz = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET; 1010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 1012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM; 1014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.encoding = FT_ENCODING_ADOBE_CUSTOM; 1015295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner clazz = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET; 1016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1018aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich error = FT_CMap_New( clazz, NULL, &cmaprec, NULL ); 1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 1024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 1025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 1029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_face_done( FT_Face cffface ) /* CFF_Face */ 1030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 10310a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project CFF_Face face = (CFF_Face)cffface; 10320a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Memory memory; 10330a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project SFNT_Service sfnt; 10340a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 10350a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 10360a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( !face ) 10370a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project return; 1038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 10390a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project memory = cffface->memory; 10400a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project sfnt = (SFNT_Service)face->sfnt; 1041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( sfnt ) 1043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sfnt->done_face( face ); 1044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font cff = (CFF_Font)face->extra.data; 1047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cff ) 1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_font_done( cff ); 1052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( face->extra.data ); 1053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 1059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_driver_init( FT_Module module ) 1060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( module ); 1062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CFF_Err_Ok; 1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 1068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_driver_done( FT_Module module ) 1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( module ); 1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 1075