/// <summary>
 /// Gets the white space width of the specified box
 /// </summary>
 /// <param name="g"></param>
 /// <param name="box"></param>
 /// <returns></returns>
 public static double WhiteSpace(RGraphics g, CssBoxProperties box)
 {
     double w = box.ActualFont.GetWhitespaceWidth(g);
     if (!(String.IsNullOrEmpty(box.WordSpacing) || box.WordSpacing == CssConstants.Normal))
     {
         w += CssValueParser.ParseLength(box.WordSpacing, 0, box, true);
     }
     return w;
 }
        /// <summary>
        /// Gets the result of collapsing the vertical margins of the two boxes
        /// </summary>
        /// <param name="prevSibling">the previous box under the same parent</param>
        /// <returns>Resulting top margin</returns>
        protected double MarginTopCollapse(CssBoxProperties prevSibling)
        {
            double value;
            if (prevSibling != null)
            {
                value = Math.Max(prevSibling.ActualMarginBottom, ActualMarginTop);
                CollapsedMarginTop = value;
            }
            else if (_parentBox != null && ActualPaddingTop < 0.1 && ActualPaddingBottom < 0.1 && _parentBox.ActualPaddingTop < 0.1 && _parentBox.ActualPaddingBottom < 0.1)
            {
                value = Math.Max(0, ActualMarginTop - Math.Max(_parentBox.ActualMarginTop, _parentBox.CollapsedMarginTop));
            }
            else
            {
                value = ActualMarginTop;
            }

            // fix for hr tag
            if (value < 0.1 && HtmlTag != null && HtmlTag.Name == "hr")
            {
                value = GetEmHeight() * 1.1f;
            }

            return value;
        }
 /// <summary>
 /// Get the border style for the given box border.
 /// </summary>
 private static string GetStyle(Border border, CssBoxProperties box)
 {
     switch (border)
     {
         case Border.Top:
             return box.BorderTopStyle;
         case Border.Right:
             return box.BorderRightStyle;
         case Border.Bottom:
             return box.BorderBottomStyle;
         case Border.Left:
             return box.BorderLeftStyle;
         default:
             throw new ArgumentOutOfRangeException("border");
     }
 }
 /// <summary>
 /// Get the border width for the given box border.
 /// </summary>
 private static double GetWidth(Border border, CssBoxProperties box)
 {
     switch (border)
     {
         case Border.Top:
             return box.ActualBorderTopWidth;
         case Border.Right:
             return box.ActualBorderRightWidth;
         case Border.Bottom:
             return box.ActualBorderBottomWidth;
         case Border.Left:
             return box.ActualBorderLeftWidth;
         default:
             throw new ArgumentOutOfRangeException("border");
     }
 }
 /// <summary>
 /// Get the border color for the given box border.
 /// </summary>
 private static RColor GetColor(Border border, CssBoxProperties box, string style)
 {
     switch (border)
     {
         case Border.Top:
             return style == CssConstants.Inset ? Darken(box.ActualBorderTopColor) : box.ActualBorderTopColor;
         case Border.Right:
             return style == CssConstants.Outset ? Darken(box.ActualBorderRightColor) : box.ActualBorderRightColor;
         case Border.Bottom:
             return style == CssConstants.Outset ? Darken(box.ActualBorderBottomColor) : box.ActualBorderBottomColor;
         case Border.Left:
             return style == CssConstants.Inset ? Darken(box.ActualBorderLeftColor) : box.ActualBorderLeftColor;
         default:
             throw new ArgumentOutOfRangeException("border");
     }
 }