IBinaryBufferSP VKTS_APIENTRY binaryBufferCreate(const uint8_t* data, const size_t size) { if (!data || size == 0) { return IBinaryBufferSP(); } return IBinaryBufferSP(new BinaryBuffer(data, size)); }
IBinaryBufferSP VKTS_APIENTRY commonSerializeStructureType(const void* ptr) { if (!ptr) { return IBinaryBufferSP(); } size_t totalSize = 0; const VkTsStructureTypeHeader* sourceStructureTypeHeader = (const VkTsStructureTypeHeader*) ptr; while (sourceStructureTypeHeader) { totalSize += commonGetStructureTypeSize(sourceStructureTypeHeader); sourceStructureTypeHeader = (const VkTsStructureTypeHeader*) sourceStructureTypeHeader->pNext; } // std::unique_ptr<uint8_t[]> data = std::unique_ptr<uint8_t[]>(new uint8_t[totalSize]); if (!data.get()) { return IBinaryBufferSP(); } // sourceStructureTypeHeader = (const VkTsStructureTypeHeader*) ptr; VkTsStructureTypeHeader* targetStructureTypeHeader = nullptr; size_t currentSize = 0; size_t currentOffset = 0; while (sourceStructureTypeHeader) { targetStructureTypeHeader = (VkTsStructureTypeHeader*) &data[currentOffset]; currentSize = commonGetStructureTypeSize(sourceStructureTypeHeader); memcpy(targetStructureTypeHeader, sourceStructureTypeHeader, currentSize); currentOffset += currentSize; if (sourceStructureTypeHeader->pNext) { targetStructureTypeHeader->pNext = &data[currentOffset]; } sourceStructureTypeHeader = (const VkTsStructureTypeHeader*) sourceStructureTypeHeader->pNext; } return binaryBufferCreate(&data[0], totalSize); }
IBinaryBufferSP VKTS_APIENTRY binaryBufferCreate(const uint8_t* data, const size_t size) { if (!data || size == 0) { return IBinaryBufferSP(); } auto result = IBinaryBufferSP(new BinaryBuffer(data, size)); if (result.get() && result->getSize() != size) { return IBinaryBufferSP(); } return result; }
ImageData::ImageData(const std::string& name, const VkImageType imageType, const VkFormat& format, const VkExtent3D& extent, const uint32_t mipLevels, const uint8_t* data, const size_t size) : IImageData(), name(name), imageType(imageType), format(format), extent(extent), mipLevels(mipLevels) { buffer = IBinaryBufferSP(new BinaryBuffer(data, size)); if (!buffer.get() || !buffer->getData()) { reset(); } UNORM = commonIsUNORM(format); SFLOAT = commonIsSFLOAT(format); bytesPerChannel = commonGetBytesPerChannel(format); numberChannels = commonGetNumberChannels(format); }
IBinaryBufferSP VKTS_APIENTRY fileLoadBinary(const char* filename) { if (!filename) { return IBinaryBufferSP(); } // if (!_filePrepareLoadBinary(filename)) { return IBinaryBufferSP(); } // FILE* file; std::string loadFilename = g_baseDirectory + std::string(filename); // file = fopen(loadFilename.c_str(), "rb"); if (!file) { return IBinaryBufferSP(); } if (fseek(file, 0, SEEK_END)) { fclose(file); return IBinaryBufferSP(); } int64_t length = ftell(file); if (length < 0) { fclose(file); return IBinaryBufferSP(); } size_t size = static_cast<size_t>(length); if (size == 0) { fclose(file); return IBinaryBufferSP(); } auto data = new uint8_t[size]; if (!data) { fclose(file); return IBinaryBufferSP(); } memset(data, 0, size); rewind(file); auto elementsRead = fread(data, 1, size, file); if (elementsRead != size) { delete[] data; fclose(file); return IBinaryBufferSP(); } fclose(file); auto buffer = IBinaryBufferSP(new BinaryBuffer(data, size)); delete[] data; return buffer; }