Преглед изворни кода

Merge pull request #19278 from karroffel/image-rgbe-srgb

added rgbe_to_srgb method to Image
Juan Linietsky пре 7 година
родитељ
комит
10cab25f72
2 измењених фајлова са 33 додато и 0 уклоњено
  1. 32 0
      core/image.cpp
  2. 1 0
      core/image.h

+ 32 - 0
core/image.cpp

@@ -2301,6 +2301,7 @@ void Image::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("premultiply_alpha"), &Image::premultiply_alpha);
 	ClassDB::bind_method(D_METHOD("srgb_to_linear"), &Image::srgb_to_linear);
 	ClassDB::bind_method(D_METHOD("normalmap_to_xy"), &Image::normalmap_to_xy);
+	ClassDB::bind_method(D_METHOD("rgbe_to_srgb"), &Image::rgbe_to_srgb);
 	ClassDB::bind_method(D_METHOD("bumpmap_to_normalmap", "bump_scale"), &Image::bumpmap_to_normalmap, DEFVAL(1.0));
 
 	ClassDB::bind_method(D_METHOD("blit_rect", "src", "src_rect", "dst"), &Image::blit_rect);
@@ -2412,6 +2413,37 @@ void Image::normalmap_to_xy() {
 	convert(Image::FORMAT_LA8);
 }
 
+Ref<Image> Image::rgbe_to_srgb() {
+
+	if (data.size() == 0)
+		return Ref<Image>();
+
+	ERR_FAIL_COND_V(format != FORMAT_RGBE9995, Ref<Image>());
+
+	Ref<Image> new_image;
+	new_image.instance();
+	new_image->create(width, height, 0, Image::FORMAT_RGB8);
+
+	lock();
+
+	new_image->lock();
+
+	for (int row = 0; row < height; row++) {
+		for (int col = 0; col < width; col++) {
+			new_image->set_pixel(col, row, get_pixel(col, row).to_srgb());
+		}
+	}
+
+	unlock();
+	new_image->unlock();
+
+	if (has_mipmaps()) {
+		new_image->generate_mipmaps();
+	}
+
+	return new_image;
+}
+
 void Image::bumpmap_to_normalmap(float bump_scale) {
 	ERR_FAIL_COND(!_can_modify(format));
 	convert(Image::FORMAT_RF);

+ 1 - 0
core/image.h

@@ -284,6 +284,7 @@ public:
 	void premultiply_alpha();
 	void srgb_to_linear();
 	void normalmap_to_xy();
+	Ref<Image> rgbe_to_srgb();
 	void bumpmap_to_normalmap(float bump_scale = 1.0);
 
 	void blit_rect(const Ref<Image> &p_src, const Rect2 &p_src_rect, const Point2 &p_dest);