1
0
forked from 0ad/0ad

Provides Canvas2D for sprite rendering.

Differential Revision: https://code.wildfiregames.com/D4029
This was SVN commit r25591.
This commit is contained in:
Vladislav Belov 2021-05-29 19:47:36 +00:00
parent 283f524fcf
commit 57dde8d082
31 changed files with 125 additions and 117 deletions

View File

@ -85,7 +85,7 @@ void CCanvas2D::DrawRect(const CRect& rect, const CColor& color)
tech->BeginPass();
CShaderProgramPtr shader = tech->GetShader();
shader->BindTexture(str_tex, g_Renderer.GetTextureManager().GetWhiteTexture());
shader->BindTexture(str_tex, g_Renderer.GetTextureManager().GetTransparentTexture());
shader->Uniform(str_transform, GetDefaultGuiMatrix());
shader->Uniform(str_colorAdd, color);
shader->Uniform(str_colorMul, CColor(0.0f, 0.0f, 0.0f, 0.0f));

View File

@ -350,7 +350,7 @@ void CGUI::Draw()
visibleObject.object->Draw(canvas);
}
void CGUI::DrawSprite(const CGUISpriteInstance& Sprite, const CRect& Rect, const CRect& UNUSED(Clipping))
void CGUI::DrawSprite(const CGUISpriteInstance& Sprite, CCanvas2D& canvas, const CRect& Rect, const CRect& UNUSED(Clipping))
{
// If the sprite doesn't exist (name == ""), don't bother drawing anything
if (!Sprite)
@ -358,7 +358,7 @@ void CGUI::DrawSprite(const CGUISpriteInstance& Sprite, const CRect& Rect, const
// TODO: Clipping?
Sprite.Draw(*this, Rect, m_Sprites);
Sprite.Draw(*this, canvas, Rect, m_Sprites);
}
void CGUI::UpdateResolution()

View File

@ -41,6 +41,7 @@
extern const double SELECT_DBLCLICK_RATE;
class CCanvas2D;
class CGUISpriteInstance;
class CGUISprite;
class IGUIObject;
@ -102,10 +103,11 @@ public:
*
* @param Sprite Object referring to the sprite (which also caches
* calculations for faster rendering)
* @param Canvas Canvas to draw on
* @param Rect Position and Size
* @param Clipping The sprite shouldn't be drawn outside this rectangle
*/
void DrawSprite(const CGUISpriteInstance& Sprite, const CRect& Rect, const CRect& Clipping = CRect());
void DrawSprite(const CGUISpriteInstance& Sprite, CCanvas2D& canvas, const CRect& Rect, const CRect& Clipping = CRect());
/**
* The replacement of Process(), handles an SDL_Event_

View File

@ -47,7 +47,7 @@ void CGUIScrollBarVertical::SetPosFromMousePos(const CVector2D& mouse)
m_Pos = m_PosWhenPressed + GetMaxPos() * (mouse.Y - m_BarPressedAtPos.Y) / emptyBackground;
}
void CGUIScrollBarVertical::Draw()
void CGUIScrollBarVertical::Draw(CCanvas2D& canvas)
{
if (!GetStyle())
{
@ -61,6 +61,7 @@ void CGUIScrollBarVertical::Draw()
m_pGUI.DrawSprite(
GetStyle()->m_SpriteBackVertical,
canvas,
CRect(
outline.left,
outline.top + (GetStyle()->m_UseEdgeButtons ? GetStyle()->m_Width : 0),
@ -96,6 +97,7 @@ void CGUIScrollBarVertical::Draw()
m_pGUI.DrawSprite(
*button_top,
canvas,
CRect(
outline.left,
outline.top,
@ -106,6 +108,7 @@ void CGUIScrollBarVertical::Draw()
m_pGUI.DrawSprite(
*button_bottom,
canvas,
CRect(
outline.left,
outline.bottom-GetStyle()->m_Width,
@ -117,6 +120,7 @@ void CGUIScrollBarVertical::Draw()
m_pGUI.DrawSprite(
GetStyle()->m_SpriteBarVertical,
canvas,
GetBarRect()
);
}

View File

@ -41,7 +41,7 @@ public:
/**
* Draw the scroll-bar
*/
virtual void Draw();
virtual void Draw(CCanvas2D& canvas);
/**
* If an object that contains a scrollbar has got messages, send

View File

@ -30,14 +30,14 @@ void CGUISprite::AddImage(SGUIImage* image)
m_Images.push_back(image);
}
void CGUISpriteInstance::Draw(CGUI& pGUI, const CRect& Size, std::map<CStr, const CGUISprite*>& Sprites) const
void CGUISpriteInstance::Draw(CGUI& pGUI, CCanvas2D& canvas, const CRect& Size, std::map<CStr, const CGUISprite*>& Sprites) const
{
if (m_CachedSize != Size)
{
GUIRenderer::UpdateDrawCallCache(pGUI, m_DrawCallCache, m_SpriteName, Size, Sprites);
m_CachedSize = Size;
}
GUIRenderer::Draw(m_DrawCallCache);
GUIRenderer::Draw(m_DrawCallCache, canvas);
}
// Plus a load of constructors / assignment operators, which don't copy the

View File

@ -34,6 +34,8 @@
#include <memory>
#include <vector>
class CCanvas2D;
struct SGUIImageEffects
{
SGUIImageEffects() : m_Greyscale(false) {}
@ -137,7 +139,7 @@ public:
CGUISpriteInstance();
CGUISpriteInstance(const CStr& SpriteName);
void Draw(CGUI& pGUI, const CRect& Size, std::map<CStr, const CGUISprite*>& Sprites) const;
void Draw(CGUI& pGUI, CCanvas2D& canvas, const CRect& Size, std::map<CStr, const CGUISprite*>& Sprites) const;
/**
* Whether this Sprite has no texture name set.

View File

@ -428,7 +428,7 @@ bool CGUIText::AssembleCalls(
return done;
}
void CGUIText::Draw(CGUI& pGUI, const CGUIColor& DefaultColor, const CVector2D& pos, CRect clipping) const
void CGUIText::Draw(CGUI& pGUI, CCanvas2D& canvas, const CGUIColor& DefaultColor, const CVector2D& pos, CRect clipping) const
{
CShaderTechniquePtr tech = g_Renderer.GetShaderManager().LoadEffect(str_gui_text);
@ -469,7 +469,7 @@ void CGUIText::Draw(CGUI& pGUI, const CGUIColor& DefaultColor, const CVector2D&
textRenderer.Render();
for (const SSpriteCall& sc : m_SpriteCalls)
pGUI.DrawSprite(sc.m_Sprite, sc.m_Area + pos);
pGUI.DrawSprite(sc.m_Sprite, canvas, sc.m_Area + pos);
if (isClipped)
glDisable(GL_SCISSOR_TEST);

View File

@ -30,6 +30,7 @@
#include <list>
#include <vector>
class CCanvas2D;
class CGUI;
class CGUIString;
class IGUIObject;
@ -168,7 +169,7 @@ public:
/**
* Draw this CGUIText object
*/
void Draw(CGUI& pGUI, const CGUIColor& DefaultColor, const CVector2D& pos, CRect clipping) const;
void Draw(CGUI& pGUI, CCanvas2D& canvas, const CGUIColor& DefaultColor, const CVector2D& pos, CRect clipping) const;
const CSize2D& GetSize() const { return m_Size; }

View File

@ -19,6 +19,7 @@
#include "GUIRenderer.h"
#include "graphics/Canvas2D.h"
#include "graphics/ShaderManager.h"
#include "graphics/TextureManager.h"
#include "gui/CGUI.h"
@ -110,7 +111,6 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const
}
Sprite->AddImage(Image);
Sprites[SpriteName] = Sprite;
}
else if (SpriteName.Find("cropped:") != -1)
@ -136,7 +136,6 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const
}
Sprite->AddImage(Image);
Sprites[SpriteName] = Sprite;
}
if (SpriteName.Find("color:") != -1)
@ -166,7 +165,6 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const
}
Sprite->AddImage(Image);
Sprites[SpriteName] = Sprite;
}
it = Sprites.find(SpriteName);
@ -232,12 +230,14 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const
if (!Call.m_HasTexture)
{
Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_solid);
Call.m_Material = str_gui_solid;
}
else if ((*cit)->m_Effects)
{
if ((*cit)->m_Effects->m_AddColor != CGUIColor())
{
Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_add);
Call.m_Material = str_gui_add;
Call.m_ShaderColorParameter = (*cit)->m_Effects->m_AddColor;
// Always enable blending if something's being subtracted from
// the alpha channel
@ -247,21 +247,25 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const
else if ((*cit)->m_Effects->m_Greyscale)
{
Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_grayscale);
Call.m_Material = str_gui_grayscale;
}
else if ((*cit)->m_Effects->m_SolidColor != CGUIColor())
{
Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_solid_mask);
Call.m_Material = str_gui_solid_mask;
Call.m_ShaderColorParameter = (*cit)->m_Effects->m_SolidColor;
Call.m_EnableBlending = !(fabs((*cit)->m_Effects->m_SolidColor.a - 1.0f) < 0.0000001f);
}
else /* Slight confusion - why no effects? */
{
Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_basic);
Call.m_Material = str_gui_basic;
}
}
else
{
Call.m_Shader = g_Renderer.GetShaderManager().LoadEffect(str_gui_basic);
Call.m_Material = str_gui_basic;
}
Calls.push_back(Call);
@ -291,9 +295,7 @@ CRect SDrawCall::ComputeTexCoords() const
// "real_texture_placement" overrides everything
if (m_Image->m_TexturePlacementInFile != CRect())
{
BlockTex = m_Image->m_TexturePlacementInFile;
}
// Use the whole texture
else
BlockTex = CRect(0, 0, TexWidth, TexHeight);
@ -327,7 +329,7 @@ CRect SDrawCall::ComputeTexCoords() const
return TexCoords;
}
void GUIRenderer::Draw(DrawCalls& Calls)
void GUIRenderer::Draw(DrawCalls& Calls, CCanvas2D& canvas)
{
if (Calls.empty())
return;
@ -344,12 +346,12 @@ void GUIRenderer::Draw(DrawCalls& Calls)
// Iterate through each DrawCall, and execute whatever drawing code is being called
for (DrawCalls::const_iterator cit = Calls.begin(); cit != Calls.end(); ++cit)
{
cit->m_Shader->BeginPass();
CShaderProgramPtr shader = cit->m_Shader->GetShader();
shader->Uniform(str_transform, matrix);
if (cit->m_HasTexture)
{
cit->m_Shader->BeginPass();
CShaderProgramPtr shader = cit->m_Shader->GetShader();
shader->Uniform(str_transform, matrix);
shader->Uniform(str_color, cit->m_ShaderColorParameter);
shader->BindTexture(str_tex, cit->m_Texture);
@ -390,39 +392,24 @@ void GUIRenderer::Draw(DrawCalls& Calls)
if (needsBlend)
glDisable(GL_BLEND);
cit->m_Shader->EndPass();
}
else
{
shader->Uniform(str_color, *cit->m_BackColor);
if (cit->m_EnableBlending)
glEnable(GL_BLEND);
// Ensure the quad has the correct winding order
CRect Verts = cit->m_Vertices;
if (Verts.right < Verts.left)
std::swap(Verts.right, Verts.left);
if (Verts.bottom < Verts.top)
std::swap(Verts.bottom, Verts.top);
std::vector<float> data;
#define ADD(x, y, z) STMT(data.push_back(x); data.push_back(y); data.push_back(z))
ADD(Verts.left, Verts.bottom, 0.0f);
ADD(Verts.right, Verts.bottom, 0.0f);
ADD(Verts.right, Verts.top, 0.0f);
ADD(Verts.right, Verts.top, 0.0f);
ADD(Verts.left, Verts.top, 0.0f);
ADD(Verts.left, Verts.bottom, 0.0f);
shader->VertexPointer(3, GL_FLOAT, 3*sizeof(float), &data[0]);
glDrawArrays(GL_TRIANGLES, 0, 6);
CRect rect = cit->m_Vertices;
if (rect.right < rect.left)
std::swap(rect.right, rect.left);
if (rect.bottom < rect.top)
std::swap(rect.bottom, rect.top);
canvas.DrawRect(rect, *(cit->m_BackColor));
if (cit->m_EnableBlending)
glDisable(GL_BLEND);
#undef ADD
}
cit->m_Shader->EndPass();
}
}

