Fix background formspec elements from interfering with each other

Fixes #4397
This commit is contained in:
rubenwardy 2016-08-07 14:32:31 +01:00
parent fbe4a9267f
commit 78ff5c1936
2 changed files with 34 additions and 31 deletions

@ -637,17 +637,17 @@ void GUIFormSpecMenu::parseBackground(parserData* data,std::string element)
geom.X = stof(v_geom[0]) * (float)spacing.X; geom.X = stof(v_geom[0]) * (float)spacing.X;
geom.Y = stof(v_geom[1]) * (float)spacing.Y; geom.Y = stof(v_geom[1]) * (float)spacing.Y;
if (parts.size() == 4) { if (!data->explicit_size)
m_clipbackground = is_yes(parts[3]); warningstream<<"invalid use of background without a size[] element"<<std::endl;
if (m_clipbackground) {
bool clip = false;
if (parts.size() == 4 && is_yes(parts[3])) {
pos.X = stoi(v_pos[0]); //acts as offset pos.X = stoi(v_pos[0]); //acts as offset
pos.Y = stoi(v_pos[1]); //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; return;
} }
errorstream<< "Invalid background element(" << parts.size() << "): '" << element << "'" << std::endl; 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_slotbordercolor = video::SColor(200,0,0,0);
m_slotborder = false; m_slotborder = false;
m_clipbackground = false;
// Add tooltip // Add tooltip
{ {
assert(m_tooltip_element == NULL); assert(m_tooltip_element == NULL);
@ -2344,7 +2343,7 @@ void GUIFormSpecMenu::drawMenu()
// Image rectangle on screen // Image rectangle on screen
core::rect<s32> rect = imgrect + spec.pos; core::rect<s32> rect = imgrect + spec.pos;
if (m_clipbackground) { if (spec.clip) {
core::dimension2d<s32> absrec_size = AbsoluteRect.getSize(); core::dimension2d<s32> absrec_size = AbsoluteRect.getSize();
rect = core::rect<s32>(AbsoluteRect.UpperLeftCorner.X - spec.pos.X, rect = core::rect<s32>(AbsoluteRect.UpperLeftCorner.X - spec.pos.X,
AbsoluteRect.UpperLeftCorner.Y - spec.pos.Y, AbsoluteRect.UpperLeftCorner.Y - spec.pos.Y,
@ -2358,8 +2357,7 @@ void GUIFormSpecMenu::drawMenu()
core::rect<s32>(core::position2d<s32>(0,0), core::rect<s32>(core::position2d<s32>(0,0),
core::dimension2di(texture->getOriginalSize())), core::dimension2di(texture->getOriginalSize())),
NULL/*&AbsoluteClippingRect*/, colors, true); NULL/*&AbsoluteClippingRect*/, colors, true);
} } else {
else {
errorstream << "GUIFormSpecMenu::drawMenu() Draw backgrounds unable to load texture:" << std::endl; errorstream << "GUIFormSpecMenu::drawMenu() Draw backgrounds unable to load texture:" << std::endl;
errorstream << "\t" << spec.name << std::endl; errorstream << "\t" << spec.name << std::endl;
} }

@ -143,9 +143,10 @@ class GUIFormSpecMenu : public GUIModalMenu
struct ImageDrawSpec struct ImageDrawSpec
{ {
ImageDrawSpec(): ImageDrawSpec():
parent_button(NULL) parent_button(NULL),
{ clip(false)
} {}
ImageDrawSpec(const std::string &a_name, ImageDrawSpec(const std::string &a_name,
const std::string &a_item_name, const std::string &a_item_name,
gui::IGUIButton *a_parent_button, gui::IGUIButton *a_parent_button,
@ -155,9 +156,10 @@ class GUIFormSpecMenu : public GUIModalMenu
parent_button(a_parent_button), parent_button(a_parent_button),
pos(a_pos), pos(a_pos),
geom(a_geom), geom(a_geom),
scale(true) scale(true),
{ clip(false)
} {}
ImageDrawSpec(const std::string &a_name, ImageDrawSpec(const std::string &a_name,
const std::string &a_item_name, const std::string &a_item_name,
const v2s32 &a_pos, const v2s32 &a_geom): const v2s32 &a_pos, const v2s32 &a_geom):
@ -166,32 +168,36 @@ class GUIFormSpecMenu : public GUIModalMenu
parent_button(NULL), parent_button(NULL),
pos(a_pos), pos(a_pos),
geom(a_geom), geom(a_geom),
scale(true) scale(true),
{ clip(false)
} {}
ImageDrawSpec(const std::string &a_name, 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), name(a_name),
parent_button(NULL), parent_button(NULL),
pos(a_pos), pos(a_pos),
geom(a_geom), geom(a_geom),
scale(true) scale(true),
{ clip(clip)
} {}
ImageDrawSpec(const std::string &a_name, ImageDrawSpec(const std::string &a_name,
const v2s32 &a_pos): const v2s32 &a_pos):
name(a_name), name(a_name),
parent_button(NULL), parent_button(NULL),
pos(a_pos), pos(a_pos),
scale(false) scale(false),
{ clip(false)
} {}
std::string name; std::string name;
std::string item_name; std::string item_name;
gui::IGUIButton *parent_button; gui::IGUIButton *parent_button;
v2s32 pos; v2s32 pos;
v2s32 geom; v2s32 geom;
bool scale; bool scale;
bool clip;
}; };
struct FieldSpec struct FieldSpec
@ -428,7 +434,6 @@ protected:
bool m_bgfullscreen; bool m_bgfullscreen;
bool m_slotborder; bool m_slotborder;
bool m_clipbackground;
video::SColor m_bgcolor; video::SColor m_bgcolor;
video::SColor m_slotbg_n; video::SColor m_slotbg_n;
video::SColor m_slotbg_h; video::SColor m_slotbg_h;