-/***********************************************************
-* Artsoft Retro-Game Library *
-*----------------------------------------------------------*
-* (c) 1995-2006 Artsoft Entertainment *
-* Holger Schemel *
-* Detmolder Strasse 189 *
-* 33604 Bielefeld *
-* Germany *
-* e-mail: info@artsoft.org *
-*----------------------------------------------------------*
-* toons.c *
-***********************************************************/
+// ============================================================================
+// Artsoft Retro-Game Library
+// ----------------------------------------------------------------------------
+// (c) 1995-2014 by Artsoft Entertainment
+// Holger Schemel
+// info@artsoft.org
+// http://www.artsoft.org/
+// ----------------------------------------------------------------------------
+// toons.c
+// ============================================================================
#include "toons.h"
#include "misc.h"
screen_info.frame_delay_value = frame_delay_value;
}
-void DrawAnim(Bitmap *toon_bitmap, GC toon_clip_gc,
- int src_x, int src_y, int width, int height,
+void DrawAnim(Bitmap *toon_bitmap, int src_x, int src_y, int width, int height,
int dest_x, int dest_y, int pad_x, int pad_y)
{
int pad_dest_x = dest_x - pad_x;
int pad_dest_y = dest_y - pad_y;
int pad_width = width + 2 * pad_x;
int pad_height = height + 2 * pad_y;
-#if 1
int buffer_x = 0;
int buffer_y = 0;
-#else
- int buffer_x = DOOR_GFX_PAGEX3;
- int buffer_y = DOOR_GFX_PAGEY1;
-#endif
-
-#if 0
- printf("::: (%d, %d), (%d, %d), (%d, %d), (%d, %d) -> (%d, %d), (%d, %d), (%d, %d)\n",
- src_x, src_y,
- width, height,
- dest_x, dest_y,
- pad_x, pad_y,
-
- pad_dest_x, pad_dest_y,
- pad_width, pad_height,
- buffer_x, buffer_y);
-#endif
-
- if (width == 0 || height == 0)
- return;
/* correct values to avoid off-screen blitting (start position) */
if (pad_dest_x < screen_info.startx)
/* special method to avoid flickering interference with BackToFront() */
BlitBitmap(backbuffer, screen_info.save_buffer, pad_dest_x, pad_dest_y,
pad_width, pad_height, buffer_x, buffer_y);
- SetClipOrigin(toon_bitmap, toon_clip_gc, dest_x - src_x, dest_y - src_y);
BlitBitmapMasked(toon_bitmap, backbuffer, src_x, src_y, width, height,
dest_x, dest_y);
BlitBitmap(backbuffer, window, pad_dest_x, pad_dest_y, pad_width, pad_height,
BlitBitmap(screen_info.save_buffer, backbuffer, buffer_x, buffer_y,
pad_width, pad_height, pad_dest_x, pad_dest_y);
- FlushDisplay();
+ /* prevent immediate redraw of restored toon area in backbuffer */
+ redraw_mask = REDRAW_NONE;
}
boolean AnimateToon(int toon_nr, boolean restart)
{
- static unsigned long animation_frame_counter = 0;
+ static unsigned int animation_frame_counter = 0;
static int pos_x = 0, pos_y = 0;
static int delta_x = 0, delta_y = 0;
static int frame = 0;
static boolean horiz_move, vert_move;
- static unsigned long anim_delay = 0;
- static unsigned long anim_delay_value = 0;
+ static unsigned int anim_delay = 0;
+ static unsigned int anim_delay_value = 0;
static int width,height;
static int pad_x,pad_y;
static int cut_x,cut_y;
static int dest_x, dest_y;
struct ToonInfo *anim = &screen_info.toons[toon_nr];
Bitmap *anim_bitmap = screen_info.toons[toon_nr].bitmap;
- GC anim_clip_gc = anim_bitmap->stored_clip_gc;
int direction = get_toon_direction(anim->direction);
if (restart)
if (!DelayReached(&anim_delay, anim_delay_value))
{
if (screen_info.redraw_needed_function() && !restart)
- DrawAnim(anim_bitmap, anim_clip_gc,
+ DrawAnim(anim_bitmap,
src_x + cut_x, src_y + cut_y,
width, height,
screen_info.startx + dest_x,
else if (pos_y > screen_info.height - anim->height)
height -= (pos_y - (screen_info.height - anim->height));
- DrawAnim(anim_bitmap, anim_clip_gc,
+ DrawAnim(anim_bitmap,
src_x + cut_x, src_y + cut_y,
width, height,
screen_info.startx + dest_x,
void HandleAnimation(int mode)
{
- static unsigned long animstart_delay = -1;
- static unsigned long animstart_delay_value = 0;
+ static unsigned int animstart_delay = -1;
+ static unsigned int animstart_delay_value = 0;
static boolean anim_running = FALSE;
static boolean anim_restart = TRUE;
static boolean reset_delay = TRUE;
case ANIM_STOP:
if (anim_running)
{
-#if 1
- redraw_mask |= (REDRAW_FIELD | REDRAW_FROM_BACKBUFFER);
+ redraw_mask |= REDRAW_FIELD;
screen_info.update_function();
-#endif
anim_running = FALSE;
}