View File

@ -23,10 +23,12 @@
#include "graphics/Texture.h"
#include "lib/res/handle.h"
#include "maths/Rect.h"
#include "ps/CStrIntern.h"
#include <map>
#include <vector>
class CCanvas2D;
class CGUI;
class CGUISprite;
class CStr8;
@ -55,6 +57,9 @@ namespace GUIRenderer
CRect m_Vertices;
CGUIColor* m_BackColor;
// Temporary type to make a soft transition to canvas rendering.
CStrIntern m_Material;
};
class DrawCalls : public std::vector<SDrawCall>
@ -68,7 +73,7 @@ namespace GUIRenderer
void UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const CStr8& SpriteName, const CRect& Size, std::map<CStr8, const CGUISprite*>& Sprites);
void Draw(DrawCalls& Calls);
void Draw(DrawCalls& Calls, CCanvas2D& canvas);
}
#endif // INCLUDED_GUIRENDERER

View File

@ -28,6 +28,7 @@
#include "maths/Vector2D.h"
#include "ps/CStr.h"
class CCanvas2D;
class CGUI;
class IGUIScrollBarOwner;
struct SGUIMessage;
@ -162,7 +163,7 @@ public:
/**
* Draw the scroll-bar
*/
virtual void Draw() = 0;
virtual void Draw(CCanvas2D& canvas) = 0;
/**
* If an object that contains a scrollbar has got messages, send

View File

@ -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
@ -57,10 +57,10 @@ void IGUIScrollBarOwner::HandleMessage(SGUIMessage& msg)
sb->HandleMessage(msg);
}
void IGUIScrollBarOwner::Draw()
void IGUIScrollBarOwner::Draw(CCanvas2D& canvas)
{
for (IGUIScrollBar* const& sb : m_ScrollBars)
sb->Draw();
sb->Draw(canvas);
}
float IGUIScrollBarOwner::GetScrollBarPos(const int index) const

View File

@ -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
@ -20,6 +20,7 @@
#include <vector>
class CCanvas2D;
class CStr8;
struct SGUIMessage;
struct SGUIScrollBarStyle;
@ -40,7 +41,7 @@ public:
IGUIScrollBarOwner(IGUIObject& m_pObject);
virtual ~IGUIScrollBarOwner();
virtual void Draw();
virtual void Draw(CCanvas2D& canvas);
/**
* @see IGUIObject#HandleMessage()

View File

@ -91,13 +91,13 @@ void IGUITextOwner::UpdateText()
}
}
void IGUITextOwner::DrawText(size_t index, const CGUIColor& color, const CVector2D& pos, const CRect& clipping)
void IGUITextOwner::DrawText(CCanvas2D& canvas, size_t index, const CGUIColor& color, const CVector2D& pos, const CRect& clipping)
{
UpdateText();
ENSURE(index < m_GeneratedTexts.size() && "Trying to draw a Text Index within a IGUITextOwner that doesn't exist");
m_GeneratedTexts.at(index).Draw(m_pObject.GetGUI(), color, pos, clipping);
m_GeneratedTexts.at(index).Draw(m_pObject.GetGUI(), canvas, color, pos, clipping);
}
void IGUITextOwner::CalculateTextPosition(CRect& ObjSize, CVector2D& TextPos, CGUIText& Text)

View File

@ -36,6 +36,7 @@ GUI Object Base - Text Owner
#include <vector>
class CCanvas2D;
struct CGUIColor;
struct SGUIMessage;
class CGUIText;
@ -79,13 +80,14 @@ public:
/**
* Draws the Text.
*
* @param canvas Canvas to draw on.
* @param index Index value of text. Mostly this will be 0
* @param color
* @param pos Position
* @param clipping Clipping rectangle, don't even add a parameter
* to get no clipping.
*/
virtual void DrawText(size_t index, const CGUIColor& color, const CVector2D& pos, const CRect& clipping = CRect());
virtual void DrawText(CCanvas2D& canvas, size_t index, const CGUIColor& color, const CVector2D& pos, const CRect& clipping = CRect());
protected:
/**

View File

@ -80,13 +80,14 @@ void CButton::HandleMessage(SGUIMessage& Message)
IGUITextOwner::HandleMessage(Message);
}
void CButton::Draw(CCanvas2D& UNUSED(canvas))
void CButton::Draw(CCanvas2D& canvas)
{
m_pGUI.DrawSprite(
GetButtonSprite(m_Sprite, m_SpriteOver, m_SpritePressed, m_SpriteDisabled),
canvas,
m_CachedActualSize);
DrawText(0, ChooseColor(), m_TextPos);
DrawText(canvas, 0, ChooseColor(), m_TextPos);
}
bool CButton::IsMouseOver() const

View File

@ -143,7 +143,7 @@ void CChart::Draw(CCanvas2D& canvas)
tech->EndPass();
for (size_t i = 0; i < m_TextPositions.size(); ++i)
DrawText(i, CGUIColor(1.f, 1.f, 1.f, 1.f), m_TextPositions[i]);
DrawText(canvas, i, CGUIColor(1.f, 1.f, 1.f, 1.f), m_TextPositions[i]);
}
CRect CChart::GetChartRect() const

View File

@ -64,11 +64,12 @@ void CCheckBox::HandleMessage(SGUIMessage& Message)
}
}
void CCheckBox::Draw(CCanvas2D& UNUSED(canvas))
void CCheckBox::Draw(CCanvas2D& canvas)
{
m_pGUI.DrawSprite(
m_Checked ?
GetButtonSprite(m_SpriteChecked, m_SpriteCheckedOver, m_SpriteCheckedPressed, m_SpriteCheckedDisabled) :
GetButtonSprite(m_SpriteUnchecked, m_SpriteUncheckedOver, m_SpriteUncheckedPressed, m_SpriteUncheckedDisabled),
canvas,
m_CachedActualSize);
}

View File

@ -420,12 +420,12 @@ bool CDropDown::IsMouseOver() const
return m_CachedActualSize.PointInside(m_pGUI.GetMousePos());
}
void CDropDown::Draw(CCanvas2D& UNUSED(canvas))
void CDropDown::Draw(CCanvas2D& canvas)
{
const CGUISpriteInstance& sprite = m_Enabled ? m_Sprite : m_SpriteDisabled;
const CGUISpriteInstance& spriteOverlay = m_Enabled ? m_SpriteOverlay : m_SpriteOverlayDisabled;
m_pGUI.DrawSprite(sprite, m_CachedActualSize);
m_pGUI.DrawSprite(sprite, canvas, m_CachedActualSize);
if (m_ButtonWidth > 0.f)
{
@ -434,18 +434,18 @@ void CDropDown::Draw(CCanvas2D& UNUSED(canvas))
if (!m_Enabled)
{
m_pGUI.DrawSprite(*m_Sprite2Disabled ? m_Sprite2Disabled : m_Sprite2, rect);
m_pGUI.DrawSprite(*m_Sprite2Disabled ? m_Sprite2Disabled : m_Sprite2, canvas, rect);
}
else if (m_Open)
{
m_pGUI.DrawSprite(*m_Sprite2Pressed ? m_Sprite2Pressed : m_Sprite2, rect);
m_pGUI.DrawSprite(*m_Sprite2Pressed ? m_Sprite2Pressed : m_Sprite2, canvas, rect);
}
else if (m_MouseHovering)
{
m_pGUI.DrawSprite(*m_Sprite2Over ? m_Sprite2Over : m_Sprite2, rect);
m_pGUI.DrawSprite(*m_Sprite2Over ? m_Sprite2Over : m_Sprite2, canvas, rect);
}
else
m_pGUI.DrawSprite(m_Sprite2, rect);
m_pGUI.DrawSprite(m_Sprite2, canvas, rect);
}
if (m_Selected != -1) // TODO: Maybe check validity completely?
@ -454,7 +454,7 @@ void CDropDown::Draw(CCanvas2D& UNUSED(canvas))
m_CachedActualSize.right - m_ButtonWidth, m_CachedActualSize.bottom);
CVector2D pos(m_CachedActualSize.left, m_CachedActualSize.top);
DrawText(m_Selected, m_Enabled ? m_TextColorSelected : m_TextColorDisabled, pos, cliparea);
DrawText(canvas, m_Selected, m_Enabled ? m_TextColorSelected : m_TextColorDisabled, pos, cliparea);
}
if (m_Open)
@ -466,12 +466,12 @@ void CDropDown::Draw(CCanvas2D& UNUSED(canvas))
if (m_HideScrollBar)
m_ScrollBar.Set(false, false);
DrawList(m_ElementHighlight, m_SpriteList, m_SpriteListOverlay, m_SpriteSelectArea, m_SpriteSelectAreaOverlay, m_TextColor);
DrawList(canvas, m_ElementHighlight, m_SpriteList, m_SpriteListOverlay, m_SpriteSelectArea, m_SpriteSelectAreaOverlay, m_TextColor);
if (m_HideScrollBar)
m_ScrollBar.Set(old, false);
}
m_pGUI.DrawSprite(spriteOverlay, m_CachedActualSize);
m_pGUI.DrawSprite(spriteOverlay, canvas, m_CachedActualSize);
}
// When a dropdown list is opened, it needs to be visible above all the other

View File

@ -31,7 +31,7 @@ CImage::~CImage()
{
}
void CImage::Draw(CCanvas2D& UNUSED(canvas))
void CImage::Draw(CCanvas2D& canvas)
{
m_pGUI.DrawSprite(m_Sprite, m_CachedActualSize);
m_pGUI.DrawSprite(m_Sprite, canvas, m_CachedActualSize);
}

View File

@ -1187,7 +1187,7 @@ void CInput::UpdateCachedSize()
m_GeneratedPlaceholderTextValid = false;
}
void CInput::Draw(CCanvas2D& UNUSED(canvas))
void CInput::Draw(CCanvas2D& canvas)
{
if (m_CursorBlinkRate > 0.0)
{
@ -1209,7 +1209,7 @@ void CInput::Draw(CCanvas2D& UNUSED(canvas))
if (m_Mask && m_MaskChar->length() > 0)
mask_char = (*m_MaskChar)[0];
m_pGUI.DrawSprite(m_Sprite, m_CachedActualSize);
m_pGUI.DrawSprite(m_Sprite, canvas, m_CachedActualSize);
float scroll = 0.f;
if (m_ScrollBar && m_MultiLine)
@ -1398,7 +1398,7 @@ void CInput::Draw(CCanvas2D& UNUSED(canvas))
rect.right = m_CachedActualSize.right;
}
m_pGUI.DrawSprite(m_SpriteSelectArea, rect);
m_pGUI.DrawSprite(m_SpriteSelectArea, canvas, rect);
}
if (i < (int)it->m_ListOfX.size())
@ -1525,22 +1525,22 @@ void CInput::Draw(CCanvas2D& UNUSED(canvas))
tech->EndPass();
if (m_Caption->empty() && !m_PlaceholderText->GetRawString().empty())
DrawPlaceholderText(cliparea);
DrawPlaceholderText(canvas, cliparea);
// Draw scrollbars on top of the content
if (m_ScrollBar && m_MultiLine)
IGUIScrollBarOwner::Draw();
IGUIScrollBarOwner::Draw(canvas);
// Draw the overlays last
m_pGUI.DrawSprite(m_SpriteOverlay, m_CachedActualSize);
m_pGUI.DrawSprite(m_SpriteOverlay, canvas, m_CachedActualSize);
}
void CInput::DrawPlaceholderText(const CRect& clipping)
void CInput::DrawPlaceholderText(CCanvas2D& canvas, const CRect& clipping)
{
if (!m_GeneratedPlaceholderTextValid)
SetupGeneratedPlaceholderText();
m_GeneratedPlaceholderText.Draw(m_pGUI, m_PlaceholderColor, m_CachedActualSize.TopLeft(), clipping);
m_GeneratedPlaceholderText.Draw(m_pGUI, canvas, m_PlaceholderColor, m_CachedActualSize.TopLeft(), clipping);
}
void CInput::UpdateText(int from, int to_before, int to_after)

View File

@ -112,11 +112,11 @@ protected:
/**
* Draws the text generated for placeholder.
*
* @param z Z value
* @param canvas Canvas to draw on.
* @param clipping Clipping rectangle, don't even add a parameter
* to get no clipping.
*/
virtual void DrawPlaceholderText(const CRect& clipping = CRect());
virtual void DrawPlaceholderText(CCanvas2D& canvas, const CRect& clipping = CRect());
/**
* Delete the current selection. Also places the pointer at the

View File

@ -299,17 +299,17 @@ InReaction CList::ManuallyHandleKeys(const SDL_Event_* ev)
return result;
}
void CList::Draw(CCanvas2D& UNUSED(canvas))
void CList::Draw(CCanvas2D& canvas)
{
DrawList(m_Selected, m_Sprite, m_SpriteOverlay, m_SpriteSelectArea, m_SpriteSelectAreaOverlay, m_TextColor);
DrawList(canvas, m_Selected, m_Sprite, m_SpriteOverlay, m_SpriteSelectArea, m_SpriteSelectAreaOverlay, m_TextColor);
}
void CList::DrawList(const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay,
void CList::DrawList(CCanvas2D& canvas, const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay,
const CGUISpriteInstance& spriteSelectArea, const CGUISpriteInstance& spriteSelectAreaOverlay, const CGUIColor& textColor)
{
CRect rect = GetListRect();
m_pGUI.DrawSprite(sprite, rect);
m_pGUI.DrawSprite(sprite, canvas, rect);
float scroll = 0.f;
if (m_ScrollBar)
@ -343,7 +343,7 @@ void CList::DrawList(const int& selected, const CGUISpriteInstance& sprite, cons
rectSel.left = GetScrollBar(0).GetOuterRect().right;
}
m_pGUI.DrawSprite(spriteSelectArea, rectSel);
m_pGUI.DrawSprite(spriteSelectArea, canvas, rectSel);
drawSelected = true;
}
}
@ -368,17 +368,17 @@ void CList::DrawList(const int& selected, const CGUISpriteInstance& sprite, cons
cliparea.left = GetScrollBar(0).GetOuterRect().right;
}
DrawText(i, textColor, rect.TopLeft() - CVector2D(0.f, scroll - m_ItemsYPositions[i]), cliparea);
DrawText(canvas, i, textColor, rect.TopLeft() - CVector2D(0.f, scroll - m_ItemsYPositions[i]), cliparea);
}
// Draw scrollbars on top of the content
if (m_ScrollBar)
IGUIScrollBarOwner::Draw();
IGUIScrollBarOwner::Draw(canvas);
// Draw the overlays last
m_pGUI.DrawSprite(spriteOverlay, rect);
m_pGUI.DrawSprite(spriteOverlay, canvas, rect);
if (drawSelected)
m_pGUI.DrawSprite(spriteSelectAreaOverlay, rectSel);
m_pGUI.DrawSprite(spriteSelectAreaOverlay, canvas, rectSel);
}
void CList::AddItem(const CGUIString& str, const CGUIString& data)

View File

@ -106,7 +106,7 @@ protected:
// Extended drawing interface, this is so that classes built on the this one
// can use other sprite names.
virtual void DrawList(const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay,
virtual void DrawList(CCanvas2D& canvas, const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay,
const CGUISpriteInstance& spriteSelectArea, const CGUISpriteInstance& spriteSelectAreaOverlay, const CGUIColor& textColor);
// Get the area of the list. This is so that it can easily be changed, like in CDropDown

View File

@ -280,12 +280,12 @@ void COList::AdditionalChildrenHandled()
SetupText();
}
void COList::DrawList(const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay,
void COList::DrawList(CCanvas2D& canvas, const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay,
const CGUISpriteInstance& spriteSelectArea, const CGUISpriteInstance& spriteSelectAreaOverlay, const CGUIColor& textColor)
{
CRect rect = GetListRect();
m_pGUI.DrawSprite(sprite, rect);
m_pGUI.DrawSprite(sprite, canvas, rect);
float scroll = 0.f;
if (m_ScrollBar)
@ -324,7 +324,7 @@ void COList::DrawList(const int& selected, const CGUISpriteInstance& sprite, con
}
// Draw item selection
m_pGUI.DrawSprite(spriteSelectArea, rectSel);
m_pGUI.DrawSprite(spriteSelectArea, canvas, rectSel);
drawSelected = true;
}
}
@ -332,7 +332,7 @@ void COList::DrawList(const int& selected, const CGUISpriteInstance& sprite, con
// Draw line above column header
CRect rect_head(m_CachedActualSize.left, m_CachedActualSize.top, m_CachedActualSize.right,
m_CachedActualSize.top + m_HeadingHeight);
m_pGUI.DrawSprite(m_SpriteHeading, rect_head);
m_pGUI.DrawSprite(m_SpriteHeading, canvas, rect_head);
// Draw column headers
float xpos = 0;
@ -369,11 +369,11 @@ void COList::DrawList(const int& selected, const CGUISpriteInstance& sprite, con
else
pSprite = &*m_SpriteNotSorted;
m_pGUI.DrawSprite(*pSprite, CRect(leftTopCorner + CVector2D(width - SORT_SPRITE_DIM, 0), leftTopCorner + CVector2D(width, SORT_SPRITE_DIM)));
m_pGUI.DrawSprite(*pSprite, canvas, CRect(leftTopCorner + CVector2D(width - SORT_SPRITE_DIM, 0), leftTopCorner + CVector2D(width, SORT_SPRITE_DIM)));
}
// Draw column header text
DrawText(col, textColor, leftTopCorner + COLUMN_SHIFT, rect_head);
DrawText(canvas, col, textColor, leftTopCorner + COLUMN_SHIFT, rect_head);
xpos += width;
++col;
}
@ -424,17 +424,17 @@ void COList::DrawList(const int& selected, const CGUISpriteInstance& sprite, con
cliparea2.bottom = std::min(cliparea2.bottom, textPos.Y + rowHeight);
// Draw list item
DrawText(objectsCount * (i +/*Heading*/1) + colIdx, column.m_TextColor, textPos, cliparea2);
DrawText(canvas, objectsCount * (i +/*Heading*/1) + colIdx, column.m_TextColor, textPos, cliparea2);
xpos += width;
}
}
// Draw scrollbars on top of the content
if (m_ScrollBar)
IGUIScrollBarOwner::Draw();
IGUIScrollBarOwner::Draw(canvas);
// Draw the overlays last
m_pGUI.DrawSprite(spriteOverlay, rect);
m_pGUI.DrawSprite(spriteOverlay, canvas, rect);
if (drawSelected)
m_pGUI.DrawSprite(spriteSelectAreaOverlay, rectSel);
m_pGUI.DrawSprite(spriteSelectAreaOverlay, canvas, rectSel);
}

