private bool IsFeaturePresent(TransformationParserBase parser, GlyphTypeface typeface, uint scriptId, uint languageId, uint featureId) { Tag scriptTest = TagConverter.TagFromUint(scriptId); Tag languageTest = TagConverter.TagFromUint(languageId); Tag featureTest = TagConverter.TagFromUint(featureId); foreach (Tag script in parser.GetScriptTags(typeface)) { if (script == scriptTest) { foreach (Tag language in parser.GetLangSysTags(typeface, script)) { if (language == languageTest) { foreach (Tag feature in parser.GetAllFeatureTags(typeface)) { if (feature == featureTest) { return(true); } } return(false); } } return(false); } } return(false); }
private static StateMachine GetOrCompile(TransformationParserBase parser, TransformationCompilerBase compiler, GlyphTypeface typeface, uint scriptId, uint languageId, uint featureId) { Tag scriptTag = new Tag(ToTagString(scriptId)); Tag languageTag = new Tag(ToTagString(languageId)); Tag featureTag = new Tag(ToTagString(featureId)); string key = typeface.FontUri.OriginalString + scriptTag + languageTag + featureTag; StateMachine machine; if (!_machineCache.TryGetValue(key, out machine)) { IEnumerable <Terka.FontBuilder.Parser.Output.IGlyphTransformationTable> tables; if (featureId == 0) { tables = parser.GetTransformationTablesForRequiredFeature(typeface, scriptTag, languageTag); } else { tables = parser.GetTransformationTablesForOptionalFeature(typeface, scriptTag, languageTag, featureTag); } _machineCache[key] = machine = compiler.Compile(tables); } return(machine); }