Skip to content

Commit 946a9d3

Browse files
fix(iff): Improved IFF support reading and writing z buffers (#4673)
Added support for reading and writing ZBUF chunks, also known as Z-buffers or depth maps. Removed noproxy versions, no longer needed. --------- Signed-off-by: Mikael Sundell <mikael.sundell@gmail.com>
1 parent fe04d57 commit 946a9d3

8 files changed

Lines changed: 974 additions & 2230 deletions

File tree

src/iff.imageio/CMakeLists.txt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,4 @@
22
# SPDX-License-Identifier: Apache-2.0
33
# https://github.com/AcademySoftwareFoundation/OpenImageIO
44

5-
option (ENABLE_RLA_IOPROXY "(Temporarily) turn this off to switch back to the old pre-IOProxy RLA implementation to address a bug." ON)
6-
if (ENABLE_RLA_IOPROXY)
7-
add_oiio_plugin (iffinput.cpp iffoutput.cpp)
8-
else ()
9-
add_oiio_plugin (noproxy-iffinput.cpp noproxy-iffoutput.cpp noproxy-iff_pvt.cpp)
10-
endif ()
5+
add_oiio_plugin (iffinput.cpp iffoutput.cpp)

src/iff.imageio/iff_pvt.h

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44

55
#pragma once
66

7-
// Format reference: Affine Toolkit (Thomas E. Burge), riff.h and riff.c
8-
// Autodesk Maya documentation, ilib.h
7+
// Maya Fileformats Version 6:
8+
// https://courses.cs.washington.edu/courses/cse458/05au/help/mayaguide/Reference/FileFormats.pdf
9+
// Format reference: Affine Toolkit (Thomas E. Burge):
10+
// riff.h and riff.c
11+
// Autodesk Maya documentation:
12+
// ilib.h
13+
914

1015
#include <cstdio>
1116

@@ -36,16 +41,19 @@ const uint32_t BLACK = 0x00000010;
3641
class IffFileHeader {
3742
public:
3843
// header information
39-
uint32_t x;
40-
uint32_t y;
41-
uint32_t width;
42-
uint32_t height;
43-
uint32_t compression;
44-
uint8_t pixel_bits;
45-
uint8_t pixel_channels;
46-
uint16_t tiles;
47-
uint16_t tile_width;
48-
uint16_t tile_height;
44+
uint32_t x = 0;
45+
uint32_t y = 0;
46+
uint32_t z = 0;
47+
uint32_t width = 0;
48+
uint32_t height = 0;
49+
uint32_t compression = 0;
50+
uint8_t rgba_bits = 0;
51+
uint8_t rgba_count = 0;
52+
uint16_t tiles = 0;
53+
uint16_t tile_width = 0;
54+
uint16_t tile_height = 0;
55+
uint8_t zbuffer = 0;
56+
uint8_t zbuffer_bits = 0;
4957

5058
// author string
5159
std::string author;
@@ -59,14 +67,29 @@ class IffFileHeader {
5967
// for4 start
6068
uint32_t for4_start;
6169

62-
private:
63-
};
70+
size_t channel_bytes() const { return (rgba_bits / 8); }
71+
72+
size_t rgba_channels_bytes() const { return channel_bytes() * rgba_count; }
73+
74+
size_t rgba_scanline_bytes() const { return width * rgba_channels_bytes(); }
75+
76+
size_t zbuffer_bytes() const { return zbuffer ? (zbuffer_bits / 8) : 0; }
6477

78+
size_t zbuffer_scanline_bytes() const { return width * zbuffer_bytes(); }
6579

80+
size_t scanline_bytes() const { return width * pixel_bytes(); }
81+
82+
size_t pixel_bytes() const
83+
{
84+
return rgba_channels_bytes() + zbuffer_bytes();
85+
}
86+
87+
size_t image_bytes() const { return pixel_bytes() * width * height; }
88+
};
6689

67-
// align size
90+
// align chunk
6891
inline uint32_t
69-
align_size(uint32_t size, uint32_t alignment)
92+
align_chunk(uint32_t size, uint32_t alignment)
7093
{
7194
uint32_t mod = size % alignment;
7295
if (mod) {

0 commit comments

Comments
 (0)