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