Jump to content

Reptillian

Members
  • Posts

    1,239
  • Joined

  • Last visited

  • Days Won

    18

Posts posted by Reptillian

  1. 36 minutes ago, HCGS said:

    Well. I always use tabs on every language. It's just better. Spaces are slower to work with, can mess indents accidentally and, in general, make no sense at all. I know there's a bunch of code style conventions in C#, but is spaces vs. tabs really one of them? I've been using C# for years and have never heard of this.

     

    If you're not working on team and doing things for yourself, then chances are you might have your own formatting style, and the most important thing is that you are able to modify it later and to get the code right. I work with mixed tabs/spaces with the goal of being able to be read easily from my POV, and it actually deviates from automatic reformatting.

  2. 19 minutes ago, lynxster4 said:

    Haven't a clue how to do this. Can you explain a little more, please?  Thanks.

     

    Full instructions:

     

    1. Duplicate the image into a new layer.

    2. Apply afre's edge detect to the duplicate image.

    3. Copy the edge detect result into clipboard.

    4. Run Alpha Mask into the unaffected layer and have paste from clipboard checkmarked.

    5. Run Axis Streak.

     

    Alpha Mask plugin here ->

     

    • Like 1
  3. 30 minutes ago, Djisves said:

    @Reptillian, thank you for your time and effort in making plugins for all of us to use. I'm sure I'm just one of many who appreciate your trouble and willingness to offer to the community.

    You're welcome.

     

    30 minutes ago, Djisves said:

    So please don't take this the wrong way, but you seem to put a lot of effort into developing and then just not bother how your plugins are received, appreciated or used. You do yourself great dis-justice by not taking the time to write clear and precise instructions for installing your plugins (if the installation is not the standard one - yes, repeat the same "g'mic sharp" instructions for each plugin if necessary), possible limitations, how-to's and examples.

    The thing is that I'm always tired, so all I can honestly do is to leave the plugins out there, and try my best to provide at least the minimum instruction. I just do not want to bother putting more efforts than I want to.

     

    I sometime do provide limitation, like in the OP such as it's not intended to work with non-transparent colored image. It can work with transparent images or non-transparent black and white image.

  4. 18 minutes ago, lynxster4 said:

     

    You may need to explain this. Not everyone is going to understand. Which Edge Detect plugin did you use? I have 2 different ones.

    I was trying to get it to work on rgb images. Works fine on black & white.  Thanks!

     

    I used Afre's edge detect in gmic-qt as it result in black and white edge. Then I assigned it to the alpha channel to rgb image. Yes, the rgb image needs to be transparent for the plugin to work.

     

    It works in non-transparent black and white because I coded the distance mode for Perspective Streak within G'MIC-QT as it works reasonably well because of less variety along alpha, and hence it is part of the plugin. Making it work with non-transparent rgb is out of scope for the plugin as I would need to add edge detection and insert it into alpha.

  5. This plugin streaks pixels along an axis. In non-transparent black and white image, it does more than just streaking, it actually calculate distance away to end and insert it into the canvas. There are 2 options here, the direction to streak pixels, and the exponential factor. It's not meant to work with non-transparent rgb image since there are many edge detection algorithm, so that part is left to you if you want to use it on a non-transparent rgb image. It does work with transparent images regardless of whether it's black and white or colored.

     

    Output of Effect:

     

    xsjeWlO.png

    This was done by two steps.

    1) Edge detect, and then put the output into alpha channel of non-transparent rgb image.

    2) Use Axis Streak

     

    Installation steps:

     

    Note: Check if you have a folder named 'GmicPDN'. If you already had 'GmicSharpNative', and it was updated after 10/27/2021, then you need to create a new folder called 'GmicPDN', and then drag and drop the GmicPDN effect dlls, and `GmicSharpNative` folder. Otherwise, click on this link -> GmicPDN Download and Instruction.

     

    Ensure that the note is taken care of. Then, download the zip, and extract it directly into the Effects folder. ->AxisStreakGmicPdn.zip

     

    It's under Object menu.

     

    G'MIC-PDN Plugin Source code:

     

    Effects.cs

    Spoiler
    #define USE_CLIPBOARD
    
    using GmicSharpPdn;
    using PaintDotNet;
    using PaintDotNet.AppModel;
    using PaintDotNet.Effects;
    using PaintDotNet.IndirectUI;
    using PaintDotNet.PropertySystem;
    using System.Drawing;
    using System.Globalization;
    using System.Reflection;
    using System.Collections.Generic;
    
    #if USE_CLIPBOARD
    using PaintDotNet.Clipboard;
    #endif
    
    namespace GmicPDNPlugin
    {
        [PluginSupportInfo(typeof(PluginSupportInfo))]
        public sealed class GmicPdnPluginEffect : PropertyBasedEffect
        {
            public GmicPdnPluginEffect()
                : base("Axis Streak", StaticIcon, "Object", new EffectOptions { Flags = EffectFlags.Configurable })
            {
            }
    
            public static Image StaticIcon => new Bitmap(typeof(GmicPDNPlugin.GmicPdnPluginEffect), "Icon.png");
    
            public enum PropertyNames
            {
                Val_direction,
                Val_alp_exp_fact
            }
    
            public enum Val_directionOptions
            {
                Up,
                Down,
                Left,
                Right
            }
    
            protected override PropertyCollection OnCreatePropertyCollection()
            {
                Property[] props = new Property[]
                {
                    StaticListChoiceProperty.CreateForEnum<Val_directionOptions>(PropertyNames.Val_direction, 0, false),
                    new DoubleProperty(PropertyNames.Val_alp_exp_fact, 0, -100, 500)
                };
    
                return new PropertyCollection(props);
    
            }
    
    
    
            protected override ControlInfo OnCreateConfigUI(PropertyCollection props)
            {
                ControlInfo configUI = CreateDefaultConfigUI(props);
    
                configUI.SetPropertyControlValue(PropertyNames.Val_direction, ControlInfoPropertyNames.DisplayName, "Direction");
                configUI.SetPropertyControlType(PropertyNames.Val_direction, PropertyControlType.RadioButton);
                PropertyControlInfo Val_directionControl = configUI.FindControlForPropertyName(PropertyNames.Val_direction);
                Val_directionControl.SetValueDisplayName(Val_directionOptions.Up, "Up");
                Val_directionControl.SetValueDisplayName(Val_directionOptions.Down, "Down");
                Val_directionControl.SetValueDisplayName(Val_directionOptions.Left, "Left");
                Val_directionControl.SetValueDisplayName(Val_directionOptions.Right, "Right");
                configUI.SetPropertyControlValue(PropertyNames.Val_alp_exp_fact, ControlInfoPropertyNames.DisplayName, "Alpha Exponential Factor (%)");
                configUI.SetPropertyControlValue(PropertyNames.Val_alp_exp_fact, ControlInfoPropertyNames.SliderLargeChange, 0.25);
                configUI.SetPropertyControlValue(PropertyNames.Val_alp_exp_fact, ControlInfoPropertyNames.SliderSmallChange, 0.05);
                configUI.SetPropertyControlValue(PropertyNames.Val_alp_exp_fact, ControlInfoPropertyNames.UpDownIncrement, 0.01);
                configUI.SetPropertyControlValue(PropertyNames.Val_alp_exp_fact, ControlInfoPropertyNames.DecimalPlaces, 3);
    
                return configUI;
            }
    
            protected override void OnCustomizeConfigUIWindowProperties(PropertyCollection props)
            {
                // Add help button to effect UI
                props[ControlInfoPropertyNames.WindowTitle].Value = "Axis Streak - G'MIC";
                props[ControlInfoPropertyNames.WindowHelpContentType].Value = WindowHelpContentType.PlainText;
    
                Assembly assembly = typeof(GmicPdnPluginEffect).Assembly;
    
                string fileVersion = assembly.GetCustomAttribute<AssemblyFileVersionAttribute>().Version;
                string copyright = assembly.GetCustomAttribute<AssemblyCopyrightAttribute>().Copyright;
    
                props[ControlInfoPropertyNames.WindowHelpContent].Value = $"Axis Streak - GmicPDN v{ fileVersion }\n\n{ copyright }\nAll rights reserved.";
    
                base.OnCustomizeConfigUIWindowProperties(props);
            }
    
            protected override void OnSetRenderInfo(PropertyBasedEffectConfigToken newToken, RenderArgs dstArgs, RenderArgs srcArgs)
            {
                int cardinal_direction = (byte)(int)newToken.GetProperty<StaticListChoiceProperty>(PropertyNames.Val_direction).Value;
                double expf = newToken.GetProperty<DoubleProperty>(PropertyNames.Val_alp_exp_fact).Value / 100;
                int val_axial_direction = cardinal_direction % 2;
                bool axial_direction = val_axial_direction == 1;
                int orientation, direction;
    
                if (cardinal_direction < 2)
                {
                    orientation = 1;
    
                    if (axial_direction)
                    {
                        direction = 0;
                    }
                    else
                    {
                        direction = 1;
                    }
    
                }
                else
                {
                    orientation = 0;
    
                    if (axial_direction)
                    {
                        direction = 1;
                    }
                    else
                    {
                        direction = 0;
                    }
    
                }
    
                using (PdnGmicSharp gmic = new PdnGmicSharp())
                {
                    // Add the source surface as the first input image.
                    using (PdnGmicBitmap source = new PdnGmicBitmap(srcArgs.Surface))
                    {
                        gmic.AddInputImage(source);
                    }
    
                    // The following code demonstrates adding an image
                    // from the clipboard as a second G'MIC surface.
    
                    string command = string.Format(CultureInfo.InvariantCulture,
                                                   "if s==3 return fi\n" +
                                                   "if s>1\n" +
                                                   " vv=0\n" +
                                                   " repeat s\n" +
                                                   "  sh $>\n" +
                                                   "  vv+={{iv#-1}}\n" +
                                                   "  rm.\n" +
                                                   " done\n" +
                                                   " if !$vv break fi\n" +
                                                   " sh. 0,{{s-2}}\n" +
                                                   " sh.. {{s}}\n" +
                                                   " f.. i#-1?I\n" +
                                                   " /. 255\n" +
                                                   " if {2}<=-1 exp_f=-{{1-10^-8}} else exp_f={2} fi\n" +
                                                   " f. i^(1+$exp_f)\n" +
                                                   " if {0}\n" +
                                                   "  outdata_dim={{w}},1,{{d}},{{s#0}}\n" +
                                                   "  outdata_coords=x,yy\n" +
                                                   "  if {1} direction=yy=hh-1,yy>=0,yy--\n" +
                                                   "  else direction=yy=0,yy<hh,yy++ fi\n" +
                                                   " else\n" +
                                                   "  outdata_dim=1,{{h}},{{d}},{{s#0}}\n" +
                                                   "  outdata_coords=xx,y\n" +
                                                   "  if {1} direction=xx=0,xx<ww,xx++\n" +
                                                   "  else direction=xx=ww-1,xx>=0,xx-- fi\n" +
                                                   " fi\n" +
                                                   " $outdata_dim,\":begin(" +
                                                   "  const ww=w#0;" +
                                                   "  const hh=h#0;" +
                                                   " );" +
                                                   " start_val=1;" +
                                                   " for(\"$direction\"," +
                                                   "  start_val?(" +
                                                   "   start_val=0;" +
                                                   "   col=I(#-2,\"$outdata_coords\");" +
                                                   "   alp=i(#-1,\"$outdata_coords\",z,0);" +
                                                   "   temp=[col,alp];" +
                                                   "  ):(" +
                                                   "   newcol=I(#-2,\"$outdata_coords\");" +
                                                   "   newalp=i(#-1,\"$outdata_coords\",z,0);" +
                                                   "   newinfo=[newcol,newalp];" +
                                                   "   !newalp?(I(#0,\"$outdata_coords\")=temp;):" +
                                                   "   newalp==1?(temp=newinfo;" +
                                                   "   ):(" +
                                                   "    col=newcol*newalp+(1-newalp)*col;" +
                                                   "    alp=alp+newalp*(1-alp);" +
                                                   "    temp=[col,alp];" +
                                                   "    I(#0,\"$outdata_coords\")=temp;" +
                                                   "   );" +
                                                   "  );" +
                                                   " );\"\n" +
                                                   " rm[1-3]\n" +
                                                   " sh. {{s-1}} *. 255 rm.\n" +
                                                   "else\n" +
                                                   " sh {{s-1}}\n" +
                                                   " if !iv#-1 rm. break else rm. fi\n" +
                                                   " / 255\n" +
                                                   " if {2}<=-1 exp_f={{1-10^-8}} else exp_f={2} fi\n" +
                                                   " f i^(1+$exp_f)\n" +
                                                   " if {0}\n" +
                                                   "  outdata_dim={{w}},1,{{d}},1\n" +
                                                   "  outdata_coords=x,yy\n" +
                                                   "  outdata_dimref=hh\n" +
                                                   "  outdata_pos=yy\n" +
                                                   "  if {1}\n" +
                                                   "   direction=yy=hh,yy>0,yy--\n" +
                                                   "   end_level=yy\n" +
                                                   "  else\n" +
                                                   "   direction=yy=0,yy<hh,yy++\n" +
                                                   "   end_level=(hh-yy)\n" +
                                                   "  fi\n" +
                                                   " else\n" +
                                                   "  outdata_dim=1,{{h}},{{d}},1\n" +
                                                   "  outdata_coords=xx,y\n" +
                                                   "  outdata_dimref=ww\n" +
                                                   "  outdata_pos=xx\n" +
                                                   "  if {1}\n" +
                                                   "   direction=xx=0,xx<ww,xx++\n" +
                                                   "   end_level=(ww-xx)\n" +
                                                   "  else\n" +
                                                   "   direction=xx=ww,xx>0,xx--\n" +
                                                   "   end_level=xx\n" +
                                                   "  fi\n" +
                                                   " fi\n" +
                                                   "  $outdata_dim,\"begin(" +
                                                   "   const ww=w#0-1;" +
                                                   "   const hh=h#0-1;" +
                                                   "  );" +
                                                   "  mode=0;" +
                                                   "  for(\"$direction\"," +
                                                   "   imgval=i(#-1,\"$outdata_coords\");" +
                                                   "   !mode?(imgval?mode=1;);" +
                                                   "   mode==1?(z_level=\"$outdata_dimref\";mode=2;alp=imgval;);" +
                                                   "   mode==2?(" +
                                                   "    alp=alp+(1-alp)*imgval;" +
                                                   "    z_level=\"$end_level\"*imgval+(1-imgval)*z_level;" +
                                                   "    i(#-1,\"$outdata_coords\")=\"$end_level\"/z_level*alp;" +
                                                   "   );" +
                                                   "  );\"" +
                                                   " rm.\n" +
                                                   " * 255\n" +
                                                   "fi",
                                                   orientation.ToString(CultureInfo.InvariantCulture),
                                                   direction.ToString(CultureInfo.InvariantCulture),
                                                   expf.ToString(CultureInfo.InvariantCulture));
    
                    // Run the G'MIC command and allow it to receive cancellation info from Paint.NET.
                    gmic.RunGmic(command, () => this.IsCancelRequested);
    
                    if (gmic.Error != null)
                    {
                        this.Services.GetService<IExceptionDialogService>().ShowErrorDialog(null, gmic.Error);
                    }
                    else if (!gmic.Canceled)
                    {
                        Surface output = gmic.OutputImages?[0]?.Surface;
    
                        if (output != null)
                        {
                            // Copy the rendered G'MIC image to the destination surface,
                            // and restrict the copied portions to the user's selection.
                            dstArgs.Surface.CopySurface(output, this.EnvironmentParameters.GetSelectionAsPdnRegion());
                        }
                    }
                }
    
                base.OnSetRenderInfo(newToken, dstArgs, srcArgs);
            }
    
            protected override void OnRender(Rectangle[] renderRects, int startIndex, int length)
            {
                // All work is performed in OnSetRenderInfo.
            }
        }
    }

     

     

    PluginSupportInfo.cs

    Spoiler
    ////////////////////////////////////////////////////////////////////////
    //
    // This file is part of gmic-sharp-pdn-example, an example Paint.NET
    // Effect plugin that uses the gmic-sharp-pdn library.
    //
    // Copyright (c) 2020 Nicholas Hayes
    //
    // This file is licensed under the MIT License.
    // See LICENSE.txt for complete licensing and attribution information.
    //
    ////////////////////////////////////////////////////////////////////////
    
    using PaintDotNet;
    using System;
    using System.Reflection;
    
    namespace GmicPDNPlugin
    {
        public class PluginSupportInfo : IPluginSupportInfo
        {
            private readonly Assembly assembly = typeof(PluginSupportInfo).Assembly;
    
            public string Author => "Reptorian\nG'MIC# Author : Nicholas Hayes and David Tschumperlé";
    
            public string Copyright => "Copyright © 2021 Reptorian, Nicholas Hayes and David Tschumperlé";
    
            public string DisplayName => this.assembly.GetCustomAttribute<AssemblyProductAttribute>().Product;
    
            public Version Version => this.assembly.GetName().Version;
    
            public Uri WebsiteUri => new Uri("https://forums.getpaint.net/topic/116417-gmicsharppdn");
        }
    }

     

     

    AssemblyInfo.cs

     

    Spoiler
    ////////////////////////////////////////////////////////////////////////
    //
    // This file is part of gmic-sharp-pdn-example, an example Paint.NET
    // Effect plugin that uses the gmic-sharp-pdn library.
    //
    // Copyright (c) 2020 Nicholas Hayes
    //
    // This file is licensed under the MIT License.
    // See LICENSE.txt for complete licensing and attribution information.
    //
    ////////////////////////////////////////////////////////////////////////
    
    using System.Reflection;
    using System.Runtime.InteropServices;
    using System.Runtime.Versioning;
    
    // General Information about an assembly is controlled through the following
    // set of attributes. Change these attribute values to modify the information
    // associated with an assembly.
    [assembly: AssemblyTitle("Superimposes duplicates at a distance, and at equal angles onto canvas.")]
    [assembly: AssemblyDescription("")]
    [assembly: AssemblyConfiguration("")]
    [assembly: AssemblyCompany("Reptorian")]
    [assembly: AssemblyProduct("Axis Streak - GmicPDN")]
    [assembly: AssemblyCopyright("Copyright © 2021 Reptorian, Nicholas Hayes and David Tschumperlé")]
    [assembly: AssemblyTrademark("")]
    [assembly: AssemblyCulture("")]
    
    // Setting ComVisible to false makes the types in this assembly not visible
    // to COM components.  If you need to access a type in this assembly from
    // COM, set the ComVisible attribute to true on that type.
    [assembly: ComVisible(false)]
    
    // The following GUID is for the ID of the typelib if this project is exposed to COM
    [assembly: Guid("fbfe3f2e-91cb-40c7-bdd9-aace796d52dc")]
    
    [assembly: SupportedOSPlatform("windows")]
    
    // Version information for an assembly consists of the following four values:
    //
    //      Major Version
    //      Minor Version
    //      Build Number
    //      Revision
    //
    // You can specify all the values or you can default the Build and Revision Numbers
    // by using the '*' as shown below:
    // [assembly: AssemblyVersion("1.0.*")]
    [assembly: AssemblyVersion("1.0.6")]
    [assembly: AssemblyFileVersion("1.0.6")]

     

     

    EDIT as of 12/01/21: Update into .NET 6.

    • Like 1
    • Upvote 1
  6. Ah, I still need to learn break, return, etc commands.

     

    Here's the new dll ->

     

    It only works on transparent image or a non-transparent gray image. I don't know what to do for 3 channel and it does not make sense to enable it for 3 channel considering what it does is to streak pixels along axis.

  7. Decided to post this thread as while I did the suggestion that null54 has done, it didn't work to any avail.

     

    The png file is a embedded resource.

     

    It's located in here -> C:\gmic-pdn\gmic-tiled-form\src\TiledFormIcon.png

     

    I tested namespace property, it didn't work.

     

    I wanted to load a icon into Tiled Form project. Here's the current code:

     

    Spoiler
    
    
    
    #define USE_CLIPBOARD
    
    using GmicSharpPdn;
    using PaintDotNet;
    using PaintDotNet.AppModel;
    using PaintDotNet.Effects;
    using PaintDotNet.IndirectUI;
    using PaintDotNet.PropertySystem;
    using System.Drawing;
    using System.Globalization;
    using System.Reflection;
    using System.Collections.Generic;
    
    #if USE_CLIPBOARD
    using PaintDotNet.Clipboard;
    #endif
    
    namespace Tiled_Form
    {
        [PluginSupportInfo(typeof(PluginSupportInfo))]
        public sealed class TiledFormGmicPdnPlugin : PropertyBasedEffect
        {
    
            public TiledFormGmicPdnPlugin()
                : base("Tiled Form", new Bitmap(typeof(TiledFormGmicPdnPlugin),"TiledFormIcon.png"), SubmenuNames.Stylize, new EffectOptions { Flags = EffectFlags.Configurable })
            {
            }
    
            private enum PropertyNames
            {
                Cs_mode,
                Pretile_mode,
                Use_clipboard_as_tile,
                Shape_w,
                Shape_h,
                Shape_ratio,
                Shape_ang,
                Shape_axis,
                Sub,
                Zconv_Factor,
                Zconv_Boundary,
                Interp,
                Tile_b,
                Preprocess,
                Fit_tile,
                Points,
                Thickness
            }
    
            public enum Cs_modeOptions
            {
                Cs_modeOption1,
                Cs_modeOption2,
                Cs_modeOption3,
                Cs_modeOption4,
                Cs_modeOption5,
                Cs_modeOption6,
                Cs_modeOption7,
                Cs_modeOption8,
                Cs_modeOption9
            }
    
            public enum Pretile_modeOptions
            {
                Pretile_modeOption1,
                Pretile_modeOption2,
                Pretile_modeOption3,
                Pretile_modeOption4,
                Pretile_modeOption5,
                Pretile_modeOption6,
                Pretile_modeOption7,
                Pretile_modeOption8,
                Pretile_modeOption9,
                Pretile_modeOption10,
                Pretile_modeOption11,
                Pretile_modeOption12,
                Pretile_modeOption13,
                Pretile_modeOption14,
                Pretile_modeOption15,
                Pretile_modeOption16,
                Pretile_modeOption17,
                Pretile_modeOption18,
                Pretile_modeOption19,
                Pretile_modeOption20,
                Pretile_modeOption21,
                Pretile_modeOption22
            }
    
            public enum Shape_axisOptions
            {
                Shape_axisOption1,
                Shape_axisOption2,
                Shape_axisOption3
            }
    
            public enum Zconv_BoundaryOptions
            {
                Zconv_BoundaryOption1,
                Zconv_BoundaryOption2,
            }
    
            public enum InterpOptions
            {
                InterpOption1,
                InterpOption2,
                InterpOption3,
                InterpOption4,
                InterpOption5
            }
    
            public enum Tile_bOptions
            {
                Tile_bOption1,
                Tile_bOption2,
                Tile_bOption3,
                Tile_bOption4
            }
    
            public enum PreprocessOptions
            {
                PreprocessOption1,
                PreprocessOption2,
                PreprocessOption3
            }
    
            protected override PropertyCollection OnCreatePropertyCollection()
            {
                Property[] props = new Property[]
                {
                    StaticListChoiceProperty.CreateForEnum<Cs_modeOptions>(PropertyNames.Cs_mode,(Cs_modeOptions)7,false),
                    StaticListChoiceProperty.CreateForEnum<Pretile_modeOptions>(PropertyNames.Pretile_mode,(Pretile_modeOptions)5,false),
                    new BooleanProperty(PropertyNames.Use_clipboard_as_tile, false),
                    new Int32Property(PropertyNames.Shape_w, 30, 0, 512),
                    new Int32Property(PropertyNames.Shape_h, 30, 0, 512),
                    new DoubleProperty(PropertyNames.Shape_ratio, 100, .1, 100),
                    new DoubleProperty(PropertyNames.Shape_ang, 0, -180, 180),
                    StaticListChoiceProperty.CreateForEnum<Shape_axisOptions>(PropertyNames.Shape_axis,0,false),
                    new DoubleProperty(PropertyNames.Sub, 1, .5, 2),
                    new DoubleProperty(PropertyNames.Zconv_Factor, 75, 0, 200),
                    StaticListChoiceProperty.CreateForEnum<Zconv_BoundaryOptions>(PropertyNames.Zconv_Boundary,0,false),
                    StaticListChoiceProperty.CreateForEnum<InterpOptions>(PropertyNames.Interp,(InterpOptions)4,false),
                    StaticListChoiceProperty.CreateForEnum<Tile_bOptions>(PropertyNames.Tile_b,0,false),
                    StaticListChoiceProperty.CreateForEnum<PreprocessOptions>(PropertyNames.Preprocess,0,false),
                    new BooleanProperty(PropertyNames.Fit_tile, true),
                    new Int32Property(PropertyNames.Points, 5, 1, 100),
                    new DoubleProperty(PropertyNames.Thickness, 38, .1, 100)
                };
    
                List<PropertyCollectionRule> propRules = new List<PropertyCollectionRule>();
    
                propRules.Add(new ReadOnlyBoundToValueRule<object, StaticListChoiceProperty>(PropertyNames.Thickness, PropertyNames.Pretile_mode, Pretile_modeOptions.Pretile_modeOption22, true));
                propRules.Add(new ReadOnlyBoundToBooleanRule(PropertyNames.Thickness, PropertyNames.Use_clipboard_as_tile, false));
                propRules.Add(new ReadOnlyBoundToBooleanRule(PropertyNames.Pretile_mode, PropertyNames.Use_clipboard_as_tile, false));
                propRules.Add(new ReadOnlyBoundToValueRule<object, StaticListChoiceProperty>(PropertyNames.Points, PropertyNames.Pretile_mode, new object[] { Pretile_modeOptions.Pretile_modeOption18, Pretile_modeOptions.Pretile_modeOption21, Pretile_modeOptions.Pretile_modeOption22 }, true));
                propRules.Add(new ReadOnlyBoundToBooleanRule(PropertyNames.Points, PropertyNames.Use_clipboard_as_tile, false));
                propRules.Add(new ReadOnlyBoundToValueRule<double, DoubleProperty>(PropertyNames.Zconv_Boundary, PropertyNames.Zconv_Factor, new[] { 0d }, false));
    
                return new PropertyCollection(props, propRules);
            }
    
            protected override ControlInfo OnCreateConfigUI(PropertyCollection props)
            {
                ControlInfo configUI = CreateDefaultConfigUI(props);
                configUI.SetPropertyControlValue(PropertyNames.Cs_mode, ControlInfoPropertyNames.DisplayName, "Color Space");
                PropertyControlInfo Cs_modeControl = configUI.FindControlForPropertyName(PropertyNames.Cs_mode);
                Cs_modeControl.SetValueDisplayName(Cs_modeOptions.Cs_modeOption1, "RGB");
                Cs_modeControl.SetValueDisplayName(Cs_modeOptions.Cs_modeOption2, "RYB");
                Cs_modeControl.SetValueDisplayName(Cs_modeOptions.Cs_modeOption3, "CMYK");
                Cs_modeControl.SetValueDisplayName(Cs_modeOptions.Cs_modeOption4, "HCY");
                Cs_modeControl.SetValueDisplayName(Cs_modeOptions.Cs_modeOption5, "HSI");
                Cs_modeControl.SetValueDisplayName(Cs_modeOptions.Cs_modeOption6, "HSL");
                Cs_modeControl.SetValueDisplayName(Cs_modeOptions.Cs_modeOption7, "HSV");
                Cs_modeControl.SetValueDisplayName(Cs_modeOptions.Cs_modeOption8, "LAB");
                Cs_modeControl.SetValueDisplayName(Cs_modeOptions.Cs_modeOption9, "LCH");
                configUI.SetPropertyControlValue(PropertyNames.Pretile_mode, ControlInfoPropertyNames.DisplayName, "Tiled Form");
                PropertyControlInfo Pretile_modeControl = configUI.FindControlForPropertyName(PropertyNames.Pretile_mode);
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption1, "Australia");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption2, "Barbed Wire");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption3, "Circle");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption4, "Crosshair");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption5, "Cupid");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption6, "Diamond");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption7, "Dragonfly");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption8, "Flip");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption9, "Gumleaf");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption10, "Heart");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption11, "Information");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption12, "Kookaburra");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption13, "Mail");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption14, "Mapleleaf");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption15, "Paint Splat");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption16, "Paw");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption17, "Phone");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption18, "Polygon (Dynamic)");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption19, "Rooster");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption20, "Shopping Cart");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption21, "Snowflake (Dynamic)");
                Pretile_modeControl.SetValueDisplayName(Pretile_modeOptions.Pretile_modeOption22, "Star (Dynamic)");
                configUI.SetPropertyControlValue(PropertyNames.Use_clipboard_as_tile, ControlInfoPropertyNames.DisplayName, string.Empty);
                configUI.SetPropertyControlValue(PropertyNames.Use_clipboard_as_tile, ControlInfoPropertyNames.Description, "Use Clipboard as Tile?");
                configUI.SetPropertyControlValue(PropertyNames.Shape_w, ControlInfoPropertyNames.DisplayName, "Shape Width");
                configUI.SetPropertyControlValue(PropertyNames.Shape_h, ControlInfoPropertyNames.DisplayName, "Shape Height");
                configUI.SetPropertyControlValue(PropertyNames.Shape_ratio, ControlInfoPropertyNames.DisplayName, "Shape Ratio (%)");
                configUI.SetPropertyControlValue(PropertyNames.Shape_ratio, ControlInfoPropertyNames.SliderLargeChange, 0.25);
                configUI.SetPropertyControlValue(PropertyNames.Shape_ratio, ControlInfoPropertyNames.SliderSmallChange, 0.05);
                configUI.SetPropertyControlValue(PropertyNames.Shape_ratio, ControlInfoPropertyNames.UpDownIncrement, 0.01);
                configUI.SetPropertyControlValue(PropertyNames.Shape_ratio, ControlInfoPropertyNames.DecimalPlaces, 3);
                configUI.SetPropertyControlValue(PropertyNames.Shape_ang, ControlInfoPropertyNames.DisplayName, "Shape Rotation");
                configUI.SetPropertyControlType(PropertyNames.Shape_ang, PropertyControlType.AngleChooser);
                configUI.SetPropertyControlValue(PropertyNames.Shape_ang, ControlInfoPropertyNames.DecimalPlaces, 3);
                configUI.SetPropertyControlValue(PropertyNames.Shape_axis, ControlInfoPropertyNames.DisplayName, "Shape Mirror Axis");
                PropertyControlInfo Shape_axisControl = configUI.FindControlForPropertyName(PropertyNames.Shape_axis);
                Shape_axisControl.SetValueDisplayName(Shape_axisOptions.Shape_axisOption1, "None");
                Shape_axisControl.SetValueDisplayName(Shape_axisOptions.Shape_axisOption2, "X");
                Shape_axisControl.SetValueDisplayName(Shape_axisOptions.Shape_axisOption3, "Y");
                configUI.SetPropertyControlValue(PropertyNames.Sub, ControlInfoPropertyNames.DisplayName, "Subpixel Level");
                configUI.SetPropertyControlValue(PropertyNames.Sub, ControlInfoPropertyNames.SliderLargeChange, 0.25);
                configUI.SetPropertyControlValue(PropertyNames.Sub, ControlInfoPropertyNames.SliderSmallChange, 0.05);
                configUI.SetPropertyControlValue(PropertyNames.Sub, ControlInfoPropertyNames.UpDownIncrement, 0.01);
                configUI.SetPropertyControlValue(PropertyNames.Sub, ControlInfoPropertyNames.DecimalPlaces, 3);
                configUI.SetPropertyControlValue(PropertyNames.Zconv_Factor, ControlInfoPropertyNames.DisplayName, "Z-Convolution Factor (%)");
                configUI.SetPropertyControlValue(PropertyNames.Zconv_Factor, ControlInfoPropertyNames.SliderLargeChange, 0.25);
                configUI.SetPropertyControlValue(PropertyNames.Zconv_Factor, ControlInfoPropertyNames.SliderSmallChange, 0.05);
                configUI.SetPropertyControlValue(PropertyNames.Zconv_Factor, ControlInfoPropertyNames.UpDownIncrement, 0.01);
                configUI.SetPropertyControlValue(PropertyNames.Zconv_Factor, ControlInfoPropertyNames.DecimalPlaces, 3);
                configUI.SetPropertyControlValue(PropertyNames.Zconv_Boundary, ControlInfoPropertyNames.DisplayName, "Z-Convolution Boundary");
                PropertyControlInfo Zconv_BoundaryControl = configUI.FindControlForPropertyName(PropertyNames.Zconv_Boundary);
                Zconv_BoundaryControl.SetValueDisplayName(Zconv_BoundaryOptions.Zconv_BoundaryOption1, "Neumann");
                Zconv_BoundaryControl.SetValueDisplayName(Zconv_BoundaryOptions.Zconv_BoundaryOption2, "Periodic");
                configUI.SetPropertyControlValue(PropertyNames.Interp, ControlInfoPropertyNames.DisplayName, "Interpolation");
                PropertyControlInfo InterpControl = configUI.FindControlForPropertyName(PropertyNames.Interp);
                InterpControl.SetValueDisplayName(InterpOptions.InterpOption1, "Nearest");
                InterpControl.SetValueDisplayName(InterpOptions.InterpOption2, "Average");
                InterpControl.SetValueDisplayName(InterpOptions.InterpOption3, "Linear");
                InterpControl.SetValueDisplayName(InterpOptions.InterpOption4, "Bicubic");
                InterpControl.SetValueDisplayName(InterpOptions.InterpOption5, "Lanczos");
                configUI.SetPropertyControlValue(PropertyNames.Tile_b, ControlInfoPropertyNames.DisplayName, "Tile Boundary");
                PropertyControlInfo Tile_bControl = configUI.FindControlForPropertyName(PropertyNames.Tile_b);
                Tile_bControl.SetValueDisplayName(Tile_bOptions.Tile_bOption1, "Periodic");
                Tile_bControl.SetValueDisplayName(Tile_bOptions.Tile_bOption2, "Mirror X");
                Tile_bControl.SetValueDisplayName(Tile_bOptions.Tile_bOption3, "Mirror Y");
                Tile_bControl.SetValueDisplayName(Tile_bOptions.Tile_bOption4, "Mirror XY");
                configUI.SetPropertyControlValue(PropertyNames.Preprocess, ControlInfoPropertyNames.DisplayName, "Preprocess");
                PropertyControlInfo PreprocessControl = configUI.FindControlForPropertyName(PropertyNames.Preprocess);
                PreprocessControl.SetValueDisplayName(PreprocessOptions.PreprocessOption1, "Neumann");
                PreprocessControl.SetValueDisplayName(PreprocessOptions.PreprocessOption2, "Periodic");
                PreprocessControl.SetValueDisplayName(PreprocessOptions.PreprocessOption3, "Mirror");
                configUI.SetPropertyControlValue(PropertyNames.Fit_tile, ControlInfoPropertyNames.DisplayName, string.Empty);
                configUI.SetPropertyControlValue(PropertyNames.Fit_tile, ControlInfoPropertyNames.Description, "Fit Tile");
                configUI.SetPropertyControlValue(PropertyNames.Points, ControlInfoPropertyNames.DisplayName, "Points/Iteration");
                configUI.SetPropertyControlValue(PropertyNames.Thickness, ControlInfoPropertyNames.DisplayName, "Thickness (%)");
                configUI.SetPropertyControlValue(PropertyNames.Thickness, ControlInfoPropertyNames.SliderLargeChange, 0.25);
                configUI.SetPropertyControlValue(PropertyNames.Thickness, ControlInfoPropertyNames.SliderSmallChange, 0.05);
                configUI.SetPropertyControlValue(PropertyNames.Thickness, ControlInfoPropertyNames.UpDownIncrement, 0.01);
                configUI.SetPropertyControlValue(PropertyNames.Thickness, ControlInfoPropertyNames.DecimalPlaces, 3);
    
                return configUI;
            }
    
            protected override void OnCustomizeConfigUIWindowProperties(PropertyCollection props)
            {
                // Add help button to effect UI
                props[ControlInfoPropertyNames.WindowTitle].Value = "Tiled Form - G'MIC-QT";
                props[ControlInfoPropertyNames.WindowHelpContentType].Value = WindowHelpContentType.PlainText;
    
                Assembly assembly = typeof(TiledFormGmicPdnPlugin).Assembly;
    
                string fileVersion = assembly.GetCustomAttribute<AssemblyFileVersionAttribute>().Version;
                string copyright = assembly.GetCustomAttribute<AssemblyCopyrightAttribute>().Copyright;
    
                props[ControlInfoPropertyNames.WindowHelpContent].Value = $"Tiled_Form v{ fileVersion }\n\n{ copyright }\nAll rights reserved.";
    
                base.OnCustomizeConfigUIWindowProperties(props);
            }
    
            protected override void OnSetRenderInfo(PropertyBasedEffectConfigToken newToken, RenderArgs dstArgs, RenderArgs srcArgs)
            {
                int color_space_id = (byte)(int)newToken.GetProperty<StaticListChoiceProperty>(PropertyNames.Cs_mode).Value;
                int tile_id = (byte)(int)newToken.GetProperty<StaticListChoiceProperty>(PropertyNames.Pretile_mode).Value;
                bool bool_use_clipboard = newToken.GetProperty<BooleanProperty>(PropertyNames.Use_clipboard_as_tile).Value; int use_clipboard;
                int tile_w = newToken.GetProperty<Int32Property>(PropertyNames.Shape_w).Value;
                int tile_h = newToken.GetProperty<Int32Property>(PropertyNames.Shape_h).Value;
                double ratio = newToken.GetProperty<DoubleProperty>(PropertyNames.Shape_ratio).Value / 100;
                double rotation = newToken.GetProperty<DoubleProperty>(PropertyNames.Shape_ang).Value * -1;
                int shape_mirror_axis_mode = (byte)(int)newToken.GetProperty<StaticListChoiceProperty>(PropertyNames.Shape_axis).Value;
                double subpixel_process = newToken.GetProperty<DoubleProperty>(PropertyNames.Sub).Value + 1;
                double zconvf = newToken.GetProperty<DoubleProperty>(PropertyNames.Zconv_Factor).Value / 100;
                int zconvb = (byte)(int)newToken.GetProperty<StaticListChoiceProperty>(PropertyNames.Zconv_Boundary).Value + 1;
                int interp = (byte)(int)newToken.GetProperty<StaticListChoiceProperty>(PropertyNames.Interp).Value + 1;
                int tile_bound_id = (byte)(int)newToken.GetProperty<StaticListChoiceProperty>(PropertyNames.Tile_b).Value;
                int preprocess_id = (byte)(int)newToken.GetProperty<StaticListChoiceProperty>(PropertyNames.Preprocess).Value + 1;
                bool bool_ftmode = newToken.GetProperty<BooleanProperty>(PropertyNames.Fit_tile).Value; int ftmode;
                int refpts = newToken.GetProperty<Int32Property>(PropertyNames.Points).Value; int pts = refpts;
                double thickness = newToken.GetProperty<DoubleProperty>(PropertyNames.Thickness).Value / 100;
    
                //This is required to assign exclusively numbers for g'mic processing.
                if (bool_use_clipboard) { use_clipboard = 1; } else { use_clipboard = 0; }
                if (bool_ftmode) { ftmode = 1; } else { ftmode = 0; }
    
                string[] shapes = new string[] { "australia", "barbedwire", "circle", "crosshair", "cupid", "diamond", "dragonfly", "flip", "gumleaf", "heart", "information", "kookaburra", "mail", "mapleleaf", "paintsplat", "paw", "phone", "polygon", "rooster", "shopping_cart", "snowflake", "star" };
                string gmic_pdn_shape = "gmic_pdn_shape_";
                gmic_pdn_shape += shapes[tile_id];
    
                using (PdnGmicSharp gmic = new PdnGmicSharp())
                {
                    // Add the source surface as the first input image.
                    using (PdnGmicBitmap source = new PdnGmicBitmap(srcArgs.Surface))
                    {
                        gmic.AddInputImage(source);
                    }
    
                    // The following code demonstrates adding an image
                    // from the clipboard as a second G'MIC surface.
    #if USE_CLIPBOARD
                    IClipboardService clipboard = this.Services.GetService<IClipboardService>();
    
                    Surface clipboardSurface = clipboard.TryGetSurface();
    
                    try
                    {
                        if (clipboardSurface != null)
                        {
                            using (PdnGmicBitmap clipboardBitmap = new PdnGmicBitmap(clipboardSurface, true))
                            {
                                // The PdnGmicBitmap takes ownership of the clipboard surface.
                                clipboardSurface = null;
    
                                gmic.AddInputImage(clipboardBitmap);
                            }
                        }
                    }
                    finally
                    {
                        clipboardSurface?.Dispose();
                    }
    #endif
                    if (tile_id == 20)
                    {
                        if (refpts > 6) { pts = 6; }
                    }
    
                    if (tile_id == 21 || tile_id == 17)
                    {
                        if (refpts < 3) { pts = 3; }
                    }
    
    
                    if (tile_w > 0 && tile_w < 4) { tile_w = 4; }
                    if (tile_h > 0 && tile_h < 4) { tile_h = 4; }
    
                    string command = string.Format(CultureInfo.InvariantCulture,
                                                   "end_image_list_id={{$!-1}}\n" +
                                                   "cs_conv={{s#0>=3}}\n" +
                                                   "tvv=0\n" +
                                                   "repeat s#0\n" +
                                                   " sh[0] $>\n" +
                                                   " tvv+={{iv#-1}}\n" +
                                                   " rm.\n" +
                                                   "done\n" +
                                                   "if !$tvv return fi\n" +
                                                   "m \"gmic_pdn_shape_circle: shape_circle $\"\"1\"\n" +
                                                   "m \"gmic_pdn_shape_cupid: shape_cupid $\"\"1\"\n" +
                                                   "m \"gmic_pdn_shape_diamond: shape_diamond $\"\"1\"\n" +
                                                   "m \"gmic_pdn_shape_polygon: shape_polygon $\"\"1,$\"\"2\"\n" +
                                                   "m \"gmic_pdn_shape_snowflake: shape_snowflake $\"\"1,$\"\"2\"\n" +
                                                   "m \"gmic_pdn_shape_star: shape_star $\"\"1,$\"\"2,$\"\"3\"\n" +
                                                   "m \"gmic_pdn_shape_heart: shape_heart $\"\"1\"\n" +
                                                   "m \"gmic_pdn_shape_australia: base642img \"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\" decompress_rle. r. $\"\"1,$\"\"1,1,1,5 if $\"\"1>512 b. 0.2% fi >=. 40%\"\n" +
                                                   "m \"gmic_pdn_shape_barbedwire: base642img \"MiBpbnQgbGl0dGxlX2VuZGlhbgoxIDY5MSAxIDEgIzk3Mwp4nI2WSWyNURTHP1qvqvpqnh4RNSwIQWtKDAlaNbQUbdASG0QsEGJhQSIRK0OCDZFgIRYskEhEQsJWYowhhmpLa54aauh71//k+33ezUuFxcsv95xz7z3n3P+93ws6BkGgX4cg/AUwWZtyWWJWyv1htpgNbdxJ7CTGxJiYA2MeG5xztt4w/C9duF4JbMTe5MJ1S2Fkb2Zc4tk7i69cuP8c2ED8a88ey7DbuMyz2zpviC+DdeTdxn6fsc9lXh3rJf/hTzH+kuF/xvqZ/nkunPc//jh288+HT2TPz7Bb/FPZu5Kn2Rdgz4yP7I+Jb8+eJ34in7/Zy7E/kr3Lf9grXHgOzejqJ7oQXK74kbgqaHab/9o7pzhxtv5ysYedK+dg8d09f43YW3wrf1/xPfZasY/4TvYB4gfqXyn2t3GG/ZwL5zcyr9XhV1yCcTb5WfwN8v4qDqP+GejYrmBCHCN+d2n9GG+K3dDbaPpTgp5t/RHiJPEH/XL0846417sPI8XprGP9uSfu9/xjxRrxgXjAuy9n4AFxtZ2feJB7Y/bzYk/xuVho+hTXmi7EI9RpdVwUB6LDyfRxg+lTPEFfLO9L4lDqLxN/iVuD8B05zdjiLovvyXMQ9tFwGXVaP66Ih1lvFfsPRN+FjJd48Vep385vdxC+SwWc80LO0+Ku0b8WcZd4QZxI/3t6cdfFQ9S3Qzwrjucc4+RrcXdd+E620DfTwXbxNP1KUncUf5++Wp7HsW8TT6Krn8Q1efO6oJNT5LlFPCZO9eKb0bvlP4q8Z8Ey5pWLR5kX6c7OIUGfh7NOMdwnHhGnUZfFv2W+1TFEfEgfD7UTZ/reJW4U91CP5THY03Mr8e/Yd7u4Rtzp0u9KIki/a9/oh93/ceJmcYW4ibh6/J/xr6fudfTH9J5Hn+x8VotzPH+dOFOsFvsR15V87b1Yi910PVtc7MJ3yfz5GXG59DWffs4VK8VexMXxx+mL6WINbCPPJs5vkafPuLdu9N5Uu/T32I9PuvR72g3avCov3uqv4Dwy41PUX0X/X3rx0fcu15uX5N5F86K8bF5pEH7fOqKTLPQdzYvD9uZNYb9f5N/GOVd5cTH0Xkx8jnc/WhkvJc7e2SJv3e/os4S42+gnWieaH/lvsc80xt9Yp5R1XojVQfp72+LS/5NsbO/SMvpo4wmefTnnZ+NiF77z9ei80rNnodcadGj7F4i11JnDeDDnmeCexb2+FaDnVvTfwH5R/+27av4ixvb97eONX6VCnRVRd1Mq/G5H/kb+90T+ev5HjCH/vMqU+w2wUyNRMSAxNSAxIDEgIzM4Cnicc2dgYPAF4igGCCgB4nwkWg+Ik4E4E4hzgTgdiKugagGdcAT9\" decompress_rle. r. $\"\"1,$\"\"1,1,1,5 if $\"\"1>512 b. 0.2% fi >=. 40%\"\n" +
                                                   "m \"gmic_pdn_shape_crosshair: base642img \"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\" decompress_rle. r. $\"\"1,$\"\"1,1,1,5 if $\"\"1>512 b. 0.2% fi >=. 40%\"\n" +
                                                   "m \"gmic_pdn_shape_dragonfly: base642img \"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\" decompress_rle. r. $\"\"1,$\"\"1,1,1,5 if $\"\"1>512 b. 0.2% fi >=. 40%\"\n" +
                                                   "m \"gmic_pdn_shape_flip: base642img \"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\" decompress_rle. r. $\"\"1,$\"\"1,1,1,5 if $\"\"1>512 b. 0.2% fi >=. 40%\"\n" +
                                                   "m \"gmic_pdn_shape_gumleaf: base642img \"MiBzaG9ydCBsaXR0bGVfZW5kaWFuCjEgOTY5IDEgMSAjNTk2CnichdXnVuMwEAXgiUMNvXdC76GFQICE3kkoSahPuu+xr7HPcM/OjGxFArP74zszNgdbVqQrCihIUIKIdf7mCiOBgEXVCJAM1fukrQ3au7UBjczURjQxU5tUs63NaKEW1UqtzNQUpdBGbWindtVBHaqTOtHFTO1S3dSNHupRvdSr+lSf6qd+DNCAGqRBDNGQGlbDaoRGMEqjaozGME7jzNQJmlCTNKnSlGZRTWOKptR0WE0/bc3QjDVLs9YczVnzNG8teP2CWqRFa4mWPMu07FmhlVirtIa1/8hQxrGO9R9s0EZoE5sxtmgrtI3tGFnKsh3sxMjRLna/2cNerDzynn3sf3OAg28OcRgqUIEVUfQc4chzjGPrBCfWKU6tM5xZ5zi3LnBhXeJSXeGKXdM1u8GN5xa3se5w96N73LOv993/c5914/X1d/9rLPFj88fwdTxGCSVVtrWsHvBgPXr9o+cJT+rZ1mergoqqosrc3lzX+yrVUFMveFGveA3V+ze8We94tz7wYX16/WfI7b9e+33ccz7sO6J3umOIxhSNsT5u8y3ud9XC76x6c1KxcxXN3VM4r4/O3Jftb1TS381dU9EauOZ1K2tY1rOsb1nvsv5lP0R7RPZMUfdVQfdYtO9kP+Z530b7Okc53fNZzgTJC8kOyRXJmAznkeSWZJrknGSfZKHkpeSn5KlkrWSw5LNktWS3ZLnk+yCT7JfzoIvPCDk/UnymtPD5ImdPA59HST6fjCSfa4Z77fdJPft+vh+Ez3BrwOdoEPN39370jF9//gJSgJz1MSAxNSAxIDEgIzMzCnicc2fwZYhiYGAoYcgHYz2GZIZMhlyGdIYqoCgATrgE/Q==\" decompress_rle. r. $\"\"1,$\"\"1,1,1,5 if $\"\"1>512 b. 0.2% fi >=. 40%\"\n" +
                                                   "m \"gmic_pdn_shape_information: base642img \"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\" decompress_rle. r. $\"\"1,$\"\"1,1,1,5 if $\"\"1>512 b. 0.2% fi >=. 40%\"\n" +
                                                   "m \"gmic_pdn_shape_kookaburra: base642img \"MiBzaG9ydCBsaXR0bGVfZW5kaWFuCjEgOTU5IDEgMSAjMTEwNwp4nI2VeWyVRRTFz3TfH6Eo7qLFSDSKgFBKSyGARSgICCggdYni0gaDiSHRhESjiYZocMEqFCioiNWispQlRNPUQsUCLbZQS21tKd33je7net+88nwvmugfv5z55r2Z755778wHH/gYGEDpTXVgHO/DJE7BNEZjOVdgHQ36JAnJTMEGvoKN3IjX+Do2cRPe4Jt4i2/jHb6LzdyM9/g+tnALPuCH+Jhb8QlT8Rm3YTu3I82Shh3cgZ2WnZZdll1IZzp2cw/2KJ/zC3zJvdirfMV92MevkcEM5Rt8y0xkcj/28zt8zwM4wIM4xEPKYRweIYtZyhEcsRzFMR5TjuMET+BH/oRsZiOHOcjlSeQxD6d5GvnMxzkW4jcW4QIv4neWooxlqGAFKlmJy7yMGtaino1oZiva2YFu9qCXfRjgIEgCYoyv+Bp/8TeBEmRCJMSESbhxiMOMktEmUpZgQLJxvSSiS/UGSUCz1XjUSA4i5X6UqYbLTTgnP2uMuTbGXJ7CKY0zT+P8VePM51mNtQAFPG/jLeIFG3OJxlzKSxp3Oco17gqNu5JVGns1qllj469lvXpoQAOb0MRm9dKCFrahje3WUwe70MVu662HvdZfH/st/epzkEMY4jCG1S8pFqExRnyMj3r3FT/jp/79JdAEKM48BEmwCdZchEioCZUwmxMn4RKheI4jTIRbHR5j77n/r97rw+17wkfeH+bW0JG4nOqKMdTWLtgS7NYg9eLy41SnvwD1GTCi/urbz9bfx+bCR3NiDARGbJ6oORvW3A1ZBjWXAxzQnDpz26d57sVVzXm35r5La9DJTkuH1qTd0q41akOrrZVLW7UPWywtto7NWs8mS5NbGy2NWu8GW/d6rX+dpU57oW5Ea21v1GiPXLFcsVRbqm3/VGkflWtflfEPey4uaZ85z0gJS3BRe69Ye7CYxdqLRTivfVloKdQeLcBZ7dczPKN968CwHNfzFoZ+OaoagquShV8YrOfhoPZ3INrlB5ykH5okU/veF/WSYe+CdO7WeyLd4rw30vQOcd4n2/gqKOPxKTdgUKKQypd17ztV16NX7tD59eiRcaop6JTb9T5K0XfcppqMVrlV1yfrGbxF9SU0ys16V72IOrlRn1/QMzlW//c8quU61XWokjG6z3P4U0br/s+iXBzYymdQKmFWSyQYH/FpPMUnkcQkrOVaPME1WKOs5mqs4io8zsewkiuxQu/W5XwUy7gMS7kUS/gIFnMxFnEREpmIhVyIBVygPIz5nI8EJuAhZR7nYS7nYo5lDmZzNmZZZiGe8ZipuHSme+w97/otjnGIVVwaa8feGosZbp2BGMWlMXbs0hhMd+v0/xx7rru2n+feLmK9xrHuZ++x99y/6z89xXn87unfqa6c/K3X1nh6jUa0Mo1TMdXyIKbot9LJZE62TOIDmMiJuJf3YAIn4G7ehfGMQhTHQiRIv69jEMlRiGAossr/As3XmqgxIDI2IDEgMSAjNTMKeJxzZ/BliGJgYIhmMGJIYVBgyGbIB8JshkSGJIZShiIgTASKFjNkAOkChlSGWKBaAORKCL8=\" decompress_rle. r. $\"\"1,$\"\"1,1,1,5 if $\"\"1>512 b. 0.2% fi >=. 40%\"\n" +
                                                   "m \"gmic_pdn_shape_mail: base642img \"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\" decompress_rle. r. $\"\"1,$\"\"1,1,1,5 if $\"\"1>512 b. 0.2% fi >=. 40%\"\n" +
                                                   "m \"gmic_pdn_shape_mapleleaf: base642img \"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\" decompress_rle. r. $\"\"1,$\"\"1,1,1,5 if $\"\"1>512 b. 0.2% fi >=. 40%\"\n" +
                                                   "m \"gmic_pdn_shape_paintsplat: base642img \"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\" decompress_rle. r. $\"\"1,$\"\"1,1,1,5 if $\"\"1>512 b. 0.2% fi >=. 40%\"\n" +
                                                   "m \"gmic_pdn_shape_paw: base642img \"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\" decompress_rle. r. $\"\"1,$\"\"1,1,1,5 if $\"\"1>512 b. 0.2% fi >=. 40%\"\n" +
                                                   "m \"gmic_pdn_shape_phone: base642img \"MiBzaG9ydCBsaXR0bGVfZW5kaWFuCjEgMTU2OSAxIDEgIzEzMzEKeJytl2tQVVUYhj80R9IkTTLUFBUGJURB7sjtYDlZWWlmgefA4S5qkvcbXiC72G0q07KypKvTWDaWZXkp85aXQGH60dTUTDP96ddm/P/t3u8954gcjjPW+GPNs58FrL332mut90P6Sb8oiRJBm3l5sMToMInVERKno+ROHSPxOl4SNFGSdKIka7Kk6GSZolMlXdMlU7MkR3MkT/OlQAukSIvFox60UilFC+dcjRLH9cg8vUm63VKZrwPoj+lAeplG08t1EN2rg+k+HUKv1Bi6X4fSq0DzajyzA6/V4eyv01h6A96jO0jzRo2jL9KR9CU6mm40X4r3NW/SsRy3SePpy3QcfblOoK8AzVdiXsxXgearNYm+BjRfq5Po6zFvIdp9mjWFbjTfpKl0o/kWzG93kOYtmkZvxZzbuK06jb5VM+hbNZP+NGj+jGbTnwXNn9Nc+jbQfJvm0V/AdzMPsFRe1Onsfwnf0vxlLaQbzV/B9+0O0vxVLaEbzbfjG3cHaeNu1xn0HXo3fYfeQ98Jmu/UmfQ3QPM39V76LtB8l86ivxXk23of7/OO3k83mu/WB+hG83d1Nv09fZC+Rx+iG23cPfowvQ00b9M59PdB8w/0EXiA5h/qPLrRcUvAR+G96bjF4Hx4gI5bJB/p4/AAHbcQLIMH6LgFYDl8On6/HJ4PLoAH6Li5uL8XHqDjZuP5fPAsPK8PnglWwDPwPhXwdLxvJTwN718Jn4L5ME7GvPnRn4J59MMnYZ6r4EmY/yp4gryu1fDx8hrouGPxfWvgo7EOauBxWB+18BFYN7Xw4VhXdfBhWG918Bh5Suvht2Cd1sNvls3aAB8oG0HH7Y91vxAehf2wUBZqI/ZhqC3CXuxpjfx5A/ZrvdSz1WEv12JfW6uRGrZq7PsqND/OgVCrxNnQ0yowP76IzSsLMLfhrRzzH97K8I0CLVJfT39kv/pvQtehe11939C1F2ed9wq9eNYQfbwOPX/FFVbwOsBAq+zDwFyE5sV/hX5e96Yfc9qbkfp6WMXr6+N/+d1rj1Edxhs55o0aqxpZFGCbGy1nsV4/dofKBfheN1ba4fvckdIB7nfHyCWs6wPuOPIg9mEn1vsh7EvjYTdZurAHjmHfdoLHsZ+7sDdOYp8bz2Dfd2G/nHdzyHY3D1wknThXjL/g3OnSJfIrzi3jbzjfunSp/E42yR/kMvmTXCF/kWvkb3KD/EO28vzrBO187NSW/+ktPIeN1n9Jt1yXG6/tHrkY9Iu6OaJ3gJG8Qzf1cWO7buR9wt0YyX/W5gjuwfdupl/APEby86D5eV0f0c+B5ud0XdDX8T5G6z+ra+lG85/w3SK50fyMrqYbzU/rKo57OsxPgeandCX9JGh+EuvD/ARofkKX93Hjj1hPTpDmx/VJutH8B6w7J0jz77EenSDNj+kTHPcoaH4U69b8CGh+RBfTD4Pmh7HOzb8DLZ+/RaaYH2LeeOQb5k+JfM1cKpGDzKkS+Yq5VSxfMseK5QBzrUi+YO4VyX7mYKF8zlwslM+YkwWyj7lZIJ8yV/NlL/M2Xz5h/uYit3298rqN+Z2NXC5nXu9m3mcgh60emIb6xuqDdOSw1Q1TUS9ZHZGK/LV6YzLqLqs/kuV5nQufiNy1+iQReWv1ywTkrNU38bKB9c4Y5KvVP6NQl1p9dAfq11nwWFnMuuo25KrVWbciQ60OG4KzfwZ8EHLIA49GPW513QCZw7qvv8xGPZiLmjELdWQGas001J+pqFGT9S5J1AT8f3C7VF3+F5FZ+PIxIDE1IDEgMSAjMzMKeJxzZ/BliGJgYChhyAdjPYZkhkyGXIZ0hiqgKABOuAT9\" decompress_rle. r. $\"\"1,$\"\"1,1,1,5 if $\"\"1>512 b. 0.2% fi >=. 40%\"\n" +
                                                   "m \"gmic_pdn_shape_rooster: base642img \"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\" decompress_rle. r. $\"\"1,$\"\"1,1,1,5 if $\"\"1>512 b. 0.2% fi >=. 40%\"\n" +
                                                   "m \"gmic_pdn_shape_shopping_cart: base642img \"MiBzaG9ydCBsaXR0bGVfZW5kaWFuCjEgMTM0NSAxIDEgIzEzNDIKeJytlWlQlXUUxp9jWippabmmuEI5jjlFkFcREC/34kbCVYlAQYGATAkHF1RwQZFFzS1TUzNX3PdtmpxmaiZrpj6UzdQH/aRT5mRZpq3/03Pf+/JyL5Cf+vDM7z3/dz/nOeePVmglEICadj0Ro00qUo0PPmqSzQcd+0xa0PF/XZcWcn2aEz/4OM3E4p62w0QzDMNMDGJMtKVoWzH2WmPc8rnm1zU9F4M8zZW9ulcu6AXqvJy3dU7PUWflrKMzciZEp+W0o1NyKkQn5aStE3qCOi7HHR2TYyE6KkcdHZEjQTqsh+SQo4NyMET1Uh+iA3LA1n7dJ/sceXBD3RYvajf+qwdr9Bb8zNFLFl/Q9dhDttNXLX5n3KQXN02STTd2kz8wfo/nG+nGLvIW4+b04kfy3SDeNp4mTMJO8ifGDdzB+38mtzv04o7NX4zXpgfvkL8yDqUH28i7jBuZjHsm2aYXW7jewPtcD9CLt8nfGQfzDzPGZjI28/4/bf7F9WD+TW7idQ38x4y1OQYbeV4ZBxM6zuZYbAiicD3AsVhPtmK8jnzIZmsdb3Mc3iTbMG6JD5Nr+Yy2FifhCZ1AZuEpxmtY40jGq3U2hlpcAJfF5XCTdVqHCRY3I0NTyF3IZVyrh1HMuFbPoszih1hh8TO+MwXVeoU59vMaPeXnTZwgV+ldvG9R8Ym+RLaXLy12katcr9I+8j3jKh0sdy1WSZWulBW6wlalVIZouSx3tEyW6tIgLZEljiqkXMtlvs6XEi2Rmfqa5Gu+ZGu2ZGiG+DRNxut48ahHEjReXOqSKI2SITpEIjVC+vC7emgP6aydJEzDpI22EWMMvXGffrxDj9/CDXMdV801fGO+xVfmCj43X+Cy+RQfmY/xgbmEC+YiTpszOGaOo94cxB6zBzvMTmwxW7HRbMJasxbVpgaVphLlpgJlZiFKTSlmm2IUmSLkmXxkm2xkmalIN+mYYFKQTA8m0edu9l6iSUSCGUUlIM7EYaSlkZZiOUNHWBphabgZbsllM3DsakGN51uWKyRueL7/fX4F3h+g/5viTbylBKrKVNGTbaVOa6XWUY3UOKp2WO1olayyPBHwxUpLwd5o9MIyxwMVUsHal1taLIt1kSzShbJQy6SMfpiv82SezpW5WiqlOkfm0B8lWizFOktm6Ux6pUiKtEAKNE/yNEdyNFMyNVzC9TIKbwvCTBekaUd8bXojU7vTAwMwQ/viuhmEQo3kvByC13Uw59tzeEOHcl5Fo1SjOHdcWKAx9NAILNLhnB9xqNBYGNZwqcaz70ejUhPZ70lYqW72s5d94sEjOgY17Ot27Ps69nUY+3ENe7kD+8Xfe49pKufFRHRSH+dKGvt9MuePD0+Sb1FdNZ1zbAq6aQa26svobjEDPTWTc/MVm5nopVM5f7NsTkW4ZnNOT7OZjb46nXM/x+Z09Ndc7g8zmjAXAzUf+zSvCfMRQe235k8BDjRjAZ4OYr0WBrEQB6lntOh/ZcNzm7+v+ff4vzOCCjDwHxFB/+XnQP77Xv7vgCD689GfudrN/PQLoj9/fZnTXcxnHzu/4cz5Tua7t53/XqzJdtajJ2vkr09P1mwbj7uznltYx25WXdNZ38nch6aw3j7WfRI60w8b6INOli9S8Th9so7+6GjtAyl4lD5aTf+0p69qrX3Cy3nt3zeSOH899N8o+tBNP8bTl6O4b42kT+PoVxd9G8v98EX6eBh+M1H0dTT9PRQl+jz9Phiz9Fn6P5J9MIjzsR/3joG4ZnogS8PZLx3h067oYFoj7sa//BfTxjEgMTUgMSAxICMzMwp4nHNn8GWIYmBgKGHIB2M9hmSGTIZchnSGKqAoAE64BP0=\" decompress_rle. r. $\"\"1,$\"\"1,1,1,5 if $\"\"1>512 b. 0.2% fi >=. 40%\"\n" +
                                                   "m \"gmic_pdn_multicut: repeat s $=a $=b val_a=$\"\"{{a{{$>*2+1}}}} val_b=$\"\"{{b{{$>*2+2}}}} sh $> cut. $val_a,$val_b rm. done\"\n" +
                                                   "color_space={0}\n" +
                                                   "tile_id={1}\n" +
                                                   "use_clipboard={2}\n" +
                                                   "tile_w={3}\n" +
                                                   "tile_h={4}\n" +
                                                   "ratio={5}\n" +
                                                   "ang={6}\n" +
                                                   "mirror_mode={7}\n" +
                                                   "sublevel={8}\n" +
                                                   "interpolation={9} interpolation={{$interpolation>2?$interpolation+1:$interpolation}}\n" +
                                                   "tile_boundary={10}\n" +
                                                   "preprocess={11}\n" +
                                                   "fitmode={12}\n" +
                                                   "ptiters={13}\n" +
                                                   "thickness={14}\n" +
                                                   "z_convolve={15}\n" +
                                                   "z_convolve_boundary={16}\n" +
                                                   "if $z_convolve\n" +
                                                   " offpixel={{$z_convolve*-1}}\n" +
                                                   " onpixel={{$z_convolve*2+1}}\n" +
                                                   " ($offpixel/$onpixel/$offpixel)\n" +
                                                   " store. zmap\n" +
                                                   "fi\n" +
                                                   "ow={{w#0}}\n" +
                                                   "oh={{h#0}}\n" +
                                                   "if !$tile_w&&$!$tile_h return fi\n" +
                                                   "tile_w={{!$tile_w?$tile_h:$tile_w}}\n" +
                                                   "tile_h={{!$tile_h?$tile_w:$tile_h}}\n" +
                                                   "mini_w={{ceil(w#0/$tile_w)}}\n" +
                                                   "mini_h={{ceil(h#0/$tile_h)}}\n" +
                                                   "nw={{$mini_w*$tile_w}}\n" +
                                                   "nh={{$mini_h*$tile_h}}\n" +
                                                   "convert_colors_fwd=${{arg\\ 1+$color_space,none,rgb2ryb,cs_error,rgb2hcy,rgb2hsi,rgb2hsl,rgb2hsv,rgb2lab,rgb2lch}}\n" +
                                                   "convert_colors_bwd=${{arg\\ 1+$color_space,none,ryb2rgb,cs_error,hcy2rgb,hsi2rgb,hsl2rgb,hsv2rgb,lab2rgb,lch2rgb}}\n" +
                                                   "if $color_space>=0&&$color_space<3 cutf_vals=0,255,0,255,0,255,0,255\n" +
                                                   "elif $color_space>=3&&$color_space<7 cutf_vals=0,360,0,100,0,1\n" +
                                                   "elif $color_space==7 cutf_vals=0,100,-176,176,-176,176\n" +
                                                   "else cutf_vals=0,100,0,255,{{-pi}},{{pi}}\n" +
                                                   "fi\n" +
                                                   "if $cs_conv\n" +
                                                   " if $color_space\n" +
                                                   "  if $color_space!=2\n" +
                                                   "   sh[0] 0,2 $convert_colors_fwd. rm.\n" +
                                                   "  else\n" +
                                                   "   l[0] if s==4 s c,-3 rgb2cmyk.. a c else rgb2cmyk fi endl\n" +
                                                   "  fi\n" +
                                                   " fi\n" +
                                                   "fi\n" +
                                                   "if !$use_clipboard k[0] " + gmic_pdn_shape + " {{max($tile_w,$tile_h)*$sublevel}},$ptiters,$thickness\n" +
                                                   "else\n" +
                                                   " if $!==2\n" +
                                                   "  .\n" +
                                                   "  if s==4\n" +
                                                   "    s. c,-3 to_gray.. *[-2,-1]\n" +
                                                   "  else\n" +
                                                   "    to_gray.\n" +
                                                   "  fi\n" +
                                                   " else\n" +
                                                   "  r[0] $nw,$nh,100%,100%,0,$preprocess,.5,.5\n" +
                                                   "  r[0] $mini_w,$mini_h,100%,100%,2\n" +
                                                   "  r[0] $nw,$nh,100%,100%,1,0,.5,.5\n" +
                                                   "  r[0] $ow,$oh,100%,100%,0,0,.5,.5\n" +
                                                   "  return\n" +
                                                   " fi\n" +
                                                   "fi\n" +
                                                   "if $ang-360*int($ang/360) rotate. $ang,1 fi\n" +
                                                   "if $mirror_mode==1 mirror. x elif $mirror_mode==2 mirror. y fi\n" +
                                                   "n. 0,1 autocrop. 0\n" +
                                                   "if $fitmode\n" +
                                                   " shape_image_ratio={{w#-1/h#-1}}\n" +
                                                   " target_image_ratio={{$tile_w/$tile_h}}\n" +
                                                   " resize_width={{$target_image_ratio>$shape_image_ratio?w#-1*($tile_h/h#-1):$tile_w}}\n" +
                                                   " resize_height={{$target_image_ratio>$shape_image_ratio?$tile_h:h#-1*($tile_w/w#-1)}}\n" +
                                                   " r. {{$resize_width*$ratio}},{{$resize_height*$ratio}},1,1,$interpolation,0,.5,.5\n" +
                                                   " r. $tile_w,$tile_h,1,1,0,0,.5,.5\n" +
                                                   "else\n" +
                                                   " r. {{w#-1*(1/$ratio)}},{{h#-1*(1/$ratio)}},1,1,0,0,.5,.5\n" +
                                                   " r. $tile_w,$tile_h,1,1,{{$interpolation}},0,.5,.5\n" +
                                                   "fi\n" +
                                                   "cut. 0,1 n. 0,1\n" +
                                                   "if $tile_boundary==0\n" +
                                                   " r. $nw,$nh,100%,100%,0,2\n" +
                                                   "elif $tile_boundary==1\n" +
                                                   " r. $nw,100%,100%,100%,0,3\n" +
                                                   " r. 100%,$nh,100%,100%,0,2\n" +
                                                   "elif $tile_boundary==2\n" +
                                                   " r. 100%,$nh,100%,100%,0,3\n" +
                                                   " r. $nw,100%,100%,100%,0,2\n" +
                                                   "elif $tile_boundary==3\n" +
                                                   " r. $nw,$nh,100%,100%,0,3\n" +
                                                   "fi\n" +
                                                   "avgc={{avg(crop(#-1,0,0,$tile_w,$tile_h))}}\n" +
                                                   "+negate.\n" +
                                                   "r[0] $nw,$nh,100%,100%,0,$preprocess,.5,.5\n" +
                                                   "+*[0] [-2]\n" +
                                                   "+*[0] [-2]\n" +
                                                   "$mini_w,$mini_h,2,{{s#0}},\"begin(\n" +
                                                   " const avg_c=\"$avgc\";\n" +
                                                   " const tw=\"$tile_w\";\n" +
                                                   " const th=\"$tile_h\";\n" +
                                                   " const wwhh=tw*th;\n" +
                                                   " const w_avg=wwhh*avg_c;\n" +
                                                   " const iw_avg=wwhh-w_avg;\n" +
                                                   " );\n" +
                                                   "if(z\n" +
                                                   " ,sum(crop(#-1,x*tw,y*th,0,c,tw,th,1,1))/iw_avg;\n" +
                                                   " ,sum(crop(#-2,x*tw,y*th,0,c,tw,th,1,1))/w_avg;\n" +
                                                   ");\"\n" +
                                                   "if $z_convolve\n" +
                                                   " $zmap convolve.. .,$z_convolve_boundary rm.\n" +
                                                   "fi\n" +
                                                   "if $cs_conv\n" +
                                                   " if $color_space\n" +
                                                   "  if $color_space!=2\n" +
                                                   "   sh. 0,2\n" +
                                                   "   if $z_convolve gmic_pdn_multicut. $cutf_vals fi\n" +
                                                   "   $convert_colors_bwd.\n" +
                                                   "   rm.\n" +
                                                   "  else\n" +
                                                   "   if s#0==4 cmyk2rgb. r[0] 100%,100%,100%,3\n" +
                                                   "   else s. c,-4 cmyk2rgb.. a[-2,-1] c r[0] 100%,100%,100%,4\n" +
                                                   "   fi\n" +
                                                   "  fi\n" +
                                                   "  if $z_convolve cut. 0,255 fi\n" +
                                                   " fi\n" +
                                                   "fi\n" +
                                                   "f[0] \"begin(\n" +
                                                   " const tw=\"$tile_w\";\n" +
                                                   " const th=\"$tile_h\";\n" +
                                                   ");\n" +
                                                   "posx=int(x/tw);posy=int(y/th);" +
                                                   "lerp(I(#-1,posx,posy,0),I(#-1,posx,posy,1),i0#-4);\"\n" +
                                                   "r[0] $ow,$oh,100%,100%,0,0,.5,.5\n" +
                                                   "k[0,$end_image_list_id]\n" +
                                                   "um gmic_pdn_shape_circle,gmic_pdn_shape_cupid,gmic_pdn_shape_diamond,gmic_pdn_shape_polygon,gmic_pdn_shape_snowflake,gmic_pdn_shape_star,gmic_pdn_shape_heart,gmic_pdn_shape_australia,gmic_pdn_shape_barbedwire,gmic_pdn_shape_crosshair,gmic_pdn_shape_dragonfly,gmic_pdn_shape_flip,gmic_pdn_shape_gumleaf,gmic_pdn_shape_information,gmic_pdn_shape_kookaburra,gmic_pdn_shape_mail,gmic_pdn_shape_mapleleaf,gmic_pdn_shape_paintsplat,gmic_pdn_shape_paw,gmic_pdn_shape_phone,gmic_pdn_shape_rooster,gmic_pdn_shape_shopping_cart,gmic_pdn_multicut",
                                                   color_space_id.ToString(CultureInfo.InvariantCulture),
                                                   tile_id.ToString(CultureInfo.InvariantCulture),
                                                   use_clipboard.ToString(CultureInfo.InvariantCulture),
                                                   tile_w.ToString(CultureInfo.InvariantCulture),
                                                   tile_h.ToString(CultureInfo.InvariantCulture),
                                                   ratio.ToString(CultureInfo.InvariantCulture),
                                                   rotation.ToString(CultureInfo.InvariantCulture),
                                                   shape_mirror_axis_mode.ToString(CultureInfo.InvariantCulture),
                                                   subpixel_process.ToString(CultureInfo.InvariantCulture),
                                                   interp.ToString(CultureInfo.InvariantCulture),
                                                   tile_bound_id.ToString(CultureInfo.InvariantCulture),
                                                   preprocess_id.ToString(CultureInfo.InvariantCulture),
                                                   ftmode.ToString(CultureInfo.InvariantCulture),
                                                   pts.ToString(CultureInfo.InvariantCulture),
                                                   thickness.ToString(CultureInfo.InvariantCulture),
                                                   zconvf.ToString(CultureInfo.InvariantCulture),
                                                   zconvb.ToString(CultureInfo.InvariantCulture));
    
                    // Run the G'MIC command and allow it to receive cancellation info from Paint.NET.
                    gmic.RunGmic(command, () => this.IsCancelRequested);
    
                    if (gmic.Error != null)
                    {
                        this.Services.GetService<IExceptionDialogService>().ShowErrorDialog(null, gmic.Error);
                    }
                    else if (!gmic.Canceled)
                    {
                        Surface output = gmic.OutputImages?[0]?.Surface;
    
                        if (output != null)
                        {
                            // Copy the rendered G'MIC image to the destination surface,
                            // and restrict the copied portions to the user's selection.
                            dstArgs.Surface.CopySurface(output, this.EnvironmentParameters.GetSelectionAsPdnRegion());
                        }
                    }
                }
    
                base.OnSetRenderInfo(newToken, dstArgs, srcArgs);
            }
    
            protected override void OnRender(Rectangle[] renderRects, int startIndex, int length)
            {
                // All work is performed in OnSetRenderInfo.
            }
        }
    }

     

     

  8. 27 minutes ago, Red ochre said:

    Come on - surely a google search would inform you? - sorry for using English words?

     

    Too confrontational? - it means a reliable, dependable resource.

    I thought it wasn't an actual word at all. Got it.

  9. Roadmap for 2021:

    1. Refactor Naeddyar mapmaking script to more suitable version. He wrote scripts with little knowledge of gmic scripting. So, hence the need of refactoring. <- I’m here now.

    2. Refactor few of my script and adding new feature.

    3. New filters only after the refactor. I won’t be refactoring my script for optimization, etc. I'll be making filters that are so much harder to create.

    • Like 1
  10. On 10/29/2020 at 1:28 PM, MJW said:

     

    I believe offsetting is possible. Whether it will work exactly as you wish is hard to say.

     

    The part I was having difficulty with is using the edge transparency of antialiased objects to adjust the distance in a way that reduces jagginess. It could be that when I take a fresh look at it, a solution will be clear. That sometimes happens.

     

    I have a question, couldn't one use two surfaces to do that and then use linear interpolation based on alpha? Two surface distance are based on min non-alpha and max alpha. I could do a sample of that approach if asked, and explain it.

     

     

    Actually, never mind, I realize that it would give inaccurate distance. The better approach is using subsampling, thresholding. Or multiple distancing, thresholding, and subsampling.

×
×
  • Create New...