Skip to content

Commit f26e7d9

Browse files
committed
Pass IFilterProvider to IFilter.Decode() and handle null in PdfExtensions.Resolve()
1 parent d973e03 commit f26e7d9

23 files changed

+56
-60
lines changed

src/UglyToad.PdfPig.Tests/Filters/Ascii85FilterTests.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public void DecodesWikipediaExample()
2020
l(DId<j@<? 3r@:F % a + D58'ATD4$Bl@l3De:,-DJs`8ARoFb/0JMK@qB4^F!,R<AKZ&-DfTqBG%G
2121
> uD.RTpAKYo'+CT/5+Cei#DII?(E,9)oF*2M7/c~>");
2222

23-
var result = filter.Decode(bytes, dictionary, 0);
23+
var result = filter.Decode(bytes, dictionary, TestFilterProvider.Instance, 0);
2424

2525
#if !NET
2626
string text = Encoding.ASCII.GetString(result.ToArray());
@@ -39,7 +39,7 @@ public void ReplacesZWithEmptyBytes()
3939
{
4040
var bytes = Encoding.ASCII.GetBytes("9jqo^zBlbD-");
4141

42-
var result = filter.Decode(bytes, dictionary, 1);
42+
var result = filter.Decode(bytes, dictionary, TestFilterProvider.Instance, 1);
4343

4444
#if !NET
4545
string text = Encoding.ASCII.GetString(result.ToArray());
@@ -55,7 +55,7 @@ public void ZInMiddleOf5CharacterSequenceThrows()
5555
{
5656
var bytes = Encoding.ASCII.GetBytes("qjzqo^");
5757

58-
Action action = () => filter.Decode(bytes, dictionary, 0);
58+
Action action = () => filter.Decode(bytes, dictionary, TestFilterProvider.Instance, 0);
5959

6060
Assert.Throws<InvalidOperationException>(action);
6161
}
@@ -65,7 +65,7 @@ public void SingleCharacterLastThrows()
6565
{
6666
var bytes = Encoding.ASCII.GetBytes("9jqo^B");
6767

68-
Action action = () => filter.Decode(bytes, dictionary, 1);
68+
Action action = () => filter.Decode(bytes, dictionary, TestFilterProvider.Instance, 1);
6969

7070
Assert.Throws<ArgumentOutOfRangeException>(action);
7171
}
@@ -110,7 +110,7 @@ public void DecodesEncodedPdfContent()
110110
F*22=@:F%a+=SF4C'moi+=Li?EZeh0FD)e-@<>p#@;]TuBl.9kATKCFGA(],AKYo5BOu4*+CT;%+C#7pF_Pr+@VfTuDf0B:+=SF4C'moi+=
111111
Li?EZek1DKKT1F`2DD/TboKAKY](@:s.m/h%oBC'mC/$>""*cF*)G6@;Q?_DIdZpC&~>";
112112

113-
var result = filter.Decode(Encoding.ASCII.GetBytes(input), dictionary, 0);
113+
var result = filter.Decode(Encoding.ASCII.GetBytes(input), dictionary, TestFilterProvider.Instance, 0);
114114

115115
#if !NET
116116
string text = Encoding.ASCII.GetString(result.ToArray());
@@ -134,7 +134,7 @@ public void DecodesEncodedPdfContentMissingEndOfDataSymbol()
134134
F*22=@:F%a+=SF4C'moi+=Li?EZeh0FD)e-@<>p#@;]TuBl.9kATKCFGA(],AKYo5BOu4*+CT;%+C#7pF_Pr+@VfTuDf0B:+=SF4C'moi+=
135135
Li?EZek1DKKT1F`2DD/TboKAKY](@:s.m/h%oBC'mC/$>""*cF*)G6@;Q?_DIdZpC&";
136136

137-
var result = filter.Decode(Encoding.ASCII.GetBytes(input), dictionary, 0);
137+
var result = filter.Decode(Encoding.ASCII.GetBytes(input), dictionary, TestFilterProvider.Instance, 0);
138138

139139
#if !NET
140140
string text = Encoding.ASCII.GetString(result.ToArray());
@@ -154,7 +154,7 @@ public void DecodeParallel()
154154
{
155155
var bytes = Encoding.ASCII.GetBytes("9jqo^zBlbD-");
156156

157-
var result = filter.Decode(bytes, dictionary, 1);
157+
var result = filter.Decode(bytes, dictionary, TestFilterProvider.Instance, 1);
158158

159159
#if !NET
160160
string text = Encoding.ASCII.GetString(result.ToArray());
@@ -176,7 +176,7 @@ public void DecodeParallel()
176176
F*22=@:F%a+=SF4C'moi+=Li?EZeh0FD)e-@<>p#@;]TuBl.9kATKCFGA(],AKYo5BOu4*+CT;%+C#7pF_Pr+@VfTuDf0B:+=SF4C'moi+=
177177
Li?EZek1DKKT1F`2DD/TboKAKY](@:s.m/h%oBC'mC/$>""*cF*)G6@;Q?_DIdZpC&~>";
178178

179-
var result = filter.Decode(Encoding.ASCII.GetBytes(input), dictionary, 0);
179+
var result = filter.Decode(Encoding.ASCII.GetBytes(input), dictionary, TestFilterProvider.Instance, 0);
180180

181181
#if !NET
182182
string text = Encoding.ASCII.GetString(result.ToArray());

src/UglyToad.PdfPig.Tests/Filters/AsciiHexDecodeFilterTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public void DecodesEncodedTextProperly()
1616
var input = Encoding.ASCII.GetBytes(
1717
"7368652073656C6C73207365617368656C6C73206F6E20746865207365612073686F7265");
1818

19-
var decoded = new AsciiHexDecodeFilter().Decode(input, dictionary, 1);
19+
var decoded = new AsciiHexDecodeFilter().Decode(input, dictionary, TestFilterProvider.Instance, 1);
2020

2121
var decodedText = Encoding.ASCII.GetString(decoded.ToArray());
2222

@@ -31,7 +31,7 @@ public void DecodesEncodedTextWithBracesProperly()
3131
var input = Encoding.ASCII.GetBytes(
3232
"<7368652073656C6C73207365617368656C6C73206F6E20746865207365612073686F7265>");
3333

34-
var decoded = new AsciiHexDecodeFilter().Decode(input, dictionary, 1);
34+
var decoded = new AsciiHexDecodeFilter().Decode(input, dictionary, TestFilterProvider.Instance, 1);
3535

3636
var decodedText = Encoding.ASCII.GetString(decoded.ToArray());
3737

@@ -47,7 +47,7 @@ public void DecodesEncodedTextWithWhitespaceProperly()
4747
@"6F6E6365207 5706F6E206120 74696D6520696E
4848
20612067616C6178792046617220466172204177 6179");
4949

50-
var decoded = new AsciiHexDecodeFilter().Decode(input, dictionary, 1);
50+
var decoded = new AsciiHexDecodeFilter().Decode(input, dictionary, TestFilterProvider.Instance, 1);
5151

5252
var decodedText = Encoding.ASCII.GetString(decoded.ToArray());
5353

@@ -61,7 +61,7 @@ public void DecodesEncodedTextLowercaseProperly()
6161

6262
var input = Encoding.ASCII.GetBytes("6f6e63652075706f6e20612074696d6520696e20612067616c61787920466172204661722041776179");
6363

64-
var decoded = new AsciiHexDecodeFilter().Decode(input, dictionary, 1);
64+
var decoded = new AsciiHexDecodeFilter().Decode(input, dictionary, TestFilterProvider.Instance, 1);
6565

6666
var decodedText = Encoding.ASCII.GetString(decoded.ToArray());
6767

@@ -75,7 +75,7 @@ public void DecodeWithInvalidCharactersThrows(string inputString)
7575
{
7676
var input = Encoding.ASCII.GetBytes(inputString);
7777

78-
Action action = () => new AsciiHexDecodeFilter().Decode(input, dictionary, 1);
78+
Action action = () => new AsciiHexDecodeFilter().Decode(input, dictionary, TestFilterProvider.Instance, 1);
7979

8080
Assert.Throws<InvalidOperationException>(action);
8181
}
@@ -85,7 +85,7 @@ public void SubstitutesZeroForLastByte()
8585
{
8686
var input = Encoding.ASCII.GetBytes("AE5>");
8787

88-
var decoded = new AsciiHexDecodeFilter().Decode(input, dictionary, 1);
88+
var decoded = new AsciiHexDecodeFilter().Decode(input, dictionary, TestFilterProvider.Instance, 1);
8989

9090
#pragma warning disable SYSLIB0001
9191
var decodedText = Encoding.UTF7.GetString(decoded.ToArray());
@@ -101,7 +101,7 @@ public void DecodesEncodedTextStoppingAtLastBrace()
101101

102102
var input = Encoding.ASCII.GetBytes("6f6e63652075706f6e20612074696d6520696e20612067616c61787920466172204661722041776179> There is stuff following the EOD.");
103103

104-
var decoded = new AsciiHexDecodeFilter().Decode(input, dictionary, 1);
104+
var decoded = new AsciiHexDecodeFilter().Decode(input, dictionary, TestFilterProvider.Instance, 1);
105105

106106
var decodedText = Encoding.ASCII.GetString(decoded.ToArray());
107107

src/UglyToad.PdfPig.Tests/Filters/CcittFaxDecodeFilterTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public void CanDecodeCCittFaxCompressedImageData()
3131
};
3232

3333
var expectedBytes = ImageHelpers.LoadFileBytes("ccittfax-decoded.bin");
34-
var decodedBytes = filter.Decode(encodedBytes, new DictionaryToken(dictionary), 0);
34+
var decodedBytes = filter.Decode(encodedBytes, new DictionaryToken(dictionary), TestFilterProvider.Instance, 0);
3535
Assert.Equal(expectedBytes, decodedBytes.ToArray());
3636
}
3737
}

src/UglyToad.PdfPig.Tests/Filters/FlateFilterTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public void EncodeAndDecodePreservesInput()
1717
{
1818
inputStream.Seek(0, SeekOrigin.Begin);
1919
var result = filter.Encode(inputStream, parameters, 0);
20-
var decoded = filter.Decode(result, parameters, 0);
20+
var decoded = filter.Decode(result, parameters, TestFilterProvider.Instance, 0);
2121
Assert.Equal(input, decoded.ToArray());
2222
}
2323
}

src/UglyToad.PdfPig.Tests/Filters/RunLengthFilterTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public void CanDecodeRunLengthEncodedData()
2424
1, 10, 19
2525
};
2626

27-
var decoded = filter.Decode(data, new DictionaryToken(new Dictionary<NameToken, IToken>()), 1);
27+
var decoded = filter.Decode(data, new DictionaryToken(new Dictionary<NameToken, IToken>()), TestFilterProvider.Instance, 1);
2828

2929
var expectedResult = new byte[]
3030
{
@@ -53,7 +53,7 @@ public void StopsAtEndOfDataByte()
5353
90, 6, 7
5454
};
5555

56-
var decoded = filter.Decode(data, new DictionaryToken(new Dictionary<NameToken, IToken>()), 0);
56+
var decoded = filter.Decode(data, new DictionaryToken(new Dictionary<NameToken, IToken>()), TestFilterProvider.Instance, 0);
5757

5858
var expectedResult = new byte[]
5959
{

src/UglyToad.PdfPig.Tests/Integration/FilterTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public sealed class NoFilter : IFilter
6262
{
6363
public bool IsSupported => false;
6464

65-
public ReadOnlyMemory<byte> Decode(ReadOnlySpan<byte> input, DictionaryToken streamDictionary, int filterIndex)
65+
public ReadOnlyMemory<byte> Decode(ReadOnlySpan<byte> input, DictionaryToken streamDictionary, IFilterProvider filterProvider, int filterIndex)
6666
{
6767
throw new NotImplementedException();
6868
}

src/UglyToad.PdfPig.Tests/Integration/PdfParserTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public void CanDecompressPngEncodedFlateStream()
9696
});
9797

9898
var filter = new FlateFilter();
99-
var filtered = filter.Decode(streamBytes, dictionary, 0).ToArray();
99+
var filtered = filter.Decode(streamBytes, dictionary, TestFilterProvider.Instance, 0).ToArray();
100100

101101
var expected =
102102
"1 0 15 0 1 0 216 0 1 2 160 0 1 2 210 0 1 3 84 0 1 4 46 0 1 7 165 0 1 70 229 0 1 72 84 0 1 96 235 0 1 98 18 0 2 0 12 0 2 0 12 1 2 0 12 2 2 0 12 3 2 0 12 4 2 0 12 5 2 0 12 6 2 0 12 7 2 0 12 8"

src/UglyToad.PdfPig.Tests/TestFilterProvider.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
internal class TestFilterProvider : ILookupFilterProvider
88
{
9+
public static readonly TestFilterProvider Instance = new TestFilterProvider();
10+
911
public IReadOnlyList<IFilter> GetFilters(DictionaryToken dictionary)
1012
{
1113
return new List<IFilter>();

src/UglyToad.PdfPig/Content/InlineImage.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,9 @@ internal InlineImage(PdfRectangle bounds, int widthInSamples, int heightInSample
6464
RenderingIntent renderingIntent,
6565
bool interpolate,
6666
IReadOnlyList<double> decode,
67-
ReadOnlyMemory<byte> rawMemory,
68-
IReadOnlyList<IFilter> filters,
67+
ReadOnlyMemory<byte> rawMemory,
68+
ILookupFilterProvider filterProvider,
69+
IReadOnlyList<NameToken> filterNames,
6970
DictionaryToken streamDictionary,
7071
ColorSpaceDetails colorSpaceDetails)
7172
{
@@ -79,8 +80,10 @@ internal InlineImage(PdfRectangle bounds, int widthInSamples, int heightInSample
7980
Interpolate = interpolate;
8081
ImageDictionary = streamDictionary;
8182
RawMemory = rawMemory;
82-
ColorSpaceDetails = colorSpaceDetails;
83-
83+
ColorSpaceDetails = colorSpaceDetails;
84+
85+
var filters = filterProvider.GetNamedFilters(filterNames);
86+
8487
var supportsFilters = true;
8588
foreach (var filter in filters)
8689
{
@@ -97,7 +100,7 @@ internal InlineImage(PdfRectangle bounds, int widthInSamples, int heightInSample
97100
for (var i = 0; i < filters.Count; i++)
98101
{
99102
var filter = filters[i];
100-
b = filter.Decode(b.Span, streamDictionary, i);
103+
b = filter.Decode(b.Span, streamDictionary, filterProvider, i);
101104
}
102105

103106
return b;

src/UglyToad.PdfPig/Filters/Ascii85Filter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public sealed class Ascii85Filter : IFilter
2727
public bool IsSupported { get; } = true;
2828

2929
/// <inheritdoc />
30-
public ReadOnlyMemory<byte> Decode(ReadOnlySpan<byte> input, DictionaryToken streamDictionary, int filterIndex)
30+
public ReadOnlyMemory<byte> Decode(ReadOnlySpan<byte> input, DictionaryToken streamDictionary, IFilterProvider filterProvider, int filterIndex)
3131
{
3232
Span<byte> asciiBuffer = stackalloc byte[5];
3333

0 commit comments

Comments
 (0)