mirror of
https://github.com/openharmony/third_party_meshoptimizer.git
synced 2026-07-19 20:03:59 -04:00
gltfpack: Refactor writeImage to consolidate encoded image logic
Instead of allowing the caller to deal with encoded images we now pass the data to writeImage and allow it to write it. This slightly unifies the error and data write flow and makes it easier to change this logic in one place.
This commit is contained in:
+6
-13
@@ -484,22 +484,15 @@ static void process(cgltf_data* data, const char* input_path, const char* output
|
||||
{
|
||||
const cgltf_image& image = data->images[i];
|
||||
|
||||
std::string* encoded = (encoded_images.size() && !encoded_images[i].empty()) ? &encoded_images[i] : NULL;
|
||||
|
||||
comma(json_images);
|
||||
append(json_images, "{");
|
||||
if (encoded_images.size() && !encoded_images[i].empty())
|
||||
{
|
||||
if (encoded_images[i].compare(0, 5, "error") == 0)
|
||||
writeImageError(json_images, "encode", int(i), image.uri, encoded_images[i].c_str());
|
||||
else
|
||||
writeEncodedImage(json_images, views, image, encoded_images[i], images[i], i, output_path, settings);
|
||||
|
||||
encoded_images[i] = std::string(); // reclaim memory early
|
||||
}
|
||||
else
|
||||
{
|
||||
writeImage(json_images, views, image, images[i], i, input_path, output_path, settings);
|
||||
}
|
||||
writeImage(json_images, views, image, images[i], encoded, i, input_path, output_path, settings);
|
||||
append(json_images, "}");
|
||||
|
||||
if (encoded)
|
||||
*encoded = std::string(); // reclaim memory early
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < data->textures_count; ++i)
|
||||
|
||||
+1
-3
@@ -368,9 +368,7 @@ const char* animationPath(cgltf_animation_path_type type);
|
||||
void writeMaterial(std::string& json, const cgltf_data* data, const cgltf_material& material, const QuantizationPosition* qp, const QuantizationTexture* qt, std::vector<TextureInfo>& textures);
|
||||
void writeBufferView(std::string& json, BufferView::Kind kind, StreamFormat::Filter filter, size_t count, size_t stride, size_t bin_offset, size_t bin_size, BufferView::Compression compression, size_t compressed_offset, size_t compressed_size);
|
||||
void writeSampler(std::string& json, const cgltf_sampler& sampler);
|
||||
void writeImage(std::string& json, std::vector<BufferView>& views, const cgltf_image& image, const ImageInfo& info, size_t index, const char* input_path, const char* output_path, const Settings& settings);
|
||||
void writeImageError(std::string& json, const char* action, size_t index, const char* uri, const char* reason = NULL);
|
||||
void writeEncodedImage(std::string& json, std::vector<BufferView>& views, const cgltf_image& image, const std::string& encoded, const ImageInfo& info, size_t index, const char* output_path, const Settings& settings);
|
||||
void writeImage(std::string& json, std::vector<BufferView>& views, const cgltf_image& image, const ImageInfo& info, const std::string* encoded, size_t index, const char* input_path, const char* output_path, const Settings& settings);
|
||||
void writeTexture(std::string& json, const cgltf_texture& texture, const ImageInfo* info, cgltf_data* data, const Settings& settings);
|
||||
void writeMeshAttributes(std::string& json, std::vector<BufferView>& views, std::string& json_accessors, size_t& accr_offset, const Mesh& mesh, int target, const QuantizationPosition& qp, const QuantizationTexture& qt, const Settings& settings);
|
||||
size_t writeMeshIndices(std::vector<BufferView>& views, std::string& json_accessors, size_t& accr_offset, const Mesh& mesh, const Settings& settings);
|
||||
|
||||
+21
-16
@@ -896,6 +896,15 @@ void writeSampler(std::string& json, const cgltf_sampler& sampler)
|
||||
}
|
||||
}
|
||||
|
||||
static void writeImageError(std::string& json, const char* action, size_t index, const char* uri, const char* reason)
|
||||
{
|
||||
append(json, "\"uri\":\"");
|
||||
append(json, "data:image/png;base64,ERR/");
|
||||
append(json, "\"");
|
||||
|
||||
fprintf(stderr, "Warning: unable to %s image %d (%s), skipping%s%s%s\n", action, int(index), uri ? uri : "embedded", reason ? " (" : "", reason ? reason : "", reason ? ")" : "");
|
||||
}
|
||||
|
||||
static void writeImageData(std::string& json, std::vector<BufferView>& views, size_t index, const char* uri, const char* mime_type, const std::string& contents, const char* output_path, TextureKind kind, bool embed)
|
||||
{
|
||||
bool dataUri = uri && strncmp(uri, "data:", 5) == 0;
|
||||
@@ -922,8 +931,18 @@ static void writeImageData(std::string& json, std::vector<BufferView>& views, si
|
||||
}
|
||||
}
|
||||
|
||||
void writeImage(std::string& json, std::vector<BufferView>& views, const cgltf_image& image, const ImageInfo& info, size_t index, const char* input_path, const char* output_path, const Settings& settings)
|
||||
void writeImage(std::string& json, std::vector<BufferView>& views, const cgltf_image& image, const ImageInfo& info, const std::string* encoded, size_t index, const char* input_path, const char* output_path, const Settings& settings)
|
||||
{
|
||||
if (encoded)
|
||||
{
|
||||
// image was pre-encoded via encodeImages (which might have failed!)
|
||||
if (encoded->compare(0, 5, "error") == 0)
|
||||
writeImageError(json, "encode", int(index), image.uri, encoded->c_str());
|
||||
else
|
||||
writeImageData(json, views, index, image.uri, "image/ktx2", *encoded, output_path, info.kind, settings.texture_embed);
|
||||
return;
|
||||
}
|
||||
|
||||
bool dataUri = image.uri && strncmp(image.uri, "data:", 5) == 0;
|
||||
|
||||
if (image.uri && !dataUri && settings.texture_ref)
|
||||
@@ -939,27 +958,13 @@ void writeImage(std::string& json, std::vector<BufferView>& views, const cgltf_i
|
||||
std::string mime_type;
|
||||
if (!readImage(image, input_path, img_data, mime_type))
|
||||
{
|
||||
writeImageError(json, "read", index, image.uri);
|
||||
writeImageError(json, "read", index, image.uri, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
writeImageData(json, views, index, image.uri, mime_type.c_str(), img_data, output_path, info.kind, settings.texture_embed);
|
||||
}
|
||||
|
||||
void writeImageError(std::string& json, const char* action, size_t index, const char* uri, const char* reason)
|
||||
{
|
||||
append(json, "\"uri\":\"");
|
||||
append(json, "data:image/png;base64,ERR/");
|
||||
append(json, "\"");
|
||||
|
||||
fprintf(stderr, "Warning: unable to %s image %d (%s), skipping%s%s%s\n", action, int(index), uri ? uri : "embedded", reason ? " (" : "", reason ? reason : "", reason ? ")" : "");
|
||||
}
|
||||
|
||||
void writeEncodedImage(std::string& json, std::vector<BufferView>& views, const cgltf_image& image, const std::string& encoded, const ImageInfo& info, size_t index, const char* output_path, const Settings& settings)
|
||||
{
|
||||
writeImageData(json, views, index, image.uri, "image/ktx2", encoded, output_path, info.kind, settings.texture_embed);
|
||||
}
|
||||
|
||||
void writeTexture(std::string& json, const cgltf_texture& texture, const ImageInfo* info, cgltf_data* data, const Settings& settings)
|
||||
{
|
||||
if (texture.image)
|
||||
|
||||
Reference in New Issue
Block a user