///<summary> /// Internal method to test layout tables if they are uitable for fast path. /// Returns list of script-langauge pairs that are not optimizable. ///</summary> internal static OpenTypeLayoutResult GetComplexLanguageList( IOpenTypeFont Font, //In: Font access interface uint[] featureList, //In: Feature to look in uint[] glyphBits, ushort minGlyphId, ushort maxGlyphId, out WritingSystem[] complexLanguages // Out: List of script/langauge pair // that are not optimizable ) { try { WritingSystem[] gsubComplexLanguages = null; WritingSystem[] gposComplexLanguages = null; int gsubComplexLanguagesCount = 0; int gposComplexLanguagesCount = 0; FontTable GsubTable = Font.GetFontTable(OpenTypeTags.GSUB); FontTable GposTable = Font.GetFontTable(OpenTypeTags.GPOS); if (GsubTable.IsPresent) { LayoutEngine.GetComplexLanguageList( OpenTypeTags.GSUB, GsubTable, featureList, glyphBits, minGlyphId, maxGlyphId, out gsubComplexLanguages, out gsubComplexLanguagesCount ); } if (GposTable.IsPresent) { LayoutEngine.GetComplexLanguageList( OpenTypeTags.GPOS, GposTable, featureList, glyphBits, minGlyphId, maxGlyphId, out gposComplexLanguages, out gposComplexLanguagesCount ); } if (gsubComplexLanguages == null && gposComplexLanguages == null) { complexLanguages = null; return(OpenTypeLayoutResult.Success); } // Both tables have complex scrips, merge results // Count gpos unique Languages // and pack them at the same time // so we do not research them again. int gposNewLanguages = 0, i, j; for (i = 0; i < gposComplexLanguagesCount; i++) { bool foundInGsub = false; for (j = 0; j < gsubComplexLanguagesCount; j++) { if (gsubComplexLanguages[j].scriptTag == gposComplexLanguages[i].scriptTag && gsubComplexLanguages[j].langSysTag == gposComplexLanguages[i].langSysTag ) { foundInGsub = true; break; } ; } if (!foundInGsub) { if (gposNewLanguages < i) { gposComplexLanguages[gposNewLanguages] = gposComplexLanguages[i]; } gposNewLanguages++; } } //realloc array for merged results, merge both arrays complexLanguages = new WritingSystem[gsubComplexLanguagesCount + gposNewLanguages]; for (i = 0; i < gsubComplexLanguagesCount; i++) { complexLanguages[i] = gsubComplexLanguages[i]; } for (i = 0; i < gposNewLanguages; i++) { complexLanguages[gsubComplexLanguagesCount + i] = gposComplexLanguages[i]; } return(OpenTypeLayoutResult.Success); } catch (FileFormatException) { complexLanguages = null; return(OpenTypeLayoutResult.BadFontTable); } }