/// <summary>
            /// Updates the input layer resources from <see cref="VectorPath"/> instance, or replace by new path resource and updates.
            /// </summary>
            /// <param name="psdLayer">The psd layer.</param>
            /// <param name="vectorPath">The vector path.</param>
            /// <param name="imageSize">The image size to correct converting point coordinates.</param>
            public static void UpdateLayerFromVectorPath(Layer psdLayer, VectorPath vectorPath, bool createIfNotExist = false)
            {
                ValidateLayer(psdLayer);

                VectorPathDataResource pathResource = FindVectorPathDataResource(psdLayer, createIfNotExist);
                VogkResource           vogkResource = FindVogkResource(psdLayer, createIfNotExist);
                SoCoResource           socoResource = FindSoCoResource(psdLayer, createIfNotExist);

                Size imageSize = psdLayer.Container.Size;

                UpdateResources(pathResource, vogkResource, socoResource, vectorPath, imageSize);

                ReplaceVectorPathDataResourceInLayer(psdLayer, pathResource, vogkResource, socoResource);
            }
            /// <summary>
            /// Creates the <see cref="VectorPath"/> instance based on resources from input layer.
            /// </summary>
            /// <param name="psdLayer">The psd layer.</param>
            /// <returns>the <see cref="VectorPath"/> instance based on resources from input layer.</returns>
            public static VectorPath CreateVectorPathForLayer(Layer psdLayer)
            {
                ValidateLayer(psdLayer);

                Size imageSize = psdLayer.Container.Size;

                VectorPathDataResource pathResource = FindVectorPathDataResource(psdLayer, true);
                SoCoResource           socoResource = FindSoCoResource(psdLayer, true);
                VectorPath             vectorPath   = new VectorPath(pathResource, imageSize);

                if (socoResource != null)
                {
                    vectorPath.FillColor = socoResource.Color;
                }

                return(vectorPath);
            }
            /// <summary>
            /// Replaces resources in layer by updated or new ones.
            /// </summary>
            /// <param name="psdLayer">The psd layer.</param>
            /// <param name="pathResource">The path resource.</param>
            /// <param name="vogkResource">The vector origination data resource.</param>
            /// <param name="socoResource">The solid color resource.</param>
            private static void ReplaceVectorPathDataResourceInLayer(Layer psdLayer, VectorPathDataResource pathResource, VogkResource vogkResource, SoCoResource socoResource)
            {
                bool pathResourceExist = false;
                bool vogkResourceExist = false;
                bool socoResourceExist = false;

                List <LayerResource> resources = new List <LayerResource>(psdLayer.Resources);

                for (int i = 0; i < resources.Count; i++)
                {
                    LayerResource resource = resources[i];
                    if (resource is VectorPathDataResource)
                    {
                        resources[i]      = pathResource;
                        pathResourceExist = true;
                    }
                    else if (resource is VogkResource)
                    {
                        resources[i]      = vogkResource;
                        vogkResourceExist = true;
                    }
                    else if (resource is SoCoResource)
                    {
                        resources[i]      = socoResource;
                        socoResourceExist = true;
                    }
                }

                if (!pathResourceExist)
                {
                    resources.Add(pathResource);
                }

                if (!vogkResourceExist)
                {
                    resources.Add(vogkResource);
                }

                if (!socoResourceExist)
                {
                    resources.Add(socoResource);
                }

                psdLayer.Resources = resources.ToArray();
            }
            /// <summary>
            /// Finds the <see cref="SoCoResource"/> resource in input layer resources.
            /// </summary>
            /// <param name="psdLayer">The psd layer.</param>
            /// <param name="createIfNotExist">If resource not exists, then for <see cref="true"/> creates a new resource, otherwise return <see cref="null"/>.</param>
            /// <returns>The <see cref="SoCoResource"/> resource.</returns>
            private static SoCoResource FindSoCoResource(Layer psdLayer, bool createIfNotExist = false)
            {
                SoCoResource socoResource = null;

                foreach (var resource in psdLayer.Resources)
                {
                    if (resource is SoCoResource)
                    {
                        socoResource = (SoCoResource)resource;
                        break;
                    }
                }

                if (createIfNotExist && socoResource == null)
                {
                    socoResource = new SoCoResource();
                }

                return(socoResource);
            }
            /// <summary>
            /// Updates resources data from <see cref="VectorPath"/> instance.
            /// </summary>
            /// <param name="pathResource">The path resource.</param>
            /// <param name="vogkResource">The vector origination data resource.</param>
            /// <param name="socoResource">The solid color resource.</param>
            /// <param name="vectorPath">The vector path.</param>
            /// <param name="imageSize">The image size to correct converting point coordinates.</param>
            private static void UpdateResources(VectorPathDataResource pathResource, VogkResource vogkResource, SoCoResource socoResource, VectorPath vectorPath, Size imageSize)
            {
                pathResource.Version     = vectorPath.Version;
                pathResource.IsNotLinked = vectorPath.IsNotLinked;
                pathResource.IsDisabled  = vectorPath.IsDisabled;
                pathResource.IsInverted  = vectorPath.IsInverted;

                List <VectorShapeOriginSettings> originSettings = new List <VectorShapeOriginSettings>();
                List <VectorPathRecord>          path           = new List <VectorPathRecord>();

                path.Add(new PathFillRuleRecord(null));
                path.Add(new InitialFillRuleRecord(vectorPath.IsFillStartsWithAllPixels));
                for (ushort i = 0; i < vectorPath.Shapes.Count; i++)
                {
                    PathShape shape = vectorPath.Shapes[i];
                    shape.ShapeIndex = i;
                    path.AddRange(shape.ToVectorPathRecords(imageSize));
                    originSettings.Add(new VectorShapeOriginSettings()
                    {
                        IsShapeInvalidated = true, OriginIndex = i
                    });
                }

                pathResource.Paths = path.ToArray();
                vogkResource.ShapeOriginSettings = originSettings.ToArray();

                socoResource.Color = vectorPath.FillColor;
            }