1d86ed7fbStbbdev /*
2*c21e688aSSergey Zheltov Copyright (c) 2005-2022 Intel Corporation
3d86ed7fbStbbdev
4d86ed7fbStbbdev Licensed under the Apache License, Version 2.0 (the "License");
5d86ed7fbStbbdev you may not use this file except in compliance with the License.
6d86ed7fbStbbdev You may obtain a copy of the License at
7d86ed7fbStbbdev
8d86ed7fbStbbdev http://www.apache.org/licenses/LICENSE-2.0
9d86ed7fbStbbdev
10d86ed7fbStbbdev Unless required by applicable law or agreed to in writing, software
11d86ed7fbStbbdev distributed under the License is distributed on an "AS IS" BASIS,
12d86ed7fbStbbdev WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d86ed7fbStbbdev See the License for the specific language governing permissions and
14d86ed7fbStbbdev limitations under the License.
15d86ed7fbStbbdev */
16d86ed7fbStbbdev
17d86ed7fbStbbdev #include <cassert>
18d86ed7fbStbbdev #include <stdio.h>
19d86ed7fbStbbdev
20d86ed7fbStbbdev #include "video.hpp"
21d86ed7fbStbbdev
2257f524caSIlya Isaev unsigned int *g_pImg = nullptr;
23d86ed7fbStbbdev int g_sizex, g_sizey;
2457f524caSIlya Isaev static video *g_video = nullptr;
25d86ed7fbStbbdev static int g_fps = 0;
26d86ed7fbStbbdev
27d86ed7fbStbbdev #if _WIN32 || _WIN64
28d86ed7fbStbbdev
29d86ed7fbStbbdev static DWORD g_msec = 0;
30d86ed7fbStbbdev
31d86ed7fbStbbdev #ifdef _WINDOWS
32d86ed7fbStbbdev HINSTANCE video::win_hInstance = 0;
33d86ed7fbStbbdev int video::win_iCmdShow = 0;
win_set_class(WNDCLASSEX & wcex)34d86ed7fbStbbdev void video::win_set_class(WNDCLASSEX &wcex) {}
win_load_accelerators(int idc)35d86ed7fbStbbdev void video::win_load_accelerators(int idc) {}
36d86ed7fbStbbdev #endif //_WINDOWS
37d86ed7fbStbbdev
38d86ed7fbStbbdev #else
39d86ed7fbStbbdev #include <sched.h>
40d86ed7fbStbbdev #include <sys/time.h>
41d86ed7fbStbbdev struct timeval g_time;
42d86ed7fbStbbdev #endif //_WIN32||_WIN64
43d86ed7fbStbbdev
44d86ed7fbStbbdev #define CALC_FPS_ENABLED ((WINAPI_FAMILY != WINAPI_FAMILY_APP) && (!__ANDROID__))
45d86ed7fbStbbdev
video()46d86ed7fbStbbdev video::video()
47d86ed7fbStbbdev // OpenGL* RGBA byte order for little-endian CPU
48d86ed7fbStbbdev : depth(24),
49d86ed7fbStbbdev red_shift(0),
50d86ed7fbStbbdev green_shift(8),
51d86ed7fbStbbdev blue_shift(16),
52d86ed7fbStbbdev red_mask(0xff),
53d86ed7fbStbbdev green_mask(0xff00),
54d86ed7fbStbbdev blue_mask(0xff0000) {
5557f524caSIlya Isaev assert(g_video == nullptr);
56d86ed7fbStbbdev g_video = this;
57d86ed7fbStbbdev title = "Video";
58d86ed7fbStbbdev updating = calc_fps = false;
59d86ed7fbStbbdev }
60d86ed7fbStbbdev
init_window(int x,int y)61d86ed7fbStbbdev bool video::init_window(int x, int y) {
62d86ed7fbStbbdev g_sizex = x;
63d86ed7fbStbbdev g_sizey = y;
64d86ed7fbStbbdev g_pImg = new unsigned int[x * y];
65d86ed7fbStbbdev running = true;
66d86ed7fbStbbdev return false;
67d86ed7fbStbbdev }
68d86ed7fbStbbdev
init_console()69d86ed7fbStbbdev bool video::init_console() {
70d86ed7fbStbbdev running = true;
71d86ed7fbStbbdev return true;
72d86ed7fbStbbdev }
73d86ed7fbStbbdev
terminate()74d86ed7fbStbbdev void video::terminate() {
75d86ed7fbStbbdev #if CALC_FPS_ENABLED
76d86ed7fbStbbdev if (calc_fps) {
77d86ed7fbStbbdev double fps = g_fps;
78d86ed7fbStbbdev #if _WIN32 || _WIN64
79d86ed7fbStbbdev fps /= (GetTickCount() - g_msec) / 1000.0;
80d86ed7fbStbbdev #else
81d86ed7fbStbbdev struct timezone tz;
82d86ed7fbStbbdev struct timeval end_time;
83d86ed7fbStbbdev gettimeofday(&end_time, &tz);
84d86ed7fbStbbdev fps /= (end_time.tv_sec + 1.0 * end_time.tv_usec / 1000000.0) -
85d86ed7fbStbbdev (g_time.tv_sec + 1.0 * g_time.tv_usec / 1000000.0);
86d86ed7fbStbbdev #endif
87d86ed7fbStbbdev printf("%s: %.1f fps\n", title, fps);
88d86ed7fbStbbdev }
89d86ed7fbStbbdev #endif
9057f524caSIlya Isaev g_video = nullptr;
91d86ed7fbStbbdev running = false;
92ba947f18SIlya Isaev
93d86ed7fbStbbdev delete[] g_pImg;
94ba947f18SIlya Isaev g_pImg = nullptr;
95d86ed7fbStbbdev }
96d86ed7fbStbbdev
~video()97d86ed7fbStbbdev video::~video() {
98d86ed7fbStbbdev if (g_video)
99d86ed7fbStbbdev terminate();
100d86ed7fbStbbdev }
101d86ed7fbStbbdev
102d86ed7fbStbbdev //! Count and display FPS count in titlebar
next_frame()103d86ed7fbStbbdev bool video::next_frame() {
104d86ed7fbStbbdev #if CALC_FPS_ENABLED
105d86ed7fbStbbdev if (calc_fps) {
106d86ed7fbStbbdev if (!g_fps) {
107d86ed7fbStbbdev #if _WIN32 || _WIN64
108d86ed7fbStbbdev g_msec = GetTickCount();
109d86ed7fbStbbdev #else
110d86ed7fbStbbdev struct timezone tz;
111d86ed7fbStbbdev gettimeofday(&g_time, &tz);
112d86ed7fbStbbdev #endif
113d86ed7fbStbbdev }
114d86ed7fbStbbdev g_fps++;
115d86ed7fbStbbdev }
116d86ed7fbStbbdev #endif
117d86ed7fbStbbdev return running;
118d86ed7fbStbbdev }
119d86ed7fbStbbdev
120d86ed7fbStbbdev //! Do standard loop
main_loop()121d86ed7fbStbbdev void video::main_loop() {
122d86ed7fbStbbdev on_process();
123d86ed7fbStbbdev }
124d86ed7fbStbbdev
125d86ed7fbStbbdev //! Change window title
show_title()126d86ed7fbStbbdev void video::show_title() {}
127d86ed7fbStbbdev
128d86ed7fbStbbdev ///////////////////////////////////////////// public methods of video class ///////////////////////
129d86ed7fbStbbdev
drawing_area(int x,int y,int sizex,int sizey)130d86ed7fbStbbdev drawing_area::drawing_area(int x, int y, int sizex, int sizey)
131d86ed7fbStbbdev : base_index(y * g_sizex + x),
132d86ed7fbStbbdev max_index(g_sizex * g_sizey),
133d86ed7fbStbbdev index_stride(g_sizex),
134d86ed7fbStbbdev pixel_depth(24),
135d86ed7fbStbbdev ptr32(g_pImg),
136d86ed7fbStbbdev start_x(x),
137d86ed7fbStbbdev start_y(y),
138d86ed7fbStbbdev size_x(sizex),
139d86ed7fbStbbdev size_y(sizey) {
140d86ed7fbStbbdev assert(x < g_sizex);
141d86ed7fbStbbdev assert(y < g_sizey);
142d86ed7fbStbbdev assert(x + sizex <= g_sizex);
143d86ed7fbStbbdev assert(y + sizey <= g_sizey);
144d86ed7fbStbbdev
145d86ed7fbStbbdev index = base_index; // current index
146d86ed7fbStbbdev }
147d86ed7fbStbbdev
update()148d86ed7fbStbbdev void drawing_area::update() {}
149