X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsystem.c;h=45fb77c1e86471cc7861b27ec3af6ab88b045770;hb=de8b3ae622eae10f1caf96872fb1790f7bd9644b;hp=0e0bb333e4afa28af362af8ddcf671e81fa53134;hpb=b8114966908299df586165e00446f21c2ce343bb;p=rocksndiamonds.git diff --git a/src/libgame/system.c b/src/libgame/system.c index 0e0bb333..45fb77c1 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -70,7 +70,7 @@ void InitProgramInfo(char *argv0, char *userdata_directory, char *program_title, char *window_title, char *icon_title, char *x11_icon_filename, char *x11_iconmask_filename, - char *msdos_pointer_filename, + char *msdos_cursor_filename, char *cookie_prefix, char *filename_prefix, int program_version) { @@ -83,7 +83,7 @@ void InitProgramInfo(char *argv0, program.icon_title = icon_title; program.x11_icon_filename = x11_icon_filename; program.x11_iconmask_filename = x11_iconmask_filename; - program.msdos_pointer_filename = msdos_pointer_filename; + program.msdos_cursor_filename = msdos_cursor_filename; program.cookie_prefix = cookie_prefix; program.filename_prefix = filename_prefix; @@ -275,7 +275,7 @@ inline static int GetRealDepth(int depth) inline static void sysFillRectangle(Bitmap *bitmap, int x, int y, int width, int height, Pixel color) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SDLFillRectangle(bitmap, x, y, width, height, color); #else X11FillRectangle(bitmap, x, y, width, height, color); @@ -286,12 +286,12 @@ inline static void sysCopyArea(Bitmap *src_bitmap, Bitmap *dst_bitmap, int src_x, int src_y, int width, int height, int dst_x, int dst_y, int mask_mode) { -#ifdef TARGET_SDL - SDLCopyArea(src_bitmap, dst_bitmap, - src_x, src_y, width, height, dst_x, dst_y, mask_mode); +#if defined(TARGET_SDL) + SDLCopyArea(src_bitmap, dst_bitmap, src_x, src_y, width, height, + dst_x, dst_y, mask_mode); #else - X11CopyArea(src_bitmap, dst_bitmap, - src_x, src_y, width, height, dst_x, dst_y, mask_mode); + X11CopyArea(src_bitmap, dst_bitmap, src_x, src_y, width, height, + dst_x, dst_y, mask_mode); #endif } @@ -326,7 +326,7 @@ inline void InitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window, video.fullscreen_available = FULLSCREEN_STATUS; video.fullscreen_enabled = FALSE; -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SDLInitVideoBuffer(backbuffer, window, fullscreen); #else X11InitVideoBuffer(backbuffer, window); @@ -335,7 +335,7 @@ inline void InitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window, inline Bitmap *CreateBitmapStruct(void) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) return checked_calloc(sizeof(struct SDLSurfaceInfo)); #else return checked_calloc(sizeof(struct X11DrawableInfo)); @@ -347,7 +347,7 @@ inline Bitmap *CreateBitmap(int width, int height, int depth) Bitmap *new_bitmap = CreateBitmapStruct(); int real_depth = GetRealDepth(depth); -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SDLCreateBitmapContent(new_bitmap, width, height, real_depth); #else X11CreateBitmapContent(new_bitmap, width, height, real_depth); @@ -364,7 +364,7 @@ inline static void FreeBitmapPointers(Bitmap *bitmap) if (bitmap == NULL) return; -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SDLFreeBitmapPointers(bitmap); #else X11FreeBitmapPointers(bitmap); @@ -398,7 +398,7 @@ inline void FreeBitmap(Bitmap *bitmap) inline void CloseWindow(DrawWindow *window) { -#ifdef TARGET_X11 +#if defined(TARGET_X11) if (window->drawable) { XUnmapWindow(display, window->drawable); @@ -483,7 +483,7 @@ static GC last_clip_gc = 0; /* needed for XCopyArea() through clip mask */ inline void SetClipMask(Bitmap *bitmap, GC clip_gc, Pixmap clip_pixmap) { -#ifdef TARGET_X11 +#if defined(TARGET_X11) if (clip_gc) { bitmap->clip_gc = clip_gc; @@ -497,7 +497,7 @@ inline void SetClipMask(Bitmap *bitmap, GC clip_gc, Pixmap clip_pixmap) inline void SetClipOrigin(Bitmap *bitmap, GC clip_gc, int clip_x, int clip_y) { -#ifdef TARGET_X11 +#if defined(TARGET_X11) if (clip_gc) { bitmap->clip_gc = clip_gc; @@ -546,7 +546,7 @@ inline void BlitBitmapOnBackground(Bitmap *src_bitmap, Bitmap *dst_bitmap, inline void DrawSimpleWhiteLine(Bitmap *bitmap, int from_x, int from_y, int to_x, int to_y) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SDLDrawSimpleLine(bitmap, from_x, from_y, to_x, to_y, WHITE_PIXEL); #else X11DrawSimpleLine(bitmap, from_x, from_y, to_x, to_y, WHITE_PIXEL); @@ -607,6 +607,10 @@ inline void DrawLines(Bitmap *bitmap, struct XY *points, int num_points, inline Pixel GetPixel(Bitmap *bitmap, int x, int y) { + if (x < 0 || x >= bitmap->width || + y < 0 || y >= bitmap->height) + return BLACK_PIXEL; + #if defined(TARGET_SDL) return SDLGetPixel(bitmap, x, y); #elif defined(TARGET_ALLEGRO) @@ -655,7 +659,7 @@ inline void SyncDisplay(void) inline void KeyboardAutoRepeatOn(void) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY / 2, SDL_DEFAULT_REPEAT_INTERVAL / 2); SDL_EnableUNICODE(1); @@ -667,7 +671,7 @@ inline void KeyboardAutoRepeatOn(void) inline void KeyboardAutoRepeatOff(void) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL); SDL_EnableUNICODE(0); #else @@ -678,7 +682,7 @@ inline void KeyboardAutoRepeatOff(void) inline boolean PointerInWindow(DrawWindow *window) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) return TRUE; #else Window root, child; @@ -695,7 +699,7 @@ inline boolean PointerInWindow(DrawWindow *window) inline boolean SetVideoMode(boolean fullscreen) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) return SDLSetVideoMode(&backbuffer, fullscreen); #else boolean success = TRUE; @@ -716,7 +720,7 @@ inline boolean SetVideoMode(boolean fullscreen) inline boolean ChangeVideoModeIfNeeded(boolean fullscreen) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) if ((fullscreen && !video.fullscreen_enabled && video.fullscreen_available)|| (!fullscreen && video.fullscreen_enabled)) fullscreen = SetVideoMode(fullscreen); @@ -833,7 +837,7 @@ void CreateBitmapWithSmallBitmaps(Bitmap *src_bitmap) FreeBitmap(tmp_bitmap_2); FreeBitmap(tmp_bitmap_8); -#ifdef TARGET_SDL +#if defined(TARGET_SDL) src_bitmap->surface = tmp_bitmap->surface; tmp_bitmap->surface = NULL; #else @@ -847,6 +851,119 @@ void CreateBitmapWithSmallBitmaps(Bitmap *src_bitmap) } +/* ------------------------------------------------------------------------- */ +/* mouse pointer functions */ +/* ------------------------------------------------------------------------- */ + +/* cursor bitmap in XPM format */ +static const char *cursor_image_playfield[] = +{ + /* width height num_colors chars_per_pixel */ + " 32 32 3 1", + + /* colors */ + "X c #000000", + ". c #ffffff", + " c None", + + " X ", + "X.X ", + " X ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "1,1" +}; + +static struct MouseCursorInfo *get_cursor_from_image(const char **image) +{ + struct MouseCursorInfo *cursor; + int row, col, i; + + cursor = checked_calloc(sizeof(struct MouseCursorInfo)); + + i = -1; + for (row=0; row<32; ++row) + { + for (col=0; col<32; ++col) + { + if (col % 8) + { + cursor->data[i] <<= 1; + cursor->mask[i] <<= 1; + } + else + { + i++; + cursor->data[i] = cursor->mask[i] = 0; + } + + switch (image[4+row][col]) + { + case 'X': + cursor->data[i] |= 0x01; + cursor->mask[i] |= 0x01; + break; + + case '.': + cursor->mask[i] |= 0x01; + break; + + case ' ': + break; + } + } + } + + sscanf(image[4+row], "%d,%d", &cursor->hot_x, &cursor->hot_y); + + cursor->width = 32; + cursor->height = 32; + + return cursor; +} + +void SetMouseCursor(int mode) +{ + struct MouseCursorInfo *cursor_playfield = NULL; + + if (cursor_playfield == NULL) + cursor_playfield = get_cursor_from_image(cursor_image_playfield); + +#if defined(TARGET_SDL) + SDLSetMouseCursor(mode == CURSOR_PLAYFIELD ? cursor_playfield : NULL); +#elif defined(TARGET_X11_NATIVE) + X11SetMouseCursor(mode == CURSOR_PLAYFIELD ? cursor_playfield : NULL); +#endif +} + + /* ========================================================================= */ /* audio functions */ /* ========================================================================= */ @@ -907,7 +1024,7 @@ inline void SetAudioMode(boolean enabled) inline void InitEventFilter(EventFilter filter_function) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) /* set event filter to filter out certain events */ SDL_SetEventFilter(filter_function); #endif @@ -915,7 +1032,7 @@ inline void InitEventFilter(EventFilter filter_function) inline boolean PendingEvent(void) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) return (SDL_PollEvent(NULL) ? TRUE : FALSE); #else return (XPending(display) ? TRUE : FALSE); @@ -924,7 +1041,7 @@ inline boolean PendingEvent(void) inline void NextEvent(Event *event) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SDLNextEvent(event); #else XNextEvent(display, event); @@ -933,7 +1050,7 @@ inline void NextEvent(Event *event) inline Key GetEventKey(KeyEvent *event, boolean with_modifiers) { -#ifdef TARGET_SDL +#if defined(TARGET_SDL) #if 0 printf("unicode == '%d', sym == '%d', mod == '0x%04x'\n", (int)event->keysym.unicode, @@ -986,7 +1103,7 @@ inline void InitJoysticks() { int i; -#ifdef NO_JOYSTICK +#if defined(NO_JOYSTICK) return; /* joysticks generally deactivated by compile-time directive */ #endif