xref: /oneTBB/examples/common/gui/macvideo.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 "video.hpp"
18d86ed7fbStbbdev #include <cassert>
19d86ed7fbStbbdev #include <stdio.h>
20d86ed7fbStbbdev #include <iostream>
21d86ed7fbStbbdev #include <pthread.h>
22d86ed7fbStbbdev 
2357f524caSIlya Isaev unsigned int *g_pImg = nullptr;
24d86ed7fbStbbdev int g_sizex = 0, g_sizey = 0;
2557f524caSIlya Isaev static video *g_video = nullptr;
26d86ed7fbStbbdev static int g_fps = 0;
2757f524caSIlya Isaev char *window_title = nullptr;
28d86ed7fbStbbdev #define WINDOW_TITLE_SIZE 256
29d86ed7fbStbbdev int cocoa_update = 0;
30d86ed7fbStbbdev 
31d86ed7fbStbbdev #include <sched.h>
32d86ed7fbStbbdev #include <sys/time.h>
33d86ed7fbStbbdev struct timeval g_time;
34d86ed7fbStbbdev 
video()35d86ed7fbStbbdev video::video()
36d86ed7fbStbbdev #if __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__
37d86ed7fbStbbdev         : depth(24),
38d86ed7fbStbbdev           red_shift(0),
39d86ed7fbStbbdev           green_shift(8),
40d86ed7fbStbbdev           blue_shift(16),
41d86ed7fbStbbdev           red_mask(0xff),
42d86ed7fbStbbdev           green_mask(0xff00),
43d86ed7fbStbbdev           blue_mask(0xff0000)
44d86ed7fbStbbdev #else
45d86ed7fbStbbdev         : depth(24),
46d86ed7fbStbbdev           red_shift(16),
47d86ed7fbStbbdev           green_shift(8),
48d86ed7fbStbbdev           blue_shift(0),
49d86ed7fbStbbdev           red_mask(0xff0000),
50d86ed7fbStbbdev           green_mask(0xff00),
51d86ed7fbStbbdev           blue_mask(0xff)
52d86ed7fbStbbdev #endif
53d86ed7fbStbbdev {
5457f524caSIlya Isaev     assert(g_video == nullptr);
55d86ed7fbStbbdev     g_video = this;
56d86ed7fbStbbdev     title = "Video";
57d86ed7fbStbbdev     cocoa_update = 1;
58d86ed7fbStbbdev     updating = true;
59d86ed7fbStbbdev     calc_fps = false;
60d86ed7fbStbbdev }
61d86ed7fbStbbdev 
init_window(int x,int y)62d86ed7fbStbbdev bool video::init_window(int x, int y) {
63d86ed7fbStbbdev     g_sizex = x;
64d86ed7fbStbbdev     g_sizey = y;
65d86ed7fbStbbdev     g_pImg = new unsigned int[x * y];
6657f524caSIlya Isaev     if (window_title == nullptr)
67d86ed7fbStbbdev         window_title = (char *)malloc(WINDOW_TITLE_SIZE);
68d86ed7fbStbbdev     strncpy(window_title, title, WINDOW_TITLE_SIZE - 1);
69d86ed7fbStbbdev     running = true;
70d86ed7fbStbbdev     return true;
71d86ed7fbStbbdev }
72d86ed7fbStbbdev 
init_console()73d86ed7fbStbbdev bool video::init_console() {
74d86ed7fbStbbdev     running = true;
75d86ed7fbStbbdev     return true;
76d86ed7fbStbbdev }
77d86ed7fbStbbdev 
terminate()78d86ed7fbStbbdev void video::terminate() {
79d86ed7fbStbbdev     if (calc_fps) {
80d86ed7fbStbbdev         double fps = g_fps;
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         printf("%s: %.1f fps\n", title, fps);
87d86ed7fbStbbdev     }
8857f524caSIlya Isaev     g_video = nullptr;
89d86ed7fbStbbdev     running = false;
90ba947f18SIlya Isaev 
91d86ed7fbStbbdev     delete[] g_pImg;
9257f524caSIlya Isaev     g_pImg = nullptr;
93d86ed7fbStbbdev }
94d86ed7fbStbbdev 
~video()95d86ed7fbStbbdev video::~video() {
96d86ed7fbStbbdev     if (g_video)
97d86ed7fbStbbdev         terminate();
98d86ed7fbStbbdev }
99d86ed7fbStbbdev 
100d86ed7fbStbbdev //! Count and display FPS count in titlebar
next_frame()101d86ed7fbStbbdev bool video::next_frame() {
102d86ed7fbStbbdev     if (calc_fps) {
103d86ed7fbStbbdev         if (!g_fps) {
104d86ed7fbStbbdev             struct timezone tz;
105d86ed7fbStbbdev             gettimeofday(&g_time, &tz);
106d86ed7fbStbbdev         }
107d86ed7fbStbbdev         g_fps++;
108d86ed7fbStbbdev     }
109d86ed7fbStbbdev     struct timezone tz;
110d86ed7fbStbbdev     struct timeval now_time;
111d86ed7fbStbbdev     gettimeofday(&now_time, &tz);
112d86ed7fbStbbdev     double sec = ((now_time.tv_sec + 1.0 * now_time.tv_usec / 1000000.0) -
113d86ed7fbStbbdev                   (g_time.tv_sec + 1.0 * g_time.tv_usec / 1000000.0));
114d86ed7fbStbbdev     if (sec > 1) {
115d86ed7fbStbbdev         if (calc_fps) {
116d86ed7fbStbbdev             memcpy(&g_time, &now_time, sizeof(g_time));
117d86ed7fbStbbdev             int fps;
118d86ed7fbStbbdev             fps = g_fps / sec;
119d86ed7fbStbbdev             cocoa_update = (int)updating;
120d86ed7fbStbbdev             snprintf(window_title,
121d86ed7fbStbbdev                      WINDOW_TITLE_SIZE,
122d86ed7fbStbbdev                      "%s%s: %d fps",
123d86ed7fbStbbdev                      title,
124d86ed7fbStbbdev                      updating ? "" : " (no updating)",
125d86ed7fbStbbdev                      int(fps));
126d86ed7fbStbbdev             g_fps = 0;
127d86ed7fbStbbdev         }
128d86ed7fbStbbdev     }
129d86ed7fbStbbdev     return running;
130d86ed7fbStbbdev }
131d86ed7fbStbbdev 
thread_func(void *)132d86ed7fbStbbdev void *thread_func(void *) {
133d86ed7fbStbbdev     g_video->on_process();
134d86ed7fbStbbdev     exit(EXIT_SUCCESS);
135d86ed7fbStbbdev }
136d86ed7fbStbbdev 
on_mouse_func(int x,int y,int k)137d86ed7fbStbbdev extern "C" void on_mouse_func(int x, int y, int k) {
138d86ed7fbStbbdev     g_video->on_mouse(x, y, k);
139d86ed7fbStbbdev     return;
140d86ed7fbStbbdev }
141d86ed7fbStbbdev 
on_key_func(int x)142d86ed7fbStbbdev extern "C" void on_key_func(int x) {
143d86ed7fbStbbdev     g_video->on_key(x);
144d86ed7fbStbbdev     return;
145d86ed7fbStbbdev }
146d86ed7fbStbbdev 
147d86ed7fbStbbdev extern "C" int cocoa_main(int argc, char *argv[]);
148d86ed7fbStbbdev //! Do standard loop
main_loop()149d86ed7fbStbbdev void video::main_loop() {
150d86ed7fbStbbdev     pthread_t handle;
151d86ed7fbStbbdev     pthread_attr_t attr;
152d86ed7fbStbbdev     pthread_attr_init(&attr);
15357f524caSIlya Isaev     pthread_create(&handle, &attr, &thread_func, (void *)nullptr);
154d86ed7fbStbbdev     pthread_detach(handle);
15557f524caSIlya Isaev     cocoa_main(0, nullptr);
156d86ed7fbStbbdev }
157d86ed7fbStbbdev 
158d86ed7fbStbbdev //! Change window title
show_title()159d86ed7fbStbbdev void video::show_title() {
160d86ed7fbStbbdev     if (title)
161d86ed7fbStbbdev         strncpy(window_title, title, WINDOW_TITLE_SIZE);
162d86ed7fbStbbdev     return;
163d86ed7fbStbbdev }
164d86ed7fbStbbdev 
165d86ed7fbStbbdev ///////////////////////////////////////////// public methods of video class ///////////////////////
166d86ed7fbStbbdev 
drawing_area(int x,int y,int sizex,int sizey)167d86ed7fbStbbdev drawing_area::drawing_area(int x, int y, int sizex, int sizey)
168d86ed7fbStbbdev         : base_index(y * g_sizex + x),
169d86ed7fbStbbdev           max_index(g_sizex * g_sizey),
170d86ed7fbStbbdev           index_stride(g_sizex),
171d86ed7fbStbbdev           pixel_depth(24),
172d86ed7fbStbbdev           ptr32(g_pImg),
173d86ed7fbStbbdev           start_x(x),
174d86ed7fbStbbdev           start_y(y),
175d86ed7fbStbbdev           size_x(sizex),
176d86ed7fbStbbdev           size_y(sizey) {
177d86ed7fbStbbdev     assert(x < g_sizex);
178d86ed7fbStbbdev     assert(y < g_sizey);
179d86ed7fbStbbdev     assert(x + sizex <= g_sizex);
180d86ed7fbStbbdev     assert(y + sizey <= g_sizey);
181d86ed7fbStbbdev 
182d86ed7fbStbbdev     index = base_index; // current index
183d86ed7fbStbbdev }
184d86ed7fbStbbdev 
update()185d86ed7fbStbbdev void drawing_area::update() {
186d86ed7fbStbbdev     //nothing to do, updating via timer in cocoa part.
187d86ed7fbStbbdev }
188