blob: 43d554eb0fcc70ac5499dd3cc499e781679f9ce0 [file] [log] [blame]
package com.google.typography.font.compression;
import com.google.common.io.Files;
import com.google.typography.font.sfntly.Font;
import com.google.typography.font.sfntly.FontFactory;
import com.google.typography.font.sfntly.Tag;
import com.google.typography.font.sfntly.table.truetype.GlyphTable;
import com.google.typography.font.sfntly.table.truetype.LocaTable;
import java.io.File;
import java.io.IOException;
/**
* Simple WOFF 2.0 compression report runner.
*
* @author David Kuettel
*/
public class SimpleRunner {
private static final FontFactory FONT_FACTORY = FontFactory.getInstance();
private static final String WOFF = "woff";
private static final String WOFF2 = "woff2/lzma";
private static final String TRUETYPE = "glyf/cbbox,triplet,code,reslice";
private static final String CFF = "";
private static final String REPORT = "report.csv";
public static void main(String[] args) throws IOException {
if (args.length == 0) {
usage();
}
CompressionStats stats = new CompressionStats();
System.out.printf("Analyzing (%d) fonts\n", args.length);
run(stats, args);
System.out.printf("Creating report: %s\n", REPORT);
CsvReport.create(stats, REPORT);
}
private static void run(CompressionStats stats, String[] filenames) throws IOException {
for (String filename : filenames) {
try {
File file = new File(filename);
byte[] bytes = Files.toByteArray(file);
Font font = FONT_FACTORY.loadFonts(bytes)[0];
byte[] woff = Experiment.run(font, WOFF);
byte[] woff2 = Experiment.run(font, getOptions(font));
CompressionStats.Stats stat = CompressionStats.Stats.builder()
.setFilename(file.getName())
.setSize(CompressionStats.Size.ORIGINAL, bytes.length)
.setSize(CompressionStats.Size.WOFF, woff.length)
.setSize(CompressionStats.Size.WOFF2, woff2.length)
.build();
stats.add(stat);
System.out.printf("> %s, %d, %d, %d, %.2f%%\n",
stat.getFilename(),
stat.getSize(CompressionStats.Size.ORIGINAL),
stat.getSize(CompressionStats.Size.WOFF),
stat.getSize(CompressionStats.Size.WOFF2),
stat.getPercent(CompressionStats.Size.WOFF, CompressionStats.Size.WOFF2));
String target = filename.replaceAll("[.](ttf|otf)", ".woff2");
Files.write(woff2, new File(target));
} catch (Throwable t) {
System.err.printf("WARNING: failed to compress: %s\n", filename);
t.printStackTrace();
}
}
}
private static boolean isTrueType(Font font) {
LocaTable loca = font.getTable(Tag.loca);
GlyphTable glyf = font.getTable(Tag.glyf);
return (loca != null && glyf != null);
}
private static String getOptions(Font font) {
return String.format("%s:%s", (isTrueType(font)) ? TRUETYPE : CFF, WOFF2);
}
private static void usage() {
System.err.println("Usage: SimpleRunner font...");
System.exit(-1);
}
}