public static float CSSUnitStringToPixelSize(CSSUnitStringDelegate cssUnitStringDelegate, IHTMLElement element, LastChanceDelegate lastChanceDelegate, bool vertical)
 {
     return PointSizeToPixels(CSSUnitStringToPointSize(cssUnitStringDelegate, element, lastChanceDelegate, vertical), vertical);
 }
        public static float CSSUnitStringToPointSize(CSSUnitStringDelegate cssUnitStringDelegate, IHTMLElement element, LastChanceDelegate lastChanceDelegate, bool vertical)
        {
            if (element == null && lastChanceDelegate == LastChanceFontPointSize)
            {
                const string FONT_SIZE_INITIAL_VALUE = "MEDIUM";

                return LastChanceFontPointSize(FONT_SIZE_INITIAL_VALUE, element, vertical);
            }

            string cssUnits = cssUnitStringDelegate(element);

            if (String.IsNullOrEmpty(cssUnits) ||
                cssUnits == "auto")
                return 0;

            int result = 0;
            try
            {
                // @RIBBON TODO: Do we need to remove spaces also?
                cssUnits.Trim();
                cssUnits = cssUnits.ToUpperInvariant();

                // PERCENTAGE
                int i = cssUnits.IndexOf("%", StringComparison.OrdinalIgnoreCase);
                if (i > 0)
                {
                    float percentageOfParent = (float)Convert.ToDouble(cssUnits.Substring(0, i), CultureInfo.InvariantCulture);

                    if (percentageOfParent == 0.0f)
                    {
                        // Shortcut if we're given 0%.
                        return 0;
                    }

                    // In the case of percentages, each CSS property defines what the percentage refers to. There are
                    // more cases than just the following (see the Percentages column at http://www.w3.org/TR/CSS21/propidx.html
                    // for a full list) so if percentages are not working correctly you may need to add additional cases.
                    // Right now, this should be the only case that we hit.
                    if (cssUnitStringDelegate == CSSUnitStringLineHeight)
                    {
                        // The percentage for line-height refers to the font size of the element itself.
                        return percentageOfParent * CSSUnitStringToPointSize(CSSUnitStringFontSize, element, LastChanceFontPointSize, vertical) / 100;
                    }

                    return percentageOfParent * CSSUnitStringToPointSize(cssUnitStringDelegate, element.parentElement, lastChanceDelegate, vertical) / 100;
                }

                i = cssUnits.IndexOf("PT", StringComparison.OrdinalIgnoreCase);
                if (i > 0)
                {
                    return (float)Convert.ToDouble(cssUnits.Substring(0, i), CultureInfo.InvariantCulture);
                }

                i = cssUnits.IndexOf("PC", StringComparison.OrdinalIgnoreCase);
                if (i > 0)
                {
                    // 1 pc is 12 pt.
                    return (float)Convert.ToDouble(cssUnits.Substring(0, i), CultureInfo.InvariantCulture) * 12;
                }

                i = cssUnits.IndexOf("IN", StringComparison.OrdinalIgnoreCase);
                if (i > 0)
                {
                    // 1 inch is 72 pt.
                    return (float)Convert.ToDouble(cssUnits.Substring(0, i), CultureInfo.InvariantCulture) * 72;
                }

                i = cssUnits.IndexOf("CM", StringComparison.OrdinalIgnoreCase);
                if (i > 0)
                {
                    // 2.54 cm is 72pt --> 1 cm is 28.3464567pt.
                    return (float)Convert.ToDouble(cssUnits.Substring(0, i), CultureInfo.InvariantCulture) * 28.3464567f;
                }

                i = cssUnits.IndexOf("MM", StringComparison.OrdinalIgnoreCase);
                if (i > 0)
                {
                    // 1 mm is 0.283464567pt.
                    return (float)Convert.ToDouble(cssUnits.Substring(0, i), CultureInfo.InvariantCulture) * 0.283464567f;
                }

                // RELATIVE SIZE
                i = cssUnits.IndexOf("EM", StringComparison.OrdinalIgnoreCase);
                if (i > 0)
                {
                    float parentMultiplier = (float)Convert.ToDouble(cssUnits.Substring(0, i), CultureInfo.InvariantCulture);

                    if (cssUnitStringDelegate == CSSUnitStringFontSize)
                    {
                        // When 'em' occurs in the value of font-size itself, it refers to the font size of the parent element.
                        return parentMultiplier * CSSUnitStringToPointSize(cssUnitStringDelegate, element.parentElement, LastChanceFontPointSize, vertical);
                    }

                    // Otherwise, the 'em' unit is relative to the computed value of the font-size attribute of the current element.
                    return parentMultiplier * CSSUnitStringToPointSize(CSSUnitStringFontSize, element, LastChanceFontPointSize, vertical);
                }

                i = cssUnits.IndexOf("PX", StringComparison.OrdinalIgnoreCase);
                if (i > 0)
                {
                    float pixels = (float)Convert.ToDouble(cssUnits.Substring(0, i), CultureInfo.InvariantCulture);
                    return 72 * pixels / (vertical ? DisplayHelper.PixelsPerLogicalInchY : DisplayHelper.PixelsPerLogicalInchX);
                }

                i = cssUnits.IndexOf("EX", StringComparison.OrdinalIgnoreCase);
                if (i > 0)
                {
                    //Debug.Assert(false, "IMPLEMENT EX");
                    return 0;
                }

                double number;
                if (Double.TryParse(cssUnits, NumberStyles.Float, CultureInfo.InvariantCulture, out number))
                {
                    // The line-height property supports numbers with no units.
                    if (cssUnitStringDelegate == CSSUnitStringLineHeight)
                    {
                        // The percentage for line-height refers to the font size of the element itself.
                        return ((float)number) * CSSUnitStringToPointSize(CSSUnitStringFontSize, element, lastChanceDelegate, vertical);
                    }
                }

                // Opportunity for property specific handling
                if (lastChanceDelegate != null)
                    return lastChanceDelegate(cssUnits, element, vertical);
            }
            catch (Exception ex)
            {
                Trace.Fail("Failed to convert CSS units: " + ex);
            }
            return result;
        }