X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Fsystem.c;h=eec5d192960ac9e784d5232ad8e47ef5ccb90dc1;hp=aa344da58d9af83e1f5f04e31d72f8364a3c99f8;hb=f7165d318c089b77d0a91a77afc44cb8866dc1cc;hpb=3ff2e8a0b5c27b99a9920bdf5ed82bc41bf40181 diff --git a/src/libgame/system.c b/src/libgame/system.c index aa344da5..eec5d192 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -44,11 +44,6 @@ int level_nr; struct LevelStats level_stats[MAX_LEVELS]; -Display *display = NULL; -Visual *visual = NULL; -int screen = 0; -Colormap cmap = None; - DrawWindow *window = NULL; DrawBuffer *backbuffer = NULL; DrawBuffer *drawto = NULL; @@ -175,6 +170,8 @@ void InitGfxFieldInfo(int sx, int sy, int sxsize, int sysize, gfx.field_save_buffer = field_save_buffer; + gfx.drawing_area_changed = FALSE; + SetDrawDeactivationMask(REDRAW_NONE); /* do not deactivate drawing */ SetDrawBackgroundMask(REDRAW_NONE); /* deactivate masked drawing */ } @@ -468,6 +465,16 @@ boolean DrawingOnBackground(int x, int y) CheckDrawingArea(x, y, 1, 1, gfx.draw_background_mask)); } +boolean DrawingAreaChanged() +{ + int drawing_area_changed = gfx.drawing_area_changed; + + // reset flag for change of drawing area after querying it + gfx.drawing_area_changed = FALSE; + + return drawing_area_changed; +} + static boolean InClippedRectangle(Bitmap *bitmap, int *x, int *y, int *width, int *height, boolean is_dest) { @@ -660,14 +667,6 @@ void ClearRectangleOnBackground(Bitmap *bitmap, int x, int y, ClearRectangle(bitmap, x, y, width, height); } -void SetClipMask(Bitmap *bitmap, GC clip_gc, Pixmap clip_pixmap) -{ -} - -void SetClipOrigin(Bitmap *bitmap, GC clip_gc, int clip_x, int clip_y) -{ -} - void BlitBitmapMasked(Bitmap *src_bitmap, Bitmap *dst_bitmap, int src_x, int src_y, int width, int height, int dst_x, int dst_y) @@ -690,8 +689,6 @@ void BlitBitmapOnBackground(Bitmap *src_bitmap, Bitmap *dst_bitmap, 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); } @@ -774,16 +771,6 @@ Pixel GetPixelFromRGBcompact(Bitmap *bitmap, unsigned int color) return GetPixelFromRGB(bitmap, color_r, color_g, color_b); } -/* execute all pending screen drawing operations */ -void FlushDisplay(void) -{ -} - -/* execute and wait for all pending screen drawing operations */ -void SyncDisplay(void) -{ -} - void KeyboardAutoRepeatOn(void) { #if defined(TARGET_SDL2) @@ -896,11 +883,57 @@ Bitmap *ZoomBitmap(Bitmap *src_bitmap, int zoom_width, int zoom_height) return dst_bitmap; } -static void CreateScaledBitmaps(Bitmap *old_bitmap, int zoom_factor, +static void SetMaskedBitmapSurface(Bitmap *bitmap) +{ + if (bitmap == NULL) + return; + + SDL_Surface *surface = bitmap->surface; + + if (bitmap->surface_masked) + SDL_FreeSurface(bitmap->surface_masked); + + SDL_SetColorKey(surface, SET_TRANSPARENT_PIXEL, + SDL_MapRGB(surface->format, 0x00, 0x00, 0x00)); + + if ((bitmap->surface_masked = SDLGetNativeSurface(surface)) == NULL) + Error(ERR_EXIT, "SDL_DisplayFormat() failed"); + + SDL_SetColorKey(surface, UNSET_TRANSPARENT_PIXEL, 0); +} + +void ReCreateGameTileSizeBitmap(Bitmap **bitmaps) +{ + if (bitmaps[IMG_BITMAP_CUSTOM]) + { + FreeBitmap(bitmaps[IMG_BITMAP_CUSTOM]); + + bitmaps[IMG_BITMAP_CUSTOM] = NULL; + } + + if (gfx.game_tile_size == gfx.standard_tile_size) + { + bitmaps[IMG_BITMAP_GAME] = bitmaps[IMG_BITMAP_STANDARD]; + + return; + } + + Bitmap *bitmap = bitmaps[IMG_BITMAP_STANDARD]; + int width = bitmap->width * gfx.game_tile_size / gfx.standard_tile_size;; + int height = bitmap->height * gfx.game_tile_size / gfx.standard_tile_size;; + + Bitmap *bitmap_new = ZoomBitmap(bitmap, width, height); + + bitmaps[IMG_BITMAP_CUSTOM] = bitmap_new; + bitmaps[IMG_BITMAP_GAME] = bitmap_new; + + SetMaskedBitmapSurface(bitmap_new); +} + +static void CreateScaledBitmaps(Bitmap **bitmaps, int zoom_factor, int tile_size, boolean create_small_bitmaps) { - Bitmap swap_bitmap; - Bitmap *new_bitmap; + Bitmap *old_bitmap = bitmaps[IMG_BITMAP_STANDARD]; Bitmap *tmp_bitmap_final = NULL; Bitmap *tmp_bitmap_0 = NULL; Bitmap *tmp_bitmap_1 = NULL; @@ -918,7 +951,7 @@ static void CreateScaledBitmaps(Bitmap *old_bitmap, int zoom_factor, int width_16, height_16; int width_32, height_32; int old_width, old_height; - int new_width, new_height; + int i; print_timestamp_init("CreateScaledBitmaps"); @@ -980,10 +1013,7 @@ static void CreateScaledBitmaps(Bitmap *old_bitmap, int zoom_factor, UPDATE_BUSY_STATE(); } - } - if (create_small_bitmaps) - { /* calculate new image dimensions for small images */ width_2 = width_1 / 2; height_2 = height_1 / 2; @@ -1035,118 +1065,56 @@ static void CreateScaledBitmaps(Bitmap *old_bitmap, int zoom_factor, tmp_bitmap_32 = ZoomBitmap(tmp_bitmap_16, width_32, height_32); UPDATE_BUSY_STATE(); - } - if (create_small_bitmaps) - { - new_width = width_1; - new_height = height_1 + (height_1 + 1) / 2; /* prevent odd height */ + bitmaps[IMG_BITMAP_32x32] = tmp_bitmap_1; + bitmaps[IMG_BITMAP_16x16] = tmp_bitmap_2; + bitmaps[IMG_BITMAP_8x8] = tmp_bitmap_4; + bitmaps[IMG_BITMAP_4x4] = tmp_bitmap_8; + bitmaps[IMG_BITMAP_2x2] = tmp_bitmap_16; + bitmaps[IMG_BITMAP_1x1] = tmp_bitmap_32; if (width_0 != width_1) - { - new_width += width_0; - new_height = MAX(new_height, height_0); - } + bitmaps[IMG_BITMAP_CUSTOM] = tmp_bitmap_0; - new_bitmap = CreateBitmap(new_width, new_height, DEFAULT_DEPTH); + if (bitmaps[IMG_BITMAP_CUSTOM]) + bitmaps[IMG_BITMAP_GAME] = bitmaps[IMG_BITMAP_CUSTOM]; + else + bitmaps[IMG_BITMAP_GAME] = bitmaps[IMG_BITMAP_STANDARD]; - if (width_0 != width_1) - BlitBitmap(tmp_bitmap_0, new_bitmap, 0, 0, width_0, height_0, width_1, 0); - - BlitBitmap(tmp_bitmap_1, new_bitmap, 0, 0, width_1, height_1, 0, 0); - BlitBitmap(tmp_bitmap_2, new_bitmap, 0, 0, width_1 / 2, height_1 / 2, - 0, height_1); - BlitBitmap(tmp_bitmap_4, new_bitmap, 0, 0, width_1 / 4, height_1 / 4, - width_1 / 2, height_1); - BlitBitmap(tmp_bitmap_8, new_bitmap, 0, 0, width_1 / 8, height_1 / 8, - 3 * width_1 / 4, height_1); - BlitBitmap(tmp_bitmap_16, new_bitmap, 0, 0, width_1 / 16, height_1 / 16, - 7 * width_1 / 8, height_1); - BlitBitmap(tmp_bitmap_32, new_bitmap, 0, 0, width_1 / 32, height_1 / 32, - 15 * width_1 / 16, height_1); + boolean free_old_bitmap = TRUE; - UPDATE_BUSY_STATE(); - } - else - { - new_width = width_1; - new_height = height_1; + for (i = 0; i < NUM_IMG_BITMAPS; i++) + if (bitmaps[i] == old_bitmap) + free_old_bitmap = FALSE; - new_bitmap = tmp_bitmap_1; /* directly use tmp_bitmap_1 as new bitmap */ + if (free_old_bitmap) + FreeBitmap(old_bitmap); } - - if (create_small_bitmaps) + else { - /* if no small bitmaps created, tmp_bitmap_1 is used as new bitmap now */ - - if (tmp_bitmap_final != old_bitmap) - FreeBitmap(tmp_bitmap_final); - - if (tmp_bitmap_0 != old_bitmap && - tmp_bitmap_0 != tmp_bitmap_final) - FreeBitmap(tmp_bitmap_0); - - if (tmp_bitmap_1 != old_bitmap && - tmp_bitmap_1 != tmp_bitmap_final && - tmp_bitmap_1 != tmp_bitmap_0) - FreeBitmap(tmp_bitmap_1); - - if (tmp_bitmap_2 != old_bitmap) - FreeBitmap(tmp_bitmap_2); - - if (tmp_bitmap_4 != old_bitmap) - FreeBitmap(tmp_bitmap_4); - - if (tmp_bitmap_8 != old_bitmap) - FreeBitmap(tmp_bitmap_8); - - if (tmp_bitmap_16 != old_bitmap) - FreeBitmap(tmp_bitmap_16); - - if (tmp_bitmap_32 != old_bitmap) - FreeBitmap(tmp_bitmap_32); + bitmaps[IMG_BITMAP_32x32] = tmp_bitmap_1; } - /* replace image with extended image (containing 1/1, 1/2, 1/4, 1/8 size) */ - swap_bitmap.surface = old_bitmap->surface; - old_bitmap->surface = new_bitmap->surface; - new_bitmap->surface = swap_bitmap.surface; - - old_bitmap->width = new_bitmap->width; - old_bitmap->height = new_bitmap->height; - - /* this replaces all blit masks created when loading -- maybe optimize this */ - { - SDL_Surface *old_surface = old_bitmap->surface; - - if (old_bitmap->surface_masked) - SDL_FreeSurface(old_bitmap->surface_masked); - - SDL_SetColorKey(old_surface, SET_TRANSPARENT_PIXEL, - SDL_MapRGB(old_surface->format, 0x00, 0x00, 0x00)); - - if ((old_bitmap->surface_masked = SDLGetNativeSurface(old_surface)) == NULL) - Error(ERR_EXIT, "SDL_DisplayFormat() failed"); - - SDL_SetColorKey(old_surface, UNSET_TRANSPARENT_PIXEL, 0); - } + // create corresponding bitmaps for masked blitting + for (i = 0; i < NUM_IMG_BITMAPS; i++) + if (bitmaps[i] != NULL && + bitmaps[i] != old_bitmap) + SetMaskedBitmapSurface(bitmaps[i]); UPDATE_BUSY_STATE(); - FreeBitmap(new_bitmap); /* this actually frees the _old_ bitmap now */ - print_timestamp_done("CreateScaledBitmaps"); } -void CreateBitmapWithSmallBitmaps(Bitmap *old_bitmap, int zoom_factor, +void CreateBitmapWithSmallBitmaps(Bitmap **bitmaps, int zoom_factor, int tile_size) { - CreateScaledBitmaps(old_bitmap, zoom_factor, tile_size, TRUE); + CreateScaledBitmaps(bitmaps, zoom_factor, tile_size, TRUE); } -void ScaleBitmap(Bitmap *old_bitmap, int zoom_factor) +void ScaleBitmap(Bitmap **bitmaps, int zoom_factor) { - CreateScaledBitmaps(old_bitmap, zoom_factor, 0, FALSE); + CreateScaledBitmaps(bitmaps, zoom_factor, 0, FALSE); }