d201cb914baa807ad5f296e253a235a9d2c72673
[supertux.git] / src / unison / include / unison / video / Blitters.hpp
1 //          Copyright Timothy Goya 2007.
2 // Distributed under the Boost Software License, Version 1.0.
3 //    (See accompanying file LICENSE_1_0.txt or copy at
4 //          http://www.boost.org/LICENSE_1_0.txt)
5
6 #ifndef UNISON_VIDEO_BLITTERS_HPP
7 #define UNISON_VIDEO_BLITTERS_HPP
8
9 #include <unison/video/Coord.hpp>
10 #include <unison/video/RenderOptions.hpp>
11
12 namespace Unison
13 {
14    namespace Video
15    {
16       class Rect;
17       class Surface;
18
19       struct Blitters
20       {
21          static void blit_upper(const Surface &src, Rect src_rect, Surface &dst, Point dst_pos, void (*blit_lower)(const Surface &, const Rect &, Surface &, const Point &));
22
23          static void blit_lower_none(const Surface &src, const Rect &src_rect, Surface &dst, const Point &dst_pos);
24
25          static void blit_lower_mask(const Surface &src, const Rect &src_rect, Surface &dst, const Point &dst_pos);
26
27          static void blit_lower_alpha(const Surface &src, const Rect &src_rect, Surface &dst, const Point &dst_pos);
28
29          static void blit_lower_add(const Surface &src, const Rect &src_rect, Surface &dst, const Point &dst_pos);
30
31          static void blit_lower_mod(const Surface &src, const Rect &src_rect, Surface &dst, const Point &dst_pos);
32
33          static void blit_blend_none(const Surface &src, const Rect &src_rect, Surface &dst, const Point &dst_pos)
34          {
35             blit_upper(src, src_rect, dst, dst_pos, blit_lower_none);
36          }
37
38          static void blit_blend_mask(const Surface &src, const Rect &src_rect, Surface &dst, const Point &dst_pos)
39          {
40             blit_upper(src, src_rect, dst, dst_pos, blit_lower_mask);
41          }
42
43          static void blit_blend_alpha(const Surface &src, const Rect &src_rect, Surface &dst, const Point &dst_pos)
44          {
45             blit_upper(src, src_rect, dst, dst_pos, blit_lower_alpha);
46          }
47
48          static void blit_blend_add(const Surface &src, const Rect &src_rect, Surface &dst, const Point &dst_pos)
49          {
50             blit_upper(src, src_rect, dst, dst_pos, blit_lower_add);
51          }
52
53          static void blit_blend_mod(const Surface &src, const Rect &src_rect, Surface &dst, const Point &dst_pos)
54          {
55             blit_upper(src, src_rect, dst, dst_pos, blit_lower_mod);
56          }
57
58          static void blit_blend(const Surface &src, const Rect &src_rect, Surface &dst, const Point &dst_pos, BlendMode blend)
59          {
60             switch(blend)
61             {
62                case BLEND_NONE:
63                   blit_blend_none(src, src_rect, dst, dst_pos);
64                   break;
65                case BLEND_MASK:
66                   blit_blend_mask(src, src_rect, dst, dst_pos);
67                   break;
68                case BLEND_ALPHA:
69                   blit_blend_alpha(src, src_rect, dst, dst_pos);
70                   break;
71                case BLEND_ADD:
72                   blit_blend_add(src, src_rect, dst, dst_pos);
73                   break;
74                case BLEND_MOD:
75                   blit_blend_mod(src, src_rect, dst, dst_pos);
76                   break;
77             }
78          }
79       };
80    }
81 }
82
83 #endif