[pbm] Also test PFM formats.

This commit is contained in:
Jeroen van Rijn
2022-04-30 21:57:14 +02:00
parent 694c13fe86
commit 7a032cf9f9

View File

@@ -1558,25 +1558,106 @@ run_png_suite :: proc(t: ^testing.T, suite: []PNG_Test) -> (subtotal: int) {
{
// Roundtrip through PBM to test the PBM encoders and decoders - prefer ASCII
pbm_info, pbm_format_selected := pbm.autoselect_pbm_format_from_image(img, false)
pbm_buf, pbm_save_err := pbm.save_to_buffer(img, pbm_info)
defer delete(pbm_buf)
error = fmt.tprintf("%v test %v PBM save failed with %v.", file.file, count, pbm_save_err)
expect(t, pbm_save_err == nil, error)
// We already tested the binary formats above.
if pbm_info.header.format in pbm.ASCII {
pbm_buf, pbm_save_err := pbm.save_to_buffer(img, pbm_info)
defer delete(pbm_buf)
if pbm_save_err == nil {
// Try to load it again.
pbm_img, pbm_load_err := pbm.load(pbm_buf)
defer pbm.destroy(pbm_img)
error = fmt.tprintf("%v test %v PBM save failed with %v.", file.file, count, pbm_save_err)
expect(t, pbm_save_err == nil, error)
error = fmt.tprintf("%v test %v PBM load failed with %v.", file.file, count, pbm_load_err)
expect(t, pbm_load_err == nil, error)
if pbm_save_err == nil {
// Try to load it again.
pbm_img, pbm_load_err := pbm.load(pbm_buf)
defer pbm.destroy(pbm_img)
if pbm_load_err == nil {
pbm_hash := hash.crc32(pbm_img.pixels.buf[:])
error = fmt.tprintf("%v test %v PBM load failed with %v.", file.file, count, pbm_load_err)
expect(t, pbm_load_err == nil, error)
error = fmt.tprintf("%v test %v PBM load hash is %08x, expected it match PNG's %08x with %v.", file.file, count, pbm_hash, png_hash, test.options)
expect(t, pbm_hash == png_hash, error)
if pbm_load_err == nil {
pbm_hash := hash.crc32(pbm_img.pixels.buf[:])
error = fmt.tprintf("%v test %v PBM load hash is %08x, expected it match PNG's %08x with %v.", file.file, count, pbm_hash, png_hash, test.options)
expect(t, pbm_hash == png_hash, error)
}
}
}
}
{
// We still need to test Portable Float Maps
if (img.channels == 1 || img.channels == 3) && (img.depth == 8 || img.depth == 16) {
// Make temporary float image
float_img := new(image.Image)
defer png.destroy(float_img)
float_img.width = img.width
float_img.height = img.height
float_img.channels = img.channels
float_img.depth = 32
buffer_size := image.compute_buffer_size(img.width, img.height, img.channels, 32)
resize(&float_img.pixels.buf, buffer_size)
pbm_info := pbm.Info {
header = {
width = img.width,
height = img.height,
channels = img.channels,
depth = img.depth,
maxval = 255 if img.depth == 8 else 65535,
little_endian = true if ODIN_ENDIAN == .Little else false,
scale = 1.0,
format = .Pf if img.channels == 1 else .PF,
},
}
// Transform data...
orig_float := mem.slice_data_cast([]f32, float_img.pixels.buf[:])
switch img.depth {
case 8:
for v, i in img.pixels.buf {
orig_float[i] = f32(v) / f32(256)
}
case 16:
wide := mem.slice_data_cast([]u16, img.pixels.buf[:])
for v, i in wide {
orig_float[i] = f32(v) / f32(65536)
}
}
float_pbm_buf, float_pbm_save_err := pbm.save_to_buffer(float_img, pbm_info)
defer delete(float_pbm_buf)
error = fmt.tprintf("%v test %v save as PFM failed with %v", file.file, count, float_pbm_save_err)
expect(t, float_pbm_save_err == nil, error)
if float_pbm_save_err == nil {
// Load float image and compare.
float_pbm_img, float_pbm_load_err := pbm.load(float_pbm_buf)
defer pbm.destroy(float_pbm_img)
error = fmt.tprintf("%v test %v PFM load failed with %v", file.file, count, float_pbm_load_err)
expect(t, float_pbm_load_err == nil, error)
load_float := mem.slice_data_cast([]f32, float_pbm_img.pixels.buf[:])
error = fmt.tprintf("%v test %v PFM load returned %v floats, expected %v", file.file, count, len(load_float), len(orig_float))
expect(t, len(load_float) == len(orig_float), error)
// Compare floats
equal := true
for orig, i in orig_float {
if orig != load_float[i] {
equal = false
break
}
}
error = fmt.tprintf("%v test %v PFM loaded floats to match", file.file, count)
expect(t, equal, error)
}
}
}