src/video/allegro_v.cpp
author rubidium
Sat, 29 Nov 2008 01:28:13 +0000
changeset 10390 0c2cc4c7b91f
parent 10385 4f9838649c7f
permissions -rw-r--r--
(svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
-Change: make it more clear that Allegro's failing to find a driver.
10379
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
     1
/* $Id$ */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
     2
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
     3
/** @file allegro_v.cpp Implementation of the Allegro video driver. */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
     4
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
     5
#ifdef WITH_ALLEGRO
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
     6
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
     7
#include "../stdafx.h"
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
     8
#include "../openttd.h"
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
     9
#include "../debug.h"
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    10
#include "../gfx_func.h"
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    11
#include "../sdl.h"
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    12
#include "../variables.h"
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    13
#include "../rev.h"
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    14
#include "../blitter/factory.hpp"
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    15
#include "../network/network.h"
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    16
#include "../core/math_func.hpp"
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    17
#include "../core/random_func.hpp"
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    18
#include "../functions.h"
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    19
#include "../texteff.hpp"
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    20
#include "allegro_v.h"
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    21
#include <allegro.h>
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    22
10390
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
    23
#ifdef _DEBUG
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
    24
/* Allegro replaces SEGV/ABRT signals meaning that the debugger will never
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
    25
 * be triggered, so rereplace the signals and make the debugger userful. */
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
    26
#include <signal.h>
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
    27
#endif
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
    28
10379
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    29
static FVideoDriver_Allegro iFVideoDriver_Allegro;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    30
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    31
static BITMAP *_allegro_screen;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    32
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    33
#define MAX_DIRTY_RECTS 100
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    34
static PointDimension _dirty_rects[MAX_DIRTY_RECTS];
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    35
static int _num_dirty_rects;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    36
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    37
void VideoDriver_Allegro::MakeDirty(int left, int top, int width, int height)
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    38
{
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    39
	if (_num_dirty_rects < MAX_DIRTY_RECTS) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    40
		_dirty_rects[_num_dirty_rects].x = left;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    41
		_dirty_rects[_num_dirty_rects].y = top;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    42
		_dirty_rects[_num_dirty_rects].width = width;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    43
		_dirty_rects[_num_dirty_rects].height = height;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    44
	}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    45
	_num_dirty_rects++;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    46
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    47
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    48
static void DrawSurfaceToScreen()
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    49
{
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    50
	int n = _num_dirty_rects;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    51
	if (n == 0) return;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    52
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    53
	_num_dirty_rects = 0;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    54
	if (n > MAX_DIRTY_RECTS) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    55
		blit(_allegro_screen, screen, 0, 0, 0, 0, _allegro_screen->w, _allegro_screen->h);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    56
		return;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    57
	}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    58
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    59
	for (int i = 0; i < n; i++) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    60
		blit(_allegro_screen, screen, _dirty_rects[i].x, _dirty_rects[i].y, _dirty_rects[i].x, _dirty_rects[i].y, _dirty_rects[i].width, _dirty_rects[i].height);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    61
	}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    62
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    63
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    64
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    65
static void UpdatePalette(uint start, uint count)
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    66
{
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    67
	static PALETTE pal;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    68
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    69
	uint end = start + count;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    70
	for (uint i = start; i != end; i++) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    71
		pal[i].r = _cur_palette[i].r / 4;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    72
		pal[i].g = _cur_palette[i].g / 4;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    73
		pal[i].b = _cur_palette[i].b / 4;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    74
		pal[i].filler = 0;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    75
	}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    76
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    77
	set_palette_range(pal, start, end - 1, 1);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    78
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    79
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    80
static void InitPalette()
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    81
{
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    82
	UpdatePalette(0, 256);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    83
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    84
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    85
static void CheckPaletteAnim()
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    86
{
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    87
	if (_pal_count_dirty != 0) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    88
		Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    89
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    90
		switch (blitter->UsePaletteAnimation()) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    91
			case Blitter::PALETTE_ANIMATION_VIDEO_BACKEND:
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    92
				UpdatePalette(_pal_first_dirty, _pal_count_dirty);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    93
				break;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    94
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    95
			case Blitter::PALETTE_ANIMATION_BLITTER:
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    96
				blitter->PaletteAnimate(_pal_first_dirty, _pal_count_dirty);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    97
				break;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    98
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
    99
			case Blitter::PALETTE_ANIMATION_NONE:
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   100
				break;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   101
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   102
			default:
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   103
				NOT_REACHED();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   104
		}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   105
		_pal_count_dirty = 0;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   106
	}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   107
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   108
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   109
static const Dimension default_resolutions[] = {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   110
	{ 640,  480},
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   111
	{ 800,  600},
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   112
	{1024,  768},
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   113
	{1152,  864},
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   114
	{1280,  800},
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   115
	{1280,  960},
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   116
	{1280, 1024},
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   117
	{1400, 1050},
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   118
	{1600, 1200},
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   119
	{1680, 1050},
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   120
	{1920, 1200}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   121
};
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   122
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   123
static void GetVideoModes()
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   124
{
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   125
	/* Need to set a gfx_mode as there is NO other way to autodetect for
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   126
	 * cards ourselves... and we need a card to get the modes. */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   127
	set_gfx_mode(_fullscreen ? GFX_AUTODETECT_FULLSCREEN : GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   128
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   129
	GFX_MODE_LIST *mode_list = get_gfx_mode_list(gfx_driver->id);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   130
	if (mode_list == NULL) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   131
		memcpy(_resolutions, default_resolutions, sizeof(default_resolutions));
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   132
		_num_resolutions = lengthof(default_resolutions);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   133
		return;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   134
	}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   135
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   136
	GFX_MODE *modes = mode_list->mode;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   137
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   138
	int n = 0;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   139
	for (int i = 0; modes[i].bpp != 0; i++) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   140
		int w = modes[i].width;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   141
		int h = modes[i].height;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   142
		if (w >= 640 && h >= 480) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   143
			int j;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   144
			for (j = 0; j < n; j++) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   145
				if (_resolutions[j].width == w && _resolutions[j].height == h) break;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   146
			}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   147
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   148
			if (j == n) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   149
				_resolutions[j].width  = w;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   150
				_resolutions[j].height = h;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   151
				if (++n == lengthof(_resolutions)) break;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   152
			}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   153
		}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   154
	}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   155
	_num_resolutions = n;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   156
	SortResolutions(_num_resolutions);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   157
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   158
	destroy_gfx_mode_list(mode_list);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   159
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   160
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   161
static void GetAvailableVideoMode(int *w, int *h)
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   162
{
10390
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   163
	/* No video modes, so just try it and see where it ends */
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   164
	if (_num_resolutions == 0) return;
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   165
10379
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   166
	/* is the wanted mode among the available modes? */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   167
	for (int i = 0; i != _num_resolutions; i++) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   168
		if (*w == _resolutions[i].width && *h == _resolutions[i].height) return;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   169
	}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   170
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   171
	/* use the closest possible resolution */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   172
	int best = 0;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   173
	uint delta = abs((_resolutions[0].width - *w) * (_resolutions[0].height - *h));
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   174
	for (int i = 1; i != _num_resolutions; ++i) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   175
		uint newdelta = abs((_resolutions[i].width - *w) * (_resolutions[i].height - *h));
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   176
		if (newdelta < delta) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   177
			best = i;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   178
			delta = newdelta;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   179
		}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   180
	}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   181
	*w = _resolutions[best].width;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   182
	*h = _resolutions[best].height;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   183
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   184
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   185
static bool CreateMainSurface(int w, int h)
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   186
{
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   187
	int bpp = BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   188
	if (bpp == 0) usererror("Can't use a blitter that blits 0 bpp for normal visuals");
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   189
	set_color_depth(bpp);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   190
10390
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   191
	GetAvailableVideoMode(&w, &h);
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   192
	if (set_gfx_mode(_fullscreen ? GFX_AUTODETECT_FULLSCREEN : GFX_AUTODETECT_WINDOWED, w, h, 0, 0) != 0) {
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   193
		DEBUG(driver, 0, "Allegro: Couldn't allocate a window to draw on");
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   194
		return false;
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   195
	}
10385
4f9838649c7f (svn r14636) -Add: DOS port of OpenTTD, without network support though.
rubidium
parents: 10381
diff changeset
   196
10390
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   197
	/* The size of the screen might be bigger than the part we can actually draw on!
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   198
	 * So calculate the size based on the top, bottom, left and right */
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   199
	_allegro_screen = create_bitmap_ex(bpp, screen->cr - screen->cl, screen->cb - screen->ct);
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   200
	_screen.width = _allegro_screen->w;
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   201
	_screen.height = _allegro_screen->h;
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   202
	_screen.pitch = ((byte*)screen->line[1] - (byte*)screen->line[0]) / (bpp / 8);
10379
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   203
10390
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   204
	/* Initialise the screen so we don't blit garbage to the screen */
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   205
	memset(_allegro_screen->line[0], 0, _screen.height * _screen.pitch);
10379
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   206
10390
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   207
	/* Set the mouse at the place where we expect it */
10379
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   208
	poll_mouse();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   209
	_cursor.pos.x = mouse_x;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   210
	_cursor.pos.y = mouse_y;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   211
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   212
	InitPalette();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   213
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   214
	char caption[32];
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   215
	snprintf(caption, sizeof(caption), "OpenTTD %s", _openttd_revision);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   216
	set_window_title(caption);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   217
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   218
	GameSizeChanged();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   219
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   220
	return true;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   221
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   222
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   223
struct VkMapping {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   224
	uint16 vk_from;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   225
	byte vk_count;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   226
	byte map_to;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   227
};
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   228
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   229
#define AS(x, z) {x, 0, z}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   230
#define AM(x, y, z, w) {x, y - x, z}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   231
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   232
static const VkMapping _vk_mapping[] = {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   233
	/* Pageup stuff + up/down */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   234
	AM(KEY_PGUP, KEY_PGDN, WKC_PAGEUP, WKC_PAGEDOWN),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   235
	AS(KEY_UP,     WKC_UP),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   236
	AS(KEY_DOWN,   WKC_DOWN),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   237
	AS(KEY_LEFT,   WKC_LEFT),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   238
	AS(KEY_RIGHT,  WKC_RIGHT),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   239
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   240
	AS(KEY_HOME,   WKC_HOME),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   241
	AS(KEY_END,    WKC_END),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   242
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   243
	AS(KEY_INSERT, WKC_INSERT),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   244
	AS(KEY_DEL,    WKC_DELETE),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   245
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   246
	/* Map letters & digits */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   247
	AM(KEY_A, KEY_Z, 'A', 'Z'),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   248
	AM(KEY_0, KEY_9, '0', '9'),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   249
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   250
	AS(KEY_ESC,       WKC_ESC),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   251
	AS(KEY_PAUSE,     WKC_PAUSE),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   252
	AS(KEY_BACKSPACE, WKC_BACKSPACE),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   253
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   254
	AS(KEY_SPACE,     WKC_SPACE),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   255
	AS(KEY_ENTER,     WKC_RETURN),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   256
	AS(KEY_TAB,       WKC_TAB),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   257
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   258
	/* Function keys */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   259
	AM(KEY_F1, KEY_F12, WKC_F1, WKC_F12),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   260
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   261
	/* Numeric part. */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   262
	AM(KEY_0_PAD, KEY_9_PAD, '0', '9'),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   263
	AS(KEY_SLASH_PAD,   WKC_NUM_DIV),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   264
	AS(KEY_ASTERISK,    WKC_NUM_MUL),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   265
	AS(KEY_MINUS_PAD,   WKC_NUM_MINUS),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   266
	AS(KEY_PLUS_PAD,    WKC_NUM_PLUS),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   267
	AS(KEY_ENTER_PAD,   WKC_NUM_ENTER),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   268
	AS(KEY_DEL_PAD,     WKC_DELETE),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   269
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   270
	/* Other non-letter keys */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   271
	AS(KEY_SLASH,        WKC_SLASH),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   272
	AS(KEY_SEMICOLON,    WKC_SEMICOLON),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   273
	AS(KEY_EQUALS,       WKC_EQUALS),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   274
	AS(KEY_OPENBRACE,    WKC_L_BRACKET),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   275
	AS(KEY_BACKSLASH,    WKC_BACKSLASH),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   276
	AS(KEY_CLOSEBRACE,   WKC_R_BRACKET),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   277
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   278
	AS(KEY_QUOTE,   WKC_SINGLEQUOTE),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   279
	AS(KEY_COMMA,   WKC_COMMA),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   280
	AS(KEY_MINUS,   WKC_MINUS),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   281
	AS(KEY_STOP,    WKC_PERIOD),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   282
	AS(KEY_TILDE,   WKC_BACKQUOTE),
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   283
};
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   284
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   285
static uint32 ConvertAllegroKeyIntoMy()
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   286
{
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   287
	int scancode;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   288
	int unicode = ureadkey(&scancode);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   289
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   290
	const VkMapping *map;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   291
	uint key = 0;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   292
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   293
	for (map = _vk_mapping; map != endof(_vk_mapping); ++map) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   294
		if ((uint)(scancode - map->vk_from) <= map->vk_count) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   295
			key = scancode - map->vk_from + map->map_to;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   296
			break;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   297
		}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   298
	}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   299
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   300
	if (key_shifts & KB_SHIFT_FLAG) key |= WKC_SHIFT;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   301
	if (key_shifts & KB_CTRL_FLAG)  key |= WKC_CTRL;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   302
	if (key_shifts & KB_ALT_FLAG)   key |= WKC_ALT;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   303
