| 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); |
| } |
| } |
| } |