package com.google.typography.font.tools.conversion.eot; import com.google.typography.font.sfntly.Font; import com.google.typography.font.sfntly.Tag; import com.google.typography.font.sfntly.data.ReadableFontData; import com.google.typography.font.sfntly.table.truetype.CompositeGlyph; import com.google.typography.font.sfntly.table.truetype.Glyph; import com.google.typography.font.sfntly.table.truetype.GlyphTable; import com.google.typography.font.sfntly.table.truetype.LocaTable; import com.google.typography.font.sfntly.table.truetype.SimpleGlyph; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; public class GlyfEncoder { private final boolean doPush; private final ByteArrayOutputStream glyfStream; private final ByteArrayOutputStream pushStream; private final ByteArrayOutputStream codeStream; public GlyfEncoder(boolean paramBoolean) { this.doPush = paramBoolean; this.glyfStream = new ByteArrayOutputStream(); this.pushStream = new ByteArrayOutputStream(); this.codeStream = new ByteArrayOutputStream(); } public GlyfEncoder() { this(true); } public void encode(Font paramFont) { LocaTable localLocaTable = (LocaTable)paramFont.getTable(Tag.loca); int i = localLocaTable.numGlyphs(); GlyphTable localGlyphTable = (GlyphTable)paramFont.getTable(Tag.glyf); for (int j = 0; j < i; j++) { int k = localLocaTable.glyphOffset(j); int m = localLocaTable.glyphLength(j); Glyph localGlyph = localGlyphTable.glyph(k, m); writeGlyph(localGlyph); } } private void writeGlyph(Glyph paramGlyph) { try { if ((paramGlyph == null) || (paramGlyph.dataLength() == 0)) { writeUShort(0); } else if ((paramGlyph instanceof SimpleGlyph)) { writeSimpleGlyph((SimpleGlyph)paramGlyph); } else if ((paramGlyph instanceof CompositeGlyph)) { writeCompositeGlyph((CompositeGlyph)paramGlyph); } } catch (IOException localIOException) { throw new RuntimeException("unexpected IOException writing glyph data", localIOException); } } private void writeInstructions(Glyph paramGlyph) throws IOException { if (this.doPush) { splitPush(paramGlyph); } else { int i = 0; int j = paramGlyph.instructionSize(); write255UShort(this.glyfStream, i); write255UShort(this.glyfStream, j); if (j > 0) { paramGlyph.instructions().copyTo(this.codeStream); } } } private void writeSimpleGlyph(SimpleGlyph paramSimpleGlyph) throws IOException { int i = paramSimpleGlyph.numberOfContours(); writeUShort(i); for (int j = 0; j < i; j++) { write255UShort(this.glyfStream, paramSimpleGlyph.numberOfPoints(j) - (j == 0 ? 1 : 0)); } ByteArrayOutputStream localByteArrayOutputStream = new ByteArrayOutputStream(); int k = 0; int m = 0; for (int n = 0; n < i; n++) { int i1 = paramSimpleGlyph.numberOfPoints(n); for (int i2 = 0; i2 < i1; i2++) { int i3 = paramSimpleGlyph.xCoordinate(n, i2); int i4 = paramSimpleGlyph.yCoordinate(n, i2); int i5 = i3 - k; int i6 = i4 - m; writeTriplet(localByteArrayOutputStream, paramSimpleGlyph.onCurve(n, i2), i5, i6); k = i3; m = i4; } } localByteArrayOutputStream.writeTo(this.glyfStream); if (i > 0) { writeInstructions(paramSimpleGlyph); } } private void writeCompositeGlyph(CompositeGlyph paramCompositeGlyph) throws IOException { int i = 0; writeUShort(-1); writeUShort(paramCompositeGlyph.xMin()); writeUShort(paramCompositeGlyph.yMin()); writeUShort(paramCompositeGlyph.xMax()); writeUShort(paramCompositeGlyph.yMax()); for (int j = 0; j < paramCompositeGlyph.numGlyphs(); j++) { int k = paramCompositeGlyph.flags(j); writeUShort(k); i = (k & 0x100) != 0 ? 1 : 0; writeUShort(paramCompositeGlyph.glyphIndex(j)); if ((k & 0x1) == 0) { this.glyfStream.write(paramCompositeGlyph.argument1(j)); this.glyfStream.write(paramCompositeGlyph.argument2(j)); } else { writeUShort(paramCompositeGlyph.argument1(j)); writeUShort(paramCompositeGlyph.argument2(j)); } if (paramCompositeGlyph.transformationSize(j) != 0) { try { this.glyfStream.write(paramCompositeGlyph.transformation(j)); } catch (IOException localIOException) {} } } if (i != 0) { writeInstructions(paramCompositeGlyph); } } private void writeUShort(int paramInt) { this.glyfStream.write(paramInt >> 8); this.glyfStream.write(paramInt & 0xFF); } static void write255UShort(OutputStream paramOutputStream, int paramInt) throws IOException { if (paramInt < 0) { throw new IllegalArgumentException(); } if (paramInt < 253) { paramOutputStream.write((byte)paramInt); } else if (paramInt < 506) { paramOutputStream.write(255); paramOutputStream.write((byte)(paramInt - 253)); } else if (paramInt < 762) { paramOutputStream.write(254); paramOutputStream.write((byte)(paramInt - 506)); } else { paramOutputStream.write(253); paramOutputStream.write((byte)(paramInt >> 8)); paramOutputStream.write((byte)(paramInt & 0xFF)); } } static void write255Short(OutputStream paramOutputStream, int paramInt) throws IOException { int i = Math.abs(paramInt); if (paramInt < 0) { paramOutputStream.write(250); } if (i < 250) { paramOutputStream.write((byte)i); } else if (i < 500) { paramOutputStream.write(255); paramOutputStream.write((byte)(i - 250)); } else if (i < 756) { paramOutputStream.write(254); paramOutputStream.write((byte)(i - 500)); } else { paramOutputStream.write(253); paramOutputStream.write((byte)(i >> 8)); paramOutputStream.write((byte)(i & 0xFF)); } } void writeTriplet(OutputStream paramOutputStream, boolean paramBoolean, int paramInt1, int paramInt2) throws IOException { int i = Math.abs(paramInt1); int j = Math.abs(paramInt2); int k = paramBoolean ? 0 : 128; int m = paramInt1 < 0 ? 0 : 1; int n = paramInt2 < 0 ? 0 : 1; int i1 = m + 2 * n; if ((paramInt1 == 0) && (j < 1280)) { this.glyfStream.write(k + ((j & 0xF00) >> 7) + n); paramOutputStream.write(j & 0xFF); } else if ((paramInt2 == 0) && (i < 1280)) { this.glyfStream.write(k + 10 + ((i & 0xF00) >> 7) + m); paramOutputStream.write(i & 0xFF); } else if ((i < 65) && (j < 65)) { this.glyfStream.write(k + 20 + (i - 1 & 0x30) + ((j - 1 & 0x30) >> 2) + i1); paramOutputStream.write((i - 1 & 0xF) << 4 | j - 1 & 0xF); } else if ((i < 769) && (j < 769)) { this.glyfStream.write(k + 84 + 12 * ((i - 1 & 0x300) >> 8) + ((j - 1 & 0x300) >> 6) + i1); paramOutputStream.write(i - 1 & 0xFF); paramOutputStream.write(j - 1 & 0xFF); } else if ((i < 4096) && (j < 4096)) { this.glyfStream.write(k + 120 + i1); paramOutputStream.write(i >> 4); paramOutputStream.write((i & 0xF) << 4 | j >> 8); paramOutputStream.write(j & 0xFF); } else { this.glyfStream.write(k + 124 + i1); paramOutputStream.write(i >> 8); paramOutputStream.write(i & 0xFF); paramOutputStream.write(j >> 8); paramOutputStream.write(j & 0xFF); } } private void splitPush(Glyph paramGlyph) throws IOException { int i = paramGlyph.instructionSize(); ReadableFontData localReadableFontData = paramGlyph.instructions(); int j = 0; ArrayList localArrayList = new ArrayList(); while (j + 1 < i) { k = j; m = localReadableFontData.readUByte(k++); int n = 0; int i1 = 0; if ((m == 64) || (m == 65)) { n = localReadableFontData.readUByte(k++); i1 = (m & 0x1) + 1; } else { if ((m < 176) || (m >= 192)) { break; } n = 1 + (m & 0x7); i1 = ((m & 0x8) >> 3) + 1; } if (j + i1 * n > i) { break; } for (int i2 = 0; i2 < n; i2++) { if (i1 == 1) { localArrayList.add(Integer.valueOf(localReadableFontData.readUByte(k))); } else { localArrayList.add(Integer.valueOf(localReadableFontData.readShort(k))); } k += i1; } j = k; } int k = localArrayList.size(); int m = i - j; write255UShort(this.glyfStream, k); write255UShort(this.glyfStream, m); encodePushSequence(this.pushStream, localArrayList); if (m > 0) { localReadableFontData.slice(j).copyTo(this.codeStream); } } private void encodePushSequence(OutputStream paramOutputStream, List<Integer> paramList) throws IOException { int i = paramList.size(); int j = 0; for (int k = 0; k < i; k++) { if ((j & 0x1) == 0) { int m = ((Integer)paramList.get(k)).intValue(); if ((j == 0) && (k >= 2) && (k + 2 < i) && (m == ((Integer)paramList.get(k - 2)).intValue()) && (m == ((Integer)paramList.get(k + 2)).intValue())) { if ((k + 4 < i) && (m == ((Integer)paramList.get(k + 4)).intValue())) { paramOutputStream.write(252); j = 20; } else { paramOutputStream.write(251); j = 4; } } else { write255Short(paramOutputStream, ((Integer)paramList.get(k)).intValue()); } } j >>= 1; } } public byte[] getGlyfBytes() { return this.glyfStream.toByteArray(); } public byte[] getPushBytes() { return this.pushStream.toByteArray(); } public byte[] getCodeBytes() { return this.codeStream.toByteArray(); } } /* Location: C:\Users\Ethan\Desktop\FontZip\FontTool\sfnttool.jar!\com\google\typography\font\tools\conversion\eot\GlyfEncoder.class * Java compiler version: 6 (50.0) * JD-Core Version: 0.7.1 */