package com.google.typography.font.sfntly.table.core;
import com.google.typography.font.sfntly.Font.MacintoshEncodingId;
import com.google.typography.font.sfntly.Font.PlatformId;
import com.google.typography.font.sfntly.Font.WindowsEncodingId;
import com.google.typography.font.sfntly.data.ReadableFontData;
import com.google.typography.font.sfntly.data.WritableFontData;
import com.google.typography.font.sfntly.table.Header;
import com.google.typography.font.sfntly.table.SubTableContainerTable;
import com.google.typography.font.sfntly.table.SubTableContainerTable.Builder;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.NoSuchElementException;
public final class CMapTable
extends SubTableContainerTable
implements Iterable<CMap>
{
public static final int NOTDEF = 0;
private CMapTable(Header paramHeader, ReadableFontData paramReadableFontData)
{
super(paramHeader, paramReadableFontData);
}
public int version()
{
return this.data.readUShort(Offset.version.offset);
}
public int numCMaps()
{
return this.data.readUShort(Offset.numTables.offset);
}
public int getCmapIndex(CMapId paramCMapId)
{
for (int i = 0; i < numCMaps(); i++) {
if (paramCMapId.equals(cmapId(i))) {
return i;
}
}
return -1;
}
private static int offsetForEncodingRecord(int paramInt)
{
return Offset.encodingRecordStart.offset + paramInt * Offset.encodingRecordSize.offset;
}
public CMapId cmapId(int paramInt)
{
return CMapId.getInstance(platformId(paramInt), encodingId(paramInt));
}
public int platformId(int paramInt)
{
return this.data.readUShort(Offset.encodingRecordPlatformId.offset + offsetForEncodingRecord(paramInt));
}
public int encodingId(int paramInt)
{
return this.data.readUShort(Offset.encodingRecordEncodingId.offset + offsetForEncodingRecord(paramInt));
}
public int offset(int paramInt)
{
return this.data.readULongAsInt(Offset.encodingRecordOffset.offset + offsetForEncodingRecord(paramInt));
}
public Iterator<CMap> iterator()
{
return new CMapIterator(null);
}
public Iterator<CMap> iterator(CMapFilter paramCMapFilter)
{
return new CMapIterator(paramCMapFilter, null);
}
public String toString()
{
StringBuilder localStringBuilder = new StringBuilder(super.toString());
localStringBuilder.append(" = { ");
for (int i = 0; i < numCMaps(); i++)
{
CMap localCMap;
try
{
localCMap = cmap(i);
}
catch (IOException localIOException)
{
continue;
}
localStringBuilder.append("[0x");
localStringBuilder.append(Integer.toHexString(offset(i)));
localStringBuilder.append(" = ");
localStringBuilder.append(localCMap);
if (i < numCMaps() - 1) {
localStringBuilder.append("], ");
} else {
localStringBuilder.append("]");
}
}
localStringBuilder.append(" }");
return localStringBuilder.toString();
}
public CMap cmap(int paramInt)
throws IOException
{
CMap.Builder localBuilder = Builder.cmapBuilder(readFontData(), paramInt);
return (CMap)localBuilder.build();
}
public CMap cmap(int paramInt1, int paramInt2)
{
return cmap(CMapId.getInstance(paramInt1, paramInt2));
}
public CMap cmap(final CMapId paramCMapId)
{
Iterator localIterator = iterator(new CMapFilter()
{
public boolean accept(CMapTable.CMapId paramAnonymousCMapId)
{
return paramCMapId.equals(paramAnonymousCMapId);
}
});
if (localIterator.hasNext()) {
return (CMap)localIterator.next();
}
return null;
}
public static class Builder
extends SubTableContainerTable.Builder<CMapTable>
{
private int version = 0;
private Map<CMapTable.CMapId, CMap.Builder<? extends CMap>> cmapBuilders;
public static Builder createBuilder(Header paramHeader, WritableFontData paramWritableFontData)
{
return new Builder(paramHeader, paramWritableFontData);
}
protected Builder(Header paramHeader, WritableFontData paramWritableFontData)
{
super(paramWritableFontData);
}
protected Builder(Header paramHeader, ReadableFontData paramReadableFontData)
{
super(paramReadableFontData);
}
protected static CMap.Builder<? extends CMap> cmapBuilder(ReadableFontData paramReadableFontData, int paramInt)
{
if ((paramInt < 0) || (paramInt > numCMaps(paramReadableFontData))) {
throw new IndexOutOfBoundsException("CMap table is outside the bounds of the known tables.");
}
int i = paramReadableFontData.readUShort(CMapTable.Offset.encodingRecordPlatformId.offset + CMapTable.offsetForEncodingRecord(paramInt));
int j = paramReadableFontData.readUShort(CMapTable.Offset.encodingRecordEncodingId.offset + CMapTable.offsetForEncodingRecord(paramInt));
int k = paramReadableFontData.readULongAsInt(CMapTable.Offset.encodingRecordOffset.offset + CMapTable.offsetForEncodingRecord(paramInt));
CMapTable.CMapId localCMapId = CMapTable.CMapId.getInstance(i, j);
CMap.Builder localBuilder = CMap.Builder.getBuilder(paramReadableFontData, k, localCMapId);
return localBuilder;
}
protected void subDataSet()
{
this.cmapBuilders = null;
super.setModelChanged(false);
}
private void initialize(ReadableFontData paramReadableFontData)
{
this.cmapBuilders = new HashMap();
int i = numCMaps(paramReadableFontData);
for (int j = 0; j < i; j++)
{
CMap.Builder localBuilder = cmapBuilder(paramReadableFontData, j);
this.cmapBuilders.put(localBuilder.cmapId(), localBuilder);
}
}
private Map<CMapTable.CMapId, CMap.Builder<? extends CMap>> getCMapBuilders()
{
if (this.cmapBuilders != null) {
return this.cmapBuilders;
}
initialize(internalReadData());
setModelChanged();
return this.cmapBuilders;
}
private static int numCMaps(ReadableFontData paramReadableFontData)
{
if (paramReadableFontData == null) {
return 0;
}
return paramReadableFontData.readUShort(CMapTable.Offset.numTables.offset);
}
public int numCMaps()
{
return getCMapBuilders().size();
}
protected int subDataSizeToSerialize()
{
if ((this.cmapBuilders == null) || (this.cmapBuilders.size() == 0)) {
return 0;
}
int i = 0;
int j = CMapTable.Offset.encodingRecordStart.offset + this.cmapBuilders.size() * CMapTable.Offset.encodingRecordSize.offset;
Iterator localIterator = this.cmapBuilders.values().iterator();
while (localIterator.hasNext())
{
CMap.Builder localBuilder = (CMap.Builder)localIterator.next();
int k = localBuilder.subDataSizeToSerialize();
j += Math.abs(k);
i |= (k <= 0 ? 1 : 0);
}
return i != 0 ? -j : j;
}
protected boolean subReadyToSerialize()
{
if (this.cmapBuilders == null) {
return false;
}
Iterator localIterator = this.cmapBuilders.values().iterator();
while (localIterator.hasNext())
{
CMap.Builder localBuilder = (CMap.Builder)localIterator.next();
if (!localBuilder.subReadyToSerialize()) {
return false;
}
}
return true;
}
protected int subSerialize(WritableFontData paramWritableFontData)
{
int i = paramWritableFontData.writeUShort(CMapTable.Offset.version.offset, version());
i += paramWritableFontData.writeUShort(CMapTable.Offset.numTables.offset, this.cmapBuilders.size());
int j = i;
i += this.cmapBuilders.size() * CMapTable.Offset.encodingRecordSize.offset;
Iterator localIterator = this.cmapBuilders.values().iterator();
while (localIterator.hasNext())
{
CMap.Builder localBuilder = (CMap.Builder)localIterator.next();
j += paramWritableFontData.writeUShort(j, localBuilder.platformId());
j += paramWritableFontData.writeUShort(j, localBuilder.encodingId());
j += paramWritableFontData.writeULong(j, i);
i += localBuilder.subSerialize(paramWritableFontData.slice(i));
}
return i;
}
protected CMapTable subBuildTable(ReadableFontData paramReadableFontData)
{
return new CMapTable(header(), paramReadableFontData, null);
}
public Iterator<? extends CMap.Builder<? extends CMap>> iterator()
{
return getCMapBuilders().values().iterator();
}
public int version()
{
return this.version;
}
public void setVersion(int paramInt)
{
this.version = paramInt;
}
public CMap.Builder<? extends CMap> newCMapBuilder(CMapTable.CMapId paramCMapId, ReadableFontData paramReadableFontData)
throws IOException
{
WritableFontData localWritableFontData = WritableFontData.createWritableFontData(paramReadableFontData.size());
paramReadableFontData.copyTo(localWritableFontData);
CMap.Builder localBuilder = CMap.Builder.getBuilder(localWritableFontData, 0, paramCMapId);
Map localMap = getCMapBuilders();
localMap.put(paramCMapId, localBuilder);
return localBuilder;
}
public CMap.Builder<? extends CMap> newCMapBuilder(CMapTable.CMapId paramCMapId, CMap.CMapFormat paramCMapFormat)
{
CMap.Builder localBuilder = CMap.Builder.getBuilder(paramCMapFormat, paramCMapId);
Map localMap = getCMapBuilders();
localMap.put(paramCMapId, localBuilder);
return localBuilder;
}
public CMap.Builder<? extends CMap> cmapBuilder(CMapTable.CMapId paramCMapId)
{
Map localMap = getCMapBuilders();
return (CMap.Builder)localMap.get(paramCMapId);
}
}
private class CMapIterator
implements Iterator<CMap>
{
private int tableIndex = 0;
private CMapTable.CMapFilter filter;
private CMapIterator() {}
private CMapIterator(CMapTable.CMapFilter paramCMapFilter)
{
this.filter = paramCMapFilter;
}
public boolean hasNext()
{
if (this.filter == null) {
return this.tableIndex < CMapTable.this.numCMaps();
}
while (this.tableIndex < CMapTable.this.numCMaps())
{
if (this.filter.accept(CMapTable.this.cmapId(this.tableIndex))) {
return true;
}
this.tableIndex += 1;
}
return false;
}
public CMap next()
{
if (!hasNext()) {
throw new NoSuchElementException();
}
try
{
return CMapTable.this.cmap(this.tableIndex++);
}
catch (IOException localIOException)
{
NoSuchElementException localNoSuchElementException = new NoSuchElementException("Error during the creation of the CMap.");
localNoSuchElementException.initCause(localIOException);
throw localNoSuchElementException;
}
}
public void remove()
{
throw new UnsupportedOperationException("Cannot remove a CMap table from an existing font.");
}
}
public static abstract interface CMapFilter
{
public abstract boolean accept(CMapTable.CMapId paramCMapId);
}
public static final class CMapId
implements Comparable<CMapId>
{
public static final CMapId WINDOWS_BMP = getInstance(Font.PlatformId.Windows.value(), Font.WindowsEncodingId.UnicodeUCS2.value());
public static final CMapId WINDOWS_UCS4 = getInstance(Font.PlatformId.Windows.value(), Font.WindowsEncodingId.UnicodeUCS4.value());
public static final CMapId MAC_ROMAN = getInstance(Font.PlatformId.Macintosh.value(), Font.MacintoshEncodingId.Roman.value());
private final int platformId;
private final int encodingId;
public static CMapId getInstance(int paramInt1, int paramInt2)
{
return new CMapId(paramInt1, paramInt2);
}
private CMapId(int paramInt1, int paramInt2)
{
this.platformId = paramInt1;
this.encodingId = paramInt2;
}
public int platformId()
{
return this.platformId;
}
public int encodingId()
{
return this.encodingId;
}
public boolean equals(Object paramObject)
{
if (paramObject == this) {
return true;
}
if (!(paramObject instanceof CMapId)) {
return false;
}
CMapId localCMapId = (CMapId)paramObject;
return (localCMapId.platformId == this.platformId) && (localCMapId.encodingId == this.encodingId);
}
public int hashCode()
{
return this.platformId << 8 | this.encodingId;
}
public int compareTo(CMapId paramCMapId)
{
return hashCode() - paramCMapId.hashCode();
}
public String toString()
{
StringBuilder localStringBuilder = new StringBuilder();
localStringBuilder.append("pid = ");
localStringBuilder.append(this.platformId);
localStringBuilder.append(", eid = ");
localStringBuilder.append(this.encodingId);
return localStringBuilder.toString();
}
}
static enum Offset
{
version(0), numTables(2), encodingRecordStart(4), encodingRecordPlatformId(0), encodingRecordEncodingId(2), encodingRecordOffset(4), encodingRecordSize(8), format(0), format0Format(0), format0Length(2), format0Language(4), format0GlyphIdArray(6), format2Format(0), format2Length(2), format2Language(4), format2SubHeaderKeys(6), format2SubHeaders(518), format2SubHeader_firstCode(0), format2SubHeader_entryCount(2), format2SubHeader_idDelta(4), format2SubHeader_idRangeOffset(6), format2SubHeader_structLength(8), format4Format(0), format4Length(2), format4Language(4), format4SegCountX2(6), format4SearchRange(8), format4EntrySelector(10), format4RangeShift(12), format4EndCount(14), format4FixedSize(16), format6Format(0), format6Length(2), format6Language(4), format6FirstCode(6), format6EntryCount(8), format6GlyphIdArray(10), format8Format(0), format8Length(4), format8Language(8), format8Is32(12), format8nGroups(8204), format8Groups(8208), format8Group_startCharCode(0), format8Group_endCharCode(4), format8Group_startGlyphId(8), format8Group_structLength(12), format10Format(0), format10Length(4), format10Language(8), format10StartCharCode(12), format10NumChars(16), format10Glyphs(20), format12Format(0), format12Length(4), format12Language(8), format12nGroups(12), format12Groups(16), format12Groups_structLength(12), format12_startCharCode(0), format12_endCharCode(4), format12_startGlyphId(8), format13Format(0), format13Length(4), format13Language(8), format13nGroups(12), format13Groups(16), format13Groups_structLength(12), format13_startCharCode(0), format13_endCharCode(4), format13_glyphId(8), format14Format(0), format14Length(2);
final int offset;
private Offset(int paramInt)
{
this.offset = paramInt;
}
}
}
/* Location: C:\Users\Ethan\Desktop\FontZip\FontTool\sfnttool.jar!\com\google\typography\font\sfntly\table\core\CMapTable.class
* Java compiler version: 6 (50.0)
* JD-Core Version: 0.7.1
*/