mirror of
https://github.com/UglyToad/PdfPig.git
synced 2025-09-23 04:36:44 +08:00
64 lines
1.6 KiB
C#
64 lines
1.6 KiB
C#
using System;
|
|
|
|
namespace UglyToad.PdfPig.Fonts.CompactFontFormat
|
|
{
|
|
using Util;
|
|
|
|
internal class CompactFontFormatIndexReader
|
|
{
|
|
public CompactFontFormatIndex ReadDictionaryData(CompactFontFormatData data)
|
|
{
|
|
var index = ReadIndex(data);
|
|
|
|
if (index.Length == 0)
|
|
{
|
|
return new CompactFontFormatIndex(null);
|
|
}
|
|
|
|
var count = index.Length - 1;
|
|
|
|
var results = new byte[count][];
|
|
|
|
for (var i = 0; i < count; i++)
|
|
{
|
|
var length = index[i + 1] - index[i];
|
|
|
|
if (length < 0)
|
|
{
|
|
throw new InvalidOperationException($"Negative object length {length} at {i}. Current position: {data.Position}.");
|
|
}
|
|
|
|
if (length > data.Length)
|
|
{
|
|
throw new InvalidOperationException($"Attempted to read data of length {length} in data array of length {data.Length}.");
|
|
}
|
|
|
|
results[i] = data.ReadBytes(length);
|
|
}
|
|
|
|
return new CompactFontFormatIndex(results);
|
|
}
|
|
|
|
public int[] ReadIndex(CompactFontFormatData data)
|
|
{
|
|
var count = data.ReadCard16();
|
|
|
|
if (count == 0)
|
|
{
|
|
return EmptyArray<int>.Instance;
|
|
}
|
|
|
|
var offsetSize = data.ReadOffsize();
|
|
|
|
var offsets = new int[count + 1];
|
|
|
|
for (var i = 0; i < offsets.Length; i++)
|
|
{
|
|
offsets[i] = data.ReadOffset(offsetSize);
|
|
}
|
|
|
|
return offsets;
|
|
}
|
|
}
|
|
}
|