SlideIO 2.0.0
Open-source library for reading of medical images
Loading...
Searching...
No Matches
vsistruct.hpp
1// This file is part of slideio project.
2// It is subject to the license terms in the LICENSE file found in the top-level directory
3// of this distribution and at http://slideio.com/license.html.
4#pragma once
5#include "slideio/drivers/vsi/vsi_api_def.hpp"
6#include <cstdint>
7
8#include "slideio/core/tools/endian.hpp"
9
10namespace slideio
11{
12 namespace vsi
13 {
14 #pragma pack(push,1)
15 struct ImageFileHeader
16 {
17 uint8_t magic[2];
18 uint16_t i42;
19 uint32_t offsetFirstIFD;
20 };
21
22 inline void fromLittleEndianToNative(ImageFileHeader& header)
23 {
24 if (Endian::isLittleEndian())
25 return;
26 header.i42 = Endian::fromLittleEndianToNative(header.i42);
27 header.offsetFirstIFD = Endian::fromLittleEndianToNative(header.offsetFirstIFD);
28 }
29
30 struct ImageFileDirectory
31 {
32 uint16_t entryCount;
33 };
34 inline void fromLittleEndianToNative(ImageFileDirectory& header)
35 {
36 header.entryCount = Endian::fromLittleEndianToNative(header.entryCount);
37 }
38
39 struct FieldEntry
40 {
41 uint16_t tag;
42 uint16_t type;
43 uint32_t numberOfValues;
44 uint32_t offset;
45 };
46 inline void fromLittleEndianToNative(FieldEntry& header)
47 {
48 header.tag = Endian::fromLittleEndianToNative(header.tag);
49 header.type = Endian::fromLittleEndianToNative(header.type);
50 header.numberOfValues = Endian::fromLittleEndianToNative(header.numberOfValues);
51 header.offset = Endian::fromLittleEndianToNative(header.offset);
52 }
53
54 struct VolumeHeader
55 {
56 uint16_t headerSize;
57 uint16_t magicNumber;
58 uint32_t volumeVersion;
59 int64_t offsetFirstDataField;
60 uint32_t flags;
61 uint32_t unused;
62 };
63 inline void fromLittleEndianToNative(VolumeHeader& header) {
64 if (Endian::isLittleEndian())
65 return;
66 header.headerSize = Endian::fromLittleEndianToNative(header.headerSize);
67 header.magicNumber = Endian::fromLittleEndianToNative(header.magicNumber);
68 header.volumeVersion = Endian::fromLittleEndianToNative(header.volumeVersion);
69 header.offsetFirstDataField = Endian::fromLittleEndianToNative(header.offsetFirstDataField);
70 header.flags = Endian::fromLittleEndianToNative(header.flags);
71 header.unused = Endian::fromLittleEndianToNative(header.unused);
72 }
73 struct VolumeDataField
74 {
75 uint32_t type;
76 uint32_t tag;
77 uint32_t offsetNextField;
78 uint32_t dataSize;
79 };
80 inline void fromLittleEndianToNative(VolumeDataField& header)
81 {
82 header.type = Endian::fromLittleEndianToNative(header.type);
83 header.tag = Endian::fromLittleEndianToNative(header.tag);
84 header.offsetNextField = Endian::fromLittleEndianToNative(header.offsetNextField);
85 header.dataSize = Endian::fromLittleEndianToNative(header.dataSize);
86 }
87
88 struct DataField
89 {
90 uint32_t type;
91 uint32_t tag;
92 uint32_t offsetNextField;
93 uint32_t dataSize;
94 };
95 inline void fromLittleEndianToNative(DataField& header)
96 {
97 header.type = Endian::fromLittleEndianToNative(header.type);
98 header.tag = Endian::fromLittleEndianToNative(header.tag);
99 header.offsetNextField = Endian::fromLittleEndianToNative(header.offsetNextField);
100 header.dataSize = Endian::fromLittleEndianToNative(header.dataSize);
101 }
102
103 struct TagHeader
104 {
105 int32_t fieldType;
106 int32_t tag;
107 int32_t nextField;
108 uint32_t dataSize;
109 };
110 inline void fromLittleEndianToNative(TagHeader& header)
111 {
112 header.fieldType = Endian::fromLittleEndianToNative(header.fieldType);
113 header.tag = Endian::fromLittleEndianToNative(header.tag);
114 header.nextField = Endian::fromLittleEndianToNative(header.nextField);
115 header.dataSize = Endian::fromLittleEndianToNative(header.dataSize);
116 }
117
118 struct EtsVolumeHeader {
119 char magic[4]; // Magic ID 'S', 'I', 'S', '\0'
120 uint32_t headerSize; // Size of the header : 64
121 uint32_t versionNumber; // Version number of the header
122 uint32_t numDimensions; // Number of dimensions of the multidimensional indices
123 uint64_t additionalHeaderPos; // 64bit index to the file position of the additional header
124 uint32_t additionalHeaderSize; // Size of the additional header
125 uint32_t unused1;
126 uint64_t usedChunksPos; // 64 bit index to the file position of used chunks
127 uint32_t numUsedChunks; // Number of used chunks
128 uint32_t unused2;
129 uint64_t freeChunksPos; // 64 bit index to the file position of free chunks
130 uint32_t numFreeChunks; // Number of free chunks
131 uint32_t unused3;
132 };
133 inline void fromLittleEndianToNative(EtsVolumeHeader& header)
134 {
135 if (Endian::isLittleEndian())
136 return;
137 header.headerSize = Endian::fromLittleEndianToNative(header.headerSize);
138 header.versionNumber = Endian::fromLittleEndianToNative(header.versionNumber);
139 header.numDimensions = Endian::fromLittleEndianToNative(header.numDimensions);
140 header.additionalHeaderPos = Endian::fromLittleEndianToNative(header.additionalHeaderPos);
141 header.additionalHeaderSize = Endian::fromLittleEndianToNative(header.additionalHeaderSize);
142 header.usedChunksPos = Endian::fromLittleEndianToNative(header.usedChunksPos);
143 header.numUsedChunks = Endian::fromLittleEndianToNative(header.numUsedChunks);
144 header.freeChunksPos = Endian::fromLittleEndianToNative(header.freeChunksPos);
145 header.numFreeChunks = Endian::fromLittleEndianToNative(header.numFreeChunks);
146 }
147
148 struct ETSAdditionalHeader
149 {
150 char magic[4]; // Header identification ( 0x00535445 )
151 uint32_t version; // Header version info
152 uint32_t componentType; // Component type
153 uint32_t componentCount; // Component count
154 uint32_t colorSpace; // Component color space
155 uint32_t format; // Compression format
156 uint32_t quality; // Compression quality
157 uint32_t sizeX; // Tile x size
158 uint32_t sizeY; // Tile y size
159 uint32_t sizeZ; // Tile z size
160 uint32_t pixInfoHints[17]; // Pixel info hints
161 uint32_t background[10]; // Background color
162 uint32_t componentOrder; // Component order
163 uint32_t usePyramid; // Use pyramid
164 uint32_t unused[18]; // For future use
165
166 };
167 inline void fromLittleEndianToNative(ETSAdditionalHeader& header)
168 {
169 if (Endian::isLittleEndian())
170 return;
171 header.version = Endian::fromLittleEndianToNative(header.version);
172 header.componentType = Endian::fromLittleEndianToNative(header.componentType);
173 header.componentCount = Endian::fromLittleEndianToNative(header.componentCount);
174 header.colorSpace = Endian::fromLittleEndianToNative(header.colorSpace);
175 header.format = Endian::fromLittleEndianToNative(header.format);
176 header.quality = Endian::fromLittleEndianToNative(header.quality);
177 header.sizeX = Endian::fromLittleEndianToNative(header.sizeX);
178 header.sizeY = Endian::fromLittleEndianToNative(header.sizeY);
179 header.sizeZ = Endian::fromLittleEndianToNative(header.sizeZ);
180 for (int i = 0; i < 17; ++i)
181 {
182 header.pixInfoHints[i] = Endian::fromLittleEndianToNative(header.pixInfoHints[i]);
183 }
184 for (int i = 0; i < 10; ++i)
185 {
186 header.background[i] = Endian::fromLittleEndianToNative(header.background[i]);
187 }
188 header.componentOrder = Endian::fromLittleEndianToNative(header.componentOrder);
189 header.usePyramid = Endian::fromLittleEndianToNative(header.usePyramid);
190 }
191 struct ETSBlock
192 {
193 int64_t filePos;
194 uint32_t size;
195 uint32_t unused;
196 };
197 inline void fromLittleEndianToNative(ETSBlock& header)
198 {
199 if (Endian::isLittleEndian())
200 return;
201 header.filePos = Endian::fromLittleEndianToNative(header.filePos);
202 header.size = Endian::fromLittleEndianToNative(header.size);
203 }
204
205#pragma pack(pop)
206 constexpr uint32_t EXTENDED_FIELD_TYPE_MASK = 0x1000000;
207 constexpr uint32_t VOLUME_DATA_BLOCK_TYPE_MASK = 0x10000000;
208 constexpr uint32_t VOLUME_TAG_COUNT_MASK = 0xFFFFFFF;
209
210 enum class ExtendedType
211 {
212 UNSET = -1,
213 NEW_VOLUME_HEADER = 0,
214 PROPERTY_SET_VOLUME = 1,
215 NEW_MDIM_VOLUME_HEADER = 2,
216 TIFF_ID = 0xA,
217 VECTOR_DATA = 0xB
218
219 };
220
221 enum class ValueType
222 {
223 UNSET = 0,
224 CHAR = 1,
225 UCHAR = 2,
226 SHORT = 3,
227 USHORT = 4,
228 INT = 5,
229 UINT = 6,
230 INT64 = 7,
231 UINT64 = 8,
232 FLOAT = 9,
233 DOUBLE = 10,
234 DOUBLE2 = 11,
235 BOOL = 12,
236 TCHAR = 13,
237 DWORD = 14,
238 TIMESTAMP = 17,
239 DATE = 18,
240 VECTOR_INT_2 = 256,
241 VECTOR_INT_3 = 257,
242 VECTOR_INT_4 = 258,
243 RECT_INT = 259,
244 VECTOR_DOUBLE_2 = 260,
245 VECTOR_DOUBLE_3 = 261,
246 VECTOR_DOUBLE_4 = 262,
247 RECT_DOUBLE = 263,
248 MATRIX_DOUBLE_2_2 = 264,
249 MATRIX_DOUBLE_3_3 = 265,
250 MATRIX_DOUBLE_4_4 = 266,
251 TUPLE_INT = 267,
252 TUPLE_DOUBLE = 268,
253 RGB = 269,
254 BGR = 270,
255 FIELD_TYPE = 271,
256 MEM_MODEL = 272,
257 COLOR_SPACE = 273,
258 UNICODE_TCHAR = 8192,
259 ARRAY_INT_2 = 274,
260 ARRAY_INT_3 = 275,
261 ARRAY_INT_4 = 276,
262 ARRAY_INT_5 = 277,
263 ARRAY_DOUBLE_2 = 279,
264 ARRAY_DOUBLE_3 = 280,
265 DIM_INDEX_1 = 8195,
266 DIM_INDEX_2 = 8199,
267 VOLUME_INDEX = 8200,
268 PIXEL_INFO_TYPE = 8470,
269 };
270 enum class ColorSpace
271 {
272 Unknown = 0,
273 Gray = 1,
274 Palette = 2,
275 RGB = 3,
276 BGR = 4,
277 HSV = 5
278 };
279 enum class Compression
280 {
281 RAW = 0,
282 JPEG = 2,
283 JPEG_2000 = 3,
284 JPEG_LOSSLESS = 5,
285 PNG = 8,
286 BMP = 9,
287 };
288 enum class StackType
289 {
290 DEFAULT_IMAGE = 0,
291 OVERVIEW_IMAGE = 1,
292 SAMPLE_MASK = 2,
293 FOCUS_IMAGE = 4,
294 EFI_SHARPNESS_MAP = 8,
295 EFI_HEIGHT_MAP = 16,
296 EFI_TEXTURE_MAP = 32,
297 EFI_STACK = 64,
298 MACRO_IMAGE = 256,
299 FOCUS_POINTS = 1024,
300 UNKNOWN = 0xFFFF,
301 };
302
303 std::string SLIDEIO_VSI_EXPORTS getStackTypeName(StackType type);
304
305 constexpr int Z = 1;
306 constexpr int T = 2;
307 constexpr int LAMBDA = 3;
308 constexpr int C = 4;
309 constexpr int UNKNOWN = 5;
310 constexpr int PHASE = 9;
311 }
312}
Definition: exceptions.hpp:15
Compression
raster data compression enum
Definition: slideio_enums.hpp:12