X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=866870a29d10e2ba5b09daa57836bc5ba06e8139;hb=db796e071bbe21db45ac516e55eaf2ea7cee33d5;hp=f1fd599ead465894a43b1044ab6219e7466d6da6;hpb=8cea50fbd1b74a2bc164a79cbd26bdbb3abd6689;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index f1fd599e..866870a2 100644 --- a/src/tools.c +++ b/src/tools.c @@ -44,8 +44,6 @@ static int el_act2crm(int, int); static struct GadgetInfo *tool_gadget[NUM_TOOL_BUTTONS]; static int request_gadget_id = -1; -static int preview_tilesize = 4; - static char *print_if_not_empty(int element) { static char *s = NULL; @@ -1482,19 +1480,6 @@ void ShowEnvelope(int envelope_nr) BackToFront(); } -void getMicroGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) -{ - Bitmap *src_bitmap = graphic_info[graphic].bitmap; - int mini_startx = src_bitmap->width * 3 / 4; - int mini_starty = src_bitmap->height * 2 / 3; - int src_x = mini_startx + graphic_info[graphic].src_x / 8; - int src_y = mini_starty + graphic_info[graphic].src_y / 8; - - *bitmap = src_bitmap; - *x = src_x; - *y = src_y; -} - void getPreviewGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y, int tilesize) { @@ -1526,25 +1511,14 @@ void getPreviewGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y, *y = src_y; } -void DrawMicroElement(int xpos, int ypos, int element) -{ - Bitmap *src_bitmap; - int src_x, src_y; - int graphic = el2preimg(element); - - getMicroGraphicSource(graphic, &src_bitmap, &src_x, &src_y); - BlitBitmap(src_bitmap, drawto, src_x, src_y, MICRO_TILEX, MICRO_TILEY, - xpos, ypos); -} - -void DrawPreviewElement(int xpos, int ypos, int element, int tilesize) +void DrawPreviewElement(int dst_x, int dst_y, int element, int tilesize) { Bitmap *src_bitmap; int src_x, src_y; int graphic = el2preimg(element); getPreviewGraphicSource(graphic, &src_bitmap, &src_x, &src_y, tilesize); - BlitBitmap(src_bitmap, drawto, src_x, src_y, tilesize, tilesize, xpos, ypos); + BlitBitmap(src_bitmap, drawto, src_x, src_y, tilesize, tilesize, dst_x,dst_y); } void DrawLevel() @@ -1572,37 +1546,36 @@ void DrawMiniLevel(int size_x, int size_y, int scroll_x, int scroll_y) redraw_mask |= REDRAW_FIELD; } -static void DrawMicroLevelExt(int xpos, int ypos, int from_x, int from_y, - int preview_size_x, int preview_size_y) +static void DrawPreviewLevelExt(int from_x, int from_y) { + boolean show_level_border = (BorderElement != EL_EMPTY); + int dst_x = preview.x; + int dst_y = preview.y; + int level_xsize = lev_fieldx + (show_level_border ? 2 : 0); + int level_ysize = lev_fieldy + (show_level_border ? 2 : 0); + int tile_size = preview.tile_size; + int preview_width = preview.xsize * tile_size; + int preview_height = preview.ysize * tile_size; + int real_preview_xsize = MIN(level_xsize, preview.xsize); + int real_preview_ysize = MIN(level_ysize, preview.ysize); int x, y; - DrawBackground(xpos, ypos, MICROLEVEL_XSIZE, MICROLEVEL_YSIZE); - - if (lev_fieldx < preview_size_x) - xpos += (preview_size_x - lev_fieldx) / 2 * preview_tilesize; - if (lev_fieldy < preview_size_y) - ypos += (preview_size_y - lev_fieldy) / 2 * preview_tilesize; + DrawBackground(dst_x, dst_y, preview_width, preview_height); - xpos += preview_tilesize; - ypos += preview_tilesize; + dst_x += (preview_width - real_preview_xsize * tile_size) / 2; + dst_y += (preview_height - real_preview_ysize * tile_size) / 2; - for (x = -1; x <= preview_size_x; x++) + for (x = 0; x < real_preview_xsize; x++) { - for (y = -1; y <= preview_size_y; y++) + for (y = 0; y < real_preview_ysize; y++) { - int lx = from_x + x, ly = from_y + y; - - if (lx >= 0 && lx < lev_fieldx && - ly >= 0 && ly < lev_fieldy) - DrawPreviewElement(xpos + x * preview_tilesize, - ypos + y * preview_tilesize, - level.field[lx][ly], preview_tilesize); - else if (lx >= -1 && lx < lev_fieldx+1 && - ly >= -1 && ly < lev_fieldy+1 && BorderElement != EL_EMPTY) - DrawPreviewElement(xpos + x * preview_tilesize, - ypos + y * preview_tilesize, - getBorderElement(lx, ly), preview_tilesize); + int lx = from_x + x + (show_level_border ? -1 : 0); + int ly = from_y + y + (show_level_border ? -1 : 0); + int element = (IN_LEV_FIELD(lx, ly) ? level.field[lx][ly] : + getBorderElement(lx, ly)); + + DrawPreviewElement(dst_x + x * tile_size, dst_y + y * tile_size, + element, tile_size); } } @@ -1618,7 +1591,7 @@ static void DrawMicroLevelExt(int xpos, int ypos, int from_x, int from_y, #define MICROLABEL_IMPORTED_BY_HEAD 6 #define MICROLABEL_IMPORTED_BY 7 -static void DrawMicroLevelLabelExt(int mode) +static void DrawPreviewLevelLabelExt(int mode) { char label_text[MAX_OUTPUT_LINESIZE + 1]; int max_len_label_text; @@ -1666,15 +1639,17 @@ static void DrawMicroLevelLabelExt(int mode) redraw_mask |= REDRAW_MICROLEVEL; } -void DrawMicroLevel(int xpos, int ypos, boolean restart) +void DrawPreviewLevel(boolean restart) { static unsigned long scroll_delay = 0; static unsigned long label_delay = 0; static int from_x, from_y, scroll_direction; static int label_state, label_counter; - int preview_size_x = STD_LEV_FIELDX * MICRO_TILESIZE / preview_tilesize; - int preview_size_y = STD_LEV_FIELDY * MICRO_TILESIZE / preview_tilesize; - int last_game_status = game_status; /* save current game status */ + unsigned long scroll_delay_value = preview.step_delay; + boolean show_level_border = (BorderElement != EL_EMPTY); + int level_xsize = lev_fieldx + (show_level_border ? 2 : 0); + int level_ysize = lev_fieldy + (show_level_border ? 2 : 0); + int last_game_status = game_status; /* save current game status */ /* force PREVIEW font on preview level */ game_status = GAME_MODE_PSEUDO_PREVIEW; @@ -1686,9 +1661,8 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart) label_state = 1; label_counter = 0; - DrawMicroLevelExt(xpos, ypos, from_x, from_y, - preview_size_x, preview_size_y); - DrawMicroLevelLabelExt(label_state); + DrawPreviewLevelExt(from_x, from_y); + DrawPreviewLevelLabelExt(label_state); /* initialize delay counters */ DelayReached(&scroll_delay, 0); @@ -1715,36 +1689,50 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart) return; } - /* scroll micro level, if needed */ - if ((lev_fieldx > preview_size_x || lev_fieldy > preview_size_y) && - DelayReached(&scroll_delay, MICROLEVEL_SCROLL_DELAY)) + /* scroll preview level, if needed */ + if ((level_xsize > preview.xsize || level_ysize > preview.ysize) && + DelayReached(&scroll_delay, scroll_delay_value)) { switch (scroll_direction) { case MV_LEFT: if (from_x > 0) - from_x--; + { + from_x -= preview.step_offset; + from_x = (from_x < 0 ? 0 : from_x); + } else scroll_direction = MV_UP; break; case MV_RIGHT: - if (from_x < lev_fieldx - preview_size_x) - from_x++; + if (from_x < level_xsize - preview.xsize) + { + from_x += preview.step_offset; + from_x = (from_x > level_xsize - preview.xsize ? + level_xsize - preview.xsize : from_x); + } else scroll_direction = MV_DOWN; break; case MV_UP: if (from_y > 0) - from_y--; + { + from_y -= preview.step_offset; + from_y = (from_y < 0 ? 0 : from_y); + } else scroll_direction = MV_RIGHT; break; case MV_DOWN: - if (from_y < lev_fieldy - preview_size_y) - from_y++; + if (from_y < level_ysize - preview.ysize) + { + from_y += preview.step_offset; + from_y = (from_y > level_ysize - preview.ysize ? + level_ysize - preview.ysize : from_y); + } else scroll_direction = MV_LEFT; break; @@ -1753,8 +1741,7 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart) break; } - DrawMicroLevelExt(xpos, ypos, from_x, from_y, - preview_size_x, preview_size_y); + DrawPreviewLevelExt(from_x, from_y); } /* !!! THIS ALL SUCKS -- SHOULD BE CLEANLY REWRITTEN !!! */ @@ -1795,7 +1782,7 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart) label_state = (label_state == MICROLABEL_IMPORTED_FROM_HEAD ? MICROLABEL_IMPORTED_BY_HEAD : MICROLABEL_IMPORTED_BY); - DrawMicroLevelLabelExt(label_state); + DrawPreviewLevelLabelExt(label_state); } game_status = last_game_status; /* restore current game status */ @@ -6037,3 +6024,33 @@ void PlayMenuMusic() PlayMusic(music); } + +void ToggleFullscreenIfNeeded() +{ + if (setup.fullscreen != video.fullscreen_enabled || + setup.fullscreen_mode != video.fullscreen_mode_current) + { + Bitmap *tmp_backbuffer = CreateBitmap(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH); + + /* save backbuffer content which gets lost when toggling fullscreen mode */ + BlitBitmap(backbuffer, tmp_backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + + if (setup.fullscreen && video.fullscreen_enabled) + { + /* keep fullscreen mode, but change screen mode */ + video.fullscreen_mode_current = setup.fullscreen_mode; + video.fullscreen_enabled = FALSE; + } + + /* toggle fullscreen */ + ChangeVideoModeIfNeeded(setup.fullscreen); + setup.fullscreen = video.fullscreen_enabled; + + /* restore backbuffer content from temporary backbuffer backup bitmap */ + BlitBitmap(tmp_backbuffer, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + + FreeBitmap(tmp_backbuffer); + + redraw_mask = REDRAW_ALL; + } +}