namespace UglyToad.PdfPig
{
using System.Collections.Generic;
using Core;
using Filters;
using Parser.Parts;
using Tokenization.Scanner;
using Tokens;
///
/// Extensions for PDF types.
///
public static class PdfExtensions
{
///
/// Try and get the entry with a given name and type or look-up the object if it's an indirect reference.
///
internal static bool TryGet(this DictionaryToken dictionary, NameToken name, IPdfTokenScanner tokenScanner, out T token) where T : IToken
{
token = default(T);
if (!dictionary.TryGet(name, out var t) || !(t is T typedToken))
{
if (t is IndirectReferenceToken reference)
{
return DirectObjectFinder.TryGet(reference, tokenScanner, out token);
}
return false;
}
token = typedToken;
return true;
}
internal static T Get(this DictionaryToken dictionary, NameToken name, IPdfTokenScanner scanner) where T : class, IToken
{
if (!dictionary.TryGet(name, out var token) || !(token is T typedToken))
{
if (!(token is IndirectReferenceToken indirectReference))
{
throw new PdfDocumentFormatException($"Dictionary does not contain token with name {name} of type {typeof(T).Name}.");
}
typedToken = DirectObjectFinder.Get(indirectReference, scanner);
}
return typedToken;
}
///
/// Get the decoded data from this stream.
///
public static IReadOnlyList Decode(this StreamToken stream, IFilterProvider filterProvider)
{
var filters = filterProvider.GetFilters(stream.StreamDictionary);
var transform = stream.Data;
for (var i = 0; i < filters.Count; i++)
{
transform = filters[i].Decode(transform, stream.StreamDictionary, i);
}
return transform;
}
}
}