@@ -47,13 +47,14 @@ mutable struct VTKFile
4747 appended_data:: Vector{UInt8}
4848 n_points:: Int
4949 n_cells:: Int
50+ header_type:: DataType
5051
5152 # Create inner constructor to add finalizer (this requires VTKFile to be a *mutable* struct)
5253 function VTKFile (filename, xml_file, file_type, version, byte_order, compressor,
53- appended_data, n_points, n_cells)
54+ appended_data, n_points, n_cells, header_type )
5455 # Create new object
5556 vtk_file = new (filename, xml_file, file_type, version, byte_order, compressor,
56- appended_data, n_points, n_cells)
57+ appended_data, n_points, n_cells, header_type )
5758
5859 # Create finalizer that releases memory for VTK file
5960 f (vtk_file) = free (vtk_file. xml_file)
@@ -63,8 +64,8 @@ mutable struct VTKFile
6364 end
6465end
6566
66- # Header type is hardcoded
67- header_type (:: VTKFile ) = UInt64
67+ # Header type
68+ header_type (vtk_file :: VTKFile ) = vtk_file . header_type
6869
6970# Return true if data is compressed (= XML attribute `compressor` is non-empty in VTK file)
7071is_compressed (vtk_file:: VTKFile ) = ! isempty (vtk_file. compressor)
@@ -133,7 +134,8 @@ function VTKFile(filename)
133134 (byte_order == " BigEndian" && ! is_little_endian))
134135
135136 # Ensure matching header type
136- @assert header_type == " UInt64"
137+ @assert header_type in (" UInt32" , " UInt64" )
138+ header_type_parsed = string_to_data_type (header_type)
137139
138140 # Ensure supported compression type
139141 @assert in (compressor, (" " , " vtkZLibDataCompressor" ))
@@ -162,7 +164,7 @@ function VTKFile(filename)
162164
163165 # Create and return VTKFile
164166 return VTKFile (filename, xml_file, file_type, version, byte_order, compressor,
165- appended_data, n_points, n_cells)
167+ appended_data, n_points, n_cells, header_type_parsed )
166168end
167169
168170# Show basic information on REPL
@@ -766,17 +768,21 @@ function get_data(data_array::VTKDataArray{T, N, <:FormatBinary}) where {T, N}
766768 raw = base64decode (split (strip (content (data_array. data_array)), " \n " )[1 ])
767769
768770 if is_compressed (data_array)
769- # If data is stored compressed, the first four integers of type `header_type` are the header and
770- # must be discarded
771- first = 1 + 4 * sizeof (header_type (data_array. vtk_file))
771+ # If data is stored compressed, the header consists of `3 + num_blocks` integers of type
772+ # `header_type`. It must be discarded.
773+ HeaderType = header_type (data_array. vtk_file)
774+ header_num_blocks = reinterpret (HeaderType, raw[1 : sizeof (HeaderType)])[1 ]
775+ header_len = 3 + header_num_blocks
776+ first = 1 + header_len * sizeof (HeaderType)
772777 last = length (raw)
773778
774779 # Pass data through ZLib decompressor
775780 uncompressed = transcode (ZlibDecompressor, raw[first: last])
776781 else
777782 # If data is stored uncompressed, the first integer of type `header_type` is the header and must
778783 # be discarded
779- first = 1 + sizeof (header_type (data_array. vtk_file))
784+ HeaderType = header_type (data_array. vtk_file)
785+ first = 1 + sizeof (HeaderType)
780786 last = length (raw)
781787 uncompressed = view (raw, first: last)
782788 end
@@ -799,24 +805,28 @@ function get_data(data_array::VTKDataArray{T, N, <:FormatAppended}) where {T, N}
799805 HeaderType = header_type (data_array. vtk_file)
800806
801807 if is_compressed (data_array)
802- # If data is stored compressed, the first four integers of type `header_type` are the header and
803- # the fourth value contains the number of bytes to read
808+ # If data is stored compressed, the header consists of `3 + num_blocks` integers of type `header_type`.
809+ # The sum of the subsequent blocks contains the total number of compressed bytes to read.
804810 first = data_array. offset + 1
805- last = data_array . offset + 4 * sizeof (HeaderType)
806- header = Int .( reinterpret (HeaderType, raw[first: last]))
807- n_bytes = header[ 4 ]
811+ header_num_blocks = reinterpret (HeaderType,
812+ raw[first: (first + sizeof (HeaderType) - 1 )])[ 1 ]
813+ header_len = 3 + header_num_blocks
808814
809- first = data_array. offset + 4 * sizeof (HeaderType) + 1
810- last = first + n_bytes - 1
815+ last_header = data_array. offset + header_len * sizeof (HeaderType)
816+ header = Int .(reinterpret (HeaderType, raw[first: last_header]))
817+ n_bytes = sum (@view header[4 : end ])
818+
819+ first_data = last_header + 1
820+ last_data = first_data + n_bytes - 1
811821
812822 # Pass data through ZLib decompressor
813- if last > length (raw)
823+ if last_data > length (raw)
814824 @show data_array data_array. vtk_file. xml_file
815- @show first, last , size (raw)
825+ @show first, last_data , size (raw)
816826 error (" mistake in get_data" )
817827 end
818828
819- uncompressed = transcode (ZlibDecompressor, raw[first : last ])
829+ uncompressed = transcode (ZlibDecompressor, raw[first_data : last_data ])
820830 else
821831 # If data is stored uncompressed, the first integer of type `header_type` is the header and
822832 # contains the number of bytes to read
@@ -981,7 +991,6 @@ function get_extents(xml_file, min_extent = [0; 0; 0])
981991end
982992
983993
984-
985994"""
986995 get_points(vtk_file::VTKFile)
987996
0 commit comments