Exemple #1
0
        private void AssociatedObject_DragEnter(object sender, DragEventArgs e)
        {
            LayerDragData data = e.Data.GetData(typeof(LayerDragData)) as LayerDragData;

            if (data != null)
            {
                IBImage trg = AssociatedObject.DataContext as IBImage;
                if (trg == null || trg == data.from || trg.owner == null)
                {
                    return;
                }

                CellSource trgOwner = trg.owner as CellSource;
                if (trgOwner == null || trgOwner != data.fromOwner)
                {
                    return;
                }

                int trgIndex = trgOwner.Layers.IndexOf(trg);

                trgOwner.Layers.Remove(data.from);
                trgOwner.Layers.Insert(trgIndex, data.from);

                RedoUndoManager.Current.Record(new RUSortLayer(data.from, data.fromIndex, data.fromOwner, trg, trgIndex));

                IBCanvasControl.RefreshAll();
            }
        }
Exemple #2
0
        private void AssociatedObject_MouseLeave(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                IBImage trg = AssociatedObject.DataContext as IBImage;
                if (trg == null || trg.owner == null)
                {
                    return;
                }

                CellSource trgOwner = trg.owner as CellSource;
                if (trgOwner == null)
                {
                    return;
                }

                LayerDragData data = new LayerDragData()
                {
                    from      = trg,
                    fromOwner = trgOwner,
                    fromIndex = trgOwner.Layers.IndexOf(trg)
                };

                DragDrop.DoDragDrop(AssociatedObject, data, DragDropEffects.Move);
            }
        }
Exemple #3
0
        public RUSortLayer(IBImage from, int fromIndex, CellSource owner, IBImage to, int toIndex)
        {
            From      = from;
            FromIndex = fromIndex;

            Owner = owner;

            To      = to;
            ToIndex = toIndex;
        }
        public static void DrawOneImage(IBImage i, double zoomPerCent, ref double layer)
        {
            if (!i.IsVisible)
            {
                return;
            }

            double zoom = zoomPerCent / 100.0;

            double offsetX;
            double offsetY;
            double w, h;

            if (i.LayerType != ImageTypes.SingleColor)
            {
                offsetX = (i.Rect.OffsetX + i.imageData.actualSize.OffsetX) * zoom;
                offsetY = (i.Rect.OffsetY + (i.Rect.Height - i.imageData.actualSize.OffsetY - i.imageData.actualSize.Height)) * zoom;
                w       = i.imageData.actualSize.Width * zoom;
                h       = i.imageData.actualSize.Height * zoom;
            }
            else
            {
                offsetX = i.Rect.OffsetX * zoom;
                offsetY = i.Rect.OffsetY * zoom;
                w       = i.Rect.Width * zoom;
                h       = i.Rect.Height * zoom;
            }

            double texMin = 0, texMax = 1.0;

            if (i.LayerType == ImageTypes.SingleColor)
            {
                texMin = 0.5;
                texMax = 0.5;
            }

            IBFramework.OpenGL.Texture.BindTexture(i.imageData.textureNumber);
            {
                GL.Begin(PrimitiveType.Quads);
                {
                    GL.TexCoord2(texMax, texMin);
                    GL.Vertex3(offsetX + w, offsetY + h, layer);
                    GL.TexCoord2(texMin, texMin);
                    GL.Vertex3(offsetX, offsetY + h, layer);
                    GL.TexCoord2(texMin, texMax);
                    GL.Vertex3(offsetX, offsetY, layer);
                    GL.TexCoord2(texMax, texMax);
                    GL.Vertex3(offsetX + w, offsetY, layer);
                }
                GL.End();
                layer += 0.01;
            }
            //IBFramework.OpenGL.Texture.BindTexture(0);
        }
        private void Draw(IBImage trg)
        {
            if (trg == null)
            {
                return;
            }

            double _x = curCoord.x - trg.Rect.OffsetX, _y = curCoord.y - trg.Rect.OffsetY;

            double preX = histCoord[1].x - trg.Rect.OffsetX, preY = histCoord[1].y - trg.Rect.OffsetY;
            double dx = curCoord.x - histCoord[1].x, dy = curCoord.y - histCoord[1].y;
            double length = Math.Sqrt(dx * dx + dy * dy);

            if (length > 200)
            {
                return;
            }
            double interval = 0.1 / length;
            double t        = last_t / length;

            while (t < 1.0)
            {
                double x = preX + dx * t;
                double y = preY + dy * t;

                if (x < 0)
                {
                    x = 0;
                }
                if (y < 0)
                {
                    y = 0;
                }
                if (x >= trg.imageData.actualSize.Width)
                {
                    x = trg.imageData.actualSize.Width - 1;
                }
                if (y >= trg.imageData.actualSize.Height)
                {
                    y = trg.imageData.actualSize.Height - 1;
                }

                DrawPoint(trg, x, y);

                t += 0.5 * interval;
            }

            last_t = length * (t - 1.0);


            EntryTexUpdate(trg.imageData);
        }
