void ClearRectangleOnBackground(Bitmap *bitmap, int x, int y, int width, int height) { if (DrawingOnBackground(x, y)) BlitBitmap(gfx.background_bitmap, bitmap, x, y, width, height, x, y); else ClearRectangle(bitmap, x, y, width, height); }
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(dst_x, dst_y)) { /* draw background */ BlitBitmap(gfx.background_bitmap, dst_bitmap, dst_x, dst_y, 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); } else BlitBitmap(src_bitmap, dst_bitmap, src_x, src_y, width, height, dst_x, dst_y); }
static void ScrollPlayfield(int dx, int dy) { int x1 = mScrollX_last / TILEX - 2; int y1 = mScrollY_last / TILEY - 2; int x2 = mScrollX_last / TILEX + (SCR_FIELDX - 1) + 2; int y2 = mScrollY_last / TILEY + (SCR_FIELDY - 1) + 2; int x, y; BlitBitmap(bitmap_db_field_sp, bitmap_db_field_sp, TILEX * (dx == -1), TILEY * (dy == -1), (MAX_BUF_XSIZE * TILEX) - TILEX * (dx != 0), (MAX_BUF_YSIZE * TILEY) - TILEY * (dy != 0), TILEX * (dx == 1), TILEY * (dy == 1)); /* when scrolling the whole playfield, do not redraw single tiles */ for (x = 0; x < MAX_BUF_XSIZE; x++) for (y = 0; y < MAX_BUF_YSIZE; y++) redraw[x][y] = FALSE; redraw_tiles = 0; DrawFrameIfNeeded(); for (y = DisplayMinY; y <= DisplayMaxY; y++) { for (x = DisplayMinX; x <= DisplayMaxX; x++) { if (x >= x1 && x <= x2 && y >= y1 && y <= y2) { int sx = x - x1; int sy = y - y1; int tsi = GetSI(x, y); long id = ((PlayField16[tsi]) | (PlayField8[tsi] << 16) | (DisPlayField[tsi] << 24)); if ((dx == -1 && x == x2) || (dx == +1 && x == x1) || (dy == -1 && y == y2) || (dy == +1 && y == y1)) { DrawFieldNoAnimated(x, y); DrawFieldAnimated(x, y); } ScreenBuffer[sx][sy] = id; } } } }
int GenericSLM::DisplayImage() { if (initialized_) { inversionStr_ = invert_ ? "On" : "Off" ; BlitBitmap(); return DEVICE_OK; } else { SetErrorText(DEVICE_LOCALLY_DEFINED_ERROR, "SLM not active."); return DEVICE_LOCALLY_DEFINED_ERROR; } }
void BackToFront_SP(void) { static boolean scrolling_last = FALSE; int left = mScrollX / TILEX; int top = mScrollY / TILEY; boolean scrolling = (mScrollX % TILEX != 0 || mScrollY % TILEY != 0); int x, y; SyncDisplay(); if (1 || redraw_tiles > REDRAWTILES_THRESHOLD || scrolling || scrolling_last) { BlitScreenToBitmap_SP(window); } else { for (x = 0; x < SCR_FIELDX; x++) { for (y = 0; y < SCR_FIELDY; y++) { int xx = (left + x) % MAX_BUF_XSIZE; int yy = (top + y) % MAX_BUF_YSIZE; if (redraw[xx][yy]) BlitBitmap(bitmap_db_field_sp, window, xx * TILEX, yy * TILEY, TILEX, TILEY, SX + x * TILEX, SY + y * TILEY); } } } FlushDisplay(); for (x = 0; x < MAX_BUF_XSIZE; x++) for (y = 0; y < MAX_BUF_YSIZE; y++) redraw[x][y] = FALSE; redraw_tiles = 0; scrolling_last = scrolling; }
void BlitScreenToBitmap_SP(Bitmap *target_bitmap) { int px = 2 * TILEX + (mScrollX - mScrollX_last) % TILEX; int py = 2 * TILEY + (mScrollY - mScrollY_last) % TILEY; int sx, sy, sxsize, sysize; #if 0 printf("::: %d, %d / %d, %d / %ld, %ld (%ld, %ld) / %d, %d\n", MurphyScreenXPos, MurphyScreenYPos, ScreenScrollXPos, ScreenScrollYPos, mScrollX, mScrollY, mScrollX_last, mScrollY_last, px, py); #endif int xsize = SXSIZE; int ysize = SYSIZE; int full_xsize = (FieldWidth - (menBorder ? 0 : 1)) * TILEX; int full_ysize = (FieldHeight - (menBorder ? 0 : 1)) * TILEY; sxsize = (full_xsize < xsize ? full_xsize : xsize); sysize = (full_ysize < ysize ? full_ysize : ysize); sx = SX + (full_xsize < xsize ? (xsize - full_xsize) / 2 : 0); sy = SY + (full_ysize < ysize ? (ysize - full_ysize) / 2 : 0); /* scroll correction for even number of visible tiles (half tile shifted) */ px += game_sp.scroll_xoffset; py += game_sp.scroll_yoffset; #if 1 if (ExplosionShakeMurphy != 0) { px += TILEX / 2 - GetSimpleRandom(TILEX + 1); py += TILEY / 2 - GetSimpleRandom(TILEX + 1); } #endif BlitBitmap(bitmap_db_field_sp, target_bitmap, px, py, sxsize, sysize, sx, sy); }
static void Blt(int pX, int pY, Bitmap *bitmap, int SpriteX, int SpriteY) { int scx = (mScrollX_last < 0 ? 0 : mScrollX_last); int scy = (mScrollY_last < 0 ? 0 : mScrollY_last); int sx1 = scx - 2 * TILEX; int sy1 = scy - 2 * TILEY; int sx2 = scx + SXSIZE + 1 * TILEX; int sy2 = scy + SYSIZE + 1 * TILEY; int sx = pX - sx1; int sy = pY - sy1; if (NoDisplayFlag) return; /* do not draw fields that are outside the visible screen area */ if (pX < sx1 || pX > sx2 || pY < sy1 || pY > sy2) return; BlitBitmap(bitmap, bitmap_db_field_sp, SpriteX, SpriteY, TILEX, TILEY, sx, sy); }
static void DrawBitmapFromTile(Bitmap *bitmap, Bitmap *tile, int dest_x, int dest_y, int width, int height) { int bitmap_xsize = width; int bitmap_ysize = height; int tile_xsize = tile->width; int tile_ysize = tile->height; int tile_xsteps = (bitmap_xsize + tile_xsize - 1) / tile_xsize; int tile_ysteps = (bitmap_ysize + tile_ysize - 1) / tile_ysize; int x, y; for (y = 0; y < tile_ysteps; y++) { for (x = 0; x < tile_xsteps; x++) { int draw_x = dest_x + x * tile_xsize; int draw_y = dest_y + y * tile_ysize; int draw_xsize = MIN(tile_xsize, bitmap_xsize - x * tile_xsize); int draw_ysize = MIN(tile_ysize, bitmap_ysize - y * tile_ysize); BlitBitmap(tile, bitmap, 0, 0, draw_xsize, draw_ysize, draw_x, draw_y); } } }
static void CreateScaledBitmaps(Bitmap *old_bitmap, int zoom_factor, boolean create_small_bitmaps) { Bitmap swap_bitmap; Bitmap *new_bitmap; Bitmap *tmp_bitmap_1; Bitmap *tmp_bitmap_2; Bitmap *tmp_bitmap_4; Bitmap *tmp_bitmap_8; Bitmap *tmp_bitmap_16; Bitmap *tmp_bitmap_32; int width_1, height_1; int width_2, height_2; int width_4, height_4; int width_8, height_8; int width_16, height_16; int width_32, height_32; int new_width, new_height; /* calculate new image dimensions for normal sized image */ width_1 = old_bitmap->width * zoom_factor; height_1 = old_bitmap->height * zoom_factor; /* get image with normal size (this might require scaling up) */ if (zoom_factor != 1) tmp_bitmap_1 = ZoomBitmap(old_bitmap, width_1, height_1); else tmp_bitmap_1 = old_bitmap; /* this is only needed to make compilers happy */ tmp_bitmap_2 = NULL; tmp_bitmap_4 = NULL; tmp_bitmap_8 = NULL; tmp_bitmap_16 = NULL; tmp_bitmap_32 = NULL; if (create_small_bitmaps) { /* calculate new image dimensions for small images */ width_2 = width_1 / 2; height_2 = height_1 / 2; width_4 = width_1 / 4; height_4 = height_1 / 4; width_8 = width_1 / 8; height_8 = height_1 / 8; width_16 = width_1 / 16; height_16 = height_1 / 16; width_32 = width_1 / 32; height_32 = height_1 / 32; UPDATE_BUSY_STATE(); /* get image with 1/2 of normal size (for use in the level editor) */ if (zoom_factor != 2) tmp_bitmap_2 = ZoomBitmap(tmp_bitmap_1, width_1 / 2, height_1 / 2); else tmp_bitmap_2 = old_bitmap; UPDATE_BUSY_STATE(); /* get image with 1/4 of normal size (for use in the level editor) */ if (zoom_factor != 4) tmp_bitmap_4 = ZoomBitmap(tmp_bitmap_2, width_2 / 2, height_2 / 2); else tmp_bitmap_4 = old_bitmap; UPDATE_BUSY_STATE(); /* get image with 1/8 of normal size (for use on the preview screen) */ if (zoom_factor != 8) tmp_bitmap_8 = ZoomBitmap(tmp_bitmap_4, width_4 / 2, height_4 / 2); else tmp_bitmap_8 = old_bitmap; UPDATE_BUSY_STATE(); /* get image with 1/16 of normal size (for use on the preview screen) */ if (zoom_factor != 16) tmp_bitmap_16 = ZoomBitmap(tmp_bitmap_8, width_8 / 2, height_8 / 2); else tmp_bitmap_16 = old_bitmap; UPDATE_BUSY_STATE(); /* get image with 1/32 of normal size (for use on the preview screen) */ if (zoom_factor != 32) tmp_bitmap_32 = ZoomBitmap(tmp_bitmap_16, width_16 / 2, height_16 / 2); else tmp_bitmap_32 = old_bitmap; UPDATE_BUSY_STATE(); } #if 0 /* if image was scaled up, create new clipmask for normal size image */ if (zoom_factor != 1) { #if defined(TARGET_X11) if (old_bitmap->clip_mask) XFreePixmap(display, old_bitmap->clip_mask); old_bitmap->clip_mask = Pixmap_to_Mask(tmp_bitmap_1->drawable, width_1, height_1); XSetClipMask(display, old_bitmap->stored_clip_gc, old_bitmap->clip_mask); #else SDL_Surface *tmp_surface_1 = tmp_bitmap_1->surface; if (old_bitmap->surface_masked) SDL_FreeSurface(old_bitmap->surface_masked); SDL_SetColorKey(tmp_surface_1, SDL_SRCCOLORKEY, SDL_MapRGB(tmp_surface_1->format, 0x00, 0x00, 0x00)); if ((old_bitmap->surface_masked = SDL_DisplayFormat(tmp_surface_1)) ==NULL) Error(ERR_EXIT, "SDL_DisplayFormat() failed"); SDL_SetColorKey(tmp_surface_1, 0, 0); /* reset transparent pixel */ #endif } #endif if (create_small_bitmaps) { new_width = width_1; new_height = height_1 + (height_1 + 1) / 2; /* prevent odd height */ new_bitmap = CreateBitmap(new_width, new_height, DEFAULT_DEPTH); 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); UPDATE_BUSY_STATE(); } else { new_width = width_1; new_height = height_1; new_bitmap = tmp_bitmap_1; /* directly use tmp_bitmap_1 as new bitmap */ } if (create_small_bitmaps) { /* if no small bitmaps created, tmp_bitmap_1 is used as new bitmap now */ if (zoom_factor != 1) FreeBitmap(tmp_bitmap_1); if (zoom_factor != 2) FreeBitmap(tmp_bitmap_2); if (zoom_factor != 4) FreeBitmap(tmp_bitmap_4); if (zoom_factor != 8) FreeBitmap(tmp_bitmap_8); if (zoom_factor != 16) FreeBitmap(tmp_bitmap_16); if (zoom_factor != 32) FreeBitmap(tmp_bitmap_32); } /* replace image with extended image (containing 1/1, 1/2, 1/4, 1/8 size) */ #if defined(TARGET_SDL) swap_bitmap.surface = old_bitmap->surface; old_bitmap->surface = new_bitmap->surface; new_bitmap->surface = swap_bitmap.surface; #else swap_bitmap.drawable = old_bitmap->drawable; old_bitmap->drawable = new_bitmap->drawable; new_bitmap->drawable = swap_bitmap.drawable; #endif old_bitmap->width = new_bitmap->width; old_bitmap->height = new_bitmap->height; #if 1 /* this replaces all blit masks created when loading -- maybe optimize this */ { #if defined(TARGET_X11) if (old_bitmap->clip_mask) XFreePixmap(display, old_bitmap->clip_mask); old_bitmap->clip_mask = Pixmap_to_Mask(old_bitmap->drawable, new_width, new_height); XSetClipMask(display, old_bitmap->stored_clip_gc, old_bitmap->clip_mask); #else SDL_Surface *old_surface = old_bitmap->surface; if (old_bitmap->surface_masked) SDL_FreeSurface(old_bitmap->surface_masked); SDL_SetColorKey(old_surface, SDL_SRCCOLORKEY, SDL_MapRGB(old_surface->format, 0x00, 0x00, 0x00)); if ((old_bitmap->surface_masked = SDL_DisplayFormat(old_surface)) ==NULL) Error(ERR_EXIT, "SDL_DisplayFormat() failed"); SDL_SetColorKey(old_surface, 0, 0); /* reset transparent pixel */ #endif } #endif UPDATE_BUSY_STATE(); FreeBitmap(new_bitmap); /* this actually frees the _old_ bitmap now */ }