示例#1
0
        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;
                    }
                }
            }
        }
示例#2
0
 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);
 }