1 // $Id: surface.cpp 2175 2004-11-24 19:02:49Z sik0fewl $
4 // Copyright (C) 2004 Tobias Glaesser <tobi.web@gmx.de>
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
30 #include <SDL_image.h>
32 #include "gameconfig.hpp"
33 #include "physfs/physfs_sdl.hpp"
34 #include "video/surface.hpp"
35 #include "video/screen.hpp"
36 #include "image_texture.hpp"
37 #include "texture_manager.hpp"
39 Surface::Surface(const std::string& file)
41 texture = texture_manager->get(file);
45 uv_right = texture->get_uv_right();
46 uv_bottom = texture->get_uv_bottom();
48 width = texture->get_image_width();
49 height = texture->get_image_height();
52 Surface::Surface(const std::string& file, int x, int y, int w, int h)
54 texture = texture_manager->get(file);
57 float tex_w = static_cast<float> (texture->get_width());
58 float tex_h = static_cast<float> (texture->get_height());
59 uv_left = static_cast<float>(x) / tex_w;
60 uv_top = static_cast<float>(y) / tex_h;
61 uv_right = static_cast<float>(x+w) / tex_w;
62 uv_bottom = static_cast<float>(y+h) / tex_h;
68 Surface::Surface(const Surface& other)
70 texture = other.texture;
73 uv_left = other.uv_left;
74 uv_top = other.uv_top;
75 uv_right = other.uv_right;
76 uv_bottom = other.uv_bottom;
78 height = other.height;
82 Surface::operator= (const Surface& other)
86 texture = other.texture;
88 uv_left = other.uv_left;
89 uv_top = other.uv_top;
90 uv_right = other.uv_right;
91 uv_bottom = other.uv_bottom;
93 height = other.height;
106 std::swap(uv_left, uv_right);
109 static inline void intern_draw(float left, float top, float right, float bottom, float uv_left, float uv_top,
110 float uv_right, float uv_bottom,
111 DrawingEffect effect)
113 if(effect & HORIZONTAL_FLIP)
114 std::swap(uv_left, uv_right);
115 if(effect & VERTICAL_FLIP) {
116 std::swap(uv_top, uv_bottom);
120 glTexCoord2f(uv_left, uv_top);
121 glVertex2f(left, top);
123 glTexCoord2f(uv_right, uv_top);
124 glVertex2f(right, top);
126 glTexCoord2f(uv_right, uv_bottom);
127 glVertex2f(right, bottom);
129 glTexCoord2f(uv_left, uv_bottom);
130 glVertex2f(left, bottom);
135 Surface::draw(float x, float y, float alpha, DrawingEffect effect) const
137 glColor4f(1.0f, 1.0f, 1.0f, alpha);
138 glBindTexture(GL_TEXTURE_2D, texture->get_handle());
141 x + width, y + height,
142 uv_left, uv_top, uv_right, uv_bottom, effect);
146 Surface::draw_part(float src_x, float src_y, float dst_x, float dst_y,
147 float width, float height, float alpha,
148 DrawingEffect effect) const
150 float uv_width = uv_right - uv_left;
151 float uv_height = uv_bottom - uv_top;
153 float uv_left = this->uv_left + (uv_width * src_x) / this->width;
154 float uv_top = this->uv_top + (uv_height * src_y) / this->height;
155 float uv_right = this->uv_left + (uv_width * (src_x + width)) / this->width;
156 float uv_bottom = this->uv_top + (uv_height * (src_y + height)) / this->height;
158 glColor4f(1.0f, 1.0f, 1.0f, alpha);
159 glBindTexture(GL_TEXTURE_2D, texture->get_handle());
161 intern_draw(dst_x, dst_y,
162 dst_x + width, dst_y + height,
163 uv_left, uv_top, uv_right, uv_bottom, effect);