public double[] FitToViewBox(SvgRect viewBox, SvgRect rectToFit)
        {
            var localName = _ownerElement.LocalName;

            if (string.Equals(localName, "svg", StringComparison.Ordinal)) // (_ownerElement is SvgSvgElement)
            {
                ISvgMatrix mat = ((SvgSvgElement)_ownerElement).ViewBoxTransform;
                return(new double[] { mat.E, mat.F, mat.A, mat.D });
            }
            if (string.Equals(localName, "pattern", StringComparison.Ordinal)) // (_ownerElement is SvgPatternElement)
            {
                ISvgMatrix mat = ((SvgPatternElement)_ownerElement).ViewBoxTransform;
                return(new double[] { mat.E, mat.F, mat.A, mat.D });
            }

            double translateX = 0;
            double translateY = 0;
            double scaleX     = 1;
            double scaleY     = 1;

            if (!viewBox.IsEmpty && !rectToFit.IsEmpty)
            {
                // calculate scale values for non-uniform scaling
                scaleX = rectToFit.Width / viewBox.Width;
                scaleY = rectToFit.Height / viewBox.Height;

                if (_alignment != SvgPreserveAspectRatioType.None)
                {
                    // uniform scaling
                    if (_meetOrSlice == SvgMeetOrSlice.Meet)
                    {
                        scaleX = Math.Min(scaleX, scaleY);
                    }
                    else
                    {
                        scaleX = Math.Max(scaleX, scaleY);
                    }

                    scaleY = scaleX;

                    if (_alignment == SvgPreserveAspectRatioType.XMidYMax ||
                        _alignment == SvgPreserveAspectRatioType.XMidYMid ||
                        _alignment == SvgPreserveAspectRatioType.XMidYMin)
                    {
                        // align to the Middle X
                        translateX = (rectToFit.X + rectToFit.Width / 2) - scaleX * (viewBox.X + viewBox.Width / 2);
                    }
                    else if (_alignment == SvgPreserveAspectRatioType.XMaxYMax ||
                             _alignment == SvgPreserveAspectRatioType.XMaxYMid ||
                             _alignment == SvgPreserveAspectRatioType.XMaxYMin)
                    {
                        // align to the right X
                        translateX = (rectToFit.Width - viewBox.Width * scaleX);
                    }

                    if (_alignment == SvgPreserveAspectRatioType.XMaxYMid ||
                        _alignment == SvgPreserveAspectRatioType.XMidYMid ||
                        _alignment == SvgPreserveAspectRatioType.XMinYMid)
                    {
                        // align to the Middle Y
                        translateY = (rectToFit.Y + rectToFit.Height / 2) - scaleY * (viewBox.Y + viewBox.Height / 2);
                    }
                    else if (_alignment == SvgPreserveAspectRatioType.XMaxYMax ||
                             _alignment == SvgPreserveAspectRatioType.XMidYMax ||
                             _alignment == SvgPreserveAspectRatioType.XMinYMax)
                    {
                        // align to the bottom Y
                        translateY = (rectToFit.Height - viewBox.Height * scaleY);
                    }
                }
                else
                {
                    translateX = -viewBox.X * scaleX;
                    translateY = -viewBox.Y * scaleY;
                }
            }

            if (!SvgNumber.IsValid(translateX))
            {
                translateX = 0;
            }
            if (!SvgNumber.IsValid(translateY))
            {
                translateY = 0;
            }
            if (!SvgNumber.IsValid(scaleX))
            {
                scaleX = 1;
            }
            if (!SvgNumber.IsValid(scaleY))
            {
                scaleY = 1;
            }

            return(new double[] { translateX, translateY, scaleX, scaleY });
        }