package com.google.typography.font.sfntly.table.truetype; 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.LinkedList; import java.util.List; public final class CompositeGlyph extends Glyph { public static final int FLAG_ARG_1_AND_2_ARE_WORDS = 1; public static final int FLAG_ARGS_ARE_XY_VALUES = 2; public static final int FLAG_ROUND_XY_TO_GRID = 4; public static final int FLAG_WE_HAVE_A_SCALE = 8; public static final int FLAG_RESERVED = 16; public static final int FLAG_MORE_COMPONENTS = 32; public static final int FLAG_WE_HAVE_AN_X_AND_Y_SCALE = 64; public static final int FLAG_WE_HAVE_A_TWO_BY_TWO = 128; public static final int FLAG_WE_HAVE_INSTRUCTIONS = 256; public static final int FLAG_USE_MY_METRICS = 512; public static final int FLAG_OVERLAP_COMPOUND = 1024; public static final int FLAG_SCALED_COMPONENT_OFFSET = 2048; public static final int FLAG_UNSCALED_COMPONENT_OFFSET = 4096; private final List<Integer> contourIndex = new LinkedList(); private int instructionsOffset; private int instructionSize; protected CompositeGlyph(ReadableFontData paramReadableFontData, int paramInt1, int paramInt2) { super(paramReadableFontData, paramInt1, paramInt2, Glyph.GlyphType.Composite); initialize(); } protected CompositeGlyph(ReadableFontData paramReadableFontData) { super(paramReadableFontData, Glyph.GlyphType.Composite); initialize(); } protected void initialize() { if (this.initialized) { return; } synchronized (this.initializationLock) { if (this.initialized) { return; } int i = 5 * FontData.DataSize.USHORT.size(); int j = 32; while ((j & 0x20) == 32) { this.contourIndex.add(Integer.valueOf(i)); j = this.data.readUShort(i); i += 2 * FontData.DataSize.USHORT.size(); if ((j & 0x1) == 1) { i += 2 * FontData.DataSize.SHORT.size(); } else { i += 2 * FontData.DataSize.BYTE.size(); } if ((j & 0x8) == 8) { i += FontData.DataSize.F2DOT14.size(); } else if ((j & 0x40) == 64) { i += 2 * FontData.DataSize.F2DOT14.size(); } else if ((j & 0x80) == 128) { i += 4 * FontData.DataSize.F2DOT14.size(); } } int k = i; if ((j & 0x100) == 256) { this.instructionSize = this.data.readUShort(i); i += FontData.DataSize.USHORT.size(); this.instructionsOffset = i; k = i + this.instructionSize * FontData.DataSize.BYTE.size(); } setPadding(dataLength() - k); } } public int flags(int paramInt) { return this.data.readUShort(((Integer)this.contourIndex.get(paramInt)).intValue()); } public int numGlyphs() { return this.contourIndex.size(); } public int glyphIndex(int paramInt) { return this.data.readUShort(FontData.DataSize.USHORT.size() + ((Integer)this.contourIndex.get(paramInt)).intValue()); } public int argument1(int paramInt) { int i = 2 * FontData.DataSize.USHORT.size() + ((Integer)this.contourIndex.get(paramInt)).intValue(); int j = flags(paramInt); if ((j & 0x1) == 1) { return this.data.readUShort(i); } return this.data.readByte(i); } public int argument2(int paramInt) { int i = 2 * FontData.DataSize.USHORT.size() + ((Integer)this.contourIndex.get(paramInt)).intValue(); int j = flags(paramInt); if ((j & 0x1) == 1) { return this.data.readUShort(i + FontData.DataSize.USHORT.size()); } return this.data.readByte(i + FontData.DataSize.BYTE.size()); } public int transformationSize(int paramInt) { int i = flags(paramInt); if ((i & 0x8) == 8) { return FontData.DataSize.F2DOT14.size(); } if ((i & 0x40) == 64) { return 2 * FontData.DataSize.F2DOT14.size(); } if ((i & 0x80) == 128) { return 4 * FontData.DataSize.F2DOT14.size(); } return 0; } public byte[] transformation(int paramInt) { int i = flags(paramInt); int j = ((Integer)this.contourIndex.get(paramInt)).intValue() + 2 * FontData.DataSize.USHORT.size(); if ((i & 0x1) == 1) { j += 2 * FontData.DataSize.SHORT.size(); } else { j += 2 * FontData.DataSize.BYTE.size(); } int k = transformationSize(paramInt); byte[] arrayOfByte = new byte[k]; this.data.readBytes(j, arrayOfByte, 0, k); return arrayOfByte; } public int instructionSize() { return this.instructionSize; } public ReadableFontData instructions() { return this.data.slice(this.instructionsOffset, instructionSize()); } public String toString() { StringBuilder localStringBuilder = new StringBuilder(super.toString()); localStringBuilder.append("\ncontourOffset.length = "); localStringBuilder.append(this.contourIndex.size()); localStringBuilder.append("\ninstructionSize = "); localStringBuilder.append(this.instructionSize); localStringBuilder.append("\n\tcontour index = ["); for (int i = 0; i < this.contourIndex.size(); i++) { if (i != 0) { localStringBuilder.append(", "); } localStringBuilder.append(this.contourIndex.get(i)); } localStringBuilder.append("]\n"); for (i = 0; i < this.contourIndex.size(); i++) { localStringBuilder.append("\t" + i + " = [gid = " + glyphIndex(i) + ", arg1 = " + argument1(i) + ", arg2 = " + argument2(i) + "]\n"); } return localStringBuilder.toString(); } public static class CompositeGlyphBuilder extends Glyph.Builder<CompositeGlyph> { protected CompositeGlyphBuilder(WritableFontData paramWritableFontData, int paramInt1, int paramInt2) { super(); } protected CompositeGlyphBuilder(ReadableFontData paramReadableFontData, int paramInt1, int paramInt2) { super(); } protected CompositeGlyph subBuildTable(ReadableFontData paramReadableFontData) { return new CompositeGlyph(paramReadableFontData); } } } /* Location: C:\Users\Ethan\Desktop\FontZip\FontTool\sfnttool.jar!\com\google\typography\font\sfntly\table\truetype\CompositeGlyph.class * Java compiler version: 6 (50.0) * JD-Core Version: 0.7.1 */