Jump to content

xod

Members
  • Posts

    632
  • Joined

  • Last visited

  • Days Won

    20

Posts posted by xod

  1. This plugin allows you to write text along a curve.
    There are only four control points.
    The plugin is located in Effects -> Text Formations.

    As usual, you need the two OptionBasedLibrary v0.7.9.dlc and OptionBasedLibrary v0.7.9.dll files.

     

    iz023wv.png

     

     

    Download

    • Like 4
    • Upvote 1
  2. The code below provides information about the object on the canvas.
    It seems to work correctly in all situations where the object is on a transparent layer and even if the layer is full of color.
    However, if I have an filled area of 10000x7500px and even for smaller values of the surface containing a transparent vertical strip as in the image below, the error 'A new guard page for the stack cannot be created' appears and Pdn crashes.
    I can't figure out how to solve this.

    Spoiler
    
    // Name: MeasureTheObject
    // Submenu:
    // Author:
    // Title: MeasureTheObject
    // Version:
    // Desc:
    // Keywords:
    // URL:
    // Help:
    
    #region UICode
    ColorWheelControl Amount1 = ColorBgra.FromBgr(0,0,0); // [PrimaryColor!] Font color
    DoubleSliderControl Amount2 = 0.75; // [0.1,5] Font scale
    CheckboxControl Amount3 = false; // [0,1] Bounding box of object
    #endregion
    
    private PdnRegion _measureObject;
    public int x, y, x1, xp1, xp2, yp1, yp2, y1, x2, y2, cx, cy, xPos, yPos, newx, newy, sTop, sBot, sLeft, sRite, width, height, _canvasWidth, _canvasHeight;
    
    void Render(Surface dst, Surface src, Rectangle rect)
    {
        Rectangle sel = EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt();
        Size selSize = EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt().Size;
        _canvasWidth = selSize.Width;
        _canvasHeight = selSize.Height;
        sTop = sel.Top;
        sBot = sel.Bottom;
        sLeft = sel.Left;
        sRite = sel.Right;
    
        int fontH = (int)(Amount2 * sel.Height/50);
        int fontHoffset = fontH + fontH/2;
    
        GetMeasureOfObject();
        Rectangle obj = _measureObject.GetBoundsInt();
        x1 = obj.Left;
        y1 = obj.Top;
        x2 = obj.Right - 1;
        y2 = obj.Bottom - 1;
        width = obj.Width;
        height = obj.Height;
    
        Point topLeftCorner = new Point (x1, y1);
        Point topRiteCorner = new Point (x2, y1);
        Point botLeftCorner = new Point (x1, y2);
        Point botRiteCorner = new Point (x2, y2);
    
        int cx = x1 + width/2;
        int cy = y1 + height/2;
    
        dst.CopySurface(src, rect.Location,rect);
        using (Font txtFont = new Font("Tahoma", fontH, FontStyle.Regular))
        using (SolidBrush txtBrush = new SolidBrush(Amount1))
        using (SolidBrush fillBrush = new SolidBrush(Color.FromArgb(64,255,0,0)))
        using (Pen pen = new Pen(Color.Red, 1))
        using (RenderArgs ra = new RenderArgs(dst))
        {
            Graphics g = ra.Graphics;
            g.Clip = new Region(rect);
            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.TextRenderingHint = TextRenderingHint.AntiAlias;
            StringFormat format = new StringFormat();
            format.Alignment = StringAlignment.Near;
            format.LineAlignment = StringAlignment.Near;
    
            if(width == 0 || height == 0)
            {
                g.DrawString("Empty layer. There is no object.", txtFont, txtBrush, topLeftCorner, format);
            }
            else if(width == _canvasWidth && height == _canvasHeight)
            {
                g.DrawString("The object has the size of the layer.", txtFont, txtBrush, topLeftCorner, format);
            }
            else
            {
                //topleft corner
                format.Alignment = StringAlignment.Near;
                format.LineAlignment = StringAlignment.Near;
                g.DrawString("x:" + x1.ToString(), txtFont, txtBrush, topLeftCorner, format);
                g.DrawString("y:" + y1.ToString(), txtFont, txtBrush, x1, y1 + fontHoffset, format);
    
                //top right corner
                format.Alignment = StringAlignment.Far;
                format.LineAlignment = StringAlignment.Near;
                g.DrawString("x:" + x2.ToString(), txtFont, txtBrush, topRiteCorner, format);
                g.DrawString("y:" + y1.ToString(), txtFont, txtBrush, x2, y1 + fontHoffset, format);
    
                //bottom right corner
                format.Alignment = StringAlignment.Far;
                format.LineAlignment = StringAlignment.Far;
                g.DrawString("x:" + x2.ToString(), txtFont, txtBrush, x2, y2 - fontHoffset, format);
                g.DrawString("y:" + y2 .ToString(), txtFont, txtBrush, botRiteCorner, format);
    
                //bottom left corner
                format.Alignment = StringAlignment.Near;
                format.LineAlignment = StringAlignment.Far;
                g.DrawString("x:" + x1.ToString(), txtFont, txtBrush, x1, y2 - fontHoffset, format);
                g.DrawString("y:" + y2.ToString(), txtFont, txtBrush, botLeftCorner, format);
    
                //width and height
                format.Alignment = StringAlignment.Center;
                format.LineAlignment = StringAlignment.Center;
                g.DrawString("width:" + width.ToString() + "px", txtFont, txtBrush, cx, cy, format);
                g.DrawString("height:" + height.ToString() + "px", txtFont, txtBrush, cx, cy + fontHoffset, format);
    
                if(Amount3)
                {
                    //g.DrawRectangle (pen, x1, y1, width, height);
                    g.FillRectangle(fillBrush, x1, y1, width, height);
                }
            }
        }
    }
    
    private void  GetMeasureOfObject()
    {
        if (_measureObject == null)
        {
            Surface src = EnvironmentParameters.SourceSurface;
            Rectangle sel = EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt();
            int left = sel.Left;
            int right = sel.Right;
            int top = sel.Top;
            int bottom = sel.Bottom;
            _measureObject = new PdnRegion(Rectangle.Empty);
    
            for (int y = top; y < bottom; y++)
            {
                for (int x = left; x < right; x++)
                {
                    if (src[x, y].A > 0)
                    {
                        int xinit = x;
                        do
                        {
                            x++;
                        }
                        while (x < right && src[x, y].A > 0);
                        _measureObject.Union(new Rectangle(xinit, y, x - xinit, 1));
                    }
                }
            }
        }
    }

     

     

    exjdMMu.png

  3. You must to split the text in 2 section before run Trail.
    1. Run Text Distortion into one empty layer an type ..........KAT (10 dots before)
        the setings is:
    B6405cX.png]

    2. Run Text Distortion into another one empty layer an type LEEN..........(10 dots after)
        the setings is:
    HfOGELv.png

    3. Cut the dots into the both layers using Rectangle Select tool
    4. Outline the text 1 pixel
    5. Run Trail plugin in the KAT text layer with default settings and uncheck Fade out
    6. Run Trail plugin in the LEEN text layer, change direction to 180 degree and uncheck Fade out
    7. Merge layer down

     IcaANMU.png

    • Like 1
    • Upvote 2
  4. I updated the Align + plugin. See the first post.

     

    The code below does not belong to me, I just adapted it for PDN.

    Spoiler
    
    // Name: ShapesPattern
    // Submenu: Render
    // Author: Rod Stephens
    // Title: ShapesPattern
    // Version: 1.0
    // Desc:
    // Keywords:
    // URL:
    // Help:
    
    #region UICode
    IntSliderControl Amount1 = 20; // [3,20] Shape sides
    DoubleSliderControl Amount2 = 90; // [0,200] Offset
    IntSliderControl Amount3 = 1; // [0,5] Repeat shape
    DoubleSliderControl Amount4 = 1; // [0.05,10] Shape size
    AngleControl Amount5 = 90; // [-180,180] Rotate
    ColorWheelControl Amount6 = ColorBgra.FromBgra(0,0,255,64); // [Red?] Color
    IntSliderControl Amount7 = 1; // [0,10] Outline thickness
    CheckboxControl Amount8 = false; // [0,1] Clear background
    CheckboxControl Amount9 = false; // [0,1] Fill polygons (Decrease Alpha slider)
    #endregion
    
    void Render(Surface dst, Surface src, Rectangle rect)
    {
        Rectangle selection = EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt();
        dst.CopySurface(src,rect.Location,rect);
        int CenterX = ((selection.Right - selection.Left) / 2) + selection.Left;
        int CenterY = ((selection.Bottom - selection.Top) / 2) + selection.Top;
    
        using (Graphics g = new RenderArgs(dst).Graphics)
        using (Region gClipRegion = new Region(rect))
        using (SolidBrush brush = new SolidBrush(Amount6))
        using (Pen pen = new Pen(Amount6, (float)Amount7))
        {
            g.Clip = gClipRegion;
            g.SmoothingMode = SmoothingMode.AntiAlias;
            if(Amount8) g.Clear(Color.Transparent);
    
            PointF center = new PointF(CenterX, CenterY);
            float radius = Math.Min(CenterX, CenterY) * (float)Amount4;
            DrawShape(Amount3, g, brush, pen, center, radius);
            //g.DrawEllipse(Pens.Blue, CenterX - radius, CenterY - radius, 2 * radius, 2 * radius);
        }
    }
    // Draw the shape.
    private void DrawShape(int Amount3, Graphics g, SolidBrush brush, Pen pen, PointF center, float radius)
    {
        float scale = (float)(1.0 / (2.0 * (1 + Math.Cos(Math.PI/180 * Amount2))));
        // If we are done recursing, draw the shape.
        if (Amount3 <= 0)
        {
            // Find the shape's corners.
            PointF[] points = GetShapePoints(center, radius);
            if(Amount9){g.FillPolygon(brush, points);}
            if(Amount7 > 0) {g.DrawPolygon(pen, points);}
        }
        else
        {
            // Find the smaller shape's centers.
            float d = radius - radius * scale;
            PointF[] centers = GetShapePoints(center, d);
    
            // Recursively draw the smaller shapes.
            foreach (PointF point in centers)
            {
                DrawShape(Amount3 - 1, g, brush, pen, point, radius * scale);
            }
        }
    }
    
    // Find the shape's corners.
    private PointF[] GetShapePoints(PointF center, float radius)
    {
        PointF[] points = new PointF[Amount1];
        double theta = -Math.PI / 2 * Math.PI / 180 * Amount5 / Math.PI * 2;
        double dtheta = 2.0 * Math.PI / Amount1;
        for (int i = 0; i < Amount1; i++)
        {
            points[i] = new PointF( center.X + (float)(radius * Math.Cos(theta)), center.Y + (float)(radius * Math.Sin(theta)));
            theta += dtheta;
        }
        return points;
    }

     

     

    • Like 3
  5. This is an experimental plugin.
    You need the two OptionBasedLibrary v0.7.9 files.


    You can place it where you want by editing the Align+.dlc file.
    In order to do that you need to change the extension to .txt

    Open it with Notepad and edit the line:
    AlignEffectPlugin.SubmenuName=your choise
    Save and change the extension to .dlc

     

    6OkvgBv.png

     

    AlignPlus.zip

    • Like 2
    • Upvote 2
  6. Effects ► Color ► Unblend plugin crashes PDN if I run it on this image:
    https://www.mediafire.com/file/sspp3e96h7g0pbm/H.zip/file

    The plugin can be found here:
    https://forums.getpaint.net/topic/32165-unblend/


    Exception details:

    System.InvalidOperationException: A task may only be disposed if it is in a completion state (RanToCompletion, Faulted or Canceled).

       at System.Threading.Tasks.Task.Dispose(Boolean disposing)

       at System.Threading.Tasks.Task.Dispose()

       at ArgusPDN.Unblend.UnblendEffect.OnDispose(Boolean disposing)

       at PaintDotNet.Menus.EffectMenuBase.RunEffectImpl(Type effectType) in D:\src\pdn\src\PaintDotNet\Menus\EffectMenuBase.cs:line 1171

       at PaintDotNet.Menus.EffectMenuBase.TryRunEffect(Type effectType) in D:\src\pdn\src\PaintDotNet\Menus\EffectMenuBase.cs:line 773

       at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)

       at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)

       at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)

       at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)

       at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)

       at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)

       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)

       at System.Windows.Forms.Control.WndProc(Message& m)

       at System.Windows.Forms.ToolStrip.WndProc(Message& m)

       at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)

       at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

  7. It seems like I made a big mistake erasing the files in the Temp folder. Now I get other errors:

    The file 'C:\Users\username\AppData\Local\Temp\msivfglx.err' already exists.
    The file 'C:\Users\username\AppData\Local\Temp\msivfglx.out' already exists.
    Could not find file 'C:\Users\username\AppData\Local\Temp\0idvvdim.dll'.

    Unhandled Exception at line 0: 
    System.NullReferenceException: Object reference not set to an instance of an object.
       at PreviewEffectEffect.PreviewEffectEffectPlugin.OnSetRenderInfo(PropertyBasedEffectConfigToken newToken, RenderArgs dstArgs, RenderArgs srcArgs)
       at PaintDotNet.Effects.Effect`1.OnSetRenderInfo(EffectConfigToken parameters, RenderArgs dstArgs, RenderArgs srcArgs) in D:\src\pdn\src\Effects\Effect`1.cs:line 68
       at PaintDotNet.Effects.CodeLab.OnSetRenderInfo(EffectConfigToken parameters, RenderArgs dstArgs, RenderArgs srcArgs)
    Could not load file or assembly '0 bytes loaded from System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. An attempt was made to load a program with an incorrect format.

    I ran sfc / scannow and everything seems OK. All other programs run correctly except CodeLab.

     

×
×
  • Create New...