X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsystem.c;h=c071fee890f37242231dc8c7bbcaaadfe2da8dc7;hb=14089dac2cbe56e563863e1e5adb8847944fd262;hp=5c0b4fbe9aeb81e1602c6bf6bed9efa6ced49d6f;hpb=463778af29aada177d4a00c566653b92be3b507a;p=rocksndiamonds.git diff --git a/src/libgame/system.c b/src/libgame/system.c index 5c0b4fbe..c071fee8 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -36,6 +36,7 @@ struct OptionInfo options; struct VideoSystemInfo video; struct AudioSystemInfo audio; struct GfxInfo gfx; +struct FontInfo font; struct ArtworkInfo artwork; struct JoystickInfo joystick; struct SetupInfo setup; @@ -185,6 +186,11 @@ void SetDrawDeactivationMask(int draw_deactivation_mask) gfx.draw_deactivation_mask = draw_deactivation_mask; } +void SetBackgroundBitmap(Bitmap *background_bitmap) +{ + gfx.background_bitmap = background_bitmap; +} + /* ========================================================================= */ /* video functions */ @@ -357,8 +363,10 @@ inline boolean DrawingDeactivated(int x, int y, int width, int height) { if (gfx.draw_deactivation_mask != REDRAW_NONE) { - if ((gfx.draw_deactivation_mask & REDRAW_FIELD) && - x < gfx.sx + gfx.sxsize) + if (gfx.draw_deactivation_mask & REDRAW_ALL) + return TRUE; + else if ((gfx.draw_deactivation_mask & REDRAW_FIELD) && + x < gfx.sx + gfx.sxsize) return TRUE; else if ((gfx.draw_deactivation_mask & REDRAW_DOORS) && x > gfx.dx) @@ -375,6 +383,11 @@ inline boolean DrawingDeactivated(int x, int y, int width, int height) return FALSE; } +inline boolean DrawingOnBackground(int x, int y) +{ + return (gfx.background_bitmap != NULL && x < gfx.sx + gfx.sxsize); +} + inline void BlitBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap, int src_x, int src_y, int width, int height, @@ -404,6 +417,16 @@ inline void ClearRectangle(Bitmap *bitmap, int x, int y, int width, int height) #endif } +inline void ClearRectangleOnBackground(Bitmap *bitmap, int x, int y, + int width, int height) +{ + if (!DrawingOnBackground(x, y)) + ClearRectangle(bitmap, x, y, width, height); + else + BlitBitmap(gfx.background_bitmap, bitmap, + x - gfx.real_sx, y - gfx.real_sy, width, height, x, y); +} + #if 0 #ifndef TARGET_SDL static GC last_clip_gc = 0; /* needed for XCopyArea() through clip mask */ @@ -455,6 +478,29 @@ inline void BlitBitmapMasked(Bitmap *src_bitmap, Bitmap *dst_bitmap, #endif } +inline void BlitBitmapOnBackground(Bitmap *src_bitmap, Bitmap *dst_bitmap, + int src_x, int src_y, + int width, int height, + int dst_x, int dst_y) +{ + if (!DrawingOnBackground(src_x, src_y)) + BlitBitmap(src_bitmap, dst_bitmap, src_x, src_y, width, height, + dst_x, dst_y); + else + { + /* draw background */ + BlitBitmap(gfx.background_bitmap, dst_bitmap, + dst_x - gfx.real_sx, dst_y - gfx.real_sy, width, height, + dst_x, dst_y); + + /* draw foreground */ + SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc, + dst_x - src_x, dst_y - src_y); + BlitBitmapMasked(src_bitmap, dst_bitmap, src_x, src_y, width, height, + dst_x, dst_y); + } +} + inline void DrawSimpleWhiteLine(Bitmap *bitmap, int from_x, int from_y, int to_x, int to_y) { @@ -721,7 +767,8 @@ void ReloadCustomImage(Bitmap *bitmap, char *basename) if (bitmap->width != new_bitmap->width || bitmap->height != new_bitmap->height) { - Error(ERR_WARN, "ReloadCustomImage: new image has wrong dimensions"); + Error(ERR_WARN, "ReloadCustomImage: new image '%s' has wrong dimensions", + filename); FreeBitmap(new_bitmap); return; }