Ejemplo n.º 1
0
            public override bool TryUpdatePosition(
                FontMetrics fontMetrics,
                GPosTable table,
                GlyphPositioningCollection collection,
                Tag feature,
                ushort index,
                int count)
            {
                ushort glyphId = collection[index][0];

                if (glyphId == 0)
                {
                    return(false);
                }

                SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags);

                if (!AdvancedTypographicUtils.MatchCoverageSequence(iterator, this.coverageTables, 0))
                {
                    return(false);
                }

                return(AdvancedTypographicUtils.ApplyLookupList(
                           fontMetrics,
                           table,
                           feature,
                           this.LookupFlags,
                           this.sequenceLookupRecords,
                           collection,
                           index,
                           count));
            }
Ejemplo n.º 2
0
            public override bool TryUpdatePosition(
                FontMetrics fontMetrics,
                GPosTable table,
                GlyphPositioningCollection collection,
                Tag feature,
                ushort index,
                int count)
            {
                ushort glyphId = collection[index][0];

                if (glyphId == 0)
                {
                    return(false);
                }

                if (this.coverageTable.CoverageIndexOf(glyphId) < 0)
                {
                    return(false);
                }

                int offset = this.classDefinitionTable.ClassIndexOf(glyphId);

                if (offset < 0)
                {
                    return(false);
                }

                ClassSequenceRuleSetTable ruleSetTable = this.sequenceRuleSetTables[offset];
                SkippingGlyphIterator     iterator     = new(fontMetrics, collection, index, this.LookupFlags);

                foreach (ClassSequenceRuleTable ruleTable in ruleSetTable.SequenceRuleTables)
                {
                    int remaining = count - 1;
                    int seqLength = ruleTable.InputSequence.Length;
                    if (seqLength > remaining)
                    {
                        continue;
                    }

                    if (!AdvancedTypographicUtils.MatchClassSequence(iterator, 1, ruleTable.InputSequence, this.classDefinitionTable))
                    {
                        continue;
                    }

                    // It's a match. Perform position update and return true if anything changed.
                    return(AdvancedTypographicUtils.ApplyLookupList(
                               fontMetrics,
                               table,
                               feature,
                               this.LookupFlags,
                               ruleTable.SequenceLookupRecords,
                               collection,
                               index,
                               count));
                }

                return(false);
            }
Ejemplo n.º 3
0
            public override bool TryUpdatePosition(
                FontMetrics fontMetrics,
                GPosTable table,
                GlyphPositioningCollection collection,
                Tag feature,
                ushort index,
                int count)
            {
                ushort glyphId = collection[index][0];

                if (glyphId == 0)
                {
                    return(false);
                }

                int offset = this.coverageTable.CoverageIndexOf(glyphId);

                if (offset <= -1)
                {
                    return(false);
                }

                // TODO: Check this.
                // https://docs.microsoft.com/en-us/typography/opentype/spec/gsub#example-7-contextual-substitution-format-1
                SequenceRuleSetTable  ruleSetTable = this.seqRuleSetTables[offset];
                SkippingGlyphIterator iterator     = new(fontMetrics, collection, index, this.LookupFlags);

                foreach (SequenceRuleTable ruleTable in ruleSetTable.SequenceRuleTables)
                {
                    int remaining = count - 1;
                    int seqLength = ruleTable.InputSequence.Length;
                    if (seqLength > remaining)
                    {
                        continue;
                    }

                    if (!AdvancedTypographicUtils.MatchSequence(iterator, 1, ruleTable.InputSequence))
                    {
                        continue;
                    }

                    // It's a match. Perform position update and return true if anything changed.
                    return(AdvancedTypographicUtils.ApplyLookupList(
                               fontMetrics,
                               table,
                               feature,
                               this.LookupFlags,
                               ruleTable.SequenceLookupRecords,
                               collection,
                               index,
                               count));
                }

                return(false);
            }