#if 0
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   304
	DEBUG(driver, 0, "Scancode character pressed %u", scancode);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   305
	DEBUG(driver, 0, "Unicode character pressed %u", unicode);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   306
#endif
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   307
	return (key << 16) + unicode;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   308
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   309
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   310
enum {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   311
	LEFT_BUTTON,
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   312
	RIGHT_BUTTON,
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   313
};
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   314
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   315
static void PollEvent()
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   316
{
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   317
	poll_mouse();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   318
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   319
	bool mouse_action = false;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   320
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   321
	/* Mouse buttons */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   322
	static int prev_button_state;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   323
	if (prev_button_state != mouse_b) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   324
		uint diff = prev_button_state ^ mouse_b;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   325
		while (diff != 0) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   326
			int button = FindFirstBit(diff);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   327
			ClrBit(diff, button);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   328
			if (HasBit(mouse_b, button)) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   329
				/* Pressed mouse button */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   330
				if (_rightclick_emulate && key_shifts & KB_CTRL_FLAG) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   331
					button = RIGHT_BUTTON;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   332
					ClrBit(diff, RIGHT_BUTTON);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   333
				}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   334
				switch (button) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   335
					case LEFT_BUTTON:
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   336
						_left_button_down = true;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   337
						break;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   338
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   339
					case RIGHT_BUTTON:
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   340
						_right_button_down = true;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   341
						_right_button_clicked = true;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   342
						break;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   343
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   344
					default:
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   345
						/* ignore rest */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   346
						break;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   347
				}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   348
			} else {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   349
				/* Released mouse button */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   350
				if (_rightclick_emulate) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   351
					_right_button_down = false;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   352
					_left_button_down = false;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   353
					_left_button_clicked = false;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   354
				} else if (button == LEFT_BUTTON) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   355
					_left_button_down = false;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   356
					_left_button_clicked = false;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   357
				} else if (button == RIGHT_BUTTON) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   358
					_right_button_down = false;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   359
				}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   360
			}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   361
		}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   362
		prev_button_state = mouse_b;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   363
		mouse_action = true;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   364
	}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   365
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   366
	/* Mouse movement */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   367
	int dx = mouse_x - _cursor.pos.x;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   368
	int dy = mouse_y - _cursor.pos.y;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   369
	if (dx != 0 || dy != 0) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   370
		if (_cursor.fix_at) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   371
			_cursor.delta.x += dx;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   372
			_cursor.delta.y += dy;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   373
			position_mouse(_cursor.pos.x, _cursor.pos.y);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   374
		} else {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   375
			_cursor.delta.x = dx;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   376
			_cursor.delta.y = dy;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   377
			_cursor.pos.x = mouse_x;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   378
			_cursor.pos.y = mouse_y;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   379
			_cursor.dirty = true;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   380
		}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   381
		mouse_action = true;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   382
	}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   383
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   384
	if (mouse_action) HandleMouseEvents();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   385
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   386
	poll_keyboard();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   387
	if (key_shifts & KB_ALT_FLAG && (key[KEY_ENTER] || key[KEY_F])) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   388
		ToggleFullScreen(!_fullscreen);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   389
	} else if (keypressed()) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   390
		HandleKeypress(ConvertAllegroKeyIntoMy());
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   391
	}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   392
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   393
10380
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents: 10379
diff changeset
   394
