summaryrefslogtreecommitdiff
path: root/gfx.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx.h')
-rw-r--r--gfx.h314
1 files changed, 314 insertions, 0 deletions
diff --git a/gfx.h b/gfx.h
new file mode 100644
index 0000000..7194a3c
--- /dev/null
+++ b/gfx.h
@@ -0,0 +1,314 @@
+/*
+
+ viDOOM - level editor for DOOM
+
+ Copyright (C) 2000 Ian Cowburn (ianc@noddybox.demon.co.uk)
+
+ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ -------------------------------------------------------------------------
+
+ Provides a skin of graphics and input functions (in case of future
+ ports).
+
+ Assumes these features:
+
+ - A true, or hicolor, display
+ - A Fixed font
+ - Default origin is in the top left of the display, with X positve
+ along and Y positive down
+ - A buffered display. The screen contents should not change until
+ GFX_redraw() is called. If not honoured viDOOM should still work up
+ to a point, but it's use of the XOR mode may not be apparent to the
+ user.
+
+ $Id$
+
+*/
+#ifndef _GFX_H
+
+#define _GFX_H
+
+/* Opaque type to define a bitmap object and the public creator type, along
+ with the picklist data providers. Note that the bitmap object is assumed
+ to have a maximum of 256 unique colours.
+*/
+typedef void *GFX_IMAGE;
+
+#define MAX_GFXBM_W 256
+#define MAX_GFXBM_H 256
+
+typedef struct
+ {
+ int w; /* Width */
+ int h; /* Height */
+ int pal[256]; /* Palette */
+ unsigned char *data; /* Accessed as data+(x)+(y)*(width) */
+ } GFX_BITMAP;
+
+/* Key press structure
+*/
+typedef struct
+ {
+ int type; /* Event type (for GFX_await_input()) */
+ int shift; /* Is shift pressed? */
+ int ctrl; /* Is control pressed? */
+ int alt; /* Is ALT pressed? */
+ char ascii; /* ASCII code for the char. If zero ... */
+ int code; /* ... this holds a special code defined below */
+ } GFXKey;
+
+
+/* Special non-ASCII keys that can be returned
+*/
+#define GFX_ASCII 0 /* Not a special key - just ASCII */
+
+#define GFX_F1 1001
+#define GFX_F2 1002
+#define GFX_F3 1003
+#define GFX_F4 1004
+#define GFX_F5 1005
+#define GFX_F6 1006
+#define GFX_F7 1007
+#define GFX_F8 1008
+#define GFX_F9 1009
+#define GFX_F10 1010
+#define GFX_F11 1011
+#define GFX_F12 1012
+
+#define GFX_ESC 1021
+#define GFX_INSERT 1022
+#define GFX_HOME 1023
+#define GFX_PGUP 1024
+#define GFX_DELETE 1025
+#define GFX_END 1026
+#define GFX_PGDN 1027
+
+#define GFX_UP 1028
+#define GFX_DOWN 1029
+#define GFX_LEFT 1030
+#define GFX_RIGHT 1031
+
+#define GFX_ENTER 1032
+#define GFX_BACKSPACE 1033
+#define GFX_TAB 1034
+
+
+/* Mouse buttons
+*/
+#define GFX_BUTLEFT 0x01
+#define GFX_BUTRIGHT 0x02
+#define GFX_BUTMIDDLE 0x04
+
+
+/* Event structs for GFX_await_input().
+*/
+#define GFX_KEY_EVENT 1 /* Key pressed */
+#define GFX_MOUSE_EVENT 2 /* Mouse button pressed or mouse moved */
+
+typedef struct GFXMouse
+ {
+ int type; /* Event type (for GFX_await_input()) */
+ int shift; /* Is shift pressed? */
+ int ctrl; /* Is control pressed? */
+ int alt; /* Is ALT pressed? */
+ int x; /* Mouse X co-ord */
+ int y; /* Mouse X co-ord */
+ int b; /* Mouse button mask */
+ } GFXMouse;
+
+typedef union GFXEvent
+ {
+ int type;
+ GFXKey key;
+ GFXMouse mouse;
+ } GFXEvent;
+
+
+
+/* Assume an intensity of 0-255 for each RGB component. The library assumes
+ that colours are represented as an RGB triplet in that order.
+*/
+#define V_RGB(r,g,b) ((r)<<16|(g)<<8|(b))
+
+#define BLACK 0x000000
+#define WHITE 0xffffff
+#define RED 0xff0000
+#define GREEN 0x00ff00
+#define BLUE 0x0000ff
+#define GREY(l) V_RGB(l,l,l)
+
+/* Initialise graphics. This is pretty much called the first thing called.
+ After calling this it must be that the following functions at least are
+ operational:
+
+ GFX_close()
+ GFX_open()
+ GFX_exit()
+ GFX_create_image()
+
+ The platform GFX driver can assume no drawing primitives are called till
+ the screen is opended.
+
+*/
+void GFX_init(void);
+
+
+/* Closedown for clean, non-error exits. See GFX_exit() for error exits
+*/
+void GFX_close(void);
+
+
+/* Create a GFX_IMAGE for the passed GFX_BITMAP. Returns NULL on failure.
+*/
+GFX_IMAGE GFX_create_image(GFX_BITMAP *bm);
+
+/* Destory a bitmap
+*/
+void GFX_destroy_image(GFX_IMAGE img);
+
+/* Draw an image
+*/
+void GFX_draw_image(GFX_IMAGE i,int x,int y);
+
+
+/* Fill the screen with an image. Not really crucial as it's just used for
+ the splash screen. If it cannot be honoured properly just drawing the
+ GFX_IMAGE centred in the screen should be adequate
+*/
+void GFX_fill_screen(GFX_IMAGE i);
+
+
+/* Open a screen/window/whatever. Expected to be true colour, or an
+ approximation of. Should exit cleanly on failure.
+*/
+void GFX_open(int width, int height);
+
+
+/* Clear the screen to a colour
+*/
+void GFX_clear(int col);
+
+
+/* It is assumed by viDOOM that what has been drawn will NOT appear on screen
+ till this is called.
+*/
+void GFX_redraw(void);
+
+
+/* Draw a line
+*/
+void GFX_line(int x1, int y1, int x2, int y2, int col);
+
+
+/* Plot a point
+*/
+void GFX_plot(int x, int y, int col);
+
+
+/* Draw a circle (and filled version)
+*/
+void GFX_circle(int x, int y, int radius, int col);
+void GFX_fcircle(int x, int y, int radius, int col);
+
+
+/* Draw a rectangle (and filled version). Note that zero and negative width
+ and heights must be allowed.
+*/
+void GFX_rect(int x, int y, int w, int h, int col);
+void GFX_frect(int x, int y, int w, int h, int col);
+
+
+/* Sets and clears XOR mode (used for rubber bands, etc).
+*/
+void GFX_set_XOR_mode(void);
+void GFX_clear_XOR_mode(void);
+
+
+/* printf() text at x,y. The baseline is assumed to be the top left corner of
+ the box enclosing the text and text is assumed to be transparent
+*/
+void GFX_print(int x, int y, int col, char *fmt, ...);
+
+
+/* Return the dimension of the (fixed width!) font used for printing
+*/
+int GFX_fh(void);
+int GFX_fw(void);
+
+
+/* Return the number of mouse buttons. Should be at least 2.
+*/
+int GFX_mouse_buttons(void);
+
+
+/* Sample the current state of the mouse. Return is the button mask. If X or
+ Y is NULL that position is not returned.
+*/
+int GFX_mouse(int *x, int *y);
+
+
+/* Wait for a key to be pressed. key can be NULL if you're not interested in
+ the key.
+*/
+void GFX_waitkey(GFXKey *key);
+
+
+/* Check for a key to be pressed. Returns TRUE or FALSE accordingly and sets
+ the GFXKey struct up.
+*/
+int GFX_key(GFXKey *key);
+
+
+/* If this platform is not event driven, this call should wait kill all keys
+ and mouse buttons have been released. On event driven ones this may clear
+ any outstanding input events.
+*/
+void GFX_bounce(void);
+
+
+/* Await for any sort of input from the keyboard or mouse buttons. This is
+ included in the platform specific so that event driven environs (eg. X11)
+ can work naturally, while non-event driven environments (eg. DOS) can have
+ the busy polling loop here, rather than in the generic code.
+*/
+void GFX_await_input(GFXEvent *ev);
+
+
+/* This works like the above call, but returns mouse movement events (as a
+ GFX_MOUSE_EVENT) as well.
+*/
+void GFX_await_input_full(GFXEvent *ev);
+
+
+/* Tidy up the graphics (switch them off, release mem, etc), print the
+ supplied error message and then exit with the return code.
+*/
+void GFX_exit(int code,char *fmt,...);
+
+
+/* This interface _really_ does not have to do anything. It is just on the
+ development system so that grabs could be made for the docs.
+
+ If you feel the urge though this should save a snap shot of the current
+ screen in the passed file.
+*/
+void GFX_save_screen(char *path);
+
+
+#endif
+
+
+/* END OF FILE */