/* ui/paint.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "auxiliary/functions.h" #include "math/vector2f.h" #include "render/gl.h" #include "render/text.h" #include "render/textures.h" #include "ui/paint.h" namespace ui { // contains the interface between the user interface and the render library namespace paint { void color(float r, float g, float b, float a) { render::gl::color(r, g, b, a); } void color(math::Color const & color) { render::gl::color(color); } void color_code(const char *c) { render::Text::setcolor(*c); } void border(math::Vector2f const &location, math::Vector2f const &size) { using namespace render::gl; begin(LineLoop); vertex(location.x +1 , location.y); vertex(location.x + size.x, location.y); vertex(location.x + size.x, location.y + size.y -1); vertex(location.x +1, location.y + size.y - 1); end(); } void rectangle(math::Vector2f const &location, math::Vector2f const &size) { using namespace render::gl; begin(Quads); vertex(location.x +1 , location.y); vertex(location.x + size.x, location.y); vertex(location.x + size.x, location.y + size.y -1); vertex(location.x +1, location.y + size.y - 1); end(); } void bitmap(math::Vector2f const &location, math::Vector2f const &size, std::string const &texture) { using namespace render::gl; render::Textures::bind("bitmaps/" + texture); enable(GL_TEXTURE_2D); begin(Quads); glTexCoord2f(0.0f, 0.0f); vertex(location.x +1 , location.y); glTexCoord2f(1.0f, 0.0f); vertex(location.x + size.x, location.y); glTexCoord2f(1.0f, 1.0f); vertex(location.x + size.x, location.y + size.y -1); glTexCoord2f(0.0f, 1.0f); vertex(location.x +1, location.y + size.y - 1); end(); disable(GL_TEXTURE_2D); } void text_centered(math::Vector2f const &location, math::Vector2f const &size, std::string const &text, Font const *font) { using namespace render::gl; render::Text::setfont(font->name().c_str(), font->width(), font->height()); enable(GL_TEXTURE_2D); math::Vector2f v(location); v.x += (size.x - aux::text_strip(text).size() * font->width()) /2.0f; v.y += (size.y - font->height()) / 2.0f; render::Text::draw(v.x, v.y, text); disable(GL_TEXTURE_2D); } void text(math::Vector2f const &location, Font const *font, std::stringstream & textstream) { using namespace render::gl; render::Text::setfont(font->name().c_str(), font->width(), font->height()); // enable OpenGL textures enable(GL_TEXTURE_2D); render::Text::draw(location.x, location.y, textstream); // disable texturing disable(GL_TEXTURE_2D); } void text(math::Vector2f const &location, math::Vector2f const &size, Font const *font, std::string const &text, unsigned int align) { unsigned int align_horizontal = (align & 0x000F); if (!align_horizontal) align_horizontal = AlignLeft; unsigned int align_vertical = (align & 0x00F0); if (!align_vertical) align_vertical = AlignTop; // apply text font using namespace render::gl; render::Text::setfont(font->name().c_str(), font->width(), font->height()); // enable OpenGL textures enable(GL_TEXTURE_2D); // determine the width and height of the text // FIXME support multiline text float text_height = 1.0f * font->height(); float text_width = (float) aux::text_strip(text).size() * font->width(); // calculate drawing position math::Vector2f v(location); switch (align_horizontal) { case AlignLeft: v.x += font->width(); break; case AlignHCenter: v.x += (size.x - text_width) / 2.0f; break; case AlignRight: v.x += size.x - text_width - font->width(); break; } switch (align_vertical) { case AlignTop: v.y += font->height()*0.5f; break; case AlignVCenter: v.y += (size.y - text_height) / 2.0f; break; case AlignBottom: v.y += size.y - text_height - font->height()*0.5f; break; } render::Text::draw(v.x, v.y, text); // disable texturing disable(GL_TEXTURE_2D); } } }