mirror of
https://github.com/bkaradzic/bimg.git
synced 2026-02-17 20:52:38 +01:00
Updated tinyexr.
This commit is contained in:
178
3rdparty/tinyexr/tinyexr.h
vendored
178
3rdparty/tinyexr/tinyexr.h
vendored
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2014 - 2018, Syoyo Fujita
|
Copyright (c) 2014 - 2018, Syoyo Fujita and many contributors.
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
@@ -431,9 +431,9 @@ extern int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <limits>
|
|
||||||
|
|
||||||
#if __cplusplus > 199711L
|
#if __cplusplus > 199711L
|
||||||
// C++11
|
// C++11
|
||||||
@@ -2922,9 +2922,8 @@ void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len,
|
|||||||
tinfl_status status = tinfl_decompress(
|
tinfl_status status = tinfl_decompress(
|
||||||
&decomp, (const mz_uint8 *)pSrc_buf + src_buf_ofs, &src_buf_size,
|
&decomp, (const mz_uint8 *)pSrc_buf + src_buf_ofs, &src_buf_size,
|
||||||
(mz_uint8 *)pBuf, pBuf ? (mz_uint8 *)pBuf + *pOut_len : NULL,
|
(mz_uint8 *)pBuf, pBuf ? (mz_uint8 *)pBuf + *pOut_len : NULL,
|
||||||
&dst_buf_size,
|
&dst_buf_size, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) |
|
||||||
(flags & ~TINFL_FLAG_HAS_MORE_INPUT) |
|
TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);
|
||||||
TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);
|
|
||||||
if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) {
|
if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) {
|
||||||
MZ_FREE(pBuf);
|
MZ_FREE(pBuf);
|
||||||
*pOut_len = 0;
|
*pOut_len = 0;
|
||||||
@@ -3571,10 +3570,9 @@ static int tdefl_flush_block(tdefl_compressor *d, int flush) {
|
|||||||
mz_uint saved_bit_buf, saved_bits_in;
|
mz_uint saved_bit_buf, saved_bits_in;
|
||||||
mz_uint8 *pSaved_output_buf;
|
mz_uint8 *pSaved_output_buf;
|
||||||
mz_bool comp_block_succeeded = MZ_FALSE;
|
mz_bool comp_block_succeeded = MZ_FALSE;
|
||||||
int n,
|
int n, use_raw_block =
|
||||||
use_raw_block =
|
((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) &&
|
||||||
((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) &&
|
(d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size;
|
||||||
(d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size;
|
|
||||||
mz_uint8 *pOutput_buf_start =
|
mz_uint8 *pOutput_buf_start =
|
||||||
((d->m_pPut_buf_func == NULL) &&
|
((d->m_pPut_buf_func == NULL) &&
|
||||||
((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE))
|
((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE))
|
||||||
@@ -3604,9 +3602,8 @@ static int tdefl_flush_block(tdefl_compressor *d, int flush) {
|
|||||||
|
|
||||||
if (!use_raw_block)
|
if (!use_raw_block)
|
||||||
comp_block_succeeded =
|
comp_block_succeeded =
|
||||||
tdefl_compress_block(d,
|
tdefl_compress_block(d, (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) ||
|
||||||
(d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) ||
|
(d->m_total_lz_bytes < 48));
|
||||||
(d->m_total_lz_bytes < 48));
|
|
||||||
|
|
||||||
// If the block gets expanded, forget the current contents of the output
|
// If the block gets expanded, forget the current contents of the output
|
||||||
// buffer and send a raw block instead.
|
// buffer and send a raw block instead.
|
||||||
@@ -5251,10 +5248,9 @@ mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index,
|
|||||||
n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS);
|
n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS);
|
||||||
n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1);
|
n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1);
|
||||||
pStat->m_comment_size = n;
|
pStat->m_comment_size = n;
|
||||||
memcpy(pStat->m_comment,
|
memcpy(pStat->m_comment, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +
|
||||||
p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +
|
MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) +
|
||||||
MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) +
|
MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS),
|
||||||
MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS),
|
|
||||||
n);
|
n);
|
||||||
pStat->m_comment[n] = '\0';
|
pStat->m_comment[n] = '\0';
|
||||||
|
|
||||||
@@ -7133,7 +7129,6 @@ static const char *ReadString(std::string *s, const char *ptr, size_t len) {
|
|||||||
return q + 1; // skip '\0'
|
return q + 1; // skip '\0'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool ReadAttribute(std::string *name, std::string *type,
|
static bool ReadAttribute(std::string *name, std::string *type,
|
||||||
std::vector<unsigned char> *data, size_t *marker_size,
|
std::vector<unsigned char> *data, size_t *marker_size,
|
||||||
const char *marker, size_t size) {
|
const char *marker, size_t size) {
|
||||||
@@ -7268,13 +7263,13 @@ static bool ReadChannelInfo(std::vector<ChannelInfo> &channels,
|
|||||||
}
|
}
|
||||||
ChannelInfo info;
|
ChannelInfo info;
|
||||||
|
|
||||||
tinyexr_int64 data_len = static_cast<tinyexr_int64>(data.size()) - (p - reinterpret_cast<const char *>(data.data()));
|
tinyexr_int64 data_len = static_cast<tinyexr_int64>(data.size()) -
|
||||||
|
(p - reinterpret_cast<const char *>(data.data()));
|
||||||
if (data_len < 0) {
|
if (data_len < 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = ReadString(
|
p = ReadString(&info.name, p, size_t(data_len));
|
||||||
&info.name, p, size_t(data_len));
|
|
||||||
if ((p == NULL) && (info.name.empty())) {
|
if ((p == NULL) && (info.name.empty())) {
|
||||||
// Buffer overrun. Issue #51.
|
// Buffer overrun. Issue #51.
|
||||||
return false;
|
return false;
|
||||||
@@ -9590,9 +9585,9 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
|
|||||||
|
|
||||||
unsigned long dstLen = static_cast<unsigned long>(outBuf.size());
|
unsigned long dstLen = static_cast<unsigned long>(outBuf.size());
|
||||||
assert(dstLen > 0);
|
assert(dstLen > 0);
|
||||||
if (!tinyexr::DecompressZip(reinterpret_cast<unsigned char *>(&outBuf.at(0)),
|
if (!tinyexr::DecompressZip(
|
||||||
&dstLen, data_ptr,
|
reinterpret_cast<unsigned char *>(&outBuf.at(0)), &dstLen, data_ptr,
|
||||||
static_cast<unsigned long>(data_len))) {
|
static_cast<unsigned long>(data_len))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -10492,7 +10487,7 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,
|
|||||||
&channel_offset, num_channels,
|
&channel_offset, num_channels,
|
||||||
exr_header->channels);
|
exr_header->channels);
|
||||||
|
|
||||||
bool invalid_data = false; // TODO(LTE): Use atomic lock for MT safety.
|
bool invalid_data = false; // TODO(LTE): Use atomic lock for MT safety.
|
||||||
|
|
||||||
if (exr_header->tiled) {
|
if (exr_header->tiled) {
|
||||||
size_t num_tiles = offsets.size(); // = # of blocks
|
size_t num_tiles = offsets.size(); // = # of blocks
|
||||||
@@ -10504,7 +10499,7 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,
|
|||||||
// Allocate memory for each tile.
|
// Allocate memory for each tile.
|
||||||
exr_image->tiles[tile_idx].images = tinyexr::AllocateImage(
|
exr_image->tiles[tile_idx].images = tinyexr::AllocateImage(
|
||||||
num_channels, exr_header->channels, exr_header->requested_pixel_types,
|
num_channels, exr_header->channels, exr_header->requested_pixel_types,
|
||||||
exr_header->tile_size_x, exr_header->tile_size_y);
|
exr_header->tile_size_x, exr_header->tile_size_y);
|
||||||
|
|
||||||
// 16 byte: tile coordinates
|
// 16 byte: tile coordinates
|
||||||
// 4 byte : data size
|
// 4 byte : data size
|
||||||
@@ -10580,7 +10575,6 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,
|
|||||||
if (offsets[y_idx] + sizeof(int) * 2 > size) {
|
if (offsets[y_idx] + sizeof(int) * 2 > size) {
|
||||||
invalid_data = true;
|
invalid_data = true;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// 4 byte: scan line
|
// 4 byte: scan line
|
||||||
// 4 byte: data size
|
// 4 byte: data size
|
||||||
// ~ : pixel data(uncompressed or compressed)
|
// ~ : pixel data(uncompressed or compressed)
|
||||||
@@ -10598,17 +10592,15 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,
|
|||||||
if (size_t(data_len) > data_size) {
|
if (size_t(data_len) > data_size) {
|
||||||
invalid_data = true;
|
invalid_data = true;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
int end_line_no = (std::min)(line_no + num_scanline_blocks,
|
int end_line_no = (std::min)(line_no + num_scanline_blocks,
|
||||||
(exr_header->data_window[3] + 1));
|
(exr_header->data_window[3] + 1));
|
||||||
|
|
||||||
int num_lines = end_line_no - line_no;
|
int num_lines = end_line_no - line_no;
|
||||||
//assert(num_lines > 0);
|
// assert(num_lines > 0);
|
||||||
|
|
||||||
if (num_lines <= 0) {
|
if (num_lines <= 0) {
|
||||||
invalid_data = true;
|
invalid_data = true;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// Move to data addr: 8 = 4 + 4;
|
// Move to data addr: 8 = 4 + 4;
|
||||||
data_ptr += 8;
|
data_ptr += 8;
|
||||||
|
|
||||||
@@ -10619,14 +10611,15 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header,
|
|||||||
invalid_data = true;
|
invalid_data = true;
|
||||||
} else {
|
} else {
|
||||||
if (!tinyexr::DecodePixelData(
|
if (!tinyexr::DecodePixelData(
|
||||||
exr_image->images, exr_header->requested_pixel_types, data_ptr,
|
exr_image->images, exr_header->requested_pixel_types,
|
||||||
static_cast<size_t>(data_len), exr_header->compression_type,
|
data_ptr, static_cast<size_t>(data_len),
|
||||||
exr_header->line_order, data_width, data_height, data_width, y,
|
exr_header->compression_type, exr_header->line_order,
|
||||||
line_no, num_lines, static_cast<size_t>(pixel_data_size),
|
data_width, data_height, data_width, y, line_no,
|
||||||
static_cast<size_t>(exr_header->num_custom_attributes),
|
num_lines, static_cast<size_t>(pixel_data_size),
|
||||||
exr_header->custom_attributes,
|
static_cast<size_t>(exr_header->num_custom_attributes),
|
||||||
static_cast<size_t>(exr_header->num_channels), exr_header->channels,
|
exr_header->custom_attributes,
|
||||||
channel_offset_list)) {
|
static_cast<size_t>(exr_header->num_channels),
|
||||||
|
exr_header->channels, channel_offset_list)) {
|
||||||
invalid_data = true;
|
invalid_data = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -10729,6 +10722,7 @@ static int DecodeEXRImage(EXRImage *exr_image, const EXRHeader *exr_header,
|
|||||||
}
|
}
|
||||||
return TINYEXR_ERROR_INVALID_DATA;
|
return TINYEXR_ERROR_INVALID_DATA;
|
||||||
}
|
}
|
||||||
|
data_height++;
|
||||||
|
|
||||||
if ((data_width < 0) || (data_height < 0)) {
|
if ((data_width < 0) || (data_height < 0)) {
|
||||||
if (err) {
|
if (err) {
|
||||||
@@ -10883,10 +10877,9 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename,
|
|||||||
if ((idxA == 0) && (idxR == -1) && (idxG == -1) && (idxB == -1)) {
|
if ((idxA == 0) && (idxR == -1) && (idxG == -1) && (idxB == -1)) {
|
||||||
// Alpha channel only.
|
// Alpha channel only.
|
||||||
|
|
||||||
if( exr_header.tiled )
|
if (exr_header.tiled) {
|
||||||
{
|
// todo.implement this
|
||||||
//todo.implement this
|
}
|
||||||
}
|
|
||||||
(*out_rgba) = reinterpret_cast<float *>(
|
(*out_rgba) = reinterpret_cast<float *>(
|
||||||
malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) *
|
malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) *
|
||||||
static_cast<size_t>(exr_image.height)));
|
static_cast<size_t>(exr_image.height)));
|
||||||
@@ -10928,50 +10921,55 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename,
|
|||||||
(*out_rgba) = reinterpret_cast<float *>(
|
(*out_rgba) = reinterpret_cast<float *>(
|
||||||
malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) *
|
malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) *
|
||||||
static_cast<size_t>(exr_image.height)));
|
static_cast<size_t>(exr_image.height)));
|
||||||
if( exr_header.tiled )
|
if (exr_header.tiled) {
|
||||||
{
|
for (int it = 0; it < exr_image.num_tiles; it++) {
|
||||||
for(int it=0; it<exr_image.num_tiles; it++)
|
for (int j = 0; j < exr_header.tile_size_y; j++)
|
||||||
{
|
for (int i = 0; i < exr_header.tile_size_x; i++) {
|
||||||
for(int j=0; j<exr_header.tile_size_y; j++)
|
const int ii =
|
||||||
for(int i=0; i<exr_header.tile_size_x; i++)
|
exr_image.tiles[it].offset_x * exr_header.tile_size_x + i;
|
||||||
{
|
const int jj =
|
||||||
const int ii = exr_image.tiles[it].offset_x*exr_header.tile_size_x + i;
|
exr_image.tiles[it].offset_y * exr_header.tile_size_y + j;
|
||||||
const int jj = exr_image.tiles[it].offset_y*exr_header.tile_size_y + j;
|
const int idx = ii + jj * exr_image.width;
|
||||||
const int idx = ii + jj*exr_image.width;
|
|
||||||
const int srcIdx = i + j*exr_header.tile_size_x;
|
// out of region check.
|
||||||
unsigned char **src = exr_image.tiles[it].images;
|
if (ii >= exr_image.width) {
|
||||||
(*out_rgba)[4 * idx + 0] =
|
continue;
|
||||||
reinterpret_cast<float **>(src)[idxR][srcIdx];
|
}
|
||||||
(*out_rgba)[4 * idx + 1] =
|
if (jj >= exr_image.height) {
|
||||||
reinterpret_cast<float **>(src)[idxG][srcIdx];
|
continue;
|
||||||
(*out_rgba)[4 * idx + 2] =
|
}
|
||||||
reinterpret_cast<float **>(src)[idxB][srcIdx];
|
const int srcIdx = i + j * exr_header.tile_size_x;
|
||||||
if (idxA != -1) {
|
unsigned char **src = exr_image.tiles[it].images;
|
||||||
(*out_rgba)[4 * idx + 3] =
|
(*out_rgba)[4 * idx + 0] =
|
||||||
reinterpret_cast<float **>(src)[idxA][srcIdx];
|
reinterpret_cast<float **>(src)[idxR][srcIdx];
|
||||||
} else {
|
(*out_rgba)[4 * idx + 1] =
|
||||||
(*out_rgba)[4 * idx + 3] = 1.0;
|
reinterpret_cast<float **>(src)[idxG][srcIdx];
|
||||||
}
|
(*out_rgba)[4 * idx + 2] =
|
||||||
}
|
reinterpret_cast<float **>(src)[idxB][srcIdx];
|
||||||
}
|
if (idxA != -1) {
|
||||||
}
|
(*out_rgba)[4 * idx + 3] =
|
||||||
else
|
reinterpret_cast<float **>(src)[idxA][srcIdx];
|
||||||
{
|
} else {
|
||||||
for (int i = 0; i < exr_image.width * exr_image.height; i++) {
|
(*out_rgba)[4 * idx + 3] = 1.0;
|
||||||
(*out_rgba)[4 * i + 0] =
|
}
|
||||||
reinterpret_cast<float **>(exr_image.images)[idxR][i];
|
}
|
||||||
(*out_rgba)[4 * i + 1] =
|
}
|
||||||
reinterpret_cast<float **>(exr_image.images)[idxG][i];
|
} else {
|
||||||
(*out_rgba)[4 * i + 2] =
|
for (int i = 0; i < exr_image.width * exr_image.height; i++) {
|
||||||
reinterpret_cast<float **>(exr_image.images)[idxB][i];
|
(*out_rgba)[4 * i + 0] =
|
||||||
if (idxA != -1) {
|
reinterpret_cast<float **>(exr_image.images)[idxR][i];
|
||||||
(*out_rgba)[4 * i + 3] =
|
(*out_rgba)[4 * i + 1] =
|
||||||
reinterpret_cast<float **>(exr_image.images)[idxA][i];
|
reinterpret_cast<float **>(exr_image.images)[idxG][i];
|
||||||
} else {
|
(*out_rgba)[4 * i + 2] =
|
||||||
(*out_rgba)[4 * i + 3] = 1.0;
|
reinterpret_cast<float **>(exr_image.images)[idxB][i];
|
||||||
|
if (idxA != -1) {
|
||||||
|
(*out_rgba)[4 * i + 3] =
|
||||||
|
reinterpret_cast<float **>(exr_image.images)[idxA][i];
|
||||||
|
} else {
|
||||||
|
(*out_rgba)[4 * i + 3] = 1.0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
(*width) = exr_image.width;
|
(*width) = exr_image.width;
|
||||||
@@ -12034,8 +12032,9 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) {
|
|||||||
unsigned long dstLen =
|
unsigned long dstLen =
|
||||||
static_cast<unsigned long>(pixelOffsetTable.size() * sizeof(int));
|
static_cast<unsigned long>(pixelOffsetTable.size() * sizeof(int));
|
||||||
if (!tinyexr::DecompressZip(
|
if (!tinyexr::DecompressZip(
|
||||||
reinterpret_cast<unsigned char *>(&pixelOffsetTable.at(0)), &dstLen,
|
reinterpret_cast<unsigned char *>(&pixelOffsetTable.at(0)),
|
||||||
data_ptr + 28, static_cast<unsigned long>(packedOffsetTableSize))) {
|
&dstLen, data_ptr + 28,
|
||||||
|
static_cast<unsigned long>(packedOffsetTableSize))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -12053,9 +12052,9 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) {
|
|||||||
unsigned long dstLen = static_cast<unsigned long>(unpackedSampleDataSize);
|
unsigned long dstLen = static_cast<unsigned long>(unpackedSampleDataSize);
|
||||||
if (dstLen) {
|
if (dstLen) {
|
||||||
if (!tinyexr::DecompressZip(
|
if (!tinyexr::DecompressZip(
|
||||||
reinterpret_cast<unsigned char *>(&sample_data.at(0)), &dstLen,
|
reinterpret_cast<unsigned char *>(&sample_data.at(0)), &dstLen,
|
||||||
data_ptr + 28 + packedOffsetTableSize,
|
data_ptr + 28 + packedOffsetTableSize,
|
||||||
static_cast<unsigned long>(packedSampleDataSize))) {
|
static_cast<unsigned long>(packedSampleDataSize))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
assert(dstLen == static_cast<unsigned long>(unpackedSampleDataSize));
|
assert(dstLen == static_cast<unsigned long>(unpackedSampleDataSize));
|
||||||
@@ -12770,9 +12769,8 @@ int SaveEXR(const float *data, int width, int height, int components,
|
|||||||
|
|
||||||
#ifdef __clang__
|
#ifdef __clang__
|
||||||
// zero-as-null-ppinter-constant
|
// zero-as-null-ppinter-constant
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif // TINYEXR_IMPLEMENTATION_DEIFNED
|
#endif // TINYEXR_IMPLEMENTATION_DEIFNED
|
||||||
#endif // TINYEXR_IMPLEMENTATION
|
#endif // TINYEXR_IMPLEMENTATION
|
||||||
|
|||||||
Reference in New Issue
Block a user