diff options
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/tottfaat.c')
-rw-r--r-- | Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/tottfaat.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/tottfaat.c b/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/tottfaat.c new file mode 100644 index 00000000000..e5722cfc27d --- /dev/null +++ b/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/tottfaat.c @@ -0,0 +1,134 @@ +/* Copyright (C) 2000-2008 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include <utype.h> + +#include "ttf.h" + +/* This file contains routines to create some of the Apple Advanced Typography Tables */ +/* (or GX fonts) */ + +/* ************************************************************************** */ +/* ************************* The 'morx' table ************************* */ +/* ************************* (and 'feat') ************************* */ +/* ************************************************************************** */ + +/* Each lookup gets its own subtable, so there may be multiple subtables */ +/* with the same feature/setting. The subtables will be ordered the same */ +/* way the lookups are, which might lead to awkwardness if there are many */ +/* chains and the same feature occurs in several of them */ +/* (only the default language will be used) */ +struct feature { + int16 featureType, featureSetting; + MacFeat *mf, *smf; + struct macsetting *ms, *sms; + unsigned int vertOnly: 1; + unsigned int r2l: 1; /* I think this is the "descending" flag */ + unsigned int needsOff: 1; + unsigned int singleMutex: 1; + unsigned int dummyOff: 1; + uint8 subtable_type; + int chain; + int32 flag, offFlags; + uint32 feature_start; + uint32 feature_len; /* Does not include header yet */ + struct feature *next; /* features in output order */ + struct feature *nexttype; /* features in feature/setting order */ + struct feature *nextsame; /* all features with the same feature/setting */ + int setting_cnt, setting_index, real_index; +}; + + + +struct transition { uint16 next_state, dontconsume, ismark, trans_ent; LigList *l; }; +struct trans_entries { uint16 next_state, flags, act_index; LigList *l; }; + + +int Macable(SplineFont *sf, OTLookup *otl) { + int ft, fs; + FeatureScriptLangList *features; + + switch ( otl->lookup_type ) { + /* These lookup types are mac only */ + case kern_statemachine: case morx_indic: case morx_context: case morx_insert: +return( true ); + /* These lookup types or OpenType only */ + case gsub_multiple: case gsub_alternate: + case gpos_single: case gpos_cursive: case gpos_mark2base: + case gpos_mark2ligature: case gpos_mark2mark: +return( false ); + /* These are OpenType only, but they might be convertable to a state */ + /* machine */ + case gsub_context: + case gsub_contextchain: case gsub_reversecchain: + case gpos_context: case gpos_contextchain: + if ( sf==NULL || sf->sm!=NULL ) +return( false ); + /* Else fall through into the test on the feature tag */; + /* These two can be expressed in both, and might be either */ + case gsub_single: case gsub_ligature: case gpos_pair: + for ( features = otl->features; features!=NULL; features = features->next ) { + if ( features->ismac || OTTagToMacFeature(features->featuretag,&ft,&fs)) +return( true ); + } + } +return( false ); +} + + +/* ************************************************************************** */ +/* ************************* utility routines ************************* */ +/* ************************************************************************** */ + +uint32 MacFeatureToOTTag(int featureType,int featureSetting) { + int i; + struct macsettingname *msn = user_macfeat_otftag ? user_macfeat_otftag : macfeat_otftag; + + for ( i=0; msn[i].otf_tag!=0; ++i ) + if ( msn[i].mac_feature_type == featureType && + msn[i].mac_feature_setting == featureSetting ) +return( msn[i].otf_tag ); + +return( 0 ); +} + +int OTTagToMacFeature(uint32 tag, int *featureType,int *featureSetting) { + int i; + struct macsettingname *msn = user_macfeat_otftag ? user_macfeat_otftag : macfeat_otftag; + + for ( i=0; msn[i].otf_tag!=0; ++i ) + if ( msn[i].otf_tag == tag ) { + *featureType = msn[i].mac_feature_type; + *featureSetting = msn[i].mac_feature_setting; +return( true ); + } + + *featureType = 0; + *featureSetting = 0; +return( false ); +} + |