Merge pull request #396 from pknowlesnv/image_write_failure

propagate image writing failures
This commit is contained in:
Syoyo Fujita 2022-12-30 17:59:41 +09:00 committed by GitHub
commit 03bbe0921c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 47 additions and 11 deletions

View File

@ -593,13 +593,38 @@ TEST_CASE("serialize-image-callback", "[issue-394]") {
tinygltf::TinyGLTF ctx;
ctx.SetImageWriter(writer, (void *)0xba5e1e55);
ctx.WriteGltfSceneToStream(const_cast<const tinygltf::Model *>(&m), os, false,
bool result = ctx.WriteGltfSceneToStream(const_cast<const tinygltf::Model *>(&m), os, false,
false);
// use nlohmann json
nlohmann::json j = nlohmann::json::parse(os.str());
REQUIRE(true == result);
REQUIRE(1 == j["images"].size());
REQUIRE(j["images"][0].is_object());
REQUIRE(j["images"][0]["uri"].get<std::string>() == "bar");
}
TEST_CASE("serialize-image-failure", "[issue-394]") {
tinygltf::Model m;
tinygltf::Image i;
// Set some data so the ImageWriter callback will be called
i.image = {255, 255, 255, 255};
m.images.push_back(i);
std::stringstream os;
auto writer = [](const std::string *basepath, const std::string *filename,
const tinygltf::Image *image, bool embedImages,
std::string *out_uri, void *user_pointer) -> bool {
return false;
};
tinygltf::TinyGLTF ctx;
ctx.SetImageWriter(writer, (void *)0xba5e1e55);
bool result = ctx.WriteGltfSceneToStream(const_cast<const tinygltf::Model *>(&m), os, false,
false);
REQUIRE(false == result);
REQUIRE(os.str().size() == 0);
}

View File

@ -2834,7 +2834,7 @@ static std::string MimeToExt(const std::string &mimeType) {
return "";
}
static void UpdateImageObject(const Image &image, std::string &baseDir,
static bool UpdateImageObject(const Image &image, std::string &baseDir,
int index, bool embedImages,
WriteImageDataFunction *WriteImageData,
std::string *out_uri, void *user_data) {
@ -2857,17 +2857,24 @@ static void UpdateImageObject(const Image &image, std::string &baseDir,
filename = std::to_string(index) + "." + ext;
}
// If callback is set, modify image data object
// If callback is set and image data exists, modify image data object. If
// image data does not exist, this is not considered a failure and the
// original uri should be maintained.
bool imageWritten = false;
if (*WriteImageData != nullptr && !filename.empty()) {
if (*WriteImageData != nullptr && !filename.empty() && !image.image.empty()) {
imageWritten = (*WriteImageData)(&baseDir, &filename, &image, embedImages,
out_uri, user_data);
if (!imageWritten) {
return false;
}
}
// Use the original uri if the image was not written.
if (!imageWritten) {
*out_uri = image.uri;
}
return true;
}
bool IsDataURI(const std::string &in) {
@ -7016,7 +7023,7 @@ static void SerializeGltfBufferView(const BufferView &bufferView, json &o) {
}
}
static void SerializeGltfImage(const Image &image, const std::string uri,
static void SerializeGltfImage(const Image &image, const std::string &uri,
json &o) {
// From 2.7.0, we look for `uri` parameter, not `Image.uri`
// if uri is empty, the mimeType and bufferview should be set
@ -7817,9 +7824,11 @@ bool TinyGLTF::WriteGltfSceneToStream(const Model *model, std::ostream &stream,
// enabled, since we won't write separate images when writing to a stream
// we
std::string uri;
UpdateImageObject(model->images[i], dummystring, int(i), true,
&this->WriteImageData, &uri,
this->write_image_user_data_);
if (!UpdateImageObject(model->images[i], dummystring, int(i), true,
&this->WriteImageData, &uri,
this->write_image_user_data_)) {
return false;
}
SerializeGltfImage(model->images[i], uri, image);
JsonPushBack(images, std::move(image));
}
@ -7908,9 +7917,11 @@ bool TinyGLTF::WriteGltfSceneToFile(const Model *model,
json image;
std::string uri;
UpdateImageObject(model->images[i], baseDir, int(i), embedImages,
&this->WriteImageData, &uri,
this->write_image_user_data_);
if (!UpdateImageObject(model->images[i], baseDir, int(i), embedImages,
&this->WriteImageData, &uri,
this->write_image_user_data_)) {
return false;
}
SerializeGltfImage(model->images[i], uri, image);
JsonPushBack(images, std::move(image));
}