X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ftools.c;h=ad2b3b32619ad586e3118f4e279974f3f40ec23a;hp=49e927d3ef6704061fed6d1a490043cd184df677;hb=f7165d318c089b77d0a91a77afc44cb8866dc1cc;hpb=466733e5fd75e0d705bf80dddb48468c4c9885a7 diff --git a/src/tools.c b/src/tools.c index 49e927d3..ad2b3b32 100644 --- a/src/tools.c +++ b/src/tools.c @@ -292,7 +292,6 @@ void DrawMaskedBorder_Rect(int x, int y, int width, int height) { Bitmap *bitmap = graphic_info[IMG_GLOBAL_BORDER].bitmap; - SetClipOrigin(bitmap, bitmap->stored_clip_gc, 0, 0); BlitBitmapMasked(bitmap, backbuffer, x, y, width, height, x, y); } @@ -531,7 +530,7 @@ void BackToFront() this could mean that we have to wait for the graphics to complete, although we could go on doing calculations for the next frame */ - SyncDisplay(); + /* SyncDisplay(); */ /* never draw masked border to backbuffer when using playfield buffer */ if (game_status != GAME_MODE_PLAYING || @@ -664,8 +663,6 @@ void BackToFront() DrawTextExt(window, SX + SXSIZE + SX, 0, text, FONT_TEXT_2, BLIT_OPAQUE); } - FlushDisplay(); - for (x = 0; x < MAX_BUF_XSIZE; x++) for (y = 0; y < MAX_BUF_YSIZE; y++) redraw[x][y] = 0; @@ -1055,6 +1052,10 @@ void getSizedGraphicSourceExt(int graphic, int frame, int tilesize, int src_y = g->src_y + (get_backside ? g->offset2_y : 0); int tilesize_capped = MIN(MAX(1, tilesize), TILESIZE); + // if no in-game graphics defined, always use standard graphic size + if (g->bitmaps[IMG_BITMAP_GAME] == NULL) + tilesize = TILESIZE; + if (tilesize == gfx.standard_tile_size) src_bitmap = g->bitmaps[IMG_BITMAP_STANDARD]; else if (tilesize == game.tile_size) @@ -1249,9 +1250,6 @@ void DrawGraphicThruMaskExt(DrawBuffer *d, int dst_x, int dst_y, int graphic, getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); - SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc, - dst_x - src_x, dst_y - src_y); - BlitBitmapMasked(src_bitmap, d, src_x, src_y, TILEX_VAR, TILEY_VAR, dst_x, dst_y); } @@ -1259,14 +1257,14 @@ void DrawGraphicThruMaskExt(DrawBuffer *d, int dst_x, int dst_y, int graphic, void DrawFixedGraphicThruMaskExt(DrawBuffer *d, int dst_x, int dst_y, int graphic, int frame) { + struct GraphicInfo *g = &graphic_info[graphic]; Bitmap *src_bitmap; int src_x, src_y; getFixedGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); - SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc, - dst_x - src_x, dst_y - src_y); - BlitBitmapMasked(src_bitmap, d, src_x, src_y, TILEX, TILEY, dst_x, dst_y); + BlitBitmapMasked(src_bitmap, d, src_x, src_y, g->width, g->height, + dst_x, dst_y); } void DrawSizedGraphic(int x, int y, int graphic, int frame, int tilesize) @@ -1402,12 +1400,8 @@ inline static void DrawGraphicShiftedNormal(int x, int y, int dx, int dy, dst_y = FY + y * TILEY_VAR + dy; if (mask_mode == USE_MASKING) - { - SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc, - dst_x - src_x, dst_y - src_y); BlitBitmapMasked(src_bitmap, drawto_field, src_x, src_y, width, height, dst_x, dst_y); - } else BlitBitmap(src_bitmap, drawto_field, src_x, src_y, width, height, dst_x, dst_y); @@ -1453,12 +1447,8 @@ inline static void DrawGraphicShiftedDouble(int x, int y, int dx, int dy, dst_y = FY + y1 * TILEY_VAR; if (mask_mode == USE_MASKING) - { - SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc, - dst_x - src_x, dst_y - src_y); BlitBitmapMasked(src_bitmap, drawto_field, src_x, src_y, width, height, dst_x, dst_y); - } else BlitBitmap(src_bitmap, drawto_field, src_x, src_y, width, height, dst_x, dst_y); @@ -1475,12 +1465,8 @@ inline static void DrawGraphicShiftedDouble(int x, int y, int dx, int dy, dst_y = FY + y2 * TILEY_VAR; if (mask_mode == USE_MASKING) - { - SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc, - dst_x - src_x, dst_y - src_y); BlitBitmapMasked(src_bitmap, drawto_field, src_x, src_y, width, height, dst_x, dst_y); - } else BlitBitmap(src_bitmap, drawto_field, src_x, src_y, width, height, dst_x, dst_y); @@ -2094,12 +2080,8 @@ void DrawEnvelopeBackgroundTiles(int graphic, int startx, int starty, inner_sy + (y - 1) * tile_height % inner_height); if (draw_masked) - { - SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc, - dst_x - src_x, dst_y - src_y); BlitBitmapMasked(src_bitmap, drawto, src_x, src_y, tile_width, tile_height, dst_x, dst_y); - } else BlitBitmap(src_bitmap, drawto, src_x, src_y, tile_width, tile_height, dst_x, dst_y); @@ -4113,6 +4095,8 @@ unsigned int MoveDoor(unsigned int door_state) int max_move_delay = 0; // delay for complete animations of all doors int max_step_delay = 0; // delay (ms) between two animation frames int num_move_steps = 0; // number of animation steps for all doors + int max_move_delay_doors_only = 0; // delay for doors only (no panel) + int num_move_steps_doors_only = 0; // steps for doors only (no panel) int current_move_delay = 0; int start = 0; int k; @@ -4161,16 +4145,21 @@ unsigned int MoveDoor(unsigned int door_state) if (door_part_skip[nr]) continue; - if (!is_panel) - panel_has_doors[door_index] = TRUE; - max_move_delay = MAX(max_move_delay, move_delay); max_step_delay = (max_step_delay == 0 ? step_delay : euclid(max_step_delay, step_delay)); num_steps[nr] = move_steps; + + if (!is_panel) + { + max_move_delay_doors_only = MAX(max_move_delay_doors_only, move_delay); + + panel_has_doors[door_index] = TRUE; + } } num_move_steps = max_move_delay / max_step_delay; + num_move_steps_doors_only = max_move_delay_doors_only / max_step_delay; door_delay_value = max_step_delay; @@ -4203,6 +4192,7 @@ unsigned int MoveDoor(unsigned int door_state) int door_token = dpc->door_token; int door_index = DOOR_INDEX_FROM_TOKEN(door_token); boolean is_panel = DOOR_PART_IS_PANEL(nr); + boolean is_panel_and_door_has_closed = FALSE; struct Rect *door_rect = &door_rect_list[door_index]; Bitmap *bitmap_db_door = (door_token == DOOR_1 ? bitmap_db_door_1 : bitmap_db_door_2); @@ -4218,7 +4208,9 @@ unsigned int MoveDoor(unsigned int door_state) int step_factor = step_delay / max_step_delay; int k1 = (step_factor ? k / step_factor + 1 : k); int k2 = (part_opening ? k1 + start_step : num_steps[nr] - k1); - int kk = (k2 < 0 ? 0 : k2); + int kk = MAX(0, k2); + int g_src_x = 0; + int g_src_y = 0; int src_x, src_y, src_xx, src_yy; int dst_x, dst_y, dst_xx, dst_yy; int width, height; @@ -4232,6 +4224,16 @@ unsigned int MoveDoor(unsigned int door_state) if (!g->bitmap) continue; + if (!is_panel) + { + int k2_door = (door_opening ? k : num_move_steps_doors_only - k - 1); + int kk_door = MAX(0, k2_door); + int sync_frame = kk_door * door_delay_value; + int frame = getGraphicAnimationFrame(dpc->graphic, sync_frame); + + getGraphicSource(dpc->graphic, frame, &bitmap, &g_src_x, &g_src_y); + } + // draw door panel if (!door_panel_drawn[door_index]) @@ -4292,22 +4294,21 @@ unsigned int MoveDoor(unsigned int door_state) height = g->height - src_yy; } - if (is_panel) - { - src_x = src_xx; - src_y = src_yy; - } - else - { - src_x = g->src_x + src_xx; - src_y = g->src_y + src_yy; - } + src_x = g_src_x + src_xx; + src_y = g_src_y + src_yy; dst_x = door_rect->x + dst_xx; dst_y = door_rect->y + dst_yy; + is_panel_and_door_has_closed = + (is_panel && + door_closing && + panel_has_doors[door_index] && + k >= num_move_steps_doors_only - 1); + if (width >= 0 && width <= g->width && - height >= 0 && height <= g->height) + height >= 0 && height <= g->height && + !is_panel_and_door_has_closed) { if (is_panel || !pos->draw_masked) BlitBitmap(bitmap, drawto, src_x, src_y, width, height, @@ -4324,8 +4325,7 @@ unsigned int MoveDoor(unsigned int door_state) door_part_done[nr] = TRUE; // continue door part animations, but not panel after door has closed - if (!door_part_done[nr] && - !(is_panel && door_closing && panel_has_doors[door_index])) + if (!door_part_done[nr] && !is_panel_and_door_has_closed) door_part_done_all = FALSE; } @@ -4365,8 +4365,6 @@ void DrawSpecialEditorDoor() int vy = VY - outer_border; int exsize = EXSIZE + 2 * outer_border; - CloseDoor(DOOR_CLOSE_2); - /* draw bigger level editor toolbox window */ BlitBitmap(gfx1->bitmap, drawto, gfx1->src_x, gfx1->src_y, top_border_width, top_border_height, ex, ey - top_border_height); @@ -8000,6 +7998,7 @@ void ChangeViewportPropertiesIfNeeded() boolean init_video_buffer = FALSE; boolean init_gadgets_and_toons = FALSE; boolean init_em_graphics = FALSE; + boolean drawing_area_changed = FALSE; if (viewport.window.width != WIN_XSIZE || viewport.window.height != WIN_YSIZE) @@ -8058,6 +8057,19 @@ void ChangeViewportPropertiesIfNeeded() init_em_graphics = TRUE; } + if (new_sx != SX || + new_sy != SY || + new_sxsize != SXSIZE || + new_sysize != SYSIZE || + new_real_sx != REAL_SX || + new_real_sy != REAL_SY || + new_full_sxsize != FULL_SXSIZE || + new_full_sysize != FULL_SYSIZE) + { + if (!init_video_buffer) + drawing_area_changed = TRUE; + } + SX = new_sx; SY = new_sy; DX = new_dx; @@ -8098,6 +8110,11 @@ void ChangeViewportPropertiesIfNeeded() SCR_FIELDX = new_scr_fieldx; SCR_FIELDY = new_scr_fieldy; + + gfx.drawing_area_changed = drawing_area_changed; + + SetDrawDeactivationMask(REDRAW_NONE); + SetDrawBackgroundMask(REDRAW_FIELD); } if (init_video_buffer) @@ -8105,9 +8122,6 @@ void ChangeViewportPropertiesIfNeeded() // printf("::: init_video_buffer\n"); InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen); - - SetDrawDeactivationMask(REDRAW_NONE); - SetDrawBackgroundMask(REDRAW_FIELD); } if (init_gadgets_and_toons)