30 #include "video/renderbackend.h"
31 #include "util/math/fife_math.h"
32 #include "util/log/logger.h"
33 #include "video/fonts/ifont.h"
34 #include "video/image.h"
35 #include "model/structures/instance.h"
36 #include "model/structures/layer.h"
37 #include "model/structures/location.h"
39 #include "view/visual.h"
40 #include "view/camera.h"
41 #include "floatingtextrenderer.h"
45 static Logger _log(LM_VIEWVIEW);
48 FloatingTextRenderer::FloatingTextRenderer(RenderBackend* renderbackend, int32_t position):
49 RendererBase(renderbackend, position),
50 m_renderbackend(renderbackend),
56 FloatingTextRenderer::FloatingTextRenderer(
const FloatingTextRenderer& old):
58 m_renderbackend(old.m_renderbackend),
60 m_font_color(old.m_font_color),
61 m_color(old.m_color) {
63 m_font_color = m_background = m_backborder =
false;
66 RendererBase* FloatingTextRenderer::clone() {
67 return new FloatingTextRenderer(*
this);
70 FloatingTextRenderer::~FloatingTextRenderer() {
73 void FloatingTextRenderer::render(Camera* cam, Layer* layer, RenderList& instances) {
79 RenderList::const_iterator instance_it = instances.begin();
80 const std::string* saytext = NULL;
81 uint32_t lm = m_renderbackend->getLightingModel();
82 SDL_Color old_color = m_font->getColor();
84 m_font->setColor(m_color.r, m_color.g, m_color.b, m_color.unused);
86 for (;instance_it != instances.end(); ++instance_it) {
87 Instance* instance = (*instance_it)->instance;
88 saytext = instance->getSayText();
90 const Rect& ir = (*instance_it)->dimensions;
91 Image* img = m_font->getAsImageMultiline(*saytext);
93 r.
x = (ir.x + ir.w/2) - img->getWidth()/2;
94 r.y = ir.y- img->getHeight();
95 r.w = img->getWidth();
96 r.h = img->getHeight();
98 if(m_background || m_backborder) {
99 const int32_t overdraw = 5;
101 Point p = Point(r.x-overdraw, r.y-overdraw);
104 m_renderbackend->fillRectangle(p, r.w+2*overdraw, r.h+2*overdraw, m_backcolor.r, m_backcolor.g, m_backcolor.b, m_backcolor.unused);
108 m_renderbackend->drawRectangle(p, r.w+2*overdraw, r.h+2*overdraw, m_backbordercolor.r, m_backbordercolor.g, m_backbordercolor.b, m_backbordercolor.unused);
113 uint16_t elements = 1;
120 m_renderbackend->changeRenderInfos(elements, 4, 5,
false,
true, 255, REPLACE, ALWAYS);
125 m_font->setColor(old_color.r, old_color.g, old_color.b, old_color.unused);
129 void FloatingTextRenderer::setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
138 void FloatingTextRenderer::setBackground(uint8_t br, uint8_t bg, uint8_t bb, uint8_t ba) {
142 m_backcolor.unused = ba;
147 void FloatingTextRenderer::setBorder(uint8_t bbr, uint8_t bbg, uint8_t bbb, uint8_t bba) {
148 m_backbordercolor.r = bbr;
149 m_backbordercolor.g = bbg;
150 m_backbordercolor.b = bbb;
151 m_backbordercolor.unused = bba;
156 void FloatingTextRenderer::resetBackground() {
157 m_background =
false;
160 void FloatingTextRenderer::resetBorder() {
161 m_backborder =
false;
164 FloatingTextRenderer* FloatingTextRenderer::getInstance(IRendererContainer* cnt) {
165 return dynamic_cast<FloatingTextRenderer*
>(cnt->getRenderer(
"FloatingTextRenderer"));