public void Pixmap(Pixmap pixmap, int x, int y, Rect src_rect, float width = -1, float height = -1, byte color_key = Palette.TransparentColor, byte tint = Palette.NoColor, bool flip = false) { _blit_surface_dirty = true; var sw = _current_blit_surface.Width; var pw = pixmap.Width; var surface_colors = _current_blit_surface.Colors; var pixmap_colors = pixmap.Colors; var clip_rect = _clip_rect; if (src_rect.IsEmpty) { src_rect = new Rect(0, 0, pixmap.Width, pixmap.Height); } if (width < 1) { width = src_rect.W; } if (height < 1) { height = src_rect.H; } var factor_w = width / src_rect.W; var factor_h = height / src_rect.H; var min_x = Math.Max(x, clip_rect.Left); var min_y = Math.Max(y, clip_rect.Top); var max_x = Math.Min(x + width, clip_rect.Right); var max_y = Math.Min(y + height, clip_rect.Bottom); if (!flip) { for (var i = min_x; i < max_x; ++i) { for (var j = min_y; j < max_y; ++j) { var surf_idx = (i + j * sw); var pix_idx = ((src_rect.X + (int)((i - x) / factor_w)) + (src_rect.Y + (int)((j - y) / factor_h)) * pw); var pix_color = pixmap_colors[pix_idx]; if (pix_color == color_key) { continue; } if (tint != Palette.NoColor) { pix_color = tint; } surface_colors[surf_idx] = pix_color; } } } else { var start_pix_x = src_rect.Right - 1; for (var i = min_x; i < max_x; ++i) { for (var j = min_y; j < max_y; ++j) { var surf_idx = (i + j * sw); var pix_idx = (start_pix_x - (int)((i - x) / factor_w) + (src_rect.Y + (int)((j - y) / factor_h)) * pw); var pix_color = pixmap_colors[pix_idx]; if (pix_color == color_key) { continue; } if (tint != Palette.NoColor) { pix_color = tint; } surface_colors[surf_idx] = pix_color; } } } }
public void SetSurface(Pixmap pixmap) { _current_blit_surface = pixmap ?? _blit_surface; _clip_rect = new Rect(0, 0, _current_blit_surface.Width, _current_blit_surface.Height); }