diff options
Diffstat (limited to 'modules/webp/resource_saver_webp.cpp')
-rw-r--r-- | modules/webp/resource_saver_webp.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/modules/webp/resource_saver_webp.cpp b/modules/webp/resource_saver_webp.cpp new file mode 100644 index 0000000000..56ff8097b4 --- /dev/null +++ b/modules/webp/resource_saver_webp.cpp @@ -0,0 +1,90 @@ +/*************************************************************************/ +/* resource_saver_webp.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "resource_saver_webp.h" + +#include "core/io/file_access.h" +#include "core/io/image.h" +#include "scene/resources/texture.h" +#include "webp_common.h" + +Error ResourceSaverWebP::save(const Ref<Resource> &p_resource, const String &p_path, uint32_t p_flags) { + Ref<ImageTexture> texture = p_resource; + + ERR_FAIL_COND_V_MSG(!texture.is_valid(), ERR_INVALID_PARAMETER, "Can't save invalid texture as WebP."); + ERR_FAIL_COND_V_MSG(!texture->get_width(), ERR_INVALID_PARAMETER, "Can't save empty texture as WebP."); + + Ref<Image> img = texture->get_image(); + + Error err = save_image(p_path, img); + + return err; +} + +Error ResourceSaverWebP::save_image(const String &p_path, const Ref<Image> &p_img, const bool p_lossy, const float p_quality) { + Vector<uint8_t> buffer = save_image_to_buffer(p_img, p_lossy, p_quality); + Error err; + Ref<FileAccess> file = FileAccess::open(p_path, FileAccess::WRITE, &err); + ERR_FAIL_COND_V_MSG(err, err, vformat("Can't save WebP at path: '%s'.", p_path)); + + const uint8_t *reader = buffer.ptr(); + + file->store_buffer(reader, buffer.size()); + if (file->get_error() != OK && file->get_error() != ERR_FILE_EOF) { + return ERR_CANT_CREATE; + } + + return OK; +} + +Vector<uint8_t> ResourceSaverWebP::save_image_to_buffer(const Ref<Image> &p_img, const bool p_lossy, const float p_quality) { + Vector<uint8_t> buffer; + if (p_lossy) { + buffer = WebPCommon::_webp_lossy_pack(p_img, p_quality); + } else { + buffer = WebPCommon::_webp_lossless_pack(p_img); + } + return buffer; +} + +bool ResourceSaverWebP::recognize(const Ref<Resource> &p_resource) const { + return (p_resource.is_valid() && p_resource->is_class("ImageTexture")); +} + +void ResourceSaverWebP::get_recognized_extensions(const Ref<Resource> &p_resource, List<String> *p_extensions) const { + if (Object::cast_to<ImageTexture>(*p_resource)) { + p_extensions->push_back("webp"); + } +} + +ResourceSaverWebP::ResourceSaverWebP() { + Image::save_webp_func = &save_image; + Image::save_webp_buffer_func = &save_image_to_buffer; +} |