Fix background formspec elements from interfering with each other
authorrubenwardy <rubenwardy@gmail.com>
Sun, 7 Aug 2016 13:32:31 +0000 (14:32 +0100)
committerrubenwardy <rubenwardy@gmail.com>
Mon, 29 Aug 2016 00:15:31 +0000 (01:15 +0100)
Fixes #4397

src/guiFormSpecMenu.cpp
src/guiFormSpecMenu.h

index 2564671a327c9595a1caf9429faf107e924ced3b..084a53c9da5fdde0c74cd045fa9fee2d026b60be 100644 (file)
@@ -637,17 +637,17 @@ void GUIFormSpecMenu::parseBackground(parserData* data,std::string element)
                geom.X = stof(v_geom[0]) * (float)spacing.X;
                geom.Y = stof(v_geom[1]) * (float)spacing.Y;
 
-               if (parts.size() == 4) {
-                       m_clipbackground = is_yes(parts[3]);
-                       if (m_clipbackground) {
-                               pos.X = stoi(v_pos[0]); //acts as offset
-                               pos.Y = stoi(v_pos[1]); //acts as offset
-                       }
+               if (!data->explicit_size)
+                       warningstream<<"invalid use of background without a size[] element"<<std::endl;
+
+               bool clip = false;
+               if (parts.size() == 4 && is_yes(parts[3])) {
+                       pos.X = stoi(v_pos[0]); //acts as offset
+                       pos.Y = stoi(v_pos[1]); //acts as offset
+                       clip = true;
                }
+               m_backgrounds.push_back(ImageDrawSpec(name, pos, geom, clip));
 
-               if(!data->explicit_size)
-                       warningstream<<"invalid use of background without a size[] element"<<std::endl;
-               m_backgrounds.push_back(ImageDrawSpec(name, pos, geom));
                return;
        }
        errorstream<< "Invalid background element(" << parts.size() << "): '" << element << "'"  << std::endl;
@@ -1892,7 +1892,6 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
        m_slotbordercolor = video::SColor(200,0,0,0);
        m_slotborder = false;
 
-       m_clipbackground = false;
        // Add tooltip
        {
                assert(m_tooltip_element == NULL);
@@ -2344,7 +2343,7 @@ void GUIFormSpecMenu::drawMenu()
                        // Image rectangle on screen
                        core::rect<s32> rect = imgrect + spec.pos;
 
-                       if (m_clipbackground) {
+                       if (spec.clip) {
                                core::dimension2d<s32> absrec_size = AbsoluteRect.getSize();
                                rect = core::rect<s32>(AbsoluteRect.UpperLeftCorner.X - spec.pos.X,
                                                                        AbsoluteRect.UpperLeftCorner.Y - spec.pos.Y,
@@ -2358,8 +2357,7 @@ void GUIFormSpecMenu::drawMenu()
                                core::rect<s32>(core::position2d<s32>(0,0),
                                                core::dimension2di(texture->getOriginalSize())),
                                NULL/*&AbsoluteClippingRect*/, colors, true);
-               }
-               else {
+               } else {
                        errorstream << "GUIFormSpecMenu::drawMenu() Draw backgrounds unable to load texture:" << std::endl;
                        errorstream << "\t" << spec.name << std::endl;
                }
index d06aa6cf5c319d468a12f0322d5458d7fd501ff3..dbcbf126abf7d60c9be0ed352992ca2391901ac4 100644 (file)
@@ -143,9 +143,10 @@ class GUIFormSpecMenu : public GUIModalMenu
        struct ImageDrawSpec
        {
                ImageDrawSpec():
-                       parent_button(NULL)
-               {
-               }
+                       parent_button(NULL),
+                       clip(false)
+               {}
+
                ImageDrawSpec(const std::string &a_name,
                                const std::string &a_item_name,
                                gui::IGUIButton *a_parent_button,
@@ -155,9 +156,10 @@ class GUIFormSpecMenu : public GUIModalMenu
                        parent_button(a_parent_button),
                        pos(a_pos),
                        geom(a_geom),
-                       scale(true)
-               {
-               }
+                       scale(true),
+                       clip(false)
+               {}
+
                ImageDrawSpec(const std::string &a_name,
                                const std::string &a_item_name,
                                const v2s32 &a_pos, const v2s32 &a_geom):
@@ -166,32 +168,36 @@ class GUIFormSpecMenu : public GUIModalMenu
                        parent_button(NULL),
                        pos(a_pos),
                        geom(a_geom),
-                       scale(true)
-               {
-               }
+                       scale(true),
+                       clip(false)
+               {}
+
                ImageDrawSpec(const std::string &a_name,
-                               const v2s32 &a_pos, const v2s32 &a_geom):
+                               const v2s32 &a_pos, const v2s32 &a_geom, bool clip=false):
                        name(a_name),
                        parent_button(NULL),
                        pos(a_pos),
                        geom(a_geom),
-                       scale(true)
-               {
-               }
+                       scale(true),
+                       clip(clip)
+               {}
+
                ImageDrawSpec(const std::string &a_name,
                                const v2s32 &a_pos):
                        name(a_name),
                        parent_button(NULL),
                        pos(a_pos),
-                       scale(false)
-               {
-               }
+                       scale(false),
+                       clip(false)
+               {}
+
                std::string name;
                std::string item_name;
                gui::IGUIButton *parent_button;
                v2s32 pos;
                v2s32 geom;
                bool scale;
+               bool clip;
        };
 
        struct FieldSpec
@@ -428,7 +434,6 @@ protected:
 
        bool m_bgfullscreen;
        bool m_slotborder;
-       bool m_clipbackground;
        video::SColor m_bgcolor;
        video::SColor m_slotbg_n;
        video::SColor m_slotbg_h;