8#ifndef vtkX3DExporterFIWriterHelper_h
9#define vtkX3DExporterFIWriterHelper_h
15#define EXPONENT_MASK_32 0x7f800000
16#define MANTISSA_MASK_32 0x007fffff
19#define max(a, b) (((a) > (b)) ? (a) : (b))
21VTK_ABI_NAMESPACE_BEGIN
33 static void EncodeFloatFI(vtkX3DExporterFIByteWriter* writer, T* value,
size_t size)
36 assert(writer->CurrentBytePos == 2);
40 writer->PutBits(
"11");
42 writer->PutBits(7 - 1, 8);
46 for (
size_t i = 0; i < size; i++)
52 if (v.
ui == 0x80000000)
62 bytes.append(
byte, 4);
68 static void EncodeIntegerFI(vtkX3DExporterFIByteWriter* writer, T* value,
size_t size)
71 assert(writer->CurrentBytePos == 2);
75 writer->PutBits(
"11");
77 writer->PutBits(4 - 1, 8);
79 for (
size_t i = 0; i < size; i++)
82 int f = ReverseBytes(&v);
83 char* p =
reinterpret_cast<char*
>(&f);
92 assert(writer->CurrentBytePos == 2);
96 writer->PutBits(
"00");
104 vtkX3DExporterFIByteWriter* writer,
const std::string& value)
106 int length =
static_cast<int>(value.length());
109 writer->PutBit(
false);
110 writer->PutBits(length - 1, 3);
112 else if (length <= 264)
114 writer->PutBits(
"1000");
115 writer->PutBits(length - 9, 8);
119 writer->PutBits(
"1100");
120 writer->PutBits(length - 265, 32);
122 writer->PutBytes(value.c_str(), length);
127 static void EncodeInteger3(vtkX3DExporterFIByteWriter* writer,
unsigned int value)
130 assert(writer->CurrentBytePos == 2);
134 writer->PutBit(
false);
135 writer->PutBits(value - 1, 5);
137 else if (value <= 2080)
139 writer->PutBits(
"100");
140 writer->PutBits(value - 33, 11);
142 else if (value < 526368)
144 writer->PutBits(
"101");
145 writer->PutBits(value - 2081, 19);
149 writer->PutBits(
"1100000000");
150 writer->PutBits(value - 526369, 20);
156 static void EncodeInteger2(vtkX3DExporterFIByteWriter* writer,
unsigned int value)
159 assert(writer->CurrentBytePos == 1);
163 writer->PutBits(
"0");
164 writer->PutBits(value - 1, 6);
166 else if (value <= 8256)
168 writer->PutBits(
"10");
169 writer->PutBits(value - 65, 13);
173 writer->PutBits(
"110");
174 writer->PutBits(value - 8257, 20);
179 static int ReverseBytes(
int* x)
182 int part1 = (*x) & 0xFF;
183 int part2 = ((*x) >> 8) & 0xFF;
184 int part3 = ((*x) >> 16) & 0xFF;
185 int part4 = ((*x) >> 24) & 0xFF;
186 return (part1 << 24) | (part2 << 16) | (part3 << 8) | part4;
196 template <
typename T>
201 assert(writer->CurrentBytePos == 2);
205 writer->PutBits(
"11");
207 writer->PutBits(34 - 1, 8);
214 std::vector<unsigned char> deltas;
219 for (i = 0; i < size; i++)
221 int v = 1 + (value[i]);
223 f = vtkX3DExporterFIWriterHelper::ReverseBytes(vp);
224 p =
reinterpret_cast<unsigned char*
>(&f);
225 deltas.push_back(p[0]);
226 deltas.push_back(p[1]);
227 deltas.push_back(p[2]);
228 deltas.push_back(p[3]);
234 for (i = 0; i < 20; i++)
238 span =
static_cast<char>(i) + 1;
245 for (i = 0; i < static_cast<size_t>(span); i++)
247 int v = 1 + value[i];
249 f = vtkX3DExporterFIWriterHelper::ReverseBytes(vp);
251 p =
reinterpret_cast<unsigned char*
>(&f);
252 deltas.push_back(p[0]);
253 deltas.push_back(p[1]);
254 deltas.push_back(p[2]);
255 deltas.push_back(p[3]);
257 for (i = span; i < size; i++)
259 int v = 1 + (value[i] - value[i - span]);
260 f = vtkX3DExporterFIWriterHelper::ReverseBytes(&v);
262 p =
reinterpret_cast<unsigned char*
>(&f);
263 deltas.push_back(p[0]);
264 deltas.push_back(p[1]);
265 deltas.push_back(p[2]);
266 deltas.push_back(p[3]);
270 size_t bufferSize = deltas.size() +
static_cast<unsigned int>(ceil(deltas.size() * 0.001)) + 12;
271 unsigned char* buffer =
new unsigned char[bufferSize];
272 size_t newSize = compressor->
Compress(deltas.data(),
static_cast<unsigned long>(deltas.size()),
273 buffer,
static_cast<unsigned long>(bufferSize));
276 int size32 =
static_cast<int>(size);
277 int size32_reversed = vtkX3DExporterFIWriterHelper::ReverseBytes(&size32);
278 char* s =
reinterpret_cast<char*
>(&size32_reversed);
280 bytes.append(&span, 1);
282 for (i = 0; i < newSize; i++)
284 unsigned char c = buffer[i];
300 assert(writer->CurrentBytePos == 2);
304 writer->PutBits(
"11");
306 writer->PutBits(34, 8);
308 unsigned char* bytes =
new unsigned char[size * 4];
309 unsigned char* bytepos = bytes;
310 std::string bytesCompressed;
313 const double* vd = value;
314 for (i = 0; i < size; i++)
316 union float_to_unsigned_int_to_bytes
322 float_to_unsigned_int_to_bytes v;
326 if (v.ui == 0x80000000)
332 *bytepos++ = v.ub[3];
333 *bytepos++ = v.ub[2];
334 *bytepos++ = v.ub[1];
335 *bytepos++ = v.ub[0];
340 size_t bufferSize = (size * 4) +
static_cast<size_t>(ceil((size * 4) * 0.001)) + 12;
341 unsigned char* buffer =
new unsigned char[bufferSize];
342 size_t newSize = compressor->
Compress(
343 bytes,
static_cast<unsigned long>(size * 4), buffer,
static_cast<unsigned long>(bufferSize));
347 bytesCompressed +=
static_cast<char>(8);
349 bytesCompressed +=
static_cast<char>(23);
351 int length =
static_cast<int>(size * 4);
352 int length_reversed = vtkX3DExporterFIWriterHelper::ReverseBytes(&length);
353 s =
reinterpret_cast<char*
>(&length_reversed);
354 bytesCompressed.append(s, 4);
357 int numFloats =
static_cast<int>(size);
358 int numFloats_reversed = vtkX3DExporterFIWriterHelper::ReverseBytes(&numFloats);
359 s =
reinterpret_cast<char*
>(&numFloats_reversed);
360 bytesCompressed.append(s, 4);
362 for (i = 0; i < newSize; i++)
364 unsigned char c = buffer[i];
365 bytesCompressed += c;
static void EncodeQuantizedzlibFloatArray(vtkX3DExporterFIByteWriter *writer, const double *value, size_t size, vtkZLibDataCompressor *compressor)
static void EncodeIntegerDeltaZ(vtkX3DExporterFIByteWriter *writer, T *value, size_t size, vtkZLibDataCompressor *compressor, bool image=false)
size_t Compress(unsigned char const *uncompressedData, size_t uncompressedSize, unsigned char *compressedData, size_t compressionSpace)
Compress the given input data buffer into the given output buffer.
static void EncodeInteger2(vtkX3DExporterFIByteWriter *writer, unsigned int value)
static void EncodeInteger3(vtkX3DExporterFIByteWriter *writer, unsigned int value)
static void EncodeCharacterString3(vtkX3DExporterFIByteWriter *writer, const std::string &value)
static void EncodeIntegerFI(vtkX3DExporterFIByteWriter *writer, T *value, size_t size)
static void EncodeFloatFI(vtkX3DExporterFIByteWriter *writer, T *value, size_t size)
static void EncodeNonEmptyByteString5(vtkX3DExporterFIByteWriter *writer, const std::string &value)
Data compression using zlib.
void SetCompressionLevel(int compressionLevel) override
Get/Set the compression level.