22{
33 using System ;
44 using System . Collections . Generic ;
5- using System . Diagnostics . CodeAnalysis ;
5+ using System . Diagnostics . CodeAnalysis ;
66 using Core ;
77 using Filters ;
88 using Graphics . Colors ;
99 using Graphics . Core ;
1010 using Tokens ;
11- using Images . Png ;
12-
11+ using Images . Png ;
12+
1313 /// <inheritdoc />
1414 /// <summary>
1515 /// A small image that is completely defined directly inline within a <see cref="T:UglyToad.PdfPig.Content.Page" />'s content stream.
1616 /// </summary>
1717 public class InlineImage : IPdfImage
1818 {
1919 private readonly Lazy < Memory < byte > > ? memoryFactory ;
20+ private readonly Memory < byte > rawMemory ;
2021
2122 /// <inheritdoc />
22- public PdfRectangle BoundingBox { get ; }
23+ public PdfRectangle BoundingBox { get ; }
2324
24- /// <inheritdoc />
25- [ Obsolete ( "Use BoundingBox instead." ) ]
25+ /// <inheritdoc />
26+ [ Obsolete ( "Use BoundingBox instead." ) ]
2627 public PdfRectangle Bounds => BoundingBox ;
2728
2829 /// <inheritdoc />
@@ -53,33 +54,36 @@ public class InlineImage : IPdfImage
5354 public bool Interpolate { get ; }
5455
5556 /// <inheritdoc />
56- public Memory < byte > RawMemory { get ; }
57-
57+ public Memory < byte > RawMemory => rawMemory ;
58+
5859 /// <inheritdoc />
5960 public Span < byte > RawBytes => RawMemory . Span ;
6061
6162 /// <inheritdoc />
62- public ColorSpaceDetails ColorSpaceDetails { get ; }
63-
64- /// <inheritdoc />
63+ public bool HasLoadedBytes => ! rawMemory . IsEmpty ;
64+
65+ /// <inheritdoc />
66+ public ColorSpaceDetails ColorSpaceDetails { get ; }
67+
68+ /// <inheritdoc />
6569 public IPdfImage ? MaskImage { get ; }
6670
6771 /// <summary>
6872 /// Create a new <see cref="InlineImage"/>.
6973 /// </summary>
70- internal InlineImage ( PdfRectangle bounds ,
71- int widthInSamples ,
72- int heightInSamples ,
73- int bitsPerComponent ,
74+ internal InlineImage ( PdfRectangle bounds ,
75+ int widthInSamples ,
76+ int heightInSamples ,
77+ int bitsPerComponent ,
7478 bool isImageMask ,
7579 RenderingIntent renderingIntent ,
7680 bool interpolate ,
7781 IReadOnlyList < double > decode ,
78- Memory < byte > rawMemory ,
82+ Memory < byte > rawMemory ,
7983 ILookupFilterProvider filterProvider ,
80- IReadOnlyList < NameToken > filterNames ,
84+ IReadOnlyList < NameToken > filterNames ,
8185 DictionaryToken streamDictionary ,
82- ColorSpaceDetails colorSpaceDetails ,
86+ ColorSpaceDetails colorSpaceDetails ,
8387 IPdfImage ? softMaskImage )
8488 {
8589 IsInlineImage = true ;
@@ -92,33 +96,36 @@ internal InlineImage(PdfRectangle bounds,
9296 RenderingIntent = renderingIntent ;
9397 Interpolate = interpolate ;
9498 ImageDictionary = streamDictionary ;
95- RawMemory = rawMemory ;
96- ColorSpaceDetails = colorSpaceDetails ;
97-
98- var filters = filterProvider . GetNamedFilters ( filterNames ) ;
99-
100- var supportsFilters = true ;
101- foreach ( var filter in filters )
99+ this . rawMemory = rawMemory ;
100+ ColorSpaceDetails = colorSpaceDetails ;
101+
102+ if ( ! rawMemory . IsEmpty )
102103 {
103- if ( ! filter . IsSupported )
104+ var filters = filterProvider . GetNamedFilters ( filterNames ) ;
105+
106+ var supportsFilters = true ;
107+ foreach ( var filter in filters )
104108 {
105- supportsFilters = false ;
106- break ;
109+ if ( ! filter . IsSupported )
110+ {
111+ supportsFilters = false ;
112+ break ;
113+ }
107114 }
108- }
109115
110- memoryFactory = supportsFilters ? new Lazy < Memory < byte > > ( ( ) =>
111- {
112- var b = RawMemory ;
113- for ( var i = 0 ; i < filters . Count ; i ++ )
116+ memoryFactory = supportsFilters ? new Lazy < Memory < byte > > ( ( ) =>
114117 {
115- var filter = filters [ i ] ;
116- b = filter . Decode ( b , streamDictionary , filterProvider , i ) ;
117- }
118+ var b = RawMemory ;
119+ for ( var i = 0 ; i < filters . Count ; i ++ )
120+ {
121+ var filter = filters [ i ] ;
122+ b = filter . Decode ( b , streamDictionary , filterProvider , i ) ;
123+ }
124+
125+ return b ;
126+ } ) : null ;
127+ }
118128
119- return b ;
120- } ) : null ;
121-
122129 MaskImage = softMaskImage ;
123130 }
124131
@@ -143,6 +150,6 @@ public bool TryGetBytesAsMemory(out Memory<byte> bytes)
143150 public override string ToString ( )
144151 {
145152 return $ "Inline Image (w { BoundingBox . Width } , h { BoundingBox . Height } )";
146- }
153+ }
147154 }
148155}
0 commit comments