4#ifndef OPENVDB_IO_COMPRESSION_HAS_BEEN_INCLUDED
5#define OPENVDB_IO_COMPRESSION_HAS_BEEN_INCLUDED
79template <
typename ValueT,
typename MaskT>
83 static inline bool eq(
const ValueT& a,
const ValueT& b) {
88 const MaskT& valueMask,
const MaskT& childMask,
89 const ValueT* srcBuf,
const ValueT& background)
93 int numUniqueInactiveVals = 0;
94 for (
typename MaskT::OffIterator it = valueMask.beginOff();
95 numUniqueInactiveVals < 3 && it; ++it)
100 if (childMask.isOn(idx))
continue;
102 const ValueT& val = srcBuf[idx];
103 const bool unique = !(
108 if (numUniqueInactiveVals < 2)
inactiveVal[numUniqueInactiveVals] = val;
109 ++numUniqueInactiveVals;
115 if (numUniqueInactiveVals == 1) {
123 }
else if (numUniqueInactiveVals == 2) {
157 }
else if (numUniqueInactiveVals > 2) {
244 const bool seek = data ==
nullptr;
254 is.seekg(
sizeof(T) * count, std::ios_base::cur);
256 is.read(
reinterpret_cast<char*
>(data),
sizeof(T) * count);
265 for (
Index i = 0; i < count; ++i) {
271 std::string buffer(len+1,
' ');
272 is.read(&buffer[0], len+1);
273 if (data !=
nullptr) data[i].assign(buffer, 0, len);
294 if (count < 1)
return;
295 if (data ==
nullptr) {
299 std::vector<HalfT> halfData(count);
302 std::copy(halfData.begin(), halfData.end(), data);
315 return zipToStreamSize(
reinterpret_cast<const char*
>(data),
sizeof(T) * count);
317 return sizeof(T) * count;
329 for (
Index i = 0; i < count; ++i) {
330 const size_t len = data[i].size();
331 size +=
sizeof(size_t) + (len+1);
350 bloscToStream(os,
reinterpret_cast<const char*
>(data),
sizeof(T), count);
352 zipToStream(os,
reinterpret_cast<const char*
>(data),
sizeof(T) * count);
354 os.write(
reinterpret_cast<const char*
>(data),
sizeof(T) * count);
364 for (
Index i = 0; i < count; ++i) {
365 const size_t len = data[i].size();
367 os.write(data[i].c_str(), len+1);
392 if (count < 1)
return size_t(0);
394 std::vector<HalfT> halfData(count);
395 for (
Index i = 0; i < count; ++i) halfData[i] = RealToHalf<T>::convert(data[i]);
399 if (count < 1)
return;
401 std::vector<HalfT> halfData(count);
402 for (
Index i = 0; i < count; ++i) halfData[i] = RealToHalf<T>::convert(data[i]);
409struct HalfWriter<true, double> {
410 using HalfT = RealToHalf<double>::HalfT;
411 static inline size_t writeSize(
const double* data,
Index count, uint32_t
compression)
413 if (count < 1)
return size_t(0);
415 std::vector<HalfT> halfData(count);
416 for (
Index i = 0; i < count; ++i) halfData[i] = RealToHalf<double>::convert(data[i]);
417 return writeDataSize<HalfT>(
reinterpret_cast<const HalfT*
>(&halfData[0]), count,
compression);
419 static inline void write(std::ostream& os,
const double* data,
Index count,
422 if (count < 1)
return;
424 std::vector<HalfT> halfData(count);
425 for (
Index i = 0; i < count; ++i) halfData[i] = RealToHalf<double>::convert(data[i]);
426 writeData<HalfT>(os,
reinterpret_cast<const HalfT*
>(&halfData[0]), count,
compression);
448template<
typename ValueT,
typename MaskT>
451 const MaskT& valueMask,
bool fromHalf,
const ValueT* background =
nullptr)
460 const bool seek = (destBuf ==
nullptr);
468 if (seek && !maskCompressed) {
469 is.seekg(1, std::ios_base::cur);
471 is.read(
reinterpret_cast<char*
>(&metadata), 1);
477 bgValue = *background;
479 bgValue = *
static_cast<const ValueT*
>(bgPtr);
481 ValueT inactiveVal1 = bgValue;
482 ValueT inactiveVal0 =
491 is.seekg(
sizeof(ValueT), std::ios_base::cur);
493 is.read(
reinterpret_cast<char*
>(&inactiveVal0),
sizeof(ValueT));
498 is.seekg(
sizeof(ValueT), std::ios_base::cur);
500 is.read(
reinterpret_cast<char*
>(&inactiveVal1),
sizeof(ValueT));
513 is.seekg(selectionMask.memUsage(), std::ios_base::cur);
515 selectionMask.load(is);
519 ValueT* tempBuf = destBuf;
520 std::unique_ptr<ValueT[]> scopedTempBuf;
522 Index tempCount = destCount;
526 tempCount = valueMask.countOn();
527 if (!seek && tempCount != destCount) {
530 scopedTempBuf.reset(
new ValueT[tempCount]);
531 tempBuf = scopedTempBuf.get();
538 is, (seek ?
nullptr : tempBuf), tempCount,
compression);
541 is, (seek ?
nullptr : tempBuf), tempCount,
compression);
547 if (!seek && maskCompressed && tempCount != destCount) {
551 for (
Index destIdx = 0, tempIdx = 0; destIdx < MaskT::SIZE; ++destIdx) {
552 if (valueMask.isOn(destIdx)) {
554 destBuf[destIdx] = tempBuf[tempIdx];
558 destBuf[destIdx] = (selectionMask.isOn(destIdx) ? inactiveVal1 : inactiveVal0);
565template<
typename ValueT,
typename MaskT>
568 const MaskT& valueMask, uint8_t maskMetadata,
bool toHalf, uint32_t compress)
570 using NonConstValueT =
typename std::remove_const<ValueT>::type;
574 Index tempCount = srcCount;
575 ValueT* tempBuf = srcBuf;
576 std::unique_ptr<NonConstValueT[]> scopedTempBuf;
582 Index64 onVoxels = valueMask.countOn();
585 scopedTempBuf.reset(
new NonConstValueT[onVoxels]);
586 NonConstValueT* localTempBuf = scopedTempBuf.get();
589 for (
typename MaskT::OnIterator it = valueMask.beginOn(); it; ++it, ++tempCount) {
590 localTempBuf[tempCount] = srcBuf[it.pos()];
593 tempBuf = scopedTempBuf.get();
600 tempBuf, tempCount, compress);
620template<
typename ValueT,
typename MaskT>
623 const MaskT& valueMask,
const MaskT& childMask,
bool toHalf,
624 const ValueT* background =
nullptr)
630 Index tempCount = srcCount;
631 ValueT* tempBuf =
nullptr;
632 std::unique_ptr<ValueT[]> scopedTempBuf;
637 os.write(
reinterpret_cast<const char*
>(&metadata), 1);
646 ValueT bgValue = zero;
648 bgValue = *background;
650 bgValue = *
static_cast<const ValueT*
>(bgPtr);
654 metadata = maskCompressData.
metadata;
656 os.write(
reinterpret_cast<const char*
>(&metadata), 1);
664 os.write(
reinterpret_cast<const char*
>(&maskCompressData.
inactiveVal[0]),
sizeof(ValueT));
667 os.write(
reinterpret_cast<const char*
>(&maskCompressData.
inactiveVal[1]),
sizeof(ValueT));
672 os.write(
reinterpret_cast<const char*
>(&truncatedVal),
sizeof(ValueT));
676 os.write(
reinterpret_cast<const char*
>(&truncatedVal),
sizeof(ValueT));
688 scopedTempBuf.reset(
new ValueT[srcCount]);
689 tempBuf = scopedTempBuf.get();
697 for (
typename MaskT::OnIterator it = valueMask.beginOn(); it; ++it, ++tempCount) {
698 tempBuf[tempCount] = srcBuf[it.pos()];
705 for (
Index srcIdx = 0; srcIdx < srcCount; ++srcIdx) {
706 if (valueMask.isOn(srcIdx)) {
707 tempBuf[tempCount] = srcBuf[srcIdx];
711 selectionMask.setOn(srcIdx);
718 selectionMask.save(os);
726 bool(tempBuf) ? tempBuf : srcBuf, tempCount, compress);
728 writeData(os,
bool(tempBuf) ? tempBuf : srcBuf, tempCount, compress);
#define OPENVDB_ASSERT(X)
Definition Assert.h:41
Definition StreamCompression.h:34
@ COMPRESS_BLOSC
Definition Compression.h:56
@ COMPRESS_NONE
Definition Compression.h:53
@ COMPRESS_ACTIVE_MASK
Definition Compression.h:55
@ COMPRESS_ZIP
Definition Compression.h:54
size_t bloscToStreamSize(const char *data, size_t valSize, size_t numVals)
T truncateRealToHalf(const T &val)
Return the given value truncated to 16-bit float precision.
Definition Compression.h:216
size_t zipToStreamSize(const char *data, size_t numBytes)
void unzipFromStream(std::istream &, char *data, size_t numBytes)
void writeCompressedValues(std::ostream &os, const ValueT *srcBuf, Index srcCount, const MaskT &valueMask, const MaskT &childMask, bool toHalf, const ValueT *background=nullptr)
Definition Compression.h:622
void readCompressedValues(std::istream &is, ValueT *destBuf, Index destCount, const MaskT &valueMask, bool fromHalf, const ValueT *background=nullptr)
Definition Compression.h:450
void writeData(std::ostream &os, const T *data, Index count, uint32_t compression)
Definition Compression.h:347
void bloscFromStream(std::istream &, char *data, size_t numBytes)
void bloscToStream(std::ostream &, const char *data, size_t valSize, size_t numVals)
uint32_t getDataCompression(std::ios_base &)
Return a bitwise OR of compression option flags (COMPRESS_ZIP, COMPRESS_ACTIVE_MASK,...
void checkFormatVersion(std::ios_base &)
Throws an IoError if the file format version number is not supported.
uint32_t getFormatVersion(std::ios_base &)
Return the file format version number associated with the given input stream.
SharedPtr< StreamMetadata > getStreamMetadataPtr(std::ios_base &)
Return a shared pointer to an object that stores metadata (file format, compression scheme,...
std::string compressionToString(uint32_t flags)
Return a string describing the given compression flags.
@ MASK_AND_NO_INACTIVE_VALS
Definition Compression.h:72
@ MASK_AND_TWO_INACTIVE_VALS
Definition Compression.h:74
@ NO_MASK_AND_MINUS_BG
Definition Compression.h:70
@ NO_MASK_AND_ONE_INACTIVE_VAL
Definition Compression.h:71
@ MASK_AND_ONE_INACTIVE_VAL
Definition Compression.h:73
@ NO_MASK_AND_ALL_VALS
Definition Compression.h:75
@ NO_MASK_OR_INACTIVE_VALS
Definition Compression.h:69
void zipToStream(std::ostream &, const char *data, size_t numBytes)
size_t writeCompressedValuesSize(ValueT *srcBuf, Index srcCount, const MaskT &valueMask, uint8_t maskMetadata, bool toHalf, uint32_t compress)
Definition Compression.h:567
const void * getGridBackgroundValuePtr(std::ios_base &)
Return a pointer to the background value of the grid currently being read from or written to the give...
size_t writeDataSize(const T *data, Index count, uint32_t compression)
Definition Compression.h:310
void readData(std::istream &is, T *data, Index count, uint32_t compression)
Read data from a stream.
Definition Compression.h:242
Vec2< double > Vec2d
Definition Vec2.h:572
Vec2< float > Vec2s
Definition Vec2.h:571
Vec3< double > Vec3d
Definition Vec3.h:708
T negative(const T &val)
Return the unary negation of the given value.
Definition Math.h:139
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition Math.h:465
internal::half half
Definition HalfDecl.h:25
Vec3< float > Vec3s
Definition Vec3.h:707
Index32 Index
Definition Types.h:34
math::Vec2< Half > Vec2H
Definition Types.h:47
constexpr T zeroVal()
Return the value of type T that corresponds to zero.
Definition Math.h:71
@ OPENVDB_FILE_VERSION_NODE_MASK_COMPRESSION
Definition version.h.in:339
uint32_t Index32
Definition Types.h:32
uint64_t Index64
Definition Types.h:33
math::Vec3< Half > Vec3H
Definition Types.h:56
Definition Exceptions.h:13
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
static void read(std::istream &is, T *data, Index count, uint32_t compression)
Definition Compression.h:285
typename RealToHalf< T >::HalfT HalfT
Definition Compression.h:292
static void read(std::istream &is, T *data, Index count, uint32_t compression)
Definition Compression.h:293
Definition Compression.h:281
static size_t writeSize(const T *data, Index count, uint32_t compression)
Definition Compression.h:380
static void write(std::ostream &os, const T *data, Index count, uint32_t compression)
Definition Compression.h:383
static size_t writeSize(const T *data, Index count, uint32_t compression)
Definition Compression.h:391
typename RealToHalf< T >::HalfT HalfT
Definition Compression.h:390
static void write(std::ostream &os, const T *data, Index count, uint32_t compression)
Definition Compression.h:398
Definition Compression.h:376
Definition Compression.h:81
int8_t metadata
Definition Compression.h:162
MaskCompress(const MaskT &valueMask, const MaskT &childMask, const ValueT *srcBuf, const ValueT &background)
Definition Compression.h:87
static bool eq(const ValueT &a, const ValueT &b)
Definition Compression.h:83
ValueT inactiveVal[2]
Definition Compression.h:163
Vec2H HalfT
Definition Compression.h:196
@ isReal
Definition Compression.h:195
static HalfT convert(const Vec2d &val)
Definition Compression.h:198
Vec2H HalfT
Definition Compression.h:191
@ isReal
Definition Compression.h:190
static HalfT convert(const Vec2s &val)
Definition Compression.h:192
@ isReal
Definition Compression.h:206
Vec3H HalfT
Definition Compression.h:207
static HalfT convert(const Vec3d &val)
Definition Compression.h:209
Vec3H HalfT
Definition Compression.h:202
@ isReal
Definition Compression.h:201
static HalfT convert(const Vec3s &val)
Definition Compression.h:203
math::half HalfT
Definition Compression.h:185
@ isReal
Definition Compression.h:184
static HalfT convert(double val)
Definition Compression.h:187
static HalfT convert(float val)
Definition Compression.h:181
@ isReal
Definition Compression.h:179
math::half HalfT
Definition Compression.h:180
RealToHalf and its specializations define a mapping from floating-point data types to analogous half ...
Definition Compression.h:173
@ isReal
Definition Compression.h:174
T HalfT
Definition Compression.h:175
static HalfT convert(const T &val)
Definition Compression.h:176
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition version.h.in:121
#define OPENVDB_USE_VERSION_NAMESPACE
Definition version.h.in:291