if ( ( iga != null ) && ( iga.length == 2 ) ) {
PairValues pv = getPairValues ( ci, iga[0], iga[1] );
if ( pv != null ) {
+ int offset = 0;
+ int offsetLast = counts[0] + counts[1];
+ // skip any ignored glyphs prior to first non-ignored glyph
+ for ( ; offset < offsetLast; ++offset ) {
+ if ( ! ps.isIgnoredGlyph ( offset ) ) {
+ break;
+ } else {
+ ps.consume(1);
+ }
+ }
+ // adjust first non-ignored glyph if first value isn't null
Value v1 = pv.getValue1();
if ( v1 != null ) {
- if ( ps.adjust(v1, 0) ) {
+ if ( ps.adjust(v1, offset) ) {
ps.setAdjusted ( true );
}
+ ps.consume(1); // consume first non-ignored glyph
+ ++offset;
+ }
+ // skip any ignored glyphs prior to second non-ignored glyph
+ for ( ; offset < offsetLast; ++offset ) {
+ if ( ! ps.isIgnoredGlyph ( offset ) ) {
+ break;
+ } else {
+ ps.consume(1);
+ }
}
+ // adjust second non-ignored glyph if second value isn't null
Value v2 = pv.getValue2();
if ( v2 != null ) {
- if ( ps.adjust(v2, 1) ) {
+ if ( ps.adjust(v2, offset) ) {
ps.setAdjusted ( true );
}
+ ps.consume(1); // consume second non-ignored glyph
+ ++offset;
}
- ps.consume ( counts[0] + counts[1] );
applied = true;
}
}
private int[] getGlyphsForward ( int start, int count, GlyphTester ignoreTester, int[] glyphs, int[] counts ) throws IndexOutOfBoundsException {
int counted = 0;
int ignored = 0;
- for ( int i = start, n = indexLast, k = 0; i < n; i++ ) {
+ for ( int i = start, n = indexLast; ( i < n ) && ( counted < count ); i++ ) {
int gi = getGlyph ( i - index );
if ( gi == 65535 ) {
ignored++;
} else {
if ( ( ignoreTester == null ) || ! ignoreTester.test ( gi, getLookupFlags() ) ) {
- if ( k < count ) {
- glyphs [ k++ ] = gi;
- counted++;
- } else {
- break;
- }
+ glyphs [ counted++ ] = gi;
} else {
ignored++;
}
private int[] getGlyphsReverse ( int start, int count, GlyphTester ignoreTester, int[] glyphs, int[] counts ) throws IndexOutOfBoundsException {
int counted = 0;
int ignored = 0;
- for ( int i = start, k = 0; i >= 0; i-- ) {
+ for ( int i = start; ( i >= 0 ) && ( counted < count ); i-- ) {
int gi = getGlyph ( i - index );
if ( gi == 65535 ) {
ignored++;
} else {
if ( ( ignoreTester == null ) || ! ignoreTester.test ( gi, getLookupFlags() ) ) {
- if ( k < count ) {
- glyphs [ k++ ] = gi;
- counted++;
- } else {
- break;
- }
+ glyphs [ counted++ ] = gi;
} else {
ignored++;
}
return getIgnoredGlyphs ( offset, count, offset < 0, ignoreDefault, null, null );
}
+ /**
+ * Determine if glyph at specified offset from current position is ignored. If <code>offset</code> is
+ * negative, then test in reverse order.
+ * @param offset from current position
+ * @param ignoreTester glyph tester to use to determine which glyphs are ignored (or null, in which case none are ignored)
+ * @return true if glyph is ignored
+ * @throws IndexOutOfBoundsException if offset results in an
+ * invalid index into input glyph sequence
+ */
+ public boolean isIgnoredGlyph ( int offset, GlyphTester ignoreTester ) throws IndexOutOfBoundsException {
+ return ( ignoreTester != null ) && ignoreTester.test ( getGlyph ( offset ), getLookupFlags() );
+ }
+
+ /**
+ * Determine if glyph at specified offset from current position is ignored. If <code>offset</code> is
+ * negative, then test in reverse order.
+ * @param offset from current position
+ * @return true if glyph is ignored
+ * @throws IndexOutOfBoundsException if offset results in an
+ * invalid index into input glyph sequence
+ */
+ public boolean isIgnoredGlyph ( int offset ) throws IndexOutOfBoundsException {
+ return isIgnoredGlyph ( offset, ignoreDefault );
+ }
+
+ /**
+ * Determine if glyph at current position is ignored.
+ * @return true if glyph is ignored
+ * @throws IndexOutOfBoundsException if offset results in an
+ * invalid index into input glyph sequence
+ */
+ public boolean isIgnoredGlyph() throws IndexOutOfBoundsException {
+ return isIgnoredGlyph ( getPosition() );
+ }
+
/**
* Determine number of glyphs available starting at specified offset from current position. If
* <code>reverseOrder</code> is true, then search backwards in input glyph sequence.