Exemple #6
0
        private void DrawToLineDrawingImage(IBImage trg, double r, PixelData color)
        {
            double _x = curCoord.x - trg.Rect.OffsetX, _y = curCoord.y - trg.Rect.OffsetY;

            if (_x < 0 || _y < 0 || _x >= trg.imageData.actualSize.Width || _y >= trg.imageData.actualSize.Height)
            {
                return;
            }

            double preX = histCoord[1].x - trg.Rect.OffsetX, preY = histCoord[1].y - trg.Rect.OffsetY, prePre = histPressure[1];
            double dx = curCoord.x - histCoord[1].x, dy = curCoord.y - histCoord[1].y, dp = curPressure - prePre;
            double length = Math.Sqrt(dx * dx + dy * dy);

            if (length > 200)
            {
                return;
            }
            double interval = 0.1 / length;
            double t        = last_t / length;

            while (t < 1.0)
            {
                double x = preX + dx * t;
                double y = preY + dy * t;

                double p = prePre + dp * t;

                if (p == 0)
                {
                    DrawCircle(trg, x, y, r, color);
                }
                else if (p > 0.2)
                {
                    double _r = r;
                    if (p != 0.0)
                    {
                        _r *= PenTouch(p);
                    }

                    DrawCircle(trg, x, y, _r, color);
                }

                t += r * interval;
            }

            last_t = length * (t - 1.0);


            EntryTexUpdate(trg.imageData);
        }
        private void DrawPoint(IBImage trg, double x, double y)
        {
            int imageW = (int)trg.imageData.actualSize.Width;
            int imageH = (int)trg.imageData.actualSize.Height;

            byte[] data   = trg.imageData.data;
            int    stride = imageW * 4;

            RecordDrawArea((int)x, (int)y, (int)x, (int)y);

            int offset = (int)y * stride;
            int xp     = (int)x * 4;

            data[offset + xp + 2] = 255;
            data[offset + xp + 3] = 255;
        }
        private void EndDrawing(IBImage trg)
        {
            double _x = curCoord.x - trg.Rect.OffsetX, _y = curCoord.y - trg.Rect.OffsetY;

            double preX = start.x - trg.Rect.OffsetX, preY = start.y - trg.Rect.OffsetY;
            double dx = curCoord.x - start.x, dy = curCoord.y - start.y;
            double length   = Math.Sqrt(dx * dx + dy * dy);
            double interval = 0.1 / length;
            double t        = last_t / length;

            while (t < 1.0)
            {
                double x = preX + dx * t;
                double y = preY + dy * t;

                if (x < 0)
                {
                    x = 0;
                }
                if (y < 0)
                {
                    y = 0;
                }
                if (x >= trg.imageData.actualSize.Width)
                {
                    x = trg.imageData.actualSize.Width - 1;
                }
                if (y >= trg.imageData.actualSize.Height)
                {
                    y = trg.imageData.actualSize.Height - 1;
                }

                DrawPoint(trg, x, y);

                t += interval;
            }

            last_t = length * (t - 1.0);


            EntryTexUpdate(trg.imageData);
        }
        public static void RenderCellSource(CellSource c, double zoomPerCent, ref double layer)
        {
            if (c == null)
            {
                return;
            }

            for (int index = c.Layers.Count - 1; index >= 0; index--)
            {
                IBImage i = c.Layers[index];
                DrawOneImage(i, zoomPerCent, ref layer);
            }

            if (c.PixcelSelectedArea != null)
            {
                DrawPixcelSelectedLayer(c.PixcelSelectedArea, zoomPerCent, ref layer);
            }
            if (c.TempLayer != null)
            {
                DrawOneImage(c.TempLayer, zoomPerCent, ref layer);
            }
        }
