blob: 7dc88608e2b52f7aeb84e3a41db03dee2691df82 [file] [log] [blame]
package com.google.typography.font.sfntly.table.opentype;
import com.google.typography.font.sfntly.data.ReadableFontData;
import com.google.typography.font.sfntly.data.WritableFontData;
import com.google.typography.font.sfntly.table.opentype.component.NumRecordList;
import com.google.typography.font.sfntly.table.opentype.contextsubst.DoubleRecordTable;
import com.google.typography.font.sfntly.table.opentype.contextsubst.SubClassSetArray;
import com.google.typography.font.sfntly.table.opentype.contextsubst.SubGenericRuleSet;
import com.google.typography.font.sfntly.table.opentype.contextsubst.SubRuleSetArray;
public class ContextSubst extends SubstSubtable {
private final SubRuleSetArray ruleSets;
private SubClassSetArray classSets;
// //////////////
// Constructors
ContextSubst(ReadableFontData data, int base, boolean dataIsCanonical) {
super(data, base, dataIsCanonical);
switch (format) {
case 1:
ruleSets = new SubRuleSetArray(data, headerSize(), dataIsCanonical);
classSets = null;
break;
case 2:
ruleSets = null;
classSets = new SubClassSetArray(data, headerSize(), dataIsCanonical);
break;
default:
throw new IllegalStateException("Subt format value is " + format + " (should be 1 or 2).");
}
}
// //////////////////////////////////
// Methods redirected to the array
public SubRuleSetArray fmt1Table() {
switch (format) {
case 1:
return ruleSets;
default:
throw new IllegalArgumentException("unexpected format table requested: " + format);
}
}
public SubClassSetArray fmt2Table() {
switch (format) {
case 2:
return classSets;
default:
throw new IllegalArgumentException("unexpected format table requested: " + format);
}
}
public NumRecordList recordList() {
return (format == 1) ? ruleSets.recordList : classSets.recordList;
}
public SubGenericRuleSet<? extends DoubleRecordTable> subTableAt(int index) {
return (format == 1) ? ruleSets.subTableAt(index) : classSets.subTableAt(index);
}
// //////////////////////////////////
// Methods specific to this class
public CoverageTable coverage() {
return (format == 1) ? ruleSets.coverage : classSets.coverage;
}
public ClassDefTable classDef() {
return (format == 2) ? classSets.classDef : null;
}
public static class Builder extends SubstSubtable.Builder<SubstSubtable> {
private final SubRuleSetArray.Builder arrayBuilder;
protected Builder() {
super();
arrayBuilder = new SubRuleSetArray.Builder();
}
protected Builder(ReadableFontData data, boolean dataIsCanonical) {
super(data, dataIsCanonical);
arrayBuilder = new SubRuleSetArray.Builder(data, dataIsCanonical);
}
protected Builder(SubstSubtable subTable) {
ContextSubst ligSubst = (ContextSubst) subTable;
arrayBuilder = new SubRuleSetArray.Builder(ligSubst.ruleSets);
}
@Override
public int subDataSizeToSerialize() {
return arrayBuilder.subDataSizeToSerialize();
}
@Override
public int subSerialize(WritableFontData newData) {
return arrayBuilder.subSerialize(newData);
}
// /////////////////////////////////
// must implement abstract methods
@Override
protected boolean subReadyToSerialize() {
return true;
}
@Override
public void subDataSet() {
arrayBuilder.subDataSet();
}
@Override
public ContextSubst subBuildTable(ReadableFontData data) {
return new ContextSubst(data, 0, true);
}
}
}