package com.google.typography.font.sfntly.table.bitmap; import com.google.typography.font.sfntly.data.FontData.DataSize; import com.google.typography.font.sfntly.data.ReadableFontData; import com.google.typography.font.sfntly.data.WritableFontData; import java.util.ArrayList; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; public final class IndexSubTableFormat4 extends IndexSubTable { public static final Comparator<CodeOffsetPair> CodeOffsetPairComparatorByGlyphCode = new CodeOffsetPairGlyphCodeComparator(null); private IndexSubTableFormat4(ReadableFontData paramReadableFontData, int paramInt1, int paramInt2) { super(paramReadableFontData, paramInt1, paramInt2); } private static int numGlyphs(ReadableFontData paramReadableFontData, int paramInt) { int i = paramReadableFontData.readULongAsInt(paramInt + EblcTable.Offset.indexSubTable4_numGlyphs.offset); return i; } public int numGlyphs() { return numGlyphs(this.data, 0); } public int glyphStartOffset(int paramInt) { checkGlyphRange(paramInt); int i = findCodeOffsetPair(paramInt); if (i < 0) { return -1; } return this.data.readUShort(EblcTable.Offset.indexSubTable4_glyphArray.offset + i * EblcTable.Offset.codeOffsetPairLength.offset + EblcTable.Offset.codeOffsetPair_offset.offset); } public int glyphLength(int paramInt) { checkGlyphRange(paramInt); int i = findCodeOffsetPair(paramInt); if (i < 0) { return -1; } return this.data.readUShort(EblcTable.Offset.indexSubTable4_glyphArray.offset + (i + 1) * EblcTable.Offset.codeOffsetPairLength.offset + EblcTable.Offset.codeOffsetPair_offset.offset) - this.data.readUShort(EblcTable.Offset.indexSubTable4_glyphArray.offset + i * EblcTable.Offset.codeOffsetPairLength.offset + EblcTable.Offset.codeOffsetPair_offset.offset); } protected int findCodeOffsetPair(int paramInt) { return this.data.searchUShort(EblcTable.Offset.indexSubTable4_glyphArray.offset, EblcTable.Offset.codeOffsetPairLength.offset, numGlyphs(), paramInt); } public static final class Builder extends IndexSubTable.Builder<IndexSubTableFormat4> { private List<IndexSubTableFormat4.CodeOffsetPairBuilder> offsetPairArray; public static Builder createBuilder() { return new Builder(); } static Builder createBuilder(ReadableFontData paramReadableFontData, int paramInt1, int paramInt2, int paramInt3) { int i = dataLength(paramReadableFontData, paramInt1, paramInt2, paramInt3); return new Builder(paramReadableFontData.slice(paramInt1, i), paramInt2, paramInt3); } static Builder createBuilder(WritableFontData paramWritableFontData, int paramInt1, int paramInt2, int paramInt3) { int i = dataLength(paramWritableFontData, paramInt1, paramInt2, paramInt3); return new Builder(paramWritableFontData.slice(paramInt1, i), paramInt2, paramInt3); } private static int dataLength(ReadableFontData paramReadableFontData, int paramInt1, int paramInt2, int paramInt3) { int i = IndexSubTableFormat4.numGlyphs(paramReadableFontData, paramInt1); return EblcTable.Offset.indexSubTable4_glyphArray.offset + i * EblcTable.Offset.indexSubTable4_codeOffsetPairLength.offset; } private Builder() { super(4); } private Builder(WritableFontData paramWritableFontData, int paramInt1, int paramInt2) { super(paramInt1, paramInt2); } private Builder(ReadableFontData paramReadableFontData, int paramInt1, int paramInt2) { super(paramInt1, paramInt2); } public int numGlyphs() { return getOffsetArray().size() - 1; } public int glyphLength(int paramInt) { checkGlyphRange(paramInt); int i = findCodeOffsetPair(paramInt); if (i == -1) { return -1; } return ((IndexSubTableFormat4.CodeOffsetPairBuilder)getOffsetArray().get(i + 1)).offset() - ((IndexSubTableFormat4.CodeOffsetPairBuilder)getOffsetArray().get(i)).offset(); } public int glyphStartOffset(int paramInt) { checkGlyphRange(paramInt); int i = findCodeOffsetPair(paramInt); if (i == -1) { return -1; } return ((IndexSubTableFormat4.CodeOffsetPairBuilder)getOffsetArray().get(i)).offset(); } public List<IndexSubTableFormat4.CodeOffsetPairBuilder> offsetArray() { return getOffsetArray(); } private List<IndexSubTableFormat4.CodeOffsetPairBuilder> getOffsetArray() { if (this.offsetPairArray == null) { initialize(super.internalReadData()); super.setModelChanged(); } return this.offsetPairArray; } private void initialize(ReadableFontData paramReadableFontData) { if (this.offsetPairArray == null) { this.offsetPairArray = new ArrayList(); } else { this.offsetPairArray.clear(); } if (paramReadableFontData != null) { int i = IndexSubTableFormat4.numGlyphs(paramReadableFontData, 0) + 1; int j = EblcTable.Offset.indexSubTable4_glyphArray.offset; for (int k = 0; k < i; k++) { int m = paramReadableFontData.readUShort(j + EblcTable.Offset.indexSubTable4_codeOffsetPair_glyphCode.offset); int n = paramReadableFontData.readUShort(j + EblcTable.Offset.indexSubTable4_codeOffsetPair_offset.offset); j += EblcTable.Offset.indexSubTable4_codeOffsetPairLength.offset; IndexSubTableFormat4.CodeOffsetPairBuilder localCodeOffsetPairBuilder = new IndexSubTableFormat4.CodeOffsetPairBuilder(m, n, null); this.offsetPairArray.add(localCodeOffsetPairBuilder); } } } private int findCodeOffsetPair(int paramInt) { List localList = getOffsetArray(); int i = 0; int j = 0; int k = localList.size(); while (k != j) { i = (k + j) / 2; IndexSubTableFormat4.CodeOffsetPairBuilder localCodeOffsetPairBuilder = (IndexSubTableFormat4.CodeOffsetPairBuilder)localList.get(i); if (paramInt < localCodeOffsetPairBuilder.glyphCode()) { k = i; } else if (paramInt > localCodeOffsetPairBuilder.glyphCode()) { j = i + 1; } else { return i; } } return -1; } public void setOffsetArray(List<IndexSubTableFormat4.CodeOffsetPairBuilder> paramList) { this.offsetPairArray = paramList; setModelChanged(); } Iterator<BitmapGlyphInfo> iterator() { return new BitmapGlyphInfoIterator(); } protected void revert() { super.revert(); this.offsetPairArray = null; } protected IndexSubTableFormat4 subBuildTable(ReadableFontData paramReadableFontData) { return new IndexSubTableFormat4(paramReadableFontData, firstGlyphIndex(), lastGlyphIndex(), null); } protected void subDataSet() { revert(); } protected int subDataSizeToSerialize() { if (this.offsetPairArray == null) { return internalReadData().length(); } return EblcTable.Offset.indexSubHeaderLength.offset + FontData.DataSize.ULONG.size() + this.offsetPairArray.size() * EblcTable.Offset.indexSubTable4_codeOffsetPairLength.offset; } protected boolean subReadyToSerialize() { return this.offsetPairArray != null; } protected int subSerialize(WritableFontData paramWritableFontData) { int i = super.serializeIndexSubHeader(paramWritableFontData); if (!modelChanged()) { i += internalReadData().slice(EblcTable.Offset.indexSubTable4_numGlyphs.offset).copyTo(paramWritableFontData.slice(EblcTable.Offset.indexSubTable4_numGlyphs.offset)); } else { i += paramWritableFontData.writeLong(i, this.offsetPairArray.size() - 1); Iterator localIterator = this.offsetPairArray.iterator(); while (localIterator.hasNext()) { IndexSubTableFormat4.CodeOffsetPairBuilder localCodeOffsetPairBuilder = (IndexSubTableFormat4.CodeOffsetPairBuilder)localIterator.next(); i += paramWritableFontData.writeUShort(i, localCodeOffsetPairBuilder.glyphCode()); i += paramWritableFontData.writeUShort(i, localCodeOffsetPairBuilder.offset()); } } return i; } private class BitmapGlyphInfoIterator implements Iterator<BitmapGlyphInfo> { private int codeOffsetPairIndex; public BitmapGlyphInfoIterator() {} public boolean hasNext() { return this.codeOffsetPairIndex < IndexSubTableFormat4.Builder.this.getOffsetArray().size() - 1; } public BitmapGlyphInfo next() { if (!hasNext()) { throw new NoSuchElementException("No more characters to iterate."); } List localList = IndexSubTableFormat4.Builder.this.getOffsetArray(); IndexSubTableFormat4.CodeOffsetPair localCodeOffsetPair = (IndexSubTableFormat4.CodeOffsetPair)localList.get(this.codeOffsetPairIndex); BitmapGlyphInfo localBitmapGlyphInfo = new BitmapGlyphInfo(localCodeOffsetPair.glyphCode(), IndexSubTableFormat4.Builder.this.imageDataOffset(), localCodeOffsetPair.offset(), ((IndexSubTableFormat4.CodeOffsetPairBuilder)localList.get(this.codeOffsetPairIndex + 1)).offset() - localCodeOffsetPair.offset(), IndexSubTableFormat4.Builder.this.imageFormat()); this.codeOffsetPairIndex += 1; return localBitmapGlyphInfo; } public void remove() { throw new UnsupportedOperationException("Unable to remove a glyph info."); } } } private static final class CodeOffsetPairGlyphCodeComparator implements Comparator<IndexSubTableFormat4.CodeOffsetPair> { public int compare(IndexSubTableFormat4.CodeOffsetPair paramCodeOffsetPair1, IndexSubTableFormat4.CodeOffsetPair paramCodeOffsetPair2) { return paramCodeOffsetPair1.glyphCode - paramCodeOffsetPair2.glyphCode; } } public static final class CodeOffsetPairBuilder extends IndexSubTableFormat4.CodeOffsetPair { private CodeOffsetPairBuilder(int paramInt1, int paramInt2) { super(paramInt2, null); } public void setGlyphCode(int paramInt) { this.glyphCode = paramInt; } public void setOffset(int paramInt) { this.offset = paramInt; } } public static class CodeOffsetPair { protected int glyphCode; protected int offset; private CodeOffsetPair(int paramInt1, int paramInt2) { this.glyphCode = paramInt1; this.offset = paramInt2; } public int glyphCode() { return this.glyphCode; } public int offset() { return this.offset; } } } /* Location: C:\Users\Ethan\Desktop\FontZip\FontTool\sfnttool.jar!\com\google\typography\font\sfntly\table\bitmap\IndexSubTableFormat4.class * Java compiler version: 6 (50.0) * JD-Core Version: 0.7.1 */