📄 ui_dos.c
字号:
/* * XaoS, a fast portable realtime fractal zoomer * Copyright (C) 1996,1997 by * * Jan Hubicka (hubicka@paru.cas.cz) * Thomas Marsh (tmarsh@austin.ibm.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include "aconfig.h"#ifdef DOG_DRIVER#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <signal.h>#include <allegro.h>#include <string.h>#include <config.h>#include <xio.h>#include <ui.h>#include <timers.h>static int width = 640, height = 480, depth = 8;struct ui_driver dog_driver;static int currentbuff = 0;static BITMAP *buffers[2], *mouseb;static int white;static PALETTE palette;static BITMAP *mouse_pointer;static int mouse;static int bill;static unsigned char mouse_pointer_data[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,};voidmkwaitsprite (void){ int i, col; mouse_pointer = create_bitmap (16, 16); for (i = 0; i < 256; i++) { if (bitmap_color_depth (mouse_pointer) == 8) { switch (mouse_pointer_data[i]) { case 1: mouse_pointer->line[i / 16][i & 15] = 3; break; case 2: mouse_pointer->line[i / 16][i & 15] = 1; break; default: mouse_pointer->line[i / 16][i & 15] = 0; break; } } else { switch (mouse_pointer_data[i]) { case 1: col = makecol (255, 255, 255); break; case 2: col = makecol (0, 0, 0); break; default: col = mouse_pointer->vtable->mask_color; break; } putpixel (mouse_pointer, i & 15, i / 16, col); } }}/*make startup faster and executable size smaller */int _stklen = 81920;/*int _crt0_startup_flags = _CRT0_FLAG_LOCK_MEMORY; */void__crt0_load_environment_file (char *_app_name){ return;}/* void __crt0_setup_arguments(void) { return; } */char **__crt0_glob_function (char *_arg){ return 0;}static voiddog_print (int x, int y, CONST char *text){ if (mouse) show_mouse (NULL); text_mode (0); textout (screen, font, text, x, y, white); if (mouse) show_mouse (mouseb);}static voiddog_display (){ if (mouse) show_mouse (NULL); blit (buffers[currentbuff], screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H); if (mouse) show_mouse (mouseb);}voidset_gui_colors (){ static RGB black = { 0, 0, 0 }; static RGB grey = { 48, 48, 48 }; static RGB white = { 63, 63, 63 }; set_color (0, &black); set_color (16, &black); set_color (1, &grey); set_color (255, &white); gui_fg_color = 0; gui_bg_color = 1;}static voiddog_set_color (ui_palette c, int start, int end){ int i; for (i = start; i < end; i++) { palette[i].r = c[i - start][0] / 4; palette[i].g = c[i - start][1] / 4; palette[i].b = c[i - start][2] / 4; } set_palette (palette);}static voidfix_palette (){ int i; for (i = 0; i < 2; i++) { palette[i].r = 0; palette[i].g = 0; palette[i].b = 0; set_color (i, &palette[i]); } palette[255].r = 63; palette[255].g = 63; palette[255].b = 63; set_color (255, &palette[255]); set_palette (palette);}static voiddog_flip_buffers (){ currentbuff ^= 1;}static voiddog_get_size (int *wi, int *he){ static int w = 320, c = GFX_AUTODETECT, h = 200; int vh; if (mouse) show_mouse (NULL);again: set_color_depth (8); set_gfx_mode (GFX_VGA, 320, 200, 0, 0); if ((!keypressed ()) && (!joy_b1) && (!joy_b2)) { rest (500); } clear (screen); set_gui_colors (); if (!gfx_mode_select_ex (&c, &w, &h, &depth)) { goto again; } vh = h; set_color_depth (depth); if (set_gfx_mode (c, w, h, 0, 0) != 0) { goto again; } width = SCREEN_W; height = SCREEN_H; switch (depth) { case 8: dog_driver.imagetype = UI_C256, white = 255; white = 1; break; case 15: dog_driver.imagetype = UI_TRUECOLOR16, white = 0xffff; dog_driver.rmask = 31 * 32 * 32; dog_driver.gmask = 31 * 32; dog_driver.bmask = 31; break; case 16: dog_driver.imagetype = UI_TRUECOLOR16, white = 0xffff; dog_driver.rmask = 31 * 64 * 32; dog_driver.gmask = 63 * 32; dog_driver.bmask = 31; break; case 24: dog_driver.imagetype = UI_TRUECOLOR24, white = 0xffffff; dog_driver.rmask = 0xff0000; dog_driver.gmask = 0x00ff00; dog_driver.bmask = 0x0000ff; break; case 32: dog_driver.imagetype = UI_TRUECOLOR, white = 0xffffff; dog_driver.rmask = 0xff0000; dog_driver.gmask = 0x00ff00; dog_driver.bmask = 0x0000ff; break; } clear (screen); if (mouse) { mkwaitsprite (); show_mouse (screen); } if (depth == 8) fix_palette (); *wi = w; *he = h;}static voiddog_uninitialise (){ text_mode (0); tl_allegromode (0); allegro_exit (); install_keyboard (); allegro_exit ();}voiddog_free (char *b1, char *b2){ destroy_bitmap (buffers[0]); destroy_bitmap (buffers[1]);}intdog_alloc (char **b1, char **b2){ buffers[0] = create_bitmap (SCREEN_W, SCREEN_H); if (buffers[0] == NULL) return 0; buffers[1] = create_bitmap (SCREEN_W, SCREEN_H); if (buffers[1] == NULL) return 0; currentbuff = 0; *b1 = buffers[0]->line[0]; *b2 = buffers[1]->line[0]; return width * ((depth + 1) / 8);}static voiddog_processevents (int wait, int *x, int *y, int *b, int *k){ *x = mouse_x; *y = mouse_y; *b = 0; while (keypressed ()) { unsigned int c = readkey (); switch (c >> 8) { case KEY_UP: c = ui_key (UIKEY_UP); break; case KEY_DOWN: c = ui_key (UIKEY_DOWN); break; case KEY_LEFT: c = ui_key (UIKEY_LEFT); break; case KEY_RIGHT: c = ui_key (UIKEY_RIGHT); break; case KEY_ESC: c = ui_key (UIKEY_ESC); break; case KEY_BACKSPACE: c = ui_key (UIKEY_BACKSPACE); break; case KEY_HOME: c = ui_key (UIKEY_HOME); break; case KEY_END: c = ui_key (UIKEY_END); break; case KEY_PGUP: c = ui_key (UIKEY_PGUP); break; case KEY_PGDN: c = ui_key (UIKEY_PGDOWN); break; default: c = ui_key ((unsigned char) c); } if (c == 2) return; } if (mouse_b & 1) *b |= BUTTON1; if (mouse_b & 2) *b |= BUTTON3; if (mouse_b & 4) *b |= BUTTON2; *k = (key[KEY_LEFT] != 0) + 2 * (key[KEY_RIGHT] != 0) + 4 * (key[KEY_UP] != 0) + 8 * (key[KEY_DOWN] != 0);}static voiddog_getmouse (int *x, int *y, int *b){ *x = mouse_x; *y = mouse_y; *b = 0; if (mouse_b == 1) *b |= BUTTON1; if (mouse_b == 2) *b |= BUTTON3; if (mouse_b & 4) *b |= BUTTON2;}intdog_init (){ if (bill) i_love_bill = 1; i_love_bill = 1; allegro_init (); tl_allegromode (1); install_keyboard (); mouse = (install_mouse () != -1); if (bill) i_love_bill = 1; install_timer (); mouseb = screen; set_gfx_mode (GFX_VGA, 320, 200, 0, 0); signal (SIGFPE, SIG_IGN); fix_palette (); return (1);}static CONST struct params params[] = { {"", P_HELP, NULL, "DOS driver options:"}, {"-i_love_bill", P_SWITCH, &bill, "Enable windows friendly mode"}, {NULL, 0, NULL, NULL}};voiddog_setmouse (int mode){ if (mouse) { show_mouse (NULL); if (mode == WAITMOUSE) set_mouse_sprite (mouse_pointer), set_mouse_sprite_focus (4, 6); else set_mouse_sprite (NULL), set_mouse_sprite_focus (0, 0); if (mode == REPLAYMOUSE) mouseb = NULL; else mouseb = screen; show_mouse (mouseb); }}struct ui_driver dog_driver = { "MS-DOG", dog_init, dog_get_size, dog_processevents, dog_getmouse, dog_uninitialise, NULL, dog_set_color, dog_print, dog_display, dog_alloc, dog_free, dog_flip_buffers, dog_setmouse, NULL, 8, 8, params, FULLSCREEN | UPDATE_AFTER_RESIZE | PALETTE_ROTATION | ROTATE_INSIDE_CALCULATION | RESIZE_COMMAND, 0.0, 0.0, 0, 0, UI_C256, 0, 256, 255};#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -