xod

Members
  • Content Count

    613
  • Joined

  • Last visited

  • Days Won

    15

Posts posted by xod


  1. BoltBait explains in the Creative Text Pro v1.0 plugin code:

    // For older Paint.NET use this line instead of the next:
    // Rectangle selection = EnvironmentParameters.GetSelection(srcBounds).GetBoundsInt();
       Rectangle selection = EnvironmentParameters.SelectionBounds;

    So, you did the right thing: Paint.net update.


  2. In the old plugins that did not have this option it is sufficient to add this line after // URL: and // Help:
    // Force Single Render Call

     

    Now if you are curious to see the code created, click on View Source when you build the plugin and see that the line has been added automatically.

     

    public YourNameEffectPlugin ()
                 : base (StaticName, StaticIcon, SubmenuName, new EffectOptions () {Flags = EffectFlags.Configurable, RenderingSchedule = EffectRenderingSchedule.None})
             {
             }

    • Upvote 1

  3. 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


  4. 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

  5. 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