private void createShadow(Shape s, Shape sh, int dpi, double angle, double size)
        {
            try
            {
                ShapeRange forComb = null;
                double     tw = 0, th = 0, tx = 0, ty = 0;

                if ((bool)cbInnerShadow.IsChecked)
                {
                    double nw = 0, nh = 0, nx = 0, ny = 0;

                    sh.GetSize(out nw, out nh);
                    sh.GetPositionEx(cdrReferencePoint.cdrCenter, out nx, out ny);

                    //double dist = str2dbl(tbDistance.Text);
                    //if (dist == 0) dist = size;
                    //if (dist == 0) dist = 0.1;
                    //nw = nw + (dist * 4); nh = nh + (dist * 4);

                    nw = nw + (nw / 2); nh = nh + (nh / 2);

                    Shape sAround = sh.Layer.CreateRectangle2(0, 0, nw, nh, 0, 0, 0, 0);
                    sAround.SetPositionEx(cdrReferencePoint.cdrCenter, nx, ny);

                    forComb = new ShapeRange();
                    forComb.Add(sh);
                    forComb.Add(sAround);
                    sh = forComb.Combine();
                }

                sh.OrderBackOf(s);

                sh.Fill.UniformColor.CopyAssign(_shColor);
                sh.Outline.SetProperties(size, null, _shColor);

                if ((bool)cbInnerShadow.IsChecked)
                {
                    sh.FillMode = cdrFillMode.cdrFillAlternate;                                //new fill fix
                }
                var imgType = cdrImageType.cdrCMYKColorImage;
                switch (_shColor.Type.ToString())
                {
                case "cdrColorGray": imgType = cdrImageType.cdrGrayscaleImage; break;

                case "cdrColorLab": imgType = cdrImageType.cdrLABImage; break;

                case "cdrColorRGB": imgType = cdrImageType.cdrRGBColorImage; break;
                }

                sh = sh.ConvertToBitmapEx(imgType, false, true, dpi, cdrAntiAliasingType.cdrNormalAntiAliasing, true, false);

                double feather = str2dbl(tbFeather.Text) * 100;
                // TODO: Looks like ApplyBitmapEffect doesn't work correctly in 2019
                sh.Bitmap.ApplyBitmapEffect(@"Gaussian Blur", @"GaussianBlurEffect GaussianBlurRadius=" + feather.ToString(CultureInfo.InvariantCulture) + ", GaussianBlurResampled=0");

                int opacity = (Convert.ToInt32(tbOpacity.Text) - 100) * -1;
                sh.Transparency.ApplyUniformTransparency(opacity);
                sh.Transparency.AppliedTo = cdrTransparencyAppliedTo.cdrApplyToFillAndOutline;

                switch (cbMode.SelectedValue.ToString())
                {
                case "Normal": sh.Transparency.MergeMode = cdrMergeMode.cdrMergeNormal; break;

                case "Multiply": sh.Transparency.MergeMode = cdrMergeMode.cdrMergeMultiply; break;

                case "Add": sh.Transparency.MergeMode = cdrMergeMode.cdrMergeAdd; break;
                    //case "0": sh.Transparency.MergeMode =
                }

                sh = sh.ConvertToBitmapEx(imgType, false, true, dpi, cdrAntiAliasingType.cdrNormalAntiAliasing, true, false);

                sh.Properties["DS2", 1] = createPresetStr(); //add settings
                if ((bool)cbOverPrint.IsChecked)
                {
                    sh.OverprintBitmap = true;
                }

                if ((bool)cbInnerShadow.IsChecked)
                {
                    sh.AddToPowerClip(s);
                }
                else
                {
                    if ((bool)cbGroup.IsChecked)
                    {
                        var gr = new ShapeRange();
                        gr.Add(s); gr.Add(sh);
                        gr.Group();
                        gr = null;
                    }
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.ToString(), MName, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }