forked from EasyRPG/Player
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfps_overlay.cpp
111 lines (88 loc) · 2.98 KB
/
fps_overlay.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
* This file is part of EasyRPG Player.
*
* EasyRPG Player is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EasyRPG Player is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EasyRPG Player. If not, see <http://www.gnu.org/licenses/>.
*/
#include <sstream>
#include "fps_overlay.h"
#include "game_clock.h"
#include "bitmap.h"
#include "utils.h"
#include "input.h"
#include "font.h"
#include "drawable_mgr.h"
using namespace std::chrono_literals;
static constexpr auto refresh_frequency = 1s;
FpsOverlay::FpsOverlay() :
Drawable(Priority_Overlay + 100, Drawable::Flags::Global)
{
DrawableMgr::Register(this);
UpdateText();
}
void FpsOverlay::UpdateText() {
auto fps = Utils::RoundTo<int>(Game_Clock::GetFPS());
text = "FPS: " + std::to_string(fps);
fps_dirty = true;
}
bool FpsOverlay::Update() {
int mod = static_cast<int>(Game_Clock::GetGameSpeedFactor());
if (mod != last_speed_mod) {
speedup_dirty = true;
last_speed_mod = mod;
}
auto now = Game_Clock::GetFrameTime();
auto dt = now - last_refresh_time;
if (dt < refresh_frequency) {
return false;
}
last_refresh_time = now;
UpdateText();
return true;
}
void FpsOverlay::Draw(Bitmap& dst) {
if (draw_fps) {
if (fps_dirty) {
std::string text = GetFpsString();
Rect rect = Text::GetSize(*Font::DefaultBitmapFont(), text);
if (!fps_bitmap || fps_bitmap->GetWidth() < rect.width + 1) {
// Height never changes
fps_bitmap = Bitmap::Create(rect.width + 1, rect.height - 1, true);
}
fps_bitmap->Clear();
fps_bitmap->Fill(Color(0, 0, 0, 128));
Text::Draw(*fps_bitmap, 1, 0, *Font::DefaultBitmapFont(), Color(255, 255, 255, 255), text);
fps_rect = Rect(0, 0, rect.width + 1, rect.height - 1);
fps_dirty = false;
}
dst.Blit(1, 2, *fps_bitmap, fps_rect, 255);
}
// Always drawn when speedup is on independent of FPS
if (last_speed_mod > 1) {
if (speedup_dirty) {
std::string text = "> x" + std::to_string(last_speed_mod);
Rect rect = Text::GetSize(*Font::DefaultBitmapFont(), text);
if (!speedup_bitmap || speedup_bitmap->GetWidth() < rect.width + 1) {
// Height never changes
speedup_bitmap = Bitmap::Create(rect.width + 1, rect.height - 1, true);
}
speedup_bitmap->Clear();
speedup_bitmap->Fill(Color(0, 0, 0, 128));
Text::Draw(*speedup_bitmap, 1, 0, *Font::DefaultBitmapFont(), Color(255, 255, 255, 255), text);
speedup_rect = Rect(0, 0, rect.width + 1, rect.height - 1);
speedup_dirty = false;
}
int dwidth = dst.GetWidth();
dst.Blit(dwidth - speedup_rect.width - 1, 2, *speedup_bitmap, speedup_rect, 255);
}
}