98bd868098141cb63e070c837ff41bc7628e8c5e
[supertux.git] / src / video / surface.cpp
1 //  SuperTux
2 //  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
3 //
4 //  This program is free software: you can redistribute it and/or modify
5 //  it under the terms of the GNU General Public License as published by
6 //  the Free Software Foundation, either version 3 of the License, or
7 //  (at your option) any later version.
8 //
9 //  This program is distributed in the hope that it will be useful,
10 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
11 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 //  GNU General Public License for more details.
13 //
14 //  You should have received a copy of the GNU General Public License
15 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 #include "video/surface.hpp"
18
19 #include <config.h>
20
21 #include <SDL.h>
22
23 #include "video/texture.hpp"
24 #include "video/video_systems.hpp"
25
26 SurfacePtr
27 Surface::create(const std::string& file)
28 {
29   return SurfacePtr(new Surface(file));
30 }
31
32 SurfacePtr
33 Surface::create(const std::string& file, const Rect& rect)
34 {
35   return SurfacePtr(new Surface(file, rect));
36 }
37
38 Surface::Surface(const std::string& file) :
39   texture(texture_manager->get(file)),
40   surface_data(),
41   rect(0, 0, 
42       Size(texture->get_image_width(),
43            texture->get_image_height())),
44   flipx(false)
45 {
46   texture->ref();
47   surface_data = VideoSystem::new_surface_data(*this);
48 }
49
50 Surface::Surface(const std::string& file, const Rect& rect_) :
51   texture(texture_manager->get(file, rect_)),
52   surface_data(),
53   rect(0, 0, Size(rect_.get_width(), rect_.get_height())),
54   flipx(false)
55 {
56   texture->ref();
57   surface_data = VideoSystem::new_surface_data(*this);
58 }
59
60 Surface::Surface(const Surface& rhs) :
61   texture(rhs.texture),
62   surface_data(),
63   rect(rhs.rect),
64   flipx(false)
65 {
66   texture->ref();
67   surface_data = VideoSystem::new_surface_data(*this);
68 }
69
70 Surface::~Surface()
71 {
72   VideoSystem::free_surface_data(surface_data);
73   texture->unref();
74 }
75
76 SurfacePtr
77 Surface::clone() const
78 {
79   SurfacePtr surface(new Surface(*this));
80   return surface;
81 }
82
83 /** flip the surface horizontally */
84 void Surface::hflip()
85 {
86   flipx = !flipx;
87 }
88
89 bool Surface::get_flipx() const
90 {
91   return flipx;
92 }
93
94 Texture* 
95 Surface::get_texture() const
96 {
97   return texture;
98 }
99
100 SurfaceData* 
101 Surface::get_surface_data() const
102 {
103   return surface_data;
104 }
105
106 int
107 Surface::get_x() const
108 {
109   return rect.left;
110 }
111
112 int
113 Surface::get_y() const
114 {
115   return rect.top;
116 }
117
118 int 
119 Surface::get_width() const
120 {
121   return rect.get_width();
122 }
123
124 int 
125 Surface::get_height() const
126 {
127   return rect.get_height();
128 }
129
130 Vector
131 Surface::get_position() const
132 {
133   return Vector(get_x(), get_y()); 
134 }
135
136 Vector
137 Surface::get_size() const
138 {
139   return Vector(get_width(), get_height()); 
140 }
141
142 /* EOF */