tile.cpp: Automatically upscale lower resolution texture
authorSmallJoker <mk939@ymail.com>
Thu, 21 Apr 2016 19:54:30 +0000 (21:54 +0200)
committerparamat <mat.gregory@virginmedia.com>
Mon, 25 Apr 2016 05:39:32 +0000 (06:39 +0100)
doc/lua_api.txt
src/client/tile.cpp

index fdc736906ef6005acc13adad08175f47331b7742..47624496baac9db53aee9b0ec4bedd2b2762e21d 100644 (file)
@@ -243,6 +243,7 @@ Example:
     default_dirt.png^default_grass_side.png
 
 `default_grass_side.png` is overlayed over `default_dirt.png`.
+The texture with the lower resolution will be automatically upscaled to the higher resolution texture.
 
 ### Texture grouping
 Textures can be grouped together by enclosing them in `(` and `)`.
index e6668063c26d4443adaf3c73b32fa1e03152b3d2..72d626da72ce239c38358753ca4f4b7db960c5f0 100644 (file)
@@ -1175,7 +1175,28 @@ bool TextureSource::generateImagePart(std::string part_of_name,
                                        core::rect<s32>(pos_from, dim),
                                        video::SColor(255,255,255,255),
                                        NULL);*/
-                       blit_with_alpha(image, baseimg, pos_from, pos_to, dim);
+
+                       core::dimension2d<u32> dim_dst = baseimg->getDimension();
+                       if (dim == dim_dst) {
+                               blit_with_alpha(image, baseimg, pos_from, pos_to, dim);
+                       } else if (dim.Width * dim.Height < dim_dst.Width * dim_dst.Height) {
+                               // Upscale overlying image
+                               video::IImage* scaled_image = m_device->getVideoDriver()->
+                                       createImage(video::ECF_A8R8G8B8, dim_dst);
+                               image->copyToScaling(scaled_image);
+
+                               blit_with_alpha(scaled_image, baseimg, pos_from, pos_to, dim_dst);
+                               scaled_image->drop();
+                       } else {
+                               // Upscale base image
+                               video::IImage* scaled_base = m_device->getVideoDriver()->
+                                       createImage(video::ECF_A8R8G8B8, dim);
+                               baseimg->copyToScaling(scaled_base);
+                               baseimg->drop();
+                               baseimg = scaled_base;
+
+                               blit_with_alpha(image, baseimg, pos_from, pos_to, dim);
+                       }
                }
                //cleanup
                image->drop();