View File

@ -67,8 +67,9 @@ protected:
virtual bool HandleAdditionalChildren(const XMBData& xmb, const XMBElement& child);
virtual void AdditionalChildrenHandled();
void DrawList(const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay,
const CGUISpriteInstance& spriteSelectarea, const CGUISpriteInstance& spriteSelectAreaOverlay, const CGUIColor& textColor);
virtual void DrawList(
CCanvas2D& canvas, const int& selected, const CGUISpriteInstance& sprite, const CGUISpriteInstance& spriteOverlay,
const CGUISpriteInstance& spriteSelectarea, const CGUISpriteInstance& spriteSelectAreaOverlay, const CGUIColor& textColor);
virtual CRect GetListRect() const;

View File

@ -53,12 +53,12 @@ void CProgressBar::HandleMessage(SGUIMessage& Message)
}
}
void CProgressBar::Draw(CCanvas2D& UNUSED(canvas))
void CProgressBar::Draw(CCanvas2D& canvas)
{
m_pGUI.DrawSprite(m_SpriteBackground, m_CachedActualSize);
m_pGUI.DrawSprite(m_SpriteBackground, canvas, m_CachedActualSize);
// Get size of bar (notice it is drawn slightly closer, to appear above the background)
CRect size = m_CachedActualSize;
size.right = size.left + m_CachedActualSize.GetWidth() * (m_Progress / 100.f),
m_pGUI.DrawSprite(m_SpriteBar, size);
m_pGUI.DrawSprite(m_SpriteBar, canvas, size);
}

