package com.google.typography.font.sfntly.table.bitmap; import com.google.typography.font.sfntly.data.ReadableFontData; import com.google.typography.font.sfntly.data.WritableFontData; import com.google.typography.font.sfntly.table.SubTable; import com.google.typography.font.sfntly.table.SubTable.Builder; import java.util.Iterator; public abstract class IndexSubTable extends SubTable { private static final boolean DEBUG = false; private final int firstGlyphIndex; private final int lastGlyphIndex; private final int indexFormat; private final int imageFormat; private final int imageDataOffset; protected static IndexSubTable createIndexSubTable(ReadableFontData paramReadableFontData, int paramInt1, int paramInt2) { Builder localBuilder = Builder.createBuilder(paramReadableFontData, paramInt1, paramInt2); if (localBuilder == null) { return null; } return (IndexSubTable)localBuilder.build(); } protected IndexSubTable(ReadableFontData paramReadableFontData, int paramInt1, int paramInt2) { super(paramReadableFontData); this.firstGlyphIndex = paramInt1; this.lastGlyphIndex = paramInt2; this.indexFormat = this.data.readUShort(EblcTable.Offset.indexSubHeader_indexFormat.offset); this.imageFormat = this.data.readUShort(EblcTable.Offset.indexSubHeader_imageFormat.offset); this.imageDataOffset = this.data.readULongAsInt(EblcTable.Offset.indexSubHeader_imageDataOffset.offset); } public int indexFormat() { return this.indexFormat; } public int firstGlyphIndex() { return this.firstGlyphIndex; } public int lastGlyphIndex() { return this.lastGlyphIndex; } public int imageFormat() { return this.imageFormat; } public int imageDataOffset() { return this.imageDataOffset; } public BitmapGlyphInfo glyphInfo(int paramInt) { int i = checkGlyphRange(paramInt); if (i == -1) { return null; } if (glyphStartOffset(paramInt) == -1) { return null; } return new BitmapGlyphInfo(paramInt, imageDataOffset(), glyphStartOffset(paramInt), glyphLength(paramInt), imageFormat()); } public final int glyphOffset(int paramInt) { int i = glyphStartOffset(paramInt); if (i == -1) { return -1; } return imageDataOffset() + i; } public abstract int glyphStartOffset(int paramInt); public abstract int glyphLength(int paramInt); public abstract int numGlyphs(); protected static int checkGlyphRange(int paramInt1, int paramInt2, int paramInt3) { if ((paramInt1 < paramInt2) || (paramInt1 > paramInt3)) { throw new IndexOutOfBoundsException("Glyph ID is outside of the allowed range."); } return paramInt1 - paramInt2; } protected int checkGlyphRange(int paramInt) { return checkGlyphRange(paramInt, firstGlyphIndex(), lastGlyphIndex()); } public String toString() { String str = "IndexSubTable: [0x" + Integer.toHexString(firstGlyphIndex()) + " : Ox" + Integer.toHexString(lastGlyphIndex()) + "]" + ", format = " + this.indexFormat + ", image format = " + imageFormat() + ", imageOff = " + Integer.toHexString(imageDataOffset()) + "\n"; return str; } public static abstract class Builder<T extends IndexSubTable> extends SubTable.Builder<T> { private int firstGlyphIndex; private int lastGlyphIndex; private int indexFormat; private int imageFormat; private int imageDataOffset; public static Builder<? extends IndexSubTable> createBuilder(int paramInt) { switch (paramInt) { case 1: return IndexSubTableFormat1.Builder.createBuilder(); case 2: return IndexSubTableFormat2.Builder.createBuilder(); case 3: return IndexSubTableFormat3.Builder.createBuilder(); case 4: return IndexSubTableFormat4.Builder.createBuilder(); case 5: return IndexSubTableFormat5.Builder.createBuilder(); } throw new IllegalArgumentException(String.format("Invalid Index SubTable Format %i%n", new Object[] { Integer.valueOf(paramInt) })); } static Builder<? extends IndexSubTable> createBuilder(ReadableFontData paramReadableFontData, int paramInt1, int paramInt2) { int i = paramInt1 + paramInt2 * EblcTable.Offset.indexSubTableEntryLength.offset; int j = paramReadableFontData.readUShort(i + EblcTable.Offset.indexSubTableEntry_firstGlyphIndex.offset); int k = paramReadableFontData.readUShort(i + EblcTable.Offset.indexSubTableEntry_lastGlyphIndex.offset); int m = paramReadableFontData.readULongAsInt(i + EblcTable.Offset.indexSubTableEntry_additionalOffsetToIndexSubtable.offset); int n = paramInt1 + m; int i1 = paramReadableFontData.readUShort(n); switch (i1) { case 1: return IndexSubTableFormat1.Builder.createBuilder(paramReadableFontData, n, j, k); case 2: return IndexSubTableFormat2.Builder.createBuilder(paramReadableFontData, n, j, k); case 3: return IndexSubTableFormat3.Builder.createBuilder(paramReadableFontData, n, j, k); case 4: return IndexSubTableFormat4.Builder.createBuilder(paramReadableFontData, n, j, k); case 5: return IndexSubTableFormat5.Builder.createBuilder(paramReadableFontData, n, j, k); } throw new IllegalArgumentException(String.format("Invalid Index SubTable Foramt %i%n", new Object[] { Integer.valueOf(i1) })); } protected Builder(int paramInt1, int paramInt2) { super(); this.indexFormat = paramInt2; } protected Builder(int paramInt1, int paramInt2, int paramInt3, int paramInt4) { this(paramInt4, paramInt1); this.imageFormat = paramInt2; this.imageDataOffset = paramInt3; } protected Builder(WritableFontData paramWritableFontData, int paramInt1, int paramInt2) { super(); this.firstGlyphIndex = paramInt1; this.lastGlyphIndex = paramInt2; initialize(paramWritableFontData); } protected Builder(ReadableFontData paramReadableFontData, int paramInt1, int paramInt2) { super(); this.firstGlyphIndex = paramInt1; this.lastGlyphIndex = paramInt2; initialize(paramReadableFontData); } private void initialize(ReadableFontData paramReadableFontData) { this.indexFormat = paramReadableFontData.readUShort(EblcTable.Offset.indexSubHeader_indexFormat.offset); this.imageFormat = paramReadableFontData.readUShort(EblcTable.Offset.indexSubHeader_imageFormat.offset); this.imageDataOffset = paramReadableFontData.readULongAsInt(EblcTable.Offset.indexSubHeader_imageDataOffset.offset); } protected void revert() { setModelChanged(false); initialize(internalReadData()); } public int indexFormat() { return this.indexFormat; } public int firstGlyphIndex() { return this.firstGlyphIndex; } public void setFirstGlyphIndex(int paramInt) { this.firstGlyphIndex = paramInt; } public int lastGlyphIndex() { return this.lastGlyphIndex; } public void setLastGlyphIndex(int paramInt) { this.lastGlyphIndex = paramInt; } public int imageFormat() { return this.imageFormat; } public void setImageFormat(int paramInt) { this.imageFormat = paramInt; } public int imageDataOffset() { return this.imageDataOffset; } public void setImageDataOffset(int paramInt) { this.imageDataOffset = paramInt; } public abstract int numGlyphs(); public BitmapGlyphInfo glyphInfo(int paramInt) { return new BitmapGlyphInfo(paramInt, imageDataOffset(), glyphStartOffset(paramInt), glyphLength(paramInt), imageFormat()); } public final int glyphOffset(int paramInt) { return imageDataOffset() + glyphStartOffset(paramInt); } public abstract int glyphStartOffset(int paramInt); public abstract int glyphLength(int paramInt); protected int checkGlyphRange(int paramInt) { return IndexSubTable.checkGlyphRange(paramInt, firstGlyphIndex(), lastGlyphIndex()); } protected int serializeIndexSubHeader(WritableFontData paramWritableFontData) { int i = paramWritableFontData.writeUShort(EblcTable.Offset.indexSubHeader_indexFormat.offset, this.indexFormat); i += paramWritableFontData.writeUShort(EblcTable.Offset.indexSubHeader_imageFormat.offset, this.imageFormat); i += paramWritableFontData.writeULong(EblcTable.Offset.indexSubHeader_imageDataOffset.offset, this.imageDataOffset); return i; } abstract Iterator<BitmapGlyphInfo> iterator(); protected T subBuildTable(ReadableFontData paramReadableFontData) { return null; } protected void subDataSet() {} protected int subDataSizeToSerialize() { return 0; } protected boolean subReadyToSerialize() { return false; } protected int subSerialize(WritableFontData paramWritableFontData) { return 0; } public String toString() { String str = "IndexSubTable: [0x" + Integer.toHexString(firstGlyphIndex()) + " : Ox" + Integer.toHexString(lastGlyphIndex()) + "]" + ", format = " + this.indexFormat + ", image format = " + imageFormat() + ", imageOff = 0x" + Integer.toHexString(imageDataOffset()) + "\n"; return str; } } public static final class Format { public static final int FORMAT_1 = 1; public static final int FORMAT_2 = 2; public static final int FORMAT_3 = 3; public static final int FORMAT_4 = 4; public static final int FORMAT_5 = 5; } } /* Location: C:\Users\Ethan\Desktop\FontZip\FontTool\sfnttool.jar!\com\google\typography\font\sfntly\table\bitmap\IndexSubTable.class * Java compiler version: 6 (50.0) * JD-Core Version: 0.7.1 */