20 #ifndef vtkX3DExporterFIWriterHelper_h
21 #define vtkX3DExporterFIWriterHelper_h
27 #define EXPONENT_MASK_32 0x7f800000
28 #define MANTISSA_MASK_32 0x007fffff
31 #define max(a, b) (((a) > (b)) ? (a) : (b))
33 VTK_ABI_NAMESPACE_BEGIN
47 assert(writer->CurrentBytePos == 2);
51 writer->PutBits(
"11");
53 writer->PutBits(7 - 1, 8);
57 for (
size_t i = 0; i <
size; i++)
63 if (v.
ui == 0x80000000)
73 bytes.append(
byte, 4);
82 assert(writer->CurrentBytePos == 2);
86 writer->PutBits(
"11");
88 writer->PutBits(4 - 1, 8);
90 for (
size_t i = 0; i <
size; i++)
93 int f = ReverseBytes(&v);
94 char* p =
reinterpret_cast<char*
>(&f);
104 assert(writer->CurrentBytePos == 2);
108 writer->PutBits(
"00");
121 writer->PutBit(
false);
122 writer->PutBits(
length - 1, 3);
126 writer->PutBits(
"1000");
127 writer->PutBits(
length - 9, 8);
131 writer->PutBits(
"1100");
132 writer->PutBits(
length - 265, 32);
142 assert(writer->CurrentBytePos == 2);
146 writer->PutBit(
false);
147 writer->PutBits(
value - 1, 5);
149 else if (
value <= 2080)
151 writer->PutBits(
"100");
152 writer->PutBits(
value - 33, 11);
154 else if (
value < 526368)
156 writer->PutBits(
"101");
157 writer->PutBits(
value - 2081, 19);
161 writer->PutBits(
"1100000000");
162 writer->PutBits(
value - 526369, 20);
171 assert(writer->CurrentBytePos == 1);
175 writer->PutBits(
"0");
176 writer->PutBits(
value - 1, 6);
178 else if (
value <= 8256)
180 writer->PutBits(
"10");
181 writer->PutBits(
value - 65, 13);
185 writer->PutBits(
"110");
186 writer->PutBits(
value - 8257, 20);
192 static bool firstTime =
true;
196 writer->PutBits(
"1001000000001010");
202 writer->PutBits(
"10100000");
207 static int ReverseBytes(
int* x)
210 int part1 = (*x) & 0xFF;
211 int part2 = ((*x) >> 8) & 0xFF;
212 int part3 = ((*x) >> 16) & 0xFF;
213 int part4 = ((*x) >> 24) & 0xFF;
214 return (part1 << 24) | (part2 << 16) | (part3 << 8) | part4;
224 template <
typename T>
229 assert(writer->CurrentBytePos == 2);
233 writer->PutBits(
"11");
235 writer->PutBits(34 - 1, 8);
242 std::vector<unsigned char> deltas;
247 for (i = 0; i <
size; i++)
249 int v = 1 + (
value[i]);
250 int* vp =
reinterpret_cast<int*
>(&v);
251 f = vtkX3DExporterFIWriterHelper::ReverseBytes(vp);
252 p =
reinterpret_cast<unsigned char*
>(&f);
253 deltas.push_back(p[0]);
254 deltas.push_back(p[1]);
255 deltas.push_back(p[2]);
256 deltas.push_back(p[3]);
262 for (i = 0; i < 20; i++)
266 span =
static_cast<char>(i) + 1;
273 for (i = 0; i < static_cast<size_t>(span); i++)
275 int v = 1 +
value[i];
276 int* vp =
reinterpret_cast<int*
>(&v);
277 f = vtkX3DExporterFIWriterHelper::ReverseBytes(vp);
279 p =
reinterpret_cast<unsigned char*
>(&f);
280 deltas.push_back(p[0]);
281 deltas.push_back(p[1]);
282 deltas.push_back(p[2]);
283 deltas.push_back(p[3]);
285 for (i = span; i <
size; i++)
288 f = vtkX3DExporterFIWriterHelper::ReverseBytes(&v);
290 p =
reinterpret_cast<unsigned char*
>(&f);
291 deltas.push_back(p[0]);
292 deltas.push_back(p[1]);
293 deltas.push_back(p[2]);
294 deltas.push_back(p[3]);
298 size_t bufferSize = deltas.size() +
static_cast<unsigned int>(ceil(deltas.size() * 0.001)) + 12;
299 unsigned char* buffer =
new unsigned char[bufferSize];
300 size_t newSize = compressor->
Compress(&deltas[0],
static_cast<unsigned long>(deltas.size()),
301 buffer,
static_cast<unsigned long>(bufferSize));
304 int size32 =
static_cast<int>(
size);
305 int size32_reversed = vtkX3DExporterFIWriterHelper::ReverseBytes(&size32);
306 char* s =
reinterpret_cast<char*
>(&size32_reversed);
308 bytes.append(&span, 1);
310 for (i = 0; i < newSize; i++)
312 unsigned char c = buffer[i];
328 assert(writer->CurrentBytePos == 2);
332 writer->PutBits(
"11");
334 writer->PutBits(34, 8);
336 unsigned char* bytes =
new unsigned char[
size * 4];
337 unsigned char* bytepos = bytes;
341 const double* vd =
value;
342 for (i = 0; i <
size; i++)
344 union float_to_unsigned_int_to_bytes {
349 float_to_unsigned_int_to_bytes v;
353 if (v.ui == 0x80000000)
359 *bytepos++ = v.ub[3];
360 *bytepos++ = v.ub[2];
361 *bytepos++ = v.ub[1];
362 *bytepos++ = v.ub[0];
367 size_t bufferSize = (
size * 4) +
static_cast<size_t>(ceil((
size * 4) * 0.001)) + 12;
368 unsigned char* buffer =
new unsigned char[bufferSize];
369 size_t newSize = compressor->
Compress(
370 bytes,
static_cast<unsigned long>(
size * 4), buffer,
static_cast<unsigned long>(bufferSize));
374 bytesCompressed +=
static_cast<char>(8);
376 bytesCompressed +=
static_cast<char>(23);
379 int length_reversed = vtkX3DExporterFIWriterHelper::ReverseBytes(&
length);
380 s =
reinterpret_cast<char*
>(&length_reversed);
381 bytesCompressed.append(s, 4);
384 int numFloats =
static_cast<int>(
size);
385 int numFloats_reversed = vtkX3DExporterFIWriterHelper::ReverseBytes(&numFloats);
386 s =
reinterpret_cast<char*
>(&numFloats_reversed);
387 bytesCompressed.append(s, 4);
389 for (i = 0; i < newSize; i++)
391 unsigned char c = buffer[i];
392 bytesCompressed += c;
400 VTK_ABI_NAMESPACE_END
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 EncodeLineFeed(vtkX3DExporterFIByteWriter *writer)
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.