public static void ReadMaxp(DataReader reader, TableRecord[] tables, ref FaceHeader header) { SeekToTable(reader, tables, FourCC.Maxp, required: true); if (reader.ReadInt32BE() != 0x00010000) { throw new InvalidFontException("Font contains an old style maxp table."); } header.GlyphCount = reader.ReadUInt16BE(); if (header.GlyphCount > MaxGlyphs) { throw new InvalidFontException("Font contains too many glyphs."); } // skip maxPoints, maxContours, maxCompositePoints, maxCompositeContours, maxZones reader.Skip(sizeof(short) * 5); header.MaxTwilightPoints = reader.ReadUInt16BE(); header.MaxStorageLocations = reader.ReadUInt16BE(); header.MaxFunctionDefs = reader.ReadUInt16BE(); header.MaxInstructionDefs = reader.ReadUInt16BE(); header.MaxStackSize = reader.ReadUInt16BE(); // sanity checking if (header.MaxTwilightPoints > MaxTwilightPoints || header.MaxStorageLocations > MaxStorageLocations || header.MaxFunctionDefs > MaxFunctionDefs || header.MaxInstructionDefs > MaxFunctionDefs || header.MaxStackSize > MaxStackSize) { throw new InvalidFontException("Font programs have limits that are larger than built-in sanity checks."); } }
public unsafe static SbitTable Read(DataReader reader, TableRecord[] tables) { if (!SfntTables.SeekToTable(reader, tables, FourCC.Eblc)) return null; // skip version var baseOffset = reader.Position; reader.Skip(sizeof(int)); // load each strike table var count = reader.ReadInt32BE(); if (count > MaxBitmapStrikes) throw new InvalidFontException("Too many bitmap strikes in font."); var sizeTableHeaders = stackalloc BitmapSizeTable[count]; for (int i = 0; i < count; i++) { sizeTableHeaders[i].SubTableOffset = reader.ReadUInt32BE(); sizeTableHeaders[i].SubTableSize = reader.ReadUInt32BE(); sizeTableHeaders[i].SubTableCount = reader.ReadUInt32BE(); // skip colorRef, metrics entries, start and end glyph indices reader.Skip(sizeof(uint) + sizeof(ushort) * 2 + 12 * 2); sizeTableHeaders[i].PpemX = reader.ReadByte(); sizeTableHeaders[i].PpemY = reader.ReadByte(); sizeTableHeaders[i].BitDepth = reader.ReadByte(); sizeTableHeaders[i].Flags = (BitmapSizeFlags)reader.ReadByte(); } // read index subtables var indexSubTables = stackalloc IndexSubTable[count]; for (int i = 0; i < count; i++) { reader.Seek(baseOffset + sizeTableHeaders[i].SubTableOffset); indexSubTables[i] = new IndexSubTable { FirstGlyph = reader.ReadUInt16BE(), LastGlyph = reader.ReadUInt16BE(), Offset = reader.ReadUInt32BE() }; } // read the actual data for each strike table for (int i = 0; i < count; i++) { // read the subtable header reader.Seek(baseOffset + sizeTableHeaders[i].SubTableOffset + indexSubTables[i].Offset); var indexFormat = reader.ReadUInt16BE(); var imageFormat = reader.ReadUInt16BE(); var imageDataOffset = reader.ReadUInt32BE(); } return null; }
public unsafe static SbitTable Read(DataReader reader, TableRecord[] tables) { if (!SfntTables.SeekToTable(reader, tables, FourCC.Eblc)) { return(null); } // skip version var baseOffset = reader.Position; reader.Skip(sizeof(int)); // load each strike table var count = reader.ReadInt32BE(); if (count > MaxBitmapStrikes) { throw new Exception("Too many bitmap strikes in font."); } var sizeTableHeaders = stackalloc BitmapSizeTable[count]; for (int i = 0; i < count; i++) { sizeTableHeaders[i].SubTableOffset = reader.ReadUInt32BE(); sizeTableHeaders[i].SubTableSize = reader.ReadUInt32BE(); sizeTableHeaders[i].SubTableCount = reader.ReadUInt32BE(); // skip colorRef, metrics entries, start and end glyph indices reader.Skip(sizeof(uint) + sizeof(ushort) * 2 + 12 * 2); sizeTableHeaders[i].PpemX = reader.ReadByte(); sizeTableHeaders[i].PpemY = reader.ReadByte(); sizeTableHeaders[i].BitDepth = reader.ReadByte(); sizeTableHeaders[i].Flags = (BitmapSizeFlags)reader.ReadByte(); } // read index subtables var indexSubTables = stackalloc IndexSubTable[count]; for (int i = 0; i < count; i++) { reader.Seek(baseOffset + sizeTableHeaders[i].SubTableOffset); indexSubTables[i] = new IndexSubTable { FirstGlyph = reader.ReadUInt16BE(), LastGlyph = reader.ReadUInt16BE(), Offset = reader.ReadUInt32BE() }; } // read the actual data for each strike table for (int i = 0; i < count; i++) { // read the subtable header reader.Seek(baseOffset + sizeTableHeaders[i].SubTableOffset + indexSubTables[i].Offset); var indexFormat = reader.ReadUInt16BE(); var imageFormat = reader.ReadUInt16BE(); var imageDataOffset = reader.ReadUInt32BE(); } return(null); }
public static void ReadMaxp(DataReader reader, TableRecord[] tables, ref FaceHeader header) { SeekToTable(reader, tables, FourCC.Maxp, required: true); if (reader.ReadInt32BE() != 0x00010000) throw new InvalidFontException("Font contains an old style maxp table."); header.GlyphCount = reader.ReadUInt16BE(); if (header.GlyphCount > MaxGlyphs) throw new InvalidFontException("Font contains too many glyphs."); // skip maxPoints, maxContours, maxCompositePoints, maxCompositeContours, maxZones reader.Skip(sizeof(short) * 5); header.MaxTwilightPoints = reader.ReadUInt16BE(); header.MaxStorageLocations = reader.ReadUInt16BE(); header.MaxFunctionDefs = reader.ReadUInt16BE(); header.MaxInstructionDefs = reader.ReadUInt16BE(); header.MaxStackSize = reader.ReadUInt16BE(); // sanity checking if (header.MaxTwilightPoints > MaxTwilightPoints || header.MaxStorageLocations > MaxStorageLocations || header.MaxFunctionDefs > MaxFunctionDefs || header.MaxInstructionDefs > MaxFunctionDefs || header.MaxStackSize > MaxStackSize) throw new InvalidFontException("Font programs have limits that are larger than built-in sanity checks."); }