public override async void OnDrawBegin(IModel sender, PointerPoint args) { var layer = sender.CurrentLayer; if (Clipper.IsCliping) { layer.getRect(out Rect orec, out WriteableBitmap obb); var Bitmap = new WriteableBitmap((int)DrawRect.Width, (int)DrawRect.Height); IGrap.copyImg(obb, Bitmap, (int)orec.X, (int)orec.Y); layer.Child = Clipper.createPolygon(Bitmap); o = (Point)layer.Child.Tag; a = (Vec2)args.Position; obmp = layer.Bitmap; cbmp = await(tt = layer.Child.Render()); if (layer.Bitmap != null) { layer.Bitmap = layer.Bitmap.Clone(); IGrap.delImg(cbmp, layer.Bitmap, (int)(o.X - orec.X), (int)(o.Y - orec.Y)); layer.Bitmap.Invalidate(); } //((DrawPanel)sender).X.Source = cbmp; } else { o = layer.Point; a = args.Position; } }
public async Task <WriteableBitmap> CopyImage(LayerModel layer) { layer.getRect(out Rect orec, out WriteableBitmap obb); if (Clipper.IsCliping) { var Bitmap = new WriteableBitmap((int)DrawRect.Width, (int)DrawRect.Height); //var c = Windows.UI.Color.FromArgb(0,255, 255, 255); //IGrap.fillColor(Bitmap, (x, y) => { // return c; //}); IGrap.copyImg(obb, Bitmap, (int)orec.X, (int)orec.Y); layer.Child = Clipper.createPolygon(Bitmap); var xb = await layer.Child.Render(); Clipper.Points.Clear(); layer.Child = null; return(xb); } else { return(obb); } }
public override async void OnDrawCommit(IModel sender, PointerPoint args) { VModel.vm.Loading = true; var gdi = new Graphics(); gdi.Color = Color; var layer = sender.CurrentLayer; layer.getRect(out Rect orec, out WriteableBitmap obmp); var nbmp = new WriteableBitmap((int)DrawRect.Width, (int)DrawRect.Height); var mask = new WriteableBitmap((int)DrawRect.Width, (int)DrawRect.Height); var nrec = new Rect(0, 0, nbmp.PixelWidth, nbmp.PixelHeight); IGrap.copyImg(obmp, nbmp, (int)orec.X, (int)orec.Y); if (PickAll) { foreach (var item in sender.Layers.Reverse()) { if (!item.IsShow) { continue; } IGrap.addImg(item.Bitmap, mask, (int)item.X, (int)item.Y, item.Opacity); } } else { IGrap.copyImg(obmp, mask, (int)orec.X, (int)orec.Y); } var p = new Point(args.Position.X, args.Position.Y); if (Clipper.IsCliping) { var Bitmap = new WriteableBitmap((int)DrawRect.Width, (int)DrawRect.Height); gdi.SetBitmap(Bitmap); layer.setRect(nrec, nbmp);//bug bug bug await gdi.DrawBucker((int)p.X, (int)p.Y, mask.PixelBuffer.ToArray()); //await Task.Delay(1000); layer.Child = Clipper.createPolygon(Bitmap); var bmp = await layer.Child.Render(); var pos = (Point)layer.Child.Tag; IGrap.addImg(bmp, nbmp, (int)Math.Round(pos.X), (int)Math.Round(pos.Y)); layer.Child = null; nbmp.Invalidate();//bug bug bug } else { gdi.SetBitmap(nbmp); await gdi.DrawBucker((int)p.X, (int)p.Y, mask.PixelBuffer.ToArray()); } var i = sender.Layers.IndexOf(layer); Exec.Do(new Exec() { exec = () => { sender.Layers[i].setRect(nrec, nbmp); }, undo = () => { sender.Layers[i].setRect(orec, obmp); } }); VModel.vm.Loading = false; }
public override async void OnDrawCommit(IModel sender, PointerPoint args) { if (rect.IsEmpty) { OnDrawRollback(sender, args); return; } var layer = sender.CurrentLayer; if (Clipper.IsCliping) { //sender.X.Source = bmp; VModel.vm.Loading = true; var bmp = await layer.Child.Render(); VModel.vm.Loading = false; var pos = (Point)layer.Child.Tag; IGrap.addImg(bmp, layer.Bitmap, (int)Math.Round(pos.X), (int)Math.Round(pos.Y)); layer.Child = null; } if (merge) { var or = orec; var ob = obmp; var nr = RectHelper.Intersect(RectHelper.Union(rect, orec), DrawRect); var i = sender.Layers.IndexOf(layer); var nb = IGrap.clipImg(layer.Bitmap, nr); Exec.Do(new Exec() { exec = () => { sender.Layers[i].setRect(nr, nb); }, undo = () => { sender.Layers[i].setRect(or, ob); sender.CurrentLayer = sender.Layers[i]; } }); } else { var or = orec; var nr = rect; var nb = IGrap.clipImg(layer.Bitmap, nr); layer.setRect(orec, obmp); nr.X -= or.X; nr.Y -= or.Y; var ob = IGrap.clipImg(obmp, nr); var i = sender.Layers.IndexOf(layer); Exec.Do(new Exec() { exec = () => { layer = sender.Layers[i]; IGrap.copyImg(nb, layer.Bitmap, (int)Math.Floor(nr.X), (int)Math.Floor(nr.Y)); layer.Bitmap.Invalidate(); }, undo = () => { layer = sender.Layers[i]; IGrap.copyImg(ob, layer.Bitmap, (int)Math.Floor(nr.X), (int)Math.Floor(nr.Y)); layer.Bitmap.Invalidate(); sender.CurrentLayer = sender.Layers[i]; } }); } }
public override async void OnToolState(IModel sender, bool state) { var layer = sender.CurrentLayer; if (!layer.IsEdit || !layer.IsShow) { return; } if (layer.Bitmap == null) { return; } Debug.WriteLine("state:" + state); if (state) { layer.getRect(out orec, out obb); if (Clipper.IsCliping) { VModel.vm.Loading = true; //拷贝选区 var Bitmap = new WriteableBitmap((int)DrawRect.Width, (int)DrawRect.Height); IGrap.copyImg(obb, Bitmap, (int)orec.X, (int)orec.Y); layer.Child = Clipper.createPolygon(Bitmap); var p = (Point)layer.Child.Tag; var xb = await(layer.Child.Render()); Clipper.Points.Clear(); layer.Child = null; if (xb != null) { var i = sender.Layers.IndexOf(layer); var nb = obb; var ob = obb; if (layer.Bitmap != null) { nb = layer.Bitmap.Clone(); IGrap.delImg(xb, nb, (int)(p.X - orec.X), (int)(p.Y - orec.Y)); nb.Invalidate(); } obb = xb; orec = new Rect(p.X, p.Y, xb.PixelWidth, xb.PixelHeight); Exec.Do(new Exec() { exec = () => { sender.Layers[i].Bitmap = nb; sender.Layers.Insert(i, new LayerModel() { Bitmap = xb, X = p.X, Y = p.Y }); sender.CurrentLayer = sender.Layers[i]; }, undo = () => { sender.Layers.RemoveAt(i); sender.CurrentLayer = sender.Layers[i]; sender.CurrentLayer.Bitmap = ob; } }); } VModel.vm.Loading = false; } sender.ElemArea.Child = CreateRect(sender); ch = false; } else { sender.ElemArea.Child = null; if (!ch) { return; } var vc = new CompositeTransform() { Rotation = com.Rotation, ScaleX = com.ScaleX, ScaleY = com.ScaleY, CenterX = com.TranslateX + layer.W / 2, CenterY = com.TranslateY + layer.H / 2 }; var or = orec; var ob = obb; layer.getRect(out Rect nr, out WriteableBitmap nb); if (com.ScaleX != 1 || com.ScaleY != 1 || com.Rotation != 0) { var elem = (FrameworkElement)((DrawPanel)sender).ITEMS.ContainerFromItem(layer); VModel.vm.Loading = true; var b = await(elem).Render(); VModel.vm.Loading = false; var vr = vc.TransformBounds(nr); nr = RectHelper.Intersect(DrawRect, vr); if (nr.IsEmpty) { nb = null; layer.setRect(nr, nb); } else { nb = new WriteableBitmap((int)nr.Width, (int)nr.Height); IGrap.addImg(b, nb, (int)(vr.X - nr.X), (int)(vr.Y - nr.Y)); layer.setRect(nr, nb); } com.Rotation = 0; com.ScaleX = 1; com.ScaleY = 1; } var i = sender.Layers.IndexOf(sender.CurrentLayer); Exec.Save(new Exec() { exec = () => { sender.Layers[i].setRect(nr, nb); }, undo = () => { sender.Layers[i].setRect(or, ob); } }); } }