@@ -142,10 +142,11 @@ module PixLoaderTests =
142
142
let loaders = PixImage.GetLoaders() |> Seq.filter ( fun l -> l.Name <> " Aardvark PGM" )
143
143
Gen.elements loaders
144
144
145
- let pixEncoder ( format : PixFileFormat ) =
145
+ let pixEncoder ( useStream : bool ) ( format : PixFileFormat ) =
146
146
pixLoader
147
147
|> Gen.filter ( fun loader ->
148
- loader.Name <> " DevIL" || format <> PixFileFormat.Gif // DevIL does not support saving GIFs
148
+ not ( loader.Name = " DevIL" && format = PixFileFormat.Gif) && // DevIL does not support saving GIFs
149
+ not ( loader.Name = " DevIL" && format = PixFileFormat.Tiff && useStream) // DevIL does not support saving TIFFs to streams
149
150
)
150
151
151
152
let colorAndImageFileFormat =
@@ -165,9 +166,10 @@ module PixLoaderTests =
165
166
type SaveLoadInput =
166
167
{
167
168
Image : PixImage < byte >
168
- FileFormat : PixFileFormat
169
+ SaveParams : PixSaveParams
169
170
Encoder : IPixLoader
170
171
Decoder : IPixLoader
172
+ UseStream : bool
171
173
}
172
174
173
175
type Generator private () =
@@ -186,9 +188,22 @@ module PixLoaderTests =
186
188
gen {
187
189
let! cf , iff = Gen.colorAndImageFileFormat
188
190
let! pix = Gen.checkerboardPix cf
189
- let! encoder = Gen.pixEncoder iff
191
+ let! useStream = Gen.elements [ false ; true ]
192
+ let! encoder = Gen.pixEncoder useStream iff
190
193
let! decoder = Gen.pixLoader
191
- return { Image = pix; FileFormat = iff; Encoder = encoder; Decoder = decoder }
194
+
195
+ let saveParams =
196
+ match iff with
197
+ | PixFileFormat.Jpeg -> PixJpegSaveParams( quality = 100 ) :> PixSaveParams
198
+ | fmt -> PixSaveParams fmt
199
+
200
+ return {
201
+ Image = pix
202
+ SaveParams = saveParams
203
+ Encoder = encoder
204
+ Decoder = decoder
205
+ UseStream = useStream
206
+ }
192
207
}
193
208
|> Arb.fromGen
194
209
@@ -197,30 +212,34 @@ module PixLoaderTests =
197
212
Aardvark.Init()
198
213
Report.Verbosity <- 3
199
214
215
+
200
216
[<Property( Arbitrary = [| typeof< Generator> |]) >]
201
217
let ``[ PixLoader ] Save and load`` ( input : SaveLoadInput ) =
202
- printfn " encoder = %s , decoder = %s , size = %A , format = %A , file = %A " input.Encoder.Name input.Decoder.Name input.Image.Size input.Image.Format input.FileFormat
218
+ printfn " encoder = %s , decoder = %s , size = %A , color format = %A , file format = %A , use stream = %b "
219
+ input.Encoder.Name input.Decoder.Name input.Image.Size input.Image.Format input.SaveParams.Format input.UseStream
203
220
204
221
tempFile ( fun file ->
205
- let saveParams =
206
- match input.FileFormat with
207
- | PixFileFormat.Jpeg -> PixJpegSaveParams( quality = 100 ) :> PixSaveParams
208
- | fmt -> PixSaveParams fmt
209
-
210
- input.Image.Save( file, saveParams, false , input.Encoder)
211
- let result = PixImage< byte>( file, input.Decoder)
212
-
213
- match input.FileFormat with
222
+ let output =
223
+ if input.UseStream then
224
+ use stream = File.Open( file, FileMode.Create, FileAccess.ReadWrite)
225
+ input.Image.Save( stream, input.SaveParams, input.Encoder)
226
+
227
+ stream.Position <- 0 L
228
+ PixImage< byte>( stream, input.Decoder)
229
+ else
230
+ input.Image.Save( file, input.SaveParams, false , input.Encoder)
231
+ PixImage< byte>( file, input.Decoder)
232
+
233
+ match input.SaveParams.Format with
214
234
| PixFileFormat.Jpeg | PixFileFormat.Gif ->
215
- let psnr = PixImage.peakSignalToNoiseRatio input.Image result
216
- let rmse = PixImage.rootMeanSquaredError input.Image result
217
- Expect.isGreaterThan psnr 25.0 " Bad peak-signal-to-noise ratio"
218
- Expect.isLessThan rmse 15.0 " Bad root-mean-square error"
235
+ let psnr = PixImage.peakSignalToNoiseRatio input.Image output
236
+ Expect.isGreaterThan psnr 20.0 " Bad peak-signal-to-noise ratio"
219
237
220
238
| _ ->
221
- PixImage.compare input.Image result
239
+ PixImage.compare input.Image output
222
240
)
223
241
242
+
224
243
[<Property( Arbitrary = [| typeof< Generator> |]) >]
225
244
let ``[ PixLoader ] Aardvark PGM writer`` ( pi : PixImage < byte >) =
226
245
printfn " size = %A " pi.Size
@@ -235,6 +254,7 @@ module PixLoaderTests =
235
254
PixImage.compare pi out
236
255
)
237
256
257
+
238
258
[<Property( Arbitrary = [| typeof< Generator> |]) >]
239
259
let ``[ PixLoader ] JPEG quality`` ( loader : IPixLoader ) ( pi : PixImage < byte >) =
240
260
printfn " loader = %s , size = %A , format = %A " loader.Name pi.Size pi.Format
@@ -252,6 +272,7 @@ module PixLoaderTests =
252
272
)
253
273
)
254
274
275
+
255
276
[<Property( Arbitrary = [| typeof< Generator> |]) >]
256
277
let ``[ PixLoader ] PNG compression level`` ( pi : PixImage < byte >) =
257
278
printfn " size = %A , format = %A " pi.Size pi.Format
@@ -275,6 +296,7 @@ module PixLoaderTests =
275
296
)
276
297
)
277
298
299
+
278
300
[<Test>]
279
301
let ``[ PixLoader ] Add and remove loaders`` () =
280
302
let count = PixImage.GetLoaders() |> Seq.length
0 commit comments