View File

@ -102,13 +102,13 @@ void CSlider::HandleMessage(SGUIMessage& Message)
}
}
void CSlider::Draw(CCanvas2D& UNUSED(canvas))
void CSlider::Draw(CCanvas2D& canvas)
{
CRect slider_line(m_CachedActualSize);
slider_line.left += m_ButtonSide / 2.0f;
slider_line.right -= m_ButtonSide / 2.0f;
m_pGUI.DrawSprite(m_SpriteBar, slider_line);
m_pGUI.DrawSprite(m_Sprite, GetButtonRect());
m_pGUI.DrawSprite(m_SpriteBar, canvas, slider_line);
m_pGUI.DrawSprite(m_Sprite, canvas, GetButtonRect());
}
void CSlider::UpdateValue()

View File

@ -183,9 +183,9 @@ void CText::HandleMessage(SGUIMessage& Message)
IGUITextOwner::HandleMessage(Message);
}
void CText::Draw(CCanvas2D& UNUSED(canvas))
void CText::Draw(CCanvas2D& canvas)
{
m_pGUI.DrawSprite(m_Sprite, m_CachedActualSize);
m_pGUI.DrawSprite(m_Sprite, canvas, m_CachedActualSize);
float scroll = 0.f;
if (m_ScrollBar)
@ -213,14 +213,14 @@ void CText::Draw(CCanvas2D& UNUSED(canvas))
const CGUIColor& color = m_Enabled ? m_TextColor : m_TextColorDisabled;
if (m_ScrollBar)
DrawText(0, color, m_CachedActualSize.TopLeft() - CVector2D(0.f, scroll), cliparea);
DrawText(canvas, 0, color, m_CachedActualSize.TopLeft() - CVector2D(0.f, scroll), cliparea);
else
DrawText(0, color, m_TextPos, cliparea);
DrawText(canvas, 0, color, m_TextPos, cliparea);
// Draw scrollbars on top of the content
if (m_ScrollBar)
IGUIScrollBarOwner::Draw();
IGUIScrollBarOwner::Draw(canvas);
// Draw the overlays last
m_pGUI.DrawSprite(m_SpriteOverlay, m_CachedActualSize);
m_pGUI.DrawSprite(m_SpriteOverlay, canvas, m_CachedActualSize);
}

View File

@ -131,7 +131,7 @@ void CTooltip::HandleMessage(SGUIMessage& Message)
IGUITextOwner::HandleMessage(Message);
}
void CTooltip::Draw(CCanvas2D& UNUSED(canvas))
void CTooltip::Draw(CCanvas2D& canvas)
{
// Normally IGUITextOwner will handle this updating but since SetupText can modify the position
// we need to call it now *before* we do the rest of the drawing
@ -141,8 +141,8 @@ void CTooltip::Draw(CCanvas2D& UNUSED(canvas))
m_GeneratedTextsValid = true;
}
m_pGUI.DrawSprite(m_Sprite, m_CachedActualSize);
DrawText(0, m_TextColor, m_CachedActualSize.TopLeft());
m_pGUI.DrawSprite(m_Sprite, canvas, m_CachedActualSize);
DrawText(canvas, 0, m_TextColor, m_CachedActualSize.TopLeft());
}
float CTooltip::GetBufferedZ() const