From eff515337553846bf57881670305d35ad92966dc Mon Sep 17 00:00:00 2001 From: Relintai Date: Mon, 8 Aug 2022 02:39:21 +0200 Subject: [PATCH] Backported convert_rg_to_ra_rgba8 and convert_ra_rgba8_to_rg from Godot4's Image. --- core/image.cpp | 31 +++++++++++++++++++++++++++++++ core/image.h | 3 +++ 2 files changed, 34 insertions(+) diff --git a/core/image.cpp b/core/image.cpp index a1e7485e1..741e61806 100644 --- a/core/image.cpp +++ b/core/image.cpp @@ -2972,6 +2972,9 @@ void Image::_bind_methods() { ClassDB::bind_method(D_METHOD("load_tga_from_buffer", "buffer"), &Image::load_tga_from_buffer); ClassDB::bind_method(D_METHOD("load_bmp_from_buffer", "buffer"), &Image::load_bmp_from_buffer); + ClassDB::bind_method(D_METHOD("convert_rg_to_ra_rgba8"), &Image::convert_rg_to_ra_rgba8); + ClassDB::bind_method(D_METHOD("convert_ra_rgba8_to_rg"), &Image::convert_ra_rgba8_to_rg); + ADD_PROPERTY(PropertyInfo(Variant::DICTIONARY, "data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "_set_data", "_get_data"); BIND_CONSTANT(MAX_WIDTH); @@ -3300,6 +3303,34 @@ Error Image::load_bmp_from_buffer(const PoolVector &p_array) { return _load_from_buffer(p_array, _bmp_mem_loader_func); } +void Image::convert_rg_to_ra_rgba8() { + ERR_FAIL_COND(format != FORMAT_RGBA8); + ERR_FAIL_COND(!data.size()); + + int s = data.size(); + PoolVector::Write pw = data.write(); + uint8_t *w = pw.ptr(); + for (int i = 0; i < s; i += 4) { + w[i + 3] = w[i + 1]; + w[i + 1] = 0; + w[i + 2] = 0; + } +} + +void Image::convert_ra_rgba8_to_rg() { + ERR_FAIL_COND(format != FORMAT_RGBA8); + ERR_FAIL_COND(!data.size()); + + int s = data.size(); + PoolVector::Write pw = data.write(); + uint8_t *w = pw.ptr(); + for (int i = 0; i < s; i += 4) { + w[i + 1] = w[i + 3]; + w[i + 2] = 0; + w[i + 3] = 255; + } +} + Error Image::_load_from_buffer(const PoolVector &p_array, ImageMemLoadFunc p_loader) { int buffer_size = p_array.size(); diff --git a/core/image.h b/core/image.h index e8889d17a..86b40978f 100644 --- a/core/image.h +++ b/core/image.h @@ -343,6 +343,9 @@ public: Error load_tga_from_buffer(const PoolVector &p_array); Error load_bmp_from_buffer(const PoolVector &p_array); + void convert_rg_to_ra_rgba8(); + void convert_ra_rgba8_to_rg(); + Image(const uint8_t *p_mem_png_jpg, int p_len = -1); Image(const char **p_xpm);