IPixelCanvas RandomSquares__DrawVisual2(int count, int square_size, int canvas_size) { var rd = new Random(); var pc = new PixelArrayCanvas(canvas_size, canvas_size); var dv = new DrawingVisual(); var geom = new RectangleGeometry(new System.Windows.Rect(0, 0, square_size, square_size)); geom.Freeze(); using (var cx = dv.RenderOpen()) { var canvas = new RectangleGeometry(new Rect(0, 0, canvas_size, canvas_size)); canvas.Freeze(); cx.DrawGeometry(Brushes.Transparent, null, canvas); var lols = new ConcurrentBag<DrawingWithExtras>(); Parallel.For(0, count, i => { var drawing = new GeometryDrawing(Brushes.Red, new Pen(Brushes.Red, 1), geom); drawing.Freeze(); var trans = new TranslateTransform(rd.Next(0, canvas_size - square_size), rd.Next(0, canvas_size - square_size)); trans.Freeze(); lols.Add(new DrawingWithExtras { drawing = drawing, transform = trans }); }); foreach(var lol in lols) { cx.PushTransform(lol.transform); cx.DrawDrawing(lol.drawing); cx.Pop(); } } pc.DrawVisual(0, 0, dv, BlendMode.Copy); return pc; }
IPixelCanvas RandomSquares__DrawVisual(int count, int square_size, int canvas_size) { var rd = new Random(); var pc = new PixelArrayCanvas(canvas_size, canvas_size); var dv = new DrawingVisual(); var geom = new RectangleGeometry(new System.Windows.Rect(0, 0, square_size, square_size)); geom.Freeze(); using (var cx = dv.RenderOpen()) { var canvas = new RectangleGeometry(new Rect(0, 0, canvas_size, canvas_size)); canvas.Freeze(); cx.DrawGeometry(Brushes.Transparent, null, canvas); for(int i = 0; i < count; i++) { cx.PushTransform(new TranslateTransform(rd.Next(0, canvas_size - square_size), rd.Next(0, canvas_size - square_size))); cx.DrawGeometry(Brushes.Red, new Pen(Brushes.Red, 1), geom); cx.Pop(); } } pc.DrawVisual(0, 0, dv, BlendMode.Copy); return pc; }