package com.google.typography.font.tools.conversion.woff; import com.google.typography.font.sfntly.Font; import com.google.typography.font.sfntly.Tag; 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 com.google.typography.font.sfntly.table.Table; import com.google.typography.font.sfntly.table.core.FontHeaderTable; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeSet; import java.util.zip.Deflater; public class WoffWriter { protected boolean woff_compression_faster = false; private static final long SIGNATURE = 2001684038L; private static final int WOFF_HEADER_SIZE = 9 * FontData.DataSize.ULONG.size() + 4 * FontData.DataSize.USHORT.size(); public WritableFontData convert(Font paramFont) { List localList = createTableDirectoryEntries(paramFont); int i = WOFF_HEADER_SIZE + computeTableDirectoryEntriesLength(localList) + computeTablesLength(localList); WritableFontData localWritableFontData = WritableFontData.createWritableFontData(i); int j = 0; j += writeWoffHeader(localWritableFontData, j, localList, paramFont.sfntVersion(), i, extractMajorVersion(paramFont), extractMinorVersion(paramFont)); j += writeTableDirectoryEntries(localWritableFontData, j, localList); j += writeTables(localWritableFontData, j, localList); return localWritableFontData; } private int extractMajorVersion(Font paramFont) { FontHeaderTable localFontHeaderTable = (FontHeaderTable)paramFont.getTable(Tag.head); return localFontHeaderTable.fontRevision() >> 16 & 0xFFFF; } private int extractMinorVersion(Font paramFont) { FontHeaderTable localFontHeaderTable = (FontHeaderTable)paramFont.getTable(Tag.head); return localFontHeaderTable.fontRevision() & 0xFFFF; } private int align4(int paramInt) { return paramInt + 3 & 0xFFFFFFFC; } private int computeTableDirectoryEntriesLength(List<TableDirectoryEntry> paramList) { return TableDirectoryEntry.ENTRY_SIZE * paramList.size(); } private int computeTablesLength(List<TableDirectoryEntry> paramList) { int i = 0; Iterator localIterator = paramList.iterator(); while (localIterator.hasNext()) { TableDirectoryEntry localTableDirectoryEntry = (TableDirectoryEntry)localIterator.next(); i += localTableDirectoryEntry.getCompressedTableLength(); i = align4(i); } return i; } private int writeWoffHeader(WritableFontData paramWritableFontData, int paramInt1, List<TableDirectoryEntry> paramList, int paramInt2, int paramInt3, int paramInt4, int paramInt5) { int i = paramInt1; i += paramWritableFontData.writeULong(i, 2001684038L); i += paramWritableFontData.writeULong(i, paramInt2); i += paramWritableFontData.writeULong(i, paramInt3); i += paramWritableFontData.writeUShort(i, paramList.size()); i += paramWritableFontData.writeUShort(i, 0); i += paramWritableFontData.writeULong(i, computeUncompressedTablesLength(paramList) + computeTableSfntHeaderLength(paramList)); i += paramWritableFontData.writeUShort(i, 1); i += paramWritableFontData.writeUShort(i, 1); i += paramWritableFontData.writeULong(i, 0L); i += paramWritableFontData.writeULong(i, 0L); i += paramWritableFontData.writeULong(i, 0L); i += paramWritableFontData.writeULong(i, 0L); i += paramWritableFontData.writeULong(i, 0L); return WOFF_HEADER_SIZE; } private int computeTableSfntHeaderLength(List<TableDirectoryEntry> paramList) { return FontData.DataSize.ULONG.size() + 4 * FontData.DataSize.USHORT.size() + 4 * FontData.DataSize.ULONG.size() * paramList.size(); } private int computeUncompressedTablesLength(List<TableDirectoryEntry> paramList) { int i = 0; Iterator localIterator = paramList.iterator(); while (localIterator.hasNext()) { TableDirectoryEntry localTableDirectoryEntry = (TableDirectoryEntry)localIterator.next(); i = (int)(i + localTableDirectoryEntry.getUncompressedTableLength()); i = align4(i); } return i; } private int writeTableDirectoryEntries(WritableFontData paramWritableFontData, int paramInt, List<TableDirectoryEntry> paramList) { int i = paramInt; int j = align4(paramInt + computeTableDirectoryEntriesLength(paramList)); Iterator localIterator = paramList.iterator(); while (localIterator.hasNext()) { TableDirectoryEntry localTableDirectoryEntry = (TableDirectoryEntry)localIterator.next(); i += localTableDirectoryEntry.writeEntry(paramWritableFontData, j, i); j += localTableDirectoryEntry.getCompressedTableLength(); j = align4(j); } return computeTableDirectoryEntriesLength(paramList); } private int writeTables(WritableFontData paramWritableFontData, int paramInt, List<TableDirectoryEntry> paramList) { int i = align4(paramInt); Iterator localIterator = paramList.iterator(); while (localIterator.hasNext()) { TableDirectoryEntry localTableDirectoryEntry = (TableDirectoryEntry)localIterator.next(); i += localTableDirectoryEntry.writeTable(paramWritableFontData, i); i = align4(i); } return i - paramInt; } private List<TableDirectoryEntry> createTableDirectoryEntries(Font paramFont) { ArrayList localArrayList = new ArrayList(); TreeSet localTreeSet = new TreeSet(paramFont.tableMap().keySet()); localTreeSet.remove(Integer.valueOf(Tag.DSIG)); Iterator localIterator = localTreeSet.iterator(); while (localIterator.hasNext()) { int i = ((Integer)localIterator.next()).intValue(); Table localTable = paramFont.getTable(i); TableDirectoryEntry localTableDirectoryEntry = new TableDirectoryEntry(null); localTableDirectoryEntry.setTag(i); localTableDirectoryEntry.setOrigLength(localTable.dataLength()); localTableDirectoryEntry.setOrigChecksum(localTable.calculatedChecksum()); setCompressedTableData(localTableDirectoryEntry, localTable); localArrayList.add(localTableDirectoryEntry); } return localArrayList; } private void setCompressedTableData(TableDirectoryEntry paramTableDirectoryEntry, Table paramTable) { int i = paramTable.dataLength(); byte[] arrayOfByte1 = new byte[i]; paramTable.readFontData().readBytes(0, arrayOfByte1, 0, i); if ((this.woff_compression_faster) && ((i < 100) || (paramTable.headerTag() == Tag.loca))) { paramTableDirectoryEntry.setCompTable(arrayOfByte1); } else { byte[] arrayOfByte2 = new byte[i]; Deflater localDeflater = new Deflater(); localDeflater.setInput(arrayOfByte1); localDeflater.finish(); int j = localDeflater.deflate(arrayOfByte2); paramTableDirectoryEntry.setCompTable((j == i) || (!localDeflater.finished()) ? arrayOfByte1 : Arrays.copyOfRange(arrayOfByte2, 0, j)); } } private static class TableDirectoryEntry { public static final int ENTRY_SIZE = 5 * FontData.DataSize.ULONG.size(); private long tag; private long origLength; private long origChecksum; private byte[] compTable; public void setTag(int paramInt) { this.tag = paramInt; } public void setOrigLength(int paramInt) { this.origLength = paramInt; } public void setOrigChecksum(long paramLong) { this.origChecksum = paramLong; } public void setCompTable(byte[] paramArrayOfByte) { this.compTable = paramArrayOfByte; } public int getCompressedTableLength() { return this.compTable.length; } public long getUncompressedTableLength() { return this.origLength; } public int writeEntry(WritableFontData paramWritableFontData, int paramInt1, int paramInt2) { int i = paramInt2; i += paramWritableFontData.writeULong(i, this.tag); i += paramWritableFontData.writeULong(i, paramInt1); i += paramWritableFontData.writeULong(i, this.compTable.length); i += paramWritableFontData.writeULong(i, this.origLength); i += paramWritableFontData.writeULong(i, this.origChecksum); return ENTRY_SIZE; } public int writeTable(WritableFontData paramWritableFontData, int paramInt) { paramWritableFontData.writeBytes(paramInt, this.compTable, 0, this.compTable.length); return getCompressedTableLength(); } } } /* Location: C:\Users\Ethan\Desktop\FontZip\FontTool\sfnttool.jar!\com\google\typography\font\tools\conversion\woff\WoffWriter.class * Java compiler version: 6 (50.0) * JD-Core Version: 0.7.1 */