Exemple #10
0
        public void AddNewLayer(string name, bool RURecord = true, ImageTypes type = ImageTypes.LineDrawing)
        {
            IBImage l = null;

            switch (type)
            {
            case ImageTypes.Coloring:
            case ImageTypes.LineDrawing:
                l = new PixcelImage(Width + 300, Height + 300, -150, -150);
                l.imageData.ClearData(new PixelData()
                {
                    r = 255, g = 255, b = 255, a = 0
                });
                break;

            case ImageTypes.SingleColor:
                l      = new SingleColorImage(255, 255, 255, 255);
                l.Rect = new IBRectangle(1920 + 300, 1080 + 300, -150, -150);
                break;

            case ImageTypes.Pixel:
                l = new PixcelImage();
                break;

            default:
                break;
            }

            if (l == null)
            {
                return;
            }

            l.LayerName       = name;
            l.LayerType       = type;
            l.IsSelectedLayer = true;
            l.owner           = this;
            l.imageData.TextureUpdate();

            foreach (IBImage i in Layers)
            {
                if (i.IsSelectedLayer)
                {
                    i.IsSelectedLayer = false;
                    int index = Layers.IndexOf(i);
                    Layers.Insert(index, l);

                    if (RURecord)
                    {
                        RedoUndoManager.Current.Record(new RUAddNewLayer(this, l));
                    }

                    return;
                }
            }

            if (RURecord)
            {
                RedoUndoManager.Current.Record(new RUAddNewLayer(this, l));
            }

            Layers.Insert(0, l);
        }
Exemple #11
0
 public RUAddNewLayer(CellSource owner, IBImage newLayer)
 {
     Owner    = owner;
     trgLayer = newLayer;
     index    = Owner.Layers.IndexOf(trgLayer);
 }
Exemple #12
0
        private void EraseCircle(IBImage trg, double x, double y, double r)
        {
            if (r < 0.001)
            {
                return;
            }

            int imageW = (int)trg.imageData.actualSize.Width;
            int imageH = (int)trg.imageData.actualSize.Height;

            byte[] data   = trg.imageData.data;
            int    stride = imageW * 4;

            int xs = (int)Math.Floor(x - r);
            int xe = (int)Math.Floor(x + r);
            int ys = (int)Math.Floor(y - r);
            int ye = (int)Math.Floor(y + r);

            if (xs < 0)
            {
                xs = 0;
            }
            if (ys < 0)
            {
                ys = 0;
            }
            if (xe >= imageW)
            {
                xe = imageW - 1;
            }
            if (ye >= imageH)
            {
                ye = imageH - 1;
            }

            RecordDrawArea(xs, ys, xe, ye);

            double r2     = r * r;
            double sample = 4.0;

            for (int yi = ys; yi <= ye; yi++)
            {
                int offset = yi * stride;
                int xp     = xs * 4;

                for (int xi = xs; xi <= xe; xi++)
                {
                    int c = 0;

                    for (int _yi = 0; _yi < sample; _yi++)
                    {
                        double yy = yi - y + _yi / sample;

                        for (int _xi = 0; _xi < sample; _xi++)
                        {
                            double xx = xi - x + _xi / sample;

                            if (xx * xx + yy * yy < r2)
                            {
                                c++;
                            }
                        }
                    }

                    if (c != 0)
                    {
                        //data[offset + xp] = color.b;
                        //data[offset + xp + 1] = color.g;
                        //data[offset + xp + 2] = color.r;

                        int a = data[offset + xp + 3] - ((255 * c) >> 4);
                        if (a < 0)
                        {
                            a = 0;
                        }
                        data[offset + xp + 3] = a < data[offset + xp + 3] ? (byte)a : data[offset + xp + 3];
                    }

                    xp += 4;
                }
            }
        }
Exemple #13
0
 public override void CopyTo(IBImage i)
 {
     i = new PixcelImage();
     base.CopyTo(i);
 }