Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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;
        }
Beispiel #4
0
        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];
                    }
                });
            }
        }
Beispiel #5
0
        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);
                    }
                });
            }
        }