4 // Copyright (C) 2006 Matthias Braun <matze@braunis.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 02111-1307, USA.
30 #include <SDL_image.h>
32 #include "gameconfig.hpp"
33 #include "physfs/physfs_sdl.hpp"
34 #include "video/surface.hpp"
35 #include "image_texture.hpp"
36 #include "texture_manager.hpp"
38 Surface::Surface(const std::string& file)
40 texture = texture_manager->get(file);
44 uv_right = texture->get_uv_right();
45 uv_bottom = texture->get_uv_bottom();
47 width = texture->get_image_width();
48 height = texture->get_image_height();
51 Surface::Surface(const std::string& file, int x, int y, int w, int h)
53 texture = texture_manager->get(file);
56 float tex_w = static_cast<float> (texture->get_width());
57 float tex_h = static_cast<float> (texture->get_height());
58 uv_left = static_cast<float>(x) / tex_w;
59 uv_top = static_cast<float>(y) / tex_h;
60 uv_right = static_cast<float>(x+w) / tex_w;
61 uv_bottom = static_cast<float>(y+h) / tex_h;
67 Surface::Surface(const Surface& other)
69 texture = other.texture;
72 uv_left = other.uv_left;
73 uv_top = other.uv_top;
74 uv_right = other.uv_right;
75 uv_bottom = other.uv_bottom;
77 height = other.height;
81 Surface::operator= (const Surface& other)
85 texture = other.texture;
87 uv_left = other.uv_left;
88 uv_top = other.uv_top;
89 uv_right = other.uv_right;
90 uv_bottom = other.uv_bottom;
92 height = other.height;
105 std::swap(uv_left, uv_right);
108 static inline void intern_draw(float left, float top, float right, float bottom, float uv_left, float uv_top,
109 float uv_right, float uv_bottom,
110 DrawingEffect effect)
112 if(effect & HORIZONTAL_FLIP)
113 std::swap(uv_left, uv_right);
114 if(effect & VERTICAL_FLIP) {
115 std::swap(uv_top, uv_bottom);
119 glTexCoord2f(uv_left, uv_top);
120 glVertex2f(left, top);
122 glTexCoord2f(uv_right, uv_top);
123 glVertex2f(right, top);
125 glTexCoord2f(uv_right, uv_bottom);
126 glVertex2f(right, bottom);
128 glTexCoord2f(uv_left, uv_bottom);
129 glVertex2f(left, bottom);
133 static inline void intern_draw2(float left, float top, float right, float bottom,
134 float uv_left, float uv_top,
135 float uv_right, float uv_bottom,
137 DrawingEffect effect)
139 if(effect & HORIZONTAL_FLIP)
140 std::swap(uv_left, uv_right);
141 if(effect & VERTICAL_FLIP) {
142 std::swap(uv_top, uv_bottom);
145 float center_x = (left + right) / 2;
146 float center_y = (top + bottom) / 2;
148 float sa = sinf(angle/180.0f*M_PI);
149 float ca = cosf(angle/180.0f*M_PI);
158 glTexCoord2f(uv_left, uv_top);
159 glVertex2f(left*ca - top*sa + center_x,
160 left*sa + top*ca + center_y);
162 glTexCoord2f(uv_right, uv_top);
163 glVertex2f(right*ca - top*sa + center_x,
164 right*sa + top*ca + center_y);
166 glTexCoord2f(uv_right, uv_bottom);
167 glVertex2f(right*ca - bottom*sa + center_x,
168 right*sa + bottom*ca + center_y);
170 glTexCoord2f(uv_left, uv_bottom);
171 glVertex2f(left*ca - bottom*sa + center_x,
172 left*sa + bottom*ca + center_y);
177 Surface::draw(float x, float y, float alpha, float angle, DrawingEffect effect) const
179 glColor4f(1.0f, 1.0f, 1.0f, alpha);
180 glBindTexture(GL_TEXTURE_2D, texture->get_handle());
183 x + width, y + height,
184 uv_left, uv_top, uv_right, uv_bottom,
190 Surface::draw(float x, float y, float alpha, DrawingEffect effect) const
192 glColor4f(1.0f, 1.0f, 1.0f, alpha);
193 glBindTexture(GL_TEXTURE_2D, texture->get_handle());
196 x + width, y + height,
197 uv_left, uv_top, uv_right, uv_bottom, effect);
201 Surface::draw_part(float src_x, float src_y, float dst_x, float dst_y,
202 float width, float height, float alpha,
203 DrawingEffect effect) const
205 float uv_width = uv_right - uv_left;
206 float uv_height = uv_bottom - uv_top;
208 float uv_left = this->uv_left + (uv_width * src_x) / this->width;
209 float uv_top = this->uv_top + (uv_height * src_y) / this->height;
210 float uv_right = this->uv_left + (uv_width * (src_x + width)) / this->width;
211 float uv_bottom = this->uv_top + (uv_height * (src_y + height)) / this->height;
213 glColor4f(1.0f, 1.0f, 1.0f, alpha);
214 glBindTexture(GL_TEXTURE_2D, texture->get_handle());
216 intern_draw(dst_x, dst_y,
217 dst_x + width, dst_y + height,
218 uv_left, uv_top, uv_right, uv_bottom, effect);