mirror of
https://github.com/bkaradzic/bimg.git
synced 2026-06-08 02:43:48 +00:00
Added ability to configure supported image format parsers. (#107)
* Added ability to configure supported image format parsers. * Added comments.
This commit is contained in:
committed by
GitHub
parent
5a79b67a49
commit
6c13a0c8a8
2
3rdparty/tinyexr/tinyexr.h
vendored
2
3rdparty/tinyexr/tinyexr.h
vendored
@@ -612,7 +612,7 @@ extern int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if TINYEXR_USE_MINIZ
|
#if TINYEXR_USE_MINIZ
|
||||||
#include <miniz.h>
|
#include <miniz/miniz.h>
|
||||||
#else
|
#else
|
||||||
// Issue #46. Please include your own zlib-compatible API header before
|
// Issue #46. Please include your own zlib-compatible API header before
|
||||||
// including `tinyexr.h`
|
// including `tinyexr.h`
|
||||||
|
|||||||
@@ -19,13 +19,12 @@ project "bimg_decode"
|
|||||||
includedirs {
|
includedirs {
|
||||||
path.join(BIMG_DIR, "include"),
|
path.join(BIMG_DIR, "include"),
|
||||||
path.join(BIMG_DIR, "3rdparty"),
|
path.join(BIMG_DIR, "3rdparty"),
|
||||||
path.join(BIMG_DIR, "3rdparty/tinyexr/deps/miniz"),
|
path.join(BIMG_DIR, "3rdparty/tinyexr/deps"),
|
||||||
}
|
}
|
||||||
|
|
||||||
files {
|
files {
|
||||||
path.join(BIMG_DIR, "include/**"),
|
path.join(BIMG_DIR, "include/**"),
|
||||||
path.join(BIMG_DIR, "src/image_decode.*"),
|
path.join(BIMG_DIR, "src/image_decode.*"),
|
||||||
path.join(BIMG_DIR, "3rdparty/tinyexr/deps/miniz/miniz.*"),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if _OPTIONS["with-libheif"] then
|
if _OPTIONS["with-libheif"] then
|
||||||
|
|||||||
66
src/config.h
66
src/config.h
@@ -8,6 +8,8 @@
|
|||||||
|
|
||||||
#include <bx/bx.h>
|
#include <bx/bx.h>
|
||||||
|
|
||||||
|
// Decoders ---
|
||||||
|
|
||||||
#ifndef BIMG_CONFIG_DECODE_ENABLE
|
#ifndef BIMG_CONFIG_DECODE_ENABLE
|
||||||
# define BIMG_CONFIG_DECODE_ENABLE 1
|
# define BIMG_CONFIG_DECODE_ENABLE 1
|
||||||
#endif // BIMG_CONFIG_DECODE_ENABLE
|
#endif // BIMG_CONFIG_DECODE_ENABLE
|
||||||
@@ -56,20 +58,78 @@
|
|||||||
# define BIMG_CONFIG_DECODE_ETC2 BIMG_CONFIG_DECODE_ENABLE
|
# define BIMG_CONFIG_DECODE_ETC2 BIMG_CONFIG_DECODE_ENABLE
|
||||||
#endif // BIMG_CONFIG_DECODE_ETC2
|
#endif // BIMG_CONFIG_DECODE_ETC2
|
||||||
|
|
||||||
|
// Parsers ---
|
||||||
|
|
||||||
|
/// Enable or disable all image format parsers.
|
||||||
|
///
|
||||||
|
#ifndef BIMG_CONFIG_PARSE_ENABLE
|
||||||
|
# define BIMG_CONFIG_PARSE_ENABLE 1
|
||||||
|
#endif // BIMG_CONFIG_PARSE_ENABLE
|
||||||
|
|
||||||
|
/// BMP (Windows Bitmap) - uncompressed raster image format.
|
||||||
|
///
|
||||||
|
#ifndef BIMG_CONFIG_PARSE_BMP
|
||||||
|
# define BIMG_CONFIG_PARSE_BMP BIMG_CONFIG_PARSE_ENABLE
|
||||||
|
#endif // BIMG_CONFIG_PARSE_BMP
|
||||||
|
|
||||||
|
/// EXR (OpenEXR) - high dynamic range image format by ILM.
|
||||||
|
///
|
||||||
#ifndef BIMG_CONFIG_PARSE_EXR
|
#ifndef BIMG_CONFIG_PARSE_EXR
|
||||||
# define BIMG_CONFIG_PARSE_EXR 1
|
# define BIMG_CONFIG_PARSE_EXR BIMG_CONFIG_PARSE_ENABLE
|
||||||
#endif // BIMG_CONFIG_PARSE_EXR
|
#endif // BIMG_CONFIG_PARSE_EXR
|
||||||
|
|
||||||
|
/// GIF (Graphics Interchange Format) - indexed-color image format with animation support.
|
||||||
|
///
|
||||||
|
#ifndef BIMG_CONFIG_PARSE_GIF
|
||||||
|
# define BIMG_CONFIG_PARSE_GIF BIMG_CONFIG_PARSE_ENABLE
|
||||||
|
#endif // BIMG_CONFIG_PARSE_GIF
|
||||||
|
|
||||||
|
/// HDR (Radiance RGBE) - high dynamic range image format.
|
||||||
|
///
|
||||||
|
#ifndef BIMG_CONFIG_PARSE_HDR
|
||||||
|
# define BIMG_CONFIG_PARSE_HDR BIMG_CONFIG_PARSE_ENABLE
|
||||||
|
#endif // BIMG_CONFIG_PARSE_HDR
|
||||||
|
|
||||||
|
/// HEIF (High Efficiency Image File Format) - modern image format based on HEVC.
|
||||||
|
///
|
||||||
#ifndef BIMG_CONFIG_PARSE_HEIF
|
#ifndef BIMG_CONFIG_PARSE_HEIF
|
||||||
# define BIMG_CONFIG_PARSE_HEIF 0
|
# define BIMG_CONFIG_PARSE_HEIF 0
|
||||||
#endif // BIMG_CONFIG_PARSE_HEIF
|
#endif // BIMG_CONFIG_PARSE_HEIF
|
||||||
|
|
||||||
|
/// JPEG (Joint Photographic Experts Group) - lossy compressed image format.
|
||||||
|
///
|
||||||
#ifndef BIMG_CONFIG_PARSE_JPEG
|
#ifndef BIMG_CONFIG_PARSE_JPEG
|
||||||
# define BIMG_CONFIG_PARSE_JPEG 1
|
# define BIMG_CONFIG_PARSE_JPEG BIMG_CONFIG_PARSE_ENABLE
|
||||||
#endif // BIMG_CONFIG_PARSE_JPEG
|
#endif // BIMG_CONFIG_PARSE_JPEG
|
||||||
|
|
||||||
|
/// PIC (Softimage) - image format used by Softimage 3D tools.
|
||||||
|
///
|
||||||
|
#ifndef BIMG_CONFIG_PARSE_PIC
|
||||||
|
# define BIMG_CONFIG_PARSE_PIC BIMG_CONFIG_PARSE_ENABLE
|
||||||
|
#endif // BIMG_CONFIG_PARSE_PIC
|
||||||
|
|
||||||
|
/// PNG (Portable Network Graphics) - lossless compressed image format.
|
||||||
|
///
|
||||||
#ifndef BIMG_CONFIG_PARSE_PNG
|
#ifndef BIMG_CONFIG_PARSE_PNG
|
||||||
# define BIMG_CONFIG_PARSE_PNG 1
|
# define BIMG_CONFIG_PARSE_PNG BIMG_CONFIG_PARSE_ENABLE
|
||||||
#endif // BIMG_CONFIG_PARSE_PNG
|
#endif // BIMG_CONFIG_PARSE_PNG
|
||||||
|
|
||||||
|
/// PNM (Portable Any Map) - family of simple image formats (PBM, PGM, PPM).
|
||||||
|
///
|
||||||
|
#ifndef BIMG_CONFIG_PARSE_PNM
|
||||||
|
# define BIMG_CONFIG_PARSE_PNM BIMG_CONFIG_PARSE_ENABLE
|
||||||
|
#endif // BIMG_CONFIG_PARSE_PNM
|
||||||
|
|
||||||
|
/// PSD (Adobe Photoshop Document) - layered image format.
|
||||||
|
///
|
||||||
|
#ifndef BIMG_CONFIG_PARSE_PSD
|
||||||
|
# define BIMG_CONFIG_PARSE_PSD BIMG_CONFIG_PARSE_ENABLE
|
||||||
|
#endif // BIMG_CONFIG_PARSE_PSD
|
||||||
|
|
||||||
|
/// TGA (Truevision TGA) - raster image format with optional RLE compression.
|
||||||
|
///
|
||||||
|
#ifndef BIMG_CONFIG_PARSE_TGA
|
||||||
|
# define BIMG_CONFIG_PARSE_TGA BIMG_CONFIG_PARSE_ENABLE
|
||||||
|
#endif // BIMG_CONFIG_PARSE_TGA
|
||||||
|
|
||||||
#endif // BIMG_CONFIG_H_HEADER_GUARD
|
#endif // BIMG_CONFIG_H_HEADER_GUARD
|
||||||
|
|||||||
@@ -256,7 +256,7 @@ namespace bimg
|
|||||||
{
|
{
|
||||||
return _format != TextureFormat::Unknown
|
return _format != TextureFormat::Unknown
|
||||||
&& _format != TextureFormat::UnknownDepth
|
&& _format != TextureFormat::UnknownDepth
|
||||||
&& _format != TextureFormat::Count
|
&& _format < TextureFormat::Count
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wunused-function")
|
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wunused-function")
|
||||||
|
|
||||||
|
#if BIMG_CONFIG_PARSE_EXR
|
||||||
BX_PRAGMA_DIAGNOSTIC_PUSH()
|
BX_PRAGMA_DIAGNOSTIC_PUSH()
|
||||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wtype-limits")
|
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wtype-limits")
|
||||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wunused-parameter")
|
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wunused-parameter")
|
||||||
@@ -19,8 +20,10 @@ BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4505) // warning C4505: 'tinyexr::miniz::def_r
|
|||||||
#define MINIZ_NO_ARCHIVE_APIS
|
#define MINIZ_NO_ARCHIVE_APIS
|
||||||
#define MINIZ_NO_STDIO
|
#define MINIZ_NO_STDIO
|
||||||
#define TINYEXR_IMPLEMENTATION
|
#define TINYEXR_IMPLEMENTATION
|
||||||
|
#include <miniz/miniz.c>
|
||||||
#include <tinyexr/tinyexr.h>
|
#include <tinyexr/tinyexr.h>
|
||||||
BX_PRAGMA_DIAGNOSTIC_POP()
|
BX_PRAGMA_DIAGNOSTIC_POP()
|
||||||
|
#endif // BIMG_CONFIG_PARSE_EXR
|
||||||
|
|
||||||
#if BIMG_CONFIG_PARSE_PNG
|
#if BIMG_CONFIG_PARSE_PNG
|
||||||
BX_PRAGMA_DIAGNOSTIC_PUSH();
|
BX_PRAGMA_DIAGNOSTIC_PUSH();
|
||||||
@@ -34,11 +37,6 @@ BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4334) // warning C4334: '<<' : result of 32 -
|
|||||||
#define LODEPNG_NO_COMPILE_CPP
|
#define LODEPNG_NO_COMPILE_CPP
|
||||||
#include <lodepng/lodepng.cpp>
|
#include <lodepng/lodepng.cpp>
|
||||||
BX_PRAGMA_DIAGNOSTIC_POP();
|
BX_PRAGMA_DIAGNOSTIC_POP();
|
||||||
#endif // BIMG_CONFIG_PARSE_PNG
|
|
||||||
|
|
||||||
#if BIMG_CONFIG_PARSE_HEIF
|
|
||||||
# include <libheif/heif.h>
|
|
||||||
#endif // BIMG_CONFIG_PARSE_HEIF
|
|
||||||
|
|
||||||
void* lodepng_malloc(size_t _size)
|
void* lodepng_malloc(size_t _size)
|
||||||
{
|
{
|
||||||
@@ -54,7 +52,23 @@ void lodepng_free(void* _ptr)
|
|||||||
{
|
{
|
||||||
::free(_ptr);
|
::free(_ptr);
|
||||||
}
|
}
|
||||||
|
#endif // BIMG_CONFIG_PARSE_PNG
|
||||||
|
|
||||||
|
#if BIMG_CONFIG_PARSE_HEIF
|
||||||
|
# include <libheif/heif.h>
|
||||||
|
#endif // BIMG_CONFIG_PARSE_HEIF
|
||||||
|
|
||||||
|
#define BIMG_USE_STB_IMAGE 0 \
|
||||||
|
|| BIMG_CONFIG_PARSE_JPEG \
|
||||||
|
|| BIMG_CONFIG_PARSE_BMP \
|
||||||
|
|| BIMG_CONFIG_PARSE_PSD \
|
||||||
|
|| BIMG_CONFIG_PARSE_TGA \
|
||||||
|
|| BIMG_CONFIG_PARSE_GIF \
|
||||||
|
|| BIMG_CONFIG_PARSE_HDR \
|
||||||
|
|| BIMG_CONFIG_PARSE_PIC \
|
||||||
|
|| 0
|
||||||
|
|
||||||
|
#if BIMG_USE_STB_IMAGE
|
||||||
BX_PRAGMA_DIAGNOSTIC_PUSH();
|
BX_PRAGMA_DIAGNOSTIC_PUSH();
|
||||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wint-to-pointer-cast")
|
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wint-to-pointer-cast")
|
||||||
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wmissing-field-initializers");
|
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wmissing-field-initializers");
|
||||||
@@ -71,8 +85,47 @@ BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4505); // unreferenced function with internal
|
|||||||
#define STBI_FREE(_ptr) lodepng_free(_ptr)
|
#define STBI_FREE(_ptr) lodepng_free(_ptr)
|
||||||
#define STB_IMAGE_IMPLEMENTATION
|
#define STB_IMAGE_IMPLEMENTATION
|
||||||
#define STB_IMAGE_STATIC
|
#define STB_IMAGE_STATIC
|
||||||
|
#define STBI_NO_PNG // supported via LODEPNG
|
||||||
|
|
||||||
|
#if !BIMG_CONFIG_PARSE_JPEG
|
||||||
|
# define STBI_NO_JPEG
|
||||||
|
#endif // !BIMG_CONFIG_PARSE_JPEG
|
||||||
|
|
||||||
|
#if !BIMG_CONFIG_PARSE_BMP
|
||||||
|
# define STBI_NO_BMP
|
||||||
|
#endif // !BIMG_CONFIG_PARSE_BMP
|
||||||
|
|
||||||
|
#if !BIMG_CONFIG_PARSE_PSD
|
||||||
|
# define STBI_NO_PSD
|
||||||
|
#endif // !BIMG_CONFIG_PARSE_PSD
|
||||||
|
|
||||||
|
#if !BIMG_CONFIG_PARSE_PSD
|
||||||
|
# define STBI_NO_PSD
|
||||||
|
#endif // !BIMG_CONFIG_PARSE_PSD
|
||||||
|
|
||||||
|
#if !BIMG_CONFIG_PARSE_TGA
|
||||||
|
# define STBI_NO_TGA
|
||||||
|
#endif // !BIMG_CONFIG_PARSE_TGA
|
||||||
|
|
||||||
|
#if !BIMG_CONFIG_PARSE_GIF
|
||||||
|
# define STBI_NO_GIF
|
||||||
|
#endif // !BIMG_CONFIG_PARSE_GIF
|
||||||
|
|
||||||
|
#if !BIMG_CONFIG_PARSE_HDR
|
||||||
|
# define STBI_NO_HDR
|
||||||
|
#endif // !BIMG_CONFIG_PARSE_HDR
|
||||||
|
|
||||||
|
#if !BIMG_CONFIG_PARSE_PIC
|
||||||
|
# define STBI_NO_PIC
|
||||||
|
#endif // !BIMG_CONFIG_PARSE_PIC
|
||||||
|
|
||||||
|
#if !BIMG_CONFIG_PARSE_PNM
|
||||||
|
# define STBI_NO_PNM
|
||||||
|
#endif // !BIMG_CONFIG_PARSE_PNM
|
||||||
|
|
||||||
#include <stb/stb_image.h>
|
#include <stb/stb_image.h>
|
||||||
BX_PRAGMA_DIAGNOSTIC_POP();
|
BX_PRAGMA_DIAGNOSTIC_POP();
|
||||||
|
#endif // BIMG_USE_STB_IMAGE
|
||||||
|
|
||||||
namespace bimg
|
namespace bimg
|
||||||
{
|
{
|
||||||
@@ -437,11 +490,13 @@ namespace bimg
|
|||||||
|
|
||||||
return output;
|
return output;
|
||||||
#else
|
#else
|
||||||
|
BX_UNUSED(_allocator, _data, _size);
|
||||||
BX_ERROR_SET(_err, BIMG_ERROR, "PNG parsing is disabled (BIMG_CONFIG_PARSE_PNG).");
|
BX_ERROR_SET(_err, BIMG_ERROR, "PNG parsing is disabled (BIMG_CONFIG_PARSE_PNG).");
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif // BIMG_CONFIG_PARSE_PNG
|
#endif // BIMG_CONFIG_PARSE_PNG
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if BIMG_CONFIG_PARSE_EXR
|
||||||
static void errorSetTinyExr(int _result, bx::Error* _err)
|
static void errorSetTinyExr(int _result, bx::Error* _err)
|
||||||
{
|
{
|
||||||
switch (_result)
|
switch (_result)
|
||||||
@@ -461,11 +516,20 @@ namespace bimg
|
|||||||
default: BX_ERROR_SET(_err, BIMG_ERROR, "EXR: Failed to parse image."); break;
|
default: BX_ERROR_SET(_err, BIMG_ERROR, "EXR: Failed to parse image."); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif // BIMG_CONFIG_PARSE_EXR
|
||||||
|
|
||||||
static ImageContainer* imageParseTinyExr(bx::AllocatorI* _allocator, const void* _data, uint32_t _size, bx::Error* _err)
|
static ImageContainer* imageParseTinyExr(bx::AllocatorI* _allocator, const void* _data, uint32_t _size, bx::Error* _err)
|
||||||
{
|
{
|
||||||
BX_ERROR_SCOPE(_err);
|
BX_ERROR_SCOPE(_err);
|
||||||
|
|
||||||
|
static uint8_t exrMagic[] = { 0x76, 0x2f, 0x31, 0x01 };
|
||||||
|
|
||||||
|
if (0 != bx::memCmp(_data, exrMagic, sizeof(exrMagic) ) )
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if BIMG_CONFIG_PARSE_EXR
|
||||||
EXRVersion exrVersion;
|
EXRVersion exrVersion;
|
||||||
int result = ParseEXRVersionFromMemory(&exrVersion, (uint8_t*)_data, _size);
|
int result = ParseEXRVersionFromMemory(&exrVersion, (uint8_t*)_data, _size);
|
||||||
if (TINYEXR_SUCCESS != result)
|
if (TINYEXR_SUCCESS != result)
|
||||||
@@ -649,12 +713,18 @@ namespace bimg
|
|||||||
}
|
}
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
|
#else
|
||||||
|
BX_UNUSED(_allocator, _data, _size);
|
||||||
|
BX_ERROR_SET(_err, BIMG_ERROR, "EXR parsing is disabled (BIMG_CONFIG_PARSE_EXR).");
|
||||||
|
return NULL;
|
||||||
|
#endif // BIMG_CONFIG_PARSE_PNG
|
||||||
}
|
}
|
||||||
|
|
||||||
static ImageContainer* imageParseStbImage(bx::AllocatorI* _allocator, const void* _data, uint32_t _size, bx::Error* _err)
|
static ImageContainer* imageParseStbImage(bx::AllocatorI* _allocator, const void* _data, uint32_t _size, bx::Error* _err)
|
||||||
{
|
{
|
||||||
BX_ERROR_SCOPE(_err);
|
BX_ERROR_SCOPE(_err);
|
||||||
|
|
||||||
|
#if BIMG_USE_STB_IMAGE
|
||||||
const int isHdr = stbi_is_hdr_from_memory( (const uint8_t*)_data, (int)_size);
|
const int isHdr = stbi_is_hdr_from_memory( (const uint8_t*)_data, (int)_size);
|
||||||
|
|
||||||
void* data;
|
void* data;
|
||||||
@@ -705,18 +775,22 @@ namespace bimg
|
|||||||
stbi_image_free(data);
|
stbi_image_free(data);
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
|
#else
|
||||||
|
BX_UNUSED(_allocator, _data, _size);
|
||||||
|
return NULL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static ImageContainer* imageParseJpeg(bx::AllocatorI* _allocator, const void* _data, uint32_t _size, bx::Error* _err)
|
static ImageContainer* imageParseJpeg(bx::AllocatorI* _allocator, const void* _data, uint32_t _size, bx::Error* _err)
|
||||||
{
|
{
|
||||||
|
BX_ERROR_SCOPE(_err);
|
||||||
|
|
||||||
bx::MemoryReader reader(_data, _size);
|
bx::MemoryReader reader(_data, _size);
|
||||||
|
|
||||||
bx::Error err;
|
|
||||||
|
|
||||||
uint16_t magic = 0;
|
uint16_t magic = 0;
|
||||||
bx::readHE(&reader, magic, false, &err);
|
bx::readHE(&reader, magic, false, _err);
|
||||||
|
|
||||||
if (!err.isOk()
|
if (!_err->isOk()
|
||||||
|| 0xffd8 != magic)
|
|| 0xffd8 != magic)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -725,14 +799,14 @@ namespace bimg
|
|||||||
#if BIMG_CONFIG_PARSE_JPEG
|
#if BIMG_CONFIG_PARSE_JPEG
|
||||||
Orientation::Enum orientation = Orientation::R0;
|
Orientation::Enum orientation = Orientation::R0;
|
||||||
|
|
||||||
while (err.isOk() )
|
while (_err->isOk() )
|
||||||
{
|
{
|
||||||
bx::readHE(&reader, magic, false, &err);
|
bx::readHE(&reader, magic, false, _err);
|
||||||
|
|
||||||
uint16_t size;
|
uint16_t size;
|
||||||
bx::readHE(&reader, size, false, &err);
|
bx::readHE(&reader, size, false, _err);
|
||||||
|
|
||||||
if (!err.isOk() )
|
if (!_err->isOk() )
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -744,32 +818,32 @@ namespace bimg
|
|||||||
}
|
}
|
||||||
|
|
||||||
char exif00[6];
|
char exif00[6];
|
||||||
bx::read(&reader, exif00, 6, &err);
|
bx::read(&reader, exif00, 6, _err);
|
||||||
|
|
||||||
if (0 == bx::memCmp(exif00, "Exif\0\0", 6) )
|
if (0 == bx::memCmp(exif00, "Exif\0\0", 6) )
|
||||||
{
|
{
|
||||||
uint16_t iimm = 0;
|
uint16_t iimm = 0;
|
||||||
bx::read(&reader, iimm, &err);
|
bx::read(&reader, iimm, _err);
|
||||||
|
|
||||||
const bool littleEndian = iimm == 0x4949; //II - Intel - little endian
|
const bool littleEndian = iimm == 0x4949; //II - Intel - little endian
|
||||||
if (!err.isOk()
|
if (!_err->isOk()
|
||||||
&& !littleEndian
|
&& !littleEndian
|
||||||
&& iimm != 0x4d4d) // MM - Motorola - big endian
|
&& iimm != 0x4d4d) // MM - Motorola - big endian
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bx::readHE(&reader, magic, littleEndian, &err);
|
bx::readHE(&reader, magic, littleEndian, _err);
|
||||||
if (!err.isOk()
|
if (!_err->isOk()
|
||||||
|| 0x2a != magic)
|
|| 0x2a != magic)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t ifd0;
|
uint32_t ifd0;
|
||||||
bx::readHE(&reader, ifd0, littleEndian, &err);
|
bx::readHE(&reader, ifd0, littleEndian, _err);
|
||||||
|
|
||||||
if (!err.isOk()
|
if (!_err->isOk()
|
||||||
|| 8 > ifd0)
|
|| 8 > ifd0)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -778,25 +852,25 @@ namespace bimg
|
|||||||
bx::seek(&reader, ifd0-8);
|
bx::seek(&reader, ifd0-8);
|
||||||
|
|
||||||
uint16_t numEntries;
|
uint16_t numEntries;
|
||||||
bx::readHE(&reader, numEntries, littleEndian, &err);
|
bx::readHE(&reader, numEntries, littleEndian, _err);
|
||||||
|
|
||||||
for (uint32_t ii = 0; err.isOk() && ii < numEntries; ++ii)
|
for (uint32_t ii = 0; _err->isOk() && ii < numEntries; ++ii)
|
||||||
{
|
{
|
||||||
// Reference(s):
|
// Reference(s):
|
||||||
// - EXIF Tags
|
// - EXIF Tags
|
||||||
// https://web.archive.org/web/20190218005249/https://sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html
|
// https://web.archive.org/web/20190218005249/https://sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html
|
||||||
//
|
//
|
||||||
uint16_t tag;
|
uint16_t tag;
|
||||||
bx::readHE(&reader, tag, littleEndian, &err);
|
bx::readHE(&reader, tag, littleEndian, _err);
|
||||||
|
|
||||||
uint16_t format;
|
uint16_t format;
|
||||||
bx::readHE(&reader, format, littleEndian, &err);
|
bx::readHE(&reader, format, littleEndian, _err);
|
||||||
|
|
||||||
uint32_t length;
|
uint32_t length;
|
||||||
bx::readHE(&reader, length, littleEndian, &err);
|
bx::readHE(&reader, length, littleEndian, _err);
|
||||||
|
|
||||||
uint32_t data;
|
uint32_t data;
|
||||||
bx::readHE(&reader, data, littleEndian, &err);
|
bx::readHE(&reader, data, littleEndian, _err);
|
||||||
|
|
||||||
switch (tag)
|
switch (tag)
|
||||||
{
|
{
|
||||||
@@ -806,10 +880,10 @@ namespace bimg
|
|||||||
bx::seek(&reader, -4);
|
bx::seek(&reader, -4);
|
||||||
|
|
||||||
uint16_t u16;
|
uint16_t u16;
|
||||||
bx::readHE(&reader, u16, littleEndian, &err);
|
bx::readHE(&reader, u16, littleEndian, _err);
|
||||||
|
|
||||||
uint16_t pad;
|
uint16_t pad;
|
||||||
bx::read(&reader, pad, &err);
|
bx::read(&reader, pad, _err);
|
||||||
|
|
||||||
switch (u16)
|
switch (u16)
|
||||||
{
|
{
|
||||||
@@ -843,6 +917,7 @@ namespace bimg
|
|||||||
|
|
||||||
return image;
|
return image;
|
||||||
#else
|
#else
|
||||||
|
BX_UNUSED(_allocator, _data, _size);
|
||||||
BX_ERROR_SET(_err, BIMG_ERROR, "JPEG parsing is disabled (BIMG_CONFIG_PARSE_JPEG).");
|
BX_ERROR_SET(_err, BIMG_ERROR, "JPEG parsing is disabled (BIMG_CONFIG_PARSE_JPEG).");
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif // BIMG_CONFIG_PARSE_JPEG
|
#endif // BIMG_CONFIG_PARSE_JPEG
|
||||||
@@ -850,6 +925,16 @@ namespace bimg
|
|||||||
|
|
||||||
static ImageContainer* imageParseLibHeif(bx::AllocatorI* _allocator, const void* _data, uint32_t _size, bx::Error* _err)
|
static ImageContainer* imageParseLibHeif(bx::AllocatorI* _allocator, const void* _data, uint32_t _size, bx::Error* _err)
|
||||||
{
|
{
|
||||||
|
BX_ERROR_SCOPE(_err);
|
||||||
|
|
||||||
|
static uint8_t heifMagic[] = { 0x66, 0x74, 0x79, 0x70 }; // "ftyp" at offset 4
|
||||||
|
|
||||||
|
if (12 > _size
|
||||||
|
|| 0 != bx::memCmp( (const uint8_t*)_data + 4, heifMagic, sizeof(heifMagic) ) )
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
#if BIMG_CONFIG_PARSE_HEIF
|
#if BIMG_CONFIG_PARSE_HEIF
|
||||||
heif_context* ctx = heif_context_alloc();
|
heif_context* ctx = heif_context_alloc();
|
||||||
|
|
||||||
@@ -894,7 +979,8 @@ namespace bimg
|
|||||||
BX_UNUSED(_err);
|
BX_UNUSED(_err);
|
||||||
return output;
|
return output;
|
||||||
#else
|
#else
|
||||||
BX_UNUSED(_allocator, _data, _size, _err);
|
BX_UNUSED(_allocator, _data, _size);
|
||||||
|
BX_ERROR_SET(_err, BIMG_ERROR, "HEIF parsing is disabled (BIMG_CONFIG_PARSE_HEIF).");
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif // BIMG_CONFIG_PARSE_HEIF
|
#endif // BIMG_CONFIG_PARSE_HEIF
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user