mirror of
https://git.mirrors.martin98.com/https://github.com/syoyo/tinygltf.git
synced 2025-09-23 16:53:17 +08:00
Initial support of loading 16bit PNG using lodepng.
This commit is contained in:
parent
cbf13fef62
commit
ab069ffb40
35
tiny_gltf.h
35
tiny_gltf.h
@ -477,8 +477,10 @@ struct Image {
|
|||||||
std::string name;
|
std::string name;
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
int component;
|
int component; // channels. e.g. RGB=3, RGBA=4
|
||||||
std::vector<unsigned char> image;
|
int bits; // bit depth per channel. 8(byte), 16 or 32.
|
||||||
|
int pixel_type; // pixel type(TINYGLTF_COMPONENT_TYPE_***). usually UBYTE(bits = 8) or USHORT(bits = 16)
|
||||||
|
std::vector<unsigned char> image; // width * height * component * (bits/8)
|
||||||
int bufferView; // (required if no uri)
|
int bufferView; // (required if no uri)
|
||||||
std::string mimeType; // (required if no uri) ["image/jpeg", "image/png",
|
std::string mimeType; // (required if no uri) ["image/jpeg", "image/png",
|
||||||
// "image/bmp", "image/gif"]
|
// "image/bmp", "image/gif"]
|
||||||
@ -499,6 +501,8 @@ struct Image {
|
|||||||
width = -1;
|
width = -1;
|
||||||
height = -1;
|
height = -1;
|
||||||
component = -1;
|
component = -1;
|
||||||
|
bits = -1;
|
||||||
|
pixel_type = TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE;
|
||||||
}
|
}
|
||||||
bool operator==(const Image &) const;
|
bool operator==(const Image &) const;
|
||||||
};
|
};
|
||||||
@ -1208,6 +1212,7 @@ bool Camera::operator==(const Camera &other) const {
|
|||||||
bool Image::operator==(const Image &other) const {
|
bool Image::operator==(const Image &other) const {
|
||||||
return this->bufferView == other.bufferView &&
|
return this->bufferView == other.bufferView &&
|
||||||
this->component == other.component && this->extras == other.extras &&
|
this->component == other.component && this->extras == other.extras &&
|
||||||
|
this->bits == other.bits &&
|
||||||
this->height == other.height && this->image == other.image &&
|
this->height == other.height && this->image == other.image &&
|
||||||
this->mimeType == other.mimeType && this->name == other.name &&
|
this->mimeType == other.mimeType && this->name == other.name &&
|
||||||
this->uri == other.uri && this->width == other.width;
|
this->uri == other.uri && this->width == other.width;
|
||||||
@ -1604,6 +1609,9 @@ bool LoadImageData(Image *image, const int image_idx, std::string *err, std::str
|
|||||||
// some GPU drivers do not support 24-bit images for Vulkan
|
// some GPU drivers do not support 24-bit images for Vulkan
|
||||||
req_comp = 4;
|
req_comp = 4;
|
||||||
|
|
||||||
|
int bits = 8;
|
||||||
|
int pixel_type = TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE;
|
||||||
|
|
||||||
// if image cannot be decoded, ignore parsing and keep it by its path
|
// if image cannot be decoded, ignore parsing and keep it by its path
|
||||||
// don't break in this case
|
// don't break in this case
|
||||||
// FIXME we should only enter this function if the image is embedded. If
|
// FIXME we should only enter this function if the image is embedded. If
|
||||||
@ -1613,11 +1621,28 @@ bool LoadImageData(Image *image, const int image_idx, std::string *err, std::str
|
|||||||
unsigned char *data =
|
unsigned char *data =
|
||||||
stbi_load_from_memory(bytes, size, &w, &h, &comp, req_comp);
|
stbi_load_from_memory(bytes, size, &w, &h, &comp, req_comp);
|
||||||
if (!data) {
|
if (!data) {
|
||||||
|
#if !defined(TINYGLTF_NO_LODEPNG)
|
||||||
|
// try to load as 16bit PNG RGBA
|
||||||
|
unsigned ret = lodepng_decode_memory(&data, reinterpret_cast<unsigned *>(&w), reinterpret_cast<unsigned *>(&h), bytes, size, LCT_RGBA, /* bitdepth*/16);
|
||||||
|
|
||||||
|
if (ret != 0) {
|
||||||
|
// NOTE: you can use `warn` instead of `err`
|
||||||
|
if (err) {
|
||||||
|
(*err) += "Unknown image format. STB and LodePNG cannot decode image data for image[" + std::to_string(image_idx) + "] name = \"" + image->name + "\".\n";
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bits = 16;
|
||||||
|
pixel_type = TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT;
|
||||||
|
|
||||||
|
#else
|
||||||
// NOTE: you can use `warn` instead of `err`
|
// NOTE: you can use `warn` instead of `err`
|
||||||
if (err) {
|
if (err) {
|
||||||
(*err) += "Unknown image format. STB cannot decode image data for image[" + std::to_string(image_idx) + "] name = \"" + image->name + "\". Proably 16bit PNG?\n";
|
(*err) += "Unknown image format. STB cannot decode image data for image[" + std::to_string(image_idx) + "] name = \"" + image->name + "\". Proably 16bit PNG?\n";
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (w < 1 || h < 1) {
|
if (w < 1 || h < 1) {
|
||||||
@ -1651,8 +1676,10 @@ bool LoadImageData(Image *image, const int image_idx, std::string *err, std::str
|
|||||||
image->width = w;
|
image->width = w;
|
||||||
image->height = h;
|
image->height = h;
|
||||||
image->component = req_comp;
|
image->component = req_comp;
|
||||||
image->image.resize(static_cast<size_t>(w * h * req_comp));
|
image->bits = bits;
|
||||||
std::copy(data, data + w * h * req_comp, image->image.begin());
|
image->pixel_type = pixel_type;
|
||||||
|
image->image.resize(static_cast<size_t>(w * h * req_comp * (bits/8)));
|
||||||
|
std::copy(data, data + w * h * req_comp * (bits/8), image->image.begin());
|
||||||
|
|
||||||
free(data);
|
free(data);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user