Beispiel #1
0
        ///<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);
            }
        }