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; }