Fix fast leaves with texture_clean_transparent enabled.
authorAaron Suen <warr1024@gmail.com>
Wed, 1 Apr 2015 12:26:57 +0000 (08:26 -0400)
committerCraig Robbins <kde.psych@gmail.com>
Sun, 26 Apr 2015 13:39:40 +0000 (23:39 +1000)
src/client/tile.cpp
src/util/string.h

index 315c2fa2951336d7bee057472403a1a8ec13f903..eba52033ae9f9e1fdd25088a350786ef619bbff7 100644 (file)
@@ -224,10 +224,6 @@ public:
                        }
                }
 
-               // Apply the "clean transparent" filter, if configured.
-               if (g_settings->getBool("texture_clean_transparent"))
-                       imageCleanTransparent(toadd, 127);
-
                if (need_to_grab)
                        toadd->grab();
                m_images[name] = toadd;
@@ -676,7 +672,7 @@ video::ITexture* TextureSource::getTexture(const std::string &name, u32 *id)
 
 video::ITexture* TextureSource::getTextureForMesh(const std::string &name, u32 *id)
 {
-       return getTexture(name + "^[autoupscaleformesh", id);
+       return getTexture(name + "^[applyfiltersformesh", id);
 }
 
 void TextureSource::processQueue()
@@ -1191,7 +1187,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
                        Adds a cracking texture
                        N = animation frame count, P = crack progression
                */
-               if (part_of_name.substr(0,6) == "[crack")
+               if (str_starts_with(part_of_name, "[crack"))
                {
                        if (baseimg == NULL) {
                                errorstream<<"generateImagePart(): baseimg == NULL "
@@ -1228,7 +1224,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
                        [combine:WxH:X,Y=filename:X,Y=filename2
                        Creates a bigger texture from an amount of smaller ones
                */
-               else if (part_of_name.substr(0,8) == "[combine")
+               else if (str_starts_with(part_of_name, "[combine"))
                {
                        Strfnd sf(part_of_name);
                        sf.next(":");
@@ -1272,7 +1268,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
                /*
                        "[brighten"
                */
-               else if (part_of_name.substr(0,9) == "[brighten")
+               else if (str_starts_with(part_of_name, "[brighten"))
                {
                        if (baseimg == NULL) {
                                errorstream<<"generateImagePart(): baseimg==NULL "
@@ -1290,7 +1286,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
                        that the transparent parts don't look completely black
                        when simple alpha channel is used for rendering.
                */
-               else if (part_of_name.substr(0,8) == "[noalpha")
+               else if (str_starts_with(part_of_name, "[noalpha"))
                {
                        if (baseimg == NULL){
                                errorstream<<"generateImagePart(): baseimg==NULL "
@@ -1314,7 +1310,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
                        "[makealpha:R,G,B"
                        Convert one color to transparent.
                */
-               else if (part_of_name.substr(0,11) == "[makealpha:")
+               else if (str_starts_with(part_of_name, "[makealpha:"))
                {
                        if (baseimg == NULL) {
                                errorstream<<"generateImagePart(): baseimg == NULL "
@@ -1370,7 +1366,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
                        The resulting transform will be equivalent to one of the
                        eight existing ones, though (see: dihedral group).
                */
-               else if (part_of_name.substr(0,10) == "[transform")
+               else if (str_starts_with(part_of_name, "[transform"))
                {
                        if (baseimg == NULL) {
                                errorstream<<"generateImagePart(): baseimg == NULL "
@@ -1397,7 +1393,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
                        Example (a grass block (not actually used in game):
                        "[inventorycube{grass.png{mud.png&grass_side.png{mud.png&grass_side.png"
                */
-               else if (part_of_name.substr(0,14) == "[inventorycube")
+               else if (str_starts_with(part_of_name, "[inventorycube"))
                {
                        if (baseimg != NULL){
                                errorstream<<"generateImagePart(): baseimg != NULL "
@@ -1514,7 +1510,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
                        [lowpart:percent:filename
                        Adds the lower part of a texture
                */
-               else if (part_of_name.substr(0,9) == "[lowpart:")
+               else if (str_starts_with(part_of_name, "[lowpart:"))
                {
                        Strfnd sf(part_of_name);
                        sf.next(":");
@@ -1550,7 +1546,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
                        Crops a frame of a vertical animation.
                        N = frame count, I = frame index
                */
-               else if (part_of_name.substr(0,15) == "[verticalframe:")
+               else if (str_starts_with(part_of_name, "[verticalframe:"))
                {
                        Strfnd sf(part_of_name);
                        sf.next(":");
@@ -1594,7 +1590,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
                        [mask:filename
                        Applies a mask to an image
                */
-               else if (part_of_name.substr(0,6) == "[mask:")
+               else if (str_starts_with(part_of_name, "[mask:"))
                {
                        if (baseimg == NULL) {
                                errorstream << "generateImage(): baseimg == NULL "
@@ -1620,7 +1616,8 @@ bool TextureSource::generateImagePart(std::string part_of_name,
                        Overlays image with given color
                        color = color as ColorString
                */
-               else if (part_of_name.substr(0,10) == "[colorize:") {
+               else if (str_starts_with(part_of_name, "[colorize:"))
+               {
                        Strfnd sf(part_of_name);
                        sf.next(":");
                        std::string color_str = sf.next(":");
@@ -1657,7 +1654,12 @@ bool TextureSource::generateImagePart(std::string part_of_name,
                        blit_with_interpolate_overlay(img, baseimg, v2s32(0,0), v2s32(0,0), dim, ratio);
                        img->drop();
                }
-               else if (part_of_name.substr(0,19) == "[autoupscaleformesh") {
+               else if (str_starts_with(part_of_name, "[applyfiltersformesh"))
+               {
+                       // Apply the "clean transparent" filter, if configured.
+                       if (g_settings->getBool("texture_clean_transparent"))
+                               imageCleanTransparent(baseimg, 127);
+
                        /* Upscale textures to user's requested minimum size.  This is a trick to make
                         * filters look as good on low-res textures as on high-res ones, by making
                         * low-res textures BECOME high-res ones.  This is helpful for worlds that
index d4bbafd9f59b8b3d4eca36a6fe8ba2f5f6bfc748..f2d9af5703cda9a2c57eebb74d0568f751e93779 100644 (file)
@@ -151,6 +151,24 @@ inline bool str_starts_with(const std::basic_string<T> &str,
        return true;
 }
 
+/**
+ * Check whether \p str begins with the string prefix. If \p case_insensitive
+ * is true then the check is case insensitve (default is false; i.e. case is
+ * significant).
+ *
+ * @param str
+ * @param prefix
+ * @param case_insensitive
+ * @return true if the str begins with prefix
+ */
+template <typename T>
+inline bool str_starts_with(const std::basic_string<T> &str,
+               const T *prefix,
+               bool case_insensitive = false)
+{
+       return str_starts_with(str, std::basic_string<T>(prefix),
+                       case_insensitive);
+}
 
 /**
  * Splits a string into its component parts separated by the character