| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- /*
- GWEN
- Copyright (c) 2010 Facepunch Studios
- See license in Gwen.h
- */
- #include "Gwen/Gwen.h"
- #include "Gwen/BaseRender.h"
- #include "Gwen/Utility.h"
- #include "Gwen/Platform.h"
- #include <math.h>
- #include <cmath>
- namespace Gwen
- {
- namespace Renderer
- {
- Base::Base()
- {
- m_RenderOffset = Gwen::Point(0, 0);
- m_fScale = 1.0f;
- }
- Base::~Base()
- {
- if (GetCTT())
- GetCTT()->ShutDown();
- }
- void Base::RenderText(Gwen::Font* pFont, Gwen::Point pos, const Gwen::String& text)
- {
- Gwen::UnicodeString str = Gwen::Utility::StringToUnicode(text);
- RenderText(pFont, pos, str);
- }
- Gwen::Point Base::MeasureText(Gwen::Font* pFont, const Gwen::String& text)
- {
- Gwen::UnicodeString str = Gwen::Utility::StringToUnicode(text);
- return MeasureText(pFont, str);
- }
- void Base::DrawLinedRect(Gwen::Rect rect)
- {
- DrawFilledRect(Gwen::Rect(rect.x, rect.y, rect.w, 1));
- DrawFilledRect(Gwen::Rect(rect.x, rect.y + rect.h - 1, rect.w, 1));
- DrawFilledRect(Gwen::Rect(rect.x, rect.y, 1, rect.h));
- DrawFilledRect(Gwen::Rect(rect.x + rect.w - 1, rect.y, 1, rect.h));
- };
- void Base::DrawPixel(int x, int y)
- {
- DrawFilledRect(Gwen::Rect(x, y, 1, 1));
- }
- void Base::DrawShavedCornerRect(Gwen::Rect rect, bool bSlight)
- {
- // Draw INSIDE the w/h.
- rect.w -= 1;
- rect.h -= 1;
- if (bSlight)
- {
- DrawFilledRect(Gwen::Rect(rect.x + 1, rect.y, rect.w - 1, 1));
- DrawFilledRect(Gwen::Rect(rect.x + 1, rect.y + rect.h, rect.w - 1, 1));
- DrawFilledRect(Gwen::Rect(rect.x, rect.y + 1, 1, rect.h - 1));
- DrawFilledRect(Gwen::Rect(rect.x + rect.w, rect.y + 1, 1, rect.h - 1));
- return;
- }
- DrawPixel(rect.x + 1, rect.y + 1);
- DrawPixel(rect.x + rect.w - 1, rect.y + 1);
- DrawPixel(rect.x + 1, rect.y + rect.h - 1);
- DrawPixel(rect.x + rect.w - 1, rect.y + rect.h - 1);
- DrawFilledRect(Gwen::Rect(rect.x + 2, rect.y, rect.w - 3, 1));
- DrawFilledRect(Gwen::Rect(rect.x + 2, rect.y + rect.h, rect.w - 3, 1));
- DrawFilledRect(Gwen::Rect(rect.x, rect.y + 2, 1, rect.h - 3));
- DrawFilledRect(Gwen::Rect(rect.x + rect.w, rect.y + 2, 1, rect.h - 3));
- }
- void Base::Translate(int& x, int& y)
- {
- x += m_RenderOffset.x;
- y += m_RenderOffset.y;
- x = std::ceil(((float)x) * m_fScale);
- y = std::ceil(((float)y) * m_fScale);
- }
- void Base::Translate(Gwen::Rect& rect)
- {
- Translate(rect.x, rect.y);
- rect.w = std::ceil(((float)rect.w) * m_fScale);
- rect.h = std::ceil(((float)rect.h) * m_fScale);
- }
- void Gwen::Renderer::Base::SetClipRegion(Gwen::Rect rect)
- {
- m_rectClipRegion = rect;
- }
- void Base::AddClipRegion(Gwen::Rect rect)
- {
- rect.x = m_RenderOffset.x;
- rect.y = m_RenderOffset.y;
- Gwen::Rect out = rect;
- if (rect.x < m_rectClipRegion.x)
- {
- out.w -= (m_rectClipRegion.x - out.x);
- out.x = m_rectClipRegion.x;
- }
- if (rect.y < m_rectClipRegion.y)
- {
- out.h -= (m_rectClipRegion.y - out.y);
- out.y = m_rectClipRegion.y;
- }
- if (rect.x + rect.w > m_rectClipRegion.x + m_rectClipRegion.w)
- {
- out.w = (m_rectClipRegion.x + m_rectClipRegion.w) - out.x;
- }
- if (rect.y + rect.h > m_rectClipRegion.y + m_rectClipRegion.h)
- {
- out.h = (m_rectClipRegion.y + m_rectClipRegion.h) - out.y;
- }
- m_rectClipRegion = out;
- }
- const Gwen::Rect& Base::ClipRegion() const
- {
- return m_rectClipRegion;
- }
- bool Base::ClipRegionVisible()
- {
- if (m_rectClipRegion.w <= 0 || m_rectClipRegion.h <= 0)
- return false;
- return true;
- }
- void Base::DrawMissingImage(Gwen::Rect pTargetRect)
- {
- SetDrawColor(Colors::Red);
- DrawFilledRect(pTargetRect);
- }
- /*
- If they haven't defined these font functions in their renderer code
- we just draw some rects where the letters would be to give them an idea.
- */
- void Base::RenderText(Gwen::Font* pFont, Gwen::Point pos, const Gwen::UnicodeString& text)
- {
- float fSize = pFont->size * Scale();
- for (float i = 0; i < text.length(); i++)
- {
- wchar_t chr = text[i];
- if (chr == ' ') continue;
- Gwen::Rect r(pos.x + i * fSize * 0.4, pos.y, fSize * 0.4 - 1, fSize);
- /*
- This isn't important, it's just me messing around changing the
- shape of the rect based on the letter.. just for fun.
- */
- if (chr == 'l' || chr == 'i' || chr == '!' || chr == 't')
- {
- r.w = 1;
- }
- else if (chr >= 'a' && chr <= 'z')
- {
- r.y += fSize * 0.5f;
- r.h -= fSize * 0.4f;
- }
- else if (chr == '.' || chr == ',')
- {
- r.x += 2;
- r.y += r.h - 2;
- r.w = 2;
- r.h = 2;
- }
- else if (chr == '\'' || chr == '`' || chr == '"')
- {
- r.x += 3;
- r.w = 2;
- r.h = 2;
- }
- if (chr == 'o' || chr == 'O' || chr == '0')
- DrawLinedRect(r);
- else
- DrawFilledRect(r);
- }
- }
- Gwen::Point Base::MeasureText(Gwen::Font* pFont, const Gwen::UnicodeString& text)
- {
- Gwen::Point p;
- p.x = pFont->size * Scale() * (float)text.length() * 0.4;
- p.y = pFont->size * Scale();
- return p;
- }
- } // namespace Renderer
- } // namespace Gwen
|