xref: /oneTBB/examples/common/gui/convideo.cpp (revision c21e688a)
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