support for centered text in scripts
[supertux.git] / src / object / display_effect.cpp
1 #include <config.h>
2 #include "display_effect.hpp"
3
4 #include <assert.h>
5 #include "video/drawing_context.hpp"
6 #include "main.hpp"
7
8 DisplayEffect::DisplayEffect()
9     : type(NO_FADE), fadetime(0), fading(0), black(false)
10 {
11  border_size = 0; 
12  borders_fading = false;
13  borders_active = false;
14 }
15
16 DisplayEffect::~DisplayEffect()
17 {
18 }
19
20 void
21 DisplayEffect::update(float elapsed_time)
22 {
23     if (borders_fading) {
24       if (border_size < 75) border_size += 1.5;
25       else borders_active = true;
26     }
27     else if (borders_active) {
28       if (border_size > 0) border_size -= 1.5;
29       else borders_active = false;
30     }
31     switch(type) {
32         case NO_FADE:
33             return;
34         case FADE_IN:
35             fading -= elapsed_time;
36             if(fading < 0) {
37                 type = NO_FADE;
38             }
39             break;
40         case FADE_OUT:
41             fading -= elapsed_time;
42             if(fading < 0) {
43                 type = NO_FADE;
44                 black = true;
45             }
46             break;
47         default:
48             assert(false);
49     }
50 }
51
52 void
53 DisplayEffect::draw(DrawingContext& context)
54 {
55     context.push_transform();
56     context.set_translation(Vector(0, 0));
57
58     if(black || type != NO_FADE) {    
59       uint8_t alpha;
60       if(black) {
61           alpha = 255;
62       } else {
63           switch(type) {
64               case FADE_IN:
65                   alpha = static_cast<uint8_t>
66                       (fading * 255.0 / fadetime);
67                   break;
68               case FADE_OUT:
69                   alpha = static_cast<uint8_t>
70                       ((fadetime-fading) * 255.0 / fadetime);
71                   break;
72               default:
73                   alpha = 0;
74                   assert(false);
75           }
76       }
77       context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT),
78               Color(0, 0, 0, alpha), LAYER_GUI-10);
79     }
80
81     if (borders_fading || borders_active) {
82       context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, border_size),
83               Color(0, 0, 0, 255), LAYER_GUI-10);
84       context.draw_filled_rect(Vector(0, SCREEN_HEIGHT - border_size), Vector(SCREEN_WIDTH, border_size),
85               Color(0, 0, 0, 255), LAYER_GUI-10);
86     }
87
88     context.pop_transform();
89 }
90
91 void
92 DisplayEffect::fade_out(float fadetime)
93 {
94     black = false;
95     this->fadetime = fadetime;
96     fading = fadetime;
97     type = FADE_OUT;
98 }
99
100 void
101 DisplayEffect::fade_in(float fadetime)
102 {
103     black = false;
104     this->fadetime = fadetime;
105     fading = fadetime;
106     type = FADE_IN;
107 }
108
109 void
110 DisplayEffect::set_black(bool enabled)
111 {
112     black = enabled;
113 }
114
115 bool
116 DisplayEffect::is_black()
117 {
118     return black;
119 }
120
121 void
122 DisplayEffect::sixteen_to_nine()
123 {
124   borders_fading = true;
125 }
126
127 void
128 DisplayEffect::four_to_three()
129 {
130   borders_fading = false;
131 }