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/* */ 7ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki/* Copyright 1996-2015 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> 20727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_CALC_H 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_STREAM_H 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_ERRORS_H 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRUETYPE_IDS_H 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRUETYPE_TAGS_H 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_SFNT_H 28727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include FT_CFF_DRIVER_H 29727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffobjs.h" 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffload.h" 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffcmap.h" 33295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "cffpic.h" 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 35727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include "cfferrs.h" 36727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* messages during execution. */ 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_COMPONENT 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT trace_cffobjs 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SIZE FUNCTIONS */ 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Note that we store the global hints in the size's `internal' root */ 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* field. */ 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static PSH_Globals_Funcs 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_size_get_globals_funcs( CFF_Size size ) 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Face face = (CFF_Face)size->root.face; 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font font = (CFF_Font)face->extra.data; 63aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich PSHinter_Service pshinter = font->pshinter; 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Module module; 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project module = FT_Get_Module( size->root.face->driver->root.library, 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project "pshinter" ); 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( module && pshinter && pshinter->get_globals_funcs ) 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ? pshinter->get_globals_funcs( module ) 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : 0; 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_size_done( FT_Size cffsize ) /* CFF_Size */ 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Size size = (CFF_Size)cffsize; 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Face face = (CFF_Face)size->root.face; 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font font = (CFF_Font)face->extra.data; 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Internal internal = (CFF_Internal)cffsize->internal; 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( internal ) 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PSH_Globals_Funcs funcs; 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs = cff_size_get_globals_funcs( size ); 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( funcs ) 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt i; 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->destroy( internal->topfont ); 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = font->num_subfonts; i > 0; i-- ) 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->destroy( internal->subfonts[i - 1] ); 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* `internal' is freed by destroy_size (in ftobjs.c) */ 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CFF and Type 1 private dictionaries have slightly different */ 1070a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* structures; we need to synthesize a Type 1 dictionary on the fly */ 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_make_private_dict( CFF_SubFont subfont, 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Private priv ) 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Private cpriv = &subfont->private_dict; 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt n, count; 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ZERO( priv, sizeof ( *priv ) ); 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = priv->num_blue_values = cpriv->num_blue_values; 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < count; n++ ) 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->blue_values[n] = (FT_Short)cpriv->blue_values[n]; 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = priv->num_other_blues = cpriv->num_other_blues; 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < count; n++ ) 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->other_blues[n] = (FT_Short)cpriv->other_blues[n]; 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = priv->num_family_blues = cpriv->num_family_blues; 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < count; n++ ) 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->family_blues[n] = (FT_Short)cpriv->family_blues[n]; 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = priv->num_family_other_blues = cpriv->num_family_other_blues; 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < count; n++ ) 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n]; 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->blue_scale = cpriv->blue_scale; 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->blue_shift = (FT_Int)cpriv->blue_shift; 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->blue_fuzz = (FT_Int)cpriv->blue_fuzz; 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->standard_width[0] = (FT_UShort)cpriv->standard_width; 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->standard_height[0] = (FT_UShort)cpriv->standard_height; 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = priv->num_snap_widths = cpriv->num_snap_widths; 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < count; n++ ) 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n]; 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = priv->num_snap_heights = cpriv->num_snap_heights; 147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < count; n++ ) 148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n]; 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->force_bold = cpriv->force_bold; 151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->language_group = cpriv->language_group; 152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project priv->lenIV = cpriv->lenIV; 153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_size_init( FT_Size cffsize ) /* CFF_Size */ 158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Size size = (CFF_Size)cffsize; 160727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PSH_Globals_Funcs funcs = cff_size_get_globals_funcs( size ); 162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( funcs ) 165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Face face = (CFF_Face)cffsize->face; 167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font font = (CFF_Font)face->extra.data; 168aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner CFF_Internal internal = NULL; 169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_PrivateRec priv; 171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = cffsize->face->memory; 172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt i; 174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_NEW( internal ) ) 177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_make_private_dict( &font->top_font, &priv ); 180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = funcs->create( cffsize->face->memory, &priv, 181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &internal->topfont ); 182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = font->num_subfonts; i > 0; i-- ) 186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_SubFont sub = font->subfonts[i - 1]; 188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_make_private_dict( sub, &priv ); 191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = funcs->create( cffsize->face->memory, &priv, 192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &internal->subfonts[i - 1] ); 193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffsize->internal = (FT_Size_Internal)(void*)internal; 198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->strike_index = 0xFFFFFFFFUL; 201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS 208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_size_select( FT_Size size, 211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong strike_index ) 212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Size cffsize = (CFF_Size)size; 214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PSH_Globals_Funcs funcs; 215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffsize->strike_index = strike_index; 218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Select_Metrics( size->face, strike_index ); 220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs = cff_size_get_globals_funcs( cffsize ); 222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( funcs ) 224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Face face = (CFF_Face)size->face; 226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font font = (CFF_Font)face->extra.data; 227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Internal internal = (CFF_Internal)size->internal; 228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 229ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_Long top_upm = (FT_Long)font->top_font.font_dict.units_per_em; 230ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_UInt i; 231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->set_scale( internal->topfont, 234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->metrics.x_scale, size->metrics.y_scale, 235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0, 0 ); 236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = font->num_subfonts; i > 0; i-- ) 238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_SubFont sub = font->subfonts[i - 1]; 240ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_Long sub_upm = (FT_Long)sub->font_dict.units_per_em; 241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos x_scale, y_scale; 242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( top_upm != sub_upm ) 245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); 247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); 248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x_scale = size->metrics.x_scale; 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y_scale = size->metrics.y_scale; 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->set_scale( internal->subfonts[i - 1], 256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x_scale, y_scale, 0, 0 ); 257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 260727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_size_request( FT_Size size, 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Size_Request req ) 269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Size cffsize = (CFF_Size)size; 271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PSH_Globals_Funcs funcs; 272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS 275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_HAS_FIXED_SIZES( size->face ) ) 277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Face cffface = (CFF_Face)size->face; 279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SFNT_Service sfnt = (SFNT_Service)cffface->sfnt; 280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong strike_index; 281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) ) 284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffsize->strike_index = 0xFFFFFFFFUL; 285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return cff_size_select( size, strike_index ); 287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ 290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Request_Metrics( size->face, req ); 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs = cff_size_get_globals_funcs( cffsize ); 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( funcs ) 296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Face cffface = (CFF_Face)size->face; 298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font font = (CFF_Font)cffface->extra.data; 299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Internal internal = (CFF_Internal)size->internal; 300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 301ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_Long top_upm = (FT_Long)font->top_font.font_dict.units_per_em; 302ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_UInt i; 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->set_scale( internal->topfont, 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->metrics.x_scale, size->metrics.y_scale, 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0, 0 ); 308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = font->num_subfonts; i > 0; i-- ) 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_SubFont sub = font->subfonts[i - 1]; 312ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_Long sub_upm = (FT_Long)sub->font_dict.units_per_em; 313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos x_scale, y_scale; 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( top_upm != sub_upm ) 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); 319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); 320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x_scale = size->metrics.x_scale; 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y_scale = size->metrics.y_scale; 325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->set_scale( internal->subfonts[i - 1], 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x_scale, y_scale, 0, 0 ); 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 332727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SLOT FUNCTIONS */ 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_slot_done( FT_GlyphSlot slot ) 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 345ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki slot->internal->glyph_hints = NULL; 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_slot_init( FT_GlyphSlot slot ) 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Face face = (CFF_Face)slot->face; 353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font font = (CFF_Font)face->extra.data; 354aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich PSHinter_Service pshinter = font->pshinter; 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( pshinter ) 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Module module; 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project module = FT_Get_Module( slot->face->driver->root.library, 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project "pshinter" ); 364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( module ) 365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project T2_Hints_Funcs funcs; 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs = pshinter->get_t2_funcs( module ); 370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project slot->internal->glyph_hints = (void*)funcs; 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 374727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FACE FUNCTIONS */ 381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_String* 385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_strcpy( FT_Memory memory, 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_String* source ) 387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_String* result; 390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (void)FT_STRDUP( result, source ); 393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( error ); 395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return result; 397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 400aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* Strip all subset prefixes of the form `ABCDEF+'. Usually, there */ 401aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold' */ 402aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* have been seen in the wild. */ 403aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 404aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich static void 405aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich remove_subset_prefix( FT_String* name ) 406aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 407aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_Int32 idx = 0; 408727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Int32 length = (FT_Int32)strlen( name ) + 1; 409aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_Bool continue_search = 1; 41041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 411aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 412aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich while ( continue_search ) 413aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 414aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( length >= 7 && name[6] == '+' ) 415aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 416aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich for ( idx = 0; idx < 6; idx++ ) 417aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 418aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* ASCII uppercase letters */ 419aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) ) 420aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich continue_search = 0; 421aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 422aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 423aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( continue_search ) 424aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 425aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich for ( idx = 7; idx < length; idx++ ) 426aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich name[idx - 7] = name[idx]; 427aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner length -= 7; 428aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 429aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 430aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich else 431aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich continue_search = 0; 432aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 433aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } 434aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 435aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 436aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* Remove the style part from the family name (if present). */ 437aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 438aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner static void 439aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner remove_style( FT_String* family_name, 440aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner const FT_String* style_name ) 441aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 442aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Int32 family_name_length, style_name_length; 443aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 444aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 445727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease family_name_length = (FT_Int32)strlen( family_name ); 446727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease style_name_length = (FT_Int32)strlen( style_name ); 447aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 448aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( family_name_length > style_name_length ) 449aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 450aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Int idx; 451aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 452aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 453aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner for ( idx = 1; idx <= style_name_length; ++idx ) 454aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 455aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( family_name[family_name_length - idx] != 456aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner style_name[style_name_length - idx] ) 457aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner break; 458aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 459aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 460aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( idx > style_name_length ) 461aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 462aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* family_name ends with style_name; remove it */ 463aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner idx = family_name_length - style_name_length - 1; 464aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 465aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* also remove special characters */ 466aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* between real family name and style */ 467aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner while ( idx > 0 && 468aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner ( family_name[idx] == '-' || 469aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner family_name[idx] == ' ' || 470aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner family_name[idx] == '_' || 471aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner family_name[idx] == '+' ) ) 472aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner --idx; 473aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 474aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( idx > 0 ) 475aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner family_name[idx + 1] = '\0'; 476aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 477aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 478aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 479aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 480aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_face_init( FT_Stream stream, 483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Face cffface, /* CFF_Face */ 484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int face_index, 485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int num_params, 486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Parameter* params ) 487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 488aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner CFF_Face face = (CFF_Face)cffface; 489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SFNT_Service sfnt; 491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Service_PsCMaps psnames; 492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PSHinter_Service pshinter; 493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool pure_cff = 1; 494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool sfnt_format = 0; 495aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Library library = cffface->driver->root.library; 496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sfnt = (SFNT_Service)FT_Get_Module_Interface( 499295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner library, "sfnt" ); 500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !sfnt ) 50141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier { 50241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_ERROR(( "cff_face_init: cannot access `sfnt' module\n" )); 503727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Missing_Module ); 50441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier goto Exit; 50541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier } 506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); 508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pshinter = (PSHinter_Service)FT_Get_Module_Interface( 510295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner library, "pshinter" ); 511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 51241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_TRACE2(( "CFF driver\n" )); 51341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* create input stream from resource */ 515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_STREAM_SEEK( 0 ) ) 516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check whether we have a valid OpenType file */ 519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = sfnt->init_face( stream, face, face_index, num_params, params ); 520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5220a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( face->format_tag != TTAG_OTTO ) /* `OTTO'; OpenType/CFF font */ 523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 52441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_TRACE2(( " not an OpenType/CFF font\n" )); 525727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Unknown_File_Format ); 52641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier goto Exit; 527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if we are performing a simple font format check, exit immediately */ 530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face_index < 0 ) 531727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sfnt_format = 1; 534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* now, the font can be either an OpenType/CFF font, or an SVG CEF */ 536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* font; in the latter case it doesn't have a `head' table */ 537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = face->goto_table( face, TTAG_head, stream, 0 ); 538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pure_cff = 0; 541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* load font directory */ 543727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = sfnt->load_face( stream, face, face_index, 544727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease num_params, params ); 545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* load the `cmap' table explicitly */ 551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = sfnt->load_cmap( face, stream ); 552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* now load the CFF part of the file */ 557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = face->goto_table( face, TTAG_CFF, stream, 0 ); 558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* rewind to start of file; we are going to load a pure-CFF font */ 564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_STREAM_SEEK( 0 ) ) 565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 566727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_Err_Ok; 567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* now load and parse the CFF table in the file */ 570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 571aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner CFF_Font cff = NULL; 572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_FontRecDict dict; 573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = cffface->memory; 574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 flags; 575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt i; 576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_NEW( cff ) ) 579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project face->extra.data = cff; 582295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner error = cff_font_load( library, stream, face_index, cff, pure_cff ); 583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff->pshinter = pshinter; 587aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cff->psnames = psnames; 588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5890a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project cffface->face_index = face_index; 5900a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Complement the root flags with some interesting information. */ 592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Note that this is only necessary for pure CFF and CEF fonts; */ 593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFNT based fonts use the `name' table instead. */ 594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 595ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki cffface->num_glyphs = (FT_Long)cff->num_glyphs; 596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dict = &cff->top_font.font_dict; 598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* we need the `PSNames' module for CFF and CEF formats */ 600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* which aren't CID-keyed */ 601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( dict->cid_registry == 0xFFFFU && !psnames ) 602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 603295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_ERROR(( "cff_face_init:" 604295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner " cannot open CFF & CEF fonts\n" 605295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner " " 606295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner " without the `PSNames' module\n" )); 607727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Missing_Module ); 60841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier goto Exit; 609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 611bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#ifdef FT_DEBUG_LEVEL_TRACE 612bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 613bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt idx; 614bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_String* s; 615bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 616bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 617bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_TRACE4(( "SIDs\n" )); 618bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 619bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* dump string index, including default strings for convenience */ 620bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly for ( idx = 0; idx < cff->num_strings + 390; idx++ ) 621bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 622bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly s = cff_index_get_sid_string( cff, idx ); 623bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( s ) 624bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_TRACE4((" %5d %s\n", idx, s )); 625bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 626bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 627bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#endif /* FT_DEBUG_LEVEL_TRACE */ 628bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 629bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( !dict->has_font_matrix ) 6300a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM; 6310a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6320a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* Normalize the font matrix so that `matrix->xx' is 1; the */ 6330a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* scaling is done with `units_per_em' then (at this point, */ 6340a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* it already contains the scaling factor, but without */ 6350a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* normalization of the matrix). */ 6360a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* */ 6370a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* Note that the offsets must be expressed in integer font */ 6380a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* units. */ 6390a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6400a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 6410a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Matrix* matrix = &dict->font_matrix; 6420a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Vector* offset = &dict->font_offset; 6430a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_ULong* upm = &dict->units_per_em; 6440a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Fixed temp = FT_ABS( matrix->yy ); 6450a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6460a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6470a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( temp != 0x10000L ) 6480a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 649ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki *upm = (FT_ULong)FT_DivFix( (FT_Long)*upm, temp ); 6500a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6510a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->xx = FT_DivFix( matrix->xx, temp ); 6520a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->yx = FT_DivFix( matrix->yx, temp ); 6530a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->xy = FT_DivFix( matrix->xy, temp ); 6540a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->yy = FT_DivFix( matrix->yy, temp ); 6550a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->x = FT_DivFix( offset->x, temp ); 6560a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->y = FT_DivFix( offset->y, temp ); 6570a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 6580a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6590a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->x >>= 16; 6600a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->y >>= 16; 6610a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 6620a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6630a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project for ( i = cff->num_subfonts; i > 0; i-- ) 6640a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 6650a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project CFF_FontRecDict sub = &cff->subfonts[i - 1]->font_dict; 6660a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project CFF_FontRecDict top = &cff->top_font.font_dict; 6670a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6680a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Matrix* matrix; 6690a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Vector* offset; 6700a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_ULong* upm; 6710a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Fixed temp; 6720a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6730a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 674bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( sub->has_font_matrix ) 6750a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 676295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Long scaling; 6770a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 6780a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 679bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* if we have a top-level matrix, */ 680bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* concatenate the subfont matrix */ 681bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 682bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( top->has_font_matrix ) 683bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 684bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly if ( top->units_per_em > 1 && sub->units_per_em > 1 ) 685ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki scaling = (FT_Long)FT_MIN( top->units_per_em, 686ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki sub->units_per_em ); 687bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly else 688bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly scaling = 1; 6890a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 690bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Matrix_Multiply_Scaled( &top->font_matrix, 691bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly &sub->font_matrix, 692bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly scaling ); 693bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Vector_Transform_Scaled( &sub->font_offset, 694bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly &top->font_matrix, 695bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly scaling ); 6960a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 697ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki sub->units_per_em = (FT_ULong) 698ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki FT_MulDiv( (FT_Long)sub->units_per_em, 699ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki (FT_Long)top->units_per_em, 700ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki scaling ); 701bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } 7020a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 7030a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project else 7040a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 7050a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project sub->font_matrix = top->font_matrix; 7060a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project sub->font_offset = top->font_offset; 7070a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 7080a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project sub->units_per_em = top->units_per_em; 7090a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 7100a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 7110a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix = &sub->font_matrix; 7120a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset = &sub->font_offset; 7130a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project upm = &sub->units_per_em; 7140a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project temp = FT_ABS( matrix->yy ); 7150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 7160a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( temp != 0x10000L ) 7170a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project { 718ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki *upm = (FT_ULong)FT_DivFix( (FT_Long)*upm, temp ); 7190a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 7200a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->xx = FT_DivFix( matrix->xx, temp ); 7210a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->yx = FT_DivFix( matrix->yx, temp ); 7220a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->xy = FT_DivFix( matrix->xy, temp ); 7230a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project matrix->yy = FT_DivFix( matrix->yy, temp ); 7240a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->x = FT_DivFix( offset->x, temp ); 7250a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->y = FT_DivFix( offset->y, temp ); 7260a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 7270a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 7280a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->x >>= 16; 7290a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project offset->y >>= 16; 7300a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project } 7310a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( pure_cff ) 733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char* style_name = NULL; 735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set up num_faces */ 738ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki cffface->num_faces = (FT_Long)cff->num_faces; 739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compute number of glyphs */ 741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( dict->cid_registry != 0xFFFFU ) 742ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki cffface->num_glyphs = (FT_Long)( cff->charset.max_cid + 1 ); 743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 744ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki cffface->num_glyphs = (FT_Long)cff->charstrings_index.count; 745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set global bbox, as well as EM size */ 747295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner cffface->bbox.xMin = dict->font_bbox.xMin >> 16; 748295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner cffface->bbox.yMin = dict->font_bbox.yMin >> 16; 749295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* no `U' suffix here to 0xFFFF! */ 750295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16; 751295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16; 752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7530a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project cffface->units_per_EM = (FT_UShort)( dict->units_per_em ); 754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->ascender = (FT_Short)( cffface->bbox.yMax ); 756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->descender = (FT_Short)( cffface->bbox.yMin ); 757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 ); 759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cffface->height < cffface->ascender - cffface->descender ) 760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->height = (FT_Short)( cffface->ascender - cffface->descender ); 761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->underline_position = 763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_Short)( dict->underline_position >> 16 ); 764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->underline_thickness = 765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_Short)( dict->underline_thickness >> 16 ); 766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* retrieve font family & style name */ 768ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki cffface->family_name = cff_index_get_name( cff, 769ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki (FT_UInt)face_index ); 770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cffface->family_name ) 771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 772aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich char* full = cff_index_get_sid_string( cff, 773aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich dict->full_name ); 774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char* fullp = full; 775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char* family = cffface->family_name; 776aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich char* family_name = NULL; 777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 77941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier remove_subset_prefix( cffface->family_name ); 780aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( dict->family_name ) 782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 783aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich family_name = cff_index_get_sid_string( cff, 784aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich dict->family_name ); 785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( family_name ) 786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project family = family_name; 787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* We try to extract the style name from the full name. */ 790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* We need to ignore spaces and dashes during the search. */ 791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( full && family ) 792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( *fullp ) 794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* skip common characters at the start of both strings */ 796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( *fullp == *family ) 797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project family++; 799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fullp++; 800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ignore spaces and dashes in full name during comparison */ 804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( *fullp == ' ' || *fullp == '-' ) 805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project fullp++; 807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ignore spaces and dashes in family name during comparison */ 811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( *family == ' ' || *family == '-' ) 812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project family++; 814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !*family && *fullp ) 818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The full name begins with the same characters as the */ 820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* family name, with spaces and dashes removed. In this */ 821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* case, the remaining string in `fullp' will be used as */ 822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* the style name. */ 823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project style_name = cff_strcpy( memory, fullp ); 824aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 825aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* remove the style part from the family name (if present) */ 82641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier remove_style( cffface->family_name, style_name ); 827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project char *cid_font_name = 835aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cff_index_get_sid_string( cff, 836aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich dict->cid_font_name ); 837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* do we have a `/FontName' for a CID-keyed font? */ 840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cid_font_name ) 841aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cffface->family_name = cff_strcpy( memory, cid_font_name ); 842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( style_name ) 845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->style_name = style_name; 846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* assume "Regular" style if we don't know better */ 848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->style_name = cff_strcpy( memory, (char *)"Regular" ); 849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*******************************************************************/ 851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Compute face flags. */ 853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 85441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */ 85541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ 85641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_FACE_FLAG_HINTER; /* has native hinter */ 857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( sfnt_format ) 85941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier flags |= FT_FACE_FLAG_SFNT; 860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* fixed width font? */ 862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( dict->is_fixed_pitch ) 86341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier flags |= FT_FACE_FLAG_FIXED_WIDTH; 864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */ 866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0 867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* kerning available? */ 868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( face->kern_pairs ) 86941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier flags |= FT_FACE_FLAG_KERNING; 870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8729c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod cffface->face_flags |= flags; 873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*******************************************************************/ 875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Compute style flags. */ 877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project flags = 0; 879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( dict->italic_angle ) 881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project flags |= FT_STYLE_FLAG_ITALIC; 882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 884aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich char *weight = cff_index_get_sid_string( cff, 885aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich dict->weight ); 886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( weight ) 889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !ft_strcmp( weight, "Bold" ) || 890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project !ft_strcmp( weight, "Black" ) ) 891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project flags |= FT_STYLE_FLAG_BOLD; 892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* double check */ 895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name ) 896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !ft_strncmp( cffface->style_name, "Bold", 4 ) || 897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project !ft_strncmp( cffface->style_name, "Black", 5 ) ) 898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project flags |= FT_STYLE_FLAG_BOLD; 899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->style_flags = flags; 901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES 905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */ 906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* has unset this flag because of the 3.0 `post' table. */ 907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( dict->cid_registry == 0xFFFFU ) 908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES; 909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 9110a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( dict->cid_registry != 0xFFFFU && pure_cff ) 912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->face_flags |= FT_FACE_FLAG_CID_KEYED; 913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*******************************************************************/ 916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Compute char maps. */ 918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 9200a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* Try to synthesize a Unicode charmap if there is none available */ 921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* already. If an OpenType font contains a Unicode "cmap", we */ 922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* will use it, whatever be in the CFF part of the file. */ 923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CharMapRec cmaprec; 925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CharMap cmap; 926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt nn; 927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Encoding encoding = &cff->encoding; 928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ ) 931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmap = cffface->charmaps[nn]; 933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 934aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* Windows Unicode? */ 935aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( cmap->platform_id == TT_PLATFORM_MICROSOFT && 936aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cmap->encoding_id == TT_MS_ID_UNICODE_CS ) 937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Skip_Unicode; 938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 939aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* Apple Unicode platform id? */ 940aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE ) 941aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich goto Skip_Unicode; /* Apple Unicode */ 942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* since CID-keyed fonts don't contain glyph names, we can't */ 945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* construct a cmap */ 946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU ) 947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* we didn't find a Unicode charmap -- synthesize one */ 950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.face = cffface; 951aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cmaprec.platform_id = TT_PLATFORM_MICROSOFT; 952aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cmaprec.encoding_id = TT_MS_ID_UNICODE_CS; 953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.encoding = FT_ENCODING_UNICODE; 954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project nn = (FT_UInt)cffface->num_charmaps; 956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 957727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_CMap_New( &CFF_CMAP_UNICODE_CLASS_REC_GET, NULL, 958aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich &cmaprec, NULL ); 959727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( error && 960727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) ) 961aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich goto Exit; 962aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich error = FT_Err_Ok; 963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if no Unicode charmap was previously selected, select this one */ 965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps ) 966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cffface->charmap = cffface->charmaps[nn]; 967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Skip_Unicode: 969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( encoding->count > 0 ) 970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CMap_Class clazz; 972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.face = cffface; 975aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich cmaprec.platform_id = TT_PLATFORM_ADOBE; /* Adobe platform id */ 976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( encoding->offset == 0 ) 978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.encoding_id = TT_ADOBE_ID_STANDARD; 980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.encoding = FT_ENCODING_ADOBE_STANDARD; 981727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease clazz = &CFF_CMAP_ENCODING_CLASS_REC_GET; 982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( encoding->offset == 1 ) 984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.encoding_id = TT_ADOBE_ID_EXPERT; 986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.encoding = FT_ENCODING_ADOBE_EXPERT; 987727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease clazz = &CFF_CMAP_ENCODING_CLASS_REC_GET; 988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM; 992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cmaprec.encoding = FT_ENCODING_ADOBE_CUSTOM; 993727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease clazz = &CFF_CMAP_ENCODING_CLASS_REC_GET; 994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 996aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich error = FT_CMap_New( clazz, NULL, &cmaprec, NULL ); 997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 1002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 1003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_face_done( FT_Face cffface ) /* CFF_Face */ 1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 10090a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project CFF_Face face = (CFF_Face)cffface; 10100a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project FT_Memory memory; 10110a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project SFNT_Service sfnt; 10120a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 10130a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 10140a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( !face ) 10150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project return; 1016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 10170a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project memory = cffface->memory; 10180a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project sfnt = (SFNT_Service)face->sfnt; 1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( sfnt ) 1021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sfnt->done_face( face ); 1022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CFF_Font cff = (CFF_Font)face->extra.data; 1025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cff ) 1028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cff_font_done( cff ); 1030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( face->extra.data ); 1031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 1037727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cff_driver_init( FT_Module module ) /* CFF_Driver */ 1038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1039727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CFF_Driver driver = (CFF_Driver)module; 1040727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 1041727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 1042ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki /* set default property values, cf. `ftcffdrv.h' */ 1043727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef CFF_CONFIG_OPTION_OLD_ENGINE 1044ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki driver->hinting_engine = FT_CFF_HINTING_FREETYPE; 1045727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#else 1046ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki driver->hinting_engine = FT_CFF_HINTING_ADOBE; 1047727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif 1048ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki 1049727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease driver->no_stem_darkening = FALSE; 1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1051ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki driver->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1; 1052ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki driver->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1; 1053ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki driver->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2; 1054ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki driver->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2; 1055ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki driver->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3; 1056ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki driver->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3; 1057ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki driver->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4; 1058ec62c527eb34ee4481a0153ceb42dfd35d7e1d26Makoto Onuki driver->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4; 1059ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 1060727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 1061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 1065727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cff_driver_done( FT_Module module ) /* CFF_Driver */ 1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( module ); 1068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 1072