diff --git a/source/gui/CGUI.cpp b/source/gui/CGUI.cpp index ccccee0a97..cfa61c166a 100644 --- a/source/gui/CGUI.cpp +++ b/source/gui/CGUI.cpp @@ -1228,8 +1228,8 @@ void CGUI::Xeromyces_ReadIcon(XMBElement Element, CXeromyces* pFile) icon.m_SpriteName = attr_value; else if (attr_name == "size") { - CSize size; - if (!ParseString(this, attr_value.FromUTF8(), size)) + CSize2D size; + if (!ParseString(this, attr_value.FromUTF8(), size)) LOGERROR("Error parsing '%s' (\"%s\") inside .", attr_name, attr_value); else icon.m_Size = size; diff --git a/source/gui/CGUI.h b/source/gui/CGUI.h index ef498e5567..f7dbaa897c 100644 --- a/source/gui/CGUI.h +++ b/source/gui/CGUI.h @@ -28,6 +28,7 @@ #include "gui/SGUIIcon.h" #include "gui/SGUIStyle.h" #include "lib/input.h" +#include "maths/Size2D.h" #include "ps/Shapes.h" #include "ps/XML/Xeromyces.h" #include "scriptinterface/ScriptInterface.h" diff --git a/source/gui/CGUIText.cpp b/source/gui/CGUIText.cpp index 73e9c29fb4..74128cb590 100644 --- a/source/gui/CGUIText.cpp +++ b/source/gui/CGUIText.cpp @@ -35,20 +35,20 @@ extern float g_GuiScale; // TODO Gee: CRect => CPoint ? void SGenerateTextImage::SetupSpriteCall( const bool Left, CGUIText::SSpriteCall& SpriteCall, const float width, const float y, - const CSize& Size, const CStr& TextureName, const float BufferZone) + const CSize2D& Size, const CStr& TextureName, const float BufferZone) { // TODO Gee: Temp hardcoded values SpriteCall.m_Area.top = y + BufferZone; - SpriteCall.m_Area.bottom = y + BufferZone + Size.cy; + SpriteCall.m_Area.bottom = y + BufferZone + Size.Height; if (Left) { SpriteCall.m_Area.left = BufferZone; - SpriteCall.m_Area.right = Size.cx + BufferZone; + SpriteCall.m_Area.right = Size.Width + BufferZone; } else { - SpriteCall.m_Area.left = width-BufferZone - Size.cx; + SpriteCall.m_Area.left = width-BufferZone - Size.Width; SpriteCall.m_Area.right = width-BufferZone; } @@ -56,7 +56,7 @@ void SGenerateTextImage::SetupSpriteCall( m_YFrom = SpriteCall.m_Area.top - BufferZone; m_YTo = SpriteCall.m_Area.bottom + BufferZone; - m_Indentation = Size.cx + BufferZone * 2; + m_Indentation = Size.Width + BufferZone * 2; } CGUIText::CGUIText(const CGUI& pGUI, const CGUIString& string, const CStrW& FontW, const float Width, const float BufferZone, const IGUIObject* pObject) @@ -102,8 +102,8 @@ CGUIText::CGUIText(const CGUI& pGUI, const CGUIString& string, const CStrW& Font pos_last_img = std::max(pos_last_img, i); - x += Feedback.m_Size.cx; - prelim_line_height = std::max(prelim_line_height, Feedback.m_Size.cy); + x += Feedback.m_Size.Width; + prelim_line_height = std::max(prelim_line_height, Feedback.m_Size.Height); // If Width is 0, then there's no word-wrapping, disable NewLine. if (((Width != 0 && (x > Width - BufferZone || Feedback.m_NewLine)) || i == static_cast(string.m_Words.size()) - 2) && @@ -147,7 +147,7 @@ void CGUIText::SetupSpriteCalls( Image.SetupSpriteCall(j == CGUIString::SFeedback::Left, SpriteCall, Width, _y, icon.m_Size, icon.m_SpriteName, BufferZone); // Check if image is the lowest thing. - m_Size.cy = std::max(m_Size.cy, Image.m_YTo); + m_Size.Height = std::max(m_Size.Height, Image.m_YTo); Images[j].emplace_back(Image); m_SpriteCalls.emplace_back(std::move(SpriteCall)); @@ -171,7 +171,7 @@ void CGUIText::ComputeLineSize( const int i, const int temp_from, float& x, - CSize& line_size) const + CSize2D& line_size) const { for (int j = temp_from; j <= i; ++j) { @@ -184,7 +184,7 @@ void CGUIText::ComputeLineSize( string.GenerateTextCall(pGUI, Feedback2, Font, string.m_Words[j], string.m_Words[j+1], FirstLine); // Append X value. - x += Feedback2.m_Size.cx; + x += Feedback2.m_Size.Width; if (Width != 0 && x > width_range_to && j != temp_from && !Feedback2.m_NewLine) { @@ -192,12 +192,12 @@ void CGUIText::ComputeLineSize( // word and the next. When we're wrapping, we need subtract the width of the // space after the last word on the line before the wrap. CFontMetrics currentFont(Font); - line_size.cx -= currentFont.GetCharacterWidth(*L" "); + line_size.Width -= currentFont.GetCharacterWidth(*L" "); break; } // Let line_size.cy be the maximum m_Height we encounter. - line_size.cy = std::max(line_size.cy, Feedback2.m_Size.cy); + line_size.Height = std::max(line_size.Height, Feedback2.m_Size.Height); // If the current word is an explicit new line ("\n"), // break now before adding the width of this character. @@ -206,7 +206,7 @@ void CGUIText::ComputeLineSize( if (Width != 0 && Feedback2.m_NewLine) break; - line_size.cx += Feedback2.m_Size.cx; + line_size.Width += Feedback2.m_Size.Width; } } @@ -237,14 +237,14 @@ bool CGUIText::ProcessLine( // Reset X for the next loop x = width_range_from; - CSize line_size; + CSize2D line_size; ComputeLineSize(pGUI, string, Font, FirstLine, Width, width_range_to, i, temp_from, x, line_size); // Reset x once more x = width_range_from; // Move down, because font drawing starts from the baseline - y += line_size.cy; + y += line_size.Height; const float dx = GetLineOffset(align, width_range_from, width_range_to, line_size); @@ -255,8 +255,8 @@ bool CGUIText::ProcessLine( x = BufferZone; // Update dimensions - m_Size.cx = std::max(m_Size.cx, line_size.cx + BufferZone * 2); - m_Size.cy = std::max(m_Size.cy, y + BufferZone); + m_Size.Width = std::max(m_Size.Width, line_size.Width + BufferZone * 2); + m_Size.Height = std::max(m_Size.Height, y + BufferZone); FirstLine = false; @@ -315,7 +315,7 @@ float CGUIText::GetLineOffset( const EAlign align, const float width_range_from, const float width_range_to, - const CSize& line_size) const + const CSize2D& line_size) const { switch (align) { @@ -324,10 +324,10 @@ float CGUIText::GetLineOffset( return 0.f; case EAlign::CENTER: - return ((width_range_to - width_range_from) - line_size.cx) / 2; + return ((width_range_to - width_range_from) - line_size.Width) / 2; case EAlign::RIGHT: - return width_range_to - line_size.cx; + return width_range_to - line_size.Width; default: debug_warn(L"Broken EAlign in CGUIText()"); @@ -370,14 +370,14 @@ bool CGUIText::AssembleCalls( { tc.m_Pos = CPos(dx + x + x_pointer, y); - x_pointer += tc.m_Size.cx; + x_pointer += tc.m_Size.Width; if (tc.m_pSpriteCall) - tc.m_pSpriteCall->m_Area += tc.m_Pos - CSize(0, tc.m_pSpriteCall->m_Area.GetHeight()); + tc.m_pSpriteCall->m_Area += tc.m_Pos - CSize2D(0, tc.m_pSpriteCall->m_Area.GetHeight()); } // Append X value. - x += Feedback2.m_Size.cx; + x += Feedback2.m_Size.Width; // The first word overrides the width limit, what we // do, in those cases, are just drawing that word even diff --git a/source/gui/CGUIText.h b/source/gui/CGUIText.h index 617cf79bdd..79c315d425 100644 --- a/source/gui/CGUIText.h +++ b/source/gui/CGUIText.h @@ -21,6 +21,7 @@ #include "gui/CGUISprite.h" #include "gui/SettingTypes/CGUIColor.h" #include "gui/SettingTypes/EAlign.h" +#include "maths/Size2D.h" #include "ps/CStrIntern.h" #include "ps/Shapes.h" @@ -106,7 +107,7 @@ public: /** * Size */ - CSize m_Size; + CSize2D m_Size; /** * The string that is suppose to be rendered. @@ -172,7 +173,7 @@ public: */ void Draw(CGUI& pGUI, const CGUIColor& DefaultColor, const CPos& pos, const float z, const CRect& clipping) const; - const CSize& GetSize() const { return m_Size; } + const CSize2D& GetSize() const { return m_Size; } const std::list& GetSpriteCalls() const { return m_SpriteCalls; } @@ -209,7 +210,7 @@ public: const EAlign align, const float width_range_from, const float width_range_to, - const CSize& line_size) const; + const CSize2D& line_size) const; void ComputeLineRange( const SGenerateTextImages& Images, @@ -229,7 +230,7 @@ public: const int i, const int temp_from, float& x, - CSize& line_size) const; + CSize2D& line_size) const; bool AssembleCalls( const CGUI& pGUI, @@ -261,7 +262,7 @@ public: * Width and height of the whole output, used when setting up * scrollbars and such. */ - CSize m_Size; + CSize2D m_Size; }; struct SGenerateTextImage @@ -277,7 +278,7 @@ struct SGenerateTextImage void SetupSpriteCall( const bool Left, CGUIText::SSpriteCall& SpriteCall, const float width, const float y, - const CSize& Size, const CStr& TextureName, const float BufferZone); + const CSize2D& Size, const CStr& TextureName, const float BufferZone); }; #endif // INCLUDED_GUITEXT diff --git a/source/gui/GUIStringConversions.cpp b/source/gui/GUIStringConversions.cpp index a11403f1ec..abd7d9d9aa 100644 --- a/source/gui/GUIStringConversions.cpp +++ b/source/gui/GUIStringConversions.cpp @@ -106,7 +106,7 @@ bool CGUI::ParseString(const CGUI* pGUI, const CStrW& Value, CGUIColo } template <> -bool CGUI::ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, CSize& Output) +bool CGUI::ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, CSize2D& Output) { const unsigned int NUM_COORDS = 2; float coords[NUM_COORDS]; @@ -117,23 +117,23 @@ bool CGUI::ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, CSiz { if (stream.eof()) { - LOGWARNING("Too few CSize parameters (min %i). Your input: '%s'", NUM_COORDS, Value.ToUTF8().c_str()); + LOGWARNING("Too few CSize2D parameters (min %i). Your input: '%s'", NUM_COORDS, Value.ToUTF8().c_str()); return false; } stream >> coords[i]; if ((stream.rdstate() & std::wstringstream::failbit) != 0) { - LOGWARNING("Unable to parse CSize parameters. Your input: '%s'", Value.ToUTF8().c_str()); + LOGWARNING("Unable to parse CSize2D parameters. Your input: '%s'", Value.ToUTF8().c_str()); return false; } } - Output.cx = coords[0]; - Output.cy = coords[1]; + Output.Width = coords[0]; + Output.Height = coords[1]; if (!stream.eof()) { - LOGWARNING("Too many CSize parameters (max %i). Your input: '%s'", NUM_COORDS, Value.ToUTF8().c_str()); + LOGWARNING("Too many CSize2D parameters (max %i). Your input: '%s'", NUM_COORDS, Value.ToUTF8().c_str()); return false; } diff --git a/source/gui/ObjectBases/IGUITextOwner.cpp b/source/gui/ObjectBases/IGUITextOwner.cpp index 8268975296..7e94b71462 100644 --- a/source/gui/ObjectBases/IGUITextOwner.cpp +++ b/source/gui/ObjectBases/IGUITextOwner.cpp @@ -111,10 +111,10 @@ void IGUITextOwner::CalculateTextPosition(CRect& ObjSize, CPos& TextPos, CGUITex break; case EVAlign::CENTER: // Round to integer pixel values, else the fonts look awful - TextPos.y = floorf(ObjSize.CenterPoint().y - Text.GetSize().cy / 2.f); + TextPos.y = floorf(ObjSize.CenterPoint().y - Text.GetSize().Height / 2.f); break; case EVAlign::BOTTOM: - TextPos.y = ObjSize.bottom - Text.GetSize().cy; + TextPos.y = ObjSize.bottom - Text.GetSize().Height; break; default: debug_warn(L"Broken EVAlign in CButton::SetupText()"); diff --git a/source/gui/ObjectTypes/CChart.cpp b/source/gui/ObjectTypes/CChart.cpp index e27e026acf..40835854e8 100644 --- a/source/gui/ObjectTypes/CChart.cpp +++ b/source/gui/ObjectTypes/CChart.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2020 Wildfire Games. +/* Copyright (C) 2021 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -235,18 +235,18 @@ void CChart::SetupText() const float width = GetChartRect().GetWidth(); if (m_EqualX) { - CSize text_size = AddFormattedValue(m_FormatX, m_RightTop.X, m_Font, m_BufferZone); + CSize2D text_size = AddFormattedValue(m_FormatX, m_RightTop.X, m_Font, m_BufferZone); m_TextPositions.emplace_back(GetChartRect().BottomRight() - text_size); } else for (int i = 0; i < 3; ++i) { - CSize text_size = AddFormattedValue(m_FormatX, m_RightTop.X - (m_RightTop.X - m_LeftBottom.X) / 3 * i, m_Font, m_BufferZone); + CSize2D text_size = AddFormattedValue(m_FormatX, m_RightTop.X - (m_RightTop.X - m_LeftBottom.X) / 3 * i, m_Font, m_BufferZone); m_TextPositions.emplace_back(GetChartRect().BottomRight() - text_size - CPos(width / 3 * i, 0.f)); } } -CSize CChart::AddFormattedValue(const CStrW& format, const float value, const CStrW& font, const float buffer_zone) +CSize2D CChart::AddFormattedValue(const CStrW& format, const float value, const CStrW& font, const float buffer_zone) { // TODO: we need to catch cases with equal formatted values. CGUIString gui_str; @@ -278,7 +278,7 @@ CSize CChart::AddFormattedValue(const CStrW& format, const float value, const CS else { LOGERROR("Unsupported chart format: " + format.EscapeToPrintableASCII()); - return CSize(); + return CSize2D(); } return AddText(gui_str, font, 0, buffer_zone).GetSize(); diff --git a/source/gui/ObjectTypes/CChart.h b/source/gui/ObjectTypes/CChart.h index 7821e47c9d..d4d542a828 100644 --- a/source/gui/ObjectTypes/CChart.h +++ b/source/gui/ObjectTypes/CChart.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2020 Wildfire Games. +/* Copyright (C) 2021 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -24,6 +24,7 @@ #include "gui/SettingTypes/CGUIColor.h" #include "gui/SettingTypes/CGUIList.h" #include "gui/SettingTypes/CGUISeries.h" +#include "maths/Size2D.h" #include "maths/Vector2D.h" #include @@ -104,7 +105,7 @@ private: // Represents axes as triangles and draws them with DrawTriangleStrip. void DrawAxes(const CShaderProgramPtr& shader) const; - CSize AddFormattedValue(const CStrW& format, const float value, const CStrW& font, const float buffer_zone); + CSize2D AddFormattedValue(const CStrW& format, const float value, const CStrW& font, const float buffer_zone); void UpdateBounds(); }; diff --git a/source/gui/ObjectTypes/CInput.cpp b/source/gui/ObjectTypes/CInput.cpp index 67986337d0..0258c9920a 100644 --- a/source/gui/ObjectTypes/CInput.cpp +++ b/source/gui/ObjectTypes/CInput.cpp @@ -1124,8 +1124,8 @@ void CInput::HandleMessage(SGUIMessage& Message) // Tell the IME where to draw the candidate list SDL_Rect rect; - rect.h = m_CachedActualSize.GetSize().cy; - rect.w = m_CachedActualSize.GetSize().cx; + rect.h = m_CachedActualSize.GetSize().Height; + rect.w = m_CachedActualSize.GetSize().Width; rect.x = m_CachedActualSize.TopLeft().x; rect.y = m_CachedActualSize.TopLeft().y; SDL_SetTextInputRect(&rect); diff --git a/source/gui/ObjectTypes/CList.cpp b/source/gui/ObjectTypes/CList.cpp index fed8dbf14c..46c24da8ef 100644 --- a/source/gui/ObjectTypes/CList.cpp +++ b/source/gui/ObjectTypes/CList.cpp @@ -141,7 +141,7 @@ void CList::SetupText(bool append) } m_ItemsYPositions[i] = buffered_y; - buffered_y += text->GetSize().cy; + buffered_y += text->GetSize().Height; } m_ItemsYPositions[m_List.m_Items.size()] = buffered_y; diff --git a/source/gui/ObjectTypes/COList.cpp b/source/gui/ObjectTypes/COList.cpp index 6305e0c07e..900ddbbe93 100644 --- a/source/gui/ObjectTypes/COList.cpp +++ b/source/gui/ObjectTypes/COList.cpp @@ -76,7 +76,7 @@ void COList::SetupText() gui_string.SetValue(column.m_Heading); const CGUIText& text = AddText(gui_string, m_Font, width, m_BufferZone); - m_HeadingHeight = std::max(m_HeadingHeight, text.GetSize().cy + COLUMN_SHIFT.y); + m_HeadingHeight = std::max(m_HeadingHeight, text.GetSize().Height + COLUMN_SHIFT.y); } // Generate texts @@ -102,7 +102,7 @@ void COList::SetupText() align_string.SetValue(L" "); text = &AddText(align_string, m_Font, width, m_BufferZone); } - shift = std::max(shift, text->GetSize().cy); + shift = std::max(shift, text->GetSize().Height); } buffered_y += shift; } diff --git a/source/gui/ObjectTypes/CText.cpp b/source/gui/ObjectTypes/CText.cpp index 81fc053781..72000c1417 100644 --- a/source/gui/ObjectTypes/CText.cpp +++ b/source/gui/ObjectTypes/CText.cpp @@ -105,7 +105,7 @@ void CText::SetupText() if (m_ScrollBottom && GetScrollBar(0).GetPos() > GetScrollBar(0).GetMaxPos() - 1.5f) bottom = true; - GetScrollBar(0).SetScrollRange(m_GeneratedTexts[0].GetSize().cy); + GetScrollBar(0).SetScrollRange(m_GeneratedTexts[0].GetSize().Height); GetScrollBar(0).SetScrollSpace(m_CachedActualSize.GetHeight()); GetScrollBar(0).SetX(m_CachedActualSize.right); diff --git a/source/gui/ObjectTypes/CTooltip.cpp b/source/gui/ObjectTypes/CTooltip.cpp index 965eca50cb..b4b3d41fe9 100644 --- a/source/gui/ObjectTypes/CTooltip.cpp +++ b/source/gui/ObjectTypes/CTooltip.cpp @@ -87,8 +87,8 @@ void CTooltip::SetupText() const CPos& mousepos = m_Independent ? m_pGUI.GetMousePos() : m_MousePos; - float textwidth = m_GeneratedTexts[0].GetSize().cx; - float textheight = m_GeneratedTexts[0].GetSize().cy; + float textwidth = m_GeneratedTexts[0].GetSize().Width; + float textheight = m_GeneratedTexts[0].GetSize().Height; CGUISize size; size.pixel.left = mousepos.x + m_Offset.x; diff --git a/source/gui/SGUIIcon.h b/source/gui/SGUIIcon.h index 0ba23f3fb5..7a25eb4cc9 100644 --- a/source/gui/SGUIIcon.h +++ b/source/gui/SGUIIcon.h @@ -18,8 +18,8 @@ #ifndef INCLUDED_SGUIICON #define INCLUDED_SGUIICON +#include "maths/Size2D.h" #include "ps/CStr.h" -#include "ps/Shapes.h" /** * Icon, you create them in the XML file with root element . @@ -37,7 +37,7 @@ struct SGUIIcon CStr m_SpriteName; // Size - CSize m_Size; + CSize2D m_Size; }; #endif // INCLUDED_SGUIICON diff --git a/source/gui/Scripting/GuiScriptConversions.cpp b/source/gui/Scripting/GuiScriptConversions.cpp index f07e7f37f6..15e8e3e3ae 100644 --- a/source/gui/Scripting/GuiScriptConversions.cpp +++ b/source/gui/Scripting/GuiScriptConversions.cpp @@ -23,6 +23,7 @@ #include "gui/SettingTypes/CGUISeries.h" #include "gui/SettingTypes/CGUISize.h" #include "lib/external_libraries/libsdl.h" +#include "maths/Size2D.h" #include "maths/Vector2D.h" #include "ps/Hotkey.h" #include "ps/CLogger.h" @@ -157,28 +158,28 @@ template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS: */ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CGUIColor& out) = delete; -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CSize& val) +template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CSize2D& val) { - CreateObject(rq, ret, "width", val.cx, "height", val.cy); + CreateObject(rq, ret, "width", val.Width, "height", val.Height); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CSize& out) +template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CSize2D& out) { if (!v.isObject()) { - LOGERROR("CSize value must be an object!"); + LOGERROR("CSize2D value must be an object!"); return false; } - if (!FromJSProperty(rq, v, "width", out.cx)) + if (!FromJSProperty(rq, v, "width", out.Width)) { - LOGERROR("Failed to get CSize.cx property"); + LOGERROR("Failed to get CSize2D.Width property"); return false; } - if (!FromJSProperty(rq, v, "height", out.cy)) + if (!FromJSProperty(rq, v, "height", out.Height)) { - LOGERROR("Failed to get CSize.cy property"); + LOGERROR("Failed to get CSize2D.Height property"); return false; } diff --git a/source/gui/SettingTypes/CGUIString.cpp b/source/gui/SettingTypes/CGUIString.cpp index 70fa2e2586..376643b753 100644 --- a/source/gui/SettingTypes/CGUIString.cpp +++ b/source/gui/SettingTypes/CGUIString.cpp @@ -46,7 +46,7 @@ void CGUIString::SFeedback::Reset() m_Images[Right].clear(); m_TextCalls.clear(); m_SpriteCalls.clear(); - m_Size = CSize(); + m_Size = CSize2D(); m_NewLine = false; } @@ -129,11 +129,11 @@ void CGUIString::GenerateTextCall(const CGUI& pGUI, SFeedback& Feedback, CStrInt // Get Icon from icon database in pGUI const SGUIIcon& icon = pGUI.GetIcon(path); - const CSize& size = icon.m_Size; + const CSize2D& size = icon.m_Size; // append width, and make maximum height the height. - Feedback.m_Size.cx += size.cx; - Feedback.m_Size.cy = std::max(Feedback.m_Size.cy, size.cy); + Feedback.m_Size.Width += size.Width; + Feedback.m_Size.Height = std::max(Feedback.m_Size.Height, size.Height); // These are also needed later TextCall.m_Size = size; @@ -145,9 +145,9 @@ void CGUIString::GenerateTextCall(const CGUI& pGUI, SFeedback& Feedback, CStrInt if (tagAttrib.attrib == L"displace" && !tagAttrib.value.empty()) { // Displace the sprite - CSize displacement; + CSize2D displacement; // Parse the value - if (!CGUI::ParseString(&pGUI, tagAttrib.value, displacement)) + if (!CGUI::ParseString(&pGUI, tagAttrib.value, displacement)) LOGERROR("Error parsing 'displace' value for tag [ICON]"); else SpriteCall.m_Area += displacement; @@ -206,7 +206,7 @@ void CGUIString::GenerateTextCall(const CGUI& pGUI, SFeedback& Feedback, CStrInt } // Calculate the size of the font - CSize size; + CSize2D size; int cx, cy; CFontMetrics font (TextCall.m_Font); font.CalculateStringSize(TextCall.m_String.c_str(), cx, cy); @@ -215,12 +215,12 @@ void CGUIString::GenerateTextCall(const CGUI& pGUI, SFeedback& Feedback, CStrInt if (!FirstLine) cy = font.GetLineSpacing(); - size.cx = (float)cx; - size.cy = (float)cy; + size.Width = (float)cx; + size.Height = (float)cy; // Append width, and make maximum height the height. - Feedback.m_Size.cx += size.cx; - Feedback.m_Size.cy = std::max(Feedback.m_Size.cy, size.cy); + Feedback.m_Size.Width += size.Width; + Feedback.m_Size.Height = std::max(Feedback.m_Size.Height, size.Height); // These are also needed later TextCall.m_Size = size; diff --git a/source/gui/SettingTypes/CGUIString.h b/source/gui/SettingTypes/CGUIString.h index 691075c290..ba4bd95a0e 100644 --- a/source/gui/SettingTypes/CGUIString.h +++ b/source/gui/SettingTypes/CGUIString.h @@ -149,7 +149,7 @@ public: /** * Width and Height *feedback* */ - CSize m_Size; + CSize2D m_Size; /** * If the word inputted was a new line. diff --git a/source/gui/SettingTypes/EAlign.h b/source/gui/SettingTypes/EAlign.h index 77e523ccb7..206819f260 100644 --- a/source/gui/SettingTypes/EAlign.h +++ b/source/gui/SettingTypes/EAlign.h @@ -18,7 +18,7 @@ #ifndef INCLUDED_EALIGN #define INCLUDED_EALIGN -enum EAlign +enum class EAlign { LEFT, RIGHT, diff --git a/source/gui/tests/test_ParseString.h b/source/gui/tests/test_ParseString.h index f579914296..0586f6cd7c 100644 --- a/source/gui/tests/test_ParseString.h +++ b/source/gui/tests/test_ParseString.h @@ -79,14 +79,14 @@ public: void test_size() { TestLogger nolog; - CSize test; + CSize2D test; - TS_ASSERT(CGUI::ParseString(nullptr, CStrW(L"0.0 10.0"), test)); - TS_ASSERT_EQUALS(CSize(0.0, 10.0), test); + TS_ASSERT(CGUI::ParseString(nullptr, CStrW(L"0.0 10.0"), test)); + TS_ASSERT_EQUALS(CSize2D(0.0, 10.0), test); - TS_ASSERT(!CGUI::ParseString(nullptr, CStrW(L"0"), test)); - TS_ASSERT(!CGUI::ParseString(nullptr, CStrW(L"0 10 20"), test)); - TS_ASSERT(!CGUI::ParseString(nullptr, CStrW(L"0,0 10,0"), test)); + TS_ASSERT(!CGUI::ParseString(nullptr, CStrW(L"0"), test)); + TS_ASSERT(!CGUI::ParseString(nullptr, CStrW(L"0 10 20"), test)); + TS_ASSERT(!CGUI::ParseString(nullptr, CStrW(L"0,0 10,0"), test)); } void test_pos() diff --git a/source/maths/Size2D.cpp b/source/maths/Size2D.cpp new file mode 100644 index 0000000000..8f3d47e1dd --- /dev/null +++ b/source/maths/Size2D.cpp @@ -0,0 +1,93 @@ +/* Copyright (C) 2021 Wildfire Games. + * This file is part of 0 A.D. + * + * 0 A.D. is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * 0 A.D. is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with 0 A.D. If not, see . + */ + +#include "precompiled.h" + +#include "Size2D.h" + +#include "ps/Shapes.h" + +CSize2D::CSize2D() = default; + +CSize2D::CSize2D(const CSize2D& size) : Width(size.Width), Height(size.Height) +{ +} + +CSize2D::CSize2D(const float width, const float height) : Width(width), Height(height) +{ +} + +CSize2D& CSize2D::operator=(const CSize2D& size) +{ + Width = size.Width; + Height = size.Height; + return *this; +} + +bool CSize2D::operator==(const CSize2D& size) const +{ + return Width == size.Width && Height == size.Height; +} + +bool CSize2D::operator!=(const CSize2D& size) const +{ + return !(*this == size); +} + +CSize2D CSize2D::operator+(const CSize2D& size) const +{ + return CSize2D(Width + size.Width, Height + size.Height); +} + +CSize2D CSize2D::operator-(const CSize2D& size) const +{ + return CSize2D(Width - size.Width, Height - size.Height); +} + +CSize2D CSize2D::operator/(const float a) const +{ + return CSize2D(Width / a, Height / a); +} + +CSize2D CSize2D::operator*(const float a) const +{ + return CSize2D(Width * a, Height * a); +} + +void CSize2D::operator+=(const CSize2D& size) +{ + Width += size.Width; + Height += size.Height; +} + +void CSize2D::operator-=(const CSize2D& size) +{ + Width -= size.Width; + Height -= size.Height; +} + +void CSize2D::operator/=(const float a) +{ + Width /= a; + Height /= a; +} + +void CSize2D::operator*=(const float a) +{ + Width *= a; + Height *= a; +} diff --git a/source/maths/Size2D.h b/source/maths/Size2D.h new file mode 100644 index 0000000000..bb9a9c08dd --- /dev/null +++ b/source/maths/Size2D.h @@ -0,0 +1,52 @@ +/* Copyright (C) 2021 Wildfire Games. + * This file is part of 0 A.D. + * + * 0 A.D. is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * 0 A.D. is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with 0 A.D. If not, see . + */ + +#ifndef INCLUDED_SIZE2D +#define INCLUDED_SIZE2D + +class CPos; +class CRect; + +/* + * Provides an interface for a size - geometric property in R2. + */ +class CSize2D +{ +public: + CSize2D(); + CSize2D(const CSize2D& size); + CSize2D(const float width, const float height); + + CSize2D& operator=(const CSize2D& size); + bool operator==(const CSize2D& size) const; + bool operator!=(const CSize2D& size) const; + + CSize2D operator+(const CSize2D& size) const; + CSize2D operator-(const CSize2D& size) const; + CSize2D operator/(const float a) const; + CSize2D operator*(const float a) const; + + void operator+=(const CSize2D& a); + void operator-=(const CSize2D& a); + void operator/=(const float a); + void operator*=(const float a); + +public: + float Width = 0.0f, Height = 0.0f; +}; + +#endif // INCLUDED_SIZE2D diff --git a/source/ps/Shapes.cpp b/source/ps/Shapes.cpp index 430ede360c..627eb08e26 100644 --- a/source/ps/Shapes.cpp +++ b/source/ps/Shapes.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2019 Wildfire Games. +/* Copyright (C) 2021 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -19,6 +19,8 @@ #include "Shapes.h" +#include "maths/Size2D.h" + CRect::CRect() : left(0.f), top(0.f), right(0.f), bottom(0.f) { @@ -34,8 +36,8 @@ CRect::CRect(const CPos &pos) : { } -CRect::CRect(const CSize& size) : - left(0.f), top(0.f), right(size.cx), bottom(size.cy) +CRect::CRect(const CSize2D& size) : + left(0.f), top(0.f), right(size.Width), bottom(size.Height) { } @@ -44,8 +46,8 @@ CRect::CRect(const CPos& upperleft, const CPos& bottomright) : { } -CRect::CRect(const CPos& pos, const CSize& size) : - left(pos.x), top(pos.y), right(pos.x + size.cx), bottom(pos.y + size.cy) +CRect::CRect(const CPos& pos, const CSize2D& size) : + left(pos.x), top(pos.y), right(pos.x + size.Width), bottom(pos.y + size.Height) { } @@ -96,9 +98,9 @@ CRect CRect::operator+(const CPos& a) const return CRect(left + a.x, top + a.y, right + a.x, bottom + a.y); } -CRect CRect::operator+(const CSize& a) const +CRect CRect::operator+(const CSize2D& a) const { - return CRect(left + a.cx, top + a.cy, right + a.cx, bottom + a.cy); + return CRect(left + a.Width, top + a.Height, right + a.Width, bottom + a.Height); } CRect CRect::operator-(const CRect& a) const @@ -111,9 +113,9 @@ CRect CRect::operator-(const CPos& a) const return CRect(left - a.x, top - a.y, right - a.x, bottom - a.y); } -CRect CRect::operator-(const CSize& a) const +CRect CRect::operator-(const CSize2D& a) const { - return CRect(left - a.cx, top - a.cy, right - a.cx, bottom - a.cy); + return CRect(left - a.Width, top - a.Height, right - a.Width, bottom - a.Height); } void CRect::operator+=(const CRect& a) @@ -132,12 +134,12 @@ void CRect::operator+=(const CPos& a) bottom += a.y; } -void CRect::operator+=(const CSize& a) +void CRect::operator+=(const CSize2D& a) { - left += a.cx; - top += a.cy; - right += a.cx; - bottom += a.cy; + left += a.Width; + top += a.Height; + right += a.Width; + bottom += a.Height; } void CRect::operator-=(const CRect& a) @@ -156,12 +158,12 @@ void CRect::operator-=(const CPos& a) bottom -= a.y; } -void CRect::operator-=(const CSize& a) +void CRect::operator-=(const CSize2D& a) { - left -= a.cx; - top -= a.cy; - right -= a.cx; - bottom -= a.cy; + left -= a.Width; + top -= a.Height; + right -= a.Width; + bottom -= a.Height; } float CRect::GetWidth() const @@ -174,9 +176,9 @@ float CRect::GetHeight() const return bottom-top; } -CSize CRect::GetSize() const +CSize2D CRect::GetSize() const { - return CSize(right - left, bottom - top); + return CSize2D(right - left, bottom - top); } CPos CRect::TopLeft() const @@ -227,7 +229,7 @@ CPos::CPos(const CPos& pos) : x(pos.x), y(pos.y) { } -CPos::CPos(const CSize& s) : x(s.cx), y(s.cy) +CPos::CPos(const CSize2D& s) : x(s.Width), y(s.Height) { } @@ -267,9 +269,9 @@ CPos CPos::operator+(const CPos& a) const return CPos(x + a.x, y + a.y); } -CPos CPos::operator+(const CSize& a) const +CPos CPos::operator+(const CSize2D& a) const { - return CPos(x + a.cx, y + a.cy); + return CPos(x + a.Width, y + a.Height); } CPos CPos::operator-(const CPos& a) const @@ -277,9 +279,9 @@ CPos CPos::operator-(const CPos& a) const return CPos(x - a.x, y - a.y); } -CPos CPos::operator-(const CSize& a) const +CPos CPos::operator-(const CSize2D& a) const { - return CPos(x - a.cx, y - a.cy); + return CPos(x - a.Width, y - a.Height); } void CPos::operator+=(const CPos& a) @@ -288,10 +290,10 @@ void CPos::operator+=(const CPos& a) y += a.y; } -void CPos::operator+=(const CSize& a) +void CPos::operator+=(const CSize2D& a) { - x += a.cx; - y += a.cy; + x += a.Width; + y += a.Height; } void CPos::operator-=(const CPos& a) @@ -300,101 +302,8 @@ void CPos::operator-=(const CPos& a) y -= a.y; } -void CPos::operator-=(const CSize& a) +void CPos::operator-=(const CSize2D& a) { - x -= a.cx; - y -= a.cy; -} - -/*************************************************************************/ - -CSize::CSize() : cx(0.f), cy(0.f) -{ -} - -CSize::CSize(const CSize& size) : cx(size.cx), cy(size.cy) -{ -} - -CSize::CSize(const CRect &rect) : cx(rect.GetWidth()), cy(rect.GetHeight()) -{ -} - -CSize::CSize(const CPos &pos) : cx(pos.x), cy(pos.y) -{ -} - -CSize::CSize(const float sx, const float sy) : cx(sx), cy(sy) -{ -} - -CSize& CSize::operator=(const CSize& a) -{ - cx = a.cx; - cy = a.cy; - return *this; -} - -bool CSize::operator==(const CSize &a) const -{ - return cx == a.cx && cy == a.cy; -} - -bool CSize::operator!=(const CSize& a) const -{ - return !(*this == a); -} - -CSize CSize::operator-() const -{ - return CSize(-cx, -cy); -} - -CSize CSize::operator+() const -{ - return *this; -} - -CSize CSize::operator+(const CSize& a) const -{ - return CSize(cx + a.cx, cy + a.cy); -} - -CSize CSize::operator-(const CSize& a) const -{ - return CSize(cx - a.cx, cy - a.cy); -} - -CSize CSize::operator/(const float a) const -{ - return CSize(cx / a, cy / a); -} - -CSize CSize::operator*(const float a) const -{ - return CSize(cx * a, cy * a); -} - -void CSize::operator+=(const CSize& a) -{ - cx += a.cx; - cy += a.cy; -} - -void CSize::operator-=(const CSize& a) -{ - cx -= a.cx; - cy -= a.cy; -} - -void CSize::operator/=(const float a) -{ - cx /= a; - cy /= a; -} - -void CSize::operator*=(const float a) -{ - cx *= a; - cy *= a; + x -= a.Width; + y -= a.Height; } diff --git a/source/ps/Shapes.h b/source/ps/Shapes.h index f7a011e648..8ddbb8001e 100644 --- a/source/ps/Shapes.h +++ b/source/ps/Shapes.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2019 Wildfire Games. +/* Copyright (C) 2021 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -15,18 +15,11 @@ * along with 0 A.D. If not, see . */ -/* ---Overview-- - - Classes mostly useful for representing 2D screen overlays; - includes functionality for overlay position, color, texture and borders. -*/ - #ifndef INCLUDED_SHAPES #define INCLUDED_SHAPES class CPos; -class CSize; +class CSize2D; /** @@ -39,9 +32,9 @@ class CRect public: CRect(); CRect(const CPos &pos); - CRect(const CSize &size); + CRect(const CSize2D &size); CRect(const CPos &upperleft, const CPos &bottomright); - CRect(const CPos &pos, const CSize &size); + CRect(const CPos &pos, const CSize2D &size); CRect(const float l, const float t, const float r, const float b); CRect(const CRect&); @@ -53,17 +46,17 @@ public: CRect operator+(const CRect& a) const; CRect operator+(const CPos& a) const; - CRect operator+(const CSize& a) const; + CRect operator+(const CSize2D& a) const; CRect operator-(const CRect& a) const; CRect operator-(const CPos& a) const; - CRect operator-(const CSize& a) const; + CRect operator-(const CSize2D& a) const; void operator+=(const CRect& a); void operator+=(const CPos& a); - void operator+=(const CSize& a); + void operator+=(const CSize2D& a); void operator-=(const CRect& a); void operator-=(const CPos& a); - void operator-=(const CSize& a); + void operator-=(const CSize2D& a); /** * @return Width of Rectangle @@ -78,7 +71,7 @@ public: /** * Get Size */ - CSize GetSize() const; + CSize2D GetSize() const; /** * Get Position equivalent to top/left corner @@ -128,14 +121,14 @@ public: /** * Made to represent screen positions and delta values. * @see CRect - * @see CSize + * @see CSize2D */ class CPos { public: CPos(); CPos(const CPos& pos); - CPos(const CSize &pos); + CPos(const CSize2D &pos); CPos(const float px, const float py); CPos& operator=(const CPos& a); @@ -145,14 +138,14 @@ public: CPos operator+() const; CPos operator+(const CPos& a) const; - CPos operator+(const CSize& a) const; + CPos operator+(const CSize2D& a) const; CPos operator-(const CPos& a) const; - CPos operator-(const CSize& a) const; + CPos operator-(const CSize2D& a) const; void operator+=(const CPos& a); - void operator+=(const CSize& a); + void operator+=(const CSize2D& a); void operator-=(const CPos& a); - void operator-=(const CSize& a); + void operator-=(const CSize2D& a); public: /** @@ -161,44 +154,4 @@ public: float x, y; }; -/** - * Made to represent a screen size, should in philosophy - * be made of unsigned ints, but for the sake of compatibility - * with CRect and CPos it's not. - * @see CRect - * @see CPos - */ -class CSize -{ -public: - CSize(); - CSize(const CRect &rect); - CSize(const CPos &pos); - CSize(const CSize& size); - CSize(const float sx, const float sy); - - CSize& operator=(const CSize& a); - bool operator==(const CSize& a) const; - bool operator!=(const CSize& a) const; - CSize operator-() const; - CSize operator+() const; - - CSize operator+(const CSize& a) const; - CSize operator-(const CSize& a) const; - CSize operator/(const float a) const; - CSize operator*(const float a) const; - - void operator+=(const CSize& a); - void operator-=(const CSize& a); - void operator/=(const float a); - void operator*=(const float a); - -public: - /** - * Size - */ - float cx, cy; -}; - - #endif // INCLUDED_SHAPES