/** There are multiple modules that might be using Allegro and
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents: 10379
diff changeset
   395
 * Allegro can only be initiated once. */
10381
c043aa0c1695 (svn r14632) -Add: support Allegro as midi backend.
rubidium
parents: 10380
diff changeset
   396
int _allegro_instance_count = 0;
10380
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents: 10379
diff changeset
   397
10379
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   398
const char *VideoDriver_Allegro::Start(const char * const *parm)
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   399
{
10381
c043aa0c1695 (svn r14632) -Add: support Allegro as midi backend.
rubidium
parents: 10380
diff changeset
   400
	if (_allegro_instance_count == 0 && install_allegro(SYSTEM_AUTODETECT, &errno, NULL)) return NULL;
c043aa0c1695 (svn r14632) -Add: support Allegro as midi backend.
rubidium
parents: 10380
diff changeset
   401
	_allegro_instance_count++;
10379
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   402
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   403
	install_timer();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   404
	install_mouse();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   405
	install_keyboard();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   406
10390
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   407
#if defined _DEBUG
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   408
/* Allegro replaces SEGV/ABRT signals meaning that the debugger will never
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   409
 * be triggered, so rereplace the signals and make the debugger userful. */
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   410
	signal(SIGABRT, NULL);
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   411
	signal(SIGSEGV, NULL);
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   412
#endif
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   413
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   414
#if defined(DOS)
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   415
	/* Force DOS builds to ALWAYS use full screen as
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   416
	 * it can't do windowed. */
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   417
	_fullscreen = true;
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   418
#endif
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   419
0c2cc4c7b91f (svn r14641) -Change [Allegro]: when making a debug build revert Allegro's hooks on SIGSEGV/SIGABRT so one can actually use gdb.
rubidium
parents: 10385
diff changeset
   420
	GetVideoModes();
10379
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   421
	CreateMainSurface(_cur_resolution.width, _cur_resolution.height);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   422
	MarkWholeScreenDirty();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   423
	set_close_button_callback(HandleExitGameRequest);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   424
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   425
	return NULL;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   426
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   427
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   428
void VideoDriver_Allegro::Stop()
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   429
{
10381
c043aa0c1695 (svn r14632) -Add: support Allegro as midi backend.
rubidium
parents: 10380
diff changeset
   430
	if (--_allegro_instance_count == 0) allegro_exit();
10379
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   431
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   432
10385
4f9838649c7f (svn r14636) -Add: DOS port of OpenTTD, without network support though.
rubidium
parents: 10381
diff changeset
   433
#if defined(UNIX) || defined(__OS2__) || defined(PSP) || defined(DOS)
10379
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   434
# include <sys/time.h> /* gettimeofday */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   435
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   436
static uint32 GetTime()
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   437
{
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   438
	struct timeval tim;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   439
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   440
	gettimeofday(&tim, NULL);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   441
	return tim.tv_usec / 1000 + tim.tv_sec * 1000;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   442
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   443
#else
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   444
static uint32 GetTime()
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   445
{
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   446
	return GetTickCount();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   447
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   448
#endif
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   449
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   450
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   451
void VideoDriver_Allegro::MainLoop()
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   452
{
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   453
	uint32 cur_ticks = GetTime();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   454
	uint32 last_cur_ticks = cur_ticks;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   455
	uint32 next_tick = cur_ticks + 30;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   456
	uint32 pal_tick = 0;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   457
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   458
	for (;;) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   459
		uint32 prev_cur_ticks = cur_ticks; // to check for wrapping
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   460
		InteractiveRandom(); // randomness
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   461
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   462
		PollEvent();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   463
		if (_exit_game) return;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   464
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   465
#if defined(_DEBUG)
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   466
		if (_shift_pressed)
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   467
#else
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   468
		/* Speedup when pressing tab, except when using ALT+TAB
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   469
		 * to switch to another application */
10380
f4adb9648a93 (svn r14631) -Add: support for Allegro as sound backend.
rubidium
parents: 10379
diff changeset
   470
		if (key[KEY_TAB] && (key_shifts & KB_ALT_FLAG) == 0)
10379
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   471
#endif
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   472
		{
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   473
			if (!_networking && _game_mode != GM_MENU) _fast_forward |= 2;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   474
		} else if (_fast_forward & 2) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   475
			_fast_forward = 0;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   476
		}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   477
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   478
		cur_ticks = GetTime();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   479
		if (cur_ticks >= next_tick || (_fast_forward && !_pause_game) || cur_ticks < prev_cur_ticks) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   480
			_realtime_tick += cur_ticks - last_cur_ticks;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   481
			last_cur_ticks = cur_ticks;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   482
			next_tick = cur_ticks + 30;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   483
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   484
			bool old_ctrl_pressed = _ctrl_pressed;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   485
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   486
			_ctrl_pressed  = !!(key_shifts & KB_CTRL_FLAG);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   487
			_shift_pressed = !!(key_shifts & KB_SHIFT_FLAG);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   488
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   489
			/* determine which directional keys are down */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   490
			_dirkeys =
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   491
				(key[KEY_LEFT]  ? 1 : 0) |
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   492
				(key[KEY_UP]    ? 2 : 0) |
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   493
				(key[KEY_RIGHT] ? 4 : 0) |
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   494
				(key[KEY_DOWN]  ? 8 : 0);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   495
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   496
			if (old_ctrl_pressed != _ctrl_pressed) HandleCtrlChanged();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   497
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   498
			GameLoop();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   499
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   500
			_screen.dst_ptr = _allegro_screen->line[0];
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   501
			UpdateWindows();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   502
			if (++pal_tick > 4) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   503
				CheckPaletteAnim();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   504
				pal_tick = 1;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   505
			}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   506
			DrawSurfaceToScreen();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   507
		} else {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   508
			CSleep(1);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   509
			_screen.dst_ptr = _allegro_screen->line[0];
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   510
			NetworkDrawChatMessage();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   511
			DrawMouseCursor();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   512
			DrawSurfaceToScreen();
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   513
		}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   514
	}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   515
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   516
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   517
bool VideoDriver_Allegro::ChangeResolution(int w, int h)
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   518
{
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   519
	return CreateMainSurface(w, h);
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   520
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   521
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   522
bool VideoDriver_Allegro::ToggleFullscreen(bool fullscreen)
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   523
{
10385
4f9838649c7f (svn r14636) -Add: DOS port of OpenTTD, without network support though.
rubidium
parents: 10381
diff changeset
   524
#ifdef DOS
4f9838649c7f (svn r14636) -Add: DOS port of OpenTTD, without network support though.
rubidium
parents: 10381
diff changeset
   525
	return false;
4f9838649c7f (svn r14636) -Add: DOS port of OpenTTD, without network support though.
rubidium
parents: 10381
diff changeset
   526
#else
10379
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   527
	_fullscreen = fullscreen;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   528
	GetVideoModes(); // get the list of available video modes
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   529
	if (_num_resolutions == 0 || !this->ChangeResolution(_cur_resolution.width, _cur_resolution.height)) {
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   530
		/* switching resolution failed, put back full_screen to original status */
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   531
		_fullscreen ^= true;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   532
		return false;
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   533
	}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   534
	return true;
10385
4f9838649c7f (svn r14636) -Add: DOS port of OpenTTD, without network support though.
rubidium
parents: 10381
diff changeset
   535
#endif
10379
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   536
}
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   537
dd9d0aade65e (svn r14630) -Add: support Allegro as video backend.
rubidium
parents:
diff changeset
   538
#endif /* WITH_ALLEGRO */