1
0
forked from 0ad/0ad

Clip rendered text correctly

General idea acked by: vladislavbelov
Tested by: Langbart
Differential Revision: https://code.wildfiregames.com/D4006
This was SVN commit r25534.
This commit is contained in:
Imarok 2021-05-23 22:05:17 +00:00
parent 1e18a93302
commit 4e8691acde
2 changed files with 12 additions and 6 deletions

View File

@ -428,7 +428,7 @@ bool CGUIText::AssembleCalls(
return done;
}
void CGUIText::Draw(CGUI& pGUI, const CGUIColor& DefaultColor, const CVector2D& pos, const CRect& clipping) const
void CGUIText::Draw(CGUI& pGUI, const CGUIColor& DefaultColor, const CVector2D& pos, CRect clipping) const
{
CShaderTechniquePtr tech = g_Renderer.GetShaderManager().LoadEffect(str_gui_text);
@ -437,12 +437,18 @@ void CGUIText::Draw(CGUI& pGUI, const CGUIColor& DefaultColor, const CVector2D&
bool isClipped = clipping != CRect();
if (isClipped)
{
// Make clipping rect as small as possible to prevent rounding errors
clipping.top = std::ceil(clipping.top);
clipping.bottom = std::floor(clipping.bottom);
clipping.left = std::ceil(clipping.left);
clipping.right = std::floor(clipping.right);
glEnable(GL_SCISSOR_TEST);
glScissor(
clipping.left * g_GuiScale,
g_yres - clipping.bottom * g_GuiScale,
clipping.GetWidth() * g_GuiScale,
clipping.GetHeight() * g_GuiScale);
std::ceil(clipping.left * g_GuiScale),
std::ceil(g_yres - clipping.bottom * g_GuiScale),
std::floor(clipping.GetWidth() * g_GuiScale),
std::floor(clipping.GetHeight() * g_GuiScale));
}
CTextRenderer textRenderer(tech->GetShader());

View File

@ -168,7 +168,7 @@ public:
/**
* Draw this CGUIText object
*/
void Draw(CGUI& pGUI, const CGUIColor& DefaultColor, const CVector2D& pos, const CRect& clipping) const;
void Draw(CGUI& pGUI, const CGUIColor& DefaultColor, const CVector2D& pos, CRect clipping) const;
const CSize2D& GetSize() const { return m_Size; }