21 #include "../include/tscope5/display.h"
22 #include "../include/tscope5/graphics.h"
23 #include "../include/tscope5/bitmaps.h"
24 #include "../include/tscope5/display_internal.h"
25 #include "../include/tscope5/system_internal.h"
26 #include "../include/tscope5/graphics_internal.h"
92 for (i = 0; i < _ts5_status.num_displays; i++) {
94 if (_ts5_status.display[i].adapter
96 ts5_fatal (
"%s: %s, %s (%d)\n",
"ts5_install_display",
97 "cannot open fullscreen display",
98 "adapter already in use by another display", i);
107 request.refreshrate = -1;
108 request.display_mode = TS5_FULLSCREEN_WINDOW;
117 for (i = 0; i < _ts5_status.num_displays; i++) {
119 if (_ts5_status.display[i].adapter
121 ts5_fatal (
"%s: %s, %s (%d)\n",
"ts5_install_display",
122 "cannot open fullscreen display",
123 " adapter already in use by another display", i);
129 ALLEGRO_DISPLAY_MODE *mode;
130 mode = (ALLEGRO_DISPLAY_MODE *)al_malloc(
sizeof(ALLEGRO_DISPLAY_MODE));
131 int nmodes = al_get_num_display_modes();
134 for (i=0; i<nmodes; i++) {
136 mode = al_get_display_mode(i, mode);
141 || mode->refresh_rate==0)) {
149 ts5_fatal (
"%s: %s (%d, %d) %s (%d) %s %d\n",
150 "ts5_install_display"
151 "the requested combination of size",
154 "is not supported by display adapter",
164 request.display_mode = TS5_FULLSCREEN;
174 for (i = 0; i < _ts5_status.num_displays; i++) {
176 if (_ts5_status.display[i].adapter
178 && (_ts5_status.display[i].display_mode
180 || _ts5_status.display[i].display_mode
181 == TS5_FULLSCREEN_WINDOW)) {
183 ts5_fatal (
"%s: %s, %s (%d)\n",
"ts5_install_display",
184 "cannot open display",
185 " adapter already in use by a fullscreen display",
194 ts5_log(TS5_LOGLEVEL_1,
"%s: %s %d (was %d)\n",
195 "ts5_install_display",
"adjusting display width to",
199 > _ts5_status.display_adapter
204 ts5_log(TS5_LOGLEVEL_1,
"%s: %s %d (was %d)\n",
205 "ts5_install_display",
"adjusting display width to",
216 ts5_log(TS5_LOGLEVEL_1,
"%s: %s %d (was %d)\n",
217 "ts5_install_display",
"adjusting display height to",
221 > _ts5_status.display_adapter
224 request.h = _ts5_status.display_adapter
227 ts5_log(TS5_LOGLEVEL_1,
"%s: %s %d (was %d)\n",
228 "ts5_install_display",
"adjusting display height to",
238 if (request.x == -1) {
240 if (_ts5_status.graphics.coordinate_system
241 == TS5_CARTESIAN_COORDINATES) {
243 request.x = (_ts5_status.display_adapter
244 [request.adapter].w - request.w)/2;
250 request.x += _ts5_status.display_adapter[request.adapter].x1;
253 if (request.y == -1) {
255 if (_ts5_status.graphics.coordinate_system
256 == TS5_CARTESIAN_COORDINATES) {
258 request.y = (_ts5_status.display_adapter
259 [request.adapter].h - request.h)/2;
265 request.y += _ts5_status.display_adapter[request.adapter].y1;
269 request.refreshrate = -1;
270 request.display_mode = TS5_WINDOWED;
276 al_set_new_display_adapter(request.adapter);
277 al_set_new_display_refresh_rate(request.refreshrate);
279 al_set_new_display_option(ALLEGRO_VSYNC, (
int)request.vsync_mode,
282 if (request.display_mode == TS5_WINDOWED) {
283 al_set_new_window_position(request.x, request.y);
286 if (request.display_mode == TS5_FULLSCREEN_WINDOW) {
287 al_set_new_window_position(INT_MAX, INT_MAX);
290 al_set_new_display_flags(request.display_mode);
293 _ts5_status.num_displays++;
294 _ts5_status.active_display = _ts5_status.num_displays - 1;
297 ts5_log(TS5_LOGLEVEL_1,
"ts5_install_display: Opening display\n");
299 TS5_DISPLAY **display;
300 display = al_realloc(_ts5_data.display,
301 _ts5_status.num_displays *
sizeof(TS5_DISPLAY *));
303 if (display == NULL) {
304 ts5_fatal(
"%s: %s\n",
"ts5_install_display",
305 "failed to allocate memory for display pointer");
308 _ts5_data.display = (TS5_DISPLAY **) display;
310 _ts5_data.display[_ts5_status.active_display] =
311 al_create_display(request.w, request.h);
313 if (!_ts5_data.display[_ts5_status.active_display]) {
314 ts5_fatal(
"ts5_install_display: could not open display\n");
319 request.w = _ts5_status.display_adapter[request.adapter].w;
320 request.h = _ts5_status.display_adapter[request.adapter].h;
322 al_toggle_display_flag(_ts5_data.display[_ts5_status.active_display],
323 TS5_FULLSCREEN_WINDOW, 0);
325 al_toggle_display_flag(_ts5_data.display[_ts5_status.active_display],
326 TS5_FULLSCREEN_WINDOW, 1);
332 TS5_BITMAP **display_buffer;
334 display_buffer = al_realloc(_ts5_data.display_buffer,
335 _ts5_status.num_displays *
sizeof(TS5_BITMAP *));
337 if (display_buffer == NULL) {
338 ts5_fatal(
"%s: %s\n",
"ts5_install_display",
339 "failed to allocate memory for display buffer pointer");
342 _ts5_data.display_buffer = (TS5_BITMAP **) display_buffer;
344 _ts5_data.display_buffer[_ts5_status.active_display] =
345 al_create_bitmap(request.w, request.h);
347 if (!_ts5_data.display_buffer[_ts5_status.active_display]) {
348 ts5_fatal(
"ts5_install_display: could not open display buffer\n");
353 [_ts5_status.active_display]);
359 TS5_DISPLAY_STATUS *display_status;
360 display_status = al_realloc(_ts5_status.display,
361 _ts5_status.num_displays *
sizeof(TS5_DISPLAY_STATUS));
363 if (display_status == NULL) {
364 ts5_fatal(
"%s: %s\n",
"ts5_install_display",
365 "failed to allocate memory for display settings");
368 _ts5_status.display = (TS5_DISPLAY_STATUS *) display_status;
370 _ts5_status.display[_ts5_status.active_display].adapter =
373 if (request.display_mode==TS5_WINDOWED) {
375 al_get_window_position(_ts5_data.display[_ts5_status.active_display],
376 &request.x, &request.y);
378 if (request.x + request.w
381 int oldw = request.w;
383 request.w = _ts5_status.display_adapter
386 al_resize_display(_ts5_data.display[_ts5_status.active_display],
387 request.w, request.h);
389 ts5_log(TS5_LOGLEVEL_1,
"%s: %s %d (was %d)\n",
390 "ts5_install_display",
"adjusting display width to",
394 if (request.y + request.h > _ts5_status.display_adapter
397 int oldh = request.h;
399 request.h = _ts5_status.display_adapter
402 al_resize_display(_ts5_data.display[_ts5_status.active_display],
403 request.w, request.h);
405 al_set_window_position(_ts5_data.display
406 [_ts5_status.active_display],
407 request.x, request.y + (request.h-oldh));
409 ts5_log(TS5_LOGLEVEL_1,
"%s: %s %d (was %d)\n",
410 "ts5_install_display",
"adjusting display height to",
413 al_get_window_position(
414 _ts5_data.display[_ts5_status.active_display],
415 &request.x, &request.y);
418 request.x -= _ts5_status.display_adapter[request.adapter].x1;
419 request.y -= _ts5_status.display_adapter[request.adapter].y1;
421 if (_ts5_status.graphics.coordinate_system
422 == TS5_CARTESIAN_COORDINATES) {
426 - (_ts5_status.display_adapter[request.adapter].w
430 (_ts5_status.display_adapter[request.adapter].h
436 _ts5_status.display[_ts5_status.active_display].x = request.x;
437 _ts5_status.display[_ts5_status.active_display].y = request.y;
438 _ts5_status.display[_ts5_status.active_display].w = request.w;
439 _ts5_status.display[_ts5_status.active_display].h = request.h;
441 _ts5_status.display[_ts5_status.active_display].refreshrate =
444 _ts5_status.display[_ts5_status.active_display].display_mode =
445 request.display_mode;
447 _ts5_status.display[_ts5_status.active_display].vsync_mode =
452 return _ts5_status.active_display;
467 ts5_log(TS5_LOGLEVEL_5,
"ts5_clear_display()\n");
469 if (_ts5_data.target == NULL) {
470 ts5_fatal(
"ts5_clear_display: target is a NULL pointer\n");
473 al_clear_to_color(_ts5_status.graphics.background_color);
491 ts5_log(TS5_LOGLEVEL_5,
"ts5_flip_display()\n");
493 al_set_target_backbuffer(_ts5_data.display[_ts5_status.active_display]);
495 al_draw_bitmap(_ts5_data.display_buffer[_ts5_status.active_display],
499 al_clear_to_color(_ts5_status.graphics.background_color);
501 al_set_target_bitmap(_ts5_data.display_buffer
502 [_ts5_status.active_display]);
504 return al_get_time();
539 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_active_display(%d)\n", display);
541 int retval = _ts5_status.active_display + 1;
542 _ts5_status.active_display = display - 1;
543 _ts5_data.target = _ts5_data.display_buffer[_ts5_status.active_display];
544 al_set_target_bitmap(_ts5_data.target);
546 _ts5_status.graphics.target_width =
547 al_get_bitmap_width(_ts5_data.target);
549 _ts5_status.graphics.target_height =
550 al_get_bitmap_height(_ts5_data.target);
567 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_active_display()\n");
569 return _ts5_status.active_display + 1;
596 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_num_display_adapters()\n");
598 return _ts5_status.num_display_adapters;
618 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_adapter_size(%d,%f,%f)\n",
624 ts5_fatal(
"ts5_get_display_adapter_size: adapter index not valid\n");
626 else if (adapter == 0) {
630 else if (adapter <= _ts5_status.num_display_adapters) {
631 ww = _ts5_status.display_adapter[adapter-1].w;
632 hh = _ts5_status.display_adapter[adapter-1].h;
635 ts5_fatal(
"ts5_get_display_adapter_size: adapter index not valid\n");
660 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_adapter_width(%d)\n", adapter);
681 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_adapter_height(%d)\n", adapter);
720 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_display_adapter(%d)\n", adapter);
724 if (adapter > 0 && adapter <= _ts5_status.num_display_adapters) {
726 ts5_log(TS5_LOGLEVEL_4,
"%s: %s %d (was %d)\n",
727 "ts5_set_display_adapter",
728 "set display adapter for next display to",
732 ts5_fatal (
"ts5_set_display_adapter: adapter index not valid\n");
751 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_adapter(%d)\n", display);
759 retval = _ts5_status.display[display-1].adapter + 1;
777 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_display_size(%f,%f)\n", w, h);
782 if (_ts5_status.graphics.coordinate_scale
783 == TS5_RELATIVE_COORDINATES) {
791 ts5_log(TS5_LOGLEVEL_4,
"%s: %s %d x %d (was %d x %d)\n",
792 "ts5_set_display_size",
793 "set display size for next display to",
812 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_size(%d,%p,%p)\n", display, w, h);
821 ww = _ts5_status.display[display-1].w;
822 hh = _ts5_status.display[display-1].h;
847 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_width(%d)\n", display);
868 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_height(%d)\n", display);
894 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_display_position(%f,%f)\n", x, y);
899 if (_ts5_status.graphics.coordinate_scale
900 == TS5_RELATIVE_COORDINATES) {
902 if (_ts5_status.graphics.coordinate_system
903 == TS5_CARTESIAN_COORDINATES) {
917 if (_ts5_status.graphics.coordinate_system
918 == TS5_CARTESIAN_COORDINATES) {
933 ts5_log(TS5_LOGLEVEL_4,
"%s: %s (%d,%d) (was (%d,%d))\n",
934 "ts5_set_display_position",
935 "set display position for next display to",
957 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_position(%d,%p,%p)\n",
961 double dw, dh, aw, ah;
967 al_get_window_position(_ts5_data.display[display-1],
968 &_ts5_status.display[display-1].x,
969 &_ts5_status.display[display-1].y);
971 xx = _ts5_status.display[display-1].x;
972 yy = _ts5_status.display[display-1].y;
974 xx -= _ts5_status.display_adapter[adapter-1].x1;
975 yy -= _ts5_status.display_adapter[adapter-1].y1;
977 dw = _ts5_status.display[display-1].w;
978 dh = _ts5_status.display[display-1].h;
980 aw = _ts5_status.display_adapter[adapter-1].w;
981 ah = _ts5_status.display_adapter[adapter-1].h;
996 if (xx!=-1 && yy!=-1) {
1000 if (_ts5_status.graphics.coordinate_system
1001 == TS5_CARTESIAN_COORDINATES) {
1002 xx = xx + dw/2.0 - aw/2.0;
1003 yy = ah/2.0 - yy - dh/2.0;
1007 if (_ts5_status.graphics.coordinate_scale
1008 == TS5_RELATIVE_COORDINATES) {
1010 if (_ts5_status.graphics.coordinate_system
1011 == TS5_CARTESIAN_COORDINATES) {
1045 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_x(%d)\n", display);
1065 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_y(%d)\n", display);
1092 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_refreshrate(%d)\n", rate);
1098 ts5_log(TS5_LOGLEVEL_4,
"%s: %s %d (was %d)\n",
"ts5_set_refreshrate",
1099 "set refreshrate for next display to",
1118 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_refreshrate(%d)\n", display);
1126 retval = _ts5_status.display[display-1].refreshrate;
1163 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_display_mode(%d)\n", mode);
1167 if (mode != TS5_WINDOWED
1168 && mode != TS5_FULLSCREEN
1169 && mode != TS5_FULLSCREEN_WINDOW) {
1170 ts5_fatal (
"%s: %s (%d)\n",
"ts5_set_display_mode",
1171 "requested display mode not available", mode);
1176 ts5_log(TS5_LOGLEVEL_4,
"%s: %s %d (was %d)\n",
"ts5_set_display_mode",
1177 "set display mode for next display to",
1196 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_display_mode(%d)\n", display);
1204 retval = _ts5_status.display[display-1].display_mode;
1224 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_vsync_mode(%d)\n", mode);
1228 if (mode < TS5_VSYNC_WHATEVER || mode > TS5_VSYNC_OFF) {
1229 ts5_fatal(
"ts5_set_vsync_mode: mode should be 0, 1 or 2 (is %d)\n",
1235 ts5_log(TS5_LOGLEVEL_4,
"%s: %s %d (was %d)\n",
"ts5_set_vsync_mode",
1236 "set vsync mode for next display to",
1255 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_vsync_mode(%d)\n", display);
1263 retval = _ts5_status.display[display-1].